Git init 2.0alpha master 2.0_alpha
authorKibum Kim <kb0929.kim@samsung.com>
Fri, 6 Jan 2012 15:50:57 +0000 (00:50 +0900)
committerKibum Kim <kb0929.kim@samsung.com>
Fri, 6 Jan 2012 15:50:57 +0000 (00:50 +0900)
194 files changed:
CHANGELOG [new file with mode: 0644]
CHANGES [new file with mode: 0644]
COPYING [new file with mode: 0644]
INSTALL [new file with mode: 0644]
MANIFEST [new file with mode: 0644]
Makefile.in [new file with mode: 0644]
NEWS [new file with mode: 0644]
README [new file with mode: 0644]
USAGE [new file with mode: 0644]
aclocal.m4 [new file with mode: 0644]
ansi_stdlib.h [new file with mode: 0644]
bind.c [new file with mode: 0644]
callback.c [new file with mode: 0644]
chardefs.h [new file with mode: 0644]
compat.c [new file with mode: 0644]
complete.c [new file with mode: 0644]
config.h.in [new file with mode: 0644]
configure [new file with mode: 0755]
configure.in [new file with mode: 0644]
debian/README.Debian [new file with mode: 0644]
debian/changelog [new file with mode: 0644]
debian/compat [new file with mode: 0644]
debian/control [new file with mode: 0644]
debian/copyright [new file with mode: 0644]
debian/inputrc [new file with mode: 0644]
debian/inputrc.arrows [new file with mode: 0644]
debian/libreadline5-dev.postinst [new file with mode: 0644]
debian/libreadline5-dev.prerm [new file with mode: 0644]
debian/libreadline5.shlibs [new file with mode: 0644]
debian/patches/00list [new file with mode: 0644]
debian/patches/rl-001 [new file with mode: 0644]
debian/patches/rl-002 [new file with mode: 0644]
debian/patches/rl-003 [new file with mode: 0644]
debian/patches/rl-004 [new file with mode: 0644]
debian/patches/rl-005 [new file with mode: 0644]
debian/patches/rl-006 [new file with mode: 0644]
debian/patches/rl-007 [new file with mode: 0644]
debian/patches/rl-008 [new file with mode: 0644]
debian/patches/rl-009 [new file with mode: 0644]
debian/patches/rl-010 [new file with mode: 0644]
debian/patches/rl-011 [new file with mode: 0644]
debian/patches/rl-012 [new file with mode: 0644]
debian/patches/rl-013 [new file with mode: 0644]
debian/patches/rl-attribute.dpatch [new file with mode: 0644]
debian/patches/rl-header.dpatch [new file with mode: 0644]
debian/patches/rl-no-cross-check.dpatch [new file with mode: 0644]
debian/patches/rl-no-rpath.dpatch [new file with mode: 0644]
debian/readline-common.overrides [new file with mode: 0644]
debian/readline-common.postinst [new file with mode: 0644]
debian/readline-common.postrm [new file with mode: 0644]
debian/readline-common.prerm [new file with mode: 0644]
debian/rl-inputrc.dpatch [new file with mode: 0644]
debian/rlfe.1 [new file with mode: 0644]
debian/rlfe.copyright [new file with mode: 0644]
debian/rules [new file with mode: 0755]
debian/semantic.cache [new file with mode: 0644]
debian/watch [new file with mode: 0644]
display.c [new file with mode: 0644]
doc/Makefile.in [new file with mode: 0644]
doc/fdl.texi [new file with mode: 0644]
doc/history.0 [new file with mode: 0644]
doc/history.3 [new file with mode: 0644]
doc/history.dvi [new file with mode: 0644]
doc/history.html [new file with mode: 0644]
doc/history.info [new file with mode: 0644]
doc/history.pdf [new file with mode: 0644]
doc/history.ps [new file with mode: 0644]
doc/history.texi [new file with mode: 0644]
doc/history_3.ps [new file with mode: 0644]
doc/hstech.texi [new file with mode: 0644]
doc/hsuser.texi [new file with mode: 0644]
doc/readline.0 [new file with mode: 0644]
doc/readline.3 [new file with mode: 0644]
doc/readline.dvi [new file with mode: 0644]
doc/readline.html [new file with mode: 0644]
doc/readline.info [new file with mode: 0644]
doc/readline.pdf [new file with mode: 0644]
doc/readline.ps [new file with mode: 0644]
doc/readline_3.ps [new file with mode: 0644]
doc/rlman.texi [new file with mode: 0644]
doc/rltech.texi [new file with mode: 0644]
doc/rluser.texi [new file with mode: 0644]
doc/rluserman.dvi [new file with mode: 0644]
doc/rluserman.html [new file with mode: 0644]
doc/rluserman.info [new file with mode: 0644]
doc/rluserman.pdf [new file with mode: 0644]
doc/rluserman.ps [new file with mode: 0644]
doc/rluserman.texi [new file with mode: 0644]
doc/texi2dvi [new file with mode: 0755]
doc/texi2html [new file with mode: 0755]
doc/texinfo.tex [new file with mode: 0644]
doc/version.texi [new file with mode: 0644]
emacs_keymap.c [new file with mode: 0644]
examples/Inputrc [new file with mode: 0644]
examples/Makefile.in [new file with mode: 0644]
examples/excallback.c [new file with mode: 0644]
examples/fileman.c [new file with mode: 0644]
examples/histexamp.c [new file with mode: 0644]
examples/manexamp.c [new file with mode: 0644]
examples/readlinebuf.h [new file with mode: 0644]
examples/rl-fgets.c [new file with mode: 0644]
examples/rl.c [new file with mode: 0644]
examples/rlcat.c [new file with mode: 0644]
examples/rlfe/ChangeLog [new file with mode: 0644]
examples/rlfe/Makefile.in [new file with mode: 0644]
examples/rlfe/README [new file with mode: 0644]
examples/rlfe/config.h.in [new file with mode: 0644]
examples/rlfe/configure [new file with mode: 0755]
examples/rlfe/configure.in [new file with mode: 0644]
examples/rlfe/extern.h [new file with mode: 0644]
examples/rlfe/os.h [new file with mode: 0644]
examples/rlfe/pty.c [new file with mode: 0644]
examples/rlfe/rlfe.c [new file with mode: 0644]
examples/rlfe/screen.h [new file with mode: 0644]
examples/rlptytest.c [new file with mode: 0644]
examples/rltest.c [new file with mode: 0644]
examples/rlversion.c [new file with mode: 0644]
funmap.c [new file with mode: 0644]
histexpand.c [new file with mode: 0644]
histfile.c [new file with mode: 0644]
histlib.h [new file with mode: 0644]
history.c [new file with mode: 0644]
history.h [new file with mode: 0644]
histsearch.c [new file with mode: 0644]
input.c [new file with mode: 0644]
isearch.c [new file with mode: 0644]
keymaps.c [new file with mode: 0644]
keymaps.h [new file with mode: 0644]
kill.c [new file with mode: 0644]
macro.c [new file with mode: 0644]
mbutil.c [new file with mode: 0644]
misc.c [new file with mode: 0644]
nls.c [new file with mode: 0644]
packaging/readline-5.2-001.patch [new file with mode: 0644]
packaging/readline-5.2-002.patch [new file with mode: 0644]
packaging/readline-5.2-003.patch [new file with mode: 0644]
packaging/readline-5.2-004.patch [new file with mode: 0644]
packaging/readline-5.2-005.patch [new file with mode: 0644]
packaging/readline-5.2-006.patch [new file with mode: 0644]
packaging/readline-5.2-007.patch [new file with mode: 0644]
packaging/readline-5.2-008.patch [new file with mode: 0644]
packaging/readline-5.2-009.patch [new file with mode: 0644]
packaging/readline-5.2-010.patch [new file with mode: 0644]
packaging/readline-5.2-011.patch [new file with mode: 0644]
packaging/readline-5.2-012.patch [new file with mode: 0644]
packaging/readline-5.2-013.patch [new file with mode: 0644]
packaging/readline-attribute.patch [new file with mode: 0644]
packaging/readline-header.patch [new file with mode: 0644]
packaging/readline-no-cross-check.patch [new file with mode: 0644]
packaging/readline-no-rpath.patch [new file with mode: 0644]
packaging/readline.spec [new file with mode: 0644]
parens.c [new file with mode: 0644]
posixdir.h [new file with mode: 0644]
posixjmp.h [new file with mode: 0644]
posixstat.h [new file with mode: 0644]
readline.c [new file with mode: 0644]
readline.h [new file with mode: 0644]
rlconf.h [new file with mode: 0644]
rldefs.h [new file with mode: 0644]
rlmbutil.h [new file with mode: 0644]
rlprivate.h [new file with mode: 0644]
rlshell.h [new file with mode: 0644]
rlstdc.h [new file with mode: 0644]
rltty.c [new file with mode: 0644]
rltty.h [new file with mode: 0644]
rltypedefs.h [new file with mode: 0644]
rlwinsize.h [new file with mode: 0644]
rrr [new file with mode: 0644]
savestring.c [new file with mode: 0644]
search.c [new file with mode: 0644]
shell.c [new file with mode: 0644]
shlib/Makefile.in [new file with mode: 0644]
signals.c [new file with mode: 0644]
support/config.guess [new file with mode: 0755]
support/config.rpath [new file with mode: 0755]
support/config.sub [new file with mode: 0755]
support/install.sh [new file with mode: 0755]
support/mkdirs [new file with mode: 0755]
support/mkdist [new file with mode: 0755]
support/mkinstalldirs [new file with mode: 0755]
support/shlib-install [new file with mode: 0755]
support/shobj-conf [new file with mode: 0755]
support/wcwidth.c [new file with mode: 0644]
tcap.h [new file with mode: 0644]
terminal.c [new file with mode: 0644]
text.c [new file with mode: 0644]
tilde.c [new file with mode: 0644]
tilde.h [new file with mode: 0644]
undo.c [new file with mode: 0644]
util.c [new file with mode: 0644]
vi_keymap.c [new file with mode: 0644]
vi_mode.c [new file with mode: 0644]
xmalloc.c [new file with mode: 0644]
xmalloc.h [new file with mode: 0644]

diff --git a/CHANGELOG b/CHANGELOG
new file mode 100644 (file)
index 0000000..c64d959
--- /dev/null
+++ b/CHANGELOG
@@ -0,0 +1,960 @@
+[Readline-specific changelog.  Descriptions of changes to the source are
+ found in the bash changelog.]
+
+                                   6/9
+                                   ---
+Makefile.in
+       - quote value of ${INSTALL_DATA} when passing it to makes in
+         subdirectories
+
+                                   7/1
+                                   ---
+Makefile.in
+       - don't pass INSTALL_DATA to a make in the `doc' subdirectory; let
+         autoconf set the value itself in the Makefile
+       - removed a stray `-' before $(RANLIB) in the `install' recipe
+
+doc/Makefile.in
+       - add a VPATH assignment so the documentation is not remade if it's
+         already up-to-date in the distribution
+
+configure.in
+       - call AC_SUBST(LOCAL_LDFLAGS), since Makefile.in contains
+         @LOCAL_LDFLAGS@
+
+                                   7/9
+                                   ---
+
+config.h.in
+       - add define lines for STRUCT_WINSIZE_IN_SYS_IOCTL and
+         STRUCT_WINSIZE_IN_TERMIOS
+
+configure.in
+       - call BASH_STRUCT_WINSIZE to look for the definition of
+         `struct winsize'
+
+                                  7/17
+                                  ----
+configure.in
+       - call AC_MINIX
+
+config.h.in
+       - add define line for AC_MINIX
+
+                                  7/18
+                                  ----
+Makefile.in
+       - add `install-shared' and `uninstall-shared' targets
+
+                                   8/4
+                                   ---
+Makefile.in
+       - install and uninstall libhistory.a in the `install' and
+         `uninstall' targets
+
+                                   9/4
+                                   ---
+configure.in
+       - bumped LIBVERSION up to 2.1.1, indicating that this is patch
+         level 1 to release 2.1
+
+
+                                  9/16
+                                  ----
+Makefile.in
+       - `make distclean' now descends into the `examples' subdir
+
+doc/Makefile.in
+       - the `distclean' and `maintainer-clean' targets should remove
+         Makefile
+
+examples/Makefile.in
+       - added the various clean targets
+
+                                   4/2
+                                   ---
+configure.in
+       - bumped LIBVERSION up to 2.2
+
+                                  4/18
+                                  ----
+[readline-2.2 released]
+
+                                  4/20
+                                  ----
+Makefile.in
+       - make `libhistory.a' a dependency of `install'
+       - fixed a typo in the recipe for `install' that copied libreadline.a
+         to libhistory.old right after installing it
+
+                                  4/27
+                                  ----
+doc/Makefile.in
+       - install {readline,history}.info out of the source directory if
+         they are not found in the current (build) directory -- only an
+         issue if the libraries are built in a different directory than
+         the source directory
+
+                                   5/1
+                                   ---
+support/shobj-conf
+       - script from the bash distribution to do shared object and library
+         configuration
+
+shlib/Makefile.in
+       - new directory and makefile to handle building shared versions of
+         libreadline and libhistory, controlled by support/shobj-conf
+
+                                   5/7
+                                   ---
+doc/Makefile.in
+       - set SHELL to /bin/sh, rather than relying on make to be correct
+
+                                  5/14
+                                  ----
+savestring.c
+       - new file, moved from shell.c, for backwards compatibility
+
+Makefile.in, shlib/Makefile.in
+       - make sure savestring.c is compiled and added to libreadline and
+         libhistory
+
+[THERE ARE NO MORE #ifdef SHELL LINES IN THE C SOURCE FILES.]
+
+                                  5/15
+                                  ----
+README
+       - updated description of shared library creation for the new scheme
+
+[THERE ARE NO MORE #ifdef SHELL LINES IN ANY OF THE SOURCE FILES.]
+
+Makefile.in
+       - bumped SHLIB_MAJOR up to 4 since we've augmented the library
+         API
+       - rlconf.h is now one of the installed headers, so applications can
+         find out whether things like vi-mode are available in the installed
+         libreadline
+
+                                  5/20
+                                  ----
+configure.in
+       - changed RL_LIBRARY_VERSION to 4.0 to match the version of the
+         installed shared libraries
+
+                                   6/5
+                                   ---
+rlstdc.h
+       - new file
+
+Makefile.in
+       - rlstdc.h is now one of the installed headers
+
+                                   8/3
+                                   ---
+shlib/Makefile.in
+       - made the suffix rule that creates xx.so from xx.c write the
+         compiler output to `a.o', which is then mv'd to xx.so, because
+         some compilers (Sun WSpro 4.2, for example) don't allow any
+         suffixes other than `.o' for `cc -c' (not even `a.out')
+
+                                  9/15
+                                  ----
+
+Makefile.in
+       - AR and ARFLAGS are now substituted by configure, used in recipes
+         that build the libraries
+
+configure.in
+       - use AC_CHECK_PROG to check for ar
+       - set ARFLAGS if it has not already been set in the environment
+
+                                  10/5
+                                  ----
+Makefile.in
+       - removed savestring.o from object file list
+
+                                  10/28
+                                  -----
+shlib/Makefile.in
+       - don't use a fixed filename in the .c.so suffix rule to avoid
+         problems with parallel makes
+
+                                  12/21
+                                  -----
+support/shlib-install
+       - new script to install shared readline and history libraries
+
+shlib/Makefile.in
+       - changed to call shlib-install for install and uninstall targets
+
+[readline-4.0-beta1 frozen]
+
+                                  12/22
+                                  -----
+configure.in
+       - call AC_SUBST for SHOBJ_XLDFLAGS and SHLIB_LIBS
+
+shlib/Makefile.in
+       - SHOBJ_XLDFLAGS and SHLIB_LIBS are now substituted by configure
+       - add $(SHLIB_LIBS) at end of command line that builds the shared
+         libraries (currently needed only by AIX 4.2)
+
+                                  12/31
+                                  -----
+MANIFEST, MANIFEST.doc
+       - the TOC html files are no longer generated and no longer part of
+         the distribution
+
+                                2/18/1999
+                                ---------
+configure.in
+       - set MAKE_SHELL to /bin/sh and substitute into the Makefiles
+
+Makefile.in,{doc,examples,shlib}/Makefile.in
+       - set SHELL from @MAKE_SHELL@
+
+[readline-4.0 released]
+
+                                  3/11
+                                  ----
+doc/Makefile.in
+       - removed references to HTMLTOC, since separate HTML table-of-contents
+         files are no longer created
+
+examples/Makefile.in
+       - remove `*.exe' in clean target for MS-DOS
+
+Makefile.in
+       - make `readline' target depend on ./libreadline.a
+       - configure now substitutes TERMCAP_LIB into Makefile.in
+       - use ${TERMCAP_LIB} instead of -ltermcap in recipe for `readline'
+       - clean target now removes readline and readline.exe in case they
+         get built
+
+configure.in
+       - use `pwd.exe' to set BUILD_DIR on MS-DOS DJGPP
+
+                                  3/15
+                                  ----
+support/shlib-install
+       - Irix 5.x and Irix 6.x should install shared libraries like Solaris 2
+       - changes for installing on hp-ux 1[01].x
+
+                                  3/23
+                                  ----
+configure.in
+       - make sure that the $CC argument to shobj-conf is quoted
+
+                                   4/8
+                                   ---
+
+xmalloc.h, rlprivate.h, rlshell.h
+       - new files
+
+Makefile.in,shlib/Makefile.in
+       - add dependencies on xmalloc.h, rlshell.h
+       - add xmalloc.h, rlprivate.h, rlshell.h to list of header files
+
+MANIFEST
+       - add xmalloc.h, rlprivate.h, rlshell.h
+
+                                   4/9
+                                   ---
+Makefile.in,shlib/Makefile.in
+       - add dependencies on rlprivate.h
+
+                                  4/13
+                                  ----
+doc/Makefile.in
+       - add variable, PSDVI, which is the desired resolution of the
+         generated postscript files.  Set to 300 because I don't have
+         any 600-dpi printers
+       - set LANGUAGE= before calling makeinfo, so messages are in English
+       - add rluserman.{info,dvi,ps,html} to appropriate variables
+       - add rules to create rluserman.{info,dvi,ps,html}
+       - install and uninstall rluserman.info, but don't update the directory
+         file in $(infodir) yet
+
+MANIFEST
+       - add doc/rluserman.{texinfo,info,dvi,ps,html}
+
+                                  4/30
+                                  ----
+configure.in
+       - updated library version to 4.1
+
+                                   5/3
+                                   ---
+configure.in
+       - SHLIB_MAJOR and SHLIB_MINOR shared library version numbers are
+         constructed from $LIBRARY_VERSION and substituted into Makefiles
+
+                                   5/5
+                                   ---
+support/shlib-install
+       - OSF/1 installs shared libraries like Solaris
+
+Makefile.in
+       - broke the header file install and uninstall into two new targets:
+         install-headers and uninstall-headers
+       - install and uninstall depend on install-headers and uninstall-headers
+         respectively
+       - changed install-shared and uninstall-shared targets to depend on
+         install-headers and uninstall-headers, respectively, so users may
+         choose to install only the shared libraries.  I'm not sure about
+         the uninstall one yet -- maybe it should check whether or not
+         the static libraries are installed and not remove the header files
+         if they are
+
+                                   9/3
+                                   ---
+configure.in, config.h.in
+       - added test for memmove (for later use)
+       - changed version to 4.1-beta1
+
+                                  9/13
+                                  ----
+examples/rlfe.c
+       - Per Bothner's `rlfe' readline front-end program
+
+examples/Makefile.in
+       - added rules to build rlfe
+
+                                  9/21
+                                  ----
+support/shlib-install
+       - changes to handle FreeBSD-3.x elf or a.out shared libraries, which
+         have different semantics and need different naming conventions
+
+                                1/24/2000
+                                ---------
+doc/Makefile.in
+       - remove *.bt and *.bts on `make clean'
+
+                                   2/4
+                                   ---
+
+
+configure.in
+       - changed LIBVERSION to 4.1-beta5
+
+                                3/17/2000
+                                ---------
+[readline-4.1 released]
+
+                                  3/23
+                                  ----
+Makefile.in
+       - remove the `-t' argument to ranlib in the install recipe; some
+         ranlibs don't have it and attempt to create a file named `-t'
+
+                                  3/27
+                                  ----
+support/shlib-install
+       - install shared libraries unwritable by anyone on HP-UX
+       - changed symlinks to relative pathnames on all platforms
+
+shlib/Makefile.in
+       - added missing `includedir' assignment, substituted by configure
+
+Makefile.in
+       - added missing @SET_MAKE@ so configure can set $MAKE appropriately
+
+configure.in
+       - add call to AC_PROG_MAKE_SET
+
+                                  8/30
+                                  ----
+shlib/Makefile.in
+       - change the soname bound into the shared libraries, so it includes
+         only the major version number.  If it includes the minor version,
+         programs depending on it must be rebuilt (which may or may not be
+         a bad thing)
+
+                                   9/6
+                                   ---
+examples/rlfe.c
+       - add -l option to log input and output (-a option appends to logfile)
+       - add -n option to set readline application name
+       - add -v, -h options for version and help information
+       - change a few things because getopt() is now used to parse arguments
+
+                                  9/12
+                                  ----
+support/shlib-install
+       - fix up the libname on HPUX 11
+
+                                  10/18
+                                  -----
+configure.in
+       - changed library version to 4.2-alpha
+
+                                  10/30
+                                  -----
+configure.in
+       - add -fsigned-char to LOCAL_CFLAGS for Linux running on the IBM
+         S/390
+
+Makefile.in
+       - added new file, rltypedefs.h, installed by default with `make install'
+
+                                  11/2
+                                  ----
+compat.c
+       - new file, with backwards-compatibility function definitions
+
+Makefile.in,shlib/Makefile.in
+       - make sure that compat.o/compat.so are built and linked apppropriately
+
+support/shobj-conf
+       - picked up bash version, which means that shared libs built on
+         linux and BSD/OS 4.x will have an soname that does not include
+         the minor version number
+
+                                  11/13
+                                  -----
+examples/rlfe.c
+       - rlfe can perform filename completion for relative pathnames in the
+         inferior process's context if the OS supports /proc/PID/cwd (linux
+         does it OK, Solaris is slightly warped, none of the BSDs have it)
+
+                               11/17/2000
+                               ----------
+[readline-4.2-alpha released]
+
+                                  11/27
+                                  -----
+Makefile.in,shlib/Makefile.in
+       - added dependencies for rltypedefs.h
+
+shlib/Makefile.in
+       - changed dependencies on histlib.h to $(topdir)/histlib.h
+
+                                  1/22
+                                  ----
+configure.in
+       - changed release version to 4.2-beta
+
+                                   2/2
+                                   ---
+examples/Makefile.in
+       - build histexamp as part of the examples
+
+                                   2/5
+                                   ---
+doc/Makefile.in
+       - don't remove the dvi, postscript, html, info, and text `objects'
+         on a `make distclean', only on a `make maintainer-clean'
+
+                                   3/6
+                                   ---
+doc/history.{0,3}, doc/history_3.ps
+       - new manual page for history library
+
+doc/Makefile.in
+       - rules to install and uninstall history.3 in ${man3dir}
+       - rules to build history.0 and history_3.ps
+
+                                   4/2
+                                   ---
+configure.in
+       - changed LIBVERSION to `4.2'
+
+                                   4/5
+                                   ---
+[readline-4.2 frozen]
+
+                                   4/9
+                                   ---
+[readline-4.2 released]
+
+                                   5/2
+                                   ---
+Makefile.in,{doc,examples,shlib}/Makefile.in
+       - added support for DESTDIR installation root prefix, to support
+         building packages
+
+doc/Makefile.in
+       - add an info `dir' file entry for rluserman.info on `make install'
+       - change man1ext to `.1' and man3ext to `.3'
+       - install man pages with a $(man3ext) extension in the target directory
+       - add support for installing html documentation if `htmldir' has a
+         value
+
+Makefile.in
+       - on `make install', install from the `shlib' directory, too
+       - on `make uninstall', uninstall in the `doc' and `shlib'
+         subdirectories, too
+
+support/shlib-install
+       - add `freebsdelf*', `freebsdaout*', Hurd, `sysv4*', `sysv5*', `dgux*'
+         targets for symlink creation
+
+                                   5/7
+                                   ---
+configure.in, config.h.in
+       - check for <limits.h>, define HAVE_LIMITS_H if found
+
+                                   5/8
+                                   ---
+aclocal.m4
+       - pick up change to BASH_CHECK_LIB_TERMCAP that adds check for
+         libtinfo (termcap-specific portion of ncurses-5.2)
+
+                                   5/9
+                                   ---
+configure.in
+       - call AC_C_CONST to find out whether or not the compiler supports
+         `const'
+
+config.h.in
+       - placeholder for `const' define, if any
+
+                                  5/10
+                                  ----
+configure.in
+       - fix AC_CHECK_PROG(ar, ...) test to specify right value for the
+         case where ar is not found; should produce a better error message
+
+                                  5/14
+                                  ----
+configure.in,config.h.in
+       - check for vsnprintf, define HAVE_VSNPRINTF if found
+
+                                  5/21
+                                  ----
+configure.in, config.h.in
+       - add checks for size_t, ssize_t
+
+                                  5/30
+                                  ----
+configure.in
+       - update autoconf to version 2.50, use in AC_PREREQ
+       - changed AC_INIT to new flavor
+       - added AC_CONFIG_SRCDIR
+       - AC_CONFIG_HEADER -> AC_CONFIG_HEADERS
+       - call AC_C_PROTOTYPES
+       - AC_RETSIGTYPE -> AC_TYPE_SIGNAL
+
+                                  8/22
+                                  ----
+configure.in
+       - updated the version number to 4.2a
+
+Makefile.in,shlib/Makefile.in
+       - make sure tilde.o is built -DREADLINE_LIBRARY when being built as
+         part of the standalone library, so it picks up the right include
+         files
+
+                                  8/23
+                                  ----
+support/shlib-install
+       - support for Darwin/MacOS X shared library installation
+
+                                  9/24
+                                  ----
+examples/readlinebuf.h
+       - a new file, a C++ streambuf interface that uses readline for I/O.
+         Donated by Dimitris Vyzovitis <vyzo@media.mit.edu>
+
+                                  10/9
+                                  ----
+configure.in
+        - replaced call to BASH_HAVE_TIOCGWINSZ with AC_HEADER_TIOCGWINSZ
+
+[readline-4.2a-beta1 frozen]
+
+                                  10/15
+                                  -----
+configure.in, config.h.in
+       - check for <memory.h>, define HAVE_MEMORY_H if found
+       - check for <strings.h>, define HAVE_STRINGS_H if found
+
+                                  10/18
+                                  -----
+configure.in, config.h.in
+       - check for isascii, define HAVE_ISASCII if found
+
+configure.in
+       - changed the macro names from bash as appropriate:
+               BASH_SIGNAL_CHECK -> BASH_SYS_SIGNAL_VINTAGE
+               BASH_REINSTALL_SIGHANDLERS -> BASH_SYS_REINSTALL_SIGHANDLERS
+               BASH_MISC_SPEED_T -> BASH_CHECK_SPEED_T
+
+                                  10/22
+                                  -----
+configure.in
+       - check for isxdigit with AC_CHECK_FUNCS
+
+config.h.in
+       - new define for HAVE_ISXDIGIT
+
+                                  10/29
+                                  -----
+configure.in, config.h.in
+       - check for strpbrk with AC_CHECK_FUNCS, define HAVE_STRPBRK if found
+
+                                   11/1
+                                   ----
+Makefile.in
+       - make sure DESTDIR is passed to install and uninstall makes in
+         subdirectories
+       - when saving old copies of installed libraries, make sure we use
+         DESTDIR for the old installation tree
+
+[readline-4.2a-rc1 frozen]
+
+                                  11/2
+                                  ----
+Makefile.in, shlib/Makefile.in
+       - don't put -I$(includedir) into CFLAGS
+
+                                  11/15
+                                  -----
+[readline-4.2a released]
+
+                                  11/20
+                                  -----
+examples/rlcat.c
+       - new file
+
+examples/Makefile.in
+       - changes for rlcat
+
+                                  11/28
+                                  -----
+configure.in
+       - default TERMCAP_LIB to -lcurses if $prefer_curses == yes (as when
+         --with-curses is supplied)
+
+examples/Makefile.in
+       - substitute @LDFLAGS@ in LDFLAGS assignment
+
+                                  11/29
+                                  -----
+config.h.in
+       - add necessary defines for multibyte include files and functions
+       - add code to define HANDLE_MULTIBYTE if prerequisites are met
+
+configure.in
+       - call BASH_CHECK_MULTIBYTE
+
+                                  12/14
+                                  -----
+config.h.in
+       - add #undef PROTOTYPES, filled in by AC_C_PROTOTYPES
+
+                                  12/17
+                                  -----
+config.h.in
+       - moved HANDLE_MULTIBYTE code to rlmbutil.h
+
+rlmbutil.h, mbutil.c
+       - new files
+
+Makefile.in, shlib/Makefile.in
+       - added rules for mbutil.c
+
+                                  12/20
+                                  -----
+configure.in
+       - added --enable-shared, --enable-static options to configure to
+         say which libraries are built by default (both default to yes)
+       - if SHLIB_STATUS == 'unsupported', turn off default shared library
+         building
+       - substitute new STATIC_TARGET, SHARED_TARGET, STATIC_INSTALL_TARGET,
+         and SHARED_INSTALL_TARGET
+
+Makefile.in
+       - `all' target now depends on (substituted) @STATIC_TARGET@ and
+         @SHARED_TARGET@
+       - `install' target now depends on (substituted) @STATIC_INSTALL_TARGET@
+         and @SHARED_INSTALL_TARGET@
+
+INSTALL, README
+       - updated with new info about --enable-shared and --enable-static
+
+                                1/10/2002
+                                ---------
+configure.in
+       - bumped the library version number to 4.3
+
+                                  1/24
+                                  ----
+Makefile.in,shlib/Makefile.in
+       - changes for new file, text.c, with character and text handling
+         functions from readline.c
+
+                                  2/20
+                                  ----
+{configure.config.h}.in
+       - call AC_C_CHAR_UNSIGNED, define __CHAR_UNSIGNED__ if chars are
+         unsigned by default
+
+                                  5/20
+                                  ----
+doc/Makefile.in
+       - new maybe-clean target that removes the generated documentation if
+         the build directory differs from the source directory
+       - distclean target now depends on maybe-clean
+
+                                  7/17
+                                  ----
+[readline-4.3 released]
+
+                                  7/18
+                                  ----
+shlib/Makefile.in
+       - fix bad dependency: text.so: terminal.c, make it depend on text.c
+
+                                   8/7
+                                   ---
+support/shlib-install
+       - break `linux' out into its own stanza:  it seems that linux
+         distributions are all moving to the following scheme:
+
+               libreadline.so.4.3      installed version
+               libreadline.so.4 -> libreadline.so.4.3  symlink
+               libreadline.so -> libreadline.so.4      symlink
+
+                                  10/29
+                                  -----
+support/shlib-install
+       - change INSTALL_LINK[12] to use `&&' instead of `;' so it only
+         tries the link if the cd succeeds; put ${echo} in there, too
+       - use $LN instead of `ln -s' so it works on machines without symlinks
+       - change special linux stanza to use cd before ln also
+       - change to use $INSTALL_LINK1 and $INSTALL_LINK2 appropriately
+         instead of explicit commands in various stanzas
+
+                                   2/1
+                                   ---
+config.h.in
+       - add HAVE_MBRTOWC and HAVE_MBRLEN
+       - add NO_MULTIBYTE_SUPPORT for new configure argument
+       - add STDC_HEADERS
+
+configure.in
+       - new argument --enable-multibyte (enabled by default), allows
+         multibyte support to be turned off even on systems that support it
+       - add check for ansi stdc headers with call to AC_HEADER_STDC
+
+                                   2/3
+                                   ---
+configure.in
+       - add call to BASH_FUNC_CTYPE_NONASCII
+
+config.h.in
+       - add CTYPE_NON_ASCII
+
+                                  2/20
+                                  ----
+
+doc/manvers.texinfo
+        - renamed to version.texi to match other GNU software
+        - UPDATE-MONTH variable is now `UPDATED-MONTH'
+        
+doc/{hist,rlman,rluserman}.texinfo
+        - include version.texi
+        
+doc/{rltech,rluser,hstech,hsuser}.texi
+       - changed the suffix from `texinfo' to `texi'
+
+doc/Makefile.in
+       - made appropriate changes for {{rl,hs}tech,{rl,hs}user}.texi
+
+doc/{rlman,rluserman}.texinfo
+       - changed the suffix from `texinfo' to `texi'
+
+doc/hist.texinfo
+       - renamed to history.texi to be more consistent
+
+                                  6/11
+                                  ----
+shlib/Makefile.in
+       - have configure substitute value of `@LDFLAGS@' into the assignment
+         to SHLIB_XLDFLAGS
+
+                                  6/16
+                                  ----
+configure.in
+       - readline and history libraries are now at version 5.0
+
+                                  8/18
+                                  ----
+support/shlib-install
+       - support for FreeBSD-gnu (from Robert Millan)
+
+                                  12/4
+                                  ----
+Makefile.in
+       - add variables for localedir and the PACKAGE_* variables, auto-set
+         by configure
+
+                                  12/9
+                                  ----
+Makefile.in
+       - use mkinstalldirs instead of mkdirs
+
+                                  4/22
+                                  ----
+Makefile.in
+       - separate doc install/uninstall out into two new targets:
+         install-doc and uninstall-doc
+       - make install-doc and uninstall-doc prerequisites of appropriate
+         install and uninstall targets
+
+examples/rl-fgets.c
+       - new example from Harold Levy that wraps fgets replacement functions
+         that call readline in a shared library that can be interposed with
+         LD_PRELOAD
+
+                                  7/27
+                                  ----
+[readline-5.0 released]
+
+                                  11/15
+                                  -----
+examples/rlfe/{ChangeLog,Makefile.in,README,config.h.in,configure,configure.in,extern.h,os.h,pty.c,rlfe.c,screen.h}
+       - new version of rlfe, rlfe-0.4, from Per Bothner; now a standalone
+         application
+
+                                  11/16
+                                  -----
+shlib/Makefile.in
+       - substitute TERMCAP_LIB in from configure
+
+configure.in
+       - if SHLIB_LIBS doesn't include a termcap library (curses, ncurses,
+         termcap, termlib), append the value of $TERMCAP_LIB to it
+
+                                  11/30
+                                  -----
+configure.in
+       - take out change from 11/16; it doesn't work for some systems (e.g.,
+         SunOS 4.x and Solaris 2.6)
+       - add support for --enable-purify configure argument
+       - pass TERMCAP_LIB in environment when calling shobj-conf
+
+examples/Makefile.in 
+       - add support for building examples with purify
+
+                                1/23/2005
+                                ---------
+configure.in
+        - set BUILD_DIR to contain backslashes to escape any spaces in the
+          directory name -- this is what make will accept in targets and
+          prerequisites, so it's better than trying to use double quotes
+
+                                  2/25
+                                  ----
+configure.in
+       - change check for sys/ptem.h to include sys/stream.h if present, to
+         avoid the `present but cannot be compiled' messages on Solaris and
+         SVR4.2 (does anyone still use SVR4.2?)
+
+                                   5/7
+                                   ---
+configure.in
+       - add cross-compiling support from the bash configure.in, which cygwin
+         and mingw have apparently adopted
+       - add check for pwd.h, fcntl.h
+       - add checks for fcntl, kill system calls
+       - add checks for getpw{ent,nam,uid} C library functions
+       - pass a compile-time option through to Makefiles if cross-compiling
+
+config.h.in
+       - add HAVE_PWD_H for <pwd.h>, HAVE_FCNTL_H for <fcntl.h>
+       - add HAVE_FCNTL, HAVE_KILL for respective system calls
+       - add HAVE_GETPW{ENT,NAM,UID} for passwd functions
+
+Makefile.in,shlib/Makefile.in
+        - @CROSS_COMPILE@ is substituted into DEFS (equal to -DCROSS_COMPILING
+         if bash is being cross-compiled)
+
+                                   8/2
+                                   ---
+examples/Makefile.in
+       - use $(READLINE_LIB) instead of -lreadline to get around MacOS X 10.4's
+         preference for (incompatible) shared libraries over static libraries
+         in the load path
+
+                                  8/11
+                                  ----
+support/shobj-conf
+       - new variable: SHLIB_LIBPREF, prefix for shared library name (defaults
+         to `lib'
+       - new variable: SHLIB_DLLVERSION, used on Cygwin to set the library
+         version number
+       - new variable: SHLIB_DOT, separator character between library name and
+         suffix and version information (defaults to `.')
+       - new stanza for cygwin to generate windows-compatible dll
+
+support/shlib-install
+       - add new option `-b bindir' for systems like cygwin/windows that
+         require it
+       - new stanza for cygwin that installs a dll into $bindir and an implied
+         link library into $libdir
+
+configure.in
+       - substitute new variables from shobj-conf
+
+shlib/Makefile.in
+       - substitute bindir, SHLIB_DOT, SHLIB_LIBPREF, SHLIB_DLLVERSION from
+         configure
+       - pass `-b $(bindir)' to shlib-install for install and uninstall targets
+       - library names now use $SHLIB_LIBPREF and $SHLIB_DOT
+
+INSTALL,README
+       - document new SHLIB_DOT, SHLIB_LIBPREF, and SHLIB_DLLVERSION variables
+
+                                  10/4
+                                  ----
+[readline-5.1-beta1 frozen]
+
+                                  12/1
+                                  ----
+configure.in
+       - changed release status to `release'
+
+[readline-5.1 frozen]
+
+                                  12/9
+                                  ----
+[readline-5.1 released]
+
+                                  12/14
+                                  -----
+examples/rlfe/Makefile.in
+       - add @LIBS@ to LIBS assignment to pick up extra libraries from
+         configure
+
+                                1/3/2006
+                                --------
+support/shlib-install
+       - Install shared libraries with execute bit set on Linux
+
+                                   6/9
+                                   ---
+[readline-5.2-alpha frozen]
+
+                                  6/26
+                                  ----
+configure.in
+       - set CROSS_COMPILE to the empty string by default, so we don't inherit
+         a random value from the environment
+
+                                   7/8
+                                   ---
+[readline-5.2-alpha released]
+
+
+[readline-5.2-beta released]
+
+                                  9/12
+                                  ----
+config.h.in
+        - add defines for wcscoll, iswctype, iswupper, iswlower, towupper,
+          towlower functions
+        - replace define for wctomb with one for wcrtomb
+        - add defines for wchar_t, wint_t, wctype_t types
diff --git a/CHANGES b/CHANGES
new file mode 100644 (file)
index 0000000..87e01e1
--- /dev/null
+++ b/CHANGES
@@ -0,0 +1,995 @@
+This document details the changes between this version, readline-5.2,
+and the previous version, readline-5.1.
+
+1.  Changes to Readline
+
+a.  Fixed a problem that caused segmentation faults when using readline in
+    callback mode and typing consecutive DEL characters on an empty line.
+
+b.  Fixed several redisplay problems with multibyte characters, all having to
+    do with the different code paths and variable meanings between single-byte
+    and multibyte character redisplay.
+
+c.  Fixed a problem with key sequence translation when presented with the
+    sequence \M-\C-x.
+
+d.  Fixed a problem that prevented the `a' command in vi mode from being
+    undone and redone properly.
+
+e.  Fixed a problem that prevented empty inserts in vi mode from being undone
+    properly.
+
+f.  Fixed a problem that caused readline to initialize with an incorrect idea
+    of whether or not the terminal can autowrap.
+
+g.  Fixed output of key bindings (like bash `bind -p') to honor the setting of
+    convert-meta and use \e where appropriate.
+
+h.  Changed the default filename completion function to call the filename
+    dequoting function if the directory completion hook isn't set.  This means
+    that any directory completion hooks need to dequote the directory name,
+    since application-specific hooks need to know how the word was quoted,
+    even if no other changes are made.
+
+i.  Fixed a bug with creating the prompt for a non-interactive search string
+    when there are non-printing characters in the primary prompt.
+
+j.  Fixed a bug that caused prompts with invisible characters to be redrawn
+    multiple times in a multibyte locale.
+
+k.  Fixed a bug that could cause the key sequence scanning code to return the
+    wrong function.
+
+l.  Fixed a problem with the callback interface that caused it to fail when
+    using multi-character keyboard macros.
+
+m.  Fixed a bug that could cause a core dump when an edited history entry was
+    re-executed under certain conditions.
+
+n.  Fixed a bug that caused readline to reference freed memory when attmpting
+    to display a portion of the prompt.
+
+o.  Fixed a bug with prompt redisplay in a multi-byte locale to avoid redrawing
+    the prompt and input line multiple times.
+
+p.  Fixed history expansion to not be confused by here-string redirection.
+
+q.  Readline no longer treats read errors by converting them to newlines, as
+    it does with EOF.  This caused partial lines to be returned from readline().
+
+r.  Fixed a redisplay bug that occurred in multibyte-capable locales when the
+    prompt was one character longer than the screen width.
+
+2.  New Features in Readline
+
+a.  Calling applications can now set the keyboard timeout to 0, allowing
+    poll-like behavior.
+
+b.  The value of SYS_INPUTRC (configurable at compilation time) is now used as
+    the default last-ditch startup file.
+
+c.  The history file reading functions now allow windows-like \r\n line
+    terminators.
+
+-------------------------------------------------------------------------------
+This document details the changes between this version, readline-5.1,
+and the previous version, readline-5.0.
+
+1.  Changes to Readline
+
+a.  Fixed a bug that caused multiliine prompts to be wrapped and displayed
+    incorrectly.
+
+b.  Fixed a bug that caused ^P/^N in emacs mode to fail to display the current
+    line correctly.
+
+c.  Fixed a problem in computing the number of invisible characters on the first
+    line of a prompt whose length exceeds the screen width.
+
+d.  Fixed vi-mode searching so that failure preserves the current line rather
+    than the last line in the history list.
+
+e.  Fixed the vi-mode `~' command (change-case) to have the correct behavior at
+    end-of-line when manipulating multibyte characters.
+
+f.  Fixed the vi-mode `r' command (change-char) to have the correct behavior at
+    end-of-line when manipulating multibyte characters.
+
+g.  Fixed multiple bugs in the redisplay of multibyte characters:  displaying
+    prompts longer than the screen width containing multibyte characters,
+
+h.  Fix the calculation of the number of physical characters in the prompt
+    string when it contains multibyte characters.
+
+i.  A non-zero value for the `rl_complete_suppress_append' variable now causes
+    no `/' to be appended to a directory name.
+
+j.  Fixed forward-word and backward-word to work when words contained
+    multibyte characters.
+
+k.  Fixed a bug in finding the delimiter of a `?' substring when performing
+    history expansion in a locale that supports multibyte characters.
+
+l.  Fixed a memory leak caused by not freeing the timestamp in a history entry.
+
+m.  Fixed a bug that caused "\M-x" style key bindings to not obey the setting
+    of the `convert-meta' variable.
+
+n.  Fixed saving and restoring primary prompt when prompting for incremental   
+    and non-incremental searches; search prompts now display multibyte
+    characters correctly.
+
+o.  Fixed a bug that caused keys originally bound to self-insert but shadowed
+    by a multi-character key sequence to not be inserted.
+
+p.  Fixed code so rl_prep_term_function and rl_deprep_term_function aren't
+    dereferenced if NULL (matching the documentation).
+
+q.  Extensive changes to readline to add enough state so that commands
+    requiring additional characters (searches, multi-key sequences, numeric
+    arguments, commands requiring an additional specifier character like
+    vi-mode change-char, etc.) work without synchronously waiting for
+    additional input.
+
+r.  Lots of changes so readline builds and runs on MinGW.
+
+s.  Readline no longer tries to modify the terminal settings when running in
+    callback mode.
+
+t.  The Readline display code no longer sets the location of the last invisible
+    character in the prompt if the \[\] sequence is empty.
+
+u.  The `change-case' command now correctly changes the case of multibyte
+    characters.
+
+v.  Changes to the shared library construction scripts to deal with Windows
+    DLL naming conventions for Cygwin.
+
+w.  Fixed the redisplay code to avoid core dumps resulting from a poorly-timed
+    SIGWINCH.
+
+x.  Fixed the non-incremental search code in vi mode to dispose of any current
+    undo list when copying a line from the history into the current editing
+    buffer.
+
+y.  Fixed a bug that caused reversing the incremental search direction to
+    not work correctly.  
+    
+z.  Fixed the vi-mode `U' command to only undo up to the first time insert mode
+    was entered, as Posix specifies.
+
+aa. Fixed a bug in the vi-mode `r' command that left the cursor in the wrong
+    place.
+
+bb. Fixed a redisplay bug caused by moving the cursor vertically to a line
+    with invisible characters in the prompt in a multibyte locale.
+
+cc. Fixed a bug that could cause the terminal special chars to be bound in the
+    wrong keymap in vi mode.
+
+2.  New Features in Readline
+
+a.  The key sequence sent by the keypad `delete' key is now automatically   
+    bound to delete-char.
+
+b.  A negative argument to menu-complete now cycles backward through the
+    completion list.
+
+c.  A new bindable readline variable:  bind-tty-special-chars.  If non-zero,
+    readline will bind the terminal special characters to their readline
+    equivalents when it's called (on by default).
+
+d.  New bindable command: vi-rubout.  Saves deleted text for possible  
+    reinsertion, as with any vi-mode `text modification' command; `X' is bound
+    to this in vi command mode.
+
+e.  If the rl_completion_query_items is set to a value < 0, readline never
+    asks the user whether or not to view the possible completions.
+
+f.  The `C-w' binding in incremental search now understands multibyte
+    characters.
+
+g.  New application-callable auxiliary function, rl_variable_value, returns 
+    a string corresponding to a readline variable's value.
+
+h.  When parsing inputrc files and variable binding commands, the parser
+    strips trailing whitespace from values assigned to boolean variables
+    before checking them.
+
+i.  A new external application-controllable variable that allows the LINES   
+    and COLUMNS environment variables to set the window size regardless of
+    what the kernel returns.
+
+-------------------------------------------------------------------------------
+This document details the changes between this version, readline-5.0,
+and the previous version, readline-4.3.
+
+1.  Changes to Readline
+
+a.  Fixes to avoid core dumps because of null pointer references in the
+    multibyte character code.
+
+b.  Fix to avoid infinite recursion caused by certain key combinations.
+
+c.  Fixed a bug that caused the vi-mode `last command' to be set incorrectly.
+
+d.  Readline no longer tries to read ahead more than one line of input, even
+    when more is available.
+
+e.  Fixed the code that adjusts the point to not mishandle null wide
+    characters.
+
+f.  Fixed a bug in the history expansion `g' modifier that caused it to skip
+    every other match.
+
+g.  Fixed a bug that caused the prompt to overwrite previous output when the
+    output doesn't contain a newline and the locale supports multibyte
+    characters.  This same change fixes the problem of readline redisplay
+    slowing down dramatically as the line gets longer in multibyte locales.
+
+h.  History traversal with arrow keys in vi insertion mode causes the cursor
+    to be placed at the end of the new line, like in emacs mode.
+
+i.  The locale initialization code does a better job of using the right
+    precedence and defaulting when checking the appropriate environment
+    variables.
+
+j.  Fixed the history word tokenizer to handle <( and >( better when used as
+    part of bash.
+
+k.  The overwrite mode code received several bug fixes to improve undo.
+
+l.  Many speedups to the multibyte character redisplay code.
+
+m.  The callback character reading interface should not hang waiting to read
+    keyboard input.
+
+n.  Fixed a bug with redoing vi-mode `s' command.
+
+o.  The code that initializes the terminal tracks changes made to the terminal
+    special characters with stty(1) (or equivalent), so that these changes
+    are reflected in the readline bindings.  New application-callable function
+    to make it work:  rl_tty_unset_default_bindings().
+
+p.  Fixed a bug that could cause garbage to be inserted in the buffer when
+    changing character case in vi mode when using a multibyte locale.
+
+q.  Fixed a bug in the redisplay code that caused problems on systems
+    supporting multibyte characters when moving between history lines when the
+    new line has more glyphs but fewer bytes.
+
+r.  Undo and redo now work better after exiting vi insertion mode.
+
+s.  Make sure system calls are restarted after a SIGWINCH is received using
+    SA_RESTART.
+
+t.  Improvements to the code that displays possible completions when using
+    multibyte characters.
+
+u.  Fixed a problem when parsing nested if statements in inputrc files.
+
+v.  The completer now takes multibyte characters into account when looking for
+    quoted substrings on which to perform completion.
+
+w.  The history search functions now perform better bounds checking on the
+    history list.
+
+x.  Change to history expansion functions to treat `^' as equivalent to word 
+    one, as the documention states.
+
+y.  Some changes to the display code to improve display and redisplay of
+    multibyte characters.
+
+z.  Changes to speed up the multibyte character redisplay code.
+
+aa. Fixed a bug in the vi-mode `E' command that caused it to skip over the
+    last character of a word if invoked while point was on the word's
+    next-to-last character.
+
+bb. Fixed a bug that could cause incorrect filename quoting when
+    case-insensitive completion was enabled and the word being completed
+    contained backslashes quoting word break characters.
+
+cc. Fixed a bug in redisplay triggered when the prompt string contains
+    invisible characters.
+
+dd. Fixed some display (and other) bugs encountered in multibyte locales
+    when a non-ascii character was the last character on a line.
+
+ee. Fixed some display bugs caused by multibyte characters in prompt strings.
+
+ff. Fixed a problem with history expansion caused by non-whitespace characters
+    used as history word delimiters.
+
+gg. Fixed a problem that could cause readline to refer to freed memory when
+    moving between history lines while doing searches.
+
+hh. Improvements to the code that expands and displays prompt strings
+    containing multibyte characters.
+
+ii. Fixed a problem with vi-mode not correctly remembering the numeric argument
+    to the last `c'hange command for later use with `.'.
+
+jj. Fixed a bug in vi-mode that caused multi-digit count arguments to work   
+    incorrectly.
+
+kk. Fixed a problem in vi-mode that caused the last text modification command
+    to not be remembered across different command lines.
+
+ll. Fixed problems with changing characters and changing case at the end of
+    the line.
+
+mm. Fixed a problem with readline saving the contents of the current line
+    before beginning a non-interactive search.
+
+nn. Fixed a problem with EOF detection when using rl_event_hook.
+
+oo. Fixed a problem with the vi mode `p' and `P' commands ignoring numeric
+    arguments.
+
+2.  New Features in Readline
+
+a.  History expansion has a new `a' modifier equivalent to the `g' modifier
+    for compatibility with the BSD csh.
+
+b.  History expansion has a new `G' modifier equivalent to the BSD csh `g'
+    modifier, which performs a substitution once per word.
+
+c.  All non-incremental search operations may now undo the operation of
+    replacing the current line with the history line.
+
+d.  The text inserted by an `a' command in vi mode can be reinserted with
+    `.'.
+
+e.  New bindable variable, `show-all-if-unmodified'.  If set, the readline
+    completer will list possible completions immediately if there is more
+    than one completion and partial completion cannot be performed.
+
+f.  There is a new application-callable `free_history_entry()' function.
+
+g.  History list entries now contain timestamp information; the history file
+    functions know how to read and write timestamp information associated
+    with each entry.
+
+h.  Four new key binding functions have been added:
+
+       rl_bind_key_if_unbound()
+       rl_bind_key_if_unbound_in_map()
+       rl_bind_keyseq_if_unbound()
+       rl_bind_keyseq_if_unbound_in_map()
+
+i.  New application variable, rl_completion_quote_character, set to any
+    quote character readline finds before it calls the application completion
+    function.
+
+j.  New application variable, rl_completion_suppress_quote, settable by an   
+    application completion function.  If set to non-zero, readline does not
+    attempt to append a closing quote to a completed word.
+    
+k.  New application variable, rl_completion_found_quote, set to a non-zero
+    value if readline determines that the word to be completed is quoted.
+    Set before readline calls any application completion function.
+
+l.  New function hook, rl_completion_word_break_hook, called when readline
+    needs to break a line into words when completion is attempted.  Allows
+    the word break characters to vary based on position in the line.
+
+m.  New bindable command: unix-filename-rubout.  Does the same thing as
+    unix-word-rubout, but adds `/' to the set of word delimiters.
+
+n.  When listing completions, directories have a `/' appended if the
+    `mark-directories' option has been enabled.
+
+-------------------------------------------------------------------------------
+This document details the changes between this version, readline-4.3,
+and the previous version, readline-4.2a.
+
+1.  Changes to Readline
+
+a.  Fixed output of comment-begin character when listing variable values.
+
+b.  Added some default key bindings for common escape sequences produced by
+    HOME and END keys.
+
+c.  Fixed the mark handling code to be more emacs-compatible.
+
+d.  A bug was fixed in the code that prints possible completions to keep it
+    from printing empty strings in certain circumstances.
+
+e.  Change the key sequence printing code to print ESC as M\- if ESC is a
+    meta-prefix character -- it's easier for users to understand than \e.
+
+f.  Fixed unstifle_history() to return values that match the documentation.
+
+g.  Fixed the event loop (rl_event_hook) to handle the case where the input
+    file descriptor is invalidated.
+
+h.  Fixed the prompt display code to work better when the application has a
+    custom redisplay function.
+
+i.  Changes to make reading and writing the history file a little faster, and
+    to cope with huge history files without calling abort(3) from xmalloc.
+
+j.  The vi-mode `S' and `s' commands are now undone correctly.
+
+k.  Fixed a problem which caused the display to be messed up when the last
+    line of a multi-line prompt (possibly containing invisible characters)
+    was longer than the screen width.
+
+2.  New Features in Readline
+
+a.  Support for key `subsequences':  allows, e.g., ESC and ESC-a to both
+    be bound to readline functions.  Now the arrow keys may be used in vi
+    insert mode.
+
+b.  When listing completions, and the number of lines displayed is more than
+    the screen length, readline uses an internal pager to display the results.
+    This is controlled by the `page-completions' variable (default on).
+
+c.  New code to handle editing and displaying multibyte characters.
+
+d.  The behavior introduced in bash-2.05a of deciding whether or not to
+    append a slash to a completed name that is a symlink to a directory has
+    been made optional, controlled by the `mark-symlinked-directories'
+    variable (default is the 2.05a behavior).
+
+e.  The `insert-comment' command now acts as a toggle if given a numeric
+    argument:  if the first characters on the line don't specify a
+    comment, insert one; if they do, delete the comment text
+
+f.  New application-settable completion variable:
+    rl_completion_mark_symlink_dirs, allows an application's completion
+    function to temporarily override the user's preference for appending
+    slashes to names which are symlinks to directories.
+
+g.  New function available to application completion functions:
+    rl_completion_mode, to tell how the completion function was invoked
+    and decide which argument to supply to rl_complete_internal (to list
+    completions, etc.).
+
+h.  Readline now has an overwrite mode, toggled by the `overwrite-mode'
+    bindable command, which could be bound to `Insert'.
+
+i.  New application-settable completion variable:
+    rl_completion_suppress_append, inhibits appending of
+    rl_completion_append_character to completed words.
+
+j.  New key bindings when reading an incremental search string:  ^W yanks
+    the currently-matched word out of the current line into the search
+    string; ^Y yanks the rest of the current line into the search string,
+    DEL or ^H deletes characters from the search string.
+
+-------------------------------------------------------------------------------
+This document details the changes between this version, readline-4.2a,
+and the previous version, readline-4.2.
+
+1.  Changes to Readline
+
+a.  More `const' and type casting fixes.
+
+b.  Changed rl_message() to use vsnprintf(3) (if available) to fix buffer
+    overflow problems.
+
+c.  The completion code no longer appends a `/' or ` ' to a match when
+    completing a symbolic link that resolves to a directory name, unless
+    the match does not add anything to the word being completed.  This
+    means that a tab will complete the word up to the full name, but not
+    add anything, and a subsequent tab will add a slash.
+
+d.  Fixed a trivial typo that made the vi-mode `dT' command not work.
+
+e.  Fixed the tty code so that ^S and ^Q can be inserted with rl_quoted_insert.
+
+f.  Fixed the tty code so that ^V works more than once.
+
+g.  Changed the use of __P((...)) for function prototypes to PARAMS((...))
+    because the use of __P in typedefs conflicted g++ and glibc.
+
+h.  The completion code now attempts to do a better job of preserving the
+    case of the word the user typed if ignoring case in completions.
+
+i.  Readline defaults to not echoing the input and lets the terminal
+    initialization code enable echoing if there is a controlling terminal.
+
+j.  The key binding code now processes only two hex digits after a `\x'
+    escape sequence, and the documentation was changed to note that the
+    octal and hex escape sequences result in an eight-bit value rather
+    than strict ASCII.
+
+k.  Fixed a few places where negative array subscripts could have occurred.
+    
+l.  Fixed the vi-mode code to use a better method to determine the bounds of
+    the array used to hold the marks, and to avoid out-of-bounds references.
+    
+m.  Fixed the defines in chardefs.h to work better when chars are signed.
+    
+n.  Fixed configure.in to use the new names for bash autoconf macros.
+    
+o.  Readline no longer attempts to define its own versions of some ctype
+    macros if they are implemented as functions in libc but not as macros in
+    <ctype.h>.
+
+p.  Fixed a problem where rl_backward could possibly set point to before
+    the beginning of the line.
+
+q.  Fixed Makefile to not put -I/usr/include into CFLAGS, since it can cause
+    include file problems.
+
+2.  New Features in Readline
+
+a.  Added extern declaration for rl_get_termcap to readline.h, making it a
+    public function (it was always there, just not in readline.h).
+
+b.  New #defines in readline.h:  RL_READLINE_VERSION, currently 0x0402,
+    RL_VERSION_MAJOR, currently 4, and RL_VERSION_MINOR, currently 2.
+
+c.  New readline variable:  rl_readline_version, mirrors RL_READLINE_VERSION.
+
+d.  New bindable boolean readline variable:  match-hidden-files.  Controls
+    completion of files beginning with a `.' (on Unix).  Enabled by default.
+
+e.  The history expansion code now allows any character to terminate a
+    `:first-' modifier, like csh.
+
+f.  The incremental search code remembers the last search string and uses
+    it if ^R^R is typed without a search string.
+
+h.  New bindable variable `history-preserve-point'.  If set, the history
+    code attempts to place the user at the same location on each history
+    line retrived with previous-history or next-history.
+
+-------------------------------------------------------------------------------
+This document details the changes between this version, readline-4.2,
+and the previous version, readline-4.1.
+
+1.  Changes to Readline
+
+a.  When setting the terminal attributes on systems using `struct termio',
+    readline waits for output to drain before changing the attributes.
+
+b.  A fix was made to the history word tokenization code to avoid attempts to
+    dereference a null pointer.
+
+c.  Readline now defaults rl_terminal_name to $TERM if the calling application
+    has left it unset, and tries to initialize with the resultant value.
+
+d.  Instead of calling (*rl_getc_function)() directly to get input in certain
+    places, readline now calls rl_read_key() consistently.
+
+e.  Fixed a bug in the completion code that allowed a backslash to quote a
+    single quote inside a single-quoted string.
+
+f.  rl_prompt is no longer assigned directly from the argument to readline(),
+    but uses memory allocated by readline.  This allows constant strings to
+    be passed to readline without problems arising when the prompt processing
+    code wants to modify the string.
+
+g.  Fixed a bug that caused non-interactive history searches to return the
+    wrong line when performing multiple searches backward for the same string.
+
+h.  Many variables, function arguments, and function return values are now
+    declared `const' where appropriate, to improve behavior when linking with
+    C++ code.
+
+i.  The control character detection code now works better on systems where
+    `char' is unsigned by default.
+
+j.  The vi-mode numeric argument is now capped at 999999, just like emacs mode.
+
+k.  The Function, CPFunction, CPPFunction, and VFunction typedefs have been
+    replaced with a set of specific prototyped typedefs, though they are
+    still in the readline header files for backwards compatibility.
+
+m.  Nearly all of the (undocumented) internal global variables in the library
+    now have an _rl_ prefix -- there were a number that did not, like
+    screenheight, screenwidth, alphabetic, etc.
+
+n.  The ding() convenience function has been renamed to rl_ding(), though the
+    old function is still defined for backwards compatibility.
+
+o.  The completion convenience functions filename_completion_function,
+    username_completion_function, and completion_matches now have an rl_
+    prefix, though the old names are still defined for backwards compatibility.
+
+p.  The functions shared by readline and bash (linkage is satisfied from bash
+    when compiling with bash, and internally otherwise) now have an sh_ prefix.
+
+q.  Changed the shared library creation procedure on Linux and BSD/OS 4.x so
+    that the `soname' contains only the major version number rather than the
+    major and minor numbers.
+
+r.  Fixed a redisplay bug that occurred when the prompt spanned more than one
+    physical line and contained invisible characters.
+
+s.  Added a missing `includedir' variable to the Makefile.
+
+t.  When installing the shared libraries, make sure symbolic links are relative.
+
+u.  Added configure test so that it can set `${MAKE}' appropriately.
+
+v.  Fixed a bug in rl_forward that could cause the point to be set to before
+    the beginning of the line in vi mode.
+
+w.  Fixed a bug in the callback read-char interface to make it work when a
+    readline function pushes some input onto the input stream with
+    rl_execute_next (like the incremental search functions).
+
+x.  Fixed a file descriptor leak in the history file manipulation code that
+    was tripped when attempting to truncate a non-regular file (like
+    /dev/null).
+
+y.  Changes to make all of the exported readline functions declared in
+    readline.h have an rl_ prefix (rltty_set_default_bindings is now
+    rl_tty_set_default_bindings, crlf is now rl_crlf, etc.)
+
+z.  The formatted documentation included in the base readline distribution
+    is no longer removed on a `make distclean'.
+
+aa. Some changes were made to avoid gcc warnings with -Wall.
+
+bb. rl_get_keymap_by_name now finds keymaps case-insensitively, so
+    `set keymap EMACS' works.
+
+cc. The history file writing and truncation functions now return a useful
+    status on error.
+
+dd. Fixed a bug that could cause applications to dereference a NULL pointer
+    if a NULL second argument was passed to history_expand().
+
+ee. If a hook function assigned to rl_event_hook sets rl_done to a non-zero
+    value, rl_read_key() now immediately returns '\n' (which is assumed to   
+    be bound to accept-line).
+
+2.  New Features in Readline
+
+a.  The blink timeout for paren matching is now settable by applications,
+    via the rl_set_paren_blink_timeout() function.
+
+b.  _rl_executing_macro has been renamed to rl_executing_macro, which means
+    it's now part of the public interface.
+
+c.  Readline has a new variable, rl_readline_state, which is a bitmap that
+    encapsulates the current state of the library; intended for use by
+    callbacks and hook functions.
+
+d.  rlfe has a new -l option to log input and output (-a appends to logfile),
+    a new -n option to set the readline application name, and -v and -h
+    options for version and help information.
+
+e.  rlfe can now perform filename completion for the inferior process if the
+    OS has a /proc/<PID>/cwd that can be read with readlink(2) to get the
+    inferior's current working directory.
+
+f.  A new file, rltypedefs.h, contains the new typedefs for function pointers
+    and is installed by `make install'.
+
+g.  New application-callable function rl_set_prompt(const char *prompt):
+    expands its prompt string argument and sets rl_prompt to the result.
+
+h.  New application-callable function rl_set_screen_size(int rows, int cols):
+    public method for applications to set readline's idea of the screen
+    dimensions.
+
+i.  The history example program (examples/histexamp.c) is now built as one
+    of the examples.
+
+j.  The documentation has been updated to cover nearly all of the public
+    functions and variables declared in readline.h.
+
+k.  New function, rl_get_screen_size (int *rows, int *columns), returns
+    readline's idea of the screen dimensions.
+
+l.  The timeout in rl_gather_tyi (readline keyboard input polling function)
+    is now settable via a function (rl_set_keyboard_input_timeout()).
+
+m.  Renamed the max_input_history variable to history_max_entries; the old
+    variable is maintained for backwards compatibility.
+
+n.  The list of characters that separate words for the history tokenizer is
+    now settable with a variable:  history_word_delimiters.  The default
+    value is as before.
+
+o.  There is a new history.3 manual page documenting the history library.
+
+-------------------------------------------------------------------------------
+This document details the changes between this version, readline-4.1,
+and the previous version, readline-4.0.
+
+1.  Changes to Readline
+
+a.  Changed the HTML documents so that the table-of-contents is no longer
+    a separate file.
+
+b.  Changes to the shared object configuration for: Irix 5.x, Irix 6.x,
+    OSF/1.
+
+c.  The shared library major and minor versions are now constructed
+    automatically by configure and substituted into the makefiles.
+
+d.  It's now possible to install the shared libraries separately from the
+    static libraries.
+
+e.  The history library tries to truncate the history file only if it is a
+    regular file.
+
+f.  A bug that caused _rl_dispatch to address negative array indices on
+    systems with signed chars was fixed.
+
+g.  rl-yank-nth-arg now leaves the history position the same as when it was
+    called.
+
+h.  Changes to the completion code to handle MS-DOS drive-letter:pathname
+    filenames.
+
+i.  Completion is now case-insensitive by default on MS-DOS.
+
+j.  Fixes to the history file manipulation code for MS-DOS.
+
+k.  Readline attempts to bind the arrow keys to appropriate defaults on MS-DOS.
+
+l.  Some fixes were made to the redisplay code for better operation on MS-DOS.
+
+m.  The quoted-insert code will now insert tty special chars like ^C.
+
+n.  A bug was fixed that caused the display code to reference memory before
+    the start of the prompt string.
+
+o.  More support for __EMX__ (OS/2).
+
+p.  A bug was fixed in readline's signal handling that could cause infinite
+    recursion in signal handlers.
+
+q.  A bug was fixed that caused the point to be less than zero when rl_forward
+    was given a very large numeric argument.
+
+r.  The vi-mode code now gets characters via the application-settable value
+    of rl_getc_function rather than calling rl_getc directly.
+
+s.  The history file code now uses O_BINARY mode when reading and writing
+    the history file on cygwin32.
+
+t.  Fixed a bug in the redisplay code for lines with more than 256 line
+    breaks.
+
+u.  A bug was fixed which caused invisible character markers to not be
+    stripped from the prompt string if the terminal was in no-echo mode.
+    
+v.  Readline no longer tries to get the variables it needs for redisplay 
+    from the termcap entry if the calling application has specified its
+    own redisplay function.  Readline treats the terminal as `dumb' in
+    this case.
+
+w.  Fixes to the SIGWINCH code so that a multiple-line prompt with escape
+    sequences is redrawn correctly.
+
+x.  Changes to the install and install-shared targets so that the libraries
+    and header files are installed separately.
+
+2.  New Features in Readline
+
+a.  A new Readline `user manual' is in doc/rluserman.texinfo.
+
+b.  Parentheses matching is now always compiled into readline, and enabled
+    or disabled when the value of the `blink-matching-paren' variable is
+    changed.
+
+c.  MS-DOS systems now use ~/_inputrc as the last-ditch inputrc filename.
+
+d.  MS-DOS systems now use ~/_history as the default history file.
+
+e.  history-search-{forward,backward} now leave the point at the end of the
+    line when the string to search for is empty, like
+    {reverse,forward}-search-history.
+
+f.  history-search-{forward,backward} now leave the last history line found
+    in the readline buffer if the second or subsequent search fails.
+
+g.  New function for use by applications:  rl_on_new_line_with_prompt, used
+    when an application displays the prompt itself before calling readline().
+
+h.  New variable for use by applications:  rl_already_prompted.  An application
+    that displays the prompt itself before calling readline() must set this to
+    a non-zero value.
+
+i.  A new variable, rl_gnu_readline_p, always 1.  The intent is that an
+    application can verify whether or not it is linked with the `real'
+    readline library or some substitute.
+
+j.  Per Bothner's `rlfe' (pronounced `Ralphie') readline front-end program
+    is included in the examples subdirectory, though it is not built
+    by default.
+
+-------------------------------------------------------------------------------
+This document details the changes between this version, readline-4.0,
+and the previous version, readline-2.2.
+
+1.  Changes to Readline
+
+a.  The version number is now 4.0, to match the major and minor version
+    numbers on the shared readline and history libraries.  Future
+    releases will maintain the identical numbering.
+
+b.  Fixed a typo in the `make install' recipe that copied libreadline.a
+    to libhistory.old right after installing it.
+
+c.  The readline and history info files are now installed out of the source
+    directory if they are not found in the build directory.
+
+d.  The library no longer exports a function named `savestring' -- backwards
+    compatibility be damned.
+
+e.  There is no longer any #ifdef SHELL code in the source files.
+
+f.  Some changes were made to the key binding code to fix memory leaks and
+    better support Win32 systems.
+
+g.  Fixed a silly typo in the paren matching code -- it's microseconds, not
+    milliseconds.
+
+h.  The readline library should be compilable by C++ compilers.
+
+i.  The readline.h public header file now includes function prototypes for
+    all readline functions, and some changes were made to fix errors in the
+    source files uncovered by the use of prototypes.
+
+j.  The maximum numeric argument is now clamped at 1000000.
+
+k.  Fixes to rl_yank_last_arg to make it behave better.
+
+l.  Fixed a bug in the display code that caused core dumps if the prompt
+    string length exceeded 1024 characters.
+
+m.  The menu completion code was fixed to properly insert a single completion
+    if there is only one match.
+
+n.  A bug was fixed that caused the display code to improperly display tabs
+    after newlines.
+
+o.  A fix was made to the completion code in which a typo caused the wrong
+    value to be passed to the function that computed the longest common
+    prefix of the list of matches.
+
+p.  The completion code now checks the value of rl_filename_completion_desired,
+    which is set by application-supplied completion functions to indicate
+    that filename completion is being performed, to decide whether or not to
+    call an application-supplied `ignore completions' function.
+
+q.  Code was added to the history library to catch history substitutions
+    using `&' without a previous history substitution or search having been
+    performed.
+
+
+2.  New Features in Readline
+
+a.  There is a new script, support/shobj-conf, to do system-specific shared
+    object and library configuration.  It generates variables for configure
+    to substitute into makefiles.  The README file provides a detailed
+    explanation of the shared library creation process.
+
+b.  Shared libraries and objects are now built in the `shlib' subdirectory.
+    There is a shlib/Makefile.in to control the build process.  `make shared'
+    from the top-level directory is still the right way to build shared
+    versions of the libraries.
+
+c.  rlconf.h is now installed, so applications can find out which features
+    have been compiled into the installed readline and history libraries.
+
+d.  rlstdc.h is now an installed header file.
+
+e.  Many changes to the signal handling:
+        o Readline now catches SIGQUIT and cleans up the tty before returning;
+        o A new variable, rl_catch_signals, is available to application writers 
+          to indicate to readline whether or not it should install its own
+          signal handlers for SIGINT, SIGTERM, SIGQUIT, SIGALRM, SIGTSTP,
+          SIGTTIN, and SIGTTOU;
+        o A new variable, rl_catch_sigwinch, is available to application
+          writers to indicate to readline whether or not it should install its
+          own signal handler for SIGWINCH, which will chain to the calling
+          applications's SIGWINCH handler, if one is installed;
+        o There is a new function, rl_free_line_state, for application signal
+          handlers to call to free up the state associated with the current
+          line after receiving a signal;
+        o There is a new function, rl_cleanup_after_signal, to clean up the
+          display and terminal state after receiving a signal;
+        o There is a new function, rl_reset_after_signal, to reinitialize the
+          terminal and display state after an application signal handler
+          returns and readline continues
+
+f.  There is a new function, rl_resize_terminal, to reset readline's idea of
+    the screen size after a SIGWINCH.
+
+g.  New public functions: rl_save_prompt and rl_restore_prompt.  These were
+    previously private functions with a `_' prefix.  These functions are
+    used when an application wants to write a message to the `message area'
+    with rl_message and have the prompt restored correctly when the message
+    is erased.
+
+h.  New function hook: rl_pre_input_hook, called just before readline starts
+    reading input, after initialization.
+
+i.  New function hook: rl_display_matches_hook, called when readline would
+    display the list of completion matches.  The new function
+    rl_display_match_list is what readline uses internally, and is available
+    for use by application functions called via this hook.
+
+j.  New bindable function, delete-char-or-list, like tcsh.
+
+k.  A new variable, rl_erase_empty_line, which, if set by an application using
+    readline, will cause readline to erase, prompt and all, lines on which the
+    only thing typed was a newline.
+
+l.  There is a new script, support/shlib-install, to install and uninstall
+    the shared readline and history libraries.
+
+m.  A new bindable variable, `isearch-terminators', which is a string
+    containing the set of characters that should terminate an incremental
+    search without being executed as a command.
+
+n.  A new bindable function, forward-backward-delete-char.
+
+-------------------------------------------------------------------------------
+This document details the changes between this version, readline-2.2,
+and the previous version, readline-2.1.
+
+1.  Changes to Readline
+
+a.  Added a missing `extern' to a declaration in readline.h that kept
+    readline from compiling cleanly on some systems.
+
+b.  The history file is now opened with mode 0600 when it is written for
+    better security.
+
+c.  Changes were made to the SIGWINCH handling code so that prompt redisplay
+    is done better.
+
+d.  ^G now interrupts incremental searches correctly.
+
+e.  A bug that caused a core dump when the set of characters to be quoted
+    when completing words was empty was fixed.
+
+f.  Fixed a problem in the readline test program rltest.c that caused a core
+    dump.
+
+g.  The code that handles parser directives in inputrc files now displays
+    more error messages.
+
+h.  The history expansion code was fixed so that the appearance of the
+    history comment character at the beginning of a word inhibits history
+    expansion for that word and the rest of the input line.
+
+i.  The code that prints completion listings now behaves better if one or
+    more of the filenames contains non-printable characters.
+
+j.  The time delay when showing matching parentheses is now 0.5 seconds.
+
+
+2.  New Features in Readline
+
+a.  There is now an option for `iterative' yank-last-arg handline, so a user
+    can keep entering `M-.', yanking the last argument of successive history
+    lines.
+
+b.  New variable, `print-completions-horizontally', which causes completion
+    matches to be displayed across the screen (like `ls -x') rather than up
+    and down the screen (like `ls').
+
+c.  New variable, `completion-ignore-case', which causes filename completion
+    and matching to be performed case-insensitively.
+
+d.  There is a new bindable command, `magic-space', which causes history
+    expansion to be performed on the current readline buffer and a space to
+    be inserted into the result.
+
+e.  There is a new bindable command, `menu-complete', which enables tcsh-like
+    menu completion (successive executions of menu-complete insert a single
+    completion match, cycling through the list of possible completions).
+
+f.  There is a new bindable command, `paste-from-clipboard', for use on Win32
+    systems, to insert the text from the Win32 clipboard into the editing
+    buffer.
+
+g.  The key sequence translation code now understands printf-style backslash
+    escape sequences, including \NNN octal escapes.  These escape sequences
+    may be used in key sequence definitions or macro values.
+
+h.  An `$include' inputrc file parser directive has been added.
diff --git a/COPYING b/COPYING
new file mode 100644 (file)
index 0000000..1bf1526
--- /dev/null
+++ b/COPYING
@@ -0,0 +1,339 @@
+                   GNU GENERAL PUBLIC LICENSE
+                      Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+                          59 Temple Place, Suite 330, Boston, MA 02111 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                           Preamble
+
+  The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users.  This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it.  (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.)  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+  To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have.  You must make sure that they, too, receive or can get the
+source code.  And you must show them these terms so they know their
+rights.
+
+  We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+  Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software.  If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+  Finally, any free program is threatened constantly by software
+patents.  We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary.  To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+\f
+                   GNU GENERAL PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License.  The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language.  (Hereinafter, translation is included without limitation in
+the term "modification".)  Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+  1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+  2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+    a) You must cause the modified files to carry prominent notices
+    stating that you changed the files and the date of any change.
+
+    b) You must cause any work that you distribute or publish, that in
+    whole or in part contains or is derived from the Program or any
+    part thereof, to be licensed as a whole at no charge to all third
+    parties under the terms of this License.
+
+    c) If the modified program normally reads commands interactively
+    when run, you must cause it, when started running for such
+    interactive use in the most ordinary way, to print or display an
+    announcement including an appropriate copyright notice and a
+    notice that there is no warranty (or else, saying that you provide
+    a warranty) and that users may redistribute the program under
+    these conditions, and telling the user how to view a copy of this
+    License.  (Exception: if the Program itself is interactive but
+    does not normally print such an announcement, your work based on
+    the Program is not required to print an announcement.)
+\f
+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works.  But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+  3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+    a) Accompany it with the complete corresponding machine-readable
+    source code, which must be distributed under the terms of Sections
+    1 and 2 above on a medium customarily used for software interchange; or,
+
+    b) Accompany it with a written offer, valid for at least three
+    years, to give any third party, for a charge no more than your
+    cost of physically performing source distribution, a complete
+    machine-readable copy of the corresponding source code, to be
+    distributed under the terms of Sections 1 and 2 above on a medium
+    customarily used for software interchange; or,
+
+    c) Accompany it with the information you received as to the offer
+    to distribute corresponding source code.  (This alternative is
+    allowed only for noncommercial distribution and only if you
+    received the program in object code or executable form with such
+    an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it.  For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable.  However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+\f
+  4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License.  Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+  5. You are not required to accept this License, since you have not
+signed it.  However, nothing else grants you permission to modify or
+distribute the Program or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+  6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions.  You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+  7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices.  Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+\f
+  8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded.  In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+  9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number.  If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation.  If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+  10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission.  For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this.  Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+                           NO WARRANTY
+
+  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+                    END OF TERMS AND CONDITIONS
+\f
+       Appendix: How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) 19yy  <name of author>
+
+    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
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+    Gnomovision version 69, Copyright (C) 19yy name of author
+    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary.  Here is a sample; alter the names:
+
+  Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+  `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+  <signature of Ty Coon>, 1 April 1989
+  Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs.  If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library.  If this is what you want to do, use the GNU Library General
+Public License instead of this License.
diff --git a/INSTALL b/INSTALL
new file mode 100644 (file)
index 0000000..f360b9e
--- /dev/null
+++ b/INSTALL
@@ -0,0 +1,287 @@
+Basic Installation
+==================
+
+These are installation instructions for Readline-5.2.
+
+The simplest way to compile readline is:
+
+  1. `cd' to the directory containing the readline source code and type
+     `./configure' to configure readline for your system.  If you're
+     using `csh' on an old version of System V, you might need to type
+     `sh ./configure' instead to prevent `csh' from trying to execute
+     `configure' itself.
+
+     Running `configure' takes some time.  While running, it prints some
+     messages telling which features it is checking for.
+
+  2. Type `make' to compile readline and build the static readline
+     and history libraries.  If supported, the shared readline and history
+     libraries will be built also.  See below for instructions on compiling
+     the other parts of the distribution.  Typing `make everything' will
+     cause the static and shared libraries (if supported) and the example
+     programs to be built.
+
+  3. Type `make install' to install the static readline and history
+     libraries, the readline include files, the documentation, and, if
+     supported, the shared readline and history libraries.
+
+  4. You can remove the created libraries and object files from the
+     build directory by typing `make clean'.  To also remove the
+     files that `configure' created (so you can compile readline for
+     a different kind of computer), type `make distclean'.  There is
+     also a `make maintainer-clean' target, but that is intended mainly
+     for the readline developers, and should be used with care.
+
+The `configure' shell script attempts to guess correct values for
+various system-dependent variables used during compilation.  It
+uses those values to create a `Makefile' in the build directory,
+and Makefiles in the `doc', `shlib', and `examples'
+subdirectories.  It also creates a `config.h' file containing
+system-dependent definitions.  Finally, it creates a shell script
+`config.status' that you can run in the future to recreate the
+current configuration, a file `config.cache' that saves the
+results of its tests to speed up reconfiguring, and a file
+`config.log' containing compiler output (useful mainly for
+debugging `configure'). 
+
+If you need to do unusual things to compile readline, please try
+to figure out how `configure' could check whether to do them, and
+mail diffs or instructions to <bug-readline@gnu.org> so they can
+be considered for the next release.  If at some point
+`config.cache' contains results you don't want to keep, you may
+remove or edit it. 
+
+The file `configure.in' is used to create `configure' by a
+program called `autoconf'.  You only need `configure.in' if you
+want to change it or regenerate `configure' using a newer version
+of `autoconf'.  The readline `configure.in' requires autoconf
+version 2.50 or newer. 
+
+Compilers and Options
+=====================
+
+Some systems require unusual options for compilation or linking that
+the `configure' script does not know about.  You can give `configure'
+initial values for variables by setting them in the environment.  Using
+a Bourne-compatible shell, you can do that on the command line like
+this:
+
+     CC=c89 CFLAGS=-O2 LIBS=-lposix ./configure
+
+Or on systems that have the `env' program, you can do it like this:
+
+     env CPPFLAGS=-I/usr/local/include LDFLAGS=-s ./configure
+
+Compiling For Multiple Architectures
+====================================
+
+You can compile readline for more than one kind of computer at the
+same time, by placing the object files for each architecture in their
+own directory.  To do this, you must use a version of `make' that
+supports the `VPATH' variable, such as GNU `make'.  `cd' to the
+directory where you want the object files and executables to go and run
+the `configure' script.  `configure' automatically checks for the
+source code in the directory that `configure' is in and in `..'.
+
+If you have to use a `make' that does not supports the `VPATH'
+variable, you have to compile readline for one architecture at a
+time in the source code directory.  After you have installed
+readline for one architecture, use `make distclean' before
+reconfiguring for another architecture. 
+
+Installation Names
+==================
+
+By default, `make install' will install the readline libraries in
+`/usr/local/lib', the include files in
+`/usr/local/include/readline', the man pages in `/usr/local/man',
+and the info files in `/usr/local/info'.  You can specify an
+installation prefix other than `/usr/local' by giving `configure'
+the option `--prefix=PATH' or by supplying a value for the
+DESTDIR variable when running `make install'. 
+
+You can specify separate installation prefixes for
+architecture-specific files and architecture-independent files. 
+If you give `configure' the option `--exec-prefix=PATH', the
+readline Makefiles will use PATH as the prefix for installing the
+libraries.  Documentation and other data files will still use the
+regular prefix. 
+
+Specifying the System Type
+==========================
+
+There may be some features `configure' can not figure out
+automatically, but need to determine by the type of host readline
+will run on.  Usually `configure' can figure that out, but if it
+prints a message saying it can not guess the host type, give it
+the `--host=TYPE' option.  TYPE can either be a short name for
+the system type, such as `sun4', or a canonical name with three
+fields: CPU-COMPANY-SYSTEM (e.g., i386-unknown-freebsd4.2). 
+
+See the file `config.sub' for the possible values of each field.
+
+Sharing Defaults
+================
+
+If you want to set default values for `configure' scripts to share,
+you can create a site shell script called `config.site' that gives
+default values for variables like `CC', `cache_file', and `prefix'.
+`configure' looks for `PREFIX/share/config.site' if it exists, then
+`PREFIX/etc/config.site' if it exists.  Or, you can set the
+`CONFIG_SITE' environment variable to the location of the site script.
+A warning: the readline `configure' looks for a site script, but not
+all `configure' scripts do.
+
+Operation Controls
+==================
+
+`configure' recognizes the following options to control how it
+operates.
+
+`--cache-file=FILE'
+     Use and save the results of the tests in FILE instead of
+     `./config.cache'.  Set FILE to `/dev/null' to disable caching, for
+     debugging `configure'.
+
+`--help'
+     Print a summary of the options to `configure', and exit.
+
+`--quiet'
+`--silent'
+`-q'
+     Do not print messages saying which checks are being made.
+
+`--srcdir=DIR'
+     Look for the package's source code in directory DIR.  Usually
+     `configure' can determine that directory automatically.
+
+`--version'
+     Print the version of Autoconf used to generate the `configure'
+     script, and exit.
+
+`configure' also accepts some other, not widely useful, options.
+
+Optional Features
+=================
+
+The readline `configure' recognizes a single `--with-PACKAGE' option:
+
+`--with-curses'
+    This tells readline that it can find the termcap library functions
+    (tgetent, et al.) in the curses library, rather than a separate
+    termcap library.  Readline uses the termcap functions, but does not
+    link with the termcap or curses library itself, allowing applications
+    which link with readline the to choose an appropriate library.
+    This option tells readline to link the example programs with the
+    curses library rather than libtermcap.
+
+`configure' also recognizes two `--enable-FEATURE' options:
+
+`--enable-shared'
+    Build the shared libraries by default on supported platforms.  The
+    default is `yes'.
+
+`--enable-static'
+    Build the static libraries by default.  The default is `yes'.
+Shared Libraries
+================
+
+There is support for building shared versions of the readline and
+history libraries.  The configure script creates a Makefile in
+the `shlib' subdirectory, and typing `make shared' will cause
+shared versions of the readline and history libraries to be built
+on supported platforms.
+
+If `configure' is given the `--enable-shared' option, it will attempt
+to build the shared libraries by default on supported platforms.
+
+Configure calls the script support/shobj-conf to test whether or
+not shared library creation is supported and to generate the values
+of variables that are substituted into shlib/Makefile.  If you
+try to build shared libraries on an unsupported platform, `make'
+will display a message asking you to update support/shobj-conf for
+your platform.
+
+If you need to update support/shobj-conf, you will need to create
+a `stanza' for your operating system and compiler.  The script uses
+the value of host_os and ${CC} as determined by configure.  For
+instance, FreeBSD 4.2 with any version of gcc is identified as
+`freebsd4.2-gcc*'.
+
+In the stanza for your operating system-compiler pair, you will need to
+define several variables.  They are:
+
+SHOBJ_CC       The C compiler used to compile source files into shareable
+               object files.  This is normally set to the value of ${CC}
+               by configure, and should not need to be changed.
+
+SHOBJ_CFLAGS   Flags to pass to the C compiler ($SHOBJ_CC) to create
+               position-independent code.  If you are using gcc, this
+               should probably be set to `-fpic'.
+
+SHOBJ_LD       The link editor to be used to create the shared library from
+               the object files created by $SHOBJ_CC.  If you are using
+               gcc, a value of `gcc' will probably work.
+
+SHOBJ_LDFLAGS  Flags to pass to SHOBJ_LD to enable shared object creation.
+               If you are using gcc, `-shared' may be all that is necessary.
+               These should be the flags needed for generic shared object
+               creation.
+
+SHLIB_XLDFLAGS Additional flags to pass to SHOBJ_LD for shared library
+               creation.  Many systems use the -R option to the link
+               editor to embed a path within the library for run-time
+               library searches.  A reasonable value for such systems would
+               be `-R$(libdir)'.
+
+SHLIB_LIBS     Any additional libraries that shared libraries should be
+               linked against when they are created.
+
+SHLIB_LIBPREF  The prefix to use when generating the filename of the shared
+               library.  The default is `lib'; Cygwin uses `cyg'.
+
+SHLIB_LIBSUFF  The suffix to add to `libreadline' and `libhistory' when
+               generating the filename of the shared library.  Many systems
+               use `so'; HP-UX uses `sl'.
+
+SHLIB_LIBVERSION The string to append to the filename to indicate the version
+               of the shared library.  It should begin with $(SHLIB_LIBSUFF),
+               and possibly include version information that allows the
+               run-time loader to load the version of the shared library
+               appropriate for a particular program.  Systems using shared
+               libraries similar to SunOS 4.x use major and minor library
+               version numbers; for those systems a value of
+               `$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)$(SHLIB_MINOR)' is appropriate.
+               Systems based on System V Release 4 don't use minor version
+               numbers; use `$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)' on those systems.
+               Other Unix versions use different schemes.
+
+SHLIB_DLLVERSION The version number for shared libraries that determines API
+               compatibility between readline versions and the underlying
+               system.  Used only on Cygwin.  Defaults to $SHLIB_MAJOR, but
+               can be overridden at configuration time by defining DLLVERSION
+               in the environment.
+
+SHLIB_DOT      The character used to separate the name of the shared library
+               from the suffix and version information.  The default is `.';
+               systems like Cygwin which don't separate version information
+               from the library name should set this to the empty string.
+
+SHLIB_STATUS   Set this to `supported' when you have defined the other
+               necessary variables.  Make uses this to determine whether
+               or not shared library creation should be attempted.  If
+               shared libraries are not supported, this will be set to
+               `unsupported'.
+
+You should look at the existing stanzas in support/shobj-conf for ideas.
+
+Once you have updated support/shobj-conf, re-run configure and type
+`make shared' or `make'.  The shared libraries will be created in the
+shlib subdirectory.
+
+If shared libraries are created, `make install' will install them. 
+You may install only the shared libraries by running `make
+install-shared' from the top-level build directory.  Running `make
+install' in the shlib subdirectory will also work.  If you don't want
+to install any created shared libraries, run `make install-static'. 
diff --git a/MANIFEST b/MANIFEST
new file mode 100644 (file)
index 0000000..b288fb6
--- /dev/null
+++ b/MANIFEST
@@ -0,0 +1,146 @@
+#
+# Master distribution manifest for the standalone readline distribution
+#
+doc            d
+examples       d
+examples/rlfe  d
+support                d
+shlib          d
+COPYING                f
+README         f
+MANIFEST       f
+INSTALL                f
+CHANGELOG      f
+CHANGES                f
+NEWS           f
+USAGE          f
+aclocal.m4     f
+config.h.in    f
+configure      f
+configure.in   f
+Makefile.in    f
+ansi_stdlib.h  f
+chardefs.h     f
+history.h      f
+histlib.h      f
+keymaps.h      f
+posixdir.h     f
+posixjmp.h     f
+posixstat.h    f
+readline.h     f
+rlconf.h       f
+rldefs.h       f
+rlmbutil.h     f
+rlprivate.h    f
+rlshell.h      f
+rlstdc.h       f
+rltty.h                f
+rltypedefs.h   f
+rlwinsize.h    f
+tcap.h         f
+tilde.h                f
+xmalloc.h      f
+bind.c         f
+callback.c     f
+compat.c       f
+complete.c     f
+display.c      f
+emacs_keymap.c f
+funmap.c       f
+input.c                f
+isearch.c      f
+keymaps.c      f
+kill.c         f
+macro.c                f
+mbutil.c       f
+misc.c         f
+nls.c          f
+parens.c       f
+readline.c     f
+rltty.c                f
+savestring.c   f
+search.c       f
+shell.c                f
+signals.c      f
+terminal.c     f
+text.c         f
+tilde.c                f
+undo.c         f
+util.c         f
+vi_keymap.c    f
+vi_mode.c      f
+xmalloc.c      f
+history.c      f
+histexpand.c   f
+histfile.c     f
+histsearch.c   f
+shlib/Makefile.in      f
+support/config.guess   f
+support/config.rpath   f
+support/config.sub     f
+support/install.sh     f
+support/mkdirs         f
+support/mkdist         f
+support/mkinstalldirs  f
+support/shobj-conf     f
+support/shlib-install  f
+support/wcwidth.c      f
+doc/Makefile.in                f
+doc/texinfo.tex                f
+doc/version.texi       f
+doc/fdl.texi           f
+doc/rlman.texi         f
+doc/rltech.texi                f
+doc/rluser.texi                f
+doc/rluserman.texi     f
+doc/history.texi       f
+doc/hstech.texi                f
+doc/hsuser.texi                f
+doc/readline.3         f
+doc/history.3          f
+doc/texi2dvi           f
+doc/texi2html          f
+examples/Makefile.in   f
+examples/excallback.c  f
+examples/fileman.c     f
+examples/manexamp.c    f
+examples/readlinebuf.h f
+examples/rl-fgets.c    f
+examples/rlcat.c       f
+examples/rltest.c      f
+examples/rl.c          f
+examples/rlptytest.c   f
+examples/rlversion.c   f
+examples/histexamp.c   f
+examples/Inputrc       f
+examples/rlfe/ChangeLog                f
+examples/rlfe/Makefile.in      f
+examples/rlfe/README           f
+examples/rlfe/config.h.in      f
+examples/rlfe/configure                f
+examples/rlfe/configure.in     f
+examples/rlfe/extern.h         f
+examples/rlfe/os.h             f
+examples/rlfe/pty.c            f
+examples/rlfe/rlfe.c           f
+examples/rlfe/screen.h         f
+# formatted documentation, from MANIFEST.doc
+doc/readline.ps                f
+doc/history.ps         f
+doc/rluserman.ps       f
+doc/readline.dvi       f
+doc/history.dvi                f
+doc/rluserman.dvi      f
+doc/readline.info      f
+doc/history.info       f
+doc/rluserman.info     f
+doc/readline.html      f
+doc/history.html       f
+doc/rluserman.html     f
+doc/readline.0         f
+doc/history.0          f
+doc/readline_3.ps      f
+doc/history_3.ps       f
+doc/history.pdf                f
+doc/readline.pdf       f
+doc/rluserman.pdf      f
diff --git a/Makefile.in b/Makefile.in
new file mode 100644 (file)
index 0000000..87df428
--- /dev/null
@@ -0,0 +1,536 @@
+## -*- text -*- ##
+# Master Makefile for the GNU readline library.
+# Copyright (C) 1994-2004 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111 USA.
+RL_LIBRARY_VERSION = @LIBVERSION@
+RL_LIBRARY_NAME = readline
+
+PACKAGE = @PACKAGE_NAME@
+VERSION = @PACKAGE_VERSION@
+
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+
+srcdir = @srcdir@
+VPATH = .:@srcdir@
+top_srcdir = @top_srcdir@
+BUILD_DIR = @BUILD_DIR@
+
+INSTALL = @INSTALL@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_DATA = @INSTALL_DATA@
+
+CC = @CC@
+RANLIB = @RANLIB@
+AR = @AR@
+ARFLAGS = @ARFLAGS@
+RM = rm -f
+CP = cp
+MV = mv
+
+PURIFY = @PURIFY@
+
+@SET_MAKE@
+SHELL = @MAKE_SHELL@
+
+prefix = @prefix@
+exec_prefix = @exec_prefix@
+
+bindir = @bindir@
+libdir = @libdir@
+mandir = @mandir@
+includedir = @includedir@
+datadir = @datadir@
+localedir = $(datadir)/locale
+
+infodir = @infodir@
+
+man3dir = $(mandir)/man3
+
+# Support an alternate destination root directory for package building
+DESTDIR =
+
+# Programs to make tags files.
+ETAGS = etags -tw
+CTAGS = ctags -tw
+
+CFLAGS = @CFLAGS@
+LOCAL_CFLAGS = @LOCAL_CFLAGS@ -DRL_LIBRARY_VERSION='"$(RL_LIBRARY_VERSION)"'
+CPPFLAGS = @CPPFLAGS@
+
+DEFS = @DEFS@ @CROSS_COMPILE@
+LOCAL_DEFS = @LOCAL_DEFS@
+
+TERMCAP_LIB = @TERMCAP_LIB@
+
+# For libraries which include headers from other libraries.
+INCLUDES = -I. -I$(srcdir)
+
+XCCFLAGS = $(DEFS) $(LOCAL_DEFS) $(CPPFLAGS) $(INCLUDES)
+CCFLAGS = $(XCCFLAGS) $(LOCAL_CFLAGS) $(CFLAGS)
+
+# could add -Werror here
+GCC_LINT_FLAGS = -ansi -Wall -Wshadow -Wpointer-arith -Wcast-qual \
+                -Wwrite-strings -Wstrict-prototypes \
+                -Wmissing-prototypes -Wno-implicit -pedantic
+GCC_LINT_CFLAGS = $(XCCFLAGS) $(GCC_LINT_FLAGS) @CFLAGS@ @LOCAL_CFLAGS@
+
+.c.o:
+       ${RM} $@
+       $(CC) -c $(CCFLAGS) $<
+
+# The name of the main library target.
+LIBRARY_NAME = libreadline.a
+STATIC_LIBS = libreadline.a libhistory.a
+
+# The C code source files for this library.
+CSOURCES = $(srcdir)/readline.c $(srcdir)/funmap.c $(srcdir)/keymaps.c \
+          $(srcdir)/vi_mode.c $(srcdir)/parens.c $(srcdir)/rltty.c \
+          $(srcdir)/complete.c $(srcdir)/bind.c $(srcdir)/isearch.c \
+          $(srcdir)/display.c $(srcdir)/signals.c $(srcdir)/emacs_keymap.c \
+          $(srcdir)/vi_keymap.c $(srcdir)/util.c $(srcdir)/kill.c \
+          $(srcdir)/undo.c $(srcdir)/macro.c $(srcdir)/input.c \
+          $(srcdir)/callback.c $(srcdir)/terminal.c $(srcdir)/xmalloc.c \
+          $(srcdir)/history.c $(srcdir)/histsearch.c $(srcdir)/histexpand.c \
+          $(srcdir)/histfile.c $(srcdir)/nls.c $(srcdir)/search.c \
+          $(srcdir)/shell.c $(srcdir)/savestring.c $(srcdir)/tilde.c \
+          $(srcdir)/text.c $(srcdir)/misc.c $(srcdir)/compat.c \
+          $(srcdir)/mbutil.c
+
+# The header files for this library.
+HSOURCES = readline.h rldefs.h chardefs.h keymaps.h history.h histlib.h \
+          posixstat.h posixdir.h posixjmp.h tilde.h rlconf.h rltty.h \
+          ansi_stdlib.h tcap.h rlstdc.h xmalloc.h rlprivate.h rlshell.h \
+          rltypedefs.h rlmbutil.h
+
+HISTOBJ = history.o histexpand.o histfile.o histsearch.o shell.o mbutil.o
+TILDEOBJ = tilde.o
+OBJECTS = readline.o vi_mode.o funmap.o keymaps.o parens.o search.o \
+         rltty.o complete.o bind.o isearch.o display.o signals.o \
+         util.o kill.o undo.o macro.o input.o callback.o terminal.o \
+         text.o nls.o misc.o compat.o xmalloc.o $(HISTOBJ) $(TILDEOBJ)
+
+# The texinfo files which document this library.
+DOCSOURCE = doc/rlman.texinfo doc/rltech.texinfo doc/rluser.texinfo
+DOCOBJECT = doc/readline.dvi
+DOCSUPPORT = doc/Makefile
+DOCUMENTATION = $(DOCSOURCE) $(DOCOBJECT) $(DOCSUPPORT)
+
+CREATED_MAKEFILES = Makefile doc/Makefile examples/Makefile shlib/Makefile
+CREATED_CONFIGURE = config.status config.h config.cache config.log \
+                   stamp-config stamp-h
+CREATED_TAGS = TAGS tags
+
+INSTALLED_HEADERS = readline.h chardefs.h keymaps.h history.h tilde.h \
+                   rlstdc.h rlconf.h rltypedefs.h
+
+##########################################################################
+TARGETS = @STATIC_TARGET@ @SHARED_TARGET@
+INSTALL_TARGETS = @STATIC_INSTALL_TARGET@ @SHARED_INSTALL_TARGET@
+
+all: $(TARGETS)
+
+everything: all examples
+
+static: $(STATIC_LIBS)
+
+libreadline.a: $(OBJECTS)
+       $(RM) $@
+       $(AR) $(ARFLAGS) $@ $(OBJECTS)
+       -test -n "$(RANLIB)" && $(RANLIB) $@
+
+libhistory.a: $(HISTOBJ) xmalloc.o
+       $(RM) $@
+       $(AR) $(ARFLAGS) $@ $(HISTOBJ) xmalloc.o
+       -test -n "$(RANLIB)" && $(RANLIB) $@
+
+# Since tilde.c is shared between readline and bash, make sure we compile
+# it with the right flags when it's built as part of readline
+tilde.o:       tilde.c
+       rm -f $@
+       $(CC) $(CCFLAGS) -DREADLINE_LIBRARY -c $(srcdir)/tilde.c
+
+readline: $(OBJECTS) readline.h rldefs.h chardefs.h ./libreadline.a
+       $(CC) $(CCFLAGS) -o $@ ./examples/rl.c ./libreadline.a ${TERMCAP_LIB}
+
+lint:  force
+       $(MAKE) $(MFLAGS) CCFLAGS='$(GCC_LINT_CFLAGS)' static
+
+Makefile makefile: config.status $(srcdir)/Makefile.in
+       CONFIG_FILES=Makefile CONFIG_HEADERS= $(SHELL) ./config.status
+
+Makefiles makefiles: config.status $(srcdir)/Makefile.in
+       @for mf in $(CREATED_MAKEFILES); do \
+               CONFIG_FILES=$$mf CONFIG_HEADERS= $(SHELL) ./config.status ; \
+       done
+
+config.status: configure
+       $(SHELL) ./config.status --recheck
+
+config.h:      stamp-h
+
+stamp-h: config.status $(srcdir)/config.h.in
+       CONFIG_FILES= CONFIG_HEADERS=config.h ./config.status
+       echo > $@
+
+#$(srcdir)/configure: $(srcdir)/configure.in   ## Comment-me-out in distribution
+#      cd $(srcdir) && autoconf        ## Comment-me-out in distribution
+
+
+shared:        force
+       -test -d shlib || mkdir shlib
+       -( cd shlib ; ${MAKE} ${MFLAGS} all )
+
+documentation: force
+       -test -d doc || mkdir doc
+       -( cd doc && $(MAKE) $(MFLAGS) )
+
+examples: force
+       -test -d examples || mkdir examples
+       -(cd examples && ${MAKE} ${MFLAGS} all )
+
+force:
+
+install-headers: installdirs ${INSTALLED_HEADERS}
+       for f in ${INSTALLED_HEADERS}; do \
+               $(INSTALL_DATA) $(srcdir)/$$f $(DESTDIR)$(includedir)/readline ; \
+       done
+
+uninstall-headers:
+       -test -n "$(includedir)" && cd $(DESTDIR)$(includedir)/readline && \
+               ${RM} ${INSTALLED_HEADERS}
+
+maybe-uninstall-headers: uninstall-headers
+
+install:       $(INSTALL_TARGETS)
+
+install-static: installdirs $(STATIC_LIBS) install-headers install-doc
+       -$(MV) $(DESTDIR)$(libdir)/libreadline.a $(DESTDIR)$(libdir)/libreadline.old
+       $(INSTALL_DATA) libreadline.a $(DESTDIR)$(libdir)/libreadline.a
+       -test -n "$(RANLIB)" && $(RANLIB) $(DESTDIR)$(libdir)/libreadline.a
+       -$(MV) $(DESTDIR)$(libdir)/libhistory.a $(DESTDIR)$(libdir)/libhistory.old
+       $(INSTALL_DATA) libhistory.a $(DESTDIR)$(libdir)/libhistory.a
+       -test -n "$(RANLIB)" && $(RANLIB) $(DESTDIR)$(libdir)/libhistory.a
+
+installdirs: $(srcdir)/support/mkinstalldirs
+       -$(SHELL) $(srcdir)/support/mkinstalldirs $(DESTDIR)$(includedir) \
+               $(DESTDIR)$(includedir)/readline $(DESTDIR)$(libdir) \
+               $(DESTDIR)$(infodir) $(DESTDIR)$(man3dir)
+
+uninstall: uninstall-headers uninstall-doc
+       -test -n "$(DESTDIR)$(libdir)" && cd $(DESTDIR)$(libdir) && \
+               ${RM} libreadline.a libreadline.old libhistory.a libhistory.old $(SHARED_LIBS)
+       -( cd shlib; ${MAKE} ${MFLAGS} DESTDIR=${DESTDIR} uninstall )
+
+install-shared: installdirs install-headers shared install-doc
+       -( cd shlib ; ${MAKE} ${MFLAGS} DESTDIR=${DESTDIR} install )
+       
+uninstall-shared: maybe-uninstall-headers
+       -( cd shlib; ${MAKE} ${MFLAGS} DESTDIR=${DESTDIR} uninstall )
+
+install-doc:   installdirs
+       -( if test -d doc ; then \
+               cd doc && \
+               ${MAKE} ${MFLAGS} infodir=$(infodir) DESTDIR=${DESTDIR} install; \
+         fi )
+
+uninstall-doc:
+       -( if test -d doc ; then \
+               cd doc && \
+               ${MAKE} ${MFLAGS} infodir=$(infodir) DESTDIR=${DESTDIR} uninstall; \
+         fi )
+
+TAGS:  force
+       $(ETAGS) $(CSOURCES) $(HSOURCES)
+
+tags:  force
+       $(CTAGS) $(CSOURCES) $(HSOURCES)
+
+clean: force
+       $(RM) $(OBJECTS) $(STATIC_LIBS)
+       $(RM) readline readline.exe
+       -( cd shlib && $(MAKE) $(MFLAGS) $@ )
+       -( cd doc && $(MAKE) $(MFLAGS) $@ )
+       -( cd examples && $(MAKE) $(MFLAGS) $@ )
+
+mostlyclean: clean
+       -( cd shlib && $(MAKE) $(MFLAGS) $@ )
+       -( cd doc && $(MAKE) $(MFLAGS) $@ )
+       -( cd examples && $(MAKE) $(MFLAGS) $@ )
+
+distclean maintainer-clean: clean
+       -( cd shlib && $(MAKE) $(MFLAGS) $@ )
+       -( cd doc && $(MAKE) $(MFLAGS) $@ )
+       -( cd examples && $(MAKE) $(MFLAGS) $@ )
+       $(RM) Makefile
+       $(RM) $(CREATED_CONFIGURE)
+       $(RM) $(CREATED_TAGS)
+
+info dvi:
+       -( cd doc && $(MAKE) $(MFLAGS) $@ )
+
+install-info:
+check:
+installcheck:
+
+dist:   force
+       @echo Readline distributions are created using $(srcdir)/support/mkdist.
+       @echo Here is a sample of the necessary commands:
+       @echo bash $(srcdir)/support/mkdist -m $(srcdir)/MANIFEST -s $(srcdir) -r $(RL_LIBRARY_NAME) $(RL_LIBRARY_VERSION)
+       @echo tar cf $(RL_LIBRARY_NAME)-${RL_LIBRARY_VERSION}.tar ${RL_LIBRARY_NAME}-$(RL_LIBRARY_VERSION)
+       @echo gzip $(RL_LIBRARY_NAME)-$(RL_LIBRARY_VERSION).tar
+
+# Tell versions [3.59,3.63) of GNU make not to export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
+
+# Dependencies
+bind.o: ansi_stdlib.h posixstat.h
+bind.o: rldefs.h ${BUILD_DIR}/config.h rlconf.h
+bind.o: readline.h keymaps.h rltypedefs.h chardefs.h tilde.h rlstdc.h
+bind.o: history.h
+callback.o: rlconf.h
+callback.o: rldefs.h ${BUILD_DIR}/config.h rlconf.h
+callback.o: readline.h keymaps.h rltypedefs.h chardefs.h tilde.h rlstdc.h
+compat.o: rlstdc.h
+complete.o: ansi_stdlib.h posixdir.h posixstat.h
+complete.o: rldefs.h ${BUILD_DIR}/config.h rlconf.h
+complete.o: readline.h keymaps.h rltypedefs.h chardefs.h tilde.h rlstdc.h
+display.o: ansi_stdlib.h posixstat.h
+display.o: rldefs.h ${BUILD_DIR}/config.h rlconf.h
+display.o: tcap.h
+display.o: readline.h keymaps.h rltypedefs.h chardefs.h tilde.h
+display.o: history.h rlstdc.h
+funmap.o: readline.h keymaps.h rltypedefs.h chardefs.h tilde.h
+funmap.o: rlconf.h ansi_stdlib.h rlstdc.h
+funmap.o: ${BUILD_DIR}/config.h
+histexpand.o: ansi_stdlib.h
+histexpand.o: history.h histlib.h rlstdc.h rltypedefs.h
+histexpand.o: ${BUILD_DIR}/config.h
+histfile.o: ansi_stdlib.h
+histfile.o: history.h histlib.h rlstdc.h rltypedefs.h
+histfile.o: ${BUILD_DIR}/config.h
+history.o: ansi_stdlib.h
+history.o: history.h histlib.h rlstdc.h rltypedefs.h
+history.o: ${BUILD_DIR}/config.h
+histsearch.o: ansi_stdlib.h
+histsearch.o: history.h histlib.h rlstdc.h rltypedefs.h
+histsearch.o: ${BUILD_DIR}/config.h
+input.o: ansi_stdlib.h
+input.o: rldefs.h ${BUILD_DIR}/config.h rlconf.h
+input.o: readline.h keymaps.h rltypedefs.h chardefs.h tilde.h rlstdc.h
+isearch.o: rldefs.h ${BUILD_DIR}/config.h rlconf.h
+isearch.o: readline.h keymaps.h rltypedefs.h chardefs.h tilde.h
+isearch.o: ansi_stdlib.h history.h rlstdc.h
+keymaps.o: emacs_keymap.c vi_keymap.c
+keymaps.o: keymaps.h rltypedefs.h chardefs.h rlconf.h ansi_stdlib.h
+keymaps.o: readline.h keymaps.h rltypedefs.h chardefs.h tilde.h
+keymaps.o: ${BUILD_DIR}/config.h rlstdc.h
+kill.o: ansi_stdlib.h
+kill.o: rldefs.h ${BUILD_DIR}/config.h rlconf.h
+kill.o: readline.h keymaps.h rltypedefs.h chardefs.h tilde.h
+kill.o: history.h rlstdc.h
+macro.o: ansi_stdlib.h
+macro.o: rldefs.h ${BUILD_DIR}/config.h rlconf.h
+macro.o: readline.h keymaps.h rltypedefs.h chardefs.h tilde.h
+macro.o: history.h rlstdc.h
+mbutil.o: rldefs.h ${BUILD_DIR}/config.h rlconf.h
+mbutil.o: readline.h keymaps.h rltypedefs.h chardefs.h rlstdc.h
+misc.o: readline.h keymaps.h rltypedefs.h chardefs.h tilde.h
+misc.o: rldefs.h ${BUILD_DIR}/config.h rlconf.h
+misc.o: history.h rlstdc.h ansi_stdlib.h
+nls.o: ansi_stdlib.h
+nls.o: rldefs.h ${BUILD_DIR}/config.h rlconf.h
+nls.o: readline.h keymaps.h rltypedefs.h chardefs.h tilde.h  
+nls.o: history.h rlstdc.h  
+parens.o: rlconf.h
+parens.o: ${BUILD_DIR}/config.h
+parens.o: readline.h keymaps.h rltypedefs.h chardefs.h tilde.h rlstdc.h
+readline.o: readline.h keymaps.h rltypedefs.h chardefs.h tilde.h
+readline.o: rldefs.h ${BUILD_DIR}/config.h rlconf.h
+readline.o: history.h rlstdc.h
+readline.o: posixstat.h ansi_stdlib.h posixjmp.h
+rltty.o: rldefs.h ${BUILD_DIR}/config.h rlconf.h
+rltty.o: rltty.h
+rltty.o: readline.h keymaps.h rltypedefs.h chardefs.h tilde.h rlstdc.h
+search.o: rldefs.h ${BUILD_DIR}/config.h rlconf.h
+search.o: readline.h keymaps.h rltypedefs.h chardefs.h tilde.h
+search.o: ansi_stdlib.h history.h rlstdc.h
+shell.o: ${BUILD_DIR}/config.h
+shell.o: ansi_stdlib.h
+signals.o: rldefs.h ${BUILD_DIR}/config.h rlconf.h
+signals.o: readline.h keymaps.h rltypedefs.h chardefs.h tilde.h
+signals.o: history.h rlstdc.h
+terminal.o: rldefs.h ${BUILD_DIR}/config.h rlconf.h
+terminal.o: tcap.h
+terminal.o: readline.h keymaps.h rltypedefs.h chardefs.h tilde.h
+terminal.o: history.h rlstdc.h
+text.o: readline.h keymaps.h rltypedefs.h chardefs.h tilde.h
+text.o: rldefs.h ${BUILD_DIR}/config.h rlconf.h
+text.o: history.h rlstdc.h ansi_stdlib.h
+tilde.o: ansi_stdlib.h
+tilde.o: ${BUILD_DIR}/config.h
+tilde.o: tilde.h
+undo.o: ansi_stdlib.h
+undo.o: rldefs.h ${BUILD_DIR}/config.h rlconf.h
+undo.o: readline.h keymaps.h rltypedefs.h chardefs.h tilde.h
+undo.o: history.h rlstdc.h
+util.o: posixjmp.h ansi_stdlib.h
+util.o: rldefs.h ${BUILD_DIR}/config.h rlconf.h
+util.o: readline.h keymaps.h rltypedefs.h chardefs.h tilde.h rlstdc.h
+vi_mode.o: rldefs.h ${BUILD_DIR}/config.h rlconf.h
+vi_mode.o: readline.h keymaps.h rltypedefs.h chardefs.h tilde.h
+vi_mode.o: history.h ansi_stdlib.h rlstdc.h
+xmalloc.o: ${BUILD_DIR}/config.h
+xmalloc.o: ansi_stdlib.h
+
+bind.o: rlshell.h
+histfile.o: rlshell.h
+nls.o: rlshell.h
+readline.o: rlshell.h
+shell.o: rlshell.h
+terminal.o: rlshell.h
+histexpand.o: rlshell.h
+
+bind.o: rlprivate.h
+callback.o: rlprivate.h
+complete.o: rlprivate.h
+display.o: rlprivate.h
+input.o: rlprivate.h
+isearch.o: rlprivate.h
+kill.o: rlprivate.h
+macro.o: rlprivate.h
+mbutil.o: rlprivate.h
+misc.o: rlprivate.h
+nls.o: rlprivate.h   
+parens.o: rlprivate.h
+readline.o: rlprivate.h
+rltty.o: rlprivate.h 
+search.o: rlprivate.h
+signals.o: rlprivate.h
+terminal.o: rlprivate.h
+text.o: rlprivate.h
+undo.o: rlprivate.h
+util.o: rlprivate.h
+vi_mode.o: rlprivate.h
+
+bind.o: xmalloc.h
+complete.o: xmalloc.h
+display.o: xmalloc.h
+funmap.o: xmalloc.h
+histexpand.o: xmalloc.h
+histfile.o: xmalloc.h
+history.o: xmalloc.h
+input.o: xmalloc.h
+isearch.o: xmalloc.h
+keymaps.o: xmalloc.h
+kill.o: xmalloc.h
+macro.o: xmalloc.h
+mbutil.o: xmalloc.h
+misc.o: xmalloc.h
+readline.o: xmalloc.h
+savestring.o: xmalloc.h
+search.o: xmalloc.h
+shell.o: xmalloc.h
+terminal.o: xmalloc.h
+text.o: xmalloc.h
+tilde.o: xmalloc.h
+undo.o: xmalloc.h
+util.o: xmalloc.h
+vi_mode.o: xmalloc.h
+xmalloc.o: xmalloc.h
+
+complete.o: rlmbutil.h
+display.o: rlmbutil.h
+histexpand.o: rlmbutil.h
+input.o: rlmbutil.h    
+isearch.o: rlmbutil.h
+mbutil.o: rlmbutil.h
+misc.o: rlmbutil.h
+readline.o: rlmbutil.h
+search.o: rlmbutil.h 
+text.o: rlmbutil.h
+vi_mode.o: rlmbutil.h
+
+bind.o: $(srcdir)/bind.c
+callback.o: $(srcdir)/callback.c
+compat.o: $(srcdir)/compat.c
+complete.o: $(srcdir)/complete.c
+display.o: $(srcdir)/display.c
+funmap.o: $(srcdir)/funmap.c
+input.o: $(srcdir)/input.c
+isearch.o: $(srcdir)/isearch.c
+keymaps.o: $(srcdir)/keymaps.c $(srcdir)/emacs_keymap.c $(srcdir)/vi_keymap.c
+kill.o: $(srcdir)/kill.c
+macro.o: $(srcdir)/macro.c
+mbutil.o: $(srcdir)/mbutil.c
+misc.o: $(srcdir)/misc.c
+nls.o: $(srcdir)/nls.c
+parens.o: $(srcdir)/parens.c
+readline.o: $(srcdir)/readline.c
+rltty.o: $(srcdir)/rltty.c
+savestring.o: $(srcdir)/savestring.c
+search.o: $(srcdir)/search.c
+shell.o: $(srcdir)/shell.c
+signals.o: $(srcdir)/signals.c
+terminal.o: $(srcdir)/terminal.c
+text.o: $(srcdir)/text.c
+tilde.o: $(srcdir)/tilde.c
+undo.o: $(srcdir)/undo.c
+util.o: $(srcdir)/util.c
+vi_mode.o: $(srcdir)/vi_mode.c
+xmalloc.o: $(srcdir)/xmalloc.c
+
+histexpand.o: $(srcdir)/histexpand.c
+histfile.o: $(srcdir)/histfile.c
+history.o: $(srcdir)/history.c
+histsearch.o: $(srcdir)/histsearch.c
+
+bind.o: bind.c
+callback.o: callback.c
+compat.o: compat.c
+complete.o: complete.c
+display.o: display.c
+funmap.o: funmap.c
+input.o: input.c
+isearch.o: isearch.c
+keymaps.o: keymaps.c emacs_keymap.c vi_keymap.c
+kill.o: kill.c
+macro.o: macro.c
+mbutil.o: mbutil.c
+misc.o: misc.c
+nls.o: nls.c
+parens.o: parens.c
+readline.o: readline.c
+rltty.o: rltty.c
+savestring.o: savestring.c
+search.o: search.c
+shell.o: shell.c
+signals.o: signals.c
+terminal.o: terminal.c
+text.o: text.c
+tilde.o: tilde.c
+undo.o: undo.c
+util.o: util.c
+vi_mode.o: vi_mode.c
+xmalloc.o: xmalloc.c
+
+histexpand.o: histexpand.c
+histfile.o: histfile.c
+history.o: history.c
+histsearch.o: histsearch.c
diff --git a/NEWS b/NEWS
new file mode 100644 (file)
index 0000000..96711a0
--- /dev/null
+++ b/NEWS
@@ -0,0 +1,13 @@
+This is a terse description of the new features added to readline-5.2 since
+the release of readline-5.1.
+
+1.  New Features in Readline
+
+a.  Calling applications can now set the keyboard timeout to 0, allowing
+    poll-like behavior.
+
+b.  The value of SYS_INPUTRC (configurable at compilation time) is now used as
+    the default last-ditch startup file.
+
+c.  The history file reading functions now allow windows-like \r\n line
+    terminators.
diff --git a/README b/README
new file mode 100644 (file)
index 0000000..8da9962
--- /dev/null
+++ b/README
@@ -0,0 +1,186 @@
+Introduction
+============
+
+This is the Gnu Readline library, version 5.2.
+
+The Readline library provides a set of functions for use by applications
+that allow users to edit command lines as they are typed in.  Both
+Emacs and vi editing modes are available.  The Readline library includes
+additional functions to maintain a list of previously-entered command
+lines, to recall and perhaps reedit those lines, and perform csh-like
+history expansion on previous commands.
+
+The history facilites are also placed into a separate library, the
+History library, as part of the build process.  The History library
+may be used without Readline in applications which desire its
+capabilities.
+
+The Readline library is free software, distributed under the terms of
+the [GNU] General Public License, version 2.  For more information, see
+the file COPYING.
+
+To build the library, try typing `./configure', then `make'.  The
+configuration process is automated, so no further intervention should
+be necessary.  Readline builds with `gcc' by default if it is
+available.  If you want to use `cc' instead, type
+
+        CC=cc ./configure
+
+if you are using a Bourne-style shell.  If you are not, the following
+may work:
+
+        env CC=cc ./configure
+
+Read the file INSTALL in this directory for more information about how
+to customize and control the build process.
+
+The file rlconf.h contains C preprocessor defines that enable and disable
+certain Readline features.
+
+The special make target `everything' will build the static and shared
+libraries (if the target platform supports them) and the examples.
+
+Examples
+========
+
+There are several example programs that use Readline features in the
+examples directory.  The `rl' program is of particular interest.  It
+is a command-line interface to Readline, suitable for use in shell
+scripts in place of `read'.
+
+Shared Libraries
+================
+
+There is skeletal support for building shared versions of the
+Readline and History libraries.  The configure script creates
+a Makefile in the `shlib' subdirectory, and typing `make shared'
+will cause shared versions of the Readline and History libraries
+to be built on supported platforms.
+
+If `configure' is given the `--enable-shared' option, it will attempt
+to build the shared libraries by default on supported platforms.
+
+Configure calls the script support/shobj-conf to test whether or
+not shared library creation is supported and to generate the values
+of variables that are substituted into shlib/Makefile.  If you
+try to build shared libraries on an unsupported platform, `make'
+will display a message asking you to update support/shobj-conf for
+your platform.
+
+If you need to update support/shobj-conf, you will need to create
+a `stanza' for your operating system and compiler.  The script uses
+the value of host_os and ${CC} as determined by configure.  For
+instance, FreeBSD 4.2 with any version of gcc is identified as
+`freebsd4.2-gcc*'.
+
+In the stanza for your operating system-compiler pair, you will need to
+define several variables.  They are:
+
+SHOBJ_CC       The C compiler used to compile source files into shareable
+               object files.  This is normally set to the value of ${CC}
+               by configure, and should not need to be changed.
+
+SHOBJ_CFLAGS   Flags to pass to the C compiler ($SHOBJ_CC) to create
+               position-independent code.  If you are using gcc, this
+               should probably be set to `-fpic'.
+
+SHOBJ_LD       The link editor to be used to create the shared library from
+               the object files created by $SHOBJ_CC.  If you are using
+               gcc, a value of `gcc' will probably work.
+
+SHOBJ_LDFLAGS  Flags to pass to SHOBJ_LD to enable shared object creation.
+               If you are using gcc, `-shared' may be all that is necessary.
+               These should be the flags needed for generic shared object
+               creation.
+
+SHLIB_XLDFLAGS Additional flags to pass to SHOBJ_LD for shared library
+               creation.  Many systems use the -R option to the link
+               editor to embed a path within the library for run-time
+               library searches.  A reasonable value for such systems would
+               be `-R$(libdir)'.
+
+SHLIB_LIBS     Any additional libraries that shared libraries should be
+               linked against when they are created.
+
+SHLIB_LIBPREF  The prefix to use when generating the filename of the shared
+               library.  The default is `lib'; Cygwin uses `cyg'.
+
+SHLIB_LIBSUFF  The suffix to add to `libreadline' and `libhistory' when
+               generating the filename of the shared library.  Many systems
+               use `so'; HP-UX uses `sl'.
+
+SHLIB_LIBVERSION The string to append to the filename to indicate the version
+               of the shared library.  It should begin with $(SHLIB_LIBSUFF),
+               and possibly include version information that allows the
+               run-time loader to load the version of the shared library
+               appropriate for a particular program.  Systems using shared
+               libraries similar to SunOS 4.x use major and minor library
+               version numbers; for those systems a value of
+               `$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)$(SHLIB_MINOR)' is appropriate.
+               Systems based on System V Release 4 don't use minor version
+               numbers; use `$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)' on those systems.
+               Other Unix versions use different schemes.
+
+SHLIB_DLLVERSION The version number for shared libraries that determines API
+               compatibility between readline versions and the underlying
+               system.  Used only on Cygwin.  Defaults to $SHLIB_MAJOR, but
+               can be overridden at configuration time by defining DLLVERSION
+               in the environment.
+
+SHLIB_DOT      The character used to separate the name of the shared library
+               from the suffix and version information.  The default is `.';
+               systems like Cygwin which don't separate version information
+               from the library name should set this to the empty string.
+
+SHLIB_STATUS   Set this to `supported' when you have defined the other
+               necessary variables.  Make uses this to determine whether
+               or not shared library creation should be attempted.
+
+You should look at the existing stanzas in support/shobj-conf for ideas.
+
+Once you have updated support/shobj-conf, re-run configure and type
+`make shared'.  The shared libraries will be created in the shlib
+subdirectory.
+
+If shared libraries are created, `make install' will install them. 
+You may install only the shared libraries by running `make
+install-shared' from the top-level build directory.  Running `make
+install' in the shlib subdirectory will also work.  If you don't want
+to install any created shared libraries, run `make install-static'. 
+
+Documentation
+=============
+
+The documentation for the Readline and History libraries appears in
+the `doc' subdirectory.  There are three texinfo files and a
+Unix-style manual page describing the facilities available in the
+Readline library.  The texinfo files include both user and
+programmer's manuals.  HTML versions of the manuals appear in the
+`doc' subdirectory as well. 
+
+Reporting Bugs
+==============
+
+Bug reports for Readline should be sent to:
+
+        bug-readline@gnu.org
+
+When reporting a bug, please include the following information:
+
+        * the version number and release status of Readline (e.g., 4.2-release)
+        * the machine and OS that it is running on
+        * a list of the compilation flags or the contents of `config.h', if
+          appropriate
+        * a description of the bug
+        * a recipe for recreating the bug reliably
+        * a fix for the bug if you have one!
+
+If you would like to contact the Readline maintainer directly, send mail
+to bash-maintainers@gnu.org.
+
+Since Readline is developed along with bash, the bug-bash@gnu.org mailing
+list (mirrored to the Usenet newsgroup gnu.bash.bug) often contains
+Readline bug reports and fixes. 
+
+Chet Ramey
+chet.ramey@case.edu
diff --git a/USAGE b/USAGE
new file mode 100644 (file)
index 0000000..edc9f54
--- /dev/null
+++ b/USAGE
@@ -0,0 +1,37 @@
+From rms@gnu.org Thu Jul 22 20:37:55 1999
+Flags: 10
+Return-Path: rms@gnu.org
+Received: from arthur.INS.CWRU.Edu (root@arthur.INS.CWRU.Edu [129.22.8.215]) by odin.INS.CWRU.Edu with ESMTP (8.8.6+cwru/CWRU-2.4-ins)
+       id UAA25349; Thu, 22 Jul 1999 20:37:54 -0400 (EDT) (from rms@gnu.org for <chet@odin.INS.CWRU.Edu>)
+Received: from nike.ins.cwru.edu (root@nike.INS.CWRU.Edu [129.22.8.219]) by arthur.INS.CWRU.Edu with ESMTP (8.8.8+cwru/CWRU-3.6)
+       id UAA05311; Thu, 22 Jul 1999 20:37:51 -0400 (EDT) (from rms@gnu.org for <chet@po.cwru.edu>)
+Received: from pele.santafe.edu (pele.santafe.edu [192.12.12.119]) by nike.ins.cwru.edu with ESMTP (8.8.7/CWRU-2.5-bsdi)
+       id UAA13350; Thu, 22 Jul 1999 20:37:50 -0400 (EDT) (from rms@gnu.org for <chet@nike.ins.cwru.edu>)
+Received: from wijiji.santafe.edu (wijiji [192.12.12.5])
+       by pele.santafe.edu (8.9.1/8.9.1) with ESMTP id SAA10831
+       for <chet@nike.ins.cwru.edu>; Thu, 22 Jul 1999 18:37:47 -0600 (MDT)
+Received: (from rms@localhost)
+       by wijiji.santafe.edu (8.9.1b+Sun/8.9.1) id SAA01089;
+       Thu, 22 Jul 1999 18:37:46 -0600 (MDT)
+Date: Thu, 22 Jul 1999 18:37:46 -0600 (MDT)
+Message-Id: <199907230037.SAA01089@wijiji.santafe.edu>
+X-Authentication-Warning: wijiji.santafe.edu: rms set sender to rms@gnu.org using -f
+From: Richard Stallman <rms@gnu.org>
+To: chet@nike.ins.cwru.edu
+Subject: Use of Readline
+Reply-to: rms@gnu.org
+
+I think Allbery's suggestion is a good one.  So please add this text
+in a suitable place.  Please don't put it in the GPL itself; that
+should be the same as the GPL everywhere else.  Putting it in the
+README and/or the documentation would be a good idea.
+
+
+======================================================================
+Our position on the use of Readline through a shared-library linking
+mechanism is that there is no legal difference between shared-library
+linking and static linking--either kind of linking combines various
+modules into a single larger work.  The conditions for using Readline
+in a larger work are stated in section 3 of the GNU GPL.
+
+
diff --git a/aclocal.m4 b/aclocal.m4
new file mode 100644 (file)
index 0000000..eda151c
--- /dev/null
@@ -0,0 +1,4001 @@
+dnl
+dnl Bash specific tests
+dnl
+dnl Some derived from PDKSH 5.1.3 autoconf tests
+dnl
+
+AC_DEFUN(BASH_C_LONG_LONG,
+[AC_CACHE_CHECK(for long long, ac_cv_c_long_long,
+[if test "$GCC" = yes; then
+  ac_cv_c_long_long=yes
+else
+AC_TRY_RUN([
+int
+main()
+{
+long long foo = 0;
+exit(sizeof(long long) < sizeof(long));
+}
+], ac_cv_c_long_long=yes, ac_cv_c_long_long=no)
+fi])
+if test $ac_cv_c_long_long = yes; then
+  AC_DEFINE(HAVE_LONG_LONG, 1, [Define if the `long long' type works.])
+fi
+])
+
+dnl
+dnl This is very similar to AC_C_LONG_DOUBLE, with the fix for IRIX
+dnl (< changed to <=) added.
+dnl
+AC_DEFUN(BASH_C_LONG_DOUBLE,
+[AC_CACHE_CHECK(for long double, ac_cv_c_long_double,
+[if test "$GCC" = yes; then
+  ac_cv_c_long_double=yes
+else
+AC_TRY_RUN([
+int
+main()
+{
+  /* The Stardent Vistra knows sizeof(long double), but does not
+     support it. */
+  long double foo = 0.0;
+  /* On Ultrix 4.3 cc, long double is 4 and double is 8.  */
+  /* On IRIX 5.3, the compiler converts long double to double with a warning,
+     but compiles this successfully. */
+  exit(sizeof(long double) <= sizeof(double));
+}
+], ac_cv_c_long_double=yes, ac_cv_c_long_double=no)
+fi])
+if test $ac_cv_c_long_double = yes; then
+  AC_DEFINE(HAVE_LONG_DOUBLE, 1, [Define if the `long double' type works.])
+fi
+])
+
+dnl
+dnl Check for <inttypes.h>.  This is separated out so that it can be
+dnl AC_REQUIREd.
+dnl
+dnl BASH_HEADER_INTTYPES
+AC_DEFUN(BASH_HEADER_INTTYPES,
+[
+ AC_CHECK_HEADERS(inttypes.h)
+])
+
+dnl
+dnl check for typedef'd symbols in header files, but allow the caller to
+dnl specify the include files to be checked in addition to the default
+dnl 
+dnl BASH_CHECK_TYPE(TYPE, HEADERS, DEFAULT[, VALUE-IF-FOUND])
+AC_DEFUN(BASH_CHECK_TYPE,
+[
+AC_REQUIRE([AC_HEADER_STDC])dnl
+AC_REQUIRE([BASH_HEADER_INTTYPES])
+AC_MSG_CHECKING(for $1)
+AC_CACHE_VAL(bash_cv_type_$1,
+[AC_EGREP_CPP($1, [#include <sys/types.h>
+#if STDC_HEADERS
+#include <stdlib.h>
+#include <stddef.h>
+#endif
+#if HAVE_INTTYPES_H
+#include <inttypes.h>
+#endif
+$2
+], bash_cv_type_$1=yes, bash_cv_type_$1=no)])
+AC_MSG_RESULT($bash_cv_type_$1)
+ifelse($#, 4, [if test $bash_cv_type_$1 = yes; then
+       AC_DEFINE($4)
+       fi])
+if test $bash_cv_type_$1 = no; then
+  AC_DEFINE_UNQUOTED($1, $3)
+fi
+])
+
+dnl
+dnl BASH_CHECK_DECL(FUNC)
+dnl
+dnl Check for a declaration of FUNC in stdlib.h and inttypes.h like
+dnl AC_CHECK_DECL
+dnl
+AC_DEFUN(BASH_CHECK_DECL,
+[
+AC_REQUIRE([AC_HEADER_STDC])
+AC_REQUIRE([BASH_HEADER_INTTYPES])
+AC_CACHE_CHECK([for declaration of $1], bash_cv_decl_$1,
+[AC_TRY_LINK(
+[
+#if STDC_HEADERS
+#  include <stdlib.h>
+#endif
+#if HAVE_INTTYPES_H
+#  include <inttypes.h>
+#endif
+],
+[return !$1;],
+bash_cv_decl_$1=yes, bash_cv_decl_$1=no)])
+bash_tr_func=HAVE_DECL_`echo $1 | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'`
+if test $bash_cv_decl_$1 = yes; then
+  AC_DEFINE_UNQUOTED($bash_tr_func, 1)
+else
+  AC_DEFINE_UNQUOTED($bash_tr_func, 0)
+fi
+])
+
+AC_DEFUN(BASH_DECL_PRINTF,
+[AC_MSG_CHECKING(for declaration of printf in <stdio.h>)
+AC_CACHE_VAL(bash_cv_printf_declared,
+[AC_TRY_RUN([
+#include <stdio.h>
+#ifdef __STDC__
+typedef int (*_bashfunc)(const char *, ...);
+#else
+typedef int (*_bashfunc)();
+#endif
+main()
+{
+_bashfunc pf;
+pf = (_bashfunc) printf;
+exit(pf == 0);
+}
+], bash_cv_printf_declared=yes, bash_cv_printf_declared=no,
+   [AC_MSG_WARN(cannot check printf declaration if cross compiling -- defaulting to yes)
+    bash_cv_printf_declared=yes]
+)])
+AC_MSG_RESULT($bash_cv_printf_declared)
+if test $bash_cv_printf_declared = yes; then
+AC_DEFINE(PRINTF_DECLARED)
+fi
+])
+
+AC_DEFUN(BASH_DECL_SBRK,
+[AC_MSG_CHECKING(for declaration of sbrk in <unistd.h>)
+AC_CACHE_VAL(bash_cv_sbrk_declared,
+[AC_EGREP_HEADER(sbrk, unistd.h,
+ bash_cv_sbrk_declared=yes, bash_cv_sbrk_declared=no)])
+AC_MSG_RESULT($bash_cv_sbrk_declared)
+if test $bash_cv_sbrk_declared = yes; then
+AC_DEFINE(SBRK_DECLARED)
+fi
+])
+
+dnl
+dnl Check for sys_siglist[] or _sys_siglist[]
+dnl
+AC_DEFUN(BASH_DECL_UNDER_SYS_SIGLIST,
+[AC_MSG_CHECKING([for _sys_siglist in signal.h or unistd.h])
+AC_CACHE_VAL(bash_cv_decl_under_sys_siglist,
+[AC_TRY_COMPILE([
+#include <sys/types.h>
+#include <signal.h>
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif], [ char *msg = _sys_siglist[2]; ],
+  bash_cv_decl_under_sys_siglist=yes, bash_cv_decl_under_sys_siglist=no,
+  [AC_MSG_WARN(cannot check for _sys_siglist[] if cross compiling -- defaulting to no)])])dnl
+AC_MSG_RESULT($bash_cv_decl_under_sys_siglist)
+if test $bash_cv_decl_under_sys_siglist = yes; then
+AC_DEFINE(UNDER_SYS_SIGLIST_DECLARED)
+fi
+])
+
+AC_DEFUN(BASH_UNDER_SYS_SIGLIST,
+[AC_REQUIRE([BASH_DECL_UNDER_SYS_SIGLIST])
+AC_MSG_CHECKING([for _sys_siglist in system C library])
+AC_CACHE_VAL(bash_cv_under_sys_siglist,
+[AC_TRY_RUN([
+#include <sys/types.h>
+#include <signal.h>
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+#ifndef UNDER_SYS_SIGLIST_DECLARED
+extern char *_sys_siglist[];
+#endif
+main()
+{
+char *msg = (char *)_sys_siglist[2];
+exit(msg == 0);
+}],
+       bash_cv_under_sys_siglist=yes, bash_cv_under_sys_siglist=no,
+       [AC_MSG_WARN(cannot check for _sys_siglist[] if cross compiling -- defaulting to no)
+        bash_cv_under_sys_siglist=no])])
+AC_MSG_RESULT($bash_cv_under_sys_siglist)
+if test $bash_cv_under_sys_siglist = yes; then
+AC_DEFINE(HAVE_UNDER_SYS_SIGLIST)
+fi
+])
+
+AC_DEFUN(BASH_SYS_SIGLIST,
+[AC_REQUIRE([AC_DECL_SYS_SIGLIST])
+AC_MSG_CHECKING([for sys_siglist in system C library])
+AC_CACHE_VAL(bash_cv_sys_siglist,
+[AC_TRY_RUN([
+#include <sys/types.h>
+#include <signal.h>
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+#ifndef SYS_SIGLIST_DECLARED
+extern char *sys_siglist[];
+#endif
+main()
+{
+char *msg = sys_siglist[2];
+exit(msg == 0);
+}],
+       bash_cv_sys_siglist=yes, bash_cv_sys_siglist=no,
+       [AC_MSG_WARN(cannot check for sys_siglist if cross compiling -- defaulting to no)
+        bash_cv_sys_siglist=no])])
+AC_MSG_RESULT($bash_cv_sys_siglist)
+if test $bash_cv_sys_siglist = yes; then
+AC_DEFINE(HAVE_SYS_SIGLIST)
+fi
+])
+
+dnl Check for the various permutations of sys_siglist and make sure we
+dnl compile in siglist.o if they're not defined
+AC_DEFUN(BASH_CHECK_SYS_SIGLIST, [
+AC_REQUIRE([BASH_SYS_SIGLIST])
+AC_REQUIRE([BASH_DECL_UNDER_SYS_SIGLIST])
+AC_REQUIRE([BASH_FUNC_STRSIGNAL])
+if test "$bash_cv_sys_siglist" = no && test "$bash_cv_under_sys_siglist" = no && test "$bash_cv_have_strsignal" = no; then
+  SIGLIST_O=siglist.o
+else
+  SIGLIST_O=
+fi
+AC_SUBST([SIGLIST_O])
+])
+
+dnl Check for sys_errlist[] and sys_nerr, check for declaration
+AC_DEFUN(BASH_SYS_ERRLIST,
+[AC_MSG_CHECKING([for sys_errlist and sys_nerr])
+AC_CACHE_VAL(bash_cv_sys_errlist,
+[AC_TRY_LINK([#include <errno.h>],
+[extern char *sys_errlist[];
+ extern int sys_nerr;
+ char *msg = sys_errlist[sys_nerr - 1];],
+    bash_cv_sys_errlist=yes, bash_cv_sys_errlist=no)])dnl
+AC_MSG_RESULT($bash_cv_sys_errlist)
+if test $bash_cv_sys_errlist = yes; then
+AC_DEFINE(HAVE_SYS_ERRLIST)
+fi
+])
+
+dnl
+dnl Check if dup2() does not clear the close on exec flag
+dnl
+AC_DEFUN(BASH_FUNC_DUP2_CLOEXEC_CHECK,
+[AC_MSG_CHECKING(if dup2 fails to clear the close-on-exec flag)
+AC_CACHE_VAL(bash_cv_dup2_broken,
+[AC_TRY_RUN([
+#include <sys/types.h>
+#include <fcntl.h>
+main()
+{
+  int fd1, fd2, fl;
+  fd1 = open("/dev/null", 2);
+  if (fcntl(fd1, 2, 1) < 0)
+    exit(1);
+  fd2 = dup2(fd1, 1);
+  if (fd2 < 0)
+    exit(2);
+  fl = fcntl(fd2, 1, 0);
+  /* fl will be 1 if dup2 did not reset the close-on-exec flag. */
+  exit(fl != 1);
+}
+], bash_cv_dup2_broken=yes, bash_cv_dup2_broken=no,
+    [AC_MSG_WARN(cannot check dup2 if cross compiling -- defaulting to no)
+     bash_cv_dup2_broken=no])
+])
+AC_MSG_RESULT($bash_cv_dup2_broken)
+if test $bash_cv_dup2_broken = yes; then
+AC_DEFINE(DUP2_BROKEN)
+fi
+])
+
+AC_DEFUN(BASH_FUNC_STRSIGNAL,
+[AC_MSG_CHECKING([for the existence of strsignal])
+AC_CACHE_VAL(bash_cv_have_strsignal,
+[AC_TRY_LINK([#include <sys/types.h>
+#include <signal.h>],
+[char *s = (char *)strsignal(2);],
+ bash_cv_have_strsignal=yes, bash_cv_have_strsignal=no)])
+AC_MSG_RESULT($bash_cv_have_strsignal)
+if test $bash_cv_have_strsignal = yes; then
+AC_DEFINE(HAVE_STRSIGNAL)
+fi
+])
+
+dnl Check to see if opendir will open non-directories (not a nice thing)
+AC_DEFUN(BASH_FUNC_OPENDIR_CHECK,
+[AC_REQUIRE([AC_HEADER_DIRENT])dnl
+AC_MSG_CHECKING(if opendir() opens non-directories)
+AC_CACHE_VAL(bash_cv_opendir_not_robust,
+[AC_TRY_RUN([
+#include <stdio.h>
+#include <sys/types.h>
+#include <fcntl.h>
+#ifdef HAVE_UNISTD_H
+# include <unistd.h>
+#endif /* HAVE_UNISTD_H */
+#if defined(HAVE_DIRENT_H)
+# include <dirent.h>
+#else
+# define dirent direct
+# ifdef HAVE_SYS_NDIR_H
+#  include <sys/ndir.h>
+# endif /* SYSNDIR */
+# ifdef HAVE_SYS_DIR_H
+#  include <sys/dir.h>
+# endif /* SYSDIR */
+# ifdef HAVE_NDIR_H
+#  include <ndir.h>
+# endif
+#endif /* HAVE_DIRENT_H */
+main()
+{
+DIR *dir;
+int fd, err;
+err = mkdir("/tmp/bash-aclocal", 0700);
+if (err < 0) {
+  perror("mkdir");
+  exit(1);
+}
+unlink("/tmp/bash-aclocal/not_a_directory");
+fd = open("/tmp/bash-aclocal/not_a_directory", O_WRONLY|O_CREAT|O_EXCL, 0666);
+write(fd, "\n", 1);
+close(fd);
+dir = opendir("/tmp/bash-aclocal/not_a_directory");
+unlink("/tmp/bash-aclocal/not_a_directory");
+rmdir("/tmp/bash-aclocal");
+exit (dir == 0);
+}], bash_cv_opendir_not_robust=yes,bash_cv_opendir_not_robust=no,
+    [AC_MSG_WARN(cannot check opendir if cross compiling -- defaulting to no)
+     bash_cv_opendir_not_robust=no]
+)])
+AC_MSG_RESULT($bash_cv_opendir_not_robust)
+if test $bash_cv_opendir_not_robust = yes; then
+AC_DEFINE(OPENDIR_NOT_ROBUST)
+fi
+])
+
+dnl
+AC_DEFUN(BASH_TYPE_SIGHANDLER,
+[AC_MSG_CHECKING([whether signal handlers are of type void])
+AC_CACHE_VAL(bash_cv_void_sighandler,
+[AC_TRY_COMPILE([#include <sys/types.h>
+#include <signal.h>
+#ifdef signal
+#undef signal
+#endif
+#ifdef __cplusplus
+extern "C"
+#endif
+void (*signal ()) ();],
+[int i;], bash_cv_void_sighandler=yes, bash_cv_void_sighandler=no)])dnl
+AC_MSG_RESULT($bash_cv_void_sighandler)
+if test $bash_cv_void_sighandler = yes; then
+AC_DEFINE(VOID_SIGHANDLER)
+fi
+])
+
+dnl
+dnl A signed 16-bit integer quantity
+dnl
+AC_DEFUN(BASH_TYPE_BITS16_T,
+[
+if test "$ac_cv_sizeof_short" = 2; then
+  AC_CHECK_TYPE(bits16_t, short)
+elif test "$ac_cv_sizeof_char" = 2; then
+  AC_CHECK_TYPE(bits16_t, char)
+else
+  AC_CHECK_TYPE(bits16_t, short)
+fi
+])
+
+dnl
+dnl An unsigned 16-bit integer quantity
+dnl
+AC_DEFUN(BASH_TYPE_U_BITS16_T,
+[
+if test "$ac_cv_sizeof_short" = 2; then
+  AC_CHECK_TYPE(u_bits16_t, unsigned short)
+elif test "$ac_cv_sizeof_char" = 2; then
+  AC_CHECK_TYPE(u_bits16_t, unsigned char)
+else
+  AC_CHECK_TYPE(u_bits16_t, unsigned short)
+fi
+])
+
+dnl
+dnl A signed 32-bit integer quantity
+dnl
+AC_DEFUN(BASH_TYPE_BITS32_T,
+[
+if test "$ac_cv_sizeof_int" = 4; then
+  AC_CHECK_TYPE(bits32_t, int)
+elif test "$ac_cv_sizeof_long" = 4; then
+  AC_CHECK_TYPE(bits32_t, long)
+else
+  AC_CHECK_TYPE(bits32_t, int)
+fi
+])
+
+dnl
+dnl An unsigned 32-bit integer quantity
+dnl
+AC_DEFUN(BASH_TYPE_U_BITS32_T,
+[
+if test "$ac_cv_sizeof_int" = 4; then
+  AC_CHECK_TYPE(u_bits32_t, unsigned int)
+elif test "$ac_cv_sizeof_long" = 4; then
+  AC_CHECK_TYPE(u_bits32_t, unsigned long)
+else
+  AC_CHECK_TYPE(u_bits32_t, unsigned int)
+fi
+])
+
+AC_DEFUN(BASH_TYPE_PTRDIFF_T,
+[
+if test "$ac_cv_sizeof_int" = "$ac_cv_sizeof_char_p"; then
+  AC_CHECK_TYPE(ptrdiff_t, int)
+elif test "$ac_cv_sizeof_long" = "$ac_cv_sizeof_char_p"; then
+  AC_CHECK_TYPE(ptrdiff_t, long)
+elif test "$ac_cv_type_long_long" = yes && test "$ac_cv_sizeof_long_long" = "$ac_cv_sizeof_char_p"; then
+  AC_CHECK_TYPE(ptrdiff_t, [long long])
+else
+  AC_CHECK_TYPE(ptrdiff_t, int)
+fi
+])
+
+dnl
+dnl A signed 64-bit quantity
+dnl
+AC_DEFUN(BASH_TYPE_BITS64_T,
+[
+if test "$ac_cv_sizeof_char_p" = 8; then
+  AC_CHECK_TYPE(bits64_t, char *)
+elif test "$ac_cv_sizeof_double" = 8; then
+  AC_CHECK_TYPE(bits64_t, double)
+elif test -n "$ac_cv_type_long_long" && test "$ac_cv_sizeof_long_long" = 8; then
+  AC_CHECK_TYPE(bits64_t, [long long])
+elif test "$ac_cv_sizeof_long" = 8; then
+  AC_CHECK_TYPE(bits64_t, long)
+else
+  AC_CHECK_TYPE(bits64_t, double)
+fi
+])
+
+AC_DEFUN(BASH_TYPE_LONG_LONG,
+[
+AC_CACHE_CHECK([for long long], bash_cv_type_long_long,
+[AC_TRY_LINK([
+long long ll = 1; int i = 63;],
+[
+long long llm = (long long) -1;
+return ll << i | ll >> i | llm / ll | llm % ll;
+], bash_cv_type_long_long='long long', bash_cv_type_long_long='long')])
+if test "$bash_cv_type_long_long" = 'long long'; then
+  AC_DEFINE(HAVE_LONG_LONG, 1)
+fi
+])
+
+AC_DEFUN(BASH_TYPE_UNSIGNED_LONG_LONG,
+[
+AC_CACHE_CHECK([for unsigned long long], bash_cv_type_unsigned_long_long,
+[AC_TRY_LINK([
+unsigned long long ull = 1; int i = 63;],
+[
+unsigned long long ullmax = (unsigned long long) -1;
+return ull << i | ull >> i | ullmax / ull | ullmax % ull;
+], bash_cv_type_unsigned_long_long='unsigned long long',
+   bash_cv_type_unsigned_long_long='unsigned long')])
+if test "$bash_cv_type_unsigned_long_long" = 'unsigned long long'; then
+  AC_DEFINE(HAVE_UNSIGNED_LONG_LONG, 1)
+fi
+])
+
+dnl
+dnl Type of struct rlimit fields: some systems (OSF/1, NetBSD, RISC/os 5.0)
+dnl have a rlim_t, others (4.4BSD based systems) use quad_t, others use
+dnl long and still others use int (HP-UX 9.01, SunOS 4.1.3).  To simplify
+dnl matters, this just checks for rlim_t, quad_t, or long.
+dnl
+AC_DEFUN(BASH_TYPE_RLIMIT,
+[AC_MSG_CHECKING(for size and type of struct rlimit fields)
+AC_CACHE_VAL(bash_cv_type_rlimit,
+[AC_TRY_COMPILE([#include <sys/types.h>
+#include <sys/resource.h>],
+[rlim_t xxx;], bash_cv_type_rlimit=rlim_t,[
+AC_TRY_RUN([
+#include <sys/types.h>
+#include <sys/time.h>
+#include <sys/resource.h>
+main()
+{
+#ifdef HAVE_QUAD_T
+  struct rlimit rl;
+  if (sizeof(rl.rlim_cur) == sizeof(quad_t))
+    exit(0);
+#endif
+  exit(1);
+}], bash_cv_type_rlimit=quad_t, bash_cv_type_rlimit=long,
+        [AC_MSG_WARN(cannot check quad_t if cross compiling -- defaulting to long)
+         bash_cv_type_rlimit=long])])
+])
+AC_MSG_RESULT($bash_cv_type_rlimit)
+if test $bash_cv_type_rlimit = quad_t; then
+AC_DEFINE(RLIMTYPE, quad_t)
+elif test $bash_cv_type_rlimit = rlim_t; then
+AC_DEFINE(RLIMTYPE, rlim_t)
+fi
+])
+
+AC_DEFUN(BASH_FUNC_LSTAT,
+[dnl Cannot use AC_CHECK_FUNCS(lstat) because Linux defines lstat() as an
+dnl inline function in <sys/stat.h>.
+AC_CACHE_CHECK([for lstat], bash_cv_func_lstat,
+[AC_TRY_LINK([
+#include <sys/types.h>
+#include <sys/stat.h>
+],[ lstat(".",(struct stat *)0); ],
+bash_cv_func_lstat=yes, bash_cv_func_lstat=no)])
+if test $bash_cv_func_lstat = yes; then
+  AC_DEFINE(HAVE_LSTAT)
+fi
+])
+
+AC_DEFUN(BASH_FUNC_INET_ATON,
+[
+AC_CACHE_CHECK([for inet_aton], bash_cv_func_inet_aton,
+[AC_TRY_LINK([
+#include <sys/types.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+struct in_addr ap;], [ inet_aton("127.0.0.1", &ap); ],
+bash_cv_func_inet_aton=yes, bash_cv_func_inet_aton=no)])
+if test $bash_cv_func_inet_aton = yes; then
+  AC_DEFINE(HAVE_INET_ATON)
+else
+  AC_LIBOBJ(inet_aton)
+fi
+])
+
+AC_DEFUN(BASH_FUNC_GETENV,
+[AC_MSG_CHECKING(to see if getenv can be redefined)
+AC_CACHE_VAL(bash_cv_getenv_redef,
+[AC_TRY_RUN([
+#ifdef HAVE_UNISTD_H
+#  include <unistd.h>
+#endif
+#ifndef __STDC__
+#  ifndef const
+#    define const
+#  endif
+#endif
+char *
+getenv (name)
+#if defined (__linux__) || defined (__bsdi__) || defined (convex)
+     const char *name;
+#else
+     char const *name;
+#endif /* !__linux__ && !__bsdi__ && !convex */
+{
+return "42";
+}
+main()
+{
+char *s;
+/* The next allows this program to run, but does not allow bash to link
+   when it redefines getenv.  I'm not really interested in figuring out
+   why not. */
+#if defined (NeXT)
+exit(1);
+#endif
+s = getenv("ABCDE");
+exit(s == 0);  /* force optimizer to leave getenv in */
+}
+], bash_cv_getenv_redef=yes, bash_cv_getenv_redef=no,
+   [AC_MSG_WARN(cannot check getenv redefinition if cross compiling -- defaulting to yes)
+    bash_cv_getenv_redef=yes]
+)])
+AC_MSG_RESULT($bash_cv_getenv_redef)
+if test $bash_cv_getenv_redef = yes; then
+AC_DEFINE(CAN_REDEFINE_GETENV)
+fi
+])
+
+# We should check for putenv before calling this
+AC_DEFUN(BASH_FUNC_STD_PUTENV,
+[
+AC_REQUIRE([AC_HEADER_STDC])
+AC_REQUIRE([AC_C_PROTOTYPES])
+AC_CACHE_CHECK([for standard-conformant putenv declaration], bash_cv_std_putenv,
+[AC_TRY_LINK([
+#if STDC_HEADERS
+#include <stdlib.h>
+#include <stddef.h>
+#endif
+#ifndef __STDC__
+#  ifndef const
+#    define const
+#  endif
+#endif
+#ifdef PROTOTYPES
+extern int putenv (char *);
+#else
+extern int putenv ();
+#endif
+],
+[return (putenv == 0);],
+bash_cv_std_putenv=yes, bash_cv_std_putenv=no
+)])
+if test $bash_cv_std_putenv = yes; then
+AC_DEFINE(HAVE_STD_PUTENV)
+fi
+])
+
+# We should check for unsetenv before calling this
+AC_DEFUN(BASH_FUNC_STD_UNSETENV,
+[
+AC_REQUIRE([AC_HEADER_STDC])
+AC_REQUIRE([AC_C_PROTOTYPES])
+AC_CACHE_CHECK([for standard-conformant unsetenv declaration], bash_cv_std_unsetenv,
+[AC_TRY_LINK([
+#if STDC_HEADERS
+#include <stdlib.h>
+#include <stddef.h>
+#endif
+#ifndef __STDC__
+#  ifndef const
+#    define const
+#  endif
+#endif
+#ifdef PROTOTYPES
+extern int unsetenv (const char *);
+#else
+extern int unsetenv ();
+#endif
+],
+[return (unsetenv == 0);],
+bash_cv_std_unsetenv=yes, bash_cv_std_unsetenv=no
+)])
+if test $bash_cv_std_unsetenv = yes; then
+AC_DEFINE(HAVE_STD_UNSETENV)
+fi
+])
+
+AC_DEFUN(BASH_FUNC_ULIMIT_MAXFDS,
+[AC_MSG_CHECKING(whether ulimit can substitute for getdtablesize)
+AC_CACHE_VAL(bash_cv_ulimit_maxfds,
+[AC_TRY_RUN([
+main()
+{
+long maxfds = ulimit(4, 0L);
+exit (maxfds == -1L);
+}
+], bash_cv_ulimit_maxfds=yes, bash_cv_ulimit_maxfds=no,
+   [AC_MSG_WARN(cannot check ulimit if cross compiling -- defaulting to no)
+    bash_cv_ulimit_maxfds=no]
+)])
+AC_MSG_RESULT($bash_cv_ulimit_maxfds)
+if test $bash_cv_ulimit_maxfds = yes; then
+AC_DEFINE(ULIMIT_MAXFDS)
+fi
+])
+
+AC_DEFUN(BASH_FUNC_GETCWD,
+[AC_MSG_CHECKING([if getcwd() will dynamically allocate memory])
+AC_CACHE_VAL(bash_cv_getcwd_malloc,
+[AC_TRY_RUN([
+#include <stdio.h>
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+
+main()
+{
+       char    *xpwd;
+       xpwd = getcwd(0, 0);
+       exit (xpwd == 0);
+}
+], bash_cv_getcwd_malloc=yes, bash_cv_getcwd_malloc=no,
+   [AC_MSG_WARN(cannot check whether getcwd allocates memory when cross-compiling -- defaulting to no)
+    bash_cv_getcwd_malloc=no]
+)])
+AC_MSG_RESULT($bash_cv_getcwd_malloc)
+if test $bash_cv_getcwd_malloc = no; then
+AC_DEFINE(GETCWD_BROKEN)
+AC_LIBOBJ(getcwd)
+fi
+])
+
+dnl
+dnl This needs BASH_CHECK_SOCKLIB, but since that's not called on every
+dnl system, we can't use AC_PREREQ
+dnl
+AC_DEFUN(BASH_FUNC_GETHOSTBYNAME,
+[if test "X$bash_cv_have_gethostbyname" = "X"; then
+_bash_needmsg=yes
+else
+AC_MSG_CHECKING(for gethostbyname in socket library)
+_bash_needmsg=
+fi
+AC_CACHE_VAL(bash_cv_have_gethostbyname,
+[AC_TRY_LINK([#include <netdb.h>],
+[ struct hostent *hp;
+  hp = gethostbyname("localhost");
+], bash_cv_have_gethostbyname=yes, bash_cv_have_gethostbyname=no)]
+)
+if test "X$_bash_needmsg" = Xyes; then
+    AC_MSG_CHECKING(for gethostbyname in socket library)
+fi
+AC_MSG_RESULT($bash_cv_have_gethostbyname)
+if test "$bash_cv_have_gethostbyname" = yes; then
+AC_DEFINE(HAVE_GETHOSTBYNAME)
+fi
+])
+
+AC_DEFUN(BASH_FUNC_FNMATCH_EXTMATCH,
+[AC_MSG_CHECKING(if fnmatch does extended pattern matching with FNM_EXTMATCH)
+AC_CACHE_VAL(bash_cv_fnm_extmatch,
+[AC_TRY_RUN([
+#include <fnmatch.h>
+
+main()
+{
+#ifdef FNM_EXTMATCH
+  exit (0);
+#else
+  exit (1);
+#endif
+}
+], bash_cv_fnm_extmatch=yes, bash_cv_fnm_extmatch=no,
+    [AC_MSG_WARN(cannot check FNM_EXTMATCH if cross compiling -- defaulting to no)
+     bash_cv_fnm_extmatch=no])
+])
+AC_MSG_RESULT($bash_cv_fnm_extmatch)
+if test $bash_cv_fnm_extmatch = yes; then
+AC_DEFINE(HAVE_LIBC_FNM_EXTMATCH)
+fi
+])
+
+AC_DEFUN(BASH_FUNC_POSIX_SETJMP,
+[AC_REQUIRE([BASH_SYS_SIGNAL_VINTAGE])
+AC_MSG_CHECKING(for presence of POSIX-style sigsetjmp/siglongjmp)
+AC_CACHE_VAL(bash_cv_func_sigsetjmp,
+[AC_TRY_RUN([
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+#include <sys/types.h>
+#include <signal.h>
+#include <setjmp.h>
+
+main()
+{
+#if !defined (_POSIX_VERSION) || !defined (HAVE_POSIX_SIGNALS)
+exit (1);
+#else
+
+int code;
+sigset_t set, oset;
+sigjmp_buf xx;
+
+/* get the mask */
+sigemptyset(&set);
+sigemptyset(&oset);
+sigprocmask(SIG_BLOCK, (sigset_t *)NULL, &set);
+sigprocmask(SIG_BLOCK, (sigset_t *)NULL, &oset);
+
+/* save it */
+code = sigsetjmp(xx, 1);
+if (code)
+  exit(0);     /* could get sigmask and compare to oset here. */
+
+/* change it */
+sigaddset(&set, SIGINT);
+sigprocmask(SIG_BLOCK, &set, (sigset_t *)NULL);
+
+/* and siglongjmp */
+siglongjmp(xx, 10);
+exit(1);
+#endif
+}], bash_cv_func_sigsetjmp=present, bash_cv_func_sigsetjmp=missing,
+    [AC_MSG_WARN(cannot check for sigsetjmp/siglongjmp if cross-compiling -- defaulting to missing)
+     bash_cv_func_sigsetjmp=missing]
+)])
+AC_MSG_RESULT($bash_cv_func_sigsetjmp)
+if test $bash_cv_func_sigsetjmp = present; then
+AC_DEFINE(HAVE_POSIX_SIGSETJMP)
+fi
+])
+
+AC_DEFUN(BASH_FUNC_STRCOLL,
+[
+AC_MSG_CHECKING(whether or not strcoll and strcmp differ)
+AC_CACHE_VAL(bash_cv_func_strcoll_broken,
+[AC_TRY_RUN([
+#include <stdio.h>
+#if defined (HAVE_LOCALE_H)
+#include <locale.h>
+#endif
+
+main(c, v)
+int     c;
+char    *v[];
+{
+        int     r1, r2;
+        char    *deflocale, *defcoll;
+
+#ifdef HAVE_SETLOCALE
+        deflocale = setlocale(LC_ALL, "");
+       defcoll = setlocale(LC_COLLATE, "");
+#endif
+
+#ifdef HAVE_STRCOLL
+       /* These two values are taken from tests/glob-test. */
+        r1 = strcoll("abd", "aXd");
+#else
+       r1 = 0;
+#endif
+        r2 = strcmp("abd", "aXd");
+
+       /* These two should both be greater than 0.  It is permissible for
+          a system to return different values, as long as the sign is the
+          same. */
+
+        /* Exit with 1 (failure) if these two values are both > 0, since
+          this tests whether strcoll(3) is broken with respect to strcmp(3)
+          in the default locale. */
+       exit (r1 > 0 && r2 > 0);
+}
+], bash_cv_func_strcoll_broken=yes, bash_cv_func_strcoll_broken=no,
+   [AC_MSG_WARN(cannot check strcoll if cross compiling -- defaulting to no)
+    bash_cv_func_strcoll_broken=no]
+)])
+AC_MSG_RESULT($bash_cv_func_strcoll_broken)
+if test $bash_cv_func_strcoll_broken = yes; then
+AC_DEFINE(STRCOLL_BROKEN)
+fi
+])
+
+AC_DEFUN(BASH_FUNC_PRINTF_A_FORMAT,
+[AC_MSG_CHECKING([for printf floating point output in hex notation])
+AC_CACHE_VAL(bash_cv_printf_a_format,
+[AC_TRY_RUN([
+#include <stdio.h>
+#include <string.h>
+
+int
+main()
+{
+       double y = 0.0;
+       char abuf[1024];
+
+       sprintf(abuf, "%A", y);
+       exit(strchr(abuf, 'P') == (char *)0);
+}
+], bash_cv_printf_a_format=yes, bash_cv_printf_a_format=no,
+   [AC_MSG_WARN(cannot check printf if cross compiling -- defaulting to no)
+    bash_cv_printf_a_format=no]
+)])
+AC_MSG_RESULT($bash_cv_printf_a_format)
+if test $bash_cv_printf_a_format = yes; then
+AC_DEFINE(HAVE_PRINTF_A_FORMAT)
+fi
+])
+
+AC_DEFUN(BASH_STRUCT_TERMIOS_LDISC,
+[
+AC_CHECK_MEMBER(struct termios.c_line, AC_DEFINE(TERMIOS_LDISC), ,[
+#include <sys/types.h>
+#include <termios.h>
+])
+])
+
+AC_DEFUN(BASH_STRUCT_TERMIO_LDISC,
+[
+AC_CHECK_MEMBER(struct termio.c_line, AC_DEFINE(TERMIO_LDISC), ,[
+#include <sys/types.h>
+#include <termio.h>
+])
+])
+
+dnl
+dnl Like AC_STRUCT_ST_BLOCKS, but doesn't muck with LIBOBJS
+dnl
+dnl sets bash_cv_struct_stat_st_blocks
+dnl
+dnl unused for now; we'll see how AC_CHECK_MEMBERS works
+dnl
+AC_DEFUN(BASH_STRUCT_ST_BLOCKS,
+[
+AC_MSG_CHECKING([for struct stat.st_blocks])
+AC_CACHE_VAL(bash_cv_struct_stat_st_blocks,
+[AC_TRY_COMPILE(
+[
+#include <sys/types.h>
+#include <sys/stat.h>
+],
+[
+main()
+{
+static struct stat a;
+if (a.st_blocks) return 0;
+return 0;
+}
+], bash_cv_struct_stat_st_blocks=yes, bash_cv_struct_stat_st_blocks=no)
+])
+AC_MSG_RESULT($bash_cv_struct_stat_st_blocks)
+if test "$bash_cv_struct_stat_st_blocks" = "yes"; then
+AC_DEFINE(HAVE_STRUCT_STAT_ST_BLOCKS)
+fi
+])
+
+AC_DEFUN([BASH_CHECK_LIB_TERMCAP],
+[
+if test "X$bash_cv_termcap_lib" = "X"; then
+_bash_needmsg=yes
+else
+AC_MSG_CHECKING(which library has the termcap functions)
+_bash_needmsg=
+fi
+AC_CACHE_VAL(bash_cv_termcap_lib,
+[AC_CHECK_FUNC(tgetent, bash_cv_termcap_lib=libc,
+  [AC_CHECK_LIB(termcap, tgetent, bash_cv_termcap_lib=libtermcap,
+    [AC_CHECK_LIB(tinfo, tgetent, bash_cv_termcap_lib=libtinfo,
+        [AC_CHECK_LIB(curses, tgetent, bash_cv_termcap_lib=libcurses,
+           [AC_CHECK_LIB(ncurses, tgetent, bash_cv_termcap_lib=libncurses,
+               bash_cv_termcap_lib=gnutermcap)])])])])])
+if test "X$_bash_needmsg" = "Xyes"; then
+AC_MSG_CHECKING(which library has the termcap functions)
+fi
+AC_MSG_RESULT(using $bash_cv_termcap_lib)
+if test $bash_cv_termcap_lib = gnutermcap && test -z "$prefer_curses"; then
+LDFLAGS="$LDFLAGS -L./lib/termcap"
+TERMCAP_LIB="./lib/termcap/libtermcap.a"
+TERMCAP_DEP="./lib/termcap/libtermcap.a"
+elif test $bash_cv_termcap_lib = libtermcap && test -z "$prefer_curses"; then
+TERMCAP_LIB=-ltermcap
+TERMCAP_DEP=
+elif test $bash_cv_termcap_lib = libtinfo; then
+TERMCAP_LIB=-ltinfo
+TERMCAP_DEP=
+elif test $bash_cv_termcap_lib = libncurses; then
+TERMCAP_LIB=-lncurses
+TERMCAP_DEP=
+elif test $bash_cv_termcap_lib = libc; then
+TERMCAP_LIB=
+TERMCAP_DEP=
+else
+TERMCAP_LIB=-lcurses
+TERMCAP_DEP=
+fi
+])
+
+dnl
+dnl Check for the presence of getpeername in libsocket.
+dnl If libsocket is present, check for libnsl and add it to LIBS if
+dnl it's there, since most systems with libsocket require linking
+dnl with libnsl as well.  This should only be called if getpeername
+dnl was not found in libc.
+dnl
+dnl NOTE: IF WE FIND GETPEERNAME, WE ASSUME THAT WE HAVE BIND/CONNECT
+dnl      AS WELL
+dnl
+AC_DEFUN(BASH_CHECK_LIB_SOCKET,
+[
+if test "X$bash_cv_have_socklib" = "X"; then
+_bash_needmsg=
+else
+AC_MSG_CHECKING(for socket library)
+_bash_needmsg=yes
+fi
+AC_CACHE_VAL(bash_cv_have_socklib,
+[AC_CHECK_LIB(socket, getpeername,
+        bash_cv_have_socklib=yes, bash_cv_have_socklib=no, -lnsl)])
+if test "X$_bash_needmsg" = Xyes; then
+  AC_MSG_RESULT($bash_cv_have_socklib)
+  _bash_needmsg=
+fi
+if test $bash_cv_have_socklib = yes; then
+  # check for libnsl, add it to LIBS if present
+  if test "X$bash_cv_have_libnsl" = "X"; then
+    _bash_needmsg=
+  else
+    AC_MSG_CHECKING(for libnsl)
+    _bash_needmsg=yes
+  fi
+  AC_CACHE_VAL(bash_cv_have_libnsl,
+          [AC_CHECK_LIB(nsl, t_open,
+                bash_cv_have_libnsl=yes, bash_cv_have_libnsl=no)])
+  if test "X$_bash_needmsg" = Xyes; then
+    AC_MSG_RESULT($bash_cv_have_libnsl)
+    _bash_needmsg=
+  fi
+  if test $bash_cv_have_libnsl = yes; then
+    LIBS="-lsocket -lnsl $LIBS"
+  else
+    LIBS="-lsocket $LIBS"
+  fi
+  AC_DEFINE(HAVE_LIBSOCKET)
+  AC_DEFINE(HAVE_GETPEERNAME)
+fi
+])
+
+AC_DEFUN(BASH_STRUCT_DIRENT_D_INO,
+[AC_REQUIRE([AC_HEADER_DIRENT])
+AC_MSG_CHECKING(for struct dirent.d_ino)
+AC_CACHE_VAL(bash_cv_dirent_has_dino,
+[AC_TRY_COMPILE([
+#include <stdio.h>
+#include <sys/types.h>
+#ifdef HAVE_UNISTD_H
+# include <unistd.h>
+#endif /* HAVE_UNISTD_H */
+#if defined(HAVE_DIRENT_H)
+# include <dirent.h>
+#else
+# define dirent direct
+# ifdef HAVE_SYS_NDIR_H
+#  include <sys/ndir.h>
+# endif /* SYSNDIR */
+# ifdef HAVE_SYS_DIR_H
+#  include <sys/dir.h>
+# endif /* SYSDIR */
+# ifdef HAVE_NDIR_H
+#  include <ndir.h>
+# endif
+#endif /* HAVE_DIRENT_H */
+],[
+struct dirent d; int z; z = d.d_ino;
+], bash_cv_dirent_has_dino=yes, bash_cv_dirent_has_dino=no)])
+AC_MSG_RESULT($bash_cv_dirent_has_dino)
+if test $bash_cv_dirent_has_dino = yes; then
+AC_DEFINE(HAVE_STRUCT_DIRENT_D_INO)
+fi
+])
+
+AC_DEFUN(BASH_STRUCT_DIRENT_D_FILENO,
+[AC_REQUIRE([AC_HEADER_DIRENT])
+AC_MSG_CHECKING(for struct dirent.d_fileno)
+AC_CACHE_VAL(bash_cv_dirent_has_d_fileno,
+[AC_TRY_COMPILE([
+#include <stdio.h>
+#include <sys/types.h>
+#ifdef HAVE_UNISTD_H
+# include <unistd.h>
+#endif /* HAVE_UNISTD_H */
+#if defined(HAVE_DIRENT_H)
+# include <dirent.h>
+#else
+# define dirent direct
+# ifdef HAVE_SYS_NDIR_H
+#  include <sys/ndir.h>
+# endif /* SYSNDIR */
+# ifdef HAVE_SYS_DIR_H
+#  include <sys/dir.h>
+# endif /* SYSDIR */
+# ifdef HAVE_NDIR_H
+#  include <ndir.h>
+# endif
+#endif /* HAVE_DIRENT_H */
+],[
+struct dirent d; int z; z = d.d_fileno;
+], bash_cv_dirent_has_d_fileno=yes, bash_cv_dirent_has_d_fileno=no)])
+AC_MSG_RESULT($bash_cv_dirent_has_d_fileno)
+if test $bash_cv_dirent_has_d_fileno = yes; then
+AC_DEFINE(HAVE_STRUCT_DIRENT_D_FILENO)
+fi
+])
+
+AC_DEFUN(BASH_STRUCT_DIRENT_D_NAMLEN,
+[AC_REQUIRE([AC_HEADER_DIRENT])
+AC_MSG_CHECKING(for struct dirent.d_namlen)
+AC_CACHE_VAL(bash_cv_dirent_has_d_namlen,
+[AC_TRY_COMPILE([
+#include <stdio.h>
+#include <sys/types.h>
+#ifdef HAVE_UNISTD_H
+# include <unistd.h>
+#endif /* HAVE_UNISTD_H */
+#if defined(HAVE_DIRENT_H)
+# include <dirent.h>
+#else
+# define dirent direct
+# ifdef HAVE_SYS_NDIR_H
+#  include <sys/ndir.h>
+# endif /* SYSNDIR */
+# ifdef HAVE_SYS_DIR_H
+#  include <sys/dir.h>
+# endif /* SYSDIR */
+# ifdef HAVE_NDIR_H
+#  include <ndir.h>
+# endif
+#endif /* HAVE_DIRENT_H */
+],[
+struct dirent d; int z; z = d.d_namlen;
+], bash_cv_dirent_has_d_namlen=yes, bash_cv_dirent_has_d_namlen=no)])
+AC_MSG_RESULT($bash_cv_dirent_has_d_namlen)
+if test $bash_cv_dirent_has_d_namlen = yes; then
+AC_DEFINE(HAVE_STRUCT_DIRENT_D_NAMLEN)
+fi
+])
+
+AC_DEFUN(BASH_STRUCT_TIMEVAL,
+[AC_MSG_CHECKING(for struct timeval in sys/time.h and time.h)
+AC_CACHE_VAL(bash_cv_struct_timeval,
+[
+AC_EGREP_HEADER(struct timeval, sys/time.h,
+               bash_cv_struct_timeval=yes,
+               AC_EGREP_HEADER(struct timeval, time.h,
+                       bash_cv_struct_timeval=yes,
+                       bash_cv_struct_timeval=no))
+])
+AC_MSG_RESULT($bash_cv_struct_timeval)
+if test $bash_cv_struct_timeval = yes; then
+  AC_DEFINE(HAVE_TIMEVAL)
+fi
+])
+
+AC_DEFUN(BASH_STRUCT_TIMEZONE,
+[AC_MSG_CHECKING(for struct timezone in sys/time.h and time.h)
+AC_CACHE_VAL(bash_cv_struct_timezone,
+[
+AC_EGREP_HEADER(struct timezone, sys/time.h,
+               bash_cv_struct_timezone=yes,
+               AC_EGREP_HEADER(struct timezone, time.h,
+                       bash_cv_struct_timezone=yes,
+                       bash_cv_struct_timezone=no))
+])
+AC_MSG_RESULT($bash_cv_struct_timezone)
+if test $bash_cv_struct_timezone = yes; then
+  AC_DEFINE(HAVE_STRUCT_TIMEZONE)
+fi
+])
+
+AC_DEFUN(BASH_STRUCT_WINSIZE,
+[AC_MSG_CHECKING(for struct winsize in sys/ioctl.h and termios.h)
+AC_CACHE_VAL(bash_cv_struct_winsize_header,
+[AC_TRY_COMPILE([#include <sys/types.h>
+#include <sys/ioctl.h>], [struct winsize x;],
+  bash_cv_struct_winsize_header=ioctl_h,
+  [AC_TRY_COMPILE([#include <sys/types.h>
+#include <termios.h>], [struct winsize x;],
+  bash_cv_struct_winsize_header=termios_h, bash_cv_struct_winsize_header=other)
+])])
+if test $bash_cv_struct_winsize_header = ioctl_h; then
+  AC_MSG_RESULT(sys/ioctl.h)
+  AC_DEFINE(STRUCT_WINSIZE_IN_SYS_IOCTL)
+elif test $bash_cv_struct_winsize_header = termios_h; then
+  AC_MSG_RESULT(termios.h)
+  AC_DEFINE(STRUCT_WINSIZE_IN_TERMIOS)
+else
+  AC_MSG_RESULT(not found)
+fi
+])
+
+dnl Check type of signal routines (posix, 4.2bsd, 4.1bsd or v7)
+AC_DEFUN(BASH_SYS_SIGNAL_VINTAGE,
+[AC_REQUIRE([AC_TYPE_SIGNAL])
+AC_MSG_CHECKING(for type of signal functions)
+AC_CACHE_VAL(bash_cv_signal_vintage,
+[
+  AC_TRY_LINK([#include <signal.h>],[
+    sigset_t ss;
+    struct sigaction sa;
+    sigemptyset(&ss); sigsuspend(&ss);
+    sigaction(SIGINT, &sa, (struct sigaction *) 0);
+    sigprocmask(SIG_BLOCK, &ss, (sigset_t *) 0);
+  ], bash_cv_signal_vintage=posix,
+  [
+    AC_TRY_LINK([#include <signal.h>], [
+       int mask = sigmask(SIGINT);
+       sigsetmask(mask); sigblock(mask); sigpause(mask);
+    ], bash_cv_signal_vintage=4.2bsd,
+    [
+      AC_TRY_LINK([
+       #include <signal.h>
+       RETSIGTYPE foo() { }], [
+               int mask = sigmask(SIGINT);
+               sigset(SIGINT, foo); sigrelse(SIGINT);
+               sighold(SIGINT); sigpause(SIGINT);
+        ], bash_cv_signal_vintage=svr3, bash_cv_signal_vintage=v7
+    )]
+  )]
+)
+])
+AC_MSG_RESULT($bash_cv_signal_vintage)
+if test "$bash_cv_signal_vintage" = posix; then
+AC_DEFINE(HAVE_POSIX_SIGNALS)
+elif test "$bash_cv_signal_vintage" = "4.2bsd"; then
+AC_DEFINE(HAVE_BSD_SIGNALS)
+elif test "$bash_cv_signal_vintage" = svr3; then
+AC_DEFINE(HAVE_USG_SIGHOLD)
+fi
+])
+
+dnl Check if the pgrp of setpgrp() can't be the pid of a zombie process.
+AC_DEFUN(BASH_SYS_PGRP_SYNC,
+[AC_REQUIRE([AC_FUNC_GETPGRP])
+AC_MSG_CHECKING(whether pgrps need synchronization)
+AC_CACHE_VAL(bash_cv_pgrp_pipe,
+[AC_TRY_RUN([
+#ifdef HAVE_UNISTD_H
+#  include <unistd.h>
+#endif
+main()
+{
+# ifdef GETPGRP_VOID
+#  define getpgID()    getpgrp()
+# else
+#  define getpgID()    getpgrp(0)
+#  define setpgid(x,y) setpgrp(x,y)
+# endif
+       int pid1, pid2, fds[2];
+       int status;
+       char ok;
+
+       switch (pid1 = fork()) {
+         case -1:
+           exit(1);
+         case 0:
+           setpgid(0, getpid());
+           exit(0);
+       }
+       setpgid(pid1, pid1);
+
+       sleep(2);       /* let first child die */
+
+       if (pipe(fds) < 0)
+         exit(2);
+
+       switch (pid2 = fork()) {
+         case -1:
+           exit(3);
+         case 0:
+           setpgid(0, pid1);
+           ok = getpgID() == pid1;
+           write(fds[1], &ok, 1);
+           exit(0);
+       }
+       setpgid(pid2, pid1);
+
+       close(fds[1]);
+       if (read(fds[0], &ok, 1) != 1)
+         exit(4);
+       wait(&status);
+       wait(&status);
+       exit(ok ? 0 : 5);
+}
+], bash_cv_pgrp_pipe=no,bash_cv_pgrp_pipe=yes,
+   [AC_MSG_WARN(cannot check pgrp synchronization if cross compiling -- defaulting to no)
+    bash_cv_pgrp_pipe=no])
+])
+AC_MSG_RESULT($bash_cv_pgrp_pipe)
+if test $bash_cv_pgrp_pipe = yes; then
+AC_DEFINE(PGRP_PIPE)
+fi
+])
+
+AC_DEFUN(BASH_SYS_REINSTALL_SIGHANDLERS,
+[AC_REQUIRE([AC_TYPE_SIGNAL])
+AC_REQUIRE([BASH_SYS_SIGNAL_VINTAGE])
+AC_MSG_CHECKING([if signal handlers must be reinstalled when invoked])
+AC_CACHE_VAL(bash_cv_must_reinstall_sighandlers,
+[AC_TRY_RUN([
+#include <signal.h>
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+
+typedef RETSIGTYPE sigfunc();
+
+int nsigint;
+
+#ifdef HAVE_POSIX_SIGNALS
+sigfunc *
+set_signal_handler(sig, handler)
+     int sig;
+     sigfunc *handler;
+{
+  struct sigaction act, oact;
+  act.sa_handler = handler;
+  act.sa_flags = 0;
+  sigemptyset (&act.sa_mask);
+  sigemptyset (&oact.sa_mask);
+  sigaction (sig, &act, &oact);
+  return (oact.sa_handler);
+}
+#else
+#define set_signal_handler(s, h) signal(s, h)
+#endif
+
+RETSIGTYPE
+sigint(s)
+int s;
+{
+  nsigint++;
+}
+
+main()
+{
+       nsigint = 0;
+       set_signal_handler(SIGINT, sigint);
+       kill((int)getpid(), SIGINT);
+       kill((int)getpid(), SIGINT);
+       exit(nsigint != 2);
+}
+], bash_cv_must_reinstall_sighandlers=no, bash_cv_must_reinstall_sighandlers=yes,
+   [AC_MSG_WARN(cannot check signal handling if cross compiling -- defaulting to no)
+    bash_cv_must_reinstall_sighandlers=no]
+)])
+AC_MSG_RESULT($bash_cv_must_reinstall_sighandlers)
+if test $bash_cv_must_reinstall_sighandlers = yes; then
+AC_DEFINE(MUST_REINSTALL_SIGHANDLERS)
+fi
+])
+
+dnl check that some necessary job control definitions are present
+AC_DEFUN(BASH_SYS_JOB_CONTROL_MISSING,
+[AC_REQUIRE([BASH_SYS_SIGNAL_VINTAGE])
+AC_MSG_CHECKING(for presence of necessary job control definitions)
+AC_CACHE_VAL(bash_cv_job_control_missing,
+[AC_TRY_RUN([
+#include <sys/types.h>
+#ifdef HAVE_SYS_WAIT_H
+#include <sys/wait.h>
+#endif
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+#include <signal.h>
+
+/* Add more tests in here as appropriate. */
+main()
+{
+/* signal type */
+#if !defined (HAVE_POSIX_SIGNALS) && !defined (HAVE_BSD_SIGNALS)
+exit(1);
+#endif
+
+/* signals and tty control. */
+#if !defined (SIGTSTP) || !defined (SIGSTOP) || !defined (SIGCONT)
+exit (1);
+#endif
+
+/* process control */
+#if !defined (WNOHANG) || !defined (WUNTRACED) 
+exit(1);
+#endif
+
+/* Posix systems have tcgetpgrp and waitpid. */
+#if defined (_POSIX_VERSION) && !defined (HAVE_TCGETPGRP)
+exit(1);
+#endif
+
+#if defined (_POSIX_VERSION) && !defined (HAVE_WAITPID)
+exit(1);
+#endif
+
+/* Other systems have TIOCSPGRP/TIOCGPRGP and wait3. */
+#if !defined (_POSIX_VERSION) && !defined (HAVE_WAIT3)
+exit(1);
+#endif
+
+exit(0);
+}], bash_cv_job_control_missing=present, bash_cv_job_control_missing=missing,
+    [AC_MSG_WARN(cannot check job control if cross-compiling -- defaulting to missing)
+     bash_cv_job_control_missing=missing]
+)])
+AC_MSG_RESULT($bash_cv_job_control_missing)
+if test $bash_cv_job_control_missing = missing; then
+AC_DEFINE(JOB_CONTROL_MISSING)
+fi
+])
+
+dnl check whether named pipes are present
+dnl this requires a previous check for mkfifo, but that is awkward to specify
+AC_DEFUN(BASH_SYS_NAMED_PIPES,
+[AC_MSG_CHECKING(for presence of named pipes)
+AC_CACHE_VAL(bash_cv_sys_named_pipes,
+[AC_TRY_RUN([
+#include <sys/types.h>
+#include <sys/stat.h>
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+
+/* Add more tests in here as appropriate. */
+main()
+{
+int fd, err;
+
+#if defined (HAVE_MKFIFO)
+exit (0);
+#endif
+
+#if !defined (S_IFIFO) && (defined (_POSIX_VERSION) && !defined (S_ISFIFO))
+exit (1);
+#endif
+
+#if defined (NeXT)
+exit (1);
+#endif
+err = mkdir("/tmp/bash-aclocal", 0700);
+if (err < 0) {
+  perror ("mkdir");
+  exit(1);
+}
+fd = mknod ("/tmp/bash-aclocal/sh-np-autoconf", 0666 | S_IFIFO, 0);
+if (fd == -1) {
+  rmdir ("/tmp/bash-aclocal");
+  exit (1);
+}
+close(fd);
+unlink ("/tmp/bash-aclocal/sh-np-autoconf");
+rmdir ("/tmp/bash-aclocal");
+exit(0);
+}], bash_cv_sys_named_pipes=present, bash_cv_sys_named_pipes=missing,
+    [AC_MSG_WARN(cannot check for named pipes if cross-compiling -- defaulting to missing)
+     bash_cv_sys_named_pipes=missing]
+)])
+AC_MSG_RESULT($bash_cv_sys_named_pipes)
+if test $bash_cv_sys_named_pipes = missing; then
+AC_DEFINE(NAMED_PIPES_MISSING)
+fi
+])
+
+AC_DEFUN(BASH_SYS_DEFAULT_MAIL_DIR,
+[AC_MSG_CHECKING(for default mail directory)
+AC_CACHE_VAL(bash_cv_mail_dir,
+[if test -d /var/mail; then
+   bash_cv_mail_dir=/var/mail
+ elif test -d /var/spool/mail; then
+   bash_cv_mail_dir=/var/spool/mail
+ elif test -d /usr/mail; then
+   bash_cv_mail_dir=/usr/mail
+ elif test -d /usr/spool/mail; then
+   bash_cv_mail_dir=/usr/spool/mail
+ else
+   bash_cv_mail_dir=unknown
+ fi
+])
+AC_MSG_RESULT($bash_cv_mail_dir)
+AC_DEFINE_UNQUOTED(DEFAULT_MAIL_DIRECTORY, "$bash_cv_mail_dir")
+])
+
+AC_DEFUN(BASH_HAVE_TIOCGWINSZ,
+[AC_MSG_CHECKING(for TIOCGWINSZ in sys/ioctl.h)
+AC_CACHE_VAL(bash_cv_tiocgwinsz_in_ioctl,
+[AC_TRY_COMPILE([#include <sys/types.h>
+#include <sys/ioctl.h>], [int x = TIOCGWINSZ;],
+  bash_cv_tiocgwinsz_in_ioctl=yes,bash_cv_tiocgwinsz_in_ioctl=no)])
+AC_MSG_RESULT($bash_cv_tiocgwinsz_in_ioctl)
+if test $bash_cv_tiocgwinsz_in_ioctl = yes; then   
+AC_DEFINE(GWINSZ_IN_SYS_IOCTL)
+fi
+])
+
+AC_DEFUN(BASH_HAVE_TIOCSTAT,
+[AC_MSG_CHECKING(for TIOCSTAT in sys/ioctl.h)
+AC_CACHE_VAL(bash_cv_tiocstat_in_ioctl,
+[AC_TRY_COMPILE([#include <sys/types.h>
+#include <sys/ioctl.h>], [int x = TIOCSTAT;],
+  bash_cv_tiocstat_in_ioctl=yes,bash_cv_tiocstat_in_ioctl=no)])
+AC_MSG_RESULT($bash_cv_tiocstat_in_ioctl)
+if test $bash_cv_tiocstat_in_ioctl = yes; then   
+AC_DEFINE(TIOCSTAT_IN_SYS_IOCTL)
+fi
+])
+
+AC_DEFUN(BASH_HAVE_FIONREAD,
+[AC_MSG_CHECKING(for FIONREAD in sys/ioctl.h)
+AC_CACHE_VAL(bash_cv_fionread_in_ioctl,
+[AC_TRY_COMPILE([#include <sys/types.h>
+#include <sys/ioctl.h>], [int x = FIONREAD;],
+  bash_cv_fionread_in_ioctl=yes,bash_cv_fionread_in_ioctl=no)])
+AC_MSG_RESULT($bash_cv_fionread_in_ioctl)
+if test $bash_cv_fionread_in_ioctl = yes; then   
+AC_DEFINE(FIONREAD_IN_SYS_IOCTL)
+fi
+])
+
+dnl
+dnl See if speed_t is declared in <sys/types.h>.  Some versions of linux
+dnl require a definition of speed_t each time <termcap.h> is included,
+dnl but you can only get speed_t if you include <termios.h> (on some
+dnl versions) or <sys/types.h> (on others).
+dnl
+AC_DEFUN(BASH_CHECK_SPEED_T,
+[AC_MSG_CHECKING(for speed_t in sys/types.h)
+AC_CACHE_VAL(bash_cv_speed_t_in_sys_types,
+[AC_TRY_COMPILE([#include <sys/types.h>], [speed_t x;],
+  bash_cv_speed_t_in_sys_types=yes,bash_cv_speed_t_in_sys_types=no)])
+AC_MSG_RESULT($bash_cv_speed_t_in_sys_types)
+if test $bash_cv_speed_t_in_sys_types = yes; then   
+AC_DEFINE(SPEED_T_IN_SYS_TYPES)
+fi
+])
+
+AC_DEFUN(BASH_CHECK_GETPW_FUNCS,
+[AC_MSG_CHECKING(whether getpw functions are declared in pwd.h)
+AC_CACHE_VAL(bash_cv_getpw_declared,
+[AC_EGREP_CPP(getpwuid,
+[
+#include <sys/types.h>
+#ifdef HAVE_UNISTD_H
+#  include <unistd.h>
+#endif
+#include <pwd.h>
+],
+bash_cv_getpw_declared=yes,bash_cv_getpw_declared=no)])
+AC_MSG_RESULT($bash_cv_getpw_declared)
+if test $bash_cv_getpw_declared = yes; then
+AC_DEFINE(HAVE_GETPW_DECLS)
+fi
+])
+
+AC_DEFUN(BASH_CHECK_DEV_FD,
+[AC_MSG_CHECKING(whether /dev/fd is available)
+AC_CACHE_VAL(bash_cv_dev_fd,
+[bash_cv_dev_fd=""
+if test -d /dev/fd  && test -r /dev/fd/0 < /dev/null; then
+# check for systems like FreeBSD 5 that only provide /dev/fd/[012]
+   exec 3</dev/null
+   if test -r /dev/fd/3; then
+     bash_cv_dev_fd=standard
+   else
+     bash_cv_dev_fd=absent
+   fi
+   exec 3<&-
+fi
+if test -z "$bash_cv_dev_fd" ; then 
+  if test -d /proc/self/fd && test -r /proc/self/fd/0 < /dev/null; then
+    bash_cv_dev_fd=whacky
+  else
+    bash_cv_dev_fd=absent
+  fi
+fi
+])
+AC_MSG_RESULT($bash_cv_dev_fd)
+if test $bash_cv_dev_fd = "standard"; then
+  AC_DEFINE(HAVE_DEV_FD)
+  AC_DEFINE(DEV_FD_PREFIX, "/dev/fd/")
+elif test $bash_cv_dev_fd = "whacky"; then
+  AC_DEFINE(HAVE_DEV_FD)
+  AC_DEFINE(DEV_FD_PREFIX, "/proc/self/fd/")
+fi
+])
+
+AC_DEFUN(BASH_CHECK_DEV_STDIN,
+[AC_MSG_CHECKING(whether /dev/stdin stdout stderr are available)
+AC_CACHE_VAL(bash_cv_dev_stdin,
+[if test -d /dev/fd && test -r /dev/stdin < /dev/null; then
+   bash_cv_dev_stdin=present
+ elif test -d /proc/self/fd && test -r /dev/stdin < /dev/null; then
+   bash_cv_dev_stdin=present
+ else
+   bash_cv_dev_stdin=absent
+ fi
+])
+AC_MSG_RESULT($bash_cv_dev_stdin)
+if test $bash_cv_dev_stdin = "present"; then
+  AC_DEFINE(HAVE_DEV_STDIN)
+fi
+])
+
+dnl
+dnl Check if HPUX needs _KERNEL defined for RLIMIT_* definitions
+dnl
+AC_DEFUN(BASH_CHECK_KERNEL_RLIMIT,
+[AC_MSG_CHECKING([whether $host_os needs _KERNEL for RLIMIT defines])
+AC_CACHE_VAL(bash_cv_kernel_rlimit,
+[AC_TRY_COMPILE([
+#include <sys/types.h>
+#include <sys/resource.h>
+],
+[
+  int f;
+  f = RLIMIT_DATA;
+], bash_cv_kernel_rlimit=no,
+[AC_TRY_COMPILE([
+#include <sys/types.h>
+#define _KERNEL
+#include <sys/resource.h>
+#undef _KERNEL
+],
+[
+       int f;
+        f = RLIMIT_DATA;
+], bash_cv_kernel_rlimit=yes, bash_cv_kernel_rlimit=no)]
+)])
+AC_MSG_RESULT($bash_cv_kernel_rlimit)
+if test $bash_cv_kernel_rlimit = yes; then
+AC_DEFINE(RLIMIT_NEEDS_KERNEL)
+fi
+])
+
+dnl
+dnl Check for 64-bit off_t -- used for malloc alignment
+dnl
+dnl C does not allow duplicate case labels, so the compile will fail if
+dnl sizeof(off_t) is > 4.
+dnl
+AC_DEFUN(BASH_CHECK_OFF_T_64,
+[AC_CACHE_CHECK(for 64-bit off_t, bash_cv_off_t_64,
+AC_TRY_COMPILE([
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+#include <sys/types.h>
+],[
+switch (0) case 0: case (sizeof (off_t) <= 4):;
+], bash_cv_off_t_64=no, bash_cv_off_t_64=yes))
+if test $bash_cv_off_t_64 = yes; then
+        AC_DEFINE(HAVE_OFF_T_64)
+fi])
+
+AC_DEFUN(BASH_CHECK_RTSIGS,
+[AC_MSG_CHECKING(for unusable real-time signals due to large values)
+AC_CACHE_VAL(bash_cv_unusable_rtsigs,
+[AC_TRY_RUN([
+#include <sys/types.h>
+#include <signal.h>
+
+#ifndef NSIG
+#  define NSIG 64
+#endif
+
+main ()
+{
+  int n_sigs = 2 * NSIG;
+#ifdef SIGRTMIN
+  int rtmin = SIGRTMIN;
+#else
+  int rtmin = 0;
+#endif
+
+  exit(rtmin < n_sigs);
+}], bash_cv_unusable_rtsigs=yes, bash_cv_unusable_rtsigs=no,
+    [AC_MSG_WARN(cannot check real-time signals if cross compiling -- defaulting to yes)
+     bash_cv_unusable_rtsigs=yes]
+)])
+AC_MSG_RESULT($bash_cv_unusable_rtsigs)
+if test $bash_cv_unusable_rtsigs = yes; then
+AC_DEFINE(UNUSABLE_RT_SIGNALS)
+fi
+])
+
+dnl
+dnl check for availability of multibyte characters and functions
+dnl
+dnl geez, I wish I didn't have to check for all of this stuff separately
+dnl
+AC_DEFUN(BASH_CHECK_MULTIBYTE,
+[
+AC_CHECK_HEADERS(wctype.h)
+AC_CHECK_HEADERS(wchar.h)
+AC_CHECK_HEADERS(langinfo.h)
+
+AC_CHECK_FUNC(mbsrtowcs, AC_DEFINE(HAVE_MBSRTOWCS))
+AC_CHECK_FUNC(mbrlen, AC_DEFINE(HAVE_MBRLEN))
+
+AC_CHECK_FUNC(wcrtomb, AC_DEFINE(HAVE_WCRTOMB))
+AC_CHECK_FUNC(wcscoll, AC_DEFINE(HAVE_WCSCOLL))
+AC_CHECK_FUNC(wcsdup, AC_DEFINE(HAVE_WCSDUP))
+AC_CHECK_FUNC(wcwidth, AC_DEFINE(HAVE_WCWIDTH))
+AC_CHECK_FUNC(wctype, AC_DEFINE(HAVE_WCTYPE))
+
+dnl checks for both mbrtowc and mbstate_t
+AC_FUNC_MBRTOWC
+if test $ac_cv_func_mbrtowc = yes; then
+       AC_DEFINE(HAVE_MBSTATE_T)
+fi
+
+AC_CHECK_FUNCS(iswlower iswupper towlower towupper iswctype)
+
+AC_CACHE_CHECK([for nl_langinfo and CODESET], bash_cv_langinfo_codeset,
+[AC_TRY_LINK(
+[#include <langinfo.h>],
+[char* cs = nl_langinfo(CODESET);],
+bash_cv_langinfo_codeset=yes, bash_cv_langinfo_codeset=no)])
+if test $bash_cv_langinfo_codeset = yes; then
+  AC_DEFINE(HAVE_LANGINFO_CODESET)
+fi
+
+dnl check for wchar_t in <wchar.h>
+AC_CACHE_CHECK([for wchar_t in wchar.h], bash_cv_type_wchar_t,
+[AC_TRY_COMPILE(
+[#include <wchar.h>
+],
+[
+        wchar_t foo;
+        foo = 0;
+], bash_cv_type_wchar_t=yes, bash_cv_type_wchar_t=no)])
+if test $bash_cv_type_wchar_t = yes; then
+        AC_DEFINE(HAVE_WCHAR_T, 1, [systems should define this type here])
+fi
+
+dnl check for wctype_t in <wctype.h>
+AC_CACHE_CHECK([for wctype_t in wctype.h], bash_cv_type_wctype_t,
+[AC_TRY_COMPILE(
+[#include <wctype.h>],
+[
+        wctype_t foo;
+        foo = 0;
+], bash_cv_type_wctype_t=yes, bash_cv_type_wctype_t=no)])
+if test $bash_cv_type_wctype_t = yes; then
+        AC_DEFINE(HAVE_WCTYPE_T, 1, [systems should define this type here])
+fi
+
+dnl check for wint_t in <wctype.h>
+AC_CACHE_CHECK([for wint_t in wctype.h], bash_cv_type_wint_t,
+[AC_TRY_COMPILE(
+[#include <wctype.h>],
+[
+        wint_t foo;
+        foo = 0;
+], bash_cv_type_wint_t=yes, bash_cv_type_wint_t=no)])
+if test $bash_cv_type_wint_t = yes; then
+        AC_DEFINE(HAVE_WINT_T, 1, [systems should define this type here])
+fi
+
+])
+
+dnl need: prefix exec_prefix libdir includedir CC TERMCAP_LIB
+dnl require:
+dnl    AC_PROG_CC
+dnl    BASH_CHECK_LIB_TERMCAP
+
+AC_DEFUN([RL_LIB_READLINE_VERSION],
+[
+AC_REQUIRE([BASH_CHECK_LIB_TERMCAP])
+
+AC_MSG_CHECKING([version of installed readline library])
+
+# What a pain in the ass this is.
+
+# save cpp and ld options
+_save_CFLAGS="$CFLAGS"
+_save_LDFLAGS="$LDFLAGS"
+_save_LIBS="$LIBS"
+
+# Don't set ac_cv_rl_prefix if the caller has already assigned a value.  This
+# allows the caller to do something like $_rl_prefix=$withval if the user
+# specifies --with-installed-readline=PREFIX as an argument to configure
+
+if test -z "$ac_cv_rl_prefix"; then
+test "x$prefix" = xNONE && ac_cv_rl_prefix=$ac_default_prefix || ac_cv_rl_prefix=${prefix}
+fi
+
+eval ac_cv_rl_includedir=${ac_cv_rl_prefix}/include
+eval ac_cv_rl_libdir=${ac_cv_rl_prefix}/lib
+
+LIBS="$LIBS -lreadline ${TERMCAP_LIB}"
+CFLAGS="$CFLAGS -I${ac_cv_rl_includedir}"
+LDFLAGS="$LDFLAGS -L${ac_cv_rl_libdir}"
+
+AC_CACHE_VAL(ac_cv_rl_version,
+[AC_TRY_RUN([
+#include <stdio.h>
+#include <readline/readline.h>
+
+extern int rl_gnu_readline_p;
+
+main()
+{
+       FILE *fp;
+       fp = fopen("conftest.rlv", "w");
+       if (fp == 0)
+               exit(1);
+       if (rl_gnu_readline_p != 1)
+               fprintf(fp, "0.0\n");
+       else
+               fprintf(fp, "%s\n", rl_library_version ? rl_library_version : "0.0");
+       fclose(fp);
+       exit(0);
+}
+],
+ac_cv_rl_version=`cat conftest.rlv`,
+ac_cv_rl_version='0.0',
+ac_cv_rl_version='4.2')])
+
+CFLAGS="$_save_CFLAGS"
+LDFLAGS="$_save_LDFLAGS"
+LIBS="$_save_LIBS"
+
+RL_MAJOR=0
+RL_MINOR=0
+
+# (
+case "$ac_cv_rl_version" in
+2*|3*|4*|5*|6*|7*|8*|9*)
+       RL_MAJOR=`echo $ac_cv_rl_version | sed 's:\..*$::'`
+       RL_MINOR=`echo $ac_cv_rl_version | sed -e 's:^.*\.::' -e 's:[[a-zA-Z]]*$::'`
+       ;;
+esac
+
+# (((
+case $RL_MAJOR in
+[[0-9][0-9]])  _RL_MAJOR=$RL_MAJOR ;;
+[[0-9]])       _RL_MAJOR=0$RL_MAJOR ;;
+*)             _RL_MAJOR=00 ;;
+esac
+
+# (((
+case $RL_MINOR in
+[[0-9][0-9]])  _RL_MINOR=$RL_MINOR ;;
+[[0-9]])       _RL_MINOR=0$RL_MINOR ;;
+*)             _RL_MINOR=00 ;;
+esac
+
+RL_VERSION="0x${_RL_MAJOR}${_RL_MINOR}"
+
+# Readline versions greater than 4.2 have these defines in readline.h
+
+if test $ac_cv_rl_version = '0.0' ; then
+       AC_MSG_WARN([Could not test version of installed readline library.])
+elif test $RL_MAJOR -gt 4 || { test $RL_MAJOR = 4 && test $RL_MINOR -gt 2 ; } ; then
+       # set these for use by the caller
+       RL_PREFIX=$ac_cv_rl_prefix
+       RL_LIBDIR=$ac_cv_rl_libdir
+       RL_INCLUDEDIR=$ac_cv_rl_includedir
+       AC_MSG_RESULT($ac_cv_rl_version)
+else
+
+AC_DEFINE_UNQUOTED(RL_READLINE_VERSION, $RL_VERSION, [encoded version of the installed readline library])
+AC_DEFINE_UNQUOTED(RL_VERSION_MAJOR, $RL_MAJOR, [major version of installed readline library])
+AC_DEFINE_UNQUOTED(RL_VERSION_MINOR, $RL_MINOR, [minor version of installed readline library])
+
+AC_SUBST(RL_VERSION)
+AC_SUBST(RL_MAJOR)
+AC_SUBST(RL_MINOR)
+
+# set these for use by the caller
+RL_PREFIX=$ac_cv_rl_prefix
+RL_LIBDIR=$ac_cv_rl_libdir
+RL_INCLUDEDIR=$ac_cv_rl_includedir
+
+AC_MSG_RESULT($ac_cv_rl_version)
+
+fi
+])
+
+AC_DEFUN(BASH_FUNC_CTYPE_NONASCII,
+[
+AC_MSG_CHECKING(whether the ctype macros accept non-ascii characters)
+AC_CACHE_VAL(bash_cv_func_ctype_nonascii,
+[AC_TRY_RUN([
+#ifdef HAVE_LOCALE_H
+#include <locale.h>
+#endif
+#include <stdio.h>
+#include <ctype.h>
+
+main(c, v)
+int    c;
+char   *v[];
+{
+       char    *deflocale;
+       unsigned char x;
+       int     r1, r2;
+
+#ifdef HAVE_SETLOCALE
+       /* We take a shot here.  If that locale is not known, try the
+          system default.  We try this one because '\342' (226) is
+          known to be a printable character in that locale. */
+       deflocale = setlocale(LC_ALL, "en_US.ISO8859-1");
+       if (deflocale == 0)
+               deflocale = setlocale(LC_ALL, "");
+#endif
+
+       x = '\342';
+       r1 = isprint(x);
+       x -= 128;
+       r2 = isprint(x);
+       exit (r1 == 0 || r2 == 0);
+}
+], bash_cv_func_ctype_nonascii=yes, bash_cv_func_ctype_nonascii=no,
+   [AC_MSG_WARN(cannot check ctype macros if cross compiling -- defaulting to no)
+    bash_cv_func_ctype_nonascii=no]
+)])
+AC_MSG_RESULT($bash_cv_func_ctype_nonascii)
+if test $bash_cv_func_ctype_nonascii = yes; then
+AC_DEFINE(CTYPE_NON_ASCII)
+fi
+])
+
+AC_DEFUN(BASH_CHECK_WCONTINUED,
+[
+AC_MSG_CHECKING(whether WCONTINUED flag to waitpid is unavailable or available but broken)
+AC_CACHE_VAL(bash_cv_wcontinued_broken,
+[AC_TRY_RUN([
+#include <sys/types.h>
+#include <sys/wait.h>
+#include <unistd.h>
+#include <errno.h>
+
+#ifndef errno
+extern int errno;
+#endif
+main()
+{
+       int     x;
+
+       x = waitpid(-1, (int *)0, WNOHANG|WCONTINUED);
+       if (x == -1 && errno == EINVAL)
+               exit (1);
+       else
+               exit (0);
+}
+], bash_cv_wcontinued_broken=no,bash_cv_wcontinued_broken=yes,
+   [AC_MSG_WARN(cannot check WCONTINUED if cross compiling -- defaulting to no)
+    bash_cv_wcontinued_broken=no]
+)])
+AC_MSG_RESULT($bash_cv_wcontinued_broken)
+if test $bash_cv_wcontinued_broken = yes; then
+AC_DEFINE(WCONTINUED_BROKEN)
+fi
+])
+
+dnl
+dnl tests added for bashdb
+dnl
+
+
+AC_DEFUN([AM_PATH_LISPDIR],
+ [AC_ARG_WITH(lispdir, AC_HELP_STRING([--with-lispdir], [override the default lisp directory]),
+  [ lispdir="$withval" 
+    AC_MSG_CHECKING([where .elc files should go])
+    AC_MSG_RESULT([$lispdir])],
+  [
+  # If set to t, that means we are running in a shell under Emacs.
+  # If you have an Emacs named "t", then use the full path.
+  test x"$EMACS" = xt && EMACS=
+  AC_CHECK_PROGS(EMACS, emacs xemacs, no)
+  if test $EMACS != "no"; then
+    if test x${lispdir+set} != xset; then
+      AC_CACHE_CHECK([where .elc files should go], [am_cv_lispdir], [dnl
+       am_cv_lispdir=`$EMACS -batch -q -eval '(while load-path (princ (concat (car load-path) "\n")) (setq load-path (cdr load-path)))' | sed -n -e 's,/$,,' -e '/.*\/lib\/\(x\?emacs\/site-lisp\)$/{s,,${libdir}/\1,;p;q;}' -e '/.*\/share\/\(x\?emacs\/site-lisp\)$/{s,,${datadir}/\1,;p;q;}'`
+       if test -z "$am_cv_lispdir"; then
+         am_cv_lispdir='${datadir}/emacs/site-lisp'
+       fi
+      ])
+      lispdir="$am_cv_lispdir"
+    fi
+  fi
+ ])
+ AC_SUBST(lispdir)
+])
+
+dnl
+dnl tests added for gettext
+dnl
+# codeset.m4 serial AM1 (gettext-0.10.40)
+dnl Copyright (C) 2000-2002 Free Software Foundation, Inc.
+dnl This file is free software, distributed under the terms of the GNU
+dnl General Public License.  As a special exception to the GNU General
+dnl Public License, this file may be distributed as part of a program
+dnl that contains a configuration script generated by Autoconf, under
+dnl the same distribution terms as the rest of that program.
+
+dnl From Bruno Haible.
+
+AC_DEFUN([AM_LANGINFO_CODESET],
+[
+  AC_CACHE_CHECK([for nl_langinfo and CODESET], am_cv_langinfo_codeset,
+    [AC_TRY_LINK([#include <langinfo.h>],
+      [char* cs = nl_langinfo(CODESET);],
+      am_cv_langinfo_codeset=yes,
+      am_cv_langinfo_codeset=no)
+    ])
+  if test $am_cv_langinfo_codeset = yes; then
+    AC_DEFINE(HAVE_LANGINFO_CODESET, 1,
+      [Define if you have <langinfo.h> and nl_langinfo(CODESET).])
+  fi
+])
+# gettext.m4 serial 20 (gettext-0.12)
+dnl Copyright (C) 1995-2003 Free Software Foundation, Inc.
+dnl This file is free software, distributed under the terms of the GNU
+dnl General Public License.  As a special exception to the GNU General
+dnl Public License, this file may be distributed as part of a program
+dnl that contains a configuration script generated by Autoconf, under
+dnl the same distribution terms as the rest of that program.
+dnl
+dnl This file can can be used in projects which are not available under
+dnl the GNU General Public License or the GNU Library General Public
+dnl License but which still want to provide support for the GNU gettext
+dnl functionality.
+dnl Please note that the actual code of the GNU gettext library is covered
+dnl by the GNU Library General Public License, and the rest of the GNU
+dnl gettext package package is covered by the GNU General Public License.
+dnl They are *not* in the public domain.
+
+dnl Authors:
+dnl   Ulrich Drepper <drepper@cygnus.com>, 1995-2000.
+dnl   Bruno Haible <haible@clisp.cons.org>, 2000-2003.
+
+dnl Macro to add for using GNU gettext.
+
+dnl Usage: AM_GNU_GETTEXT([INTLSYMBOL], [NEEDSYMBOL], [INTLDIR]).
+dnl INTLSYMBOL can be one of 'external', 'no-libtool', 'use-libtool'. The
+dnl    default (if it is not specified or empty) is 'no-libtool'.
+dnl    INTLSYMBOL should be 'external' for packages with no intl directory,
+dnl    and 'no-libtool' or 'use-libtool' for packages with an intl directory.
+dnl    If INTLSYMBOL is 'use-libtool', then a libtool library
+dnl    $(top_builddir)/intl/libintl.la will be created (shared and/or static,
+dnl    depending on --{enable,disable}-{shared,static} and on the presence of
+dnl    AM-DISABLE-SHARED). If INTLSYMBOL is 'no-libtool', a static library
+dnl    $(top_builddir)/intl/libintl.a will be created.
+dnl If NEEDSYMBOL is specified and is 'need-ngettext', then GNU gettext
+dnl    implementations (in libc or libintl) without the ngettext() function
+dnl    will be ignored.  If NEEDSYMBOL is specified and is
+dnl    'need-formatstring-macros', then GNU gettext implementations that don't
+dnl    support the ISO C 99 <inttypes.h> formatstring macros will be ignored.
+dnl INTLDIR is used to find the intl libraries.  If empty,
+dnl    the value `$(top_builddir)/intl/' is used.
+dnl
+dnl The result of the configuration is one of three cases:
+dnl 1) GNU gettext, as included in the intl subdirectory, will be compiled
+dnl    and used.
+dnl    Catalog format: GNU --> install in $(datadir)
+dnl    Catalog extension: .mo after installation, .gmo in source tree
+dnl 2) GNU gettext has been found in the system's C library.
+dnl    Catalog format: GNU --> install in $(datadir)
+dnl    Catalog extension: .mo after installation, .gmo in source tree
+dnl 3) No internationalization, always use English msgid.
+dnl    Catalog format: none
+dnl    Catalog extension: none
+dnl If INTLSYMBOL is 'external', only cases 2 and 3 can occur.
+dnl The use of .gmo is historical (it was needed to avoid overwriting the
+dnl GNU format catalogs when building on a platform with an X/Open gettext),
+dnl but we keep it in order not to force irrelevant filename changes on the
+dnl maintainers.
+dnl
+AC_DEFUN([AM_GNU_GETTEXT],
+[
+  dnl Argument checking.
+  ifelse([$1], [], , [ifelse([$1], [external], , [ifelse([$1], [no-libtool], , [ifelse([$1], [use-libtool], ,
+    [errprint([ERROR: invalid first argument to AM_GNU_GETTEXT
+])])])])])
+  ifelse([$2], [], , [ifelse([$2], [need-ngettext], , [ifelse([$2], [need-formatstring-macros], ,
+    [errprint([ERROR: invalid second argument to AM_GNU_GETTEXT
+])])])])
+  define(gt_included_intl, ifelse([$1], [external], [no], [yes]))
+  define(gt_libtool_suffix_prefix, ifelse([$1], [use-libtool], [l], []))
+
+  AC_REQUIRE([AM_PO_SUBDIRS])dnl
+  ifelse(gt_included_intl, yes, [
+    AC_REQUIRE([AM_INTL_SUBDIR])dnl
+  ])
+
+  dnl Prerequisites of AC_LIB_LINKFLAGS_BODY.
+  AC_REQUIRE([AC_LIB_PREPARE_PREFIX])
+  AC_REQUIRE([AC_LIB_RPATH])
+
+  dnl Sometimes libintl requires libiconv, so first search for libiconv.
+  dnl Ideally we would do this search only after the
+  dnl      if test "$USE_NLS" = "yes"; then
+  dnl        if test "$gt_cv_func_gnugettext_libc" != "yes"; then
+  dnl tests. But if configure.in invokes AM_ICONV after AM_GNU_GETTEXT
+  dnl the configure script would need to contain the same shell code
+  dnl again, outside any 'if'. There are two solutions:
+  dnl - Invoke AM_ICONV_LINKFLAGS_BODY here, outside any 'if'.
+  dnl - Control the expansions in more detail using AC_PROVIDE_IFELSE.
+  dnl Since AC_PROVIDE_IFELSE is only in autoconf >= 2.52 and not
+  dnl documented, we avoid it.
+  ifelse(gt_included_intl, yes, , [
+    AC_REQUIRE([AM_ICONV_LINKFLAGS_BODY])
+  ])
+
+  dnl Set USE_NLS.
+  AM_NLS
+
+  ifelse(gt_included_intl, yes, [
+    BUILD_INCLUDED_LIBINTL=no
+    USE_INCLUDED_LIBINTL=no
+  ])
+  LIBINTL=
+  LTLIBINTL=
+  POSUB=
+
+  dnl If we use NLS figure out what method
+  if test "$USE_NLS" = "yes"; then
+    gt_use_preinstalled_gnugettext=no
+    ifelse(gt_included_intl, yes, [
+      AC_MSG_CHECKING([whether included gettext is requested])
+      AC_ARG_WITH(included-gettext,
+        [  --with-included-gettext use the GNU gettext library included here],
+        nls_cv_force_use_gnu_gettext=$withval,
+        nls_cv_force_use_gnu_gettext=no)
+      AC_MSG_RESULT($nls_cv_force_use_gnu_gettext)
+
+      nls_cv_use_gnu_gettext="$nls_cv_force_use_gnu_gettext"
+      if test "$nls_cv_force_use_gnu_gettext" != "yes"; then
+    ])
+        dnl User does not insist on using GNU NLS library.  Figure out what
+        dnl to use.  If GNU gettext is available we use this.  Else we have
+        dnl to fall back to GNU NLS library.
+
+        dnl Add a version number to the cache macros.
+        define([gt_api_version], ifelse([$2], [need-formatstring-macros], 3, ifelse([$2], [need-ngettext], 2, 1)))
+        define([gt_cv_func_gnugettext_libc], [gt_cv_func_gnugettext]gt_api_version[_libc])
+        define([gt_cv_func_gnugettext_libintl], [gt_cv_func_gnugettext]gt_api_version[_libintl])
+
+        AC_CACHE_CHECK([for GNU gettext in libc], gt_cv_func_gnugettext_libc,
+         [AC_TRY_LINK([#include <libintl.h>
+]ifelse([$2], [need-formatstring-macros],
+[#ifndef __GNU_GETTEXT_SUPPORTED_REVISION
+#define __GNU_GETTEXT_SUPPORTED_REVISION(major) ((major) == 0 ? 0 : -1)
+#endif
+changequote(,)dnl
+typedef int array [2 * (__GNU_GETTEXT_SUPPORTED_REVISION(0) >= 1) - 1];
+changequote([,])dnl
+], [])[extern int _nl_msg_cat_cntr;
+extern int *_nl_domain_bindings;],
+            [bindtextdomain ("", "");
+return (int) gettext ("")]ifelse([$2], [need-ngettext], [ + (int) ngettext ("", "", 0)], [])[ + _nl_msg_cat_cntr + *_nl_domain_bindings],
+            gt_cv_func_gnugettext_libc=yes,
+            gt_cv_func_gnugettext_libc=no)])
+
+        if test "$gt_cv_func_gnugettext_libc" != "yes"; then
+          dnl Sometimes libintl requires libiconv, so first search for libiconv.
+          ifelse(gt_included_intl, yes, , [
+            AM_ICONV_LINK
+          ])
+          dnl Search for libintl and define LIBINTL, LTLIBINTL and INCINTL
+          dnl accordingly. Don't use AC_LIB_LINKFLAGS_BODY([intl],[iconv])
+          dnl because that would add "-liconv" to LIBINTL and LTLIBINTL
+          dnl even if libiconv doesn't exist.
+          AC_LIB_LINKFLAGS_BODY([intl])
+          AC_CACHE_CHECK([for GNU gettext in libintl],
+            gt_cv_func_gnugettext_libintl,
+           [gt_save_CPPFLAGS="$CPPFLAGS"
+            CPPFLAGS="$CPPFLAGS $INCINTL"
+            gt_save_LIBS="$LIBS"
+            LIBS="$LIBS $LIBINTL"
+            dnl Now see whether libintl exists and does not depend on libiconv.
+            AC_TRY_LINK([#include <libintl.h>
+]ifelse([$2], [need-formatstring-macros],
+[#ifndef __GNU_GETTEXT_SUPPORTED_REVISION
+#define __GNU_GETTEXT_SUPPORTED_REVISION(major) ((major) == 0 ? 0 : -1)
+#endif
+changequote(,)dnl
+typedef int array [2 * (__GNU_GETTEXT_SUPPORTED_REVISION(0) >= 1) - 1];
+changequote([,])dnl
+], [])[extern int _nl_msg_cat_cntr;
+extern
+#ifdef __cplusplus
+"C"
+#endif
+const char *_nl_expand_alias ();],
+              [bindtextdomain ("", "");
+return (int) gettext ("")]ifelse([$2], [need-ngettext], [ + (int) ngettext ("", "", 0)], [])[ + _nl_msg_cat_cntr + *_nl_expand_alias (0)],
+              gt_cv_func_gnugettext_libintl=yes,
+              gt_cv_func_gnugettext_libintl=no)
+            dnl Now see whether libintl exists and depends on libiconv.
+            if test "$gt_cv_func_gnugettext_libintl" != yes && test -n "$LIBICONV"; then
+              LIBS="$LIBS $LIBICONV"
+              AC_TRY_LINK([#include <libintl.h>
+]ifelse([$2], [need-formatstring-macros],
+[#ifndef __GNU_GETTEXT_SUPPORTED_REVISION
+#define __GNU_GETTEXT_SUPPORTED_REVISION(major) ((major) == 0 ? 0 : -1)
+#endif
+changequote(,)dnl
+typedef int array [2 * (__GNU_GETTEXT_SUPPORTED_REVISION(0) >= 1) - 1];
+changequote([,])dnl
+], [])[extern int _nl_msg_cat_cntr;
+extern
+#ifdef __cplusplus
+"C"
+#endif
+const char *_nl_expand_alias ();],
+                [bindtextdomain ("", "");
+return (int) gettext ("")]ifelse([$2], [need-ngettext], [ + (int) ngettext ("", "", 0)], [])[ + _nl_msg_cat_cntr + *_nl_expand_alias (0)],
+               [LIBINTL="$LIBINTL $LIBICONV"
+                LTLIBINTL="$LTLIBINTL $LTLIBICONV"
+                gt_cv_func_gnugettext_libintl=yes
+               ])
+            fi
+            CPPFLAGS="$gt_save_CPPFLAGS"
+            LIBS="$gt_save_LIBS"])
+        fi
+
+        dnl If an already present or preinstalled GNU gettext() is found,
+        dnl use it.  But if this macro is used in GNU gettext, and GNU
+        dnl gettext is already preinstalled in libintl, we update this
+        dnl libintl.  (Cf. the install rule in intl/Makefile.in.)
+        if test "$gt_cv_func_gnugettext_libc" = "yes" \
+           || { test "$gt_cv_func_gnugettext_libintl" = "yes" \
+                && test "$PACKAGE" != gettext-runtime \
+                && test "$PACKAGE" != gettext-tools; }; then
+          gt_use_preinstalled_gnugettext=yes
+        else
+          dnl Reset the values set by searching for libintl.
+          LIBINTL=
+          LTLIBINTL=
+          INCINTL=
+        fi
+
+    ifelse(gt_included_intl, yes, [
+        if test "$gt_use_preinstalled_gnugettext" != "yes"; then
+          dnl GNU gettext is not found in the C library.
+          dnl Fall back on included GNU gettext library.
+          nls_cv_use_gnu_gettext=yes
+        fi
+      fi
+
+      if test "$nls_cv_use_gnu_gettext" = "yes"; then
+        dnl Mark actions used to generate GNU NLS library.
+        BUILD_INCLUDED_LIBINTL=yes
+        USE_INCLUDED_LIBINTL=yes
+        LIBINTL="ifelse([$3],[],\${top_builddir}/intl,[$3])/libintl.[]gt_libtool_suffix_prefix[]a $LIBICONV"
+        LTLIBINTL="ifelse([$3],[],\${top_builddir}/intl,[$3])/libintl.[]gt_libtool_suffix_prefix[]a $LTLIBICONV"
+        LIBS=`echo " $LIBS " | sed -e 's/ -lintl / /' -e 's/^ //' -e 's/ $//'`
+      fi
+
+      if test "$gt_use_preinstalled_gnugettext" = "yes" \
+         || test "$nls_cv_use_gnu_gettext" = "yes"; then
+        dnl Mark actions to use GNU gettext tools.
+        CATOBJEXT=.gmo
+      fi
+    ])
+
+    if test "$gt_use_preinstalled_gnugettext" = "yes" \
+       || test "$nls_cv_use_gnu_gettext" = "yes"; then
+      AC_DEFINE(ENABLE_NLS, 1,
+        [Define to 1 if translation of program messages to the user's native language
+   is requested.])
+    else
+      USE_NLS=no
+    fi
+  fi
+
+  AC_MSG_CHECKING([whether to use NLS])
+  AC_MSG_RESULT([$USE_NLS])
+  if test "$USE_NLS" = "yes"; then
+    AC_MSG_CHECKING([where the gettext function comes from])
+    if test "$gt_use_preinstalled_gnugettext" = "yes"; then
+      if test "$gt_cv_func_gnugettext_libintl" = "yes"; then
+        gt_source="external libintl"
+      else
+        gt_source="libc"
+      fi
+    else
+      gt_source="included intl directory"
+    fi
+    AC_MSG_RESULT([$gt_source])
+  fi
+
+  if test "$USE_NLS" = "yes"; then
+
+    if test "$gt_use_preinstalled_gnugettext" = "yes"; then
+      if test "$gt_cv_func_gnugettext_libintl" = "yes"; then
+        AC_MSG_CHECKING([how to link with libintl])
+        AC_MSG_RESULT([$LIBINTL])
+        AC_LIB_APPENDTOVAR([CPPFLAGS], [$INCINTL])
+      fi
+
+      dnl For backward compatibility. Some packages may be using this.
+      AC_DEFINE(HAVE_GETTEXT, 1,
+       [Define if the GNU gettext() function is already present or preinstalled.])
+      AC_DEFINE(HAVE_DCGETTEXT, 1,
+       [Define if the GNU dcgettext() function is already present or preinstalled.])
+    fi
+
+    dnl We need to process the po/ directory.
+    POSUB=po
+  fi
+
+  ifelse(gt_included_intl, yes, [
+    dnl If this is used in GNU gettext we have to set BUILD_INCLUDED_LIBINTL
+    dnl to 'yes' because some of the testsuite requires it.
+    if test "$PACKAGE" = gettext-runtime || test "$PACKAGE" = gettext-tools; then
+      BUILD_INCLUDED_LIBINTL=yes
+    fi
+
+    dnl Make all variables we use known to autoconf.
+    AC_SUBST(BUILD_INCLUDED_LIBINTL)
+    AC_SUBST(USE_INCLUDED_LIBINTL)
+    AC_SUBST(CATOBJEXT)
+
+    dnl For backward compatibility. Some configure.ins may be using this.
+    nls_cv_header_intl=
+    nls_cv_header_libgt=
+
+    dnl For backward compatibility. Some Makefiles may be using this.
+    DATADIRNAME=share
+    AC_SUBST(DATADIRNAME)
+
+    dnl For backward compatibility. Some Makefiles may be using this.
+    INSTOBJEXT=.mo
+    AC_SUBST(INSTOBJEXT)
+
+    dnl For backward compatibility. Some Makefiles may be using this.
+    GENCAT=gencat
+    AC_SUBST(GENCAT)
+
+    dnl For backward compatibility. Some Makefiles may be using this.
+    if test "$USE_INCLUDED_LIBINTL" = yes; then
+      INTLOBJS="\$(GETTOBJS)"
+    fi
+    AC_SUBST(INTLOBJS)
+
+    dnl Enable libtool support if the surrounding package wishes it.
+    INTL_LIBTOOL_SUFFIX_PREFIX=gt_libtool_suffix_prefix
+    AC_SUBST(INTL_LIBTOOL_SUFFIX_PREFIX)
+  ])
+
+  dnl For backward compatibility. Some Makefiles may be using this.
+  INTLLIBS="$LIBINTL"
+  AC_SUBST(INTLLIBS)
+
+  dnl Make all documented variables known to autoconf.
+  AC_SUBST(LIBINTL)
+  AC_SUBST(LTLIBINTL)
+  AC_SUBST(POSUB)
+])
+
+
+dnl Checks for all prerequisites of the intl subdirectory,
+dnl except for INTL_LIBTOOL_SUFFIX_PREFIX (and possibly LIBTOOL), INTLOBJS,
+dnl            USE_INCLUDED_LIBINTL, BUILD_INCLUDED_LIBINTL.
+AC_DEFUN([AM_INTL_SUBDIR],
+[
+  AC_REQUIRE([AC_PROG_INSTALL])dnl
+  AC_REQUIRE([AM_MKINSTALLDIRS])dnl
+  AC_REQUIRE([AC_PROG_CC])dnl
+  AC_REQUIRE([AC_CANONICAL_HOST])dnl
+  AC_REQUIRE([AC_PROG_RANLIB])dnl
+  AC_REQUIRE([AC_ISC_POSIX])dnl
+  AC_REQUIRE([AC_HEADER_STDC])dnl
+  AC_REQUIRE([AC_C_CONST])dnl
+  AC_REQUIRE([AC_C_INLINE])dnl
+  AC_REQUIRE([AC_TYPE_OFF_T])dnl
+  AC_REQUIRE([AC_TYPE_SIZE_T])dnl
+  AC_REQUIRE([AC_FUNC_ALLOCA])dnl
+  AC_REQUIRE([AC_FUNC_MMAP])dnl
+  AC_REQUIRE([jm_GLIBC21])dnl
+  AC_REQUIRE([gt_INTDIV0])dnl
+  AC_REQUIRE([jm_AC_TYPE_UINTMAX_T])dnl
+  AC_REQUIRE([gt_HEADER_INTTYPES_H])dnl
+  AC_REQUIRE([gt_INTTYPES_PRI])dnl
+
+  AC_CHECK_HEADERS([argz.h limits.h locale.h nl_types.h malloc.h stddef.h \
+stdlib.h string.h unistd.h sys/param.h])
+  AC_CHECK_FUNCS([feof_unlocked fgets_unlocked getc_unlocked getcwd getegid \
+geteuid getgid getuid mempcpy munmap putenv setenv setlocale stpcpy \
+strcasecmp strdup strtoul tsearch __argz_count __argz_stringify __argz_next \
+__fsetlocking])
+
+  AM_ICONV
+  AM_LANGINFO_CODESET
+  if test $ac_cv_header_locale_h = yes; then
+    AM_LC_MESSAGES
+  fi
+
+  dnl intl/plural.c is generated from intl/plural.y. It requires bison,
+  dnl because plural.y uses bison specific features. It requires at least
+  dnl bison-1.26 because earlier versions generate a plural.c that doesn't
+  dnl compile.
+  dnl bison is only needed for the maintainer (who touches plural.y). But in
+  dnl order to avoid separate Makefiles or --enable-maintainer-mode, we put
+  dnl the rule in general Makefile. Now, some people carelessly touch the
+  dnl files or have a broken "make" program, hence the plural.c rule will
+  dnl sometimes fire. To avoid an error, defines BISON to ":" if it is not
+  dnl present or too old.
+  AC_CHECK_PROGS([INTLBISON], [bison])
+  if test -z "$INTLBISON"; then
+    ac_verc_fail=yes
+  else
+    dnl Found it, now check the version.
+    AC_MSG_CHECKING([version of bison])
+changequote(<<,>>)dnl
+    ac_prog_version=`$INTLBISON --version 2>&1 | sed -n 's/^.*GNU Bison.* \([0-9]*\.[0-9.]*\).*$/\1/p'`
+    case $ac_prog_version in
+      '') ac_prog_version="v. ?.??, bad"; ac_verc_fail=yes;;
+      1.2[6-9]* | 1.[3-9][0-9]* | [2-9].*)
+changequote([,])dnl
+         ac_prog_version="$ac_prog_version, ok"; ac_verc_fail=no;;
+      *) ac_prog_version="$ac_prog_version, bad"; ac_verc_fail=yes;;
+    esac
+    AC_MSG_RESULT([$ac_prog_version])
+  fi
+  if test $ac_verc_fail = yes; then
+    INTLBISON=:
+  fi
+])
+
+
+dnl Usage: AM_GNU_GETTEXT_VERSION([gettext-version])
+AC_DEFUN([AM_GNU_GETTEXT_VERSION], [])
+# glibc21.m4 serial 2 (fileutils-4.1.3, gettext-0.10.40)
+dnl Copyright (C) 2000-2002 Free Software Foundation, Inc.
+dnl This file is free software, distributed under the terms of the GNU
+dnl General Public License.  As a special exception to the GNU General
+dnl Public License, this file may be distributed as part of a program
+dnl that contains a configuration script generated by Autoconf, under
+dnl the same distribution terms as the rest of that program.
+
+# Test for the GNU C Library, version 2.1 or newer.
+# From Bruno Haible.
+
+AC_DEFUN([jm_GLIBC21],
+  [
+    AC_CACHE_CHECK(whether we are using the GNU C Library 2.1 or newer,
+      ac_cv_gnu_library_2_1,
+      [AC_EGREP_CPP([Lucky GNU user],
+       [
+#include <features.h>
+#ifdef __GNU_LIBRARY__
+ #if (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 1) || (__GLIBC__ > 2)
+  Lucky GNU user
+ #endif
+#endif
+       ],
+       ac_cv_gnu_library_2_1=yes,
+       ac_cv_gnu_library_2_1=no)
+      ]
+    )
+    AC_SUBST(GLIBC21)
+    GLIBC21="$ac_cv_gnu_library_2_1"
+  ]
+)
+# iconv.m4 serial AM4 (gettext-0.11.3)
+dnl Copyright (C) 2000-2002 Free Software Foundation, Inc.
+dnl This file is free software, distributed under the terms of the GNU
+dnl General Public License.  As a special exception to the GNU General
+dnl Public License, this file may be distributed as part of a program
+dnl that contains a configuration script generated by Autoconf, under
+dnl the same distribution terms as the rest of that program.
+
+dnl From Bruno Haible.
+
+AC_DEFUN([AM_ICONV_LINKFLAGS_BODY],
+[
+  dnl Prerequisites of AC_LIB_LINKFLAGS_BODY.
+  AC_REQUIRE([AC_LIB_PREPARE_PREFIX])
+  AC_REQUIRE([AC_LIB_RPATH])
+
+  dnl Search for libiconv and define LIBICONV, LTLIBICONV and INCICONV
+  dnl accordingly.
+  AC_LIB_LINKFLAGS_BODY([iconv])
+])
+
+AC_DEFUN([AM_ICONV_LINK],
+[
+  dnl Some systems have iconv in libc, some have it in libiconv (OSF/1 and
+  dnl those with the standalone portable GNU libiconv installed).
+
+  dnl Search for libiconv and define LIBICONV, LTLIBICONV and INCICONV
+  dnl accordingly.
+  AC_REQUIRE([AM_ICONV_LINKFLAGS_BODY])
+
+  dnl Add $INCICONV to CPPFLAGS before performing the following checks,
+  dnl because if the user has installed libiconv and not disabled its use
+  dnl via --without-libiconv-prefix, he wants to use it. The first
+  dnl AC_TRY_LINK will then fail, the second AC_TRY_LINK will succeed.
+  am_save_CPPFLAGS="$CPPFLAGS"
+  AC_LIB_APPENDTOVAR([CPPFLAGS], [$INCICONV])
+
+  AC_CACHE_CHECK(for iconv, am_cv_func_iconv, [
+    am_cv_func_iconv="no, consider installing GNU libiconv"
+    am_cv_lib_iconv=no
+    AC_TRY_LINK([#include <stdlib.h>
+#include <iconv.h>],
+      [iconv_t cd = iconv_open("","");
+       iconv(cd,NULL,NULL,NULL,NULL);
+       iconv_close(cd);],
+      am_cv_func_iconv=yes)
+    if test "$am_cv_func_iconv" != yes; then
+      am_save_LIBS="$LIBS"
+      LIBS="$LIBS $LIBICONV"
+      AC_TRY_LINK([#include <stdlib.h>
+#include <iconv.h>],
+        [iconv_t cd = iconv_open("","");
+         iconv(cd,NULL,NULL,NULL,NULL);
+         iconv_close(cd);],
+        am_cv_lib_iconv=yes
+        am_cv_func_iconv=yes)
+      LIBS="$am_save_LIBS"
+    fi
+  ])
+  if test "$am_cv_func_iconv" = yes; then
+    AC_DEFINE(HAVE_ICONV, 1, [Define if you have the iconv() function.])
+  fi
+  if test "$am_cv_lib_iconv" = yes; then
+    AC_MSG_CHECKING([how to link with libiconv])
+    AC_MSG_RESULT([$LIBICONV])
+  else
+    dnl If $LIBICONV didn't lead to a usable library, we don't need $INCICONV
+    dnl either.
+    CPPFLAGS="$am_save_CPPFLAGS"
+    LIBICONV=
+    LTLIBICONV=
+  fi
+  AC_SUBST(LIBICONV)
+  AC_SUBST(LTLIBICONV)
+])
+
+AC_DEFUN([AM_ICONV],
+[
+  AM_ICONV_LINK
+  if test "$am_cv_func_iconv" = yes; then
+    AC_MSG_CHECKING([for iconv declaration])
+    AC_CACHE_VAL(am_cv_proto_iconv, [
+      AC_TRY_COMPILE([
+#include <stdlib.h>
+#include <iconv.h>
+extern
+#ifdef __cplusplus
+"C"
+#endif
+#if defined(__STDC__) || defined(__cplusplus)
+size_t iconv (iconv_t cd, char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft);
+#else
+size_t iconv();
+#endif
+], [], am_cv_proto_iconv_arg1="", am_cv_proto_iconv_arg1="const")
+      am_cv_proto_iconv="extern size_t iconv (iconv_t cd, $am_cv_proto_iconv_arg1 char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft);"])
+    am_cv_proto_iconv=`echo "[$]am_cv_proto_iconv" | tr -s ' ' | sed -e 's/( /(/'`
+    AC_MSG_RESULT([$]{ac_t:-
+         }[$]am_cv_proto_iconv)
+    AC_DEFINE_UNQUOTED(ICONV_CONST, $am_cv_proto_iconv_arg1,
+      [Define as const if the declaration of iconv() needs const.])
+  fi
+])
+# intdiv0.m4 serial 1 (gettext-0.11.3)
+dnl Copyright (C) 2002 Free Software Foundation, Inc.
+dnl This file is free software, distributed under the terms of the GNU
+dnl General Public License.  As a special exception to the GNU General
+dnl Public License, this file may be distributed as part of a program
+dnl that contains a configuration script generated by Autoconf, under
+dnl the same distribution terms as the rest of that program.
+
+dnl From Bruno Haible.
+
+AC_DEFUN([gt_INTDIV0],
+[
+  AC_REQUIRE([AC_PROG_CC])dnl
+  AC_REQUIRE([AC_CANONICAL_HOST])dnl
+
+  AC_CACHE_CHECK([whether integer division by zero raises SIGFPE],
+    gt_cv_int_divbyzero_sigfpe,
+    [
+      AC_TRY_RUN([
+#include <stdlib.h>
+#include <signal.h>
+
+static void
+#ifdef __cplusplus
+sigfpe_handler (int sig)
+#else
+sigfpe_handler (sig) int sig;
+#endif
+{
+  /* Exit with code 0 if SIGFPE, with code 1 if any other signal.  */
+  exit (sig != SIGFPE);
+}
+
+int x = 1;
+int y = 0;
+int z;
+int nan;
+
+int main ()
+{
+  signal (SIGFPE, sigfpe_handler);
+/* IRIX and AIX (when "xlc -qcheck" is used) yield signal SIGTRAP.  */
+#if (defined (__sgi) || defined (_AIX)) && defined (SIGTRAP)
+  signal (SIGTRAP, sigfpe_handler);
+#endif
+/* Linux/SPARC yields signal SIGILL.  */
+#if defined (__sparc__) && defined (__linux__)
+  signal (SIGILL, sigfpe_handler);
+#endif
+
+  z = x / y;
+  nan = y / y;
+  exit (1);
+}
+], gt_cv_int_divbyzero_sigfpe=yes, gt_cv_int_divbyzero_sigfpe=no,
+        [
+          # Guess based on the CPU.
+          case "$host_cpu" in
+            alpha* | i[34567]86 | m68k | s390*)
+              gt_cv_int_divbyzero_sigfpe="guessing yes";;
+            *)
+              gt_cv_int_divbyzero_sigfpe="guessing no";;
+          esac
+        ])
+    ])
+  case "$gt_cv_int_divbyzero_sigfpe" in
+    *yes) value=1;;
+    *) value=0;;
+  esac
+  AC_DEFINE_UNQUOTED(INTDIV0_RAISES_SIGFPE, $value,
+    [Define if integer division by zero raises signal SIGFPE.])
+])
+# inttypes.m4 serial 1 (gettext-0.11.4)
+dnl Copyright (C) 1997-2002 Free Software Foundation, Inc.
+dnl This file is free software, distributed under the terms of the GNU
+dnl General Public License.  As a special exception to the GNU General
+dnl Public License, this file may be distributed as part of a program
+dnl that contains a configuration script generated by Autoconf, under
+dnl the same distribution terms as the rest of that program.
+
+dnl From Paul Eggert.
+
+# Define HAVE_INTTYPES_H if <inttypes.h> exists and doesn't clash with
+# <sys/types.h>.
+
+AC_DEFUN([gt_HEADER_INTTYPES_H],
+[
+  AC_CACHE_CHECK([for inttypes.h], gt_cv_header_inttypes_h,
+  [
+    AC_TRY_COMPILE(
+      [#include <sys/types.h>
+#include <inttypes.h>],
+      [], gt_cv_header_inttypes_h=yes, gt_cv_header_inttypes_h=no)
+  ])
+  if test $gt_cv_header_inttypes_h = yes; then
+    AC_DEFINE_UNQUOTED(HAVE_INTTYPES_H, 1,
+      [Define if <inttypes.h> exists and doesn't clash with <sys/types.h>.])
+  fi
+])
+# inttypes_h.m4 serial 5 (gettext-0.12)
+dnl Copyright (C) 1997-2003 Free Software Foundation, Inc.
+dnl This file is free software, distributed under the terms of the GNU
+dnl General Public License.  As a special exception to the GNU General
+dnl Public License, this file may be distributed as part of a program
+dnl that contains a configuration script generated by Autoconf, under
+dnl the same distribution terms as the rest of that program.
+
+dnl From Paul Eggert.
+
+# Define HAVE_INTTYPES_H_WITH_UINTMAX if <inttypes.h> exists,
+# doesn't clash with <sys/types.h>, and declares uintmax_t.
+
+AC_DEFUN([jm_AC_HEADER_INTTYPES_H],
+[
+  AC_CACHE_CHECK([for inttypes.h], jm_ac_cv_header_inttypes_h,
+  [AC_TRY_COMPILE(
+    [#include <sys/types.h>
+#include <inttypes.h>],
+    [uintmax_t i = (uintmax_t) -1;],
+    jm_ac_cv_header_inttypes_h=yes,
+    jm_ac_cv_header_inttypes_h=no)])
+  if test $jm_ac_cv_header_inttypes_h = yes; then
+    AC_DEFINE_UNQUOTED(HAVE_INTTYPES_H_WITH_UINTMAX, 1,
+      [Define if <inttypes.h> exists, doesn't clash with <sys/types.h>,
+       and declares uintmax_t. ])
+  fi
+])
+# inttypes-pri.m4 serial 1 (gettext-0.11.4)
+dnl Copyright (C) 1997-2002 Free Software Foundation, Inc.
+dnl This file is free software, distributed under the terms of the GNU
+dnl General Public License.  As a special exception to the GNU General
+dnl Public License, this file may be distributed as part of a program
+dnl that contains a configuration script generated by Autoconf, under
+dnl the same distribution terms as the rest of that program.
+
+dnl From Bruno Haible.
+
+# Define PRI_MACROS_BROKEN if <inttypes.h> exists and defines the PRI*
+# macros to non-string values.  This is the case on AIX 4.3.3.
+
+AC_DEFUN([gt_INTTYPES_PRI],
+[
+  AC_REQUIRE([gt_HEADER_INTTYPES_H])
+  if test $gt_cv_header_inttypes_h = yes; then
+    AC_CACHE_CHECK([whether the inttypes.h PRIxNN macros are broken],
+      gt_cv_inttypes_pri_broken,
+      [
+        AC_TRY_COMPILE([#include <inttypes.h>
+#ifdef PRId32
+char *p = PRId32;
+#endif
+], [], gt_cv_inttypes_pri_broken=no, gt_cv_inttypes_pri_broken=yes)
+      ])
+  fi
+  if test "$gt_cv_inttypes_pri_broken" = yes; then
+    AC_DEFINE_UNQUOTED(PRI_MACROS_BROKEN, 1,
+      [Define if <inttypes.h> exists and defines unusable PRI* macros.])
+  fi
+])
+# isc-posix.m4 serial 2 (gettext-0.11.2)
+dnl Copyright (C) 1995-2002 Free Software Foundation, Inc.
+dnl This file is free software, distributed under the terms of the GNU
+dnl General Public License.  As a special exception to the GNU General
+dnl Public License, this file may be distributed as part of a program
+dnl that contains a configuration script generated by Autoconf, under
+dnl the same distribution terms as the rest of that program.
+
+# This file is not needed with autoconf-2.53 and newer.  Remove it in 2005.
+
+# This test replaces the one in autoconf.
+# Currently this macro should have the same name as the autoconf macro
+# because gettext's gettext.m4 (distributed in the automake package)
+# still uses it.  Otherwise, the use in gettext.m4 makes autoheader
+# give these diagnostics:
+#   configure.in:556: AC_TRY_COMPILE was called before AC_ISC_POSIX
+#   configure.in:556: AC_TRY_RUN was called before AC_ISC_POSIX
+
+undefine([AC_ISC_POSIX])
+
+AC_DEFUN([AC_ISC_POSIX],
+  [
+    dnl This test replaces the obsolescent AC_ISC_POSIX kludge.
+    AC_CHECK_LIB(cposix, strerror, [LIBS="$LIBS -lcposix"])
+  ]
+)
+# lcmessage.m4 serial 3 (gettext-0.11.3)
+dnl Copyright (C) 1995-2002 Free Software Foundation, Inc.
+dnl This file is free software, distributed under the terms of the GNU
+dnl General Public License.  As a special exception to the GNU General
+dnl Public License, this file may be distributed as part of a program
+dnl that contains a configuration script generated by Autoconf, under
+dnl the same distribution terms as the rest of that program.
+dnl
+dnl This file can can be used in projects which are not available under
+dnl the GNU General Public License or the GNU Library General Public
+dnl License but which still want to provide support for the GNU gettext
+dnl functionality.
+dnl Please note that the actual code of the GNU gettext library is covered
+dnl by the GNU Library General Public License, and the rest of the GNU
+dnl gettext package package is covered by the GNU General Public License.
+dnl They are *not* in the public domain.
+
+dnl Authors:
+dnl   Ulrich Drepper <drepper@cygnus.com>, 1995.
+
+# Check whether LC_MESSAGES is available in <locale.h>.
+
+AC_DEFUN([AM_LC_MESSAGES],
+[
+  AC_CACHE_CHECK([for LC_MESSAGES], am_cv_val_LC_MESSAGES,
+    [AC_TRY_LINK([#include <locale.h>], [return LC_MESSAGES],
+       am_cv_val_LC_MESSAGES=yes, am_cv_val_LC_MESSAGES=no)])
+  if test $am_cv_val_LC_MESSAGES = yes; then
+    AC_DEFINE(HAVE_LC_MESSAGES, 1,
+      [Define if your <locale.h> file defines LC_MESSAGES.])
+  fi
+])
+# lib-ld.m4 serial 2 (gettext-0.12)
+dnl Copyright (C) 1996-2003 Free Software Foundation, Inc.
+dnl This file is free software, distributed under the terms of the GNU
+dnl General Public License.  As a special exception to the GNU General
+dnl Public License, this file may be distributed as part of a program
+dnl that contains a configuration script generated by Autoconf, under
+dnl the same distribution terms as the rest of that program.
+
+dnl Subroutines of libtool.m4,
+dnl with replacements s/AC_/AC_LIB/ and s/lt_cv/acl_cv/ to avoid collision
+dnl with libtool.m4.
+
+dnl From libtool-1.4. Sets the variable with_gnu_ld to yes or no.
+AC_DEFUN([AC_LIB_PROG_LD_GNU],
+[AC_CACHE_CHECK([if the linker ($LD) is GNU ld], acl_cv_prog_gnu_ld,
+[# I'd rather use --version here, but apparently some GNU ld's only accept -v.
+if $LD -v 2>&1 </dev/null | egrep '(GNU|with BFD)' 1>&5; then
+  acl_cv_prog_gnu_ld=yes
+else
+  acl_cv_prog_gnu_ld=no
+fi])
+with_gnu_ld=$acl_cv_prog_gnu_ld
+])
+
+dnl From libtool-1.4. Sets the variable LD.
+AC_DEFUN([AC_LIB_PROG_LD],
+[AC_ARG_WITH(gnu-ld,
+[  --with-gnu-ld           assume the C compiler uses GNU ld [default=no]],
+test "$withval" = no || with_gnu_ld=yes, with_gnu_ld=no)
+AC_REQUIRE([AC_PROG_CC])dnl
+AC_REQUIRE([AC_CANONICAL_HOST])dnl
+# Prepare PATH_SEPARATOR.
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+  echo "#! /bin/sh" >conf$$.sh
+  echo  "exit 0"   >>conf$$.sh
+  chmod +x conf$$.sh
+  if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then
+    PATH_SEPARATOR=';'
+  else
+    PATH_SEPARATOR=:
+  fi
+  rm -f conf$$.sh
+fi
+ac_prog=ld
+if test "$GCC" = yes; then
+  # Check if gcc -print-prog-name=ld gives a path.
+  AC_MSG_CHECKING([for ld used by GCC])
+  case $host in
+  *-*-mingw*)
+    # gcc leaves a trailing carriage return which upsets mingw
+    ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;;
+  *)
+    ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;
+  esac
+  case $ac_prog in
+    # Accept absolute paths.
+    [[\\/]* | [A-Za-z]:[\\/]*)]
+      [re_direlt='/[^/][^/]*/\.\./']
+      # Canonicalize the path of ld
+      ac_prog=`echo $ac_prog| sed 's%\\\\%/%g'`
+      while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do
+       ac_prog=`echo $ac_prog| sed "s%$re_direlt%/%"`
+      done
+      test -z "$LD" && LD="$ac_prog"
+      ;;
+  "")
+    # If it fails, then pretend we aren't using GCC.
+    ac_prog=ld
+    ;;
+  *)
+    # If it is relative, then search for the first ld in PATH.
+    with_gnu_ld=unknown
+    ;;
+  esac
+elif test "$with_gnu_ld" = yes; then
+  AC_MSG_CHECKING([for GNU ld])
+else
+  AC_MSG_CHECKING([for non-GNU ld])
+fi
+AC_CACHE_VAL(acl_cv_path_LD,
+[if test -z "$LD"; then
+  IFS="${IFS=  }"; ac_save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR-:}"
+  for ac_dir in $PATH; do
+    test -z "$ac_dir" && ac_dir=.
+    if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
+      acl_cv_path_LD="$ac_dir/$ac_prog"
+      # Check to see if the program is GNU ld.  I'd rather use --version,
+      # but apparently some GNU ld's only accept -v.
+      # Break only if it was the GNU/non-GNU ld that we prefer.
+      if "$acl_cv_path_LD" -v 2>&1 < /dev/null | egrep '(GNU|with BFD)' > /dev/null; then
+       test "$with_gnu_ld" != no && break
+      else
+       test "$with_gnu_ld" != yes && break
+      fi
+    fi
+  done
+  IFS="$ac_save_ifs"
+else
+  acl_cv_path_LD="$LD" # Let the user override the test with a path.
+fi])
+LD="$acl_cv_path_LD"
+if test -n "$LD"; then
+  AC_MSG_RESULT($LD)
+else
+  AC_MSG_RESULT(no)
+fi
+test -z "$LD" && AC_MSG_ERROR([no acceptable ld found in \$PATH])
+AC_LIB_PROG_LD_GNU
+])
+# lib-link.m4 serial 4 (gettext-0.12)
+dnl Copyright (C) 2001-2003 Free Software Foundation, Inc.
+dnl This file is free software, distributed under the terms of the GNU
+dnl General Public License.  As a special exception to the GNU General
+dnl Public License, this file may be distributed as part of a program
+dnl that contains a configuration script generated by Autoconf, under
+dnl the same distribution terms as the rest of that program.
+
+dnl From Bruno Haible.
+
+dnl AC_LIB_LINKFLAGS(name [, dependencies]) searches for libname and
+dnl the libraries corresponding to explicit and implicit dependencies.
+dnl Sets and AC_SUBSTs the LIB${NAME} and LTLIB${NAME} variables and
+dnl augments the CPPFLAGS variable.
+AC_DEFUN([AC_LIB_LINKFLAGS],
+[
+  AC_REQUIRE([AC_LIB_PREPARE_PREFIX])
+  AC_REQUIRE([AC_LIB_RPATH])
+  define([Name],[translit([$1],[./-], [___])])
+  define([NAME],[translit([$1],[abcdefghijklmnopqrstuvwxyz./-],
+                               [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])])
+  AC_CACHE_CHECK([how to link with lib[]$1], [ac_cv_lib[]Name[]_libs], [
+    AC_LIB_LINKFLAGS_BODY([$1], [$2])
+    ac_cv_lib[]Name[]_libs="$LIB[]NAME"
+    ac_cv_lib[]Name[]_ltlibs="$LTLIB[]NAME"
+    ac_cv_lib[]Name[]_cppflags="$INC[]NAME"
+  ])
+  LIB[]NAME="$ac_cv_lib[]Name[]_libs"
+  LTLIB[]NAME="$ac_cv_lib[]Name[]_ltlibs"
+  INC[]NAME="$ac_cv_lib[]Name[]_cppflags"
+  AC_LIB_APPENDTOVAR([CPPFLAGS], [$INC]NAME)
+  AC_SUBST([LIB]NAME)
+  AC_SUBST([LTLIB]NAME)
+  dnl Also set HAVE_LIB[]NAME so that AC_LIB_HAVE_LINKFLAGS can reuse the
+  dnl results of this search when this library appears as a dependency.
+  HAVE_LIB[]NAME=yes
+  undefine([Name])
+  undefine([NAME])
+])
+
+dnl AC_LIB_HAVE_LINKFLAGS(name, dependencies, includes, testcode)
+dnl searches for libname and the libraries corresponding to explicit and
+dnl implicit dependencies, together with the specified include files and
+dnl the ability to compile and link the specified testcode. If found, it
+dnl sets and AC_SUBSTs HAVE_LIB${NAME}=yes and the LIB${NAME} and
+dnl LTLIB${NAME} variables and augments the CPPFLAGS variable, and
+dnl #defines HAVE_LIB${NAME} to 1. Otherwise, it sets and AC_SUBSTs
+dnl HAVE_LIB${NAME}=no and LIB${NAME} and LTLIB${NAME} to empty.
+AC_DEFUN([AC_LIB_HAVE_LINKFLAGS],
+[
+  AC_REQUIRE([AC_LIB_PREPARE_PREFIX])
+  AC_REQUIRE([AC_LIB_RPATH])
+  define([Name],[translit([$1],[./-], [___])])
+  define([NAME],[translit([$1],[abcdefghijklmnopqrstuvwxyz./-],
+                               [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])])
+
+  dnl Search for lib[]Name and define LIB[]NAME, LTLIB[]NAME and INC[]NAME
+  dnl accordingly.
+  AC_LIB_LINKFLAGS_BODY([$1], [$2])
+
+  dnl Add $INC[]NAME to CPPFLAGS before performing the following checks,
+  dnl because if the user has installed lib[]Name and not disabled its use
+  dnl via --without-lib[]Name-prefix, he wants to use it.
+  ac_save_CPPFLAGS="$CPPFLAGS"
+  AC_LIB_APPENDTOVAR([CPPFLAGS], [$INC]NAME)
+
+  AC_CACHE_CHECK([for lib[]$1], [ac_cv_lib[]Name], [
+    ac_save_LIBS="$LIBS"
+    LIBS="$LIBS $LIB[]NAME"
+    AC_TRY_LINK([$3], [$4], [ac_cv_lib[]Name=yes], [ac_cv_lib[]Name=no])
+    LIBS="$ac_save_LIBS"
+  ])
+  if test "$ac_cv_lib[]Name" = yes; then
+    HAVE_LIB[]NAME=yes
+    AC_DEFINE([HAVE_LIB]NAME, 1, [Define if you have the $1 library.])
+    AC_MSG_CHECKING([how to link with lib[]$1])
+    AC_MSG_RESULT([$LIB[]NAME])
+  else
+    HAVE_LIB[]NAME=no
+    dnl If $LIB[]NAME didn't lead to a usable library, we don't need
+    dnl $INC[]NAME either.
+    CPPFLAGS="$ac_save_CPPFLAGS"
+    LIB[]NAME=
+    LTLIB[]NAME=
+  fi
+  AC_SUBST([HAVE_LIB]NAME)
+  AC_SUBST([LIB]NAME)
+  AC_SUBST([LTLIB]NAME)
+  undefine([Name])
+  undefine([NAME])
+])
+
+dnl Determine the platform dependent parameters needed to use rpath:
+dnl libext, shlibext, hardcode_libdir_flag_spec, hardcode_libdir_separator,
+dnl hardcode_direct, hardcode_minus_L.
+AC_DEFUN([AC_LIB_RPATH],
+[
+  AC_REQUIRE([AC_PROG_CC])                dnl we use $CC, $GCC, $LDFLAGS
+  AC_REQUIRE([AC_LIB_PROG_LD])            dnl we use $LD, $with_gnu_ld
+  AC_REQUIRE([AC_CANONICAL_HOST])         dnl we use $host
+  AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT]) dnl we use $ac_aux_dir
+  AC_CACHE_CHECK([for shared library run path origin], acl_cv_rpath, [
+    CC="$CC" GCC="$GCC" LDFLAGS="$LDFLAGS" LD="$LD" with_gnu_ld="$with_gnu_ld" \
+    ${CONFIG_SHELL-/bin/sh} "$ac_aux_dir/config.rpath" "$host" > conftest.sh
+    . ./conftest.sh
+    rm -f ./conftest.sh
+    acl_cv_rpath=done
+  ])
+  wl="$acl_cv_wl"
+  libext="$acl_cv_libext"
+  shlibext="$acl_cv_shlibext"
+  hardcode_libdir_flag_spec="$acl_cv_hardcode_libdir_flag_spec"
+  hardcode_libdir_separator="$acl_cv_hardcode_libdir_separator"
+  hardcode_direct="$acl_cv_hardcode_direct"
+  hardcode_minus_L="$acl_cv_hardcode_minus_L"
+  dnl Determine whether the user wants rpath handling at all.
+  AC_ARG_ENABLE(rpath,
+    [  --disable-rpath         do not hardcode runtime library paths],
+    :, enable_rpath=yes)
+])
+
+dnl AC_LIB_LINKFLAGS_BODY(name [, dependencies]) searches for libname and
+dnl the libraries corresponding to explicit and implicit dependencies.
+dnl Sets the LIB${NAME}, LTLIB${NAME} and INC${NAME} variables.
+AC_DEFUN([AC_LIB_LINKFLAGS_BODY],
+[
+  define([NAME],[translit([$1],[abcdefghijklmnopqrstuvwxyz./-],
+                               [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])])
+  dnl By default, look in $includedir and $libdir.
+  use_additional=yes
+  AC_LIB_WITH_FINAL_PREFIX([
+    eval additional_includedir=\"$includedir\"
+    eval additional_libdir=\"$libdir\"
+  ])
+  AC_LIB_ARG_WITH([lib$1-prefix],
+[  --with-lib$1-prefix[=DIR]  search for lib$1 in DIR/include and DIR/lib
+  --without-lib$1-prefix     don't search for lib$1 in includedir and libdir],
+[
+    if test "X$withval" = "Xno"; then
+      use_additional=no
+    else
+      if test "X$withval" = "X"; then
+        AC_LIB_WITH_FINAL_PREFIX([
+          eval additional_includedir=\"$includedir\"
+          eval additional_libdir=\"$libdir\"
+        ])
+      else
+        additional_includedir="$withval/include"
+        additional_libdir="$withval/lib"
+      fi
+    fi
+])
+  dnl Search the library and its dependencies in $additional_libdir and
+  dnl $LDFLAGS. Using breadth-first-seach.
+  LIB[]NAME=
+  LTLIB[]NAME=
+  INC[]NAME=
+  rpathdirs=
+  ltrpathdirs=
+  names_already_handled=
+  names_next_round='$1 $2'
+  while test -n "$names_next_round"; do
+    names_this_round="$names_next_round"
+    names_next_round=
+    for name in $names_this_round; do
+      already_handled=
+      for n in $names_already_handled; do
+        if test "$n" = "$name"; then
+          already_handled=yes
+          break
+        fi
+      done
+      if test -z "$already_handled"; then
+        names_already_handled="$names_already_handled $name"
+        dnl See if it was already located by an earlier AC_LIB_LINKFLAGS
+        dnl or AC_LIB_HAVE_LINKFLAGS call.
+        uppername=`echo "$name" | sed -e 'y|abcdefghijklmnopqrstuvwxyz./-|ABCDEFGHIJKLMNOPQRSTUVWXYZ___|'`
+        eval value=\"\$HAVE_LIB$uppername\"
+        if test -n "$value"; then
+          if test "$value" = yes; then
+            eval value=\"\$LIB$uppername\"
+            test -z "$value" || LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$value"
+            eval value=\"\$LTLIB$uppername\"
+            test -z "$value" || LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }$value"
+          else
+            dnl An earlier call to AC_LIB_HAVE_LINKFLAGS has determined
+            dnl that this library doesn't exist. So just drop it.
+            :
+          fi
+        else
+          dnl Search the library lib$name in $additional_libdir and $LDFLAGS
+          dnl and the already constructed $LIBNAME/$LTLIBNAME.
+          found_dir=
+          found_la=
+          found_so=
+          found_a=
+          if test $use_additional = yes; then
+            if test -n "$shlibext" && test -f "$additional_libdir/lib$name.$shlibext"; then
+              found_dir="$additional_libdir"
+              found_so="$additional_libdir/lib$name.$shlibext"
+              if test -f "$additional_libdir/lib$name.la"; then
+                found_la="$additional_libdir/lib$name.la"
+              fi
+            else
+              if test -f "$additional_libdir/lib$name.$libext"; then
+                found_dir="$additional_libdir"
+                found_a="$additional_libdir/lib$name.$libext"
+                if test -f "$additional_libdir/lib$name.la"; then
+                  found_la="$additional_libdir/lib$name.la"
+                fi
+              fi
+            fi
+          fi
+          if test "X$found_dir" = "X"; then
+            for x in $LDFLAGS $LTLIB[]NAME; do
+              AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
+              case "$x" in
+                -L*)
+                  dir=`echo "X$x" | sed -e 's/^X-L//'`
+                  if test -n "$shlibext" && test -f "$dir/lib$name.$shlibext"; then
+                    found_dir="$dir"
+                    found_so="$dir/lib$name.$shlibext"
+                    if test -f "$dir/lib$name.la"; then
+                      found_la="$dir/lib$name.la"
+                    fi
+                  else
+                    if test -f "$dir/lib$name.$libext"; then
+                      found_dir="$dir"
+                      found_a="$dir/lib$name.$libext"
+                      if test -f "$dir/lib$name.la"; then
+                        found_la="$dir/lib$name.la"
+                      fi
+                    fi
+                  fi
+                  ;;
+              esac
+              if test "X$found_dir" != "X"; then
+                break
+              fi
+            done
+          fi
+          if test "X$found_dir" != "X"; then
+            dnl Found the library.
+            LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-L$found_dir -l$name"
+            if test "X$found_so" != "X"; then
+              dnl Linking with a shared library. We attempt to hardcode its
+              dnl directory into the executable's runpath, unless it's the
+              dnl standard /usr/lib.
+              if test "$enable_rpath" = no || test "X$found_dir" = "X/usr/lib"; then
+                dnl No hardcoding is needed.
+                LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so"
+              else
+                dnl Use an explicit option to hardcode DIR into the resulting
+                dnl binary.
+                dnl Potentially add DIR to ltrpathdirs.
+                dnl The ltrpathdirs will be appended to $LTLIBNAME at the end.
+                haveit=
+                for x in $ltrpathdirs; do
+                  if test "X$x" = "X$found_dir"; then
+                    haveit=yes
+                    break
+                  fi
+                done
+                if test -z "$haveit"; then
+                  ltrpathdirs="$ltrpathdirs $found_dir"
+                fi
+                dnl The hardcoding into $LIBNAME is system dependent.
+                if test "$hardcode_direct" = yes; then
+                  dnl Using DIR/libNAME.so during linking hardcodes DIR into the
+                  dnl resulting binary.
+                  LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so"
+                else
+                  if test -n "$hardcode_libdir_flag_spec" && test "$hardcode_minus_L" = no; then
+                    dnl Use an explicit option to hardcode DIR into the resulting
+                    dnl binary.
+                    LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so"
+                    dnl Potentially add DIR to rpathdirs.
+                    dnl The rpathdirs will be appended to $LIBNAME at the end.
+                    haveit=
+                    for x in $rpathdirs; do
+                      if test "X$x" = "X$found_dir"; then
+                        haveit=yes
+                        break
+                      fi
+                    done
+                    if test -z "$haveit"; then
+                      rpathdirs="$rpathdirs $found_dir"
+                    fi
+                  else
+                    dnl Rely on "-L$found_dir".
+                    dnl But don't add it if it's already contained in the LDFLAGS
+                    dnl or the already constructed $LIBNAME
+                    haveit=
+                    for x in $LDFLAGS $LIB[]NAME; do
+                      AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
+                      if test "X$x" = "X-L$found_dir"; then
+                        haveit=yes
+                        break
+                      fi
+                    done
+                    if test -z "$haveit"; then
+                      LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$found_dir"
+                    fi
+                    if test "$hardcode_minus_L" != no; then
+                      dnl FIXME: Not sure whether we should use
+                      dnl "-L$found_dir -l$name" or "-L$found_dir $found_so"
+                      dnl here.
+                      LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so"
+                    else
+                      dnl We cannot use $hardcode_runpath_var and LD_RUN_PATH
+                      dnl here, because this doesn't fit in flags passed to the
+                      dnl compiler. So give up. No hardcoding. This affects only
+                      dnl very old systems.
+                      dnl FIXME: Not sure whether we should use
+                      dnl "-L$found_dir -l$name" or "-L$found_dir $found_so"
+                      dnl here.
+                      LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-l$name"
+                    fi
+                  fi
+                fi
+              fi
+            else
+              if test "X$found_a" != "X"; then
+                dnl Linking with a static library.
+                LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_a"
+              else
+                dnl We shouldn't come here, but anyway it's good to have a
+                dnl fallback.
+                LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$found_dir -l$name"
+              fi
+            fi
+            dnl Assume the include files are nearby.
+            additional_includedir=
+            case "$found_dir" in
+              */lib | */lib/)
+                basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e 's,/lib/*$,,'`
+                additional_includedir="$basedir/include"
+                ;;
+            esac
+            if test "X$additional_includedir" != "X"; then
+              dnl Potentially add $additional_includedir to $INCNAME.
+              dnl But don't add it
+              dnl   1. if it's the standard /usr/include,
+              dnl   2. if it's /usr/local/include and we are using GCC on Linux,
+              dnl   3. if it's already present in $CPPFLAGS or the already
+              dnl      constructed $INCNAME,
+              dnl   4. if it doesn't exist as a directory.
+              if test "X$additional_includedir" != "X/usr/include"; then
+                haveit=
+                if test "X$additional_includedir" = "X/usr/local/include"; then
+                  if test -n "$GCC"; then
+                    case $host_os in
+                      linux*) haveit=yes;;
+                    esac
+                  fi
+                fi
+                if test -z "$haveit"; then
+                  for x in $CPPFLAGS $INC[]NAME; do
+                    AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
+                    if test "X$x" = "X-I$additional_includedir"; then
+                      haveit=yes
+                      break
+                    fi
+                  done
+                  if test -z "$haveit"; then
+                    if test -d "$additional_includedir"; then
+                      dnl Really add $additional_includedir to $INCNAME.
+                      INC[]NAME="${INC[]NAME}${INC[]NAME:+ }-I$additional_includedir"
+                    fi
+                  fi
+                fi
+              fi
+            fi
+            dnl Look for dependencies.
+            if test -n "$found_la"; then
+              dnl Read the .la file. It defines the variables
+              dnl dlname, library_names, old_library, dependency_libs, current,
+              dnl age, revision, installed, dlopen, dlpreopen, libdir.
+              save_libdir="$libdir"
+              case "$found_la" in
+                */* | *\\*) . "$found_la" ;;
+                *) . "./$found_la" ;;
+              esac
+              libdir="$save_libdir"
+              dnl We use only dependency_libs.
+              for dep in $dependency_libs; do
+                case "$dep" in
+                  -L*)
+                    additional_libdir=`echo "X$dep" | sed -e 's/^X-L//'`
+                    dnl Potentially add $additional_libdir to $LIBNAME and $LTLIBNAME.
+                    dnl But don't add it
+                    dnl   1. if it's the standard /usr/lib,
+                    dnl   2. if it's /usr/local/lib and we are using GCC on Linux,
+                    dnl   3. if it's already present in $LDFLAGS or the already
+                    dnl      constructed $LIBNAME,
+                    dnl   4. if it doesn't exist as a directory.
+                    if test "X$additional_libdir" != "X/usr/lib"; then
+                      haveit=
+                      if test "X$additional_libdir" = "X/usr/local/lib"; then
+                        if test -n "$GCC"; then
+                          case $host_os in
+                            linux*) haveit=yes;;
+                          esac
+                        fi
+                      fi
+                      if test -z "$haveit"; then
+                        haveit=
+                        for x in $LDFLAGS $LIB[]NAME; do
+                          AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
+                          if test "X$x" = "X-L$additional_libdir"; then
+                            haveit=yes
+                            break
+                          fi
+                        done
+                        if test -z "$haveit"; then
+                          if test -d "$additional_libdir"; then
+                            dnl Really add $additional_libdir to $LIBNAME.
+                            LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$additional_libdir"
+                          fi
+                        fi
+                        haveit=
+                        for x in $LDFLAGS $LTLIB[]NAME; do
+                          AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
+                          if test "X$x" = "X-L$additional_libdir"; then
+                            haveit=yes
+                            break
+                          fi
+                        done
+                        if test -z "$haveit"; then
+                          if test -d "$additional_libdir"; then
+                            dnl Really add $additional_libdir to $LTLIBNAME.
+                            LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-L$additional_libdir"
+                          fi
+                        fi
+                      fi
+                    fi
+                    ;;
+                  -R*)
+                    dir=`echo "X$dep" | sed -e 's/^X-R//'`
+                    if test "$enable_rpath" != no; then
+                      dnl Potentially add DIR to rpathdirs.
+                      dnl The rpathdirs will be appended to $LIBNAME at the end.
+                      haveit=
+                      for x in $rpathdirs; do
+                        if test "X$x" = "X$dir"; then
+                          haveit=yes
+                          break
+                        fi
+                      done
+                      if test -z "$haveit"; then
+                        rpathdirs="$rpathdirs $dir"
+                      fi
+                      dnl Potentially add DIR to ltrpathdirs.
+                      dnl The ltrpathdirs will be appended to $LTLIBNAME at the end.
+                      haveit=
+                      for x in $ltrpathdirs; do
+                        if test "X$x" = "X$dir"; then
+                          haveit=yes
+                          break
+                        fi
+                      done
+                      if test -z "$haveit"; then
+                        ltrpathdirs="$ltrpathdirs $dir"
+                      fi
+                    fi
+                    ;;
+                  -l*)
+                    dnl Handle this in the next round.
+                    names_next_round="$names_next_round "`echo "X$dep" | sed -e 's/^X-l//'`
+                    ;;
+                  *.la)
+                    dnl Handle this in the next round. Throw away the .la's
+                    dnl directory; it is already contained in a preceding -L
+                    dnl option.
+                    names_next_round="$names_next_round "`echo "X$dep" | sed -e 's,^X.*/,,' -e 's,^lib,,' -e 's,\.la$,,'`
+                    ;;
+                  *)
+                    dnl Most likely an immediate library name.
+                    LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$dep"
+                    LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }$dep"
+                    ;;
+                esac
+              done
+            fi
+          else
+            dnl Didn't find the library; assume it is in the system directories
+            dnl known to the linker and runtime loader. (All the system
+            dnl directories known to the linker should also be known to the
+            dnl runtime loader, otherwise the system is severely misconfigured.)
+            LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-l$name"
+            LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-l$name"
+          fi
+        fi
+      fi
+    done
+  done
+  if test "X$rpathdirs" != "X"; then
+    if test -n "$hardcode_libdir_separator"; then
+      dnl Weird platform: only the last -rpath option counts, the user must
+      dnl pass all path elements in one option. We can arrange that for a
+      dnl single library, but not when more than one $LIBNAMEs are used.
+      alldirs=
+      for found_dir in $rpathdirs; do
+        alldirs="${alldirs}${alldirs:+$hardcode_libdir_separator}$found_dir"
+      done
+      dnl Note: hardcode_libdir_flag_spec uses $libdir and $wl.
+      acl_save_libdir="$libdir"
+      libdir="$alldirs"
+      eval flag=\"$hardcode_libdir_flag_spec\"
+      libdir="$acl_save_libdir"
+      LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$flag"
+    else
+      dnl The -rpath options are cumulative.
+      for found_dir in $rpathdirs; do
+        acl_save_libdir="$libdir"
+        libdir="$found_dir"
+        eval flag=\"$hardcode_libdir_flag_spec\"
+        libdir="$acl_save_libdir"
+        LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$flag"
+      done
+    fi
+  fi
+  if test "X$ltrpathdirs" != "X"; then
+    dnl When using libtool, the option that works for both libraries and
+    dnl executables is -R. The -R options are cumulative.
+    for found_dir in $ltrpathdirs; do
+      LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-R$found_dir"
+    done
+  fi
+])
+
+dnl AC_LIB_APPENDTOVAR(VAR, CONTENTS) appends the elements of CONTENTS to VAR,
+dnl unless already present in VAR.
+dnl Works only for CPPFLAGS, not for LIB* variables because that sometimes
+dnl contains two or three consecutive elements that belong together.
+AC_DEFUN([AC_LIB_APPENDTOVAR],
+[
+  for element in [$2]; do
+    haveit=
+    for x in $[$1]; do
+      AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
+      if test "X$x" = "X$element"; then
+        haveit=yes
+        break
+      fi
+    done
+    if test -z "$haveit"; then
+      [$1]="${[$1]}${[$1]:+ }$element"
+    fi
+  done
+])
+# lib-prefix.m4 serial 2 (gettext-0.12)
+dnl Copyright (C) 2001-2003 Free Software Foundation, Inc.
+dnl This file is free software, distributed under the terms of the GNU
+dnl General Public License.  As a special exception to the GNU General
+dnl Public License, this file may be distributed as part of a program
+dnl that contains a configuration script generated by Autoconf, under
+dnl the same distribution terms as the rest of that program.
+
+dnl From Bruno Haible.
+
+dnl AC_LIB_ARG_WITH is synonymous to AC_ARG_WITH in autoconf-2.13, and
+dnl similar to AC_ARG_WITH in autoconf 2.52...2.57 except that is doesn't
+dnl require excessive bracketing.
+ifdef([AC_HELP_STRING],
+[AC_DEFUN([AC_LIB_ARG_WITH], [AC_ARG_WITH([$1],[[$2]],[$3],[$4])])],
+[AC_DEFUN([AC_LIB_ARG_WITH], [AC_ARG_WITH([$1],[$2],[$3],[$4])])])
+
+dnl AC_LIB_PREFIX adds to the CPPFLAGS and LDFLAGS the flags that are needed
+dnl to access previously installed libraries. The basic assumption is that
+dnl a user will want packages to use other packages he previously installed
+dnl with the same --prefix option.
+dnl This macro is not needed if only AC_LIB_LINKFLAGS is used to locate
+dnl libraries, but is otherwise very convenient.
+AC_DEFUN([AC_LIB_PREFIX],
+[
+  AC_BEFORE([$0], [AC_LIB_LINKFLAGS])
+  AC_REQUIRE([AC_PROG_CC])
+  AC_REQUIRE([AC_CANONICAL_HOST])
+  AC_REQUIRE([AC_LIB_PREPARE_PREFIX])
+  dnl By default, look in $includedir and $libdir.
+  use_additional=yes
+  AC_LIB_WITH_FINAL_PREFIX([
+    eval additional_includedir=\"$includedir\"
+    eval additional_libdir=\"$libdir\"
+  ])
+  AC_LIB_ARG_WITH([lib-prefix],
+[  --with-lib-prefix[=DIR] search for libraries in DIR/include and DIR/lib
+  --without-lib-prefix    don't search for libraries in includedir and libdir],
+[
+    if test "X$withval" = "Xno"; then
+      use_additional=no
+    else
+      if test "X$withval" = "X"; then
+        AC_LIB_WITH_FINAL_PREFIX([
+          eval additional_includedir=\"$includedir\"
+          eval additional_libdir=\"$libdir\"
+        ])
+      else
+        additional_includedir="$withval/include"
+        additional_libdir="$withval/lib"
+      fi
+    fi
+])
+  if test $use_additional = yes; then
+    dnl Potentially add $additional_includedir to $CPPFLAGS.
+    dnl But don't add it
+    dnl   1. if it's the standard /usr/include,
+    dnl   2. if it's already present in $CPPFLAGS,
+    dnl   3. if it's /usr/local/include and we are using GCC on Linux,
+    dnl   4. if it doesn't exist as a directory.
+    if test "X$additional_includedir" != "X/usr/include"; then
+      haveit=
+      for x in $CPPFLAGS; do
+        AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
+        if test "X$x" = "X-I$additional_includedir"; then
+          haveit=yes
+          break
+        fi
+      done
+      if test -z "$haveit"; then
+        if test "X$additional_includedir" = "X/usr/local/include"; then
+          if test -n "$GCC"; then
+            case $host_os in
+              linux*) haveit=yes;;
+            esac
+          fi
+        fi
+        if test -z "$haveit"; then
+          if test -d "$additional_includedir"; then
+            dnl Really add $additional_includedir to $CPPFLAGS.
+            CPPFLAGS="${CPPFLAGS}${CPPFLAGS:+ }-I$additional_includedir"
+          fi
+        fi
+      fi
+    fi
+    dnl Potentially add $additional_libdir to $LDFLAGS.
+    dnl But don't add it
+    dnl   1. if it's the standard /usr/lib,
+    dnl   2. if it's already present in $LDFLAGS,
+    dnl   3. if it's /usr/local/lib and we are using GCC on Linux,
+    dnl   4. if it doesn't exist as a directory.
+    if test "X$additional_libdir" != "X/usr/lib"; then
+      haveit=
+      for x in $LDFLAGS; do
+        AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
+        if test "X$x" = "X-L$additional_libdir"; then
+          haveit=yes
+          break
+        fi
+      done
+      if test -z "$haveit"; then
+        if test "X$additional_libdir" = "X/usr/local/lib"; then
+          if test -n "$GCC"; then
+            case $host_os in
+              linux*) haveit=yes;;
+            esac
+          fi
+        fi
+        if test -z "$haveit"; then
+          if test -d "$additional_libdir"; then
+            dnl Really add $additional_libdir to $LDFLAGS.
+            LDFLAGS="${LDFLAGS}${LDFLAGS:+ }-L$additional_libdir"
+          fi
+        fi
+      fi
+    fi
+  fi
+])
+
+dnl AC_LIB_PREPARE_PREFIX creates variables acl_final_prefix,
+dnl acl_final_exec_prefix, containing the values to which $prefix and
+dnl $exec_prefix will expand at the end of the configure script.
+AC_DEFUN([AC_LIB_PREPARE_PREFIX],
+[
+  dnl Unfortunately, prefix and exec_prefix get only finally determined
+  dnl at the end of configure.
+  if test "X$prefix" = "XNONE"; then
+    acl_final_prefix="$ac_default_prefix"
+  else
+    acl_final_prefix="$prefix"
+  fi
+  if test "X$exec_prefix" = "XNONE"; then
+    acl_final_exec_prefix='${prefix}'
+  else
+    acl_final_exec_prefix="$exec_prefix"
+  fi
+  acl_save_prefix="$prefix"
+  prefix="$acl_final_prefix"
+  eval acl_final_exec_prefix=\"$acl_final_exec_prefix\"
+  prefix="$acl_save_prefix"
+])
+
+dnl AC_LIB_WITH_FINAL_PREFIX([statement]) evaluates statement, with the
+dnl variables prefix and exec_prefix bound to the values they will have
+dnl at the end of the configure script.
+AC_DEFUN([AC_LIB_WITH_FINAL_PREFIX],
+[
+  acl_save_prefix="$prefix"
+  prefix="$acl_final_prefix"
+  acl_save_exec_prefix="$exec_prefix"
+  exec_prefix="$acl_final_exec_prefix"
+  $1
+  exec_prefix="$acl_save_exec_prefix"
+  prefix="$acl_save_prefix"
+])
+# nls.m4 serial 1 (gettext-0.12)
+dnl Copyright (C) 1995-2003 Free Software Foundation, Inc.
+dnl This file is free software, distributed under the terms of the GNU
+dnl General Public License.  As a special exception to the GNU General
+dnl Public License, this file may be distributed as part of a program
+dnl that contains a configuration script generated by Autoconf, under
+dnl the same distribution terms as the rest of that program.
+dnl
+dnl This file can can be used in projects which are not available under
+dnl the GNU General Public License or the GNU Library General Public
+dnl License but which still want to provide support for the GNU gettext
+dnl functionality.
+dnl Please note that the actual code of the GNU gettext library is covered
+dnl by the GNU Library General Public License, and the rest of the GNU
+dnl gettext package package is covered by the GNU General Public License.
+dnl They are *not* in the public domain.
+
+dnl Authors:
+dnl   Ulrich Drepper <drepper@cygnus.com>, 1995-2000.
+dnl   Bruno Haible <haible@clisp.cons.org>, 2000-2003.
+
+AC_DEFUN([AM_NLS],
+[
+  AC_MSG_CHECKING([whether NLS is requested])
+  dnl Default is enabled NLS
+  AC_ARG_ENABLE(nls,
+    [  --disable-nls           do not use Native Language Support],
+    USE_NLS=$enableval, USE_NLS=yes)
+  AC_MSG_RESULT($USE_NLS)
+  AC_SUBST(USE_NLS)
+])
+
+AC_DEFUN([AM_MKINSTALLDIRS],
+[
+  dnl If the AC_CONFIG_AUX_DIR macro for autoconf is used we possibly
+  dnl find the mkinstalldirs script in another subdir but $(top_srcdir).
+  dnl Try to locate it.
+  MKINSTALLDIRS=
+  if test -n "$ac_aux_dir"; then
+    case "$ac_aux_dir" in
+      /*) MKINSTALLDIRS="$ac_aux_dir/mkinstalldirs" ;;
+      *) MKINSTALLDIRS="\$(top_builddir)/$ac_aux_dir/mkinstalldirs" ;;
+    esac
+  fi
+  if test -z "$MKINSTALLDIRS"; then
+    MKINSTALLDIRS="\$(top_srcdir)/mkinstalldirs"
+  fi
+  AC_SUBST(MKINSTALLDIRS)
+])
+# po.m4 serial 1 (gettext-0.12)
+dnl Copyright (C) 1995-2003 Free Software Foundation, Inc.
+dnl This file is free software, distributed under the terms of the GNU
+dnl General Public License.  As a special exception to the GNU General
+dnl Public License, this file may be distributed as part of a program
+dnl that contains a configuration script generated by Autoconf, under
+dnl the same distribution terms as the rest of that program.
+dnl
+dnl This file can can be used in projects which are not available under
+dnl the GNU General Public License or the GNU Library General Public
+dnl License but which still want to provide support for the GNU gettext
+dnl functionality.
+dnl Please note that the actual code of the GNU gettext library is covered
+dnl by the GNU Library General Public License, and the rest of the GNU
+dnl gettext package package is covered by the GNU General Public License.
+dnl They are *not* in the public domain.
+
+dnl Authors:
+dnl   Ulrich Drepper <drepper@cygnus.com>, 1995-2000.
+dnl   Bruno Haible <haible@clisp.cons.org>, 2000-2003.
+
+dnl Checks for all prerequisites of the po subdirectory.
+AC_DEFUN([AM_PO_SUBDIRS],
+[
+  AC_REQUIRE([AC_PROG_MAKE_SET])dnl
+  AC_REQUIRE([AC_PROG_INSTALL])dnl
+  AC_REQUIRE([AM_MKINSTALLDIRS])dnl
+  AC_REQUIRE([AM_NLS])dnl
+
+  dnl Perform the following tests also if --disable-nls has been given,
+  dnl because they are needed for "make dist" to work.
+
+  dnl Search for GNU msgfmt in the PATH.
+  dnl The first test excludes Solaris msgfmt and early GNU msgfmt versions.
+  dnl The second test excludes FreeBSD msgfmt.
+  AM_PATH_PROG_WITH_TEST(MSGFMT, msgfmt,
+    [$ac_dir/$ac_word --statistics /dev/null >/dev/null 2>&1 &&
+     (if $ac_dir/$ac_word --statistics /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi)],
+    :)
+  AC_PATH_PROG(GMSGFMT, gmsgfmt, $MSGFMT)
+
+  dnl Search for GNU xgettext 0.12 or newer in the PATH.
+  dnl The first test excludes Solaris xgettext and early GNU xgettext versions.
+  dnl The second test excludes FreeBSD xgettext.
+  AM_PATH_PROG_WITH_TEST(XGETTEXT, xgettext,
+    [$ac_dir/$ac_word --omit-header --copyright-holder= --msgid-bugs-address= /dev/null >/dev/null 2>&1 &&
+     (if $ac_dir/$ac_word --omit-header --copyright-holder= --msgid-bugs-address= /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi)],
+    :)
+  dnl Remove leftover from FreeBSD xgettext call.
+  rm -f messages.po
+
+  dnl Search for GNU msgmerge 0.11 or newer in the PATH.
+  AM_PATH_PROG_WITH_TEST(MSGMERGE, msgmerge,
+    [$ac_dir/$ac_word --update -q /dev/null /dev/null >/dev/null 2>&1], :)
+
+  dnl This could go away some day; the PATH_PROG_WITH_TEST already does it.
+  dnl Test whether we really found GNU msgfmt.
+  if test "$GMSGFMT" != ":"; then
+    dnl If it is no GNU msgfmt we define it as : so that the
+    dnl Makefiles still can work.
+    if $GMSGFMT --statistics /dev/null >/dev/null 2>&1 &&
+       (if $GMSGFMT --statistics /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi); then
+      : ;
+    else
+      GMSGFMT=`echo "$GMSGFMT" | sed -e 's,^.*/,,'`
+      AC_MSG_RESULT(
+        [found $GMSGFMT program is not GNU msgfmt; ignore it])
+      GMSGFMT=":"
+    fi
+  fi
+
+  dnl This could go away some day; the PATH_PROG_WITH_TEST already does it.
+  dnl Test whether we really found GNU xgettext.
+  if test "$XGETTEXT" != ":"; then
+    dnl If it is no GNU xgettext we define it as : so that the
+    dnl Makefiles still can work.
+    if $XGETTEXT --omit-header --copyright-holder= --msgid-bugs-address= /dev/null >/dev/null 2>&1 &&
+       (if $XGETTEXT --omit-header --copyright-holder= --msgid-bugs-address= /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi); then
+      : ;
+    else
+      AC_MSG_RESULT(
+        [found xgettext program is not GNU xgettext; ignore it])
+      XGETTEXT=":"
+    fi
+    dnl Remove leftover from FreeBSD xgettext call.
+    rm -f messages.po
+  fi
+
+  AC_OUTPUT_COMMANDS([
+    for ac_file in $CONFIG_FILES; do
+      # Support "outfile[:infile[:infile...]]"
+      case "$ac_file" in
+        *:*) ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;;
+      esac
+      # PO directories have a Makefile.in generated from Makefile.in.in.
+      case "$ac_file" in */Makefile.in)
+        # Adjust a relative srcdir.
+        ac_dir=`echo "$ac_file"|sed 's%/[^/][^/]*$%%'`
+        ac_dir_suffix="/`echo "$ac_dir"|sed 's%^\./%%'`"
+        ac_dots=`echo "$ac_dir_suffix"|sed 's%/[^/]*%../%g'`
+        # In autoconf-2.13 it is called $ac_given_srcdir.
+        # In autoconf-2.50 it is called $srcdir.
+        test -n "$ac_given_srcdir" || ac_given_srcdir="$srcdir"
+        case "$ac_given_srcdir" in
+          .)  top_srcdir=`echo $ac_dots|sed 's%/$%%'` ;;
+          /*) top_srcdir="$ac_given_srcdir" ;;
+          *)  top_srcdir="$ac_dots$ac_given_srcdir" ;;
+        esac
+        if test -f "$ac_given_srcdir/$ac_dir/POTFILES.in"; then
+          rm -f "$ac_dir/POTFILES"
+          test -n "$as_me" && echo "$as_me: creating $ac_dir/POTFILES" || echo "creating $ac_dir/POTFILES"
+          cat "$ac_given_srcdir/$ac_dir/POTFILES.in" | sed -e "/^#/d" -e "/^[  ]*\$/d" -e "s,.*,     $top_srcdir/& \\\\," | sed -e "\$s/\(.*\) \\\\/\1/" > "$ac_dir/POTFILES"
+          POMAKEFILEDEPS="POTFILES.in"
+          # ALL_LINGUAS, POFILES, GMOFILES, UPDATEPOFILES, DUMMYPOFILES depend
+          # on $ac_dir but don't depend on user-specified configuration
+          # parameters.
+          if test -f "$ac_given_srcdir/$ac_dir/LINGUAS"; then
+            # The LINGUAS file contains the set of available languages.
+            if test -n "$OBSOLETE_ALL_LINGUAS"; then
+              test -n "$as_me" && echo "$as_me: setting ALL_LINGUAS in configure.in is obsolete" || echo "setting ALL_LINGUAS in configure.in is obsolete"
+            fi
+            ALL_LINGUAS_=`sed -e "/^#/d" "$ac_given_srcdir/$ac_dir/LINGUAS"`
+            # Hide the ALL_LINGUAS assigment from automake.
+            eval 'ALL_LINGUAS''=$ALL_LINGUAS_'
+            POMAKEFILEDEPS="$POMAKEFILEDEPS LINGUAS"
+          else
+            # The set of available languages was given in configure.in.
+            eval 'ALL_LINGUAS''=$OBSOLETE_ALL_LINGUAS'
+          fi
+          case "$ac_given_srcdir" in
+            .) srcdirpre= ;;
+            *) srcdirpre='$(srcdir)/' ;;
+          esac
+          POFILES=
+          GMOFILES=
+          UPDATEPOFILES=
+          DUMMYPOFILES=
+          for lang in $ALL_LINGUAS; do
+            POFILES="$POFILES $srcdirpre$lang.po"
+            GMOFILES="$GMOFILES $srcdirpre$lang.gmo"
+            UPDATEPOFILES="$UPDATEPOFILES $lang.po-update"
+            DUMMYPOFILES="$DUMMYPOFILES $lang.nop"
+          done
+          # CATALOGS depends on both $ac_dir and the user's LINGUAS
+          # environment variable.
+          INST_LINGUAS=
+          if test -n "$ALL_LINGUAS"; then
+            for presentlang in $ALL_LINGUAS; do
+              useit=no
+              if test "%UNSET%" != "$LINGUAS"; then
+                desiredlanguages="$LINGUAS"
+              else
+                desiredlanguages="$ALL_LINGUAS"
+              fi
+              for desiredlang in $desiredlanguages; do
+                # Use the presentlang catalog if desiredlang is
+                #   a. equal to presentlang, or
+                #   b. a variant of presentlang (because in this case,
+                #      presentlang can be used as a fallback for messages
+                #      which are not translated in the desiredlang catalog).
+                case "$desiredlang" in
+                  "$presentlang"*) useit=yes;;
+                esac
+              done
+              if test $useit = yes; then
+                INST_LINGUAS="$INST_LINGUAS $presentlang"
+              fi
+            done
+          fi
+          CATALOGS=
+          if test -n "$INST_LINGUAS"; then
+            for lang in $INST_LINGUAS; do
+              CATALOGS="$CATALOGS $lang.gmo"
+            done
+          fi
+          test -n "$as_me" && echo "$as_me: creating $ac_dir/Makefile" || echo "creating $ac_dir/Makefile"
+          sed -e "/^POTFILES =/r $ac_dir/POTFILES" -e "/^# Makevars/r $ac_given_srcdir/$ac_dir/Makevars" -e "s|@POFILES@|$POFILES|g" -e "s|@GMOFILES@|$GMOFILES|g" -e "s|@UPDATEPOFILES@|$UPDATEPOFILES|g" -e "s|@DUMMYPOFILES@|$DUMMYPOFILES|g" -e "s|@CATALOGS@|$CATALOGS|g" -e "s|@POMAKEFILEDEPS@|$POMAKEFILEDEPS|g" "$ac_dir/Makefile.in" > "$ac_dir/Makefile"
+          for f in "$ac_given_srcdir/$ac_dir"/Rules-*; do
+            if test -f "$f"; then
+              case "$f" in
+                *.orig | *.bak | *~) ;;
+                *) cat "$f" >> "$ac_dir/Makefile" ;;
+              esac
+            fi
+          done
+        fi
+        ;;
+      esac
+    done],
+   [# Capture the value of obsolete ALL_LINGUAS because we need it to compute
+    # POFILES, GMOFILES, UPDATEPOFILES, DUMMYPOFILES, CATALOGS. But hide it
+    # from automake.
+    eval 'OBSOLETE_ALL_LINGUAS''="$ALL_LINGUAS"'
+    # Capture the value of LINGUAS because we need it to compute CATALOGS.
+    LINGUAS="${LINGUAS-%UNSET%}"
+   ])
+])
+# progtest.m4 serial 3 (gettext-0.12)
+dnl Copyright (C) 1996-2003 Free Software Foundation, Inc.
+dnl This file is free software, distributed under the terms of the GNU
+dnl General Public License.  As a special exception to the GNU General
+dnl Public License, this file may be distributed as part of a program
+dnl that contains a configuration script generated by Autoconf, under
+dnl the same distribution terms as the rest of that program.
+dnl
+dnl This file can can be used in projects which are not available under
+dnl the GNU General Public License or the GNU Library General Public
+dnl License but which still want to provide support for the GNU gettext
+dnl functionality.
+dnl Please note that the actual code of the GNU gettext library is covered
+dnl by the GNU Library General Public License, and the rest of the GNU
+dnl gettext package package is covered by the GNU General Public License.
+dnl They are *not* in the public domain.
+
+dnl Authors:
+dnl   Ulrich Drepper <drepper@cygnus.com>, 1996.
+
+# Search path for a program which passes the given test.
+
+dnl AM_PATH_PROG_WITH_TEST(VARIABLE, PROG-TO-CHECK-FOR,
+dnl   TEST-PERFORMED-ON-FOUND_PROGRAM [, VALUE-IF-NOT-FOUND [, PATH]])
+AC_DEFUN([AM_PATH_PROG_WITH_TEST],
+[
+# Prepare PATH_SEPARATOR.
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+  echo "#! /bin/sh" >conf$$.sh
+  echo  "exit 0"   >>conf$$.sh
+  chmod +x conf$$.sh
+  if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then
+    PATH_SEPARATOR=';'
+  else
+    PATH_SEPARATOR=:
+  fi
+  rm -f conf$$.sh
+fi
+
+# Find out how to test for executable files. Don't use a zero-byte file,
+# as systems may use methods other than mode bits to determine executability.
+cat >conf$$.file <<_ASEOF
+#! /bin/sh
+exit 0
+_ASEOF
+chmod +x conf$$.file
+if test -x conf$$.file >/dev/null 2>&1; then
+  ac_executable_p="test -x"
+else
+  ac_executable_p="test -f"
+fi
+rm -f conf$$.file
+
+# Extract the first word of "$2", so it can be a program name with args.
+set dummy $2; ac_word=[$]2
+AC_MSG_CHECKING([for $ac_word])
+AC_CACHE_VAL(ac_cv_path_$1,
+[case "[$]$1" in
+  [[\\/]]* | ?:[[\\/]]*)
+    ac_cv_path_$1="[$]$1" # Let the user override the test with a path.
+    ;;
+  *)
+    ac_save_IFS="$IFS"; IFS=$PATH_SEPARATOR
+    for ac_dir in ifelse([$5], , $PATH, [$5]); do
+      IFS="$ac_save_IFS"
+      test -z "$ac_dir" && ac_dir=.
+      for ac_exec_ext in '' $ac_executable_extensions; do
+        if $ac_executable_p "$ac_dir/$ac_word$ac_exec_ext"; then
+          if [$3]; then
+            ac_cv_path_$1="$ac_dir/$ac_word$ac_exec_ext"
+            break 2
+          fi
+        fi
+      done
+    done
+    IFS="$ac_save_IFS"
+dnl If no 4th arg is given, leave the cache variable unset,
+dnl so AC_PATH_PROGS will keep looking.
+ifelse([$4], , , [  test -z "[$]ac_cv_path_$1" && ac_cv_path_$1="$4"
+])dnl
+    ;;
+esac])dnl
+$1="$ac_cv_path_$1"
+if test ifelse([$4], , [-n "[$]$1"], ["[$]$1" != "$4"]); then
+  AC_MSG_RESULT([$]$1)
+else
+  AC_MSG_RESULT(no)
+fi
+AC_SUBST($1)dnl
+])
+# stdint_h.m4 serial 3 (gettext-0.12)
+dnl Copyright (C) 1997-2003 Free Software Foundation, Inc.
+dnl This file is free software, distributed under the terms of the GNU
+dnl General Public License.  As a special exception to the GNU General
+dnl Public License, this file may be distributed as part of a program
+dnl that contains a configuration script generated by Autoconf, under
+dnl the same distribution terms as the rest of that program.
+
+dnl From Paul Eggert.
+
+# Define HAVE_STDINT_H_WITH_UINTMAX if <stdint.h> exists,
+# doesn't clash with <sys/types.h>, and declares uintmax_t.
+
+AC_DEFUN([jm_AC_HEADER_STDINT_H],
+[
+  AC_CACHE_CHECK([for stdint.h], jm_ac_cv_header_stdint_h,
+  [AC_TRY_COMPILE(
+    [#include <sys/types.h>
+#include <stdint.h>],
+    [uintmax_t i = (uintmax_t) -1;],
+    jm_ac_cv_header_stdint_h=yes,
+    jm_ac_cv_header_stdint_h=no)])
+  if test $jm_ac_cv_header_stdint_h = yes; then
+    AC_DEFINE_UNQUOTED(HAVE_STDINT_H_WITH_UINTMAX, 1,
+      [Define if <stdint.h> exists, doesn't clash with <sys/types.h>,
+       and declares uintmax_t. ])
+  fi
+])
+# uintmax_t.m4 serial 7 (gettext-0.12)
+dnl Copyright (C) 1997-2003 Free Software Foundation, Inc.
+dnl This file is free software, distributed under the terms of the GNU
+dnl General Public License.  As a special exception to the GNU General
+dnl Public License, this file may be distributed as part of a program
+dnl that contains a configuration script generated by Autoconf, under
+dnl the same distribution terms as the rest of that program.
+
+dnl From Paul Eggert.
+
+AC_PREREQ(2.13)
+
+# Define uintmax_t to 'unsigned long' or 'unsigned long long'
+# if it is not already defined in <stdint.h> or <inttypes.h>.
+
+AC_DEFUN([jm_AC_TYPE_UINTMAX_T],
+[
+  AC_REQUIRE([jm_AC_HEADER_INTTYPES_H])
+  AC_REQUIRE([jm_AC_HEADER_STDINT_H])
+  if test $jm_ac_cv_header_inttypes_h = no && test $jm_ac_cv_header_stdint_h = no; then
+    AC_REQUIRE([jm_AC_TYPE_UNSIGNED_LONG_LONG])
+    test $ac_cv_type_unsigned_long_long = yes \
+      && ac_type='unsigned long long' \
+      || ac_type='unsigned long'
+    AC_DEFINE_UNQUOTED(uintmax_t, $ac_type,
+      [Define to unsigned long or unsigned long long
+       if <stdint.h> and <inttypes.h> don't define.])
+  else
+    AC_DEFINE(HAVE_UINTMAX_T, 1,
+      [Define if you have the 'uintmax_t' type in <stdint.h> or <inttypes.h>.])
+  fi
+])
+# ulonglong.m4 serial 2 (fileutils-4.0.32, gettext-0.10.40)
+dnl Copyright (C) 1999-2002 Free Software Foundation, Inc.
+dnl This file is free software, distributed under the terms of the GNU
+dnl General Public License.  As a special exception to the GNU General
+dnl Public License, this file may be distributed as part of a program
+dnl that contains a configuration script generated by Autoconf, under
+dnl the same distribution terms as the rest of that program.
+
+dnl From Paul Eggert.
+
+AC_DEFUN([jm_AC_TYPE_UNSIGNED_LONG_LONG],
+[
+  AC_CACHE_CHECK([for unsigned long long], ac_cv_type_unsigned_long_long,
+  [AC_TRY_LINK([unsigned long long ull = 1; int i = 63;],
+    [unsigned long long ullmax = (unsigned long long) -1;
+     return ull << i | ull >> i | ullmax / ull | ullmax % ull;],
+    ac_cv_type_unsigned_long_long=yes,
+    ac_cv_type_unsigned_long_long=no)])
+  if test $ac_cv_type_unsigned_long_long = yes; then
+    AC_DEFINE(HAVE_UNSIGNED_LONG_LONG, 1,
+      [Define if you have the unsigned long long type.])
+  fi
+])
diff --git a/ansi_stdlib.h b/ansi_stdlib.h
new file mode 100644 (file)
index 0000000..db13cd2
--- /dev/null
@@ -0,0 +1,54 @@
+/* ansi_stdlib.h -- An ANSI Standard stdlib.h. */
+/* A minimal stdlib.h containing extern declarations for those functions
+   that bash uses. */
+
+/* Copyright (C) 1993 Free Software Foundation, Inc.
+
+   This file is part of GNU Bash, the Bourne Again SHell.
+
+   Bash 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.
+
+   Bash 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 Bash; see the file COPYING.  If not, write to the Free Software
+   Foundation, 59 Temple Place, Suite 330, Boston, MA 02111 USA. */
+
+#if !defined (_STDLIB_H_)
+#define        _STDLIB_H_ 1
+
+/* String conversion functions. */
+extern int atoi ();
+
+extern double atof ();
+extern double strtod ();
+
+/* Memory allocation functions. */
+/* Generic pointer type. */
+#ifndef PTR_T
+
+#if defined (__STDC__)
+#  define PTR_T        void *
+#else
+#  define PTR_T char *
+#endif
+
+#endif /* PTR_T */
+
+extern PTR_T malloc ();
+extern PTR_T realloc ();
+extern void free ();
+
+/* Other miscellaneous functions. */
+extern void abort ();
+extern void exit ();
+extern char *getenv ();
+extern void qsort ();
+
+#endif /* _STDLIB_H  */
diff --git a/bind.c b/bind.c
new file mode 100644 (file)
index 0000000..08c906b
--- /dev/null
+++ b/bind.c
@@ -0,0 +1,2311 @@
+/* bind.c -- key binding and startup file support for the readline library. */
+
+/* Copyright (C) 1987-2006 Free Software Foundation, Inc.
+
+   This file is part of the GNU Readline Library, a library for
+   reading lines of text with interactive input and history editing.
+
+   The GNU Readline Library 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.
+
+   The GNU Readline Library is distributed in the hope that it will be
+   useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+   of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   The GNU General Public License is often shipped with GNU software, and
+   is generally kept in a file called COPYING or LICENSE.  If you do not
+   have a copy of the license, write to the Free Software Foundation,
+   59 Temple Place, Suite 330, Boston, MA 02111 USA. */
+
+#define READLINE_LIBRARY
+
+#if defined (__TANDEM)
+#  include <floss.h>
+#endif
+
+#if defined (HAVE_CONFIG_H)
+#  include <config.h>
+#endif
+
+#include <stdio.h>
+#include <sys/types.h>
+#include <fcntl.h>
+#if defined (HAVE_SYS_FILE_H)
+#  include <sys/file.h>
+#endif /* HAVE_SYS_FILE_H */
+
+#if defined (HAVE_UNISTD_H)
+#  include <unistd.h>
+#endif /* HAVE_UNISTD_H */
+
+#if defined (HAVE_STDLIB_H)
+#  include <stdlib.h>
+#else
+#  include "ansi_stdlib.h"
+#endif /* HAVE_STDLIB_H */
+
+#include <errno.h>
+
+#if !defined (errno)
+extern int errno;
+#endif /* !errno */
+
+#include "posixstat.h"
+
+/* System-specific feature definitions and include files. */
+#include "rldefs.h"
+
+/* Some standard library routines. */
+#include "readline.h"
+#include "history.h"
+
+#include "rlprivate.h"
+#include "rlshell.h"
+#include "xmalloc.h"
+
+#if !defined (strchr) && !defined (__STDC__)
+extern char *strchr (), *strrchr ();
+#endif /* !strchr && !__STDC__ */
+
+/* Variables exported by this file. */
+Keymap rl_binding_keymap;
+
+static char *_rl_read_file PARAMS((char *, size_t *));
+static void _rl_init_file_error PARAMS((const char *));
+static int _rl_read_init_file PARAMS((const char *, int));
+static int glean_key_from_name PARAMS((char *));
+static int find_boolean_var PARAMS((const char *));
+
+static char *_rl_get_string_variable_value PARAMS((const char *));
+static int substring_member_of_array PARAMS((char *, const char **));
+
+static int currently_reading_init_file;
+
+/* used only in this file */
+static int _rl_prefer_visible_bell = 1;
+
+/* **************************************************************** */
+/*                                                                 */
+/*                     Binding keys                                */
+/*                                                                 */
+/* **************************************************************** */
+
+/* rl_add_defun (char *name, rl_command_func_t *function, int key)
+   Add NAME to the list of named functions.  Make FUNCTION be the function
+   that gets called.  If KEY is not -1, then bind it. */
+int
+rl_add_defun (name, function, key)
+     const char *name;
+     rl_command_func_t *function;
+     int key;
+{
+  if (key != -1)
+    rl_bind_key (key, function);
+  rl_add_funmap_entry (name, function);
+  return 0;
+}
+
+/* Bind KEY to FUNCTION.  Returns non-zero if KEY is out of range. */
+int
+rl_bind_key (key, function)
+     int key;
+     rl_command_func_t *function;
+{
+  if (key < 0)
+    return (key);
+
+  if (META_CHAR (key) && _rl_convert_meta_chars_to_ascii)
+    {
+      if (_rl_keymap[ESC].type == ISKMAP)
+       {
+         Keymap escmap;
+
+         escmap = FUNCTION_TO_KEYMAP (_rl_keymap, ESC);
+         key = UNMETA (key);
+         escmap[key].type = ISFUNC;
+         escmap[key].function = function;
+         return (0);
+       }
+      return (key);
+    }
+
+  _rl_keymap[key].type = ISFUNC;
+  _rl_keymap[key].function = function;
+  rl_binding_keymap = _rl_keymap;
+  return (0);
+}
+
+/* Bind KEY to FUNCTION in MAP.  Returns non-zero in case of invalid
+   KEY. */
+int
+rl_bind_key_in_map (key, function, map)
+     int key;
+     rl_command_func_t *function;
+     Keymap map;
+{
+  int result;
+  Keymap oldmap;
+
+  oldmap = _rl_keymap;
+  _rl_keymap = map;
+  result = rl_bind_key (key, function);
+  _rl_keymap = oldmap;
+  return (result);
+}
+
+/* Bind key sequence KEYSEQ to DEFAULT_FUNC if KEYSEQ is unbound.  Right
+   now, this is always used to attempt to bind the arrow keys, hence the
+   check for rl_vi_movement_mode. */
+int
+rl_bind_key_if_unbound_in_map (key, default_func, kmap)
+     int key;
+     rl_command_func_t *default_func;
+     Keymap kmap;
+{
+  char keyseq[2];
+
+  keyseq[0] = (unsigned char)key;
+  keyseq[1] = '\0';
+  return (rl_bind_keyseq_if_unbound_in_map (keyseq, default_func, kmap));
+}
+
+int
+rl_bind_key_if_unbound (key, default_func)
+     int key;
+     rl_command_func_t *default_func;
+{
+  char keyseq[2];
+
+  keyseq[0] = (unsigned char)key;
+  keyseq[1] = '\0';
+  return (rl_bind_keyseq_if_unbound_in_map (keyseq, default_func, _rl_keymap));
+}
+
+/* Make KEY do nothing in the currently selected keymap.
+   Returns non-zero in case of error. */
+int
+rl_unbind_key (key)
+     int key;
+{
+  return (rl_bind_key (key, (rl_command_func_t *)NULL));
+}
+
+/* Make KEY do nothing in MAP.
+   Returns non-zero in case of error. */
+int
+rl_unbind_key_in_map (key, map)
+     int key;
+     Keymap map;
+{
+  return (rl_bind_key_in_map (key, (rl_command_func_t *)NULL, map));
+}
+
+/* Unbind all keys bound to FUNCTION in MAP. */
+int
+rl_unbind_function_in_map (func, map)
+     rl_command_func_t *func;
+     Keymap map;
+{
+  register int i, rval;
+
+  for (i = rval = 0; i < KEYMAP_SIZE; i++)
+    {
+      if (map[i].type == ISFUNC && map[i].function == func)
+       {
+         map[i].function = (rl_command_func_t *)NULL;
+         rval = 1;
+       }
+    }
+  return rval;
+}
+
+int
+rl_unbind_command_in_map (command, map)
+     const char *command;
+     Keymap map;
+{
+  rl_command_func_t *func;
+
+  func = rl_named_function (command);
+  if (func == 0)
+    return 0;
+  return (rl_unbind_function_in_map (func, map));
+}
+
+/* Bind the key sequence represented by the string KEYSEQ to
+   FUNCTION, starting in the current keymap.  This makes new
+   keymaps as necessary. */
+int
+rl_bind_keyseq (keyseq, function)
+     const char *keyseq;
+     rl_command_func_t *function;
+{
+  return (rl_generic_bind (ISFUNC, keyseq, (char *)function, _rl_keymap));
+}
+
+/* Bind the key sequence represented by the string KEYSEQ to
+   FUNCTION.  This makes new keymaps as necessary.  The initial
+   place to do bindings is in MAP. */
+int
+rl_bind_keyseq_in_map (keyseq, function, map)
+     const char *keyseq;
+     rl_command_func_t *function;
+     Keymap map;
+{
+  return (rl_generic_bind (ISFUNC, keyseq, (char *)function, map));
+}
+
+/* Backwards compatibility; equivalent to rl_bind_keyseq_in_map() */
+int
+rl_set_key (keyseq, function, map)
+     const char *keyseq;
+     rl_command_func_t *function;
+     Keymap map;
+{
+  return (rl_generic_bind (ISFUNC, keyseq, (char *)function, map));
+}
+
+/* Bind key sequence KEYSEQ to DEFAULT_FUNC if KEYSEQ is unbound.  Right
+   now, this is always used to attempt to bind the arrow keys, hence the
+   check for rl_vi_movement_mode. */
+int
+rl_bind_keyseq_if_unbound_in_map (keyseq, default_func, kmap)
+     const char *keyseq;
+     rl_command_func_t *default_func;
+     Keymap kmap;
+{
+  rl_command_func_t *func;
+
+  if (keyseq)
+    {
+      func = rl_function_of_keyseq (keyseq, kmap, (int *)NULL);
+#if defined (VI_MODE)
+      if (!func || func == rl_do_lowercase_version || func == rl_vi_movement_mode)
+#else
+      if (!func || func == rl_do_lowercase_version)
+#endif
+       return (rl_bind_keyseq_in_map (keyseq, default_func, kmap));
+      else
+       return 1;
+    }
+  return 0;
+}
+
+int
+rl_bind_keyseq_if_unbound (keyseq, default_func)
+     const char *keyseq;
+     rl_command_func_t *default_func;
+{
+  return (rl_bind_keyseq_if_unbound_in_map (keyseq, default_func, _rl_keymap));
+}
+
+/* Bind the key sequence represented by the string KEYSEQ to
+   the string of characters MACRO.  This makes new keymaps as
+   necessary.  The initial place to do bindings is in MAP. */
+int
+rl_macro_bind (keyseq, macro, map)
+     const char *keyseq, *macro;
+     Keymap map;
+{
+  char *macro_keys;
+  int macro_keys_len;
+
+  macro_keys = (char *)xmalloc ((2 * strlen (macro)) + 1);
+
+  if (rl_translate_keyseq (macro, macro_keys, &macro_keys_len))
+    {
+      free (macro_keys);
+      return -1;
+    }
+  rl_generic_bind (ISMACR, keyseq, macro_keys, map);
+  return 0;
+}
+
+/* Bind the key sequence represented by the string KEYSEQ to
+   the arbitrary pointer DATA.  TYPE says what kind of data is
+   pointed to by DATA, right now this can be a function (ISFUNC),
+   a macro (ISMACR), or a keymap (ISKMAP).  This makes new keymaps
+   as necessary.  The initial place to do bindings is in MAP. */
+int
+rl_generic_bind (type, keyseq, data, map)
+     int type;
+     const char *keyseq;
+     char *data;
+     Keymap map;
+{
+  char *keys;
+  int keys_len;
+  register int i;
+  KEYMAP_ENTRY k;
+
+  k.function = 0;
+
+  /* If no keys to bind to, exit right away. */
+  if (keyseq == 0 || *keyseq == 0)
+    {
+      if (type == ISMACR)
+       free (data);
+      return -1;
+    }
+
+  keys = (char *)xmalloc (1 + (2 * strlen (keyseq)));
+
+  /* Translate the ASCII representation of KEYSEQ into an array of
+     characters.  Stuff the characters into KEYS, and the length of
+     KEYS into KEYS_LEN. */
+  if (rl_translate_keyseq (keyseq, keys, &keys_len))
+    {
+      free (keys);
+      return -1;
+    }
+
+  /* Bind keys, making new keymaps as necessary. */
+  for (i = 0; i < keys_len; i++)
+    {
+      unsigned char uc = keys[i];
+      int ic;
+
+      ic = uc;
+      if (ic < 0 || ic >= KEYMAP_SIZE)
+        {
+          free (keys);
+         return -1;
+        }
+
+      if (META_CHAR (ic) && _rl_convert_meta_chars_to_ascii)
+       {
+         ic = UNMETA (ic);
+         if (map[ESC].type == ISKMAP)
+           map = FUNCTION_TO_KEYMAP (map, ESC);
+       }
+
+      if ((i + 1) < keys_len)
+       {
+         if (map[ic].type != ISKMAP)
+           {
+             /* We allow subsequences of keys.  If a keymap is being
+                created that will `shadow' an existing function or macro
+                key binding, we save that keybinding into the ANYOTHERKEY
+                index in the new map.  The dispatch code will look there
+                to find the function to execute if the subsequence is not
+                matched.  ANYOTHERKEY was chosen to be greater than
+                UCHAR_MAX. */
+             k = map[ic];
+
+             map[ic].type = ISKMAP;
+             map[ic].function = KEYMAP_TO_FUNCTION (rl_make_bare_keymap());
+           }
+         map = FUNCTION_TO_KEYMAP (map, ic);
+         /* The dispatch code will return this function if no matching
+            key sequence is found in the keymap.  This (with a little
+            help from the dispatch code in readline.c) allows `a' to be
+            mapped to something, `abc' to be mapped to something else,
+            and the function bound  to `a' to be executed when the user
+            types `abx', leaving `bx' in the input queue. */
+         if (k.function && ((k.type == ISFUNC && k.function != rl_do_lowercase_version) || k.type == ISMACR))
+           {
+             map[ANYOTHERKEY] = k;
+             k.function = 0;
+           }
+       }
+      else
+       {
+         if (map[ic].type == ISMACR)
+           free ((char *)map[ic].function);
+         else if (map[ic].type == ISKMAP)
+           {
+             map = FUNCTION_TO_KEYMAP (map, ic);
+             ic = ANYOTHERKEY;
+           }
+
+         map[ic].function = KEYMAP_TO_FUNCTION (data);
+         map[ic].type = type;
+       }
+
+      rl_binding_keymap = map;
+    }
+  free (keys);
+  return 0;
+}
+
+/* Translate the ASCII representation of SEQ, stuffing the values into ARRAY,
+   an array of characters.  LEN gets the final length of ARRAY.  Return
+   non-zero if there was an error parsing SEQ. */
+int
+rl_translate_keyseq (seq, array, len)
+     const char *seq;
+     char *array;
+     int *len;
+{
+  register int i, c, l, temp;
+
+  for (i = l = 0; c = seq[i]; i++)
+    {
+      if (c == '\\')
+       {
+         c = seq[++i];
+
+         if (c == 0)
+           break;
+
+         /* Handle \C- and \M- prefixes. */
+         if ((c == 'C' || c == 'M') && seq[i + 1] == '-')
+           {
+             /* Handle special case of backwards define. */
+             if (strncmp (&seq[i], "C-\\M-", 5) == 0)
+               {
+                 array[l++] = ESC;     /* ESC is meta-prefix */
+                 i += 5;
+                 array[l++] = CTRL (_rl_to_upper (seq[i]));
+                 if (seq[i] == '\0')
+                   i--;
+               }
+             else if (c == 'M')
+               {
+                 i++;          /* seq[i] == '-' */
+                 /* XXX - obey convert-meta setting */
+                 if (_rl_convert_meta_chars_to_ascii && _rl_keymap[ESC].type == ISKMAP)
+                   array[l++] = ESC;   /* ESC is meta-prefix */
+                 else if (seq[i+1] == '\\' && seq[i+2] == 'C' && seq[i+3] == '-')
+                   {
+                     i += 4;
+                     temp = (seq[i] == '?') ? RUBOUT : CTRL (_rl_to_upper (seq[i]));
+                     array[l++] = META (temp);
+                   }
+                 else
+                   {
+                     /* This doesn't yet handle things like \M-\a, which may
+                        or may not have any reasonable meaning.  You're
+                        probably better off using straight octal or hex. */
+                     i++;
+                     array[l++] = META (seq[i]);
+                   }
+               }
+             else if (c == 'C')
+               {
+                 i += 2;
+                 /* Special hack for C-?... */
+                 array[l++] = (seq[i] == '?') ? RUBOUT : CTRL (_rl_to_upper (seq[i]));
+               }
+             continue;
+           }         
+
+         /* Translate other backslash-escaped characters.  These are the
+            same escape sequences that bash's `echo' and `printf' builtins
+            handle, with the addition of \d -> RUBOUT.  A backslash
+            preceding a character that is not special is stripped. */
+         switch (c)
+           {
+           case 'a':
+             array[l++] = '\007';
+             break;
+           case 'b':
+             array[l++] = '\b';
+             break;
+           case 'd':
+             array[l++] = RUBOUT;      /* readline-specific */
+             break;
+           case 'e':
+             array[l++] = ESC;
+             break;
+           case 'f':
+             array[l++] = '\f';
+             break;
+           case 'n':
+             array[l++] = NEWLINE;
+             break;
+           case 'r':
+             array[l++] = RETURN;
+             break;
+           case 't':
+             array[l++] = TAB;
+             break;
+           case 'v':
+             array[l++] = 0x0B;
+             break;
+           case '\\':
+             array[l++] = '\\';
+             break;
+           case '0': case '1': case '2': case '3':
+           case '4': case '5': case '6': case '7':
+             i++;
+             for (temp = 2, c -= '0'; ISOCTAL (seq[i]) && temp--; i++)
+               c = (c * 8) + OCTVALUE (seq[i]);
+             i--;      /* auto-increment in for loop */
+             array[l++] = c & largest_char;
+             break;
+           case 'x':
+             i++;
+             for (temp = 2, c = 0; ISXDIGIT ((unsigned char)seq[i]) && temp--; i++)
+               c = (c * 16) + HEXVALUE (seq[i]);
+             if (temp == 2)
+               c = 'x';
+             i--;      /* auto-increment in for loop */
+             array[l++] = c & largest_char;
+             break;
+           default:    /* backslashes before non-special chars just add the char */
+             array[l++] = c;
+             break;    /* the backslash is stripped */
+           }
+         continue;
+       }
+
+      array[l++] = c;
+    }
+
+  *len = l;
+  array[l] = '\0';
+  return (0);
+}
+
+char *
+rl_untranslate_keyseq (seq)
+     int seq;
+{
+  static char kseq[16];
+  int i, c;
+
+  i = 0;
+  c = seq;
+  if (META_CHAR (c))
+    {
+      kseq[i++] = '\\';
+      kseq[i++] = 'M';
+      kseq[i++] = '-';
+      c = UNMETA (c);
+    }
+  else if (c == ESC)
+    {
+      kseq[i++] = '\\';
+      c = 'e';
+    }
+  else if (CTRL_CHAR (c))
+    {
+      kseq[i++] = '\\';
+      kseq[i++] = 'C';
+      kseq[i++] = '-';
+      c = _rl_to_lower (UNCTRL (c));
+    }
+  else if (c == RUBOUT)
+    {
+      kseq[i++] = '\\';
+      kseq[i++] = 'C';
+      kseq[i++] = '-';
+      c = '?';
+    }
+
+  if (c == ESC)
+    {
+      kseq[i++] = '\\';
+      c = 'e';
+    }
+  else if (c == '\\' || c == '"')
+    {
+      kseq[i++] = '\\';
+    }
+
+  kseq[i++] = (unsigned char) c;
+  kseq[i] = '\0';
+  return kseq;
+}
+
+static char *
+_rl_untranslate_macro_value (seq)
+     char *seq;
+{
+  char *ret, *r, *s;
+  int c;
+
+  r = ret = (char *)xmalloc (7 * strlen (seq) + 1);
+  for (s = seq; *s; s++)
+    {
+      c = *s;
+      if (META_CHAR (c))
+       {
+         *r++ = '\\';
+         *r++ = 'M';
+         *r++ = '-';
+         c = UNMETA (c);
+       }
+      else if (c == ESC)
+       {
+         *r++ = '\\';
+         c = 'e';
+       }
+      else if (CTRL_CHAR (c))
+       {
+         *r++ = '\\';
+         *r++ = 'C';
+         *r++ = '-';
+         c = _rl_to_lower (UNCTRL (c));
+       }
+      else if (c == RUBOUT)
+       {
+         *r++ = '\\';
+         *r++ = 'C';
+         *r++ = '-';
+         c = '?';
+       }
+
+      if (c == ESC)
+       {
+         *r++ = '\\';
+         c = 'e';
+       }
+      else if (c == '\\' || c == '"')
+       *r++ = '\\';
+
+      *r++ = (unsigned char)c;
+    }
+  *r = '\0';
+  return ret;
+}
+
+/* Return a pointer to the function that STRING represents.
+   If STRING doesn't have a matching function, then a NULL pointer
+   is returned. */
+rl_command_func_t *
+rl_named_function (string)
+     const char *string;
+{
+  register int i;
+
+  rl_initialize_funmap ();
+
+  for (i = 0; funmap[i]; i++)
+    if (_rl_stricmp (funmap[i]->name, string) == 0)
+      return (funmap[i]->function);
+  return ((rl_command_func_t *)NULL);
+}
+
+/* Return the function (or macro) definition which would be invoked via
+   KEYSEQ if executed in MAP.  If MAP is NULL, then the current keymap is
+   used.  TYPE, if non-NULL, is a pointer to an int which will receive the
+   type of the object pointed to.  One of ISFUNC (function), ISKMAP (keymap),
+   or ISMACR (macro). */
+rl_command_func_t *
+rl_function_of_keyseq (keyseq, map, type)
+     const char *keyseq;
+     Keymap map;
+     int *type;
+{
+  register int i;
+
+  if (map == 0)
+    map = _rl_keymap;
+
+  for (i = 0; keyseq && keyseq[i]; i++)
+    {
+      unsigned char ic = keyseq[i];
+
+      if (META_CHAR (ic) && _rl_convert_meta_chars_to_ascii)
+       {
+         if (map[ESC].type == ISKMAP)
+           {
+             map = FUNCTION_TO_KEYMAP (map, ESC);
+             ic = UNMETA (ic);
+           }
+         /* XXX - should we just return NULL here, since this obviously
+            doesn't match? */
+         else
+           {
+             if (type)
+               *type = map[ESC].type;
+
+             return (map[ESC].function);
+           }
+       }
+
+      if (map[ic].type == ISKMAP)
+       {
+         /* If this is the last key in the key sequence, return the
+            map. */
+         if (keyseq[i + 1] == '\0')
+           {
+             if (type)
+               *type = ISKMAP;
+
+             return (map[ic].function);
+           }
+         else
+           map = FUNCTION_TO_KEYMAP (map, ic);
+       }
+      /* If we're not at the end of the key sequence, and the current key
+        is bound to something other than a keymap, then the entire key
+        sequence is not bound. */
+      else if (map[ic].type != ISKMAP && keyseq[i+1])
+       return ((rl_command_func_t *)NULL);
+      else     /* map[ic].type != ISKMAP && keyseq[i+1] == 0 */
+       {
+         if (type)
+           *type = map[ic].type;
+
+         return (map[ic].function);
+       }
+    }
+  return ((rl_command_func_t *) NULL);
+}
+
+/* The last key bindings file read. */
+static char *last_readline_init_file = (char *)NULL;
+
+/* The file we're currently reading key bindings from. */
+static const char *current_readline_init_file;
+static int current_readline_init_include_level;
+static int current_readline_init_lineno;
+
+/* Read FILENAME into a locally-allocated buffer and return the buffer.
+   The size of the buffer is returned in *SIZEP.  Returns NULL if any
+   errors were encountered. */
+static char *
+_rl_read_file (filename, sizep)
+     char *filename;
+     size_t *sizep;
+{
+  struct stat finfo;
+  size_t file_size;
+  char *buffer;
+  int i, file;
+
+  if ((stat (filename, &finfo) < 0) || (file = open (filename, O_RDONLY, 0666)) < 0)
+    return ((char *)NULL);
+
+  file_size = (size_t)finfo.st_size;
+
+  /* check for overflow on very large files */
+  if (file_size != finfo.st_size || file_size + 1 < file_size)
+    {
+      if (file >= 0)
+       close (file);
+#if defined (EFBIG)
+      errno = EFBIG;
+#endif
+      return ((char *)NULL);
+    }
+
+  /* Read the file into BUFFER. */
+  buffer = (char *)xmalloc (file_size + 1);
+  i = read (file, buffer, file_size);
+  close (file);
+
+  if (i < 0)
+    {
+      free (buffer);
+      return ((char *)NULL);
+    }
+
+  buffer[i] = '\0';
+  if (sizep)
+    *sizep = i;
+
+  return (buffer);
+}
+
+/* Re-read the current keybindings file. */
+int
+rl_re_read_init_file (count, ignore)
+     int count, ignore;
+{
+  int r;
+  r = rl_read_init_file ((const char *)NULL);
+  rl_set_keymap_from_edit_mode ();
+  return r;
+}
+
+/* Do key bindings from a file.  If FILENAME is NULL it defaults
+   to the first non-null filename from this list:
+     1. the filename used for the previous call
+     2. the value of the shell variable `INPUTRC'
+     3. ~/.inputrc
+     4. /etc/inputrc
+   If the file existed and could be opened and read, 0 is returned,
+   otherwise errno is returned. */
+int
+rl_read_init_file (filename)
+     const char *filename;
+{
+  /* Default the filename. */
+  if (filename == 0)
+    filename = last_readline_init_file;
+  if (filename == 0)
+    filename = sh_get_env_value ("INPUTRC");
+  if (filename == 0 || *filename == 0)
+    {
+      filename = DEFAULT_INPUTRC;
+      /* Try to read DEFAULT_INPUTRC; fall back to SYS_INPUTRC on failure */
+      if (_rl_read_init_file (filename, 0) == 0)
+       return 0;
+      filename = SYS_INPUTRC;
+    }
+
+#if defined (__MSDOS__)
+  if (_rl_read_init_file (filename, 0) == 0)
+    return 0;
+  filename = "~/_inputrc";
+#endif
+  return (_rl_read_init_file (filename, 0));
+}
+
+static int
+_rl_read_init_file (filename, include_level)
+     const char *filename;
+     int include_level;
+{
+  register int i;
+  char *buffer, *openname, *line, *end;
+  size_t file_size;
+
+  current_readline_init_file = filename;
+  current_readline_init_include_level = include_level;
+
+  openname = tilde_expand (filename);
+  buffer = _rl_read_file (openname, &file_size);
+  free (openname);
+
+  if (buffer == 0)
+    return (errno);
+  
+  if (include_level == 0 && filename != last_readline_init_file)
+    {
+      FREE (last_readline_init_file);
+      last_readline_init_file = savestring (filename);
+    }
+
+  currently_reading_init_file = 1;
+
+  /* Loop over the lines in the file.  Lines that start with `#' are
+     comments; all other lines are commands for readline initialization. */
+  current_readline_init_lineno = 1;
+  line = buffer;
+  end = buffer + file_size;
+  while (line < end)
+    {
+      /* Find the end of this line. */
+      for (i = 0; line + i != end && line[i] != '\n'; i++);
+
+#if defined (__CYGWIN__)
+      /* ``Be liberal in what you accept.'' */
+      if (line[i] == '\n' && line[i-1] == '\r')
+       line[i - 1] = '\0';
+#endif
+
+      /* Mark end of line. */
+      line[i] = '\0';
+
+      /* Skip leading whitespace. */
+      while (*line && whitespace (*line))
+        {
+         line++;
+         i--;
+        }
+
+      /* If the line is not a comment, then parse it. */
+      if (*line && *line != '#')
+       rl_parse_and_bind (line);
+
+      /* Move to the next line. */
+      line += i + 1;
+      current_readline_init_lineno++;
+    }
+
+  free (buffer);
+  currently_reading_init_file = 0;
+  return (0);
+}
+
+static void
+_rl_init_file_error (msg)
+     const char *msg;
+{
+  if (currently_reading_init_file)
+    fprintf (stderr, "readline: %s: line %d: %s\n", current_readline_init_file,
+                    current_readline_init_lineno, msg);
+  else
+    fprintf (stderr, "readline: %s\n", msg);
+}
+
+/* **************************************************************** */
+/*                                                                 */
+/*                     Parser Directives                           */
+/*                                                                 */
+/* **************************************************************** */
+
+typedef int _rl_parser_func_t PARAMS((char *));
+
+/* Things that mean `Control'. */
+const char *_rl_possible_control_prefixes[] = {
+  "Control-", "C-", "CTRL-", (const char *)NULL
+};
+
+const char *_rl_possible_meta_prefixes[] = {
+  "Meta", "M-", (const char *)NULL
+};
+
+/* Conditionals. */
+
+/* Calling programs set this to have their argv[0]. */
+const char *rl_readline_name = "other";
+
+/* Stack of previous values of parsing_conditionalized_out. */
+static unsigned char *if_stack = (unsigned char *)NULL;
+static int if_stack_depth;
+static int if_stack_size;
+
+/* Push _rl_parsing_conditionalized_out, and set parser state based
+   on ARGS. */
+static int
+parser_if (args)
+     char *args;
+{
+  register int i;
+
+  /* Push parser state. */
+  if (if_stack_depth + 1 >= if_stack_size)
+    {
+      if (!if_stack)
+       if_stack = (unsigned char *)xmalloc (if_stack_size = 20);
+      else
+       if_stack = (unsigned char *)xrealloc (if_stack, if_stack_size += 20);
+    }
+  if_stack[if_stack_depth++] = _rl_parsing_conditionalized_out;
+
+  /* If parsing is turned off, then nothing can turn it back on except
+     for finding the matching endif.  In that case, return right now. */
+  if (_rl_parsing_conditionalized_out)
+    return 0;
+
+  /* Isolate first argument. */
+  for (i = 0; args[i] && !whitespace (args[i]); i++);
+
+  if (args[i])
+    args[i++] = '\0';
+
+  /* Handle "$if term=foo" and "$if mode=emacs" constructs.  If this
+     isn't term=foo, or mode=emacs, then check to see if the first
+     word in ARGS is the same as the value stored in rl_readline_name. */
+  if (rl_terminal_name && _rl_strnicmp (args, "term=", 5) == 0)
+    {
+      char *tem, *tname;
+
+      /* Terminals like "aaa-60" are equivalent to "aaa". */
+      tname = savestring (rl_terminal_name);
+      tem = strchr (tname, '-');
+      if (tem)
+       *tem = '\0';
+
+      /* Test the `long' and `short' forms of the terminal name so that
+        if someone has a `sun-cmd' and does not want to have bindings
+        that will be executed if the terminal is a `sun', they can put
+        `$if term=sun-cmd' into their .inputrc. */
+      _rl_parsing_conditionalized_out = _rl_stricmp (args + 5, tname) &&
+                                       _rl_stricmp (args + 5, rl_terminal_name);
+      free (tname);
+    }
+#if defined (VI_MODE)
+  else if (_rl_strnicmp (args, "mode=", 5) == 0)
+    {
+      int mode;
+
+      if (_rl_stricmp (args + 5, "emacs") == 0)
+       mode = emacs_mode;
+      else if (_rl_stricmp (args + 5, "vi") == 0)
+       mode = vi_mode;
+      else
+       mode = no_mode;
+
+      _rl_parsing_conditionalized_out = mode != rl_editing_mode;
+    }
+#endif /* VI_MODE */
+  /* Check to see if the first word in ARGS is the same as the
+     value stored in rl_readline_name. */
+  else if (_rl_stricmp (args, rl_readline_name) == 0)
+    _rl_parsing_conditionalized_out = 0;
+  else
+    _rl_parsing_conditionalized_out = 1;
+  return 0;
+}
+
+/* Invert the current parser state if there is anything on the stack. */
+static int
+parser_else (args)
+     char *args;
+{
+  register int i;
+
+  if (if_stack_depth == 0)
+    {
+      _rl_init_file_error ("$else found without matching $if");
+      return 0;
+    }
+
+#if 0
+  /* Check the previous (n - 1) levels of the stack to make sure that
+     we haven't previously turned off parsing. */
+  for (i = 0; i < if_stack_depth - 1; i++)
+#else
+  /* Check the previous (n) levels of the stack to make sure that
+     we haven't previously turned off parsing. */
+  for (i = 0; i < if_stack_depth; i++)
+#endif
+    if (if_stack[i] == 1)
+      return 0;
+
+  /* Invert the state of parsing if at top level. */
+  _rl_parsing_conditionalized_out = !_rl_parsing_conditionalized_out;
+  return 0;
+}
+
+/* Terminate a conditional, popping the value of
+   _rl_parsing_conditionalized_out from the stack. */
+static int
+parser_endif (args)
+     char *args;
+{
+  if (if_stack_depth)
+    _rl_parsing_conditionalized_out = if_stack[--if_stack_depth];
+  else
+    _rl_init_file_error ("$endif without matching $if");
+  return 0;
+}
+
+static int
+parser_include (args)
+     char *args;
+{
+  const char *old_init_file;
+  char *e;
+  int old_line_number, old_include_level, r;
+
+  if (_rl_parsing_conditionalized_out)
+    return (0);
+
+  old_init_file = current_readline_init_file;
+  old_line_number = current_readline_init_lineno;
+  old_include_level = current_readline_init_include_level;
+
+  e = strchr (args, '\n');
+  if (e)
+    *e = '\0';
+  r = _rl_read_init_file ((const char *)args, old_include_level + 1);
+
+  current_readline_init_file = old_init_file;
+  current_readline_init_lineno = old_line_number;
+  current_readline_init_include_level = old_include_level;
+
+  return r;
+}
+  
+/* Associate textual names with actual functions. */
+static struct {
+  const char *name;
+  _rl_parser_func_t *function;
+} parser_directives [] = {
+  { "if", parser_if },
+  { "endif", parser_endif },
+  { "else", parser_else },
+  { "include", parser_include },
+  { (char *)0x0, (_rl_parser_func_t *)0x0 }
+};
+
+/* Handle a parser directive.  STATEMENT is the line of the directive
+   without any leading `$'. */
+static int
+handle_parser_directive (statement)
+     char *statement;
+{
+  register int i;
+  char *directive, *args;
+
+  /* Isolate the actual directive. */
+
+  /* Skip whitespace. */
+  for (i = 0; whitespace (statement[i]); i++);
+
+  directive = &statement[i];
+
+  for (; statement[i] && !whitespace (statement[i]); i++);
+
+  if (statement[i])
+    statement[i++] = '\0';
+
+  for (; statement[i] && whitespace (statement[i]); i++);
+
+  args = &statement[i];
+
+  /* Lookup the command, and act on it. */
+  for (i = 0; parser_directives[i].name; i++)
+    if (_rl_stricmp (directive, parser_directives[i].name) == 0)
+      {
+       (*parser_directives[i].function) (args);
+       return (0);
+      }
+
+  /* display an error message about the unknown parser directive */
+  _rl_init_file_error ("unknown parser directive");
+  return (1);
+}
+
+/* Read the binding command from STRING and perform it.
+   A key binding command looks like: Keyname: function-name\0,
+   a variable binding command looks like: set variable value.
+   A new-style keybinding looks like "\C-x\C-x": exchange-point-and-mark. */
+int
+rl_parse_and_bind (string)
+     char *string;
+{
+  char *funname, *kname;
+  register int c, i;
+  int key, equivalency;
+
+  while (string && whitespace (*string))
+    string++;
+
+  if (!string || !*string || *string == '#')
+    return 0;
+
+  /* If this is a parser directive, act on it. */
+  if (*string == '$')
+    {
+      handle_parser_directive (&string[1]);
+      return 0;
+    }
+
+  /* If we aren't supposed to be parsing right now, then we're done. */
+  if (_rl_parsing_conditionalized_out)
+    return 0;
+
+  i = 0;
+  /* If this keyname is a complex key expression surrounded by quotes,
+     advance to after the matching close quote.  This code allows the
+     backslash to quote characters in the key expression. */
+  if (*string == '"')
+    {
+      int passc = 0;
+
+      for (i = 1; c = string[i]; i++)
+       {
+         if (passc)
+           {
+             passc = 0;
+             continue;
+           }
+
+         if (c == '\\')
+           {
+             passc++;
+             continue;
+           }
+
+         if (c == '"')
+           break;
+       }
+      /* If we didn't find a closing quote, abort the line. */
+      if (string[i] == '\0')
+        {
+          _rl_init_file_error ("no closing `\"' in key binding");
+          return 1;
+        }
+    }
+
+  /* Advance to the colon (:) or whitespace which separates the two objects. */
+  for (; (c = string[i]) && c != ':' && c != ' ' && c != '\t'; i++ );
+
+  equivalency = (c == ':' && string[i + 1] == '=');
+
+  /* Mark the end of the command (or keyname). */
+  if (string[i])
+    string[i++] = '\0';
+
+  /* If doing assignment, skip the '=' sign as well. */
+  if (equivalency)
+    string[i++] = '\0';
+
+  /* If this is a command to set a variable, then do that. */
+  if (_rl_stricmp (string, "set") == 0)
+    {
+      char *var, *value, *e;
+
+      var = string + i;
+      /* Make VAR point to start of variable name. */
+      while (*var && whitespace (*var)) var++;
+
+      /* Make VALUE point to start of value string. */
+      value = var;
+      while (*value && !whitespace (*value)) value++;
+      if (*value)
+       *value++ = '\0';
+      while (*value && whitespace (*value)) value++;
+
+      /* Strip trailing whitespace from values to boolean variables.  Temp
+        fix until I get a real quoted-string parser here. */
+      i = find_boolean_var (var);
+      if (i >= 0)
+       {
+         /* remove trailing whitespace */
+         e = value + strlen (value) - 1;
+         while (e >= value && whitespace (*e))
+           e--;
+         e++;          /* skip back to whitespace or EOS */
+         if (*e && e >= value)
+           *e = '\0';
+       }
+
+      rl_variable_bind (var, value);
+      return 0;
+    }
+
+  /* Skip any whitespace between keyname and funname. */
+  for (; string[i] && whitespace (string[i]); i++);
+  funname = &string[i];
+
+  /* Now isolate funname.
+     For straight function names just look for whitespace, since
+     that will signify the end of the string.  But this could be a
+     macro definition.  In that case, the string is quoted, so skip
+     to the matching delimiter.  We allow the backslash to quote the
+     delimiter characters in the macro body. */
+  /* This code exists to allow whitespace in macro expansions, which
+     would otherwise be gobbled up by the next `for' loop.*/
+  /* XXX - it may be desirable to allow backslash quoting only if " is
+     the quoted string delimiter, like the shell. */
+  if (*funname == '\'' || *funname == '"')
+    {
+      int delimiter, passc;
+
+      delimiter = string[i++];
+      for (passc = 0; c = string[i]; i++)
+       {
+         if (passc)
+           {
+             passc = 0;
+             continue;
+           }
+
+         if (c == '\\')
+           {
+             passc = 1;
+             continue;
+           }
+
+         if (c == delimiter)
+           break;
+       }
+      if (c)
+       i++;
+    }
+
+  /* Advance to the end of the string.  */
+  for (; string[i] && !whitespace (string[i]); i++);
+
+  /* No extra whitespace at the end of the string. */
+  string[i] = '\0';
+
+  /* Handle equivalency bindings here.  Make the left-hand side be exactly
+     whatever the right-hand evaluates to, including keymaps. */
+  if (equivalency)
+    {
+      return 0;
+    }
+
+  /* If this is a new-style key-binding, then do the binding with
+     rl_bind_keyseq ().  Otherwise, let the older code deal with it. */
+  if (*string == '"')
+    {
+      char *seq;
+      register int j, k, passc;
+
+      seq = (char *)xmalloc (1 + strlen (string));
+      for (j = 1, k = passc = 0; string[j]; j++)
+       {
+         /* Allow backslash to quote characters, but leave them in place.
+            This allows a string to end with a backslash quoting another
+            backslash, or with a backslash quoting a double quote.  The
+            backslashes are left in place for rl_translate_keyseq (). */
+         if (passc || (string[j] == '\\'))
+           {
+             seq[k++] = string[j];
+             passc = !passc;
+             continue;
+           }
+
+         if (string[j] == '"')
+           break;
+
+         seq[k++] = string[j];
+       }
+      seq[k] = '\0';
+
+      /* Binding macro? */
+      if (*funname == '\'' || *funname == '"')
+       {
+         j = strlen (funname);
+
+         /* Remove the delimiting quotes from each end of FUNNAME. */
+         if (j && funname[j - 1] == *funname)
+           funname[j - 1] = '\0';
+
+         rl_macro_bind (seq, &funname[1], _rl_keymap);
+       }
+      else
+       rl_bind_keyseq (seq, rl_named_function (funname));
+
+      free (seq);
+      return 0;
+    }
+
+  /* Get the actual character we want to deal with. */
+  kname = strrchr (string, '-');
+  if (!kname)
+    kname = string;
+  else
+    kname++;
+
+  key = glean_key_from_name (kname);
+
+  /* Add in control and meta bits. */
+  if (substring_member_of_array (string, _rl_possible_control_prefixes))
+    key = CTRL (_rl_to_upper (key));
+
+  if (substring_member_of_array (string, _rl_possible_meta_prefixes))
+    key = META (key);
+
+  /* Temporary.  Handle old-style keyname with macro-binding. */
+  if (*funname == '\'' || *funname == '"')
+    {
+      char useq[2];
+      int fl = strlen (funname);
+
+      useq[0] = key; useq[1] = '\0';
+      if (fl && funname[fl - 1] == *funname)
+       funname[fl - 1] = '\0';
+
+      rl_macro_bind (useq, &funname[1], _rl_keymap);
+    }
+#if defined (PREFIX_META_HACK)
+  /* Ugly, but working hack to keep prefix-meta around. */
+  else if (_rl_stricmp (funname, "prefix-meta") == 0)
+    {
+      char seq[2];
+
+      seq[0] = key;
+      seq[1] = '\0';
+      rl_generic_bind (ISKMAP, seq, (char *)emacs_meta_keymap, _rl_keymap);
+    }
+#endif /* PREFIX_META_HACK */
+  else
+    rl_bind_key (key, rl_named_function (funname));
+  return 0;
+}
+
+/* Simple structure for boolean readline variables (i.e., those that can
+   have one of two values; either "On" or 1 for truth, or "Off" or 0 for
+   false. */
+
+#define V_SPECIAL      0x1
+
+static struct {
+  const char *name;
+  int *value;
+  int flags;
+} boolean_varlist [] = {
+  { "bind-tty-special-chars",  &_rl_bind_stty_chars,           0 },
+  { "blink-matching-paren",    &rl_blink_matching_paren,       V_SPECIAL },
+  { "byte-oriented",           &rl_byte_oriented,              0 },
+  { "completion-ignore-case",  &_rl_completion_case_fold,      0 },
+  { "convert-meta",            &_rl_convert_meta_chars_to_ascii, 0 },
+  { "disable-completion",      &rl_inhibit_completion,         0 },
+  { "enable-keypad",           &_rl_enable_keypad,             0 },
+  { "expand-tilde",            &rl_complete_with_tilde_expansion, 0 },
+  { "history-preserve-point",  &_rl_history_preserve_point,    0 },
+  { "horizontal-scroll-mode",  &_rl_horizontal_scroll_mode,    0 },
+  { "input-meta",              &_rl_meta_flag,                 0 },
+  { "mark-directories",                &_rl_complete_mark_directories, 0 },
+  { "mark-modified-lines",     &_rl_mark_modified_lines,       0 },
+  { "mark-symlinked-directories", &_rl_complete_mark_symlink_dirs, 0 },
+  { "match-hidden-files",      &_rl_match_hidden_files,        0 },
+  { "meta-flag",               &_rl_meta_flag,                 0 },
+  { "output-meta",             &_rl_output_meta_chars,         0 },
+  { "page-completions",                &_rl_page_completions,          0 },
+  { "prefer-visible-bell",     &_rl_prefer_visible_bell,       V_SPECIAL },
+  { "print-completions-horizontally", &_rl_print_completions_horizontally, 0 },
+  { "show-all-if-ambiguous",   &_rl_complete_show_all,         0 },
+  { "show-all-if-unmodified",  &_rl_complete_show_unmodified,  0 },
+#if defined (VISIBLE_STATS)
+  { "visible-stats",           &rl_visible_stats,              0 },
+#endif /* VISIBLE_STATS */
+  { (char *)NULL, (int *)NULL }
+};
+
+static int
+find_boolean_var (name)
+     const char *name;
+{
+  register int i;
+
+  for (i = 0; boolean_varlist[i].name; i++)
+    if (_rl_stricmp (name, boolean_varlist[i].name) == 0)
+      return i;
+  return -1;
+}
+
+/* Hooks for handling special boolean variables, where a
+   function needs to be called or another variable needs
+   to be changed when they're changed. */
+static void
+hack_special_boolean_var (i)
+     int i;
+{
+  const char *name;
+
+  name = boolean_varlist[i].name;
+
+  if (_rl_stricmp (name, "blink-matching-paren") == 0)
+    _rl_enable_paren_matching (rl_blink_matching_paren);
+  else if (_rl_stricmp (name, "prefer-visible-bell") == 0)
+    {
+      if (_rl_prefer_visible_bell)
+       _rl_bell_preference = VISIBLE_BELL;
+      else
+       _rl_bell_preference = AUDIBLE_BELL;
+    }
+}
+
+typedef int _rl_sv_func_t PARAMS((const char *));
+
+/* These *must* correspond to the array indices for the appropriate
+   string variable.  (Though they're not used right now.) */
+#define V_BELLSTYLE    0
+#define V_COMBEGIN     1
+#define V_EDITMODE     2
+#define V_ISRCHTERM    3
+#define V_KEYMAP       4
+
+#define        V_STRING        1
+#define V_INT          2
+
+/* Forward declarations */
+static int sv_bell_style PARAMS((const char *));
+static int sv_combegin PARAMS((const char *));
+static int sv_compquery PARAMS((const char *));
+static int sv_editmode PARAMS((const char *));
+static int sv_isrchterm PARAMS((const char *));
+static int sv_keymap PARAMS((const char *));
+
+static struct {
+  const char *name;
+  int flags;
+  _rl_sv_func_t *set_func;
+} string_varlist[] = {
+  { "bell-style",      V_STRING,       sv_bell_style },
+  { "comment-begin",   V_STRING,       sv_combegin },
+  { "completion-query-items", V_INT,   sv_compquery },
+  { "editing-mode",    V_STRING,       sv_editmode },
+  { "isearch-terminators", V_STRING,   sv_isrchterm },
+  { "keymap",          V_STRING,       sv_keymap },
+  { (char *)NULL,      0 }
+};
+
+static int
+find_string_var (name)
+     const char *name;
+{
+  register int i;
+
+  for (i = 0; string_varlist[i].name; i++)
+    if (_rl_stricmp (name, string_varlist[i].name) == 0)
+      return i;
+  return -1;
+}
+
+/* A boolean value that can appear in a `set variable' command is true if
+   the value is null or empty, `on' (case-insenstive), or "1".  Any other
+   values result in 0 (false). */
+static int
+bool_to_int (value)
+     const char *value;
+{
+  return (value == 0 || *value == '\0' ||
+               (_rl_stricmp (value, "on") == 0) ||
+               (value[0] == '1' && value[1] == '\0'));
+}
+
+char *
+rl_variable_value (name)
+     const char *name;
+{
+  register int i;
+
+  /* Check for simple variables first. */
+  i = find_boolean_var (name);
+  if (i >= 0)
+    return (*boolean_varlist[i].value ? "on" : "off");
+
+  i = find_string_var (name);
+  if (i >= 0)
+    return (_rl_get_string_variable_value (string_varlist[i].name));
+
+  /* Unknown variable names return NULL. */
+  return 0;
+}
+
+int
+rl_variable_bind (name, value)
+     const char *name, *value;
+{
+  register int i;
+  int  v;
+
+  /* Check for simple variables first. */
+  i = find_boolean_var (name);
+  if (i >= 0)
+    {
+      *boolean_varlist[i].value = bool_to_int (value);
+      if (boolean_varlist[i].flags & V_SPECIAL)
+       hack_special_boolean_var (i);
+      return 0;
+    }
+
+  i = find_string_var (name);
+
+  /* For the time being, unknown variable names or string names without a
+     handler function are simply ignored. */
+  if (i < 0 || string_varlist[i].set_func == 0)
+    return 0;
+
+  v = (*string_varlist[i].set_func) (value);
+  return v;
+}
+
+static int
+sv_editmode (value)
+     const char *value;
+{
+  if (_rl_strnicmp (value, "vi", 2) == 0)
+    {
+#if defined (VI_MODE)
+      _rl_keymap = vi_insertion_keymap;
+      rl_editing_mode = vi_mode;
+#endif /* VI_MODE */
+      return 0;
+    }
+  else if (_rl_strnicmp (value, "emacs", 5) == 0)
+    {
+      _rl_keymap = emacs_standard_keymap;
+      rl_editing_mode = emacs_mode;
+      return 0;
+    }
+  return 1;
+}
+
+static int
+sv_combegin (value)
+     const char *value;
+{
+  if (value && *value)
+    {
+      FREE (_rl_comment_begin);
+      _rl_comment_begin = savestring (value);
+      return 0;
+    }
+  return 1;
+}
+
+static int
+sv_compquery (value)
+     const char *value;
+{
+  int nval = 100;
+
+  if (value && *value)
+    {
+      nval = atoi (value);
+      if (nval < 0)
+       nval = 0;
+    }
+  rl_completion_query_items = nval;
+  return 0;
+}
+
+static int
+sv_keymap (value)
+     const char *value;
+{
+  Keymap kmap;
+
+  kmap = rl_get_keymap_by_name (value);
+  if (kmap)
+    {
+      rl_set_keymap (kmap);
+      return 0;
+    }
+  return 1;
+}
+
+static int
+sv_bell_style (value)
+     const char *value;
+{
+  if (value == 0 || *value == '\0')
+    _rl_bell_preference = AUDIBLE_BELL;
+  else if (_rl_stricmp (value, "none") == 0 || _rl_stricmp (value, "off") == 0)
+    _rl_bell_preference = NO_BELL;
+  else if (_rl_stricmp (value, "audible") == 0 || _rl_stricmp (value, "on") == 0)
+    _rl_bell_preference = AUDIBLE_BELL;
+  else if (_rl_stricmp (value, "visible") == 0)
+    _rl_bell_preference = VISIBLE_BELL;
+  else
+    return 1;
+  return 0;
+}
+
+static int
+sv_isrchterm (value)
+     const char *value;
+{
+  int beg, end, delim;
+  char *v;
+
+  if (value == 0)
+    return 1;
+
+  /* Isolate the value and translate it into a character string. */
+  v = savestring (value);
+  FREE (_rl_isearch_terminators);
+  if (v[0] == '"' || v[0] == '\'')
+    {
+      delim = v[0];
+      for (beg = end = 1; v[end] && v[end] != delim; end++)
+       ;
+    }
+  else
+    {
+      for (beg = end = 0; whitespace (v[end]) == 0; end++)
+       ;
+    }
+
+  v[end] = '\0';
+
+  /* The value starts at v + beg.  Translate it into a character string. */
+  _rl_isearch_terminators = (char *)xmalloc (2 * strlen (v) + 1);
+  rl_translate_keyseq (v + beg, _rl_isearch_terminators, &end);
+  _rl_isearch_terminators[end] = '\0';
+
+  free (v);
+  return 0;
+}
+      
+/* Return the character which matches NAME.
+   For example, `Space' returns ' '. */
+
+typedef struct {
+  const char *name;
+  int value;
+} assoc_list;
+
+static assoc_list name_key_alist[] = {
+  { "DEL", 0x7f },
+  { "ESC", '\033' },
+  { "Escape", '\033' },
+  { "LFD", '\n' },
+  { "Newline", '\n' },
+  { "RET", '\r' },
+  { "Return", '\r' },
+  { "Rubout", 0x7f },
+  { "SPC", ' ' },
+  { "Space", ' ' },
+  { "Tab", 0x09 },
+  { (char *)0x0, 0 }
+};
+
+static int
+glean_key_from_name (name)
+     char *name;
+{
+  register int i;
+
+  for (i = 0; name_key_alist[i].name; i++)
+    if (_rl_stricmp (name, name_key_alist[i].name) == 0)
+      return (name_key_alist[i].value);
+
+  return (*(unsigned char *)name);     /* XXX was return (*name) */
+}
+
+/* Auxiliary functions to manage keymaps. */
+static struct {
+  const char *name;
+  Keymap map;
+} keymap_names[] = {
+  { "emacs", emacs_standard_keymap },
+  { "emacs-standard", emacs_standard_keymap },
+  { "emacs-meta", emacs_meta_keymap },
+  { "emacs-ctlx", emacs_ctlx_keymap },
+#if defined (VI_MODE)
+  { "vi", vi_movement_keymap },
+  { "vi-move", vi_movement_keymap },
+  { "vi-command", vi_movement_keymap },
+  { "vi-insert", vi_insertion_keymap },
+#endif /* VI_MODE */
+  { (char *)0x0, (Keymap)0x0 }
+};
+
+Keymap
+rl_get_keymap_by_name (name)
+     const char *name;
+{
+  register int i;
+
+  for (i = 0; keymap_names[i].name; i++)
+    if (_rl_stricmp (name, keymap_names[i].name) == 0)
+      return (keymap_names[i].map);
+  return ((Keymap) NULL);
+}
+
+char *
+rl_get_keymap_name (map)
+     Keymap map;
+{
+  register int i;
+  for (i = 0; keymap_names[i].name; i++)
+    if (map == keymap_names[i].map)
+      return ((char *)keymap_names[i].name);
+  return ((char *)NULL);
+}
+  
+void
+rl_set_keymap (map)
+     Keymap map;
+{
+  if (map)
+    _rl_keymap = map;
+}
+
+Keymap
+rl_get_keymap ()
+{
+  return (_rl_keymap);
+}
+
+void
+rl_set_keymap_from_edit_mode ()
+{
+  if (rl_editing_mode == emacs_mode)
+    _rl_keymap = emacs_standard_keymap;
+#if defined (VI_MODE)
+  else if (rl_editing_mode == vi_mode)
+    _rl_keymap = vi_insertion_keymap;
+#endif /* VI_MODE */
+}
+
+char *
+rl_get_keymap_name_from_edit_mode ()
+{
+  if (rl_editing_mode == emacs_mode)
+    return "emacs";
+#if defined (VI_MODE)
+  else if (rl_editing_mode == vi_mode)
+    return "vi";
+#endif /* VI_MODE */
+  else
+    return "none";
+}
+
+/* **************************************************************** */
+/*                                                                 */
+/*               Key Binding and Function Information              */
+/*                                                                 */
+/* **************************************************************** */
+
+/* Each of the following functions produces information about the
+   state of keybindings and functions known to Readline.  The info
+   is always printed to rl_outstream, and in such a way that it can
+   be read back in (i.e., passed to rl_parse_and_bind ()). */
+
+/* Print the names of functions known to Readline. */
+void
+rl_list_funmap_names ()
+{
+  register int i;
+  const char **funmap_names;
+
+  funmap_names = rl_funmap_names ();
+
+  if (!funmap_names)
+    return;
+
+  for (i = 0; funmap_names[i]; i++)
+    fprintf (rl_outstream, "%s\n", funmap_names[i]);
+
+  free (funmap_names);
+}
+
+static char *
+_rl_get_keyname (key)
+     int key;
+{
+  char *keyname;
+  int i, c;
+
+  keyname = (char *)xmalloc (8);
+
+  c = key;
+  /* Since this is going to be used to write out keysequence-function
+     pairs for possible inclusion in an inputrc file, we don't want to
+     do any special meta processing on KEY. */
+
+#if 1
+  /* XXX - Experimental */
+  /* We might want to do this, but the old version of the code did not. */
+
+  /* If this is an escape character, we don't want to do any more processing.
+     Just add the special ESC key sequence and return. */
+  if (c == ESC)
+    {
+      keyname[0] = '\\';
+      keyname[1] = 'e';
+      keyname[2] = '\0';
+      return keyname;
+    }
+#endif
+
+  /* RUBOUT is translated directly into \C-? */
+  if (key == RUBOUT)
+    {
+      keyname[0] = '\\';
+      keyname[1] = 'C';
+      keyname[2] = '-';
+      keyname[3] = '?';
+      keyname[4] = '\0';
+      return keyname;
+    }
+
+  i = 0;
+  /* Now add special prefixes needed for control characters.  This can
+     potentially change C. */
+  if (CTRL_CHAR (c))
+    {
+      keyname[i++] = '\\';
+      keyname[i++] = 'C';
+      keyname[i++] = '-';
+      c = _rl_to_lower (UNCTRL (c));
+    }
+
+  /* XXX experimental code.  Turn the characters that are not ASCII or
+     ISO Latin 1 (128 - 159) into octal escape sequences (\200 - \237).
+     This changes C. */
+  if (c >= 128 && c <= 159)
+    {
+      keyname[i++] = '\\';
+      keyname[i++] = '2';
+      c -= 128;
+      keyname[i++] = (c / 8) + '0';
+      c = (c % 8) + '0';
+    }
+
+  /* Now, if the character needs to be quoted with a backslash, do that. */
+  if (c == '\\' || c == '"')
+    keyname[i++] = '\\';
+
+  /* Now add the key, terminate the string, and return it. */
+  keyname[i++] = (char) c;
+  keyname[i] = '\0';
+
+  return keyname;
+}
+
+/* Return a NULL terminated array of strings which represent the key
+   sequences that are used to invoke FUNCTION in MAP. */
+char **
+rl_invoking_keyseqs_in_map (function, map)
+     rl_command_func_t *function;
+     Keymap map;
+{
+  register int key;
+  char **result;
+  int result_index, result_size;
+
+  result = (char **)NULL;
+  result_index = result_size = 0;
+
+  for (key = 0; key < KEYMAP_SIZE; key++)
+    {
+      switch (map[key].type)
+       {
+       case ISMACR:
+         /* Macros match, if, and only if, the pointers are identical.
+            Thus, they are treated exactly like functions in here. */
+       case ISFUNC:
+         /* If the function in the keymap is the one we are looking for,
+            then add the current KEY to the list of invoking keys. */
+         if (map[key].function == function)
+           {
+             char *keyname;
+
+             keyname = _rl_get_keyname (key);
+
+             if (result_index + 2 > result_size)
+               {
+                 result_size += 10;
+                 result = (char **)xrealloc (result, result_size * sizeof (char *));
+               }
+
+             result[result_index++] = keyname;
+             result[result_index] = (char *)NULL;
+           }
+         break;
+
+       case ISKMAP:
+         {
+           char **seqs;
+           register int i;
+
+           /* Find the list of keyseqs in this map which have FUNCTION as
+              their target.  Add the key sequences found to RESULT. */
+           if (map[key].function)
+             seqs =
+               rl_invoking_keyseqs_in_map (function, FUNCTION_TO_KEYMAP (map, key));
+           else
+             break;
+
+           if (seqs == 0)
+             break;
+
+           for (i = 0; seqs[i]; i++)
+             {
+               char *keyname = (char *)xmalloc (6 + strlen (seqs[i]));
+
+               if (key == ESC)
+                 {
+                   /* If ESC is the meta prefix and we're converting chars
+                      with the eighth bit set to ESC-prefixed sequences, then
+                      we can use \M-.  Otherwise we need to use the sequence
+                      for ESC. */
+                   if (_rl_convert_meta_chars_to_ascii && map[ESC].type == ISKMAP)
+                     sprintf (keyname, "\\M-");
+                   else
+                     sprintf (keyname, "\\e");
+                 }
+               else if (CTRL_CHAR (key))
+                 sprintf (keyname, "\\C-%c", _rl_to_lower (UNCTRL (key)));
+               else if (key == RUBOUT)
+                 sprintf (keyname, "\\C-?");
+               else if (key == '\\' || key == '"')
+                 {
+                   keyname[0] = '\\';
+                   keyname[1] = (char) key;
+                   keyname[2] = '\0';
+                 }
+               else
+                 {
+                   keyname[0] = (char) key;
+                   keyname[1] = '\0';
+                 }
+               
+               strcat (keyname, seqs[i]);
+               free (seqs[i]);
+
+               if (result_index + 2 > result_size)
+                 {
+                   result_size += 10;
+                   result = (char **)xrealloc (result, result_size * sizeof (char *));
+                 }
+
+               result[result_index++] = keyname;
+               result[result_index] = (char *)NULL;
+             }
+
+           free (seqs);
+         }
+         break;
+       }
+    }
+  return (result);
+}
+
+/* Return a NULL terminated array of strings which represent the key
+   sequences that can be used to invoke FUNCTION using the current keymap. */
+char **
+rl_invoking_keyseqs (function)
+     rl_command_func_t *function;
+{
+  return (rl_invoking_keyseqs_in_map (function, _rl_keymap));
+}
+
+/* Print all of the functions and their bindings to rl_outstream.  If
+   PRINT_READABLY is non-zero, then print the output in such a way
+   that it can be read back in. */
+void
+rl_function_dumper (print_readably)
+     int print_readably;
+{
+  register int i;
+  const char **names;
+  const char *name;
+
+  names = rl_funmap_names ();
+
+  fprintf (rl_outstream, "\n");
+
+  for (i = 0; name = names[i]; i++)
+    {
+      rl_command_func_t *function;
+      char **invokers;
+
+      function = rl_named_function (name);
+      invokers = rl_invoking_keyseqs_in_map (function, _rl_keymap);
+
+      if (print_readably)
+       {
+         if (!invokers)
+           fprintf (rl_outstream, "# %s (not bound)\n", name);
+         else
+           {
+             register int j;
+
+             for (j = 0; invokers[j]; j++)
+               {
+                 fprintf (rl_outstream, "\"%s\": %s\n",
+                          invokers[j], name);
+                 free (invokers[j]);
+               }
+
+             free (invokers);
+           }
+       }
+      else
+       {
+         if (!invokers)
+           fprintf (rl_outstream, "%s is not bound to any keys\n",
+                    name);
+         else
+           {
+             register int j;
+
+             fprintf (rl_outstream, "%s can be found on ", name);
+
+             for (j = 0; invokers[j] && j < 5; j++)
+               {
+                 fprintf (rl_outstream, "\"%s\"%s", invokers[j],
+                          invokers[j + 1] ? ", " : ".\n");
+               }
+
+             if (j == 5 && invokers[j])
+               fprintf (rl_outstream, "...\n");
+
+             for (j = 0; invokers[j]; j++)
+               free (invokers[j]);
+
+             free (invokers);
+           }
+       }
+    }
+}
+
+/* Print all of the current functions and their bindings to
+   rl_outstream.  If an explicit argument is given, then print
+   the output in such a way that it can be read back in. */
+int
+rl_dump_functions (count, key)
+     int count, key;
+{
+  if (rl_dispatching)
+    fprintf (rl_outstream, "\r\n");
+  rl_function_dumper (rl_explicit_arg);
+  rl_on_new_line ();
+  return (0);
+}
+
+static void
+_rl_macro_dumper_internal (print_readably, map, prefix)
+     int print_readably;
+     Keymap map;
+     char *prefix;
+{
+  register int key;
+  char *keyname, *out;
+  int prefix_len;
+
+  for (key = 0; key < KEYMAP_SIZE; key++)
+    {
+      switch (map[key].type)
+       {
+       case ISMACR:
+         keyname = _rl_get_keyname (key);
+         out = _rl_untranslate_macro_value ((char *)map[key].function);
+
+         if (print_readably)
+           fprintf (rl_outstream, "\"%s%s\": \"%s\"\n", prefix ? prefix : "",
+                                                        keyname,
+                                                        out ? out : "");
+         else
+           fprintf (rl_outstream, "%s%s outputs %s\n", prefix ? prefix : "",
+                                                       keyname,
+                                                       out ? out : "");
+         free (keyname);
+         free (out);
+         break;
+       case ISFUNC:
+         break;
+       case ISKMAP:
+         prefix_len = prefix ? strlen (prefix) : 0;
+         if (key == ESC)
+           {
+             keyname = (char *)xmalloc (3 + prefix_len);
+             if (prefix)
+               strcpy (keyname, prefix);
+             keyname[prefix_len] = '\\';
+             keyname[prefix_len + 1] = 'e';
+             keyname[prefix_len + 2] = '\0';
+           }
+         else
+           {
+             keyname = _rl_get_keyname (key);
+             if (prefix)
+               {
+                 out = (char *)xmalloc (strlen (keyname) + prefix_len + 1);
+                 strcpy (out, prefix);
+                 strcpy (out + prefix_len, keyname);
+                 free (keyname);
+                 keyname = out;
+               }
+           }
+
+         _rl_macro_dumper_internal (print_readably, FUNCTION_TO_KEYMAP (map, key), keyname);
+         free (keyname);
+         break;
+       }
+    }
+}
+
+void
+rl_macro_dumper (print_readably)
+     int print_readably;
+{
+  _rl_macro_dumper_internal (print_readably, _rl_keymap, (char *)NULL);
+}
+
+int
+rl_dump_macros (count, key)
+     int count, key;
+{
+  if (rl_dispatching)
+    fprintf (rl_outstream, "\r\n");
+  rl_macro_dumper (rl_explicit_arg);
+  rl_on_new_line ();
+  return (0);
+}
+
+static char *
+_rl_get_string_variable_value (name)
+     const char *name;
+{
+  static char numbuf[32];
+  char *ret;
+
+  if (_rl_stricmp (name, "bell-style") == 0)
+    {
+      switch (_rl_bell_preference)
+       {
+         case NO_BELL:
+           return "none";
+         case VISIBLE_BELL:
+           return "visible";
+         case AUDIBLE_BELL:
+         default:
+           return "audible";
+       }
+    }
+  else if (_rl_stricmp (name, "comment-begin") == 0)
+    return (_rl_comment_begin ? _rl_comment_begin : RL_COMMENT_BEGIN_DEFAULT);
+  else if (_rl_stricmp (name, "completion-query-items") == 0)
+    {
+      sprintf (numbuf, "%d", rl_completion_query_items);
+      return (numbuf);
+    }
+  else if (_rl_stricmp (name, "editing-mode") == 0)
+    return (rl_get_keymap_name_from_edit_mode ());
+  else if (_rl_stricmp (name, "isearch-terminators") == 0)
+    {
+      if (_rl_isearch_terminators == 0)
+       return 0;
+      ret = _rl_untranslate_macro_value (_rl_isearch_terminators);
+      if (ret)
+       {
+         strncpy (numbuf, ret, sizeof (numbuf) - 1);
+         free (ret);
+         numbuf[sizeof(numbuf) - 1] = '\0';
+       }
+      else
+       numbuf[0] = '\0';
+      return numbuf;
+    }
+  else if (_rl_stricmp (name, "keymap") == 0)
+    {
+      ret = rl_get_keymap_name (_rl_keymap);
+      if (ret == 0)
+       ret = rl_get_keymap_name_from_edit_mode ();
+      return (ret ? ret : "none");
+    }
+  else
+    return (0);
+}
+
+void
+rl_variable_dumper (print_readably)
+     int print_readably;
+{
+  int i;
+  char *v;
+
+  for (i = 0; boolean_varlist[i].name; i++)
+    {
+      if (print_readably)
+        fprintf (rl_outstream, "set %s %s\n", boolean_varlist[i].name,
+                              *boolean_varlist[i].value ? "on" : "off");
+      else
+        fprintf (rl_outstream, "%s is set to `%s'\n", boolean_varlist[i].name,
+                              *boolean_varlist[i].value ? "on" : "off");
+    }
+
+  for (i = 0; string_varlist[i].name; i++)
+    {
+      v = _rl_get_string_variable_value (string_varlist[i].name);
+      if (v == 0)      /* _rl_isearch_terminators can be NULL */
+       continue;
+      if (print_readably)
+        fprintf (rl_outstream, "set %s %s\n", string_varlist[i].name, v);
+      else
+        fprintf (rl_outstream, "%s is set to `%s'\n", string_varlist[i].name, v);
+    }
+}
+
+/* Print all of the current variables and their values to
+   rl_outstream.  If an explicit argument is given, then print
+   the output in such a way that it can be read back in. */
+int
+rl_dump_variables (count, key)
+     int count, key;
+{
+  if (rl_dispatching)
+    fprintf (rl_outstream, "\r\n");
+  rl_variable_dumper (rl_explicit_arg);
+  rl_on_new_line ();
+  return (0);
+}
+
+/* Return non-zero if any members of ARRAY are a substring in STRING. */
+static int
+substring_member_of_array (string, array)
+     char *string;
+     const char **array;
+{
+  while (*array)
+    {
+      if (_rl_strindex (string, *array))
+       return (1);
+      array++;
+    }
+  return (0);
+}
diff --git a/callback.c b/callback.c
new file mode 100644 (file)
index 0000000..ada04d8
--- /dev/null
@@ -0,0 +1,258 @@
+/* callback.c -- functions to use readline as an X `callback' mechanism. */
+
+/* Copyright (C) 1987-2005 Free Software Foundation, Inc.
+
+   This file is part of the GNU Readline Library, a library for
+   reading lines of text with interactive input and history editing.
+
+   The GNU Readline Library 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.
+
+   The GNU Readline Library is distributed in the hope that it will be
+   useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+   of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   The GNU General Public License is often shipped with GNU software, and
+   is generally kept in a file called COPYING or LICENSE.  If you do not
+   have a copy of the license, write to the Free Software Foundation,
+   59 Temple Place, Suite 330, Boston, MA 02111 USA. */
+#define READLINE_LIBRARY
+
+#if defined (HAVE_CONFIG_H)
+#  include <config.h>
+#endif
+
+#include "rlconf.h"
+
+#if defined (READLINE_CALLBACKS)
+
+#include <sys/types.h>
+
+#ifdef HAVE_STDLIB_H
+#  include <stdlib.h>
+#else
+#  include "ansi_stdlib.h"
+#endif
+
+#include <stdio.h>
+
+/* System-specific feature definitions and include files. */
+#include "rldefs.h"
+#include "readline.h"
+#include "rlprivate.h"
+#include "xmalloc.h"
+
+/* Private data for callback registration functions.  See comments in
+   rl_callback_read_char for more details. */
+_rl_callback_func_t *_rl_callback_func = 0;
+_rl_callback_generic_arg *_rl_callback_data = 0;
+
+/* **************************************************************** */
+/*                                                                 */
+/*                     Callback Readline Functions              */
+/*                                                                 */
+/* **************************************************************** */
+
+/* Allow using readline in situations where a program may have multiple
+   things to handle at once, and dispatches them via select().  Call
+   rl_callback_handler_install() with the prompt and a function to call
+   whenever a complete line of input is ready.  The user must then
+   call rl_callback_read_char() every time some input is available, and 
+   rl_callback_read_char() will call the user's function with the complete
+   text read in at each end of line.  The terminal is kept prepped and
+   signals handled all the time, except during calls to the user's function. */
+
+rl_vcpfunc_t *rl_linefunc;             /* user callback function */
+static int in_handler;         /* terminal_prepped and signals set? */
+
+/* Make sure the terminal is set up, initialize readline, and prompt. */
+static void
+_rl_callback_newline ()
+{
+  rl_initialize ();
+
+  if (in_handler == 0)
+    {
+      in_handler = 1;
+
+      if (rl_prep_term_function)
+       (*rl_prep_term_function) (_rl_meta_flag);
+
+#if defined (HANDLE_SIGNALS)
+      rl_set_signals ();
+#endif
+    }
+
+  readline_internal_setup ();
+}
+
+/* Install a readline handler, set up the terminal, and issue the prompt. */
+void
+rl_callback_handler_install (prompt, linefunc)
+     const char *prompt;
+     rl_vcpfunc_t *linefunc;
+{
+  rl_set_prompt (prompt);
+  RL_SETSTATE (RL_STATE_CALLBACK);
+  rl_linefunc = linefunc;
+  _rl_callback_newline ();
+}
+
+/* Read one character, and dispatch to the handler if it ends the line. */
+void
+rl_callback_read_char ()
+{
+  char *line;
+  int eof, jcode;
+  static procenv_t olevel;
+
+  if (rl_linefunc == NULL)
+    {
+      fprintf (stderr, "readline: readline_callback_read_char() called with no handler!\r\n");
+      abort ();
+    }
+
+  memcpy ((void *)olevel, (void *)readline_top_level, sizeof (procenv_t));
+  jcode = setjmp (readline_top_level);
+  if (jcode)
+    {
+      (*rl_redisplay_function) ();
+      _rl_want_redisplay = 0;
+      memcpy ((void *)readline_top_level, (void *)olevel, sizeof (procenv_t));
+      return;
+    }
+
+  do
+    {
+      if  (RL_ISSTATE (RL_STATE_ISEARCH))
+       {
+         eof = _rl_isearch_callback (_rl_iscxt);
+         if (eof == 0 && (RL_ISSTATE (RL_STATE_ISEARCH) == 0) && RL_ISSTATE (RL_STATE_INPUTPENDING))
+           rl_callback_read_char ();
+
+         return;
+       }
+      else if  (RL_ISSTATE (RL_STATE_NSEARCH))
+       {
+         eof = _rl_nsearch_callback (_rl_nscxt);
+         return;
+       }
+      else if (RL_ISSTATE (RL_STATE_NUMERICARG))
+       {
+         eof = _rl_arg_callback (_rl_argcxt);
+         if (eof == 0 && (RL_ISSTATE (RL_STATE_NUMERICARG) == 0) && RL_ISSTATE (RL_STATE_INPUTPENDING))
+           rl_callback_read_char ();
+         /* XXX - this should handle _rl_last_command_was_kill better */
+         else if (RL_ISSTATE (RL_STATE_NUMERICARG) == 0)
+           _rl_internal_char_cleanup ();
+
+         return;
+       }
+      else if (RL_ISSTATE (RL_STATE_MULTIKEY))
+       {
+         eof = _rl_dispatch_callback (_rl_kscxt);      /* For now */
+         while ((eof == -1 || eof == -2) && RL_ISSTATE (RL_STATE_MULTIKEY) && _rl_kscxt && (_rl_kscxt->flags & KSEQ_DISPATCHED))
+           eof = _rl_dispatch_callback (_rl_kscxt);
+         if (RL_ISSTATE (RL_STATE_MULTIKEY) == 0)
+           {
+             _rl_internal_char_cleanup ();
+             _rl_want_redisplay = 1;
+           }
+       }
+      else if (_rl_callback_func)
+       {
+         /* This allows functions that simply need to read an additional
+            character (like quoted-insert) to register a function to be
+            called when input is available.  _rl_callback_data is simply a
+            pointer to a struct that has the argument count originally
+            passed to the registering function and space for any additional
+            parameters.  */
+         eof = (*_rl_callback_func) (_rl_callback_data);
+         /* If the function `deregisters' itself, make sure the data is
+            cleaned up. */
+         if (_rl_callback_func == 0)
+           {
+             if (_rl_callback_data)    
+               {
+                 _rl_callback_data_dispose (_rl_callback_data);
+                 _rl_callback_data = 0;
+               }
+             _rl_internal_char_cleanup ();
+           }
+       }
+      else
+       eof = readline_internal_char ();
+
+      if (rl_done == 0 && _rl_want_redisplay)
+       {
+         (*rl_redisplay_function) ();
+         _rl_want_redisplay = 0;
+       }
+
+      if (rl_done)
+       {
+         line = readline_internal_teardown (eof);
+
+         if (rl_deprep_term_function)
+           (*rl_deprep_term_function) ();
+#if defined (HANDLE_SIGNALS)
+         rl_clear_signals ();
+#endif
+         in_handler = 0;
+         (*rl_linefunc) (line);
+
+         /* If the user did not clear out the line, do it for him. */
+         if (rl_line_buffer[0])
+           _rl_init_line_state ();
+
+         /* Redisplay the prompt if readline_handler_{install,remove}
+            not called. */
+         if (in_handler == 0 && rl_linefunc)
+           _rl_callback_newline ();
+       }
+    }
+  while (rl_pending_input || _rl_pushed_input_available () || RL_ISSTATE (RL_STATE_MACROINPUT));
+}
+
+/* Remove the handler, and make sure the terminal is in its normal state. */
+void
+rl_callback_handler_remove ()
+{
+  rl_linefunc = NULL;
+  RL_UNSETSTATE (RL_STATE_CALLBACK);
+  if (in_handler)
+    {
+      in_handler = 0;
+      if (rl_deprep_term_function)
+       (*rl_deprep_term_function) ();
+#if defined (HANDLE_SIGNALS)
+      rl_clear_signals ();
+#endif
+    }
+}
+
+_rl_callback_generic_arg *
+_rl_callback_data_alloc (count)
+     int count;
+{
+  _rl_callback_generic_arg *arg;
+
+  arg = (_rl_callback_generic_arg *)xmalloc (sizeof (_rl_callback_generic_arg));
+  arg->count = count;
+
+  arg->i1 = arg->i2 = 0;
+
+  return arg;
+}
+
+void _rl_callback_data_dispose (arg)
+     _rl_callback_generic_arg *arg;
+{
+  if (arg)
+    free (arg);
+}
+
+#endif
diff --git a/chardefs.h b/chardefs.h
new file mode 100644 (file)
index 0000000..def3a11
--- /dev/null
@@ -0,0 +1,165 @@
+/* chardefs.h -- Character definitions for readline. */
+
+/* Copyright (C) 1994 Free Software Foundation, Inc.
+
+   This file is part of the GNU Readline Library, a library for
+   reading lines of text with interactive input and history editing.
+
+   The GNU Readline Library 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.
+
+   The GNU Readline Library is distributed in the hope that it will be
+   useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+   of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   The GNU General Public License is often shipped with GNU software, and
+   is generally kept in a file called COPYING or LICENSE.  If you do not
+   have a copy of the license, write to the Free Software Foundation,
+   59 Temple Place, Suite 330, Boston, MA 02111 USA. */
+
+#ifndef _CHARDEFS_H_
+#define _CHARDEFS_H_
+
+#include <ctype.h>
+
+#if defined (HAVE_CONFIG_H)
+#  if defined (HAVE_STRING_H)
+#    if ! defined (STDC_HEADERS) && defined (HAVE_MEMORY_H)
+#      include <memory.h>
+#    endif
+#    include <string.h>
+#  endif /* HAVE_STRING_H */
+#  if defined (HAVE_STRINGS_H)
+#    include <strings.h>
+#  endif /* HAVE_STRINGS_H */
+#else
+#  include <string.h>
+#endif /* !HAVE_CONFIG_H */
+
+#ifndef whitespace
+#define whitespace(c) (((c) == ' ') || ((c) == '\t'))
+#endif
+
+#ifdef CTRL
+#  undef CTRL
+#endif
+#ifdef UNCTRL
+#  undef UNCTRL
+#endif
+
+/* Some character stuff. */
+#define control_character_threshold 0x020   /* Smaller than this is control. */
+#define control_character_mask 0x1f        /* 0x20 - 1 */
+#define meta_character_threshold 0x07f     /* Larger than this is Meta. */
+#define control_character_bit 0x40         /* 0x000000, must be off. */
+#define meta_character_bit 0x080           /* x0000000, must be on. */
+#define largest_char 255                   /* Largest character value. */
+
+#define CTRL_CHAR(c) ((c) < control_character_threshold && (((c) & 0x80) == 0))
+#define META_CHAR(c) ((c) > meta_character_threshold && (c) <= largest_char)
+
+#define CTRL(c) ((c) & control_character_mask)
+#define META(c) ((c) | meta_character_bit)
+
+#define UNMETA(c) ((c) & (~meta_character_bit))
+#define UNCTRL(c) _rl_to_upper(((c)|control_character_bit))
+
+#if defined STDC_HEADERS || (!defined (isascii) && !defined (HAVE_ISASCII))
+#  define IN_CTYPE_DOMAIN(c) 1
+#else
+#  define IN_CTYPE_DOMAIN(c) isascii(c)
+#endif
+
+#if !defined (isxdigit) && !defined (HAVE_ISXDIGIT)
+#  define isxdigit(c)   (isdigit((c)) || ((c) >= 'a' && (c) <= 'f') || ((c) >= 'A' && (c) <= 'F'))
+#endif
+
+#if defined (CTYPE_NON_ASCII)
+#  define NON_NEGATIVE(c) 1
+#else
+#  define NON_NEGATIVE(c) ((unsigned char)(c) == (c))
+#endif
+
+/* Some systems define these; we want our definitions. */
+#undef ISPRINT
+
+/* Beware:  these only work with single-byte ASCII characters. */
+
+#define ISALNUM(c)     (IN_CTYPE_DOMAIN (c) && isalnum (c))
+#define ISALPHA(c)     (IN_CTYPE_DOMAIN (c) && isalpha (c))
+#define ISDIGIT(c)     (IN_CTYPE_DOMAIN (c) && isdigit (c))
+#define ISLOWER(c)     (IN_CTYPE_DOMAIN (c) && islower (c))
+#define ISPRINT(c)     (IN_CTYPE_DOMAIN (c) && isprint (c))
+#define ISUPPER(c)     (IN_CTYPE_DOMAIN (c) && isupper (c))
+#define ISXDIGIT(c)    (IN_CTYPE_DOMAIN (c) && isxdigit (c))
+
+#define _rl_lowercase_p(c)     (NON_NEGATIVE(c) && ISLOWER(c))
+#define _rl_uppercase_p(c)     (NON_NEGATIVE(c) && ISUPPER(c))
+#define _rl_digit_p(c)         ((c) >= '0' && (c) <= '9')
+
+#define _rl_pure_alphabetic(c) (NON_NEGATIVE(c) && ISALPHA(c))
+#define ALPHABETIC(c)          (NON_NEGATIVE(c) && ISALNUM(c))
+
+#ifndef _rl_to_upper
+#  define _rl_to_upper(c) (_rl_lowercase_p(c) ? toupper((unsigned char)c) : (c))
+#  define _rl_to_lower(c) (_rl_uppercase_p(c) ? tolower((unsigned char)c) : (c))
+#endif
+
+#ifndef _rl_digit_value
+#  define _rl_digit_value(x) ((x) - '0')
+#endif
+
+#ifndef _rl_isident
+#  define _rl_isident(c) (ISALNUM(c) || (c) == '_')
+#endif
+
+#ifndef ISOCTAL
+#  define ISOCTAL(c)   ((c) >= '0' && (c) <= '7')
+#endif
+#define OCTVALUE(c)    ((c) - '0')
+
+#define HEXVALUE(c) \
+  (((c) >= 'a' && (c) <= 'f') \
+       ? (c)-'a'+10 \
+       : (c) >= 'A' && (c) <= 'F' ? (c)-'A'+10 : (c)-'0')
+
+#ifndef NEWLINE
+#define NEWLINE '\n'
+#endif
+
+#ifndef RETURN
+#define RETURN CTRL('M')
+#endif
+
+#ifndef RUBOUT
+#define RUBOUT 0x7f
+#endif
+
+#ifndef TAB
+#define TAB '\t'
+#endif
+
+#ifdef ABORT_CHAR
+#undef ABORT_CHAR
+#endif
+#define ABORT_CHAR CTRL('G')
+
+#ifdef PAGE
+#undef PAGE
+#endif
+#define PAGE CTRL('L')
+
+#ifdef SPACE
+#undef SPACE
+#endif
+#define SPACE ' '      /* XXX - was 0x20 */
+
+#ifdef ESC
+#undef ESC
+#endif
+#define ESC CTRL('[')
+
+#endif  /* _CHARDEFS_H_ */
diff --git a/compat.c b/compat.c
new file mode 100644 (file)
index 0000000..a66d210
--- /dev/null
+++ b/compat.c
@@ -0,0 +1,113 @@
+/* compat.c -- backwards compatibility functions. */
+
+/* Copyright (C) 2000 Free Software Foundation, Inc.
+
+   This file is part of the GNU Readline Library, a library for
+   reading lines of text with interactive input and history editing.
+
+   The GNU Readline Library 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.
+
+   The GNU Readline Library is distributed in the hope that it will be
+   useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+   of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   The GNU General Public License is often shipped with GNU software, and
+   is generally kept in a file called COPYING or LICENSE.  If you do not
+   have a copy of the license, write to the Free Software Foundation,
+   59 Temple Place, Suite 330, Boston, MA 02111 USA. */
+#define READLINE_LIBRARY
+
+#if defined (HAVE_CONFIG_H)
+#  include <config.h>
+#endif
+
+#include <stdio.h>
+
+#include "rlstdc.h"
+#include "rltypedefs.h"
+
+extern void rl_free_undo_list PARAMS((void));
+extern int rl_maybe_save_line PARAMS((void));
+extern int rl_maybe_unsave_line PARAMS((void));
+extern int rl_maybe_replace_line PARAMS((void));
+
+extern int rl_crlf PARAMS((void));
+extern int rl_ding PARAMS((void));
+extern int rl_alphabetic PARAMS((int));
+
+extern char **rl_completion_matches PARAMS((const char *, rl_compentry_func_t *));
+extern char *rl_username_completion_function PARAMS((const char *, int));
+extern char *rl_filename_completion_function PARAMS((const char *, int));
+
+/* Provide backwards-compatible entry points for old function names. */
+
+void
+free_undo_list ()
+{
+  rl_free_undo_list ();
+}
+
+int
+maybe_replace_line ()
+{
+  return rl_maybe_replace_line ();
+}
+
+int
+maybe_save_line ()
+{
+  return rl_maybe_save_line ();
+}
+
+int
+maybe_unsave_line ()
+{
+  return rl_maybe_unsave_line ();
+}
+
+int
+ding ()
+{
+  return rl_ding ();
+}
+
+int
+crlf ()
+{
+  return rl_crlf ();
+}
+
+int
+alphabetic (c)
+     int c;
+{
+  return rl_alphabetic (c);
+}
+
+char **
+completion_matches (s, f)
+     const char *s;
+     rl_compentry_func_t *f;
+{
+  return rl_completion_matches (s, f);
+}
+
+char *
+username_completion_function (s, i)
+     const char *s;
+     int i;
+{
+  return rl_username_completion_function (s, i);
+}
+
+char *
+filename_completion_function (s, i)
+     const char *s;
+     int i;
+{
+  return rl_filename_completion_function (s, i);
+}
diff --git a/complete.c b/complete.c
new file mode 100644 (file)
index 0000000..73f834a
--- /dev/null
@@ -0,0 +1,2217 @@
+/* complete.c -- filename completion for readline. */
+
+/* Copyright (C) 1987-2005 Free Software Foundation, Inc.
+
+   This file is part of the GNU Readline Library, a library for
+   reading lines of text with interactive input and history editing.
+
+   The GNU Readline Library 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.
+
+   The GNU Readline Library is distributed in the hope that it will be
+   useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+   of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   The GNU General Public License is often shipped with GNU software, and
+   is generally kept in a file called COPYING or LICENSE.  If you do not
+   have a copy of the license, write to the Free Software Foundation,
+   59 Temple Place, Suite 330, Boston, MA 02111 USA. */
+#define READLINE_LIBRARY
+
+#if defined (HAVE_CONFIG_H)
+#  include <config.h>
+#endif
+
+#include <sys/types.h>
+#include <fcntl.h>
+#if defined (HAVE_SYS_FILE_H)
+#  include <sys/file.h>
+#endif
+
+#if defined (HAVE_UNISTD_H)
+#  include <unistd.h>
+#endif /* HAVE_UNISTD_H */
+
+#if defined (HAVE_STDLIB_H)
+#  include <stdlib.h>
+#else
+#  include "ansi_stdlib.h"
+#endif /* HAVE_STDLIB_H */
+
+#include <stdio.h>
+
+#include <errno.h>
+#if !defined (errno)
+extern int errno;
+#endif /* !errno */
+
+#if defined (HAVE_PWD_H)
+#include <pwd.h>
+#endif
+
+#include "posixdir.h"
+#include "posixstat.h"
+
+/* System-specific feature definitions and include files. */
+#include "rldefs.h"
+#include "rlmbutil.h"
+
+/* Some standard library routines. */
+#include "readline.h"
+#include "xmalloc.h"
+#include "rlprivate.h"
+
+#ifdef __STDC__
+typedef int QSFUNC (const void *, const void *);
+#else
+typedef int QSFUNC ();
+#endif
+
+#ifdef HAVE_LSTAT
+#  define LSTAT lstat
+#else
+#  define LSTAT stat
+#endif
+
+/* Unix version of a hidden file.  Could be different on other systems. */
+#define HIDDEN_FILE(fname)     ((fname)[0] == '.')
+
+/* Most systems don't declare getpwent in <pwd.h> if _POSIX_SOURCE is
+   defined. */
+#if defined (HAVE_GETPWENT) && (!defined (HAVE_GETPW_DECLS) || defined (_POSIX_SOURCE))
+extern struct passwd *getpwent PARAMS((void));
+#endif /* HAVE_GETPWENT && (!HAVE_GETPW_DECLS || _POSIX_SOURCE) */
+
+/* If non-zero, then this is the address of a function to call when
+   completing a word would normally display the list of possible matches.
+   This function is called instead of actually doing the display.
+   It takes three arguments: (char **matches, int num_matches, int max_length)
+   where MATCHES is the array of strings that matched, NUM_MATCHES is the
+   number of strings in that array, and MAX_LENGTH is the length of the
+   longest string in that array. */
+rl_compdisp_func_t *rl_completion_display_matches_hook = (rl_compdisp_func_t *)NULL;
+
+#if defined (VISIBLE_STATS)
+#  if !defined (X_OK)
+#    define X_OK 1
+#  endif
+static int stat_char PARAMS((char *));
+#endif
+
+static int path_isdir PARAMS((const char *));
+
+static char *rl_quote_filename PARAMS((char *, int, char *));
+
+static void set_completion_defaults PARAMS((int));
+static int get_y_or_n PARAMS((int));
+static int _rl_internal_pager PARAMS((int));
+static char *printable_part PARAMS((char *));
+static int fnwidth PARAMS((const char *));
+static int fnprint PARAMS((const char *));
+static int print_filename PARAMS((char *, char *));
+
+static char **gen_completion_matches PARAMS((char *, int, int, rl_compentry_func_t *, int, int));
+
+static char **remove_duplicate_matches PARAMS((char **));
+static void insert_match PARAMS((char *, int, int, char *));
+static int append_to_match PARAMS((char *, int, int, int));
+static void insert_all_matches PARAMS((char **, int, char *));
+static void display_matches PARAMS((char **));
+static int compute_lcd_of_matches PARAMS((char **, int, const char *));
+static int postprocess_matches PARAMS((char ***, int));
+
+static char *make_quoted_replacement PARAMS((char *, int, char *));
+
+/* **************************************************************** */
+/*                                                                 */
+/*     Completion matching, from readline's point of view.         */
+/*                                                                 */
+/* **************************************************************** */
+
+/* Variables known only to the readline library. */
+
+/* If non-zero, non-unique completions always show the list of matches. */
+int _rl_complete_show_all = 0;
+
+/* If non-zero, non-unique completions show the list of matches, unless it
+   is not possible to do partial completion and modify the line. */
+int _rl_complete_show_unmodified = 0;
+
+/* If non-zero, completed directory names have a slash appended. */
+int _rl_complete_mark_directories = 1;
+
+/* If non-zero, the symlinked directory completion behavior introduced in
+   readline-4.2a is disabled, and symlinks that point to directories have
+   a slash appended (subject to the value of _rl_complete_mark_directories).
+   This is user-settable via the mark-symlinked-directories variable. */
+int _rl_complete_mark_symlink_dirs = 0;
+
+/* If non-zero, completions are printed horizontally in alphabetical order,
+   like `ls -x'. */
+int _rl_print_completions_horizontally;
+
+/* Non-zero means that case is not significant in filename completion. */
+#if defined (__MSDOS__) && !defined (__DJGPP__)
+int _rl_completion_case_fold = 1;
+#else
+int _rl_completion_case_fold;
+#endif
+
+/* If non-zero, don't match hidden files (filenames beginning with a `.' on
+   Unix) when doing filename completion. */
+int _rl_match_hidden_files = 1;
+
+/* Global variables available to applications using readline. */
+
+#if defined (VISIBLE_STATS)
+/* Non-zero means add an additional character to each filename displayed
+   during listing completion iff rl_filename_completion_desired which helps
+   to indicate the type of file being listed. */
+int rl_visible_stats = 0;
+#endif /* VISIBLE_STATS */
+
+/* If non-zero, then this is the address of a function to call when
+   completing on a directory name.  The function is called with
+   the address of a string (the current directory name) as an arg. */
+rl_icppfunc_t *rl_directory_completion_hook = (rl_icppfunc_t *)NULL;
+
+rl_icppfunc_t *rl_directory_rewrite_hook = (rl_icppfunc_t *)NULL;
+
+/* Non-zero means readline completion functions perform tilde expansion. */
+int rl_complete_with_tilde_expansion = 0;
+
+/* Pointer to the generator function for completion_matches ().
+   NULL means to use rl_filename_completion_function (), the default filename
+   completer. */
+rl_compentry_func_t *rl_completion_entry_function = (rl_compentry_func_t *)NULL;
+
+/* Pointer to alternative function to create matches.
+   Function is called with TEXT, START, and END.
+   START and END are indices in RL_LINE_BUFFER saying what the boundaries
+   of TEXT are.
+   If this function exists and returns NULL then call the value of
+   rl_completion_entry_function to try to match, otherwise use the
+   array of strings returned. */
+rl_completion_func_t *rl_attempted_completion_function = (rl_completion_func_t *)NULL;
+
+/* Non-zero means to suppress normal filename completion after the
+   user-specified completion function has been called. */
+int rl_attempted_completion_over = 0;
+
+/* Set to a character indicating the type of completion being performed
+   by rl_complete_internal, available for use by application completion
+   functions. */
+int rl_completion_type = 0;
+
+/* Up to this many items will be displayed in response to a
+   possible-completions call.  After that, we ask the user if
+   she is sure she wants to see them all.  A negative value means
+   don't ask. */
+int rl_completion_query_items = 100;
+
+int _rl_page_completions = 1;
+
+/* The basic list of characters that signal a break between words for the
+   completer routine.  The contents of this variable is what breaks words
+   in the shell, i.e. " \t\n\"\\'`@$><=" */
+const char *rl_basic_word_break_characters = " \t\n\"\\'`@$><=;|&{("; /* }) */
+
+/* List of basic quoting characters. */
+const char *rl_basic_quote_characters = "\"'";
+
+/* The list of characters that signal a break between words for
+   rl_complete_internal.  The default list is the contents of
+   rl_basic_word_break_characters.  */
+/*const*/ char *rl_completer_word_break_characters = (/*const*/ char *)NULL;
+
+/* Hook function to allow an application to set the completion word
+   break characters before readline breaks up the line.  Allows
+   position-dependent word break characters. */
+rl_cpvfunc_t *rl_completion_word_break_hook = (rl_cpvfunc_t *)NULL;
+
+/* List of characters which can be used to quote a substring of the line.
+   Completion occurs on the entire substring, and within the substring
+   rl_completer_word_break_characters are treated as any other character,
+   unless they also appear within this list. */
+const char *rl_completer_quote_characters = (const char *)NULL;
+
+/* List of characters that should be quoted in filenames by the completer. */
+const char *rl_filename_quote_characters = (const char *)NULL;
+
+/* List of characters that are word break characters, but should be left
+   in TEXT when it is passed to the completion function.  The shell uses
+   this to help determine what kind of completing to do. */
+const char *rl_special_prefixes = (const char *)NULL;
+
+/* If non-zero, then disallow duplicates in the matches. */
+int rl_ignore_completion_duplicates = 1;
+
+/* Non-zero means that the results of the matches are to be treated
+   as filenames.  This is ALWAYS zero on entry, and can only be changed
+   within a completion entry finder function. */
+int rl_filename_completion_desired = 0;
+
+/* Non-zero means that the results of the matches are to be quoted using
+   double quotes (or an application-specific quoting mechanism) if the
+   filename contains any characters in rl_filename_quote_chars.  This is
+   ALWAYS non-zero on entry, and can only be changed within a completion
+   entry finder function. */
+int rl_filename_quoting_desired = 1;
+
+/* This function, if defined, is called by the completer when real
+   filename completion is done, after all the matching names have been
+   generated. It is passed a (char**) known as matches in the code below.
+   It consists of a NULL-terminated array of pointers to potential
+   matching strings.  The 1st element (matches[0]) is the maximal
+   substring that is common to all matches. This function can re-arrange
+   the list of matches as required, but all elements of the array must be
+   free()'d if they are deleted. The main intent of this function is
+   to implement FIGNORE a la SunOS csh. */
+rl_compignore_func_t *rl_ignore_some_completions_function = (rl_compignore_func_t *)NULL;
+
+/* Set to a function to quote a filename in an application-specific fashion.
+   Called with the text to quote, the type of match found (single or multiple)
+   and a pointer to the quoting character to be used, which the function can
+   reset if desired. */
+rl_quote_func_t *rl_filename_quoting_function = rl_quote_filename;
+         
+/* Function to call to remove quoting characters from a filename.  Called
+   before completion is attempted, so the embedded quotes do not interfere
+   with matching names in the file system.  Readline doesn't do anything
+   with this; it's set only by applications. */
+rl_dequote_func_t *rl_filename_dequoting_function = (rl_dequote_func_t *)NULL;
+
+/* Function to call to decide whether or not a word break character is
+   quoted.  If a character is quoted, it does not break words for the
+   completer. */
+rl_linebuf_func_t *rl_char_is_quoted_p = (rl_linebuf_func_t *)NULL;
+
+/* If non-zero, the completion functions don't append anything except a
+   possible closing quote.  This is set to 0 by rl_complete_internal and
+   may be changed by an application-specific completion function. */
+int rl_completion_suppress_append = 0;
+
+/* Character appended to completed words when at the end of the line.  The
+   default is a space. */
+int rl_completion_append_character = ' ';
+
+/* If non-zero, the completion functions don't append any closing quote.
+   This is set to 0 by rl_complete_internal and may be changed by an
+   application-specific completion function. */
+int rl_completion_suppress_quote = 0;
+
+/* Set to any quote character readline thinks it finds before any application
+   completion function is called. */
+int rl_completion_quote_character;
+
+/* Set to a non-zero value if readline found quoting anywhere in the word to
+   be completed; set before any application completion function is called. */
+int rl_completion_found_quote;
+
+/* If non-zero, a slash will be appended to completed filenames that are
+   symbolic links to directory names, subject to the value of the
+   mark-directories variable (which is user-settable).  This exists so
+   that application completion functions can override the user's preference
+   (set via the mark-symlinked-directories variable) if appropriate.
+   It's set to the value of _rl_complete_mark_symlink_dirs in
+   rl_complete_internal before any application-specific completion
+   function is called, so without that function doing anything, the user's
+   preferences are honored. */
+int rl_completion_mark_symlink_dirs;
+
+/* If non-zero, inhibit completion (temporarily). */
+int rl_inhibit_completion;
+
+/* Variables local to this file. */
+
+/* Local variable states what happened during the last completion attempt. */
+static int completion_changed_buffer;
+
+/*************************************/
+/*                                  */
+/*    Bindable completion functions  */
+/*                                  */
+/*************************************/
+
+/* Complete the word at or before point.  You have supplied the function
+   that does the initial simple matching selection algorithm (see
+   rl_completion_matches ()).  The default is to do filename completion. */
+int
+rl_complete (ignore, invoking_key)
+     int ignore, invoking_key;
+{
+  if (rl_inhibit_completion)
+    return (_rl_insert_char (ignore, invoking_key));
+  else if (rl_last_func == rl_complete && !completion_changed_buffer)
+    return (rl_complete_internal ('?'));
+  else if (_rl_complete_show_all)
+    return (rl_complete_internal ('!'));
+  else if (_rl_complete_show_unmodified)
+    return (rl_complete_internal ('@'));
+  else
+    return (rl_complete_internal (TAB));
+}
+
+/* List the possible completions.  See description of rl_complete (). */
+int
+rl_possible_completions (ignore, invoking_key)
+     int ignore, invoking_key;
+{
+  return (rl_complete_internal ('?'));
+}
+
+int
+rl_insert_completions (ignore, invoking_key)
+     int ignore, invoking_key;
+{
+  return (rl_complete_internal ('*'));
+}
+
+/* Return the correct value to pass to rl_complete_internal performing
+   the same tests as rl_complete.  This allows consecutive calls to an
+   application's completion function to list possible completions and for
+   an application-specific completion function to honor the
+   show-all-if-ambiguous readline variable. */
+int
+rl_completion_mode (cfunc)
+     rl_command_func_t *cfunc;
+{
+  if (rl_last_func == cfunc && !completion_changed_buffer)
+    return '?';
+  else if (_rl_complete_show_all)
+    return '!';
+  else if (_rl_complete_show_unmodified)
+    return '@';
+  else
+    return TAB;
+}
+
+/************************************/
+/*                                 */
+/*    Completion utility functions  */
+/*                                 */
+/************************************/
+
+/* Set default values for readline word completion.  These are the variables
+   that application completion functions can change or inspect. */
+static void
+set_completion_defaults (what_to_do)
+     int what_to_do;
+{
+  /* Only the completion entry function can change these. */
+  rl_filename_completion_desired = 0;
+  rl_filename_quoting_desired = 1;
+  rl_completion_type = what_to_do;
+  rl_completion_suppress_append = rl_completion_suppress_quote = 0;
+
+  /* The completion entry function may optionally change this. */
+  rl_completion_mark_symlink_dirs = _rl_complete_mark_symlink_dirs;
+}
+
+/* The user must press "y" or "n". Non-zero return means "y" pressed. */
+static int
+get_y_or_n (for_pager)
+     int for_pager;
+{
+  int c;
+
+  for (;;)
+    {
+      RL_SETSTATE(RL_STATE_MOREINPUT);
+      c = rl_read_key ();
+      RL_UNSETSTATE(RL_STATE_MOREINPUT);
+
+      if (c == 'y' || c == 'Y' || c == ' ')
+       return (1);
+      if (c == 'n' || c == 'N' || c == RUBOUT)
+       return (0);
+      if (c == ABORT_CHAR)
+       _rl_abort_internal ();
+      if (for_pager && (c == NEWLINE || c == RETURN))
+       return (2);
+      if (for_pager && (c == 'q' || c == 'Q'))
+       return (0);
+      rl_ding ();
+    }
+}
+
+static int
+_rl_internal_pager (lines)
+     int lines;
+{
+  int i;
+
+  fprintf (rl_outstream, "--More--");
+  fflush (rl_outstream);
+  i = get_y_or_n (1);
+  _rl_erase_entire_line ();
+  if (i == 0)
+    return -1;
+  else if (i == 2)
+    return (lines - 1);
+  else
+    return 0;
+}
+
+static int
+path_isdir (filename)
+     const char *filename;
+{
+  struct stat finfo;
+
+  return (stat (filename, &finfo) == 0 && S_ISDIR (finfo.st_mode));
+}
+
+#if defined (VISIBLE_STATS)
+/* Return the character which best describes FILENAME.
+     `@' for symbolic links
+     `/' for directories
+     `*' for executables
+     `=' for sockets
+     `|' for FIFOs
+     `%' for character special devices
+     `#' for block special devices */
+static int
+stat_char (filename)
+     char *filename;
+{
+  struct stat finfo;
+  int character, r;
+
+#if defined (HAVE_LSTAT) && defined (S_ISLNK)
+  r = lstat (filename, &finfo);
+#else
+  r = stat (filename, &finfo);
+#endif
+
+  if (r == -1)
+    return (0);
+
+  character = 0;
+  if (S_ISDIR (finfo.st_mode))
+    character = '/';
+#if defined (S_ISCHR)
+  else if (S_ISCHR (finfo.st_mode))
+    character = '%';
+#endif /* S_ISCHR */
+#if defined (S_ISBLK)
+  else if (S_ISBLK (finfo.st_mode))
+    character = '#';
+#endif /* S_ISBLK */
+#if defined (S_ISLNK)
+  else if (S_ISLNK (finfo.st_mode))
+    character = '@';
+#endif /* S_ISLNK */
+#if defined (S_ISSOCK)
+  else if (S_ISSOCK (finfo.st_mode))
+    character = '=';
+#endif /* S_ISSOCK */
+#if defined (S_ISFIFO)
+  else if (S_ISFIFO (finfo.st_mode))
+    character = '|';
+#endif
+  else if (S_ISREG (finfo.st_mode))
+    {
+      if (access (filename, X_OK) == 0)
+       character = '*';
+    }
+  return (character);
+}
+#endif /* VISIBLE_STATS */
+
+/* Return the portion of PATHNAME that should be output when listing
+   possible completions.  If we are hacking filename completion, we
+   are only interested in the basename, the portion following the
+   final slash.  Otherwise, we return what we were passed.  Since
+   printing empty strings is not very informative, if we're doing
+   filename completion, and the basename is the empty string, we look
+   for the previous slash and return the portion following that.  If
+   there's no previous slash, we just return what we were passed. */
+static char *
+printable_part (pathname)
+      char *pathname;
+{
+  char *temp, *x;
+
+  if (rl_filename_completion_desired == 0)     /* don't need to do anything */
+    return (pathname);
+
+  temp = strrchr (pathname, '/');
+#if defined (__MSDOS__)
+  if (temp == 0 && ISALPHA ((unsigned char)pathname[0]) && pathname[1] == ':')
+    temp = pathname + 1;
+#endif
+
+  if (temp == 0 || *temp == '\0')
+    return (pathname);
+  /* If the basename is NULL, we might have a pathname like '/usr/src/'.
+     Look for a previous slash and, if one is found, return the portion
+     following that slash.  If there's no previous slash, just return the
+     pathname we were passed. */
+  else if (temp[1] == '\0')
+    {
+      for (x = temp - 1; x > pathname; x--)
+        if (*x == '/')
+          break;
+      return ((*x == '/') ? x + 1 : pathname);
+    }
+  else
+    return ++temp;
+}
+
+/* Compute width of STRING when displayed on screen by print_filename */
+static int
+fnwidth (string)
+     const char *string;
+{
+  int width, pos;
+#if defined (HANDLE_MULTIBYTE)
+  mbstate_t ps;
+  int left, w;
+  size_t clen;
+  wchar_t wc;
+
+  left = strlen (string) + 1;
+  memset (&ps, 0, sizeof (mbstate_t));
+#endif
+
+  width = pos = 0;
+  while (string[pos])
+    {
+      if (CTRL_CHAR (*string) || *string == RUBOUT)
+       {
+         width += 2;
+         pos++;
+       }
+      else
+       {
+#if defined (HANDLE_MULTIBYTE)
+         clen = mbrtowc (&wc, string + pos, left - pos, &ps);
+         if (MB_INVALIDCH (clen))
+           {
+             width++;
+             pos++;
+             memset (&ps, 0, sizeof (mbstate_t));
+           }
+         else if (MB_NULLWCH (clen))
+           break;
+         else
+           {
+             pos += clen;
+             w = wcwidth (wc);
+             width += (w >= 0) ? w : 1;
+           }
+#else
+         width++;
+         pos++;
+#endif
+       }
+    }
+
+  return width;
+}
+
+static int
+fnprint (to_print)
+     const char *to_print;
+{
+  int printed_len;
+  const char *s;
+#if defined (HANDLE_MULTIBYTE)
+  mbstate_t ps;
+  const char *end;
+  size_t tlen;
+  int width, w;
+  wchar_t wc;
+
+  end = to_print + strlen (to_print) + 1;
+  memset (&ps, 0, sizeof (mbstate_t));
+#endif
+
+  printed_len = 0;
+  s = to_print;
+  while (*s)
+    {
+      if (CTRL_CHAR (*s))
+        {
+          putc ('^', rl_outstream);
+          putc (UNCTRL (*s), rl_outstream);
+          printed_len += 2;
+          s++;
+#if defined (HANDLE_MULTIBYTE)
+         memset (&ps, 0, sizeof (mbstate_t));
+#endif
+        }
+      else if (*s == RUBOUT)
+       {
+         putc ('^', rl_outstream);
+         putc ('?', rl_outstream);
+         printed_len += 2;
+         s++;
+#if defined (HANDLE_MULTIBYTE)
+         memset (&ps, 0, sizeof (mbstate_t));
+#endif
+       }
+      else
+       {
+#if defined (HANDLE_MULTIBYTE)
+         tlen = mbrtowc (&wc, s, end - s, &ps);
+         if (MB_INVALIDCH (tlen))
+           {
+             tlen = 1;
+             width = 1;
+             memset (&ps, 0, sizeof (mbstate_t));
+           }
+         else if (MB_NULLWCH (tlen))
+           break;
+         else
+           {
+             w = wcwidth (wc);
+             width = (w >= 0) ? w : 1;
+           }
+         fwrite (s, 1, tlen, rl_outstream);
+         s += tlen;
+         printed_len += width;
+#else
+         putc (*s, rl_outstream);
+         s++;
+         printed_len++;
+#endif
+       }
+    }
+
+  return printed_len;
+}
+
+/* Output TO_PRINT to rl_outstream.  If VISIBLE_STATS is defined and we
+   are using it, check for and output a single character for `special'
+   filenames.  Return the number of characters we output. */
+
+static int
+print_filename (to_print, full_pathname)
+     char *to_print, *full_pathname;
+{
+  int printed_len, extension_char, slen, tlen;
+  char *s, c, *new_full_pathname, *dn;
+
+  extension_char = 0;
+  printed_len = fnprint (to_print);
+
+#if defined (VISIBLE_STATS)
+ if (rl_filename_completion_desired && (rl_visible_stats || _rl_complete_mark_directories))
+#else
+ if (rl_filename_completion_desired && _rl_complete_mark_directories)
+#endif
+    {
+      /* If to_print != full_pathname, to_print is the basename of the
+        path passed.  In this case, we try to expand the directory
+        name before checking for the stat character. */
+      if (to_print != full_pathname)
+       {
+         /* Terminate the directory name. */
+         c = to_print[-1];
+         to_print[-1] = '\0';
+
+         /* If setting the last slash in full_pathname to a NUL results in
+            full_pathname being the empty string, we are trying to complete
+            files in the root directory.  If we pass a null string to the
+            bash directory completion hook, for example, it will expand it
+            to the current directory.  We just want the `/'. */
+         if (full_pathname == 0 || *full_pathname == 0)
+           dn = "/";
+         else if (full_pathname[0] != '/')
+           dn = full_pathname;
+         else if (full_pathname[1] == 0)
+           dn = "//";          /* restore trailing slash to `//' */
+         else if (full_pathname[1] == '/' && full_pathname[2] == 0)
+           dn = "/";           /* don't turn /// into // */
+         else
+           dn = full_pathname;
+         s = tilde_expand (dn);
+         if (rl_directory_completion_hook)
+           (*rl_directory_completion_hook) (&s);
+
+         slen = strlen (s);
+         tlen = strlen (to_print);
+         new_full_pathname = (char *)xmalloc (slen + tlen + 2);
+         strcpy (new_full_pathname, s);
+         if (s[slen - 1] == '/')
+           slen--;
+         else
+           new_full_pathname[slen] = '/';
+         new_full_pathname[slen] = '/';
+         strcpy (new_full_pathname + slen + 1, to_print);
+
+#if defined (VISIBLE_STATS)
+         if (rl_visible_stats)
+           extension_char = stat_char (new_full_pathname);
+         else
+#endif
+         if (path_isdir (new_full_pathname))
+           extension_char = '/';
+
+         free (new_full_pathname);
+         to_print[-1] = c;
+       }
+      else
+       {
+         s = tilde_expand (full_pathname);
+#if defined (VISIBLE_STATS)
+         if (rl_visible_stats)
+           extension_char = stat_char (s);
+         else
+#endif
+           if (path_isdir (s))
+             extension_char = '/';
+       }
+
+      free (s);
+      if (extension_char)
+       {
+         putc (extension_char, rl_outstream);
+         printed_len++;
+       }
+    }
+
+  return printed_len;
+}
+
+static char *
+rl_quote_filename (s, rtype, qcp)
+     char *s;
+     int rtype;
+     char *qcp;
+{
+  char *r;
+
+  r = (char *)xmalloc (strlen (s) + 2);
+  *r = *rl_completer_quote_characters;
+  strcpy (r + 1, s);
+  if (qcp)
+    *qcp = *rl_completer_quote_characters;
+  return r;
+}
+
+/* Find the bounds of the current word for completion purposes, and leave
+   rl_point set to the end of the word.  This function skips quoted
+   substrings (characters between matched pairs of characters in
+   rl_completer_quote_characters).  First we try to find an unclosed
+   quoted substring on which to do matching.  If one is not found, we use
+   the word break characters to find the boundaries of the current word.
+   We call an application-specific function to decide whether or not a
+   particular word break character is quoted; if that function returns a
+   non-zero result, the character does not break a word.  This function
+   returns the opening quote character if we found an unclosed quoted
+   substring, '\0' otherwise.  FP, if non-null, is set to a value saying
+   which (shell-like) quote characters we found (single quote, double
+   quote, or backslash) anywhere in the string.  DP, if non-null, is set to
+   the value of the delimiter character that caused a word break. */
+
+char
+_rl_find_completion_word (fp, dp)
+     int *fp, *dp;
+{
+  int scan, end, found_quote, delimiter, pass_next, isbrk;
+  char quote_char, *brkchars;
+
+  end = rl_point;
+  found_quote = delimiter = 0;
+  quote_char = '\0';
+
+  brkchars = 0;
+  if (rl_completion_word_break_hook)
+    brkchars = (*rl_completion_word_break_hook) ();
+  if (brkchars == 0)
+    brkchars = rl_completer_word_break_characters;
+
+  if (rl_completer_quote_characters)
+    {
+      /* We have a list of characters which can be used in pairs to
+        quote substrings for the completer.  Try to find the start
+        of an unclosed quoted substring. */
+      /* FOUND_QUOTE is set so we know what kind of quotes we found. */
+      for (scan = pass_next = 0; scan < end; scan = MB_NEXTCHAR (rl_line_buffer, scan, 1, MB_FIND_ANY))
+       {
+         if (pass_next)
+           {
+             pass_next = 0;
+             continue;
+           }
+
+         /* Shell-like semantics for single quotes -- don't allow backslash
+            to quote anything in single quotes, especially not the closing
+            quote.  If you don't like this, take out the check on the value
+            of quote_char. */
+         if (quote_char != '\'' && rl_line_buffer[scan] == '\\')
+           {
+             pass_next = 1;
+             found_quote |= RL_QF_BACKSLASH;
+             continue;
+           }
+
+         if (quote_char != '\0')
+           {
+             /* Ignore everything until the matching close quote char. */
+             if (rl_line_buffer[scan] == quote_char)
+               {
+                 /* Found matching close.  Abandon this substring. */
+                 quote_char = '\0';
+                 rl_point = end;
+               }
+           }
+         else if (strchr (rl_completer_quote_characters, rl_line_buffer[scan]))
+           {
+             /* Found start of a quoted substring. */
+             quote_char = rl_line_buffer[scan];
+             rl_point = scan + 1;
+             /* Shell-like quoting conventions. */
+             if (quote_char == '\'')
+               found_quote |= RL_QF_SINGLE_QUOTE;
+             else if (quote_char == '"')
+               found_quote |= RL_QF_DOUBLE_QUOTE;
+             else
+               found_quote |= RL_QF_OTHER_QUOTE;      
+           }
+       }
+    }
+
+  if (rl_point == end && quote_char == '\0')
+    {
+      /* We didn't find an unclosed quoted substring upon which to do
+         completion, so use the word break characters to find the
+         substring on which to complete. */
+      while (rl_point = MB_PREVCHAR (rl_line_buffer, rl_point, MB_FIND_ANY))
+       {
+         scan = rl_line_buffer[rl_point];
+
+         if (strchr (brkchars, scan) == 0)
+           continue;
+
+         /* Call the application-specific function to tell us whether
+            this word break character is quoted and should be skipped. */
+         if (rl_char_is_quoted_p && found_quote &&
+             (*rl_char_is_quoted_p) (rl_line_buffer, rl_point))
+           continue;
+
+         /* Convoluted code, but it avoids an n^2 algorithm with calls
+            to char_is_quoted. */
+         break;
+       }
+    }
+
+  /* If we are at an unquoted word break, then advance past it. */
+  scan = rl_line_buffer[rl_point];
+
+  /* If there is an application-specific function to say whether or not
+     a character is quoted and we found a quote character, let that
+     function decide whether or not a character is a word break, even
+     if it is found in rl_completer_word_break_characters.  Don't bother
+     if we're at the end of the line, though. */
+  if (scan)
+    {
+      if (rl_char_is_quoted_p)
+       isbrk = (found_quote == 0 ||
+               (*rl_char_is_quoted_p) (rl_line_buffer, rl_point) == 0) &&
+               strchr (brkchars, scan) != 0;
+      else
+       isbrk = strchr (brkchars, scan) != 0;
+
+      if (isbrk)
+       {
+         /* If the character that caused the word break was a quoting
+            character, then remember it as the delimiter. */
+         if (rl_basic_quote_characters &&
+             strchr (rl_basic_quote_characters, scan) &&
+             (end - rl_point) > 1)
+           delimiter = scan;
+
+         /* If the character isn't needed to determine something special
+            about what kind of completion to perform, then advance past it. */
+         if (rl_special_prefixes == 0 || strchr (rl_special_prefixes, scan) == 0)
+           rl_point++;
+       }
+    }
+
+  if (fp)
+    *fp = found_quote;
+  if (dp)
+    *dp = delimiter;
+
+  return (quote_char);
+}
+
+static char **
+gen_completion_matches (text, start, end, our_func, found_quote, quote_char)
+     char *text;
+     int start, end;
+     rl_compentry_func_t *our_func;
+     int found_quote, quote_char;
+{
+  char **matches;
+
+  rl_completion_found_quote = found_quote;
+  rl_completion_quote_character = quote_char;
+
+  /* If the user wants to TRY to complete, but then wants to give
+     up and use the default completion function, they set the
+     variable rl_attempted_completion_function. */
+  if (rl_attempted_completion_function)
+    {
+      matches = (*rl_attempted_completion_function) (text, start, end);
+
+      if (matches || rl_attempted_completion_over)
+       {
+         rl_attempted_completion_over = 0;
+         return (matches);
+       }
+    }
+
+  /* XXX -- filename dequoting moved into rl_filename_completion_function */
+
+  matches = rl_completion_matches (text, our_func);
+  return matches;  
+}
+
+/* Filter out duplicates in MATCHES.  This frees up the strings in
+   MATCHES. */
+static char **
+remove_duplicate_matches (matches)
+     char **matches;
+{
+  char *lowest_common;
+  int i, j, newlen;
+  char dead_slot;
+  char **temp_array;
+
+  /* Sort the items. */
+  for (i = 0; matches[i]; i++)
+    ;
+
+  /* Sort the array without matches[0], since we need it to
+     stay in place no matter what. */
+  if (i)
+    qsort (matches+1, i-1, sizeof (char *), (QSFUNC *)_rl_qsort_string_compare);
+
+  /* Remember the lowest common denominator for it may be unique. */
+  lowest_common = savestring (matches[0]);
+
+  for (i = newlen = 0; matches[i + 1]; i++)
+    {
+      if (strcmp (matches[i], matches[i + 1]) == 0)
+       {
+         free (matches[i]);
+         matches[i] = (char *)&dead_slot;
+       }
+      else
+       newlen++;
+    }
+
+  /* We have marked all the dead slots with (char *)&dead_slot.
+     Copy all the non-dead entries into a new array. */
+  temp_array = (char **)xmalloc ((3 + newlen) * sizeof (char *));
+  for (i = j = 1; matches[i]; i++)
+    {
+      if (matches[i] != (char *)&dead_slot)
+       temp_array[j++] = matches[i];
+    }
+  temp_array[j] = (char *)NULL;
+
+  if (matches[0] != (char *)&dead_slot)
+    free (matches[0]);
+
+  /* Place the lowest common denominator back in [0]. */
+  temp_array[0] = lowest_common;
+
+  /* If there is one string left, and it is identical to the
+     lowest common denominator, then the LCD is the string to
+     insert. */
+  if (j == 2 && strcmp (temp_array[0], temp_array[1]) == 0)
+    {
+      free (temp_array[1]);
+      temp_array[1] = (char *)NULL;
+    }
+  return (temp_array);
+}
+
+/* Find the common prefix of the list of matches, and put it into
+   matches[0]. */
+static int
+compute_lcd_of_matches (match_list, matches, text)
+     char **match_list;
+     int matches;
+     const char *text;
+{
+  register int i, c1, c2, si;
+  int low;             /* Count of max-matched characters. */
+  char *dtext;         /* dequoted TEXT, if needed */
+#if defined (HANDLE_MULTIBYTE)
+  int v;
+  mbstate_t ps1, ps2;
+  wchar_t wc1, wc2;
+#endif
+
+  /* If only one match, just use that.  Otherwise, compare each
+     member of the list with the next, finding out where they
+     stop matching. */
+  if (matches == 1)
+    {
+      match_list[0] = match_list[1];
+      match_list[1] = (char *)NULL;
+      return 1;
+    }
+
+  for (i = 1, low = 100000; i < matches; i++)
+    {
+#if defined (HANDLE_MULTIBYTE)
+      if (MB_CUR_MAX > 1 && rl_byte_oriented == 0)
+       {
+         memset (&ps1, 0, sizeof (mbstate_t));
+         memset (&ps2, 0, sizeof (mbstate_t));
+       }
+#endif
+      if (_rl_completion_case_fold)
+       {
+         for (si = 0;
+              (c1 = _rl_to_lower(match_list[i][si])) &&
+              (c2 = _rl_to_lower(match_list[i + 1][si]));
+              si++)
+#if defined (HANDLE_MULTIBYTE)
+           if (MB_CUR_MAX > 1 && rl_byte_oriented == 0)
+             {
+               v = mbrtowc (&wc1, match_list[i]+si, strlen (match_list[i]+si), &ps1);
+               mbrtowc (&wc2, match_list[i+1]+si, strlen (match_list[i+1]+si), &ps2);
+               wc1 = towlower (wc1);
+               wc2 = towlower (wc2);
+               if (wc1 != wc2)
+                 break;
+               else if (v > 1)
+                 si += v - 1;
+             }
+           else
+#endif
+           if (c1 != c2)
+             break;
+       }
+      else
+       {
+         for (si = 0;
+              (c1 = match_list[i][si]) &&
+              (c2 = match_list[i + 1][si]);
+              si++)
+#if defined (HANDLE_MULTIBYTE)
+           if (MB_CUR_MAX > 1 && rl_byte_oriented == 0)
+             {
+               mbstate_t ps_back;
+               ps_back = ps1;
+               if (!_rl_compare_chars (match_list[i], si, &ps1, match_list[i+1], si, &ps2))
+                 break;
+               else if ((v = _rl_get_char_len (&match_list[i][si], &ps_back)) > 1)
+                 si += v - 1;
+             }
+           else
+#endif
+           if (c1 != c2)
+             break;
+       }
+
+      if (low > si)
+       low = si;
+    }
+
+  /* If there were multiple matches, but none matched up to even the
+     first character, and the user typed something, use that as the
+     value of matches[0]. */
+  if (low == 0 && text && *text)
+    {
+      match_list[0] = (char *)xmalloc (strlen (text) + 1);
+      strcpy (match_list[0], text);
+    }
+  else
+    {
+      match_list[0] = (char *)xmalloc (low + 1);
+
+      /* XXX - this might need changes in the presence of multibyte chars */
+
+      /* If we are ignoring case, try to preserve the case of the string
+        the user typed in the face of multiple matches differing in case. */
+      if (_rl_completion_case_fold)
+       {
+         /* We're making an assumption here:
+               IF we're completing filenames AND
+                  the application has defined a filename dequoting function AND
+                  we found a quote character AND
+                  the application has requested filename quoting
+               THEN
+                  we assume that TEXT was dequoted before checking against
+                  the file system and needs to be dequoted here before we
+                  check against the list of matches
+               FI */
+         dtext = (char *)NULL;
+         if (rl_filename_completion_desired &&
+             rl_filename_dequoting_function &&
+             rl_completion_found_quote &&
+             rl_filename_quoting_desired)
+           {
+             dtext = (*rl_filename_dequoting_function) ((char *)text, rl_completion_quote_character);
+             text = dtext;
+           }
+
+         /* sort the list to get consistent answers. */
+         qsort (match_list+1, matches, sizeof(char *), (QSFUNC *)_rl_qsort_string_compare);
+
+         si = strlen (text);
+         if (si <= low)
+           {
+             for (i = 1; i <= matches; i++)
+               if (strncmp (match_list[i], text, si) == 0)
+                 {
+                   strncpy (match_list[0], match_list[i], low);
+                   break;
+                 }
+             /* no casematch, use first entry */
+             if (i > matches)
+               strncpy (match_list[0], match_list[1], low);
+           }
+         else
+           /* otherwise, just use the text the user typed. */
+           strncpy (match_list[0], text, low);
+
+         FREE (dtext);
+       }
+      else
+        strncpy (match_list[0], match_list[1], low);
+
+      match_list[0][low] = '\0';
+    }
+
+  return matches;
+}
+
+static int
+postprocess_matches (matchesp, matching_filenames)
+     char ***matchesp;
+     int matching_filenames;
+{
+  char *t, **matches, **temp_matches;
+  int nmatch, i;
+
+  matches = *matchesp;
+
+  if (matches == 0)
+    return 0;
+
+  /* It seems to me that in all the cases we handle we would like
+     to ignore duplicate possiblilities.  Scan for the text to
+     insert being identical to the other completions. */
+  if (rl_ignore_completion_duplicates)
+    {
+      temp_matches = remove_duplicate_matches (matches);
+      free (matches);
+      matches = temp_matches;
+    }
+
+  /* If we are matching filenames, then here is our chance to
+     do clever processing by re-examining the list.  Call the
+     ignore function with the array as a parameter.  It can
+     munge the array, deleting matches as it desires. */
+  if (rl_ignore_some_completions_function && matching_filenames)
+    {
+      for (nmatch = 1; matches[nmatch]; nmatch++)
+       ;
+      (void)(*rl_ignore_some_completions_function) (matches);
+      if (matches == 0 || matches[0] == 0)
+       {
+         FREE (matches);
+         *matchesp = (char **)0;
+         return 0;
+        }
+      else
+       {
+         /* If we removed some matches, recompute the common prefix. */
+         for (i = 1; matches[i]; i++)
+           ;
+         if (i > 1 && i < nmatch)
+           {
+             t = matches[0];
+             compute_lcd_of_matches (matches, i - 1, t);
+             FREE (t);
+           }
+       }
+    }
+
+  *matchesp = matches;
+  return (1);
+}
+
+/* A convenience function for displaying a list of strings in
+   columnar format on readline's output stream.  MATCHES is the list
+   of strings, in argv format, LEN is the number of strings in MATCHES,
+   and MAX is the length of the longest string in MATCHES. */
+void
+rl_display_match_list (matches, len, max)
+     char **matches;
+     int len, max;
+{
+  int count, limit, printed_len, lines;
+  int i, j, k, l;
+  char *temp;
+
+  /* How many items of MAX length can we fit in the screen window? */
+  max += 2;
+  limit = _rl_screenwidth / max;
+  if (limit != 1 && (limit * max == _rl_screenwidth))
+    limit--;
+
+  /* Avoid a possible floating exception.  If max > _rl_screenwidth,
+     limit will be 0 and a divide-by-zero fault will result. */
+  if (limit == 0)
+    limit = 1;
+
+  /* How many iterations of the printing loop? */
+  count = (len + (limit - 1)) / limit;
+
+  /* Watch out for special case.  If LEN is less than LIMIT, then
+     just do the inner printing loop.
+          0 < len <= limit  implies  count = 1. */
+
+  /* Sort the items if they are not already sorted. */
+  if (rl_ignore_completion_duplicates == 0)
+    qsort (matches + 1, len, sizeof (char *), (QSFUNC *)_rl_qsort_string_compare);
+
+  rl_crlf ();
+
+  lines = 0;
+  if (_rl_print_completions_horizontally == 0)
+    {
+      /* Print the sorted items, up-and-down alphabetically, like ls. */
+      for (i = 1; i <= count; i++)
+       {
+         for (j = 0, l = i; j < limit; j++)
+           {
+             if (l > len || matches[l] == 0)
+               break;
+             else
+               {
+                 temp = printable_part (matches[l]);
+                 printed_len = print_filename (temp, matches[l]);
+
+                 if (j + 1 < limit)
+                   for (k = 0; k < max - printed_len; k++)
+                     putc (' ', rl_outstream);
+               }
+             l += count;
+           }
+         rl_crlf ();
+         lines++;
+         if (_rl_page_completions && lines >= (_rl_screenheight - 1) && i < count)
+           {
+             lines = _rl_internal_pager (lines);
+             if (lines < 0)
+               return;
+           }
+       }
+    }
+  else
+    {
+      /* Print the sorted items, across alphabetically, like ls -x. */
+      for (i = 1; matches[i]; i++)
+       {
+         temp = printable_part (matches[i]);
+         printed_len = print_filename (temp, matches[i]);
+         /* Have we reached the end of this line? */
+         if (matches[i+1])
+           {
+             if (i && (limit > 1) && (i % limit) == 0)
+               {
+                 rl_crlf ();
+                 lines++;
+                 if (_rl_page_completions && lines >= _rl_screenheight - 1)
+                   {
+                     lines = _rl_internal_pager (lines);
+                     if (lines < 0)
+                       return;
+                   }
+               }
+             else
+               for (k = 0; k < max - printed_len; k++)
+                 putc (' ', rl_outstream);
+           }
+       }
+      rl_crlf ();
+    }
+}
+
+/* Display MATCHES, a list of matching filenames in argv format.  This
+   handles the simple case -- a single match -- first.  If there is more
+   than one match, we compute the number of strings in the list and the
+   length of the longest string, which will be needed by the display
+   function.  If the application wants to handle displaying the list of
+   matches itself, it sets RL_COMPLETION_DISPLAY_MATCHES_HOOK to the
+   address of a function, and we just call it.  If we're handling the
+   display ourselves, we just call rl_display_match_list.  We also check
+   that the list of matches doesn't exceed the user-settable threshold,
+   and ask the user if he wants to see the list if there are more matches
+   than RL_COMPLETION_QUERY_ITEMS. */
+static void
+display_matches (matches)
+     char **matches;
+{
+  int len, max, i;
+  char *temp;
+
+  /* Move to the last visible line of a possibly-multiple-line command. */
+  _rl_move_vert (_rl_vis_botlin);
+
+  /* Handle simple case first.  What if there is only one answer? */
+  if (matches[1] == 0)
+    {
+      temp = printable_part (matches[0]);
+      rl_crlf ();
+      print_filename (temp, matches[0]);
+      rl_crlf ();
+
+      rl_forced_update_display ();
+      rl_display_fixed = 1;
+
+      return;
+    }
+
+  /* There is more than one answer.  Find out how many there are,
+     and find the maximum printed length of a single entry. */
+  for (max = 0, i = 1; matches[i]; i++)
+    {
+      temp = printable_part (matches[i]);
+      len = fnwidth (temp);
+
+      if (len > max)
+       max = len;
+    }
+
+  len = i - 1;
+
+  /* If the caller has defined a display hook, then call that now. */
+  if (rl_completion_display_matches_hook)
+    {
+      (*rl_completion_display_matches_hook) (matches, len, max);
+      return;
+    }
+       
+  /* If there are many items, then ask the user if she really wants to
+     see them all. */
+  if (rl_completion_query_items > 0 && len >= rl_completion_query_items)
+    {
+      rl_crlf ();
+      fprintf (rl_outstream, "Display all %d possibilities? (y or n)", len);
+      fflush (rl_outstream);
+      if (get_y_or_n (0) == 0)
+       {
+         rl_crlf ();
+
+         rl_forced_update_display ();
+         rl_display_fixed = 1;
+
+         return;
+       }
+    }
+
+  rl_display_match_list (matches, len, max);
+
+  rl_forced_update_display ();
+  rl_display_fixed = 1;
+}
+
+static char *
+make_quoted_replacement (match, mtype, qc)
+     char *match;
+     int mtype;
+     char *qc; /* Pointer to quoting character, if any */
+{
+  int should_quote, do_replace;
+  char *replacement;
+
+  /* If we are doing completion on quoted substrings, and any matches
+     contain any of the completer_word_break_characters, then auto-
+     matically prepend the substring with a quote character (just pick
+     the first one from the list of such) if it does not already begin
+     with a quote string.  FIXME: Need to remove any such automatically
+     inserted quote character when it no longer is necessary, such as
+     if we change the string we are completing on and the new set of
+     matches don't require a quoted substring. */
+  replacement = match;
+
+  should_quote = match && rl_completer_quote_characters &&
+                       rl_filename_completion_desired &&
+                       rl_filename_quoting_desired;
+
+  if (should_quote)
+    should_quote = should_quote && (!qc || !*qc ||
+                    (rl_completer_quote_characters && strchr (rl_completer_quote_characters, *qc)));
+
+  if (should_quote)
+    {
+      /* If there is a single match, see if we need to quote it.
+         This also checks whether the common prefix of several
+        matches needs to be quoted. */
+      should_quote = rl_filename_quote_characters
+                       ? (_rl_strpbrk (match, rl_filename_quote_characters) != 0)
+                       : 0;
+
+      do_replace = should_quote ? mtype : NO_MATCH;
+      /* Quote the replacement, since we found an embedded
+        word break character in a potential match. */
+      if (do_replace != NO_MATCH && rl_filename_quoting_function)
+       replacement = (*rl_filename_quoting_function) (match, do_replace, qc);
+    }
+  return (replacement);
+}
+
+static void
+insert_match (match, start, mtype, qc)
+     char *match;
+     int start, mtype;
+     char *qc;
+{
+  char *replacement;
+  char oqc;
+
+  oqc = qc ? *qc : '\0';
+  replacement = make_quoted_replacement (match, mtype, qc);
+
+  /* Now insert the match. */
+  if (replacement)
+    {
+      /* Don't double an opening quote character. */
+      if (qc && *qc && start && rl_line_buffer[start - 1] == *qc &&
+           replacement[0] == *qc)
+       start--;
+      /* If make_quoted_replacement changed the quoting character, remove
+        the opening quote and insert the (fully-quoted) replacement. */
+      else if (qc && (*qc != oqc) && start && rl_line_buffer[start - 1] == oqc &&
+           replacement[0] != oqc)
+       start--;
+      _rl_replace_text (replacement, start, rl_point - 1);
+      if (replacement != match)
+        free (replacement);
+    }
+}
+
+/* Append any necessary closing quote and a separator character to the
+   just-inserted match.  If the user has specified that directories
+   should be marked by a trailing `/', append one of those instead.  The
+   default trailing character is a space.  Returns the number of characters
+   appended.  If NONTRIVIAL_MATCH is set, we test for a symlink (if the OS
+   has them) and don't add a suffix for a symlink to a directory.  A
+   nontrivial match is one that actually adds to the word being completed.
+   The variable rl_completion_mark_symlink_dirs controls this behavior
+   (it's initially set to the what the user has chosen, indicated by the
+   value of _rl_complete_mark_symlink_dirs, but may be modified by an
+   application's completion function). */
+static int
+append_to_match (text, delimiter, quote_char, nontrivial_match)
+     char *text;
+     int delimiter, quote_char, nontrivial_match;
+{
+  char temp_string[4], *filename;
+  int temp_string_index, s;
+  struct stat finfo;
+
+  temp_string_index = 0;
+  if (quote_char && rl_point && rl_completion_suppress_quote == 0 &&
+      rl_line_buffer[rl_point - 1] != quote_char)
+    temp_string[temp_string_index++] = quote_char;
+
+  if (delimiter)
+    temp_string[temp_string_index++] = delimiter;
+  else if (rl_completion_suppress_append == 0 && rl_completion_append_character)
+    temp_string[temp_string_index++] = rl_completion_append_character;
+
+  temp_string[temp_string_index++] = '\0';
+
+  if (rl_filename_completion_desired)
+    {
+      filename = tilde_expand (text);
+      s = (nontrivial_match && rl_completion_mark_symlink_dirs == 0)
+               ? LSTAT (filename, &finfo)
+               : stat (filename, &finfo);
+      if (s == 0 && S_ISDIR (finfo.st_mode))
+       {
+         if (_rl_complete_mark_directories /* && rl_completion_suppress_append == 0 */)
+           {
+             /* This is clumsy.  Avoid putting in a double slash if point
+                is at the end of the line and the previous character is a
+                slash. */
+             if (rl_point && rl_line_buffer[rl_point] == '\0' && rl_line_buffer[rl_point - 1] == '/')
+               ;
+             else if (rl_line_buffer[rl_point] != '/')
+               rl_insert_text ("/");
+           }
+       }
+#ifdef S_ISLNK
+      /* Don't add anything if the filename is a symlink and resolves to a
+        directory. */
+      else if (s == 0 && S_ISLNK (finfo.st_mode) &&
+              stat (filename, &finfo) == 0 && S_ISDIR (finfo.st_mode))
+       ;
+#endif
+      else
+       {
+         if (rl_point == rl_end && temp_string_index)
+           rl_insert_text (temp_string);
+       }
+      free (filename);
+    }
+  else
+    {
+      if (rl_point == rl_end && temp_string_index)
+       rl_insert_text (temp_string);
+    }
+
+  return (temp_string_index);
+}
+
+static void
+insert_all_matches (matches, point, qc)
+     char **matches;
+     int point;
+     char *qc;
+{
+  int i;
+  char *rp;
+
+  rl_begin_undo_group ();
+  /* remove any opening quote character; make_quoted_replacement will add
+     it back. */
+  if (qc && *qc && point && rl_line_buffer[point - 1] == *qc)
+    point--;
+  rl_delete_text (point, rl_point);
+  rl_point = point;
+
+  if (matches[1])
+    {
+      for (i = 1; matches[i]; i++)
+       {
+         rp = make_quoted_replacement (matches[i], SINGLE_MATCH, qc);
+         rl_insert_text (rp);
+         rl_insert_text (" ");
+         if (rp != matches[i])
+           free (rp);
+       }
+    }
+  else
+    {
+      rp = make_quoted_replacement (matches[0], SINGLE_MATCH, qc);
+      rl_insert_text (rp);
+      rl_insert_text (" ");
+      if (rp != matches[0])
+       free (rp);
+    }
+  rl_end_undo_group ();
+}
+
+void
+_rl_free_match_list (matches)
+     char **matches;
+{
+  register int i;
+
+  if (matches == 0)
+    return;
+
+  for (i = 0; matches[i]; i++)
+    free (matches[i]);
+  free (matches);
+}
+
+/* Complete the word at or before point.
+   WHAT_TO_DO says what to do with the completion.
+   `?' means list the possible completions.
+   TAB means do standard completion.
+   `*' means insert all of the possible completions.
+   `!' means to do standard completion, and list all possible completions if
+   there is more than one.
+   `@' means to do standard completion, and list all possible completions if
+   there is more than one and partial completion is not possible. */
+int
+rl_complete_internal (what_to_do)
+     int what_to_do;
+{
+  char **matches;
+  rl_compentry_func_t *our_func;
+  int start, end, delimiter, found_quote, i, nontrivial_lcd;
+  char *text, *saved_line_buffer;
+  char quote_char;
+
+  RL_SETSTATE(RL_STATE_COMPLETING);
+
+  set_completion_defaults (what_to_do);
+
+  saved_line_buffer = rl_line_buffer ? savestring (rl_line_buffer) : (char *)NULL;
+  our_func = rl_completion_entry_function
+               ? rl_completion_entry_function
+               : rl_filename_completion_function;
+  /* We now look backwards for the start of a filename/variable word. */
+  end = rl_point;
+  found_quote = delimiter = 0;
+  quote_char = '\0';
+
+  if (rl_point)
+    /* This (possibly) changes rl_point.  If it returns a non-zero char,
+       we know we have an open quote. */
+    quote_char = _rl_find_completion_word (&found_quote, &delimiter);
+
+  start = rl_point;
+  rl_point = end;
+
+  text = rl_copy_text (start, end);
+  matches = gen_completion_matches (text, start, end, our_func, found_quote, quote_char);
+  /* nontrivial_lcd is set if the common prefix adds something to the word
+     being completed. */
+  nontrivial_lcd = matches && strcmp (text, matches[0]) != 0;
+  free (text);
+
+  if (matches == 0)
+    {
+      rl_ding ();
+      FREE (saved_line_buffer);
+      completion_changed_buffer = 0;
+      RL_UNSETSTATE(RL_STATE_COMPLETING);
+      return (0);
+    }
+
+  /* If we are matching filenames, the attempted completion function will
+     have set rl_filename_completion_desired to a non-zero value.  The basic
+     rl_filename_completion_function does this. */
+  i = rl_filename_completion_desired;
+
+  if (postprocess_matches (&matches, i) == 0)
+    {
+      rl_ding ();
+      FREE (saved_line_buffer);
+      completion_changed_buffer = 0;
+      RL_UNSETSTATE(RL_STATE_COMPLETING);
+      return (0);
+    }
+
+  switch (what_to_do)
+    {
+    case TAB:
+    case '!':
+    case '@':
+      /* Insert the first match with proper quoting. */
+      if (*matches[0])
+       insert_match (matches[0], start, matches[1] ? MULT_MATCH : SINGLE_MATCH, &quote_char);
+
+      /* If there are more matches, ring the bell to indicate.
+        If we are in vi mode, Posix.2 says to not ring the bell.
+        If the `show-all-if-ambiguous' variable is set, display
+        all the matches immediately.  Otherwise, if this was the
+        only match, and we are hacking files, check the file to
+        see if it was a directory.  If so, and the `mark-directories'
+        variable is set, add a '/' to the name.  If not, and we
+        are at the end of the line, then add a space.  */
+      if (matches[1])
+       {
+         if (what_to_do == '!')
+           {
+             display_matches (matches);
+             break;
+           }
+         else if (what_to_do == '@')
+           {
+             if (nontrivial_lcd == 0)
+               display_matches (matches);
+             break;
+           }
+         else if (rl_editing_mode != vi_mode)
+           rl_ding (); /* There are other matches remaining. */
+       }
+      else
+       append_to_match (matches[0], delimiter, quote_char, nontrivial_lcd);
+
+      break;
+
+    case '*':
+      insert_all_matches (matches, start, &quote_char);
+      break;
+
+    case '?':
+      display_matches (matches);
+      break;
+
+    default:
+      fprintf (stderr, "\r\nreadline: bad value %d for what_to_do in rl_complete\n", what_to_do);
+      rl_ding ();
+      FREE (saved_line_buffer);
+      RL_UNSETSTATE(RL_STATE_COMPLETING);
+      return 1;
+    }
+
+  _rl_free_match_list (matches);
+
+  /* Check to see if the line has changed through all of this manipulation. */
+  if (saved_line_buffer)
+    {
+      completion_changed_buffer = strcmp (rl_line_buffer, saved_line_buffer) != 0;
+      free (saved_line_buffer);
+    }
+
+  RL_UNSETSTATE(RL_STATE_COMPLETING);
+  return 0;
+}
+
+/***************************************************************/
+/*                                                            */
+/*  Application-callable completion match generator functions  */
+/*                                                            */
+/***************************************************************/
+
+/* Return an array of (char *) which is a list of completions for TEXT.
+   If there are no completions, return a NULL pointer.
+   The first entry in the returned array is the substitution for TEXT.
+   The remaining entries are the possible completions.
+   The array is terminated with a NULL pointer.
+
+   ENTRY_FUNCTION is a function of two args, and returns a (char *).
+     The first argument is TEXT.
+     The second is a state argument; it should be zero on the first call, and
+     non-zero on subsequent calls.  It returns a NULL pointer to the caller
+     when there are no more matches.
+ */
+char **
+rl_completion_matches (text, entry_function)
+     const char *text;
+     rl_compentry_func_t *entry_function;
+{
+  /* Number of slots in match_list. */
+  int match_list_size;
+
+  /* The list of matches. */
+  char **match_list;
+
+  /* Number of matches actually found. */
+  int matches;
+
+  /* Temporary string binder. */
+  char *string;
+
+  matches = 0;
+  match_list_size = 10;
+  match_list = (char **)xmalloc ((match_list_size + 1) * sizeof (char *));
+  match_list[1] = (char *)NULL;
+
+  while (string = (*entry_function) (text, matches))
+    {
+      if (matches + 1 == match_list_size)
+       match_list = (char **)xrealloc
+         (match_list, ((match_list_size += 10) + 1) * sizeof (char *));
+
+      match_list[++matches] = string;
+      match_list[matches + 1] = (char *)NULL;
+    }
+
+  /* If there were any matches, then look through them finding out the
+     lowest common denominator.  That then becomes match_list[0]. */
+  if (matches)
+    compute_lcd_of_matches (match_list, matches, text);
+  else                         /* There were no matches. */
+    {
+      free (match_list);
+      match_list = (char **)NULL;
+    }
+  return (match_list);
+}
+
+/* A completion function for usernames.
+   TEXT contains a partial username preceded by a random
+   character (usually `~').  */
+char *
+rl_username_completion_function (text, state)
+     const char *text;
+     int state;
+{
+#if defined (__WIN32__) || defined (__OPENNT)
+  return (char *)NULL;
+#else /* !__WIN32__ && !__OPENNT) */
+  static char *username = (char *)NULL;
+  static struct passwd *entry;
+  static int namelen, first_char, first_char_loc;
+  char *value;
+
+  if (state == 0)
+    {
+      FREE (username);
+
+      first_char = *text;
+      first_char_loc = first_char == '~';
+
+      username = savestring (&text[first_char_loc]);
+      namelen = strlen (username);
+      setpwent ();
+    }
+
+#if defined (HAVE_GETPWENT)
+  while (entry = getpwent ())
+    {
+      /* Null usernames should result in all users as possible completions. */
+      if (namelen == 0 || (STREQN (username, entry->pw_name, namelen)))
+       break;
+    }
+#endif
+
+  if (entry == 0)
+    {
+#if defined (HAVE_GETPWENT)
+      endpwent ();
+#endif
+      return ((char *)NULL);
+    }
+  else
+    {
+      value = (char *)xmalloc (2 + strlen (entry->pw_name));
+
+      *value = *text;
+
+      strcpy (value + first_char_loc, entry->pw_name);
+
+      if (first_char == '~')
+       rl_filename_completion_desired = 1;
+
+      return (value);
+    }
+#endif /* !__WIN32__ && !__OPENNT */
+}
+
+/* Okay, now we write the entry_function for filename completion.  In the
+   general case.  Note that completion in the shell is a little different
+   because of all the pathnames that must be followed when looking up the
+   completion for a command. */
+char *
+rl_filename_completion_function (text, state)
+     const char *text;
+     int state;
+{
+  static DIR *directory = (DIR *)NULL;
+  static char *filename = (char *)NULL;
+  static char *dirname = (char *)NULL;
+  static char *users_dirname = (char *)NULL;
+  static int filename_len;
+  char *temp;
+  int dirlen;
+  struct dirent *entry;
+
+  /* If we don't have any state, then do some initialization. */
+  if (state == 0)
+    {
+      /* If we were interrupted before closing the directory or reading
+        all of its contents, close it. */
+      if (directory)
+       {
+         closedir (directory);
+         directory = (DIR *)NULL;
+       }
+      FREE (dirname);
+      FREE (filename);
+      FREE (users_dirname);
+
+      filename = savestring (text);
+      if (*text == 0)
+       text = ".";
+      dirname = savestring (text);
+
+      temp = strrchr (dirname, '/');
+
+#if defined (__MSDOS__)
+      /* special hack for //X/... */
+      if (dirname[0] == '/' && dirname[1] == '/' && ISALPHA ((unsigned char)dirname[2]) && dirname[3] == '/')
+        temp = strrchr (dirname + 3, '/');
+#endif
+
+      if (temp)
+       {
+         strcpy (filename, ++temp);
+         *temp = '\0';
+       }
+#if defined (__MSDOS__)
+      /* searches from current directory on the drive */
+      else if (ISALPHA ((unsigned char)dirname[0]) && dirname[1] == ':')
+        {
+          strcpy (filename, dirname + 2);
+          dirname[2] = '\0';
+        }
+#endif
+      else
+       {
+         dirname[0] = '.';
+         dirname[1] = '\0';
+       }
+
+      /* We aren't done yet.  We also support the "~user" syntax. */
+
+      /* Save the version of the directory that the user typed. */
+      users_dirname = savestring (dirname);
+
+      if (*dirname == '~')
+       {
+         temp = tilde_expand (dirname);
+         free (dirname);
+         dirname = temp;
+       }
+
+      if (rl_directory_rewrite_hook)
+       (*rl_directory_rewrite_hook) (&dirname);
+
+      /* The directory completion hook should perform any necessary
+        dequoting. */
+      if (rl_directory_completion_hook && (*rl_directory_completion_hook) (&dirname))
+       {
+         free (users_dirname);
+         users_dirname = savestring (dirname);
+       }
+      else if (rl_completion_found_quote && rl_filename_dequoting_function)
+       {
+         /* delete single and double quotes */
+         temp = (*rl_filename_dequoting_function) (users_dirname, rl_completion_quote_character);
+         free (users_dirname);
+         users_dirname = temp;
+       }
+      directory = opendir (dirname);
+
+      /* Now dequote a non-null filename. */
+      if (filename && *filename && rl_completion_found_quote && rl_filename_dequoting_function)
+       {
+         /* delete single and double quotes */
+         temp = (*rl_filename_dequoting_function) (filename, rl_completion_quote_character);
+         free (filename);
+         filename = temp;
+       }
+      filename_len = strlen (filename);
+
+      rl_filename_completion_desired = 1;
+    }
+
+  /* At this point we should entertain the possibility of hacking wildcarded
+     filenames, like /usr/man/man<WILD>/te<TAB>.  If the directory name
+     contains globbing characters, then build an array of directories, and
+     then map over that list while completing. */
+  /* *** UNIMPLEMENTED *** */
+
+  /* Now that we have some state, we can read the directory. */
+
+  entry = (struct dirent *)NULL;
+  while (directory && (entry = readdir (directory)))
+    {
+      /* Special case for no filename.  If the user has disabled the
+         `match-hidden-files' variable, skip filenames beginning with `.'.
+        All other entries except "." and ".." match. */
+      if (filename_len == 0)
+       {
+         if (_rl_match_hidden_files == 0 && HIDDEN_FILE (entry->d_name))
+           continue;
+
+         if (entry->d_name[0] != '.' ||
+              (entry->d_name[1] &&
+                (entry->d_name[1] != '.' || entry->d_name[2])))
+           break;
+       }
+      else
+       {
+         /* Otherwise, if these match up to the length of filename, then
+            it is a match. */
+         if (_rl_completion_case_fold)
+           {
+             if ((_rl_to_lower (entry->d_name[0]) == _rl_to_lower (filename[0])) &&
+                 (((int)D_NAMLEN (entry)) >= filename_len) &&
+                 (_rl_strnicmp (filename, entry->d_name, filename_len) == 0))
+               break;
+           }
+         else
+           {
+             if ((entry->d_name[0] == filename[0]) &&
+                 (((int)D_NAMLEN (entry)) >= filename_len) &&
+                 (strncmp (filename, entry->d_name, filename_len) == 0))
+               break;
+           }
+       }
+    }
+
+  if (entry == 0)
+    {
+      if (directory)
+       {
+         closedir (directory);
+         directory = (DIR *)NULL;
+       }
+      if (dirname)
+       {
+         free (dirname);
+         dirname = (char *)NULL;
+       }
+      if (filename)
+       {
+         free (filename);
+         filename = (char *)NULL;
+       }
+      if (users_dirname)
+       {
+         free (users_dirname);
+         users_dirname = (char *)NULL;
+       }
+
+      return (char *)NULL;
+    }
+  else
+    {
+      /* dirname && (strcmp (dirname, ".") != 0) */
+      if (dirname && (dirname[0] != '.' || dirname[1]))
+       {
+         if (rl_complete_with_tilde_expansion && *users_dirname == '~')
+           {
+             dirlen = strlen (dirname);
+             temp = (char *)xmalloc (2 + dirlen + D_NAMLEN (entry));
+             strcpy (temp, dirname);
+             /* Canonicalization cuts off any final slash present.  We
+                may need to add it back. */
+             if (dirname[dirlen - 1] != '/')
+               {
+                 temp[dirlen++] = '/';
+                 temp[dirlen] = '\0';
+               }
+           }
+         else
+           {
+             dirlen = strlen (users_dirname);
+             temp = (char *)xmalloc (2 + dirlen + D_NAMLEN (entry));
+             strcpy (temp, users_dirname);
+             /* Make sure that temp has a trailing slash here. */
+             if (users_dirname[dirlen - 1] != '/')
+               temp[dirlen++] = '/';
+           }
+
+         strcpy (temp + dirlen, entry->d_name);
+       }
+      else
+       temp = savestring (entry->d_name);
+
+      return (temp);
+    }
+}
+
+/* An initial implementation of a menu completion function a la tcsh.  The
+   first time (if the last readline command was not rl_menu_complete), we
+   generate the list of matches.  This code is very similar to the code in
+   rl_complete_internal -- there should be a way to combine the two.  Then,
+   for each item in the list of matches, we insert the match in an undoable
+   fashion, with the appropriate character appended (this happens on the
+   second and subsequent consecutive calls to rl_menu_complete).  When we
+   hit the end of the match list, we restore the original unmatched text,
+   ring the bell, and reset the counter to zero. */
+int
+rl_menu_complete (count, ignore)
+     int count, ignore;
+{
+  rl_compentry_func_t *our_func;
+  int matching_filenames, found_quote;
+
+  static char *orig_text;
+  static char **matches = (char **)0;
+  static int match_list_index = 0;
+  static int match_list_size = 0;
+  static int orig_start, orig_end;
+  static char quote_char;
+  static int delimiter;
+
+  /* The first time through, we generate the list of matches and set things
+     up to insert them. */
+  if (rl_last_func != rl_menu_complete)
+    {
+      /* Clean up from previous call, if any. */
+      FREE (orig_text);
+      if (matches)
+       _rl_free_match_list (matches);
+
+      match_list_index = match_list_size = 0;
+      matches = (char **)NULL;
+
+      /* Only the completion entry function can change these. */
+      set_completion_defaults ('%');
+
+      our_func = rl_completion_entry_function
+                       ? rl_completion_entry_function
+                       : rl_filename_completion_function;
+
+      /* We now look backwards for the start of a filename/variable word. */
+      orig_end = rl_point;
+      found_quote = delimiter = 0;
+      quote_char = '\0';
+
+      if (rl_point)
+       /* This (possibly) changes rl_point.  If it returns a non-zero char,
+          we know we have an open quote. */
+       quote_char = _rl_find_completion_word (&found_quote, &delimiter);
+
+      orig_start = rl_point;
+      rl_point = orig_end;
+
+      orig_text = rl_copy_text (orig_start, orig_end);
+      matches = gen_completion_matches (orig_text, orig_start, orig_end,
+                                       our_func, found_quote, quote_char);
+
+      /* If we are matching filenames, the attempted completion function will
+        have set rl_filename_completion_desired to a non-zero value.  The basic
+        rl_filename_completion_function does this. */
+      matching_filenames = rl_filename_completion_desired;
+
+      if (matches == 0 || postprocess_matches (&matches, matching_filenames) == 0)
+       {
+         rl_ding ();
+         FREE (matches);
+         matches = (char **)0;
+         FREE (orig_text);
+         orig_text = (char *)0;
+         completion_changed_buffer = 0;
+          return (0);
+       }
+
+      for (match_list_size = 0; matches[match_list_size]; match_list_size++)
+        ;
+      /* matches[0] is lcd if match_list_size > 1, but the circular buffer
+        code below should take care of it. */
+    }
+
+  /* Now we have the list of matches.  Replace the text between
+     rl_line_buffer[orig_start] and rl_line_buffer[rl_point] with
+     matches[match_list_index], and add any necessary closing char. */
+
+  if (matches == 0 || match_list_size == 0) 
+    {
+      rl_ding ();
+      FREE (matches);
+      matches = (char **)0;
+      completion_changed_buffer = 0;
+      return (0);
+    }
+
+  match_list_index += count;
+  if (match_list_index < 0)
+    match_list_index += match_list_size;
+  else
+    match_list_index %= match_list_size;
+
+  if (match_list_index == 0 && match_list_size > 1)
+    {
+      rl_ding ();
+      insert_match (orig_text, orig_start, MULT_MATCH, &quote_char);
+    }
+  else
+    {
+      insert_match (matches[match_list_index], orig_start, SINGLE_MATCH, &quote_char);
+      append_to_match (matches[match_list_index], delimiter, quote_char,
+                      strcmp (orig_text, matches[match_list_index]));
+    }
+
+  completion_changed_buffer = 1;
+  return (0);
+}
diff --git a/config.h.in b/config.h.in
new file mode 100644 (file)
index 0000000..03178a4
--- /dev/null
@@ -0,0 +1,268 @@
+/* config.h.in.  Maintained by hand. */
+
+/* Define NO_MULTIBYTE_SUPPORT to not compile in support for multibyte
+   characters, even if the OS supports them. */
+#undef NO_MULTIBYTE_SUPPORT
+
+/* Define if on MINIX.  */
+#undef _MINIX
+
+/* Define as the return type of signal handlers (int or void).  */
+#undef RETSIGTYPE
+
+#undef VOID_SIGHANDLER
+
+/* Characteristics of the compiler. */
+#undef const
+
+#undef size_t
+
+#undef ssize_t
+
+#undef PROTOTYPES
+
+#undef __CHAR_UNSIGNED__
+
+/* Define if the `S_IS*' macros in <sys/stat.h> do not work properly.  */
+#undef STAT_MACROS_BROKEN
+
+/* Define if you have the fcntl function. */
+#undef HAVE_FCNTL
+
+/* Define if you have the getpwent function. */
+#undef HAVE_GETPWENT
+
+/* Define if you have the getpwnam function. */
+#undef HAVE_GETPWNAM
+
+/* Define if you have the getpwuid function. */
+#undef HAVE_GETPWUID
+
+/* Define if you have the isascii function. */
+#undef HAVE_ISASCII
+
+/* Define if you have the iswctype function.  */
+#undef HAVE_ISWCTYPE
+
+/* Define if you have the iswlower function.  */
+#undef HAVE_ISWLOWER
+
+/* Define if you have the iswupper function.  */
+#undef HAVE_ISWUPPER
+
+/* Define if you have the isxdigit function. */
+#undef HAVE_ISXDIGIT
+
+/* Define if you have the kill function. */
+#undef HAVE_KILL
+
+/* Define if you have the lstat function. */
+#undef HAVE_LSTAT
+
+/* Define if you have the mbrlen function. */
+#undef HAVE_MBRLEN
+
+/* Define if you have the mbrtowc function. */
+#undef HAVE_MBRTOWC
+
+/* Define if you have the mbsrtowcs function. */
+#undef HAVE_MBSRTOWCS
+
+/* Define if you have the memmove function. */
+#undef HAVE_MEMMOVE
+
+/* Define if you have the putenv function.  */
+#undef HAVE_PUTENV
+
+/* Define if you have the select function.  */
+#undef HAVE_SELECT
+
+/* Define if you have the setenv function.  */
+#undef HAVE_SETENV
+
+/* Define if you have the setlocale function. */
+#undef HAVE_SETLOCALE
+
+/* Define if you have the strcasecmp function.  */
+#undef HAVE_STRCASECMP
+
+/* Define if you have the strcoll function.  */
+#undef HAVE_STRCOLL
+
+#undef STRCOLL_BROKEN
+
+/* Define if you have the strpbrk function.  */
+#undef HAVE_STRPBRK
+
+/* Define if you have the tcgetattr function.  */
+#undef HAVE_TCGETATTR
+
+/* Define if you have the towlower function.  */
+#undef HAVE_TOWLOWER
+
+/* Define if you have the towupper function.  */
+#undef HAVE_TOWUPPER
+
+/* Define if you have the vsnprintf function.  */
+#undef HAVE_VSNPRINTF
+
+/* Define if you have the wcrtomb function.  */
+#undef HAVE_WCRTOMB 
+
+/* Define if you have the wcscoll function.  */
+#undef HAVE_WCSCOLL
+
+/* Define if you have the wctype function.  */
+#undef HAVE_WCTYPE
+
+/* Define if you have the wcwidth function.  */
+#undef HAVE_WCWIDTH
+
+#undef STDC_HEADERS
+
+/* Define if you have the <dirent.h> header file.  */
+#undef HAVE_DIRENT_H
+
+/* Define if you have the <fcntl.h> header file.  */
+#undef HAVE_FCNTL_H
+
+/* Define if you have the <langinfo.h> header file.  */
+#undef HAVE_LANGINFO_H
+
+/* Define if you have the <limits.h> header file.  */
+#undef HAVE_LIMITS_H
+
+/* Define if you have the <locale.h> header file.  */
+#undef HAVE_LOCALE_H
+
+/* Define if you have the <memory.h> header file.  */
+#undef HAVE_MEMORY_H
+
+/* Define if you have the <ndir.h> header file.  */
+#undef HAVE_NDIR_H
+
+/* Define if you have the <pwd.h> header file.  */
+#undef HAVE_PWD_H
+
+/* Define if you have the <stdarg.h> header file.  */
+#undef HAVE_STDARG_H
+
+/* Define if you have the <stdlib.h> header file.  */
+#undef HAVE_STDLIB_H
+
+/* Define if you have the <string.h> header file.  */
+#undef HAVE_STRING_H
+
+/* Define if you have the <strings.h> header file.  */
+#undef HAVE_STRINGS_H
+
+/* Define if you have the <sys/dir.h> header file.  */
+#undef HAVE_SYS_DIR_H
+
+/* Define if you have the <sys/file.h> header file.  */
+#undef HAVE_SYS_FILE_H
+
+/* Define if you have the <sys/ndir.h> header file.  */
+#undef HAVE_SYS_NDIR_H
+
+/* Define if you have the <sys/pte.h> header file.  */
+#undef HAVE_SYS_PTE_H
+
+/* Define if you have the <sys/ptem.h> header file.  */
+#undef HAVE_SYS_PTEM_H
+
+/* Define if you have the <sys/select.h> header file.  */
+#undef HAVE_SYS_SELECT_H
+
+/* Define if you have the <sys/stream.h> header file.  */
+#undef HAVE_SYS_STREAM_H
+
+/* Define if you have the <termcap.h> header file.  */
+#undef HAVE_TERMCAP_H
+
+/* Define if you have the <termio.h> header file.  */
+#undef HAVE_TERMIO_H
+
+/* Define if you have the <termios.h> header file.  */
+#undef HAVE_TERMIOS_H
+
+/* Define if you have the <unistd.h> header file.  */
+#undef HAVE_UNISTD_H
+
+/* Define if you have the <varargs.h> header file.  */
+#undef HAVE_VARARGS_H
+
+/* Define if you have the <wchar.h> header file.  */
+#undef HAVE_WCHAR_H
+
+/* Define if you have the <wctype.h> header file.  */
+#undef HAVE_WCTYPE_H
+
+#undef HAVE_MBSTATE_T
+
+/* Define if you have wchar_t in <wctype.h>. */
+#undef HAVE_WCHAR_T 
+
+/* Define if you have wctype_t in <wctype.h>. */
+#undef HAVE_WCTYPE_T
+
+/* Define if you have wint_t in <wctype.h>. */  
+#undef HAVE_WINT_T  
+
+/* Define if you have <langinfo.h> and nl_langinfo(CODESET). */
+#undef HAVE_LANGINFO_CODESET
+
+/* Definitions pulled in from aclocal.m4. */
+#undef VOID_SIGHANDLER
+
+#undef GWINSZ_IN_SYS_IOCTL
+
+#undef STRUCT_WINSIZE_IN_SYS_IOCTL
+
+#undef STRUCT_WINSIZE_IN_TERMIOS
+
+#undef TIOCSTAT_IN_SYS_IOCTL
+
+#undef FIONREAD_IN_SYS_IOCTL
+
+#undef SPEED_T_IN_SYS_TYPES
+
+#undef HAVE_GETPW_DECLS
+
+#undef STRUCT_DIRENT_HAS_D_INO
+
+#undef STRUCT_DIRENT_HAS_D_FILENO
+
+#undef HAVE_BSD_SIGNALS
+
+#undef HAVE_POSIX_SIGNALS
+
+#undef HAVE_USG_SIGHOLD
+
+#undef MUST_REINSTALL_SIGHANDLERS
+
+#undef HAVE_POSIX_SIGSETJMP
+
+#undef CTYPE_NON_ASCII
+
+/* modify settings or make new ones based on what autoconf tells us. */
+
+/* Ultrix botches type-ahead when switching from canonical to
+   non-canonical mode, at least through version 4.3 */
+#if !defined (HAVE_TERMIOS_H) || !defined (HAVE_TCGETATTR) || defined (ultrix)
+#  define TERMIOS_MISSING
+#endif
+
+#if defined (STRCOLL_BROKEN)
+#  undef HAVE_STRCOLL
+#endif
+
+#if defined (__STDC__) && defined (HAVE_STDARG_H)
+#  define PREFER_STDARG
+#  define USE_VARARGS
+#else
+#  if defined (HAVE_VARARGS_H)
+#    define PREFER_VARARGS
+#    define USE_VARARGS
+#  endif
+#endif
diff --git a/configure b/configure
new file mode 100755 (executable)
index 0000000..5706839
--- /dev/null
+++ b/configure
@@ -0,0 +1,9811 @@
+#! /bin/sh
+# From configure.in for Readline 5.2, version 2.61.
+# Guess values for system-dependent variables and create Makefiles.
+# Generated by GNU Autoconf 2.59 for readline 5.2.
+#
+# Report bugs to <bug-readline@gnu.org>.
+#
+# Copyright (C) 2003 Free Software Foundation, Inc.
+# This configure script is free software; the Free Software Foundation
+# gives unlimited permission to copy, distribute and modify it.
+## --------------------- ##
+## M4sh Initialization.  ##
+## --------------------- ##
+
+# Be Bourne compatible
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
+  emulate sh
+  NULLCMD=:
+  # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '${1+"$@"}'='"$@"'
+elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then
+  set -o posix
+fi
+DUALCASE=1; export DUALCASE # for MKS sh
+
+# Support unset when possible.
+if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
+  as_unset=unset
+else
+  as_unset=false
+fi
+
+
+# Work around bugs in pre-3.0 UWIN ksh.
+$as_unset ENV MAIL MAILPATH
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# NLS nuisances.
+for as_var in \
+  LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \
+  LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \
+  LC_TELEPHONE LC_TIME
+do
+  if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then
+    eval $as_var=C; export $as_var
+  else
+    $as_unset $as_var
+  fi
+done
+
+# Required to use basename.
+if expr a : '\(a\)' >/dev/null 2>&1; then
+  as_expr=expr
+else
+  as_expr=false
+fi
+
+if (basename /) >/dev/null 2>&1 && test "X`basename / 2>&1`" = "X/"; then
+  as_basename=basename
+else
+  as_basename=false
+fi
+
+
+# Name of the executable.
+as_me=`$as_basename "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+        X"$0" : 'X\(//\)$' \| \
+        X"$0" : 'X\(/\)$' \| \
+        .     : '\(.\)' 2>/dev/null ||
+echo X/"$0" |
+    sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/; q; }
+         /^X\/\(\/\/\)$/{ s//\1/; q; }
+         /^X\/\(\/\).*/{ s//\1/; q; }
+         s/.*/./; q'`
+
+
+# PATH needs CR, and LINENO needs CR and PATH.
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+  echo "#! /bin/sh" >conf$$.sh
+  echo  "exit 0"   >>conf$$.sh
+  chmod +x conf$$.sh
+  if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then
+    PATH_SEPARATOR=';'
+  else
+    PATH_SEPARATOR=:
+  fi
+  rm -f conf$$.sh
+fi
+
+
+  as_lineno_1=$LINENO
+  as_lineno_2=$LINENO
+  as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null`
+  test "x$as_lineno_1" != "x$as_lineno_2" &&
+  test "x$as_lineno_3"  = "x$as_lineno_2"  || {
+  # Find who we are.  Look in the path if we contain no path at all
+  # relative or not.
+  case $0 in
+    *[\\/]* ) as_myself=$0 ;;
+    *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+done
+
+       ;;
+  esac
+  # We did not find ourselves, most probably we were run as `sh COMMAND'
+  # in which case we are not to be found in the path.
+  if test "x$as_myself" = x; then
+    as_myself=$0
+  fi
+  if test ! -f "$as_myself"; then
+    { echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2
+   { (exit 1); exit 1; }; }
+  fi
+  case $CONFIG_SHELL in
+  '')
+    as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for as_base in sh bash ksh sh5; do
+        case $as_dir in
+        /*)
+          if ("$as_dir/$as_base" -c '
+  as_lineno_1=$LINENO
+  as_lineno_2=$LINENO
+  as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null`
+  test "x$as_lineno_1" != "x$as_lineno_2" &&
+  test "x$as_lineno_3"  = "x$as_lineno_2" ') 2>/dev/null; then
+            $as_unset BASH_ENV || test "${BASH_ENV+set}" != set || { BASH_ENV=; export BASH_ENV; }
+            $as_unset ENV || test "${ENV+set}" != set || { ENV=; export ENV; }
+            CONFIG_SHELL=$as_dir/$as_base
+            export CONFIG_SHELL
+            exec "$CONFIG_SHELL" "$0" ${1+"$@"}
+          fi;;
+        esac
+       done
+done
+;;
+  esac
+
+  # Create $as_me.lineno as a copy of $as_myself, but with $LINENO
+  # uniformly replaced by the line number.  The first 'sed' inserts a
+  # line-number line before each line; the second 'sed' does the real
+  # work.  The second script uses 'N' to pair each line-number line
+  # with the numbered line, and appends trailing '-' during
+  # substitution so that $LINENO is not a special case at line end.
+  # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the
+  # second 'sed' script.  Blame Lee E. McMahon for sed's syntax.  :-)
+  sed '=' <$as_myself |
+    sed '
+      N
+      s,$,-,
+      : loop
+      s,^\(['$as_cr_digits']*\)\(.*\)[$]LINENO\([^'$as_cr_alnum'_]\),\1\2\1\3,
+      t loop
+      s,-$,,
+      s,^['$as_cr_digits']*\n,,
+    ' >$as_me.lineno &&
+  chmod +x $as_me.lineno ||
+    { echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2
+   { (exit 1); exit 1; }; }
+
+  # Don't try to exec as it changes $[0], causing all sort of problems
+  # (the dirname of $[0] is not the place where we might find the
+  # original and so on.  Autoconf is especially sensible to this).
+  . ./$as_me.lineno
+  # Exit status is that of the last command.
+  exit
+}
+
+
+case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in
+  *c*,-n*) ECHO_N= ECHO_C='
+' ECHO_T='     ' ;;
+  *c*,*  ) ECHO_N=-n ECHO_C= ECHO_T= ;;
+  *)       ECHO_N= ECHO_C='\c' ECHO_T= ;;
+esac
+
+if expr a : '\(a\)' >/dev/null 2>&1; then
+  as_expr=expr
+else
+  as_expr=false
+fi
+
+rm -f conf$$ conf$$.exe conf$$.file
+echo >conf$$.file
+if ln -s conf$$.file conf$$ 2>/dev/null; then
+  # We could just check for DJGPP; but this test a) works b) is more generic
+  # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04).
+  if test -f conf$$.exe; then
+    # Don't use ln at all; we don't have any links
+    as_ln_s='cp -p'
+  else
+    as_ln_s='ln -s'
+  fi
+elif ln conf$$.file conf$$ 2>/dev/null; then
+  as_ln_s=ln
+else
+  as_ln_s='cp -p'
+fi
+rm -f conf$$ conf$$.exe conf$$.file
+
+if mkdir -p . 2>/dev/null; then
+  as_mkdir_p=:
+else
+  test -d ./-p && rmdir ./-p
+  as_mkdir_p=false
+fi
+
+as_executable_p="test -f"
+
+# Sed expression to map a string onto a valid CPP name.
+as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
+
+# Sed expression to map a string onto a valid variable name.
+as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
+
+
+# IFS
+# We need space, tab and new line, in precisely that order.
+as_nl='
+'
+IFS="  $as_nl"
+
+# CDPATH.
+$as_unset CDPATH
+
+
+# Name of the host.
+# hostname on some systems (SVR3.2, Linux) returns a bogus exit status,
+# so uname gets run too.
+ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q`
+
+exec 6>&1
+
+#
+# Initializations.
+#
+ac_default_prefix=/usr/local
+ac_config_libobj_dir=.
+cross_compiling=no
+subdirs=
+MFLAGS=
+MAKEFLAGS=
+SHELL=${CONFIG_SHELL-/bin/sh}
+
+# Maximum number of lines to put in a shell here document.
+# This variable seems obsolete.  It should probably be removed, and
+# only ac_max_sed_lines should be used.
+: ${ac_max_here_lines=38}
+
+# Identity of this package.
+PACKAGE_NAME='readline'
+PACKAGE_TARNAME='readline'
+PACKAGE_VERSION='5.2'
+PACKAGE_STRING='readline 5.2'
+PACKAGE_BUGREPORT='bug-readline@gnu.org'
+
+ac_unique_file="readline.h"
+# Factoring default headers for most tests.
+ac_includes_default="\
+#include <stdio.h>
+#if HAVE_SYS_TYPES_H
+# include <sys/types.h>
+#endif
+#if HAVE_SYS_STAT_H
+# include <sys/stat.h>
+#endif
+#if STDC_HEADERS
+# include <stdlib.h>
+# include <stddef.h>
+#else
+# if HAVE_STDLIB_H
+#  include <stdlib.h>
+# endif
+#endif
+#if HAVE_STRING_H
+# if !STDC_HEADERS && HAVE_MEMORY_H
+#  include <memory.h>
+# endif
+# include <string.h>
+#endif
+#if HAVE_STRINGS_H
+# include <strings.h>
+#endif
+#if HAVE_INTTYPES_H
+# include <inttypes.h>
+#else
+# if HAVE_STDINT_H
+#  include <stdint.h>
+# endif
+#endif
+#if HAVE_UNISTD_H
+# include <unistd.h>
+#endif"
+
+ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS build build_cpu build_vendor build_os host host_cpu host_vendor host_os CROSS_COMPILE SET_MAKE CC CFLAGS LDFLAGS CPPFLAGS ac_ct_CC EXEEXT OBJEXT CPP EGREP INSTALL_PROGRAM INSTALL_SCRIPT INSTALL_DATA AR RANLIB ac_ct_RANLIB MAKE_SHELL SHOBJ_CC SHOBJ_CFLAGS SHOBJ_LD SHOBJ_LDFLAGS SHOBJ_XLDFLAGS SHOBJ_LIBS SHOBJ_STATUS SHLIB_STATUS SHLIB_XLDFLAGS SHLIB_DOT SHLIB_LIBPREF SHLIB_LIBSUFF SHLIB_LIBVERSION SHLIB_DLLVERSION SHLIB_LIBS SHLIB_MAJOR SHLIB_MINOR STATIC_TARGET SHARED_TARGET STATIC_INSTALL_TARGET SHARED_INSTALL_TARGET PURIFY BUILD_DIR LOCAL_CFLAGS LOCAL_LDFLAGS LOCAL_DEFS ARFLAGS LIBVERSION TERMCAP_LIB LIBOBJS LTLIBOBJS'
+ac_subst_files=''
+
+# Initialize some variables set by options.
+ac_init_help=
+ac_init_version=false
+# The variables have the same names as the options, with
+# dashes changed to underlines.
+cache_file=/dev/null
+exec_prefix=NONE
+no_create=
+no_recursion=
+prefix=NONE
+program_prefix=NONE
+program_suffix=NONE
+program_transform_name=s,x,x,
+silent=
+site=
+srcdir=
+verbose=
+x_includes=NONE
+x_libraries=NONE
+
+# Installation directory options.
+# These are left unexpanded so users can "make install exec_prefix=/foo"
+# and all the variables that are supposed to be based on exec_prefix
+# by default will actually change.
+# Use braces instead of parens because sh, perl, etc. also accept them.
+bindir='${exec_prefix}/bin'
+sbindir='${exec_prefix}/sbin'
+libexecdir='${exec_prefix}/libexec'
+datadir='${prefix}/share'
+sysconfdir='${prefix}/etc'
+sharedstatedir='${prefix}/com'
+localstatedir='${prefix}/var'
+libdir='${exec_prefix}/lib'
+includedir='${prefix}/include'
+oldincludedir='/usr/include'
+infodir='${prefix}/info'
+mandir='${prefix}/man'
+
+ac_prev=
+for ac_option
+do
+  # If the previous option needs an argument, assign it.
+  if test -n "$ac_prev"; then
+    eval "$ac_prev=\$ac_option"
+    ac_prev=
+    continue
+  fi
+
+  ac_optarg=`expr "x$ac_option" : 'x[^=]*=\(.*\)'`
+
+  # Accept the important Cygnus configure options, so we can diagnose typos.
+
+  case $ac_option in
+
+  -bindir | --bindir | --bindi | --bind | --bin | --bi)
+    ac_prev=bindir ;;
+  -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*)
+    bindir=$ac_optarg ;;
+
+  -build | --build | --buil | --bui | --bu)
+    ac_prev=build_alias ;;
+  -build=* | --build=* | --buil=* | --bui=* | --bu=*)
+    build_alias=$ac_optarg ;;
+
+  -cache-file | --cache-file | --cache-fil | --cache-fi \
+  | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)
+    ac_prev=cache_file ;;
+  -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \
+  | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*)
+    cache_file=$ac_optarg ;;
+
+  --config-cache | -C)
+    cache_file=config.cache ;;
+
+  -datadir | --datadir | --datadi | --datad | --data | --dat | --da)
+    ac_prev=datadir ;;
+  -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \
+  | --da=*)
+    datadir=$ac_optarg ;;
+
+  -disable-* | --disable-*)
+    ac_feature=`expr "x$ac_option" : 'x-*disable-\(.*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null &&
+      { echo "$as_me: error: invalid feature name: $ac_feature" >&2
+   { (exit 1); exit 1; }; }
+    ac_feature=`echo $ac_feature | sed 's/-/_/g'`
+    eval "enable_$ac_feature=no" ;;
+
+  -enable-* | --enable-*)
+    ac_feature=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null &&
+      { echo "$as_me: error: invalid feature name: $ac_feature" >&2
+   { (exit 1); exit 1; }; }
+    ac_feature=`echo $ac_feature | sed 's/-/_/g'`
+    case $ac_option in
+      *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;;
+      *) ac_optarg=yes ;;
+    esac
+    eval "enable_$ac_feature='$ac_optarg'" ;;
+
+  -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \
+  | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \
+  | --exec | --exe | --ex)
+    ac_prev=exec_prefix ;;
+  -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \
+  | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \
+  | --exec=* | --exe=* | --ex=*)
+    exec_prefix=$ac_optarg ;;
+
+  -gas | --gas | --ga | --g)
+    # Obsolete; use --with-gas.
+    with_gas=yes ;;
+
+  -help | --help | --hel | --he | -h)
+    ac_init_help=long ;;
+  -help=r* | --help=r* | --hel=r* | --he=r* | -hr*)
+    ac_init_help=recursive ;;
+  -help=s* | --help=s* | --hel=s* | --he=s* | -hs*)
+    ac_init_help=short ;;
+
+  -host | --host | --hos | --ho)
+    ac_prev=host_alias ;;
+  -host=* | --host=* | --hos=* | --ho=*)
+    host_alias=$ac_optarg ;;
+
+  -includedir | --includedir | --includedi | --included | --include \
+  | --includ | --inclu | --incl | --inc)
+    ac_prev=includedir ;;
+  -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \
+  | --includ=* | --inclu=* | --incl=* | --inc=*)
+    includedir=$ac_optarg ;;
+
+  -infodir | --infodir | --infodi | --infod | --info | --inf)
+    ac_prev=infodir ;;
+  -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*)
+    infodir=$ac_optarg ;;
+
+  -libdir | --libdir | --libdi | --libd)
+    ac_prev=libdir ;;
+  -libdir=* | --libdir=* | --libdi=* | --libd=*)
+    libdir=$ac_optarg ;;
+
+  -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \
+  | --libexe | --libex | --libe)
+    ac_prev=libexecdir ;;
+  -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \
+  | --libexe=* | --libex=* | --libe=*)
+    libexecdir=$ac_optarg ;;
+
+  -localstatedir | --localstatedir | --localstatedi | --localstated \
+  | --localstate | --localstat | --localsta | --localst \
+  | --locals | --local | --loca | --loc | --lo)
+    ac_prev=localstatedir ;;
+  -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \
+  | --localstate=* | --localstat=* | --localsta=* | --localst=* \
+  | --locals=* | --local=* | --loca=* | --loc=* | --lo=*)
+    localstatedir=$ac_optarg ;;
+
+  -mandir | --mandir | --mandi | --mand | --man | --ma | --m)
+    ac_prev=mandir ;;
+  -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*)
+    mandir=$ac_optarg ;;
+
+  -nfp | --nfp | --nf)
+    # Obsolete; use --without-fp.
+    with_fp=no ;;
+
+  -no-create | --no-create | --no-creat | --no-crea | --no-cre \
+  | --no-cr | --no-c | -n)
+    no_create=yes ;;
+
+  -no-recursion | --no-recursion | --no-recursio | --no-recursi \
+  | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r)
+    no_recursion=yes ;;
+
+  -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \
+  | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \
+  | --oldin | --oldi | --old | --ol | --o)
+    ac_prev=oldincludedir ;;
+  -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \
+  | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \
+  | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*)
+    oldincludedir=$ac_optarg ;;
+
+  -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
+    ac_prev=prefix ;;
+  -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
+    prefix=$ac_optarg ;;
+
+  -program-prefix | --program-prefix | --program-prefi | --program-pref \
+  | --program-pre | --program-pr | --program-p)
+    ac_prev=program_prefix ;;
+  -program-prefix=* | --program-prefix=* | --program-prefi=* \
+  | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*)
+    program_prefix=$ac_optarg ;;
+
+  -program-suffix | --program-suffix | --program-suffi | --program-suff \
+  | --program-suf | --program-su | --program-s)
+    ac_prev=program_suffix ;;
+  -program-suffix=* | --program-suffix=* | --program-suffi=* \
+  | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*)
+    program_suffix=$ac_optarg ;;
+
+  -program-transform-name | --program-transform-name \
+  | --program-transform-nam | --program-transform-na \
+  | --program-transform-n | --program-transform- \
+  | --program-transform | --program-transfor \
+  | --program-transfo | --program-transf \
+  | --program-trans | --program-tran \
+  | --progr-tra | --program-tr | --program-t)
+    ac_prev=program_transform_name ;;
+  -program-transform-name=* | --program-transform-name=* \
+  | --program-transform-nam=* | --program-transform-na=* \
+  | --program-transform-n=* | --program-transform-=* \
+  | --program-transform=* | --program-transfor=* \
+  | --program-transfo=* | --program-transf=* \
+  | --program-trans=* | --program-tran=* \
+  | --progr-tra=* | --program-tr=* | --program-t=*)
+    program_transform_name=$ac_optarg ;;
+
+  -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+  | -silent | --silent | --silen | --sile | --sil)
+    silent=yes ;;
+
+  -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
+    ac_prev=sbindir ;;
+  -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
+  | --sbi=* | --sb=*)
+    sbindir=$ac_optarg ;;
+
+  -sharedstatedir | --sharedstatedir | --sharedstatedi \
+  | --sharedstated | --sharedstate | --sharedstat | --sharedsta \
+  | --sharedst | --shareds | --shared | --share | --shar \
+  | --sha | --sh)
+    ac_prev=sharedstatedir ;;
+  -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \
+  | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \
+  | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \
+  | --sha=* | --sh=*)
+    sharedstatedir=$ac_optarg ;;
+
+  -site | --site | --sit)
+    ac_prev=site ;;
+  -site=* | --site=* | --sit=*)
+    site=$ac_optarg ;;
+
+  -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
+    ac_prev=srcdir ;;
+  -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
+    srcdir=$ac_optarg ;;
+
+  -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \
+  | --syscon | --sysco | --sysc | --sys | --sy)
+    ac_prev=sysconfdir ;;
+  -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \
+  | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*)
+    sysconfdir=$ac_optarg ;;
+
+  -target | --target | --targe | --targ | --tar | --ta | --t)
+    ac_prev=target_alias ;;
+  -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)
+    target_alias=$ac_optarg ;;
+
+  -v | -verbose | --verbose | --verbos | --verbo | --verb)
+    verbose=yes ;;
+
+  -version | --version | --versio | --versi | --vers | -V)
+    ac_init_version=: ;;
+
+  -with-* | --with-*)
+    ac_package=`expr "x$ac_option" : 'x-*with-\([^=]*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null &&
+      { echo "$as_me: error: invalid package name: $ac_package" >&2
+   { (exit 1); exit 1; }; }
+    ac_package=`echo $ac_package| sed 's/-/_/g'`
+    case $ac_option in
+      *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;;
+      *) ac_optarg=yes ;;
+    esac
+    eval "with_$ac_package='$ac_optarg'" ;;
+
+  -without-* | --without-*)
+    ac_package=`expr "x$ac_option" : 'x-*without-\(.*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null &&
+      { echo "$as_me: error: invalid package name: $ac_package" >&2
+   { (exit 1); exit 1; }; }
+    ac_package=`echo $ac_package | sed 's/-/_/g'`
+    eval "with_$ac_package=no" ;;
+
+  --x)
+    # Obsolete; use --with-x.
+    with_x=yes ;;
+
+  -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \
+  | --x-incl | --x-inc | --x-in | --x-i)
+    ac_prev=x_includes ;;
+  -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \
+  | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*)
+    x_includes=$ac_optarg ;;
+
+  -x-libraries | --x-libraries | --x-librarie | --x-librari \
+  | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l)
+    ac_prev=x_libraries ;;
+  -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \
+  | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)
+    x_libraries=$ac_optarg ;;
+
+  -*) { echo "$as_me: error: unrecognized option: $ac_option
+Try \`$0 --help' for more information." >&2
+   { (exit 1); exit 1; }; }
+    ;;
+
+  *=*)
+    ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_envvar" : ".*[^_$as_cr_alnum]" >/dev/null &&
+      { echo "$as_me: error: invalid variable name: $ac_envvar" >&2
+   { (exit 1); exit 1; }; }
+    ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`
+    eval "$ac_envvar='$ac_optarg'"
+    export $ac_envvar ;;
+
+  *)
+    # FIXME: should be removed in autoconf 3.0.
+    echo "$as_me: WARNING: you should use --build, --host, --target" >&2
+    expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null &&
+      echo "$as_me: WARNING: invalid host type: $ac_option" >&2
+    : ${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}
+    ;;
+
+  esac
+done
+
+if test -n "$ac_prev"; then
+  ac_option=--`echo $ac_prev | sed 's/_/-/g'`
+  { echo "$as_me: error: missing argument to $ac_option" >&2
+   { (exit 1); exit 1; }; }
+fi
+
+# Be sure to have absolute paths.
+for ac_var in exec_prefix prefix
+do
+  eval ac_val=$`echo $ac_var`
+  case $ac_val in
+    [\\/$]* | ?:[\\/]* | NONE | '' ) ;;
+    *)  { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2
+   { (exit 1); exit 1; }; };;
+  esac
+done
+
+# Be sure to have absolute paths.
+for ac_var in bindir sbindir libexecdir datadir sysconfdir sharedstatedir \
+             localstatedir libdir includedir oldincludedir infodir mandir
+do
+  eval ac_val=$`echo $ac_var`
+  case $ac_val in
+    [\\/$]* | ?:[\\/]* ) ;;
+    *)  { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2
+   { (exit 1); exit 1; }; };;
+  esac
+done
+
+# There might be people who depend on the old broken behavior: `$host'
+# used to hold the argument of --host etc.
+# FIXME: To remove some day.
+build=$build_alias
+host=$host_alias
+target=$target_alias
+
+# FIXME: To remove some day.
+if test "x$host_alias" != x; then
+  if test "x$build_alias" = x; then
+    cross_compiling=maybe
+    echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host.
+    If a cross compiler is detected then cross compile mode will be used." >&2
+  elif test "x$build_alias" != "x$host_alias"; then
+    cross_compiling=yes
+  fi
+fi
+
+ac_tool_prefix=
+test -n "$host_alias" && ac_tool_prefix=$host_alias-
+
+test "$silent" = yes && exec 6>/dev/null
+
+
+# Find the source files, if location was not specified.
+if test -z "$srcdir"; then
+  ac_srcdir_defaulted=yes
+  # Try the directory containing this script, then its parent.
+  ac_confdir=`(dirname "$0") 2>/dev/null ||
+$as_expr X"$0" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+        X"$0" : 'X\(//\)[^/]' \| \
+        X"$0" : 'X\(//\)$' \| \
+        X"$0" : 'X\(/\)' \| \
+        .     : '\(.\)' 2>/dev/null ||
+echo X"$0" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+         /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+         /^X\(\/\/\)$/{ s//\1/; q; }
+         /^X\(\/\).*/{ s//\1/; q; }
+         s/.*/./; q'`
+  srcdir=$ac_confdir
+  if test ! -r $srcdir/$ac_unique_file; then
+    srcdir=..
+  fi
+else
+  ac_srcdir_defaulted=no
+fi
+if test ! -r $srcdir/$ac_unique_file; then
+  if test "$ac_srcdir_defaulted" = yes; then
+    { echo "$as_me: error: cannot find sources ($ac_unique_file) in $ac_confdir or .." >&2
+   { (exit 1); exit 1; }; }
+  else
+    { echo "$as_me: error: cannot find sources ($ac_unique_file) in $srcdir" >&2
+   { (exit 1); exit 1; }; }
+  fi
+fi
+(cd $srcdir && test -r ./$ac_unique_file) 2>/dev/null ||
+  { echo "$as_me: error: sources are in $srcdir, but \`cd $srcdir' does not work" >&2
+   { (exit 1); exit 1; }; }
+srcdir=`echo "$srcdir" | sed 's%\([^\\/]\)[\\/]*$%\1%'`
+ac_env_build_alias_set=${build_alias+set}
+ac_env_build_alias_value=$build_alias
+ac_cv_env_build_alias_set=${build_alias+set}
+ac_cv_env_build_alias_value=$build_alias
+ac_env_host_alias_set=${host_alias+set}
+ac_env_host_alias_value=$host_alias
+ac_cv_env_host_alias_set=${host_alias+set}
+ac_cv_env_host_alias_value=$host_alias
+ac_env_target_alias_set=${target_alias+set}
+ac_env_target_alias_value=$target_alias
+ac_cv_env_target_alias_set=${target_alias+set}
+ac_cv_env_target_alias_value=$target_alias
+ac_env_CC_set=${CC+set}
+ac_env_CC_value=$CC
+ac_cv_env_CC_set=${CC+set}
+ac_cv_env_CC_value=$CC
+ac_env_CFLAGS_set=${CFLAGS+set}
+ac_env_CFLAGS_value=$CFLAGS
+ac_cv_env_CFLAGS_set=${CFLAGS+set}
+ac_cv_env_CFLAGS_value=$CFLAGS
+ac_env_LDFLAGS_set=${LDFLAGS+set}
+ac_env_LDFLAGS_value=$LDFLAGS
+ac_cv_env_LDFLAGS_set=${LDFLAGS+set}
+ac_cv_env_LDFLAGS_value=$LDFLAGS
+ac_env_CPPFLAGS_set=${CPPFLAGS+set}
+ac_env_CPPFLAGS_value=$CPPFLAGS
+ac_cv_env_CPPFLAGS_set=${CPPFLAGS+set}
+ac_cv_env_CPPFLAGS_value=$CPPFLAGS
+ac_env_CPP_set=${CPP+set}
+ac_env_CPP_value=$CPP
+ac_cv_env_CPP_set=${CPP+set}
+ac_cv_env_CPP_value=$CPP
+
+#
+# Report the --help message.
+#
+if test "$ac_init_help" = "long"; then
+  # Omit some internal or obsolete options to make the list less imposing.
+  # This message is too long to be a string in the A/UX 3.1 sh.
+  cat <<_ACEOF
+\`configure' configures readline 5.2 to adapt to many kinds of systems.
+
+Usage: $0 [OPTION]... [VAR=VALUE]...
+
+To assign environment variables (e.g., CC, CFLAGS...), specify them as
+VAR=VALUE.  See below for descriptions of some of the useful variables.
+
+Defaults for the options are specified in brackets.
+
+Configuration:
+  -h, --help              display this help and exit
+      --help=short        display options specific to this package
+      --help=recursive    display the short help of all the included packages
+  -V, --version           display version information and exit
+  -q, --quiet, --silent   do not print \`checking...' messages
+      --cache-file=FILE   cache test results in FILE [disabled]
+  -C, --config-cache      alias for \`--cache-file=config.cache'
+  -n, --no-create         do not create output files
+      --srcdir=DIR        find the sources in DIR [configure dir or \`..']
+
+_ACEOF
+
+  cat <<_ACEOF
+Installation directories:
+  --prefix=PREFIX         install architecture-independent files in PREFIX
+                         [$ac_default_prefix]
+  --exec-prefix=EPREFIX   install architecture-dependent files in EPREFIX
+                         [PREFIX]
+
+By default, \`make install' will install all the files in
+\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc.  You can specify
+an installation prefix other than \`$ac_default_prefix' using \`--prefix',
+for instance \`--prefix=\$HOME'.
+
+For better control, use the options below.
+
+Fine tuning of the installation directories:
+  --bindir=DIR           user executables [EPREFIX/bin]
+  --sbindir=DIR          system admin executables [EPREFIX/sbin]
+  --libexecdir=DIR       program executables [EPREFIX/libexec]
+  --datadir=DIR          read-only architecture-independent data [PREFIX/share]
+  --sysconfdir=DIR       read-only single-machine data [PREFIX/etc]
+  --sharedstatedir=DIR   modifiable architecture-independent data [PREFIX/com]
+  --localstatedir=DIR    modifiable single-machine data [PREFIX/var]
+  --libdir=DIR           object code libraries [EPREFIX/lib]
+  --includedir=DIR       C header files [PREFIX/include]
+  --oldincludedir=DIR    C header files for non-gcc [/usr/include]
+  --infodir=DIR          info documentation [PREFIX/info]
+  --mandir=DIR           man documentation [PREFIX/man]
+_ACEOF
+
+  cat <<\_ACEOF
+
+System types:
+  --build=BUILD     configure for building on BUILD [guessed]
+  --host=HOST       cross-compile to build programs to run on HOST [BUILD]
+_ACEOF
+fi
+
+if test -n "$ac_init_help"; then
+  case $ac_init_help in
+     short | recursive ) echo "Configuration of readline 5.2:";;
+   esac
+  cat <<\_ACEOF
+
+Optional Features:
+  --disable-FEATURE       do not include FEATURE (same as --enable-FEATURE=no)
+  --enable-FEATURE[=ARG]  include FEATURE [ARG=yes]
+  --enable-multibyte      enable multibyte characters if OS supports them
+  --enable-shared         build shared libraries [default=YES]
+  --enable-static         build static libraries [default=YES]
+
+Optional Packages:
+  --with-PACKAGE[=ARG]    use PACKAGE [ARG=yes]
+  --without-PACKAGE       do not use PACKAGE (same as --with-PACKAGE=no)
+  --with-curses           use the curses library instead of the termcap
+                          library
+  --with-purify           configure to postprocess with purify
+
+Some influential environment variables:
+  CC          C compiler command
+  CFLAGS      C compiler flags
+  LDFLAGS     linker flags, e.g. -L<lib dir> if you have libraries in a
+              nonstandard directory <lib dir>
+  CPPFLAGS    C/C++ preprocessor flags, e.g. -I<include dir> if you have
+              headers in a nonstandard directory <include dir>
+  CPP         C preprocessor
+
+Use these variables to override the choices made by `configure' or to help
+it to find libraries and programs with nonstandard names/locations.
+
+Report bugs to <bug-readline@gnu.org>.
+_ACEOF
+fi
+
+if test "$ac_init_help" = "recursive"; then
+  # If there are subdirs, report their specific --help.
+  ac_popdir=`pwd`
+  for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue
+    test -d $ac_dir || continue
+    ac_builddir=.
+
+if test "$ac_dir" != .; then
+  ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'`
+  # A "../" for each directory in $ac_dir_suffix.
+  ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'`
+else
+  ac_dir_suffix= ac_top_builddir=
+fi
+
+case $srcdir in
+  .)  # No --srcdir option.  We are building in place.
+    ac_srcdir=.
+    if test -z "$ac_top_builddir"; then
+       ac_top_srcdir=.
+    else
+       ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'`
+    fi ;;
+  [\\/]* | ?:[\\/]* )  # Absolute path.
+    ac_srcdir=$srcdir$ac_dir_suffix;
+    ac_top_srcdir=$srcdir ;;
+  *) # Relative path.
+    ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix
+    ac_top_srcdir=$ac_top_builddir$srcdir ;;
+esac
+
+# Do not use `cd foo && pwd` to compute absolute paths, because
+# the directories may not exist.
+case `pwd` in
+.) ac_abs_builddir="$ac_dir";;
+*)
+  case "$ac_dir" in
+  .) ac_abs_builddir=`pwd`;;
+  [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";;
+  *) ac_abs_builddir=`pwd`/"$ac_dir";;
+  esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_top_builddir=${ac_top_builddir}.;;
+*)
+  case ${ac_top_builddir}. in
+  .) ac_abs_top_builddir=$ac_abs_builddir;;
+  [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;;
+  *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;;
+  esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_srcdir=$ac_srcdir;;
+*)
+  case $ac_srcdir in
+  .) ac_abs_srcdir=$ac_abs_builddir;;
+  [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;;
+  *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;;
+  esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_top_srcdir=$ac_top_srcdir;;
+*)
+  case $ac_top_srcdir in
+  .) ac_abs_top_srcdir=$ac_abs_builddir;;
+  [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;;
+  *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;;
+  esac;;
+esac
+
+    cd $ac_dir
+    # Check for guested configure; otherwise get Cygnus style configure.
+    if test -f $ac_srcdir/configure.gnu; then
+      echo
+      $SHELL $ac_srcdir/configure.gnu  --help=recursive
+    elif test -f $ac_srcdir/configure; then
+      echo
+      $SHELL $ac_srcdir/configure  --help=recursive
+    elif test -f $ac_srcdir/configure.ac ||
+          test -f $ac_srcdir/configure.in; then
+      echo
+      $ac_configure --help
+    else
+      echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2
+    fi
+    cd $ac_popdir
+  done
+fi
+
+test -n "$ac_init_help" && exit 0
+if $ac_init_version; then
+  cat <<\_ACEOF
+readline configure 5.2
+generated by GNU Autoconf 2.59
+
+Copyright (C) 2003 Free Software Foundation, Inc.
+This configure script is free software; the Free Software Foundation
+gives unlimited permission to copy, distribute and modify it.
+_ACEOF
+  exit 0
+fi
+exec 5>config.log
+cat >&5 <<_ACEOF
+This file contains any messages produced by compilers while
+running configure, to aid debugging if configure makes a mistake.
+
+It was created by readline $as_me 5.2, which was
+generated by GNU Autoconf 2.59.  Invocation command line was
+
+  $ $0 $@
+
+_ACEOF
+{
+cat <<_ASUNAME
+## --------- ##
+## Platform. ##
+## --------- ##
+
+hostname = `(hostname || uname -n) 2>/dev/null | sed 1q`
+uname -m = `(uname -m) 2>/dev/null || echo unknown`
+uname -r = `(uname -r) 2>/dev/null || echo unknown`
+uname -s = `(uname -s) 2>/dev/null || echo unknown`
+uname -v = `(uname -v) 2>/dev/null || echo unknown`
+
+/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown`
+/bin/uname -X     = `(/bin/uname -X) 2>/dev/null     || echo unknown`
+
+/bin/arch              = `(/bin/arch) 2>/dev/null              || echo unknown`
+/usr/bin/arch -k       = `(/usr/bin/arch -k) 2>/dev/null       || echo unknown`
+/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown`
+hostinfo               = `(hostinfo) 2>/dev/null               || echo unknown`
+/bin/machine           = `(/bin/machine) 2>/dev/null           || echo unknown`
+/usr/bin/oslevel       = `(/usr/bin/oslevel) 2>/dev/null       || echo unknown`
+/bin/universe          = `(/bin/universe) 2>/dev/null          || echo unknown`
+
+_ASUNAME
+
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  echo "PATH: $as_dir"
+done
+
+} >&5
+
+cat >&5 <<_ACEOF
+
+
+## ----------- ##
+## Core tests. ##
+## ----------- ##
+
+_ACEOF
+
+
+# Keep a trace of the command line.
+# Strip out --no-create and --no-recursion so they do not pile up.
+# Strip out --silent because we don't want to record it for future runs.
+# Also quote any args containing shell meta-characters.
+# Make two passes to allow for proper duplicate-argument suppression.
+ac_configure_args=
+ac_configure_args0=
+ac_configure_args1=
+ac_sep=
+ac_must_keep_next=false
+for ac_pass in 1 2
+do
+  for ac_arg
+  do
+    case $ac_arg in
+    -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;;
+    -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+    | -silent | --silent | --silen | --sile | --sil)
+      continue ;;
+    *" "*|*"   "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?\"\']*)
+      ac_arg=`echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
+    esac
+    case $ac_pass in
+    1) ac_configure_args0="$ac_configure_args0 '$ac_arg'" ;;
+    2)
+      ac_configure_args1="$ac_configure_args1 '$ac_arg'"
+      if test $ac_must_keep_next = true; then
+       ac_must_keep_next=false # Got value, back to normal.
+      else
+       case $ac_arg in
+         *=* | --config-cache | -C | -disable-* | --disable-* \
+         | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \
+         | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \
+         | -with-* | --with-* | -without-* | --without-* | --x)
+           case "$ac_configure_args0 " in
+             "$ac_configure_args1"*" '$ac_arg' "* ) continue ;;
+           esac
+           ;;
+         -* ) ac_must_keep_next=true ;;
+       esac
+      fi
+      ac_configure_args="$ac_configure_args$ac_sep'$ac_arg'"
+      # Get rid of the leading space.
+      ac_sep=" "
+      ;;
+    esac
+  done
+done
+$as_unset ac_configure_args0 || test "${ac_configure_args0+set}" != set || { ac_configure_args0=; export ac_configure_args0; }
+$as_unset ac_configure_args1 || test "${ac_configure_args1+set}" != set || { ac_configure_args1=; export ac_configure_args1; }
+
+# When interrupted or exit'd, cleanup temporary files, and complete
+# config.log.  We remove comments because anyway the quotes in there
+# would cause problems or look ugly.
+# WARNING: Be sure not to use single quotes in there, as some shells,
+# such as our DU 5.0 friend, will then `close' the trap.
+trap 'exit_status=$?
+  # Save into config.log some information that might help in debugging.
+  {
+    echo
+
+    cat <<\_ASBOX
+## ---------------- ##
+## Cache variables. ##
+## ---------------- ##
+_ASBOX
+    echo
+    # The following way of writing the cache mishandles newlines in values,
+{
+  (set) 2>&1 |
+    case `(ac_space='"'"' '"'"'; set | grep ac_space) 2>&1` in
+    *ac_space=\ *)
+      sed -n \
+       "s/'"'"'/'"'"'\\\\'"'"''"'"'/g;
+         s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='"'"'\\2'"'"'/p"
+      ;;
+    *)
+      sed -n \
+       "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p"
+      ;;
+    esac;
+}
+    echo
+
+    cat <<\_ASBOX
+## ----------------- ##
+## Output variables. ##
+## ----------------- ##
+_ASBOX
+    echo
+    for ac_var in $ac_subst_vars
+    do
+      eval ac_val=$`echo $ac_var`
+      echo "$ac_var='"'"'$ac_val'"'"'"
+    done | sort
+    echo
+
+    if test -n "$ac_subst_files"; then
+      cat <<\_ASBOX
+## ------------- ##
+## Output files. ##
+## ------------- ##
+_ASBOX
+      echo
+      for ac_var in $ac_subst_files
+      do
+       eval ac_val=$`echo $ac_var`
+       echo "$ac_var='"'"'$ac_val'"'"'"
+      done | sort
+      echo
+    fi
+
+    if test -s confdefs.h; then
+      cat <<\_ASBOX
+## ----------- ##
+## confdefs.h. ##
+## ----------- ##
+_ASBOX
+      echo
+      sed "/^$/d" confdefs.h | sort
+      echo
+    fi
+    test "$ac_signal" != 0 &&
+      echo "$as_me: caught signal $ac_signal"
+    echo "$as_me: exit $exit_status"
+  } >&5
+  rm -f core *.core &&
+  rm -rf conftest* confdefs* conf$$* $ac_clean_files &&
+    exit $exit_status
+     ' 0
+for ac_signal in 1 2 13 15; do
+  trap 'ac_signal='$ac_signal'; { (exit 1); exit 1; }' $ac_signal
+done
+ac_signal=0
+
+# confdefs.h avoids OS command line length limits that DEFS can exceed.
+rm -rf conftest* confdefs.h
+# AIX cpp loses on an empty file, so make sure it contains at least a newline.
+echo >confdefs.h
+
+# Predefined preprocessor variables.
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_NAME "$PACKAGE_NAME"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_TARNAME "$PACKAGE_TARNAME"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_VERSION "$PACKAGE_VERSION"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_STRING "$PACKAGE_STRING"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT"
+_ACEOF
+
+
+# Let the site file select an alternate cache file if it wants to.
+# Prefer explicitly selected file to automatically selected ones.
+if test -z "$CONFIG_SITE"; then
+  if test "x$prefix" != xNONE; then
+    CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site"
+  else
+    CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site"
+  fi
+fi
+for ac_site_file in $CONFIG_SITE; do
+  if test -r "$ac_site_file"; then
+    { echo "$as_me:$LINENO: loading site script $ac_site_file" >&5
+echo "$as_me: loading site script $ac_site_file" >&6;}
+    sed 's/^/| /' "$ac_site_file" >&5
+    . "$ac_site_file"
+  fi
+done
+
+if test -r "$cache_file"; then
+  # Some versions of bash will fail to source /dev/null (special
+  # files actually), so we avoid doing that.
+  if test -f "$cache_file"; then
+    { echo "$as_me:$LINENO: loading cache $cache_file" >&5
+echo "$as_me: loading cache $cache_file" >&6;}
+    case $cache_file in
+      [\\/]* | ?:[\\/]* ) . $cache_file;;
+      *)                      . ./$cache_file;;
+    esac
+  fi
+else
+  { echo "$as_me:$LINENO: creating cache $cache_file" >&5
+echo "$as_me: creating cache $cache_file" >&6;}
+  >$cache_file
+fi
+
+# Check that the precious variables saved in the cache have kept the same
+# value.
+ac_cache_corrupted=false
+for ac_var in `(set) 2>&1 |
+              sed -n 's/^ac_env_\([a-zA-Z_0-9]*\)_set=.*/\1/p'`; do
+  eval ac_old_set=\$ac_cv_env_${ac_var}_set
+  eval ac_new_set=\$ac_env_${ac_var}_set
+  eval ac_old_val="\$ac_cv_env_${ac_var}_value"
+  eval ac_new_val="\$ac_env_${ac_var}_value"
+  case $ac_old_set,$ac_new_set in
+    set,)
+      { echo "$as_me:$LINENO: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5
+echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;}
+      ac_cache_corrupted=: ;;
+    ,set)
+      { echo "$as_me:$LINENO: error: \`$ac_var' was not set in the previous run" >&5
+echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;}
+      ac_cache_corrupted=: ;;
+    ,);;
+    *)
+      if test "x$ac_old_val" != "x$ac_new_val"; then
+       { echo "$as_me:$LINENO: error: \`$ac_var' has changed since the previous run:" >&5
+echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;}
+       { echo "$as_me:$LINENO:   former value:  $ac_old_val" >&5
+echo "$as_me:   former value:  $ac_old_val" >&2;}
+       { echo "$as_me:$LINENO:   current value: $ac_new_val" >&5
+echo "$as_me:   current value: $ac_new_val" >&2;}
+       ac_cache_corrupted=:
+      fi;;
+  esac
+  # Pass precious variables to config.status.
+  if test "$ac_new_set" = set; then
+    case $ac_new_val in
+    *" "*|*"   "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?\"\']*)
+      ac_arg=$ac_var=`echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;;
+    *) ac_arg=$ac_var=$ac_new_val ;;
+    esac
+    case " $ac_configure_args " in
+      *" '$ac_arg' "*) ;; # Avoid dups.  Use of quotes ensures accuracy.
+      *) ac_configure_args="$ac_configure_args '$ac_arg'" ;;
+    esac
+  fi
+done
+if $ac_cache_corrupted; then
+  { echo "$as_me:$LINENO: error: changes in the environment can compromise the build" >&5
+echo "$as_me: error: changes in the environment can compromise the build" >&2;}
+  { { echo "$as_me:$LINENO: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&5
+echo "$as_me: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ac_aux_dir=
+for ac_dir in ./support $srcdir/./support; do
+  if test -f $ac_dir/install-sh; then
+    ac_aux_dir=$ac_dir
+    ac_install_sh="$ac_aux_dir/install-sh -c"
+    break
+  elif test -f $ac_dir/install.sh; then
+    ac_aux_dir=$ac_dir
+    ac_install_sh="$ac_aux_dir/install.sh -c"
+    break
+  elif test -f $ac_dir/shtool; then
+    ac_aux_dir=$ac_dir
+    ac_install_sh="$ac_aux_dir/shtool install -c"
+    break
+  fi
+done
+if test -z "$ac_aux_dir"; then
+  { { echo "$as_me:$LINENO: error: cannot find install-sh or install.sh in ./support $srcdir/./support" >&5
+echo "$as_me: error: cannot find install-sh or install.sh in ./support $srcdir/./support" >&2;}
+   { (exit 1); exit 1; }; }
+fi
+ac_config_guess="$SHELL $ac_aux_dir/config.guess"
+ac_config_sub="$SHELL $ac_aux_dir/config.sub"
+ac_configure="$SHELL $ac_aux_dir/configure" # This should be Cygnus configure.
+
+          ac_config_headers="$ac_config_headers config.h"
+
+
+LIBVERSION=5.2
+
+# Make sure we can run config.sub.
+$ac_config_sub sun4 >/dev/null 2>&1 ||
+  { { echo "$as_me:$LINENO: error: cannot run $ac_config_sub" >&5
+echo "$as_me: error: cannot run $ac_config_sub" >&2;}
+   { (exit 1); exit 1; }; }
+
+echo "$as_me:$LINENO: checking build system type" >&5
+echo $ECHO_N "checking build system type... $ECHO_C" >&6
+if test "${ac_cv_build+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_cv_build_alias=$build_alias
+test -z "$ac_cv_build_alias" &&
+  ac_cv_build_alias=`$ac_config_guess`
+test -z "$ac_cv_build_alias" &&
+  { { echo "$as_me:$LINENO: error: cannot guess build type; you must specify one" >&5
+echo "$as_me: error: cannot guess build type; you must specify one" >&2;}
+   { (exit 1); exit 1; }; }
+ac_cv_build=`$ac_config_sub $ac_cv_build_alias` ||
+  { { echo "$as_me:$LINENO: error: $ac_config_sub $ac_cv_build_alias failed" >&5
+echo "$as_me: error: $ac_config_sub $ac_cv_build_alias failed" >&2;}
+   { (exit 1); exit 1; }; }
+
+fi
+echo "$as_me:$LINENO: result: $ac_cv_build" >&5
+echo "${ECHO_T}$ac_cv_build" >&6
+build=$ac_cv_build
+build_cpu=`echo $ac_cv_build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'`
+build_vendor=`echo $ac_cv_build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'`
+build_os=`echo $ac_cv_build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
+
+
+echo "$as_me:$LINENO: checking host system type" >&5
+echo $ECHO_N "checking host system type... $ECHO_C" >&6
+if test "${ac_cv_host+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_cv_host_alias=$host_alias
+test -z "$ac_cv_host_alias" &&
+  ac_cv_host_alias=$ac_cv_build_alias
+ac_cv_host=`$ac_config_sub $ac_cv_host_alias` ||
+  { { echo "$as_me:$LINENO: error: $ac_config_sub $ac_cv_host_alias failed" >&5
+echo "$as_me: error: $ac_config_sub $ac_cv_host_alias failed" >&2;}
+   { (exit 1); exit 1; }; }
+
+fi
+echo "$as_me:$LINENO: result: $ac_cv_host" >&5
+echo "${ECHO_T}$ac_cv_host" >&6
+host=$ac_cv_host
+host_cpu=`echo $ac_cv_host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'`
+host_vendor=`echo $ac_cv_host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'`
+host_os=`echo $ac_cv_host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
+
+
+
+opt_curses=no
+opt_purify=no
+
+
+# Check whether --with-curses or --without-curses was given.
+if test "${with_curses+set}" = set; then
+  withval="$with_curses"
+  opt_curses=$withval
+fi;
+
+# Check whether --with-purify or --without-purify was given.
+if test "${with_purify+set}" = set; then
+  withval="$with_purify"
+  opt_purify=$withval
+fi;
+
+if test "$opt_curses" = "yes"; then
+       prefer_curses=yes
+fi
+
+if test "$opt_purify" = yes; then
+       PURIFY="purify"
+else
+       PURIFY=
+fi
+
+opt_multibyte=yes
+opt_static_libs=yes
+opt_shared_libs=yes
+
+# Check whether --enable-multibyte or --disable-multibyte was given.
+if test "${enable_multibyte+set}" = set; then
+  enableval="$enable_multibyte"
+  opt_multibyte=$enableval
+fi;
+# Check whether --enable-shared or --disable-shared was given.
+if test "${enable_shared+set}" = set; then
+  enableval="$enable_shared"
+  opt_shared_libs=$enableval
+fi;
+# Check whether --enable-static or --disable-static was given.
+if test "${enable_static+set}" = set; then
+  enableval="$enable_static"
+  opt_static_libs=$enableval
+fi;
+
+if test $opt_multibyte = no; then
+cat >>confdefs.h <<\_ACEOF
+#define NO_MULTIBYTE_SUPPORT 1
+_ACEOF
+
+fi
+
+
+
+CROSS_COMPILE=
+if test "x$cross_compiling" = "xyes"; then
+    case "${host}" in
+    *-cygwin*)
+        cross_cache=${srcdir}/cross-build/cygwin.cache
+        ;;
+    *-mingw*)
+        cross_cache=${srcdir}/cross-build/mingw.cache
+        ;;
+    i[3456]86-*-beos*)
+        cross_cache=${srcdir}/cross-build/x86-beos.cache
+        ;;
+    *)  echo "configure: cross-compiling for $host is not supported" >&2
+        ;;
+    esac
+    if test -n "${cross_cache}" && test -r "${cross_cache}"; then
+        echo "loading cross-build cache file ${cross_cache}"
+        . ${cross_cache}
+    fi
+    unset cross_cache
+    CROSS_COMPILE='-DCROSS_COMPILING'
+
+fi
+
+echo ""
+echo "Beginning configuration for readline-$LIBVERSION for ${host_cpu}-${host_vendor}-${host_os}"
+echo ""
+
+# We want these before the checks, so the checks can modify their values.
+test -z "$CFLAGS" && CFLAGS=-g auto_cflags=1
+
+echo "$as_me:$LINENO: checking whether ${MAKE-make} sets \$(MAKE)" >&5
+echo $ECHO_N "checking whether ${MAKE-make} sets \$(MAKE)... $ECHO_C" >&6
+set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y,:./+-,___p_,'`
+if eval "test \"\${ac_cv_prog_make_${ac_make}_set+set}\" = set"; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.make <<\_ACEOF
+all:
+       @echo 'ac_maketemp="$(MAKE)"'
+_ACEOF
+# GNU make sometimes prints "make[1]: Entering...", which would confuse us.
+eval `${MAKE-make} -f conftest.make 2>/dev/null | grep temp=`
+if test -n "$ac_maketemp"; then
+  eval ac_cv_prog_make_${ac_make}_set=yes
+else
+  eval ac_cv_prog_make_${ac_make}_set=no
+fi
+rm -f conftest.make
+fi
+if eval "test \"`echo '$ac_cv_prog_make_'${ac_make}_set`\" = yes"; then
+  echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+  SET_MAKE=
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+  SET_MAKE="MAKE=${MAKE-make}"
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}gcc; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_CC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_CC="${ac_tool_prefix}gcc"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+fi
+if test -z "$ac_cv_prog_CC"; then
+  ac_ct_CC=$CC
+  # Extract the first word of "gcc", so it can be a program name with args.
+set dummy gcc; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$ac_ct_CC"; then
+  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_CC="gcc"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+  echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
+echo "${ECHO_T}$ac_ct_CC" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+  CC=$ac_ct_CC
+else
+  CC="$ac_cv_prog_CC"
+fi
+
+if test -z "$CC"; then
+  if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}cc; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_CC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_CC="${ac_tool_prefix}cc"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+fi
+if test -z "$ac_cv_prog_CC"; then
+  ac_ct_CC=$CC
+  # Extract the first word of "cc", so it can be a program name with args.
+set dummy cc; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$ac_ct_CC"; then
+  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_CC="cc"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+  echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
+echo "${ECHO_T}$ac_ct_CC" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+  CC=$ac_ct_CC
+else
+  CC="$ac_cv_prog_CC"
+fi
+
+fi
+if test -z "$CC"; then
+  # Extract the first word of "cc", so it can be a program name with args.
+set dummy cc; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_CC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+  ac_prog_rejected=no
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then
+       ac_prog_rejected=yes
+       continue
+     fi
+    ac_cv_prog_CC="cc"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+if test $ac_prog_rejected = yes; then
+  # We found a bogon in the path, so make sure we never use it.
+  set dummy $ac_cv_prog_CC
+  shift
+  if test $# != 0; then
+    # We chose a different compiler from the bogus one.
+    # However, it has the same basename, so the bogon will be chosen
+    # first if we set CC to just the basename; use the full file name.
+    shift
+    ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@"
+  fi
+fi
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+fi
+if test -z "$CC"; then
+  if test -n "$ac_tool_prefix"; then
+  for ac_prog in cl
+  do
+    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_CC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_CC="$ac_tool_prefix$ac_prog"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+    test -n "$CC" && break
+  done
+fi
+if test -z "$CC"; then
+  ac_ct_CC=$CC
+  for ac_prog in cl
+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 "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$ac_ct_CC"; then
+  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_CC="$ac_prog"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+  echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
+echo "${ECHO_T}$ac_ct_CC" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+  test -n "$ac_ct_CC" && break
+done
+
+  CC=$ac_ct_CC
+fi
+
+fi
+
+
+test -z "$CC" && { { echo "$as_me:$LINENO: error: no acceptable C compiler found in \$PATH
+See \`config.log' for more details." >&5
+echo "$as_me: error: no acceptable C compiler found in \$PATH
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; }
+
+# Provide some information about the compiler.
+echo "$as_me:$LINENO:" \
+     "checking for C compiler version" >&5
+ac_compiler=`set X $ac_compile; echo $2`
+{ (eval echo "$as_me:$LINENO: \"$ac_compiler --version </dev/null >&5\"") >&5
+  (eval $ac_compiler --version </dev/null >&5) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }
+{ (eval echo "$as_me:$LINENO: \"$ac_compiler -v </dev/null >&5\"") >&5
+  (eval $ac_compiler -v </dev/null >&5) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }
+{ (eval echo "$as_me:$LINENO: \"$ac_compiler -V </dev/null >&5\"") >&5
+  (eval $ac_compiler -V </dev/null >&5) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }
+
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+ac_clean_files_save=$ac_clean_files
+ac_clean_files="$ac_clean_files a.out a.exe b.out"
+# Try to create an executable without -o first, disregard a.out.
+# It will help us diagnose broken compilers, and finding out an intuition
+# of exeext.
+echo "$as_me:$LINENO: checking for C compiler default output file name" >&5
+echo $ECHO_N "checking for C compiler default output file name... $ECHO_C" >&6
+ac_link_default=`echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'`
+if { (eval echo "$as_me:$LINENO: \"$ac_link_default\"") >&5
+  (eval $ac_link_default) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; then
+  # Find the output, starting from the most likely.  This scheme is
+# not robust to junk in `.', hence go to wildcards (a.*) only as a last
+# resort.
+
+# Be careful to initialize this variable, since it used to be cached.
+# Otherwise an old cache value of `no' led to `EXEEXT = no' in a Makefile.
+ac_cv_exeext=
+# b.out is created by i960 compilers.
+for ac_file in a_out.exe a.exe conftest.exe a.out conftest a.* conftest.* b.out
+do
+  test -f "$ac_file" || continue
+  case $ac_file in
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.o | *.obj )
+       ;;
+    conftest.$ac_ext )
+       # This is the source file.
+       ;;
+    [ab].out )
+       # We found the default executable, but exeext='' is most
+       # certainly right.
+       break;;
+    *.* )
+       ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
+       # FIXME: I believe we export ac_cv_exeext for Libtool,
+       # but it would be cool to find out if it's true.  Does anybody
+       # maintain Libtool? --akim.
+       export ac_cv_exeext
+       break;;
+    * )
+       break;;
+  esac
+done
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+{ { echo "$as_me:$LINENO: error: C compiler cannot create executables
+See \`config.log' for more details." >&5
+echo "$as_me: error: C compiler cannot create executables
+See \`config.log' for more details." >&2;}
+   { (exit 77); exit 77; }; }
+fi
+
+ac_exeext=$ac_cv_exeext
+echo "$as_me:$LINENO: result: $ac_file" >&5
+echo "${ECHO_T}$ac_file" >&6
+
+# Check the compiler produces executables we can run.  If not, either
+# the compiler is broken, or we cross compile.
+echo "$as_me:$LINENO: checking whether the C compiler works" >&5
+echo $ECHO_N "checking whether the C compiler works... $ECHO_C" >&6
+# FIXME: These cross compiler hacks should be removed for Autoconf 3.0
+# If not cross compiling, check that we can run a simple program.
+if test "$cross_compiling" != yes; then
+  if { ac_try='./$ac_file'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+    cross_compiling=no
+  else
+    if test "$cross_compiling" = maybe; then
+       cross_compiling=yes
+    else
+       { { echo "$as_me:$LINENO: error: cannot run C compiled programs.
+If you meant to cross compile, use \`--host'.
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot run C compiled programs.
+If you meant to cross compile, use \`--host'.
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; }
+    fi
+  fi
+fi
+echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+
+rm -f a.out a.exe conftest$ac_cv_exeext b.out
+ac_clean_files=$ac_clean_files_save
+# Check the compiler produces executables we can run.  If not, either
+# the compiler is broken, or we cross compile.
+echo "$as_me:$LINENO: checking whether we are cross compiling" >&5
+echo $ECHO_N "checking whether we are cross compiling... $ECHO_C" >&6
+echo "$as_me:$LINENO: result: $cross_compiling" >&5
+echo "${ECHO_T}$cross_compiling" >&6
+
+echo "$as_me:$LINENO: checking for suffix of executables" >&5
+echo $ECHO_N "checking for suffix of executables... $ECHO_C" >&6
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; then
+  # If both `conftest.exe' and `conftest' are `present' (well, observable)
+# catch `conftest.exe'.  For instance with Cygwin, `ls conftest' will
+# work properly (i.e., refer to `conftest.exe'), while it won't with
+# `rm'.
+for ac_file in conftest.exe conftest conftest.*; do
+  test -f "$ac_file" || continue
+  case $ac_file in
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.o | *.obj ) ;;
+    *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
+         export ac_cv_exeext
+         break;;
+    * ) break;;
+  esac
+done
+else
+  { { echo "$as_me:$LINENO: error: cannot compute suffix of executables: cannot compile and link
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot compute suffix of executables: cannot compile and link
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+rm -f conftest$ac_cv_exeext
+echo "$as_me:$LINENO: result: $ac_cv_exeext" >&5
+echo "${ECHO_T}$ac_cv_exeext" >&6
+
+rm -f conftest.$ac_ext
+EXEEXT=$ac_cv_exeext
+ac_exeext=$EXEEXT
+echo "$as_me:$LINENO: checking for suffix of object files" >&5
+echo $ECHO_N "checking for suffix of object files... $ECHO_C" >&6
+if test "${ac_cv_objext+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.o conftest.obj
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; then
+  for ac_file in `(ls conftest.o conftest.obj; ls conftest.*) 2>/dev/null`; do
+  case $ac_file in
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg ) ;;
+    *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'`
+       break;;
+  esac
+done
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+{ { echo "$as_me:$LINENO: error: cannot compute suffix of object files: cannot compile
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot compute suffix of object files: cannot compile
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+rm -f conftest.$ac_cv_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_objext" >&5
+echo "${ECHO_T}$ac_cv_objext" >&6
+OBJEXT=$ac_cv_objext
+ac_objext=$OBJEXT
+echo "$as_me:$LINENO: checking whether we are using the GNU C compiler" >&5
+echo $ECHO_N "checking whether we are using the GNU C compiler... $ECHO_C" >&6
+if test "${ac_cv_c_compiler_gnu+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+#ifndef __GNUC__
+       choke me
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag"
+                        || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_compiler_gnu=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_compiler_gnu=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+ac_cv_c_compiler_gnu=$ac_compiler_gnu
+
+fi
+echo "$as_me:$LINENO: result: $ac_cv_c_compiler_gnu" >&5
+echo "${ECHO_T}$ac_cv_c_compiler_gnu" >&6
+GCC=`test $ac_compiler_gnu = yes && echo yes`
+ac_test_CFLAGS=${CFLAGS+set}
+ac_save_CFLAGS=$CFLAGS
+CFLAGS="-g"
+echo "$as_me:$LINENO: checking whether $CC accepts -g" >&5
+echo $ECHO_N "checking whether $CC accepts -g... $ECHO_C" >&6
+if test "${ac_cv_prog_cc_g+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag"
+                        || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_prog_cc_g=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_prog_cc_g=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_prog_cc_g" >&5
+echo "${ECHO_T}$ac_cv_prog_cc_g" >&6
+if test "$ac_test_CFLAGS" = set; then
+  CFLAGS=$ac_save_CFLAGS
+elif test $ac_cv_prog_cc_g = yes; then
+  if test "$GCC" = yes; then
+    CFLAGS="-g -O2"
+  else
+    CFLAGS="-g"
+  fi
+else
+  if test "$GCC" = yes; then
+    CFLAGS="-O2"
+  else
+    CFLAGS=
+  fi
+fi
+echo "$as_me:$LINENO: checking for $CC option to accept ANSI C" >&5
+echo $ECHO_N "checking for $CC option to accept ANSI C... $ECHO_C" >&6
+if test "${ac_cv_prog_cc_stdc+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_cv_prog_cc_stdc=no
+ac_save_CC=$CC
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <stdarg.h>
+#include <stdio.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+/* Most of the following tests are stolen from RCS 5.7's src/conf.sh.  */
+struct buf { int x; };
+FILE * (*rcsopen) (struct buf *, struct stat *, int);
+static char *e (p, i)
+     char **p;
+     int i;
+{
+  return p[i];
+}
+static char *f (char * (*g) (char **, int), char **p, ...)
+{
+  char *s;
+  va_list v;
+  va_start (v,p);
+  s = g (p, va_arg (v,int));
+  va_end (v);
+  return s;
+}
+
+/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default.  It has
+   function prototypes and stuff, but not '\xHH' hex character constants.
+   These don't provoke an error unfortunately, instead are silently treated
+   as 'x'.  The following induces an error, until -std1 is added to get
+   proper ANSI mode.  Curiously '\x00'!='x' always comes out true, for an
+   array size at least.  It's necessary to write '\x00'==0 to get something
+   that's true only with -std1.  */
+int osf4_cc_array ['\x00' == 0 ? 1 : -1];
+
+int test (int i, double x);
+struct s1 {int (*f) (int a);};
+struct s2 {int (*f) (double a);};
+int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int);
+int argc;
+char **argv;
+int
+main ()
+{
+return f (e, argv, 0) != argv[0]  ||  f (e, argv, 1) != argv[1];
+  ;
+  return 0;
+}
+_ACEOF
+# Don't try gcc -ansi; that turns off useful extensions and
+# breaks some systems' header files.
+# AIX                  -qlanglvl=ansi
+# Ultrix and OSF/1     -std1
+# HP-UX 10.20 and later        -Ae
+# HP-UX older versions -Aa -D_HPUX_SOURCE
+# SVR4                 -Xc -D__EXTENSIONS__
+for ac_arg in "" -qlanglvl=ansi -std1 -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__"
+do
+  CC="$ac_save_CC $ac_arg"
+  rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag"
+                        || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_prog_cc_stdc=$ac_arg
+break
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+fi
+rm -f conftest.err conftest.$ac_objext
+done
+rm -f conftest.$ac_ext conftest.$ac_objext
+CC=$ac_save_CC
+
+fi
+
+case "x$ac_cv_prog_cc_stdc" in
+  x|xno)
+    echo "$as_me:$LINENO: result: none needed" >&5
+echo "${ECHO_T}none needed" >&6 ;;
+  *)
+    echo "$as_me:$LINENO: result: $ac_cv_prog_cc_stdc" >&5
+echo "${ECHO_T}$ac_cv_prog_cc_stdc" >&6
+    CC="$CC $ac_cv_prog_cc_stdc" ;;
+esac
+
+# Some people use a C++ compiler to compile C.  Since we use `exit',
+# in C++ we need to declare it.  In case someone uses the same compiler
+# for both compiling C and C++ we need to have the C++ compiler decide
+# the declaration of exit, since it's the most demanding environment.
+cat >conftest.$ac_ext <<_ACEOF
+#ifndef __cplusplus
+  choke me
+#endif
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag"
+                        || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  for ac_declaration in \
+   '' \
+   'extern "C" void std::exit (int) throw (); using std::exit;' \
+   'extern "C" void std::exit (int); using std::exit;' \
+   'extern "C" void exit (int) throw ();' \
+   'extern "C" void exit (int);' \
+   'void exit (int);'
+do
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_declaration
+#include <stdlib.h>
+int
+main ()
+{
+exit (42);
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag"
+                        || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  :
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+continue
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_declaration
+int
+main ()
+{
+exit (42);
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag"
+                        || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  break
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+done
+rm -f conftest*
+if test -n "$ac_declaration"; then
+  echo '#ifdef __cplusplus' >>confdefs.h
+  echo $ac_declaration      >>confdefs.h
+  echo '#endif'             >>confdefs.h
+fi
+
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+echo "$as_me:$LINENO: checking how to run the C preprocessor" >&5
+echo $ECHO_N "checking how to run the C preprocessor... $ECHO_C" >&6
+# On Suns, sometimes $CPP names a directory.
+if test -n "$CPP" && test -d "$CPP"; then
+  CPP=
+fi
+if test -z "$CPP"; then
+  if test "${ac_cv_prog_CPP+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+      # Double quotes because CPP needs to be expanded
+    for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp"
+    do
+      ac_preproc_ok=false
+for ac_c_preproc_warn_flag in '' yes
+do
+  # Use a header file that comes with gcc, so configuring glibc
+  # with a fresh cross-compiler works.
+  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+  # <limits.h> exists even on freestanding compilers.
+  # On the NeXT, cc -E runs the code through the compiler's parser,
+  # not just through cpp. "Syntax error" is here to catch this case.
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+                    Syntax error
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+  (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null; then
+  if test -s conftest.err; then
+    ac_cpp_err=$ac_c_preproc_warn_flag
+    ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
+  else
+    ac_cpp_err=
+  fi
+else
+  ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+  :
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+  # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err conftest.$ac_ext
+
+  # OK, works on sane cases.  Now check whether non-existent headers
+  # can be detected and how.
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <ac_nonexistent.h>
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+  (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null; then
+  if test -s conftest.err; then
+    ac_cpp_err=$ac_c_preproc_warn_flag
+    ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
+  else
+    ac_cpp_err=
+  fi
+else
+  ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+  # Broken: success on invalid input.
+continue
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+  # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then
+  break
+fi
+
+    done
+    ac_cv_prog_CPP=$CPP
+
+fi
+  CPP=$ac_cv_prog_CPP
+else
+  ac_cv_prog_CPP=$CPP
+fi
+echo "$as_me:$LINENO: result: $CPP" >&5
+echo "${ECHO_T}$CPP" >&6
+ac_preproc_ok=false
+for ac_c_preproc_warn_flag in '' yes
+do
+  # Use a header file that comes with gcc, so configuring glibc
+  # with a fresh cross-compiler works.
+  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+  # <limits.h> exists even on freestanding compilers.
+  # On the NeXT, cc -E runs the code through the compiler's parser,
+  # not just through cpp. "Syntax error" is here to catch this case.
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+                    Syntax error
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+  (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null; then
+  if test -s conftest.err; then
+    ac_cpp_err=$ac_c_preproc_warn_flag
+    ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
+  else
+    ac_cpp_err=
+  fi
+else
+  ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+  :
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+  # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err conftest.$ac_ext
+
+  # OK, works on sane cases.  Now check whether non-existent headers
+  # can be detected and how.
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <ac_nonexistent.h>
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+  (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null; then
+  if test -s conftest.err; then
+    ac_cpp_err=$ac_c_preproc_warn_flag
+    ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
+  else
+    ac_cpp_err=
+  fi
+else
+  ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+  # Broken: success on invalid input.
+continue
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+  # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then
+  :
+else
+  { { echo "$as_me:$LINENO: error: C preprocessor \"$CPP\" fails sanity check
+See \`config.log' for more details." >&5
+echo "$as_me: error: C preprocessor \"$CPP\" fails sanity check
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+echo "$as_me:$LINENO: checking for egrep" >&5
+echo $ECHO_N "checking for egrep... $ECHO_C" >&6
+if test "${ac_cv_prog_egrep+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if echo a | (grep -E '(a|b)') >/dev/null 2>&1
+    then ac_cv_prog_egrep='grep -E'
+    else ac_cv_prog_egrep='egrep'
+    fi
+fi
+echo "$as_me:$LINENO: result: $ac_cv_prog_egrep" >&5
+echo "${ECHO_T}$ac_cv_prog_egrep" >&6
+ EGREP=$ac_cv_prog_egrep
+
+
+echo "$as_me:$LINENO: checking for ANSI C header files" >&5
+echo $ECHO_N "checking for ANSI C header files... $ECHO_C" >&6
+if test "${ac_cv_header_stdc+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <stdlib.h>
+#include <stdarg.h>
+#include <string.h>
+#include <float.h>
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag"
+                        || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_header_stdc=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_header_stdc=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+if test $ac_cv_header_stdc = yes; then
+  # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <string.h>
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "memchr" >/dev/null 2>&1; then
+  :
+else
+  ac_cv_header_stdc=no
+fi
+rm -f conftest*
+
+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 <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <stdlib.h>
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "free" >/dev/null 2>&1; then
+  :
+else
+  ac_cv_header_stdc=no
+fi
+rm -f conftest*
+
+fi
+
+if test $ac_cv_header_stdc = yes; then
+  # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi.
+  if test "$cross_compiling" = yes; then
+  :
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <ctype.h>
+#if ((' ' & 0x0FF) == 0x020)
+# define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
+# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))
+#else
+# define ISLOWER(c) \
+                  (('a' <= (c) && (c) <= 'i') \
+                    || ('j' <= (c) && (c) <= 'r') \
+                    || ('s' <= (c) && (c) <= 'z'))
+# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c))
+#endif
+
+#define XOR(e, f) (((e) && !(f)) || (!(e) && (f)))
+int
+main ()
+{
+  int i;
+  for (i = 0; i < 256; i++)
+    if (XOR (islower (i), ISLOWER (i))
+       || toupper (i) != TOUPPER (i))
+      exit(2);
+  exit (0);
+}
+_ACEOF
+rm -f conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  :
+else
+  echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+( exit $ac_status )
+ac_cv_header_stdc=no
+fi
+rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+fi
+fi
+echo "$as_me:$LINENO: result: $ac_cv_header_stdc" >&5
+echo "${ECHO_T}$ac_cv_header_stdc" >&6
+if test $ac_cv_header_stdc = yes; then
+
+cat >>confdefs.h <<\_ACEOF
+#define STDC_HEADERS 1
+_ACEOF
+
+fi
+
+# On IRIX 5.3, sys/types and inttypes.h are conflicting.
+
+
+
+
+
+
+
+
+
+for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \
+                 inttypes.h stdint.h unistd.h
+do
+as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
+echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+
+#include <$ac_header>
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag"
+                        || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  eval "$as_ac_Header=yes"
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+eval "$as_ac_Header=no"
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
+echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
+if test `eval echo '${'$as_ac_Header'}'` = yes; then
+  cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+
+done
+
+
+if test "${ac_cv_header_minix_config_h+set}" = set; then
+  echo "$as_me:$LINENO: checking for minix/config.h" >&5
+echo $ECHO_N "checking for minix/config.h... $ECHO_C" >&6
+if test "${ac_cv_header_minix_config_h+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+fi
+echo "$as_me:$LINENO: result: $ac_cv_header_minix_config_h" >&5
+echo "${ECHO_T}$ac_cv_header_minix_config_h" >&6
+else
+  # Is the header compilable?
+echo "$as_me:$LINENO: checking minix/config.h usability" >&5
+echo $ECHO_N "checking minix/config.h usability... $ECHO_C" >&6
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+#include <minix/config.h>
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag"
+                        || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_header_compiler=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_header_compiler=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
+echo "${ECHO_T}$ac_header_compiler" >&6
+
+# Is the header present?
+echo "$as_me:$LINENO: checking minix/config.h presence" >&5
+echo $ECHO_N "checking minix/config.h presence... $ECHO_C" >&6
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <minix/config.h>
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+  (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null; then
+  if test -s conftest.err; then
+    ac_cpp_err=$ac_c_preproc_warn_flag
+    ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
+  else
+    ac_cpp_err=
+  fi
+else
+  ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+  ac_header_preproc=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+  ac_header_preproc=no
+fi
+rm -f conftest.err conftest.$ac_ext
+echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
+echo "${ECHO_T}$ac_header_preproc" >&6
+
+# So?  What about this header?
+case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in
+  yes:no: )
+    { echo "$as_me:$LINENO: WARNING: minix/config.h: accepted by the compiler, rejected by the preprocessor!" >&5
+echo "$as_me: WARNING: minix/config.h: accepted by the compiler, rejected by the preprocessor!" >&2;}
+    { echo "$as_me:$LINENO: WARNING: minix/config.h: proceeding with the compiler's result" >&5
+echo "$as_me: WARNING: minix/config.h: proceeding with the compiler's result" >&2;}
+    ac_header_preproc=yes
+    ;;
+  no:yes:* )
+    { echo "$as_me:$LINENO: WARNING: minix/config.h: present but cannot be compiled" >&5
+echo "$as_me: WARNING: minix/config.h: present but cannot be compiled" >&2;}
+    { echo "$as_me:$LINENO: WARNING: minix/config.h:     check for missing prerequisite headers?" >&5
+echo "$as_me: WARNING: minix/config.h:     check for missing prerequisite headers?" >&2;}
+    { echo "$as_me:$LINENO: WARNING: minix/config.h: see the Autoconf documentation" >&5
+echo "$as_me: WARNING: minix/config.h: see the Autoconf documentation" >&2;}
+    { echo "$as_me:$LINENO: WARNING: minix/config.h:     section \"Present But Cannot Be Compiled\"" >&5
+echo "$as_me: WARNING: minix/config.h:     section \"Present But Cannot Be Compiled\"" >&2;}
+    { echo "$as_me:$LINENO: WARNING: minix/config.h: proceeding with the preprocessor's result" >&5
+echo "$as_me: WARNING: minix/config.h: proceeding with the preprocessor's result" >&2;}
+    { echo "$as_me:$LINENO: WARNING: minix/config.h: in the future, the compiler will take precedence" >&5
+echo "$as_me: WARNING: minix/config.h: in the future, the compiler will take precedence" >&2;}
+    (
+      cat <<\_ASBOX
+## ----------------------------------- ##
+## Report this to bug-readline@gnu.org ##
+## ----------------------------------- ##
+_ASBOX
+    ) |
+      sed "s/^/$as_me: WARNING:     /" >&2
+    ;;
+esac
+echo "$as_me:$LINENO: checking for minix/config.h" >&5
+echo $ECHO_N "checking for minix/config.h... $ECHO_C" >&6
+if test "${ac_cv_header_minix_config_h+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_cv_header_minix_config_h=$ac_header_preproc
+fi
+echo "$as_me:$LINENO: result: $ac_cv_header_minix_config_h" >&5
+echo "${ECHO_T}$ac_cv_header_minix_config_h" >&6
+
+fi
+if test $ac_cv_header_minix_config_h = yes; then
+  MINIX=yes
+else
+  MINIX=
+fi
+
+
+if test "$MINIX" = yes; then
+
+cat >>confdefs.h <<\_ACEOF
+#define _POSIX_SOURCE 1
+_ACEOF
+
+
+cat >>confdefs.h <<\_ACEOF
+#define _POSIX_1_SOURCE 2
+_ACEOF
+
+
+cat >>confdefs.h <<\_ACEOF
+#define _MINIX 1
+_ACEOF
+
+fi
+
+
+# If we're using gcc and the user hasn't specified CFLAGS, add -O to CFLAGS.
+test -n "$GCC" && test -n "$auto_cflags" && CFLAGS="$CFLAGS -O"
+
+if test $ac_cv_c_compiler_gnu = yes; then
+    echo "$as_me:$LINENO: checking whether $CC needs -traditional" >&5
+echo $ECHO_N "checking whether $CC needs -traditional... $ECHO_C" >&6
+if test "${ac_cv_prog_gcc_traditional+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+    ac_pattern="Autoconf.*'x'"
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <sgtty.h>
+Autoconf TIOCGETP
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "$ac_pattern" >/dev/null 2>&1; then
+  ac_cv_prog_gcc_traditional=yes
+else
+  ac_cv_prog_gcc_traditional=no
+fi
+rm -f conftest*
+
+
+  if test $ac_cv_prog_gcc_traditional = no; then
+    cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <termio.h>
+Autoconf TCGETA
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "$ac_pattern" >/dev/null 2>&1; then
+  ac_cv_prog_gcc_traditional=yes
+fi
+rm -f conftest*
+
+  fi
+fi
+echo "$as_me:$LINENO: result: $ac_cv_prog_gcc_traditional" >&5
+echo "${ECHO_T}$ac_cv_prog_gcc_traditional" >&6
+  if test $ac_cv_prog_gcc_traditional = yes; then
+    CC="$CC -traditional"
+  fi
+fi
+
+# Find a good install program.  We prefer a C program (faster),
+# so one script is as good as another.  But avoid the broken or
+# incompatible versions:
+# SysV /etc/install, /usr/sbin/install
+# SunOS /usr/etc/install
+# IRIX /sbin/install
+# AIX /bin/install
+# AmigaOS /C/install, which installs bootblocks on floppy discs
+# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag
+# AFS /usr/afsws/bin/install, which mishandles nonexistent args
+# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
+# OS/2's system install, which has a completely different semantic
+# ./install, which can be erroneously created by make from ./install.sh.
+echo "$as_me:$LINENO: checking for a BSD-compatible install" >&5
+echo $ECHO_N "checking for a BSD-compatible install... $ECHO_C" >&6
+if test -z "$INSTALL"; then
+if test "${ac_cv_path_install+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  # Account for people who put trailing slashes in PATH elements.
+case $as_dir/ in
+  ./ | .// | /cC/* | \
+  /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \
+  ?:\\/os2\\/install\\/* | ?:\\/OS2\\/INSTALL\\/* | \
+  /usr/ucb/* ) ;;
+  *)
+    # OSF1 and SCO ODT 3.0 have their own names for install.
+    # Don't use installbsd from OSF since it installs stuff as root
+    # by default.
+    for ac_prog in ginstall scoinst install; do
+      for ac_exec_ext in '' $ac_executable_extensions; do
+       if $as_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then
+         if test $ac_prog = install &&
+           grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
+           # AIX install.  It has an incompatible calling convention.
+           :
+         elif test $ac_prog = install &&
+           grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
+           # program-specific install script used by HP pwplus--don't use.
+           :
+         else
+           ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c"
+           break 3
+         fi
+       fi
+      done
+    done
+    ;;
+esac
+done
+
+
+fi
+  if test "${ac_cv_path_install+set}" = set; then
+    INSTALL=$ac_cv_path_install
+  else
+    # As a last resort, use the slow shell script.  We don't cache a
+    # path for INSTALL within a source directory, because that will
+    # break other packages using the cache if that directory is
+    # removed, or if the path is relative.
+    INSTALL=$ac_install_sh
+  fi
+fi
+echo "$as_me:$LINENO: result: $INSTALL" >&5
+echo "${ECHO_T}$INSTALL" >&6
+
+# Use test -z because SunOS4 sh mishandles braces in ${var-val}.
+# It thinks the first close brace ends the variable substitution.
+test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}'
+
+test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}'
+
+test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
+
+# Extract the first word of "ar", so it can be a program name with args.
+set dummy ar; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_AR+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$AR"; then
+  ac_cv_prog_AR="$AR" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_AR=""
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+  test -z "$ac_cv_prog_AR" && ac_cv_prog_AR="ar"
+fi
+fi
+AR=$ac_cv_prog_AR
+if test -n "$AR"; then
+  echo "$as_me:$LINENO: result: $AR" >&5
+echo "${ECHO_T}$AR" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+test -n "$ARFLAGS" || ARFLAGS="cr"
+if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args.
+set dummy ${ac_tool_prefix}ranlib; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_RANLIB+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$RANLIB"; then
+  ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+fi
+fi
+RANLIB=$ac_cv_prog_RANLIB
+if test -n "$RANLIB"; then
+  echo "$as_me:$LINENO: result: $RANLIB" >&5
+echo "${ECHO_T}$RANLIB" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+fi
+if test -z "$ac_cv_prog_RANLIB"; then
+  ac_ct_RANLIB=$RANLIB
+  # Extract the first word of "ranlib", so it can be a program name with args.
+set dummy ranlib; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_RANLIB+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$ac_ct_RANLIB"; then
+  ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_RANLIB="ranlib"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+  test -z "$ac_cv_prog_ac_ct_RANLIB" && ac_cv_prog_ac_ct_RANLIB=":"
+fi
+fi
+ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB
+if test -n "$ac_ct_RANLIB"; then
+  echo "$as_me:$LINENO: result: $ac_ct_RANLIB" >&5
+echo "${ECHO_T}$ac_ct_RANLIB" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+  RANLIB=$ac_ct_RANLIB
+else
+  RANLIB="$ac_cv_prog_RANLIB"
+fi
+
+
+MAKE_SHELL=/bin/sh
+
+
+echo "$as_me:$LINENO: checking for an ANSI C-conforming const" >&5
+echo $ECHO_N "checking for an ANSI C-conforming const... $ECHO_C" >&6
+if test "${ac_cv_c_const+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+/* FIXME: Include the comments suggested by Paul. */
+#ifndef __cplusplus
+  /* Ultrix mips cc rejects this.  */
+  typedef int charset[2];
+  const charset x;
+  /* SunOS 4.1.1 cc rejects this.  */
+  char const *const *ccp;
+  char **p;
+  /* NEC SVR4.0.2 mips cc rejects this.  */
+  struct point {int x, y;};
+  static struct point const zero = {0,0};
+  /* AIX XL C 1.02.0.0 rejects this.
+     It does not let you subtract one const X* pointer from another in
+     an arm of an if-expression whose if-part is not a constant
+     expression */
+  const char *g = "string";
+  ccp = &g + (g ? g-g : 0);
+  /* HPUX 7.0 cc rejects these. */
+  ++ccp;
+  p = (char**) ccp;
+  ccp = (char const *const *) p;
+  { /* SCO 3.2v4 cc rejects this.  */
+    char *t;
+    char const *s = 0 ? (char *) 0 : (char const *) 0;
+
+    *t++ = 0;
+  }
+  { /* Someone thinks the Sun supposedly-ANSI compiler will reject this.  */
+    int x[] = {25, 17};
+    const int *foo = &x[0];
+    ++foo;
+  }
+  { /* Sun SC1.0 ANSI compiler rejects this -- but not the above. */
+    typedef const int *iptr;
+    iptr p = 0;
+    ++p;
+  }
+  { /* AIX XL C 1.02.0.0 rejects this saying
+       "k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */
+    struct s { int j; const int *ap[3]; };
+    struct s *b; b->j = 5;
+  }
+  { /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */
+    const int foo = 10;
+  }
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag"
+                        || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_c_const=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_c_const=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_c_const" >&5
+echo "${ECHO_T}$ac_cv_c_const" >&6
+if test $ac_cv_c_const = no; then
+
+cat >>confdefs.h <<\_ACEOF
+#define const
+_ACEOF
+
+fi
+
+echo "$as_me:$LINENO: checking for function prototypes" >&5
+echo $ECHO_N "checking for function prototypes... $ECHO_C" >&6
+if test "$ac_cv_prog_cc_stdc" != no; then
+  echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+
+cat >>confdefs.h <<\_ACEOF
+#define PROTOTYPES 1
+_ACEOF
+
+
+cat >>confdefs.h <<\_ACEOF
+#define __PROTOTYPES 1
+_ACEOF
+
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+
+echo "$as_me:$LINENO: checking whether char is unsigned" >&5
+echo $ECHO_N "checking whether char is unsigned... $ECHO_C" >&6
+if test "${ac_cv_c_char_unsigned+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+int
+main ()
+{
+static int test_array [1 - 2 * !(((char) -1) < 0)];
+test_array [0] = 0
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag"
+                        || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_c_char_unsigned=no
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_c_char_unsigned=yes
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_c_char_unsigned" >&5
+echo "${ECHO_T}$ac_cv_c_char_unsigned" >&6
+if test $ac_cv_c_char_unsigned = yes && test "$GCC" != yes; then
+  cat >>confdefs.h <<\_ACEOF
+#define __CHAR_UNSIGNED__ 1
+_ACEOF
+
+fi
+
+
+echo "$as_me:$LINENO: checking return type of signal handlers" >&5
+echo $ECHO_N "checking return type of signal handlers... $ECHO_C" >&6
+if test "${ac_cv_type_signal+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <sys/types.h>
+#include <signal.h>
+#ifdef signal
+# undef signal
+#endif
+#ifdef __cplusplus
+extern "C" void (*signal (int, void (*)(int)))(int);
+#else
+void (*signal ()) ();
+#endif
+
+int
+main ()
+{
+int i;
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag"
+                        || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_type_signal=void
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_type_signal=int
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_type_signal" >&5
+echo "${ECHO_T}$ac_cv_type_signal" >&6
+
+cat >>confdefs.h <<_ACEOF
+#define RETSIGTYPE $ac_cv_type_signal
+_ACEOF
+
+
+
+echo "$as_me:$LINENO: checking for size_t" >&5
+echo $ECHO_N "checking for size_t... $ECHO_C" >&6
+if test "${ac_cv_type_size_t+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+int
+main ()
+{
+if ((size_t *) 0)
+  return 0;
+if (sizeof (size_t))
+  return 0;
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag"
+                        || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_type_size_t=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_type_size_t=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_type_size_t" >&5
+echo "${ECHO_T}$ac_cv_type_size_t" >&6
+if test $ac_cv_type_size_t = yes; then
+  :
+else
+
+cat >>confdefs.h <<_ACEOF
+#define size_t unsigned
+_ACEOF
+
+fi
+
+echo "$as_me:$LINENO: checking for ssize_t" >&5
+echo $ECHO_N "checking for ssize_t... $ECHO_C" >&6
+if test "${ac_cv_type_ssize_t+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+int
+main ()
+{
+if ((ssize_t *) 0)
+  return 0;
+if (sizeof (ssize_t))
+  return 0;
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag"
+                        || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_type_ssize_t=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_type_ssize_t=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_type_ssize_t" >&5
+echo "${ECHO_T}$ac_cv_type_ssize_t" >&6
+if test $ac_cv_type_ssize_t = yes; then
+  :
+else
+
+cat >>confdefs.h <<_ACEOF
+#define ssize_t int
+_ACEOF
+
+fi
+
+
+echo "$as_me:$LINENO: checking for ANSI C header files" >&5
+echo $ECHO_N "checking for ANSI C header files... $ECHO_C" >&6
+if test "${ac_cv_header_stdc+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <stdlib.h>
+#include <stdarg.h>
+#include <string.h>
+#include <float.h>
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag"
+                        || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_header_stdc=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_header_stdc=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+if test $ac_cv_header_stdc = yes; then
+  # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <string.h>
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "memchr" >/dev/null 2>&1; then
+  :
+else
+  ac_cv_header_stdc=no
+fi
+rm -f conftest*
+
+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 <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <stdlib.h>
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "free" >/dev/null 2>&1; then
+  :
+else
+  ac_cv_header_stdc=no
+fi
+rm -f conftest*
+
+fi
+
+if test $ac_cv_header_stdc = yes; then
+  # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi.
+  if test "$cross_compiling" = yes; then
+  :
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <ctype.h>
+#if ((' ' & 0x0FF) == 0x020)
+# define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
+# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))
+#else
+# define ISLOWER(c) \
+                  (('a' <= (c) && (c) <= 'i') \
+                    || ('j' <= (c) && (c) <= 'r') \
+                    || ('s' <= (c) && (c) <= 'z'))
+# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c))
+#endif
+
+#define XOR(e, f) (((e) && !(f)) || (!(e) && (f)))
+int
+main ()
+{
+  int i;
+  for (i = 0; i < 256; i++)
+    if (XOR (islower (i), ISLOWER (i))
+       || toupper (i) != TOUPPER (i))
+      exit(2);
+  exit (0);
+}
+_ACEOF
+rm -f conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  :
+else
+  echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+( exit $ac_status )
+ac_cv_header_stdc=no
+fi
+rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+fi
+fi
+echo "$as_me:$LINENO: result: $ac_cv_header_stdc" >&5
+echo "${ECHO_T}$ac_cv_header_stdc" >&6
+if test $ac_cv_header_stdc = yes; then
+
+cat >>confdefs.h <<\_ACEOF
+#define STDC_HEADERS 1
+_ACEOF
+
+fi
+
+
+echo "$as_me:$LINENO: checking whether stat file-mode macros are broken" >&5
+echo $ECHO_N "checking whether stat file-mode macros are broken... $ECHO_C" >&6
+if test "${ac_cv_header_stat_broken+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <sys/types.h>
+#include <sys/stat.h>
+
+#if defined(S_ISBLK) && defined(S_IFDIR)
+# if S_ISBLK (S_IFDIR)
+You lose.
+# endif
+#endif
+
+#if defined(S_ISBLK) && defined(S_IFCHR)
+# if S_ISBLK (S_IFCHR)
+You lose.
+# endif
+#endif
+
+#if defined(S_ISLNK) && defined(S_IFREG)
+# if S_ISLNK (S_IFREG)
+You lose.
+# endif
+#endif
+
+#if defined(S_ISSOCK) && defined(S_IFREG)
+# if S_ISSOCK (S_IFREG)
+You lose.
+# endif
+#endif
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "You lose" >/dev/null 2>&1; then
+  ac_cv_header_stat_broken=yes
+else
+  ac_cv_header_stat_broken=no
+fi
+rm -f conftest*
+
+fi
+echo "$as_me:$LINENO: result: $ac_cv_header_stat_broken" >&5
+echo "${ECHO_T}$ac_cv_header_stat_broken" >&6
+if test $ac_cv_header_stat_broken = yes; then
+
+cat >>confdefs.h <<\_ACEOF
+#define STAT_MACROS_BROKEN 1
+_ACEOF
+
+fi
+
+
+
+
+
+
+ac_header_dirent=no
+for ac_hdr in dirent.h sys/ndir.h sys/dir.h ndir.h; do
+  as_ac_Header=`echo "ac_cv_header_dirent_$ac_hdr" | $as_tr_sh`
+echo "$as_me:$LINENO: checking for $ac_hdr that defines DIR" >&5
+echo $ECHO_N "checking for $ac_hdr that defines DIR... $ECHO_C" >&6
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <sys/types.h>
+#include <$ac_hdr>
+
+int
+main ()
+{
+if ((DIR *) 0)
+return 0;
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag"
+                        || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  eval "$as_ac_Header=yes"
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+eval "$as_ac_Header=no"
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
+echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
+if test `eval echo '${'$as_ac_Header'}'` = yes; then
+  cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_hdr" | $as_tr_cpp` 1
+_ACEOF
+
+ac_header_dirent=$ac_hdr; break
+fi
+
+done
+# Two versions of opendir et al. are in -ldir and -lx on SCO Xenix.
+if test $ac_header_dirent = dirent.h; then
+  echo "$as_me:$LINENO: checking for library containing opendir" >&5
+echo $ECHO_N "checking for library containing opendir... $ECHO_C" >&6
+if test "${ac_cv_search_opendir+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_func_search_save_LIBS=$LIBS
+ac_cv_search_opendir=no
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+/* Override any gcc2 internal prototype to avoid an error.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+   builtin and then its argument prototype would still apply.  */
+char opendir ();
+int
+main ()
+{
+opendir ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+  (eval $ac_link) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag"
+                        || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest$ac_exeext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_search_opendir="none required"
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+fi
+rm -f conftest.err conftest.$ac_objext \
+      conftest$ac_exeext conftest.$ac_ext
+if test "$ac_cv_search_opendir" = no; then
+  for ac_lib in dir; do
+    LIBS="-l$ac_lib  $ac_func_search_save_LIBS"
+    cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+/* Override any gcc2 internal prototype to avoid an error.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+   builtin and then its argument prototype would still apply.  */
+char opendir ();
+int
+main ()
+{
+opendir ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+  (eval $ac_link) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag"
+                        || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest$ac_exeext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_search_opendir="-l$ac_lib"
+break
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+fi
+rm -f conftest.err conftest.$ac_objext \
+      conftest$ac_exeext conftest.$ac_ext
+  done
+fi
+LIBS=$ac_func_search_save_LIBS
+fi
+echo "$as_me:$LINENO: result: $ac_cv_search_opendir" >&5
+echo "${ECHO_T}$ac_cv_search_opendir" >&6
+if test "$ac_cv_search_opendir" != no; then
+  test "$ac_cv_search_opendir" = "none required" || LIBS="$ac_cv_search_opendir $LIBS"
+
+fi
+
+else
+  echo "$as_me:$LINENO: checking for library containing opendir" >&5
+echo $ECHO_N "checking for library containing opendir... $ECHO_C" >&6
+if test "${ac_cv_search_opendir+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_func_search_save_LIBS=$LIBS
+ac_cv_search_opendir=no
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+/* Override any gcc2 internal prototype to avoid an error.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+   builtin and then its argument prototype would still apply.  */
+char opendir ();
+int
+main ()
+{
+opendir ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+  (eval $ac_link) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag"
+                        || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest$ac_exeext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_search_opendir="none required"
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+fi
+rm -f conftest.err conftest.$ac_objext \
+      conftest$ac_exeext conftest.$ac_ext
+if test "$ac_cv_search_opendir" = no; then
+  for ac_lib in x; do
+    LIBS="-l$ac_lib  $ac_func_search_save_LIBS"
+    cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+/* Override any gcc2 internal prototype to avoid an error.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+   builtin and then its argument prototype would still apply.  */
+char opendir ();
+int
+main ()
+{
+opendir ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+  (eval $ac_link) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag"
+                        || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest$ac_exeext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_search_opendir="-l$ac_lib"
+break
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+fi
+rm -f conftest.err conftest.$ac_objext \
+      conftest$ac_exeext conftest.$ac_ext
+  done
+fi
+LIBS=$ac_func_search_save_LIBS
+fi
+echo "$as_me:$LINENO: result: $ac_cv_search_opendir" >&5
+echo "${ECHO_T}$ac_cv_search_opendir" >&6
+if test "$ac_cv_search_opendir" != no; then
+  test "$ac_cv_search_opendir" = "none required" || LIBS="$ac_cv_search_opendir $LIBS"
+
+fi
+
+fi
+
+
+
+
+
+for ac_func in fcntl kill lstat
+do
+as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
+echo "$as_me:$LINENO: checking for $ac_func" >&5
+echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6
+if eval "test \"\${$as_ac_var+set}\" = set"; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+/* Define $ac_func to an innocuous variant, in case <limits.h> declares $ac_func.
+   For example, HP-UX 11i <limits.h> declares gettimeofday.  */
+#define $ac_func innocuous_$ac_func
+
+/* System header to define __stub macros and hopefully few prototypes,
+    which can conflict with char $ac_func (); below.
+    Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+    <limits.h> exists even on freestanding compilers.  */
+
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+
+#undef $ac_func
+
+/* Override any gcc2 internal prototype to avoid an error.  */
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+/* 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 ();
+/* 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
+char (*f) () = $ac_func;
+#endif
+#ifdef __cplusplus
+}
+#endif
+
+int
+main ()
+{
+return f != $ac_func;
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+  (eval $ac_link) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag"
+                        || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest$ac_exeext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  eval "$as_ac_var=yes"
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+eval "$as_ac_var=no"
+fi
+rm -f conftest.err conftest.$ac_objext \
+      conftest$ac_exeext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5
+echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6
+if test `eval echo '${'$as_ac_var'}'` = yes; then
+  cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+done
+
+
+
+
+
+
+
+
+
+
+for ac_func in memmove putenv select setenv setlocale \
+               strcasecmp strpbrk tcgetattr vsnprintf
+do
+as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
+echo "$as_me:$LINENO: checking for $ac_func" >&5
+echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6
+if eval "test \"\${$as_ac_var+set}\" = set"; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+/* Define $ac_func to an innocuous variant, in case <limits.h> declares $ac_func.
+   For example, HP-UX 11i <limits.h> declares gettimeofday.  */
+#define $ac_func innocuous_$ac_func
+
+/* System header to define __stub macros and hopefully few prototypes,
+    which can conflict with char $ac_func (); below.
+    Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+    <limits.h> exists even on freestanding compilers.  */
+
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+
+#undef $ac_func
+
+/* Override any gcc2 internal prototype to avoid an error.  */
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+/* 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 ();
+/* 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
+char (*f) () = $ac_func;
+#endif
+#ifdef __cplusplus
+}
+#endif
+
+int
+main ()
+{
+return f != $ac_func;
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+  (eval $ac_link) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag"
+                        || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest$ac_exeext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  eval "$as_ac_var=yes"
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+eval "$as_ac_var=no"
+fi
+rm -f conftest.err conftest.$ac_objext \
+      conftest$ac_exeext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5
+echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6
+if test `eval echo '${'$as_ac_var'}'` = yes; then
+  cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+done
+
+
+
+for ac_func in isascii isxdigit
+do
+as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
+echo "$as_me:$LINENO: checking for $ac_func" >&5
+echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6
+if eval "test \"\${$as_ac_var+set}\" = set"; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+/* Define $ac_func to an innocuous variant, in case <limits.h> declares $ac_func.
+   For example, HP-UX 11i <limits.h> declares gettimeofday.  */
+#define $ac_func innocuous_$ac_func
+
+/* System header to define __stub macros and hopefully few prototypes,
+    which can conflict with char $ac_func (); below.
+    Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+    <limits.h> exists even on freestanding compilers.  */
+
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+
+#undef $ac_func
+
+/* Override any gcc2 internal prototype to avoid an error.  */
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+/* 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 ();
+/* 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
+char (*f) () = $ac_func;
+#endif
+#ifdef __cplusplus
+}
+#endif
+
+int
+main ()
+{
+return f != $ac_func;
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+  (eval $ac_link) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag"
+                        || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest$ac_exeext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  eval "$as_ac_var=yes"
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+eval "$as_ac_var=no"
+fi
+rm -f conftest.err conftest.$ac_objext \
+      conftest$ac_exeext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5
+echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6
+if test `eval echo '${'$as_ac_var'}'` = yes; then
+  cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+done
+
+
+
+
+for ac_func in getpwent getpwnam getpwuid
+do
+as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
+echo "$as_me:$LINENO: checking for $ac_func" >&5
+echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6
+if eval "test \"\${$as_ac_var+set}\" = set"; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+/* Define $ac_func to an innocuous variant, in case <limits.h> declares $ac_func.
+   For example, HP-UX 11i <limits.h> declares gettimeofday.  */
+#define $ac_func innocuous_$ac_func
+
+/* System header to define __stub macros and hopefully few prototypes,
+    which can conflict with char $ac_func (); below.
+    Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+    <limits.h> exists even on freestanding compilers.  */
+
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+
+#undef $ac_func
+
+/* Override any gcc2 internal prototype to avoid an error.  */
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+/* 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 ();
+/* 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
+char (*f) () = $ac_func;
+#endif
+#ifdef __cplusplus
+}
+#endif
+
+int
+main ()
+{
+return f != $ac_func;
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+  (eval $ac_link) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag"
+                        || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest$ac_exeext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  eval "$as_ac_var=yes"
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+eval "$as_ac_var=no"
+fi
+rm -f conftest.err conftest.$ac_objext \
+      conftest$ac_exeext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5
+echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6
+if test `eval echo '${'$as_ac_var'}'` = yes; then
+  cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+done
+
+
+echo "$as_me:$LINENO: checking for working strcoll" >&5
+echo $ECHO_N "checking for working strcoll... $ECHO_C" >&6
+if test "${ac_cv_func_strcoll_works+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test "$cross_compiling" = yes; then
+  ac_cv_func_strcoll_works=no
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+int
+main ()
+{
+exit (strcoll ("abc", "def") >= 0 ||
+        strcoll ("ABC", "DEF") >= 0 ||
+        strcoll ("123", "456") >= 0)
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_func_strcoll_works=yes
+else
+  echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+( exit $ac_status )
+ac_cv_func_strcoll_works=no
+fi
+rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+fi
+echo "$as_me:$LINENO: result: $ac_cv_func_strcoll_works" >&5
+echo "${ECHO_T}$ac_cv_func_strcoll_works" >&6
+if test $ac_cv_func_strcoll_works = yes; then
+
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_STRCOLL 1
+_ACEOF
+
+fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+for ac_header in fcntl.h unistd.h stdlib.h varargs.h stdarg.h string.h strings.h \
+               limits.h locale.h pwd.h memory.h termcap.h termios.h termio.h
+do
+as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+  echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+fi
+echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
+echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
+else
+  # Is the header compilable?
+echo "$as_me:$LINENO: checking $ac_header usability" >&5
+echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+#include <$ac_header>
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag"
+                        || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_header_compiler=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_header_compiler=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
+echo "${ECHO_T}$ac_header_compiler" >&6
+
+# Is the header present?
+echo "$as_me:$LINENO: checking $ac_header presence" >&5
+echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <$ac_header>
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+  (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null; then
+  if test -s conftest.err; then
+    ac_cpp_err=$ac_c_preproc_warn_flag
+    ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
+  else
+    ac_cpp_err=
+  fi
+else
+  ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+  ac_header_preproc=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+  ac_header_preproc=no
+fi
+rm -f conftest.err conftest.$ac_ext
+echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
+echo "${ECHO_T}$ac_header_preproc" >&6
+
+# So?  What about this header?
+case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in
+  yes:no: )
+    { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5
+echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;}
+    { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5
+echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;}
+    ac_header_preproc=yes
+    ;;
+  no:yes:* )
+    { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5
+echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;}
+    { echo "$as_me:$LINENO: WARNING: $ac_header:     check for missing prerequisite headers?" >&5
+echo "$as_me: WARNING: $ac_header:     check for missing prerequisite headers?" >&2;}
+    { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5
+echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;}
+    { echo "$as_me:$LINENO: WARNING: $ac_header:     section \"Present But Cannot Be Compiled\"" >&5
+echo "$as_me: WARNING: $ac_header:     section \"Present But Cannot Be Compiled\"" >&2;}
+    { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5
+echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;}
+    { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5
+echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;}
+    (
+      cat <<\_ASBOX
+## ----------------------------------- ##
+## Report this to bug-readline@gnu.org ##
+## ----------------------------------- ##
+_ASBOX
+    ) |
+      sed "s/^/$as_me: WARNING:     /" >&2
+    ;;
+esac
+echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  eval "$as_ac_Header=\$ac_header_preproc"
+fi
+echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
+echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
+
+fi
+if test `eval echo '${'$as_ac_Header'}'` = yes; then
+  cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+
+done
+
+
+
+
+
+for ac_header in sys/pte.h sys/stream.h sys/select.h sys/file.h
+do
+as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+  echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+fi
+echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
+echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
+else
+  # Is the header compilable?
+echo "$as_me:$LINENO: checking $ac_header usability" >&5
+echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+#include <$ac_header>
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag"
+                        || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_header_compiler=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_header_compiler=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
+echo "${ECHO_T}$ac_header_compiler" >&6
+
+# Is the header present?
+echo "$as_me:$LINENO: checking $ac_header presence" >&5
+echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <$ac_header>
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+  (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null; then
+  if test -s conftest.err; then
+    ac_cpp_err=$ac_c_preproc_warn_flag
+    ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
+  else
+    ac_cpp_err=
+  fi
+else
+  ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+  ac_header_preproc=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+  ac_header_preproc=no
+fi
+rm -f conftest.err conftest.$ac_ext
+echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
+echo "${ECHO_T}$ac_header_preproc" >&6
+
+# So?  What about this header?
+case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in
+  yes:no: )
+    { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5
+echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;}
+    { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5
+echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;}
+    ac_header_preproc=yes
+    ;;
+  no:yes:* )
+    { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5
+echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;}
+    { echo "$as_me:$LINENO: WARNING: $ac_header:     check for missing prerequisite headers?" >&5
+echo "$as_me: WARNING: $ac_header:     check for missing prerequisite headers?" >&2;}
+    { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5
+echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;}
+    { echo "$as_me:$LINENO: WARNING: $ac_header:     section \"Present But Cannot Be Compiled\"" >&5
+echo "$as_me: WARNING: $ac_header:     section \"Present But Cannot Be Compiled\"" >&2;}
+    { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5
+echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;}
+    { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5
+echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;}
+    (
+      cat <<\_ASBOX
+## ----------------------------------- ##
+## Report this to bug-readline@gnu.org ##
+## ----------------------------------- ##
+_ASBOX
+    ) |
+      sed "s/^/$as_me: WARNING:     /" >&2
+    ;;
+esac
+echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  eval "$as_ac_Header=\$ac_header_preproc"
+fi
+echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
+echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
+
+fi
+if test `eval echo '${'$as_ac_Header'}'` = yes; then
+  cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+
+done
+
+
+
+for ac_header in sys/ptem.h
+do
+as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
+echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+#if HAVE_SYS_STREAM_H
+#  include <sys/stream.h>
+#endif
+
+
+#include <$ac_header>
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag"
+                        || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  eval "$as_ac_Header=yes"
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+eval "$as_ac_Header=no"
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
+echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
+if test `eval echo '${'$as_ac_Header'}'` = yes; then
+  cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+
+done
+
+
+
+echo "$as_me:$LINENO: checking for type of signal functions" >&5
+echo $ECHO_N "checking for type of signal functions... $ECHO_C" >&6
+if test "${bash_cv_signal_vintage+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <signal.h>
+int
+main ()
+{
+
+    sigset_t ss;
+    struct sigaction sa;
+    sigemptyset(&ss); sigsuspend(&ss);
+    sigaction(SIGINT, &sa, (struct sigaction *) 0);
+    sigprocmask(SIG_BLOCK, &ss, (sigset_t *) 0);
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+  (eval $ac_link) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag"
+                        || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest$ac_exeext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  bash_cv_signal_vintage=posix
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+
+    cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <signal.h>
+int
+main ()
+{
+
+       int mask = sigmask(SIGINT);
+       sigsetmask(mask); sigblock(mask); sigpause(mask);
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+  (eval $ac_link) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag"
+                        || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest$ac_exeext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  bash_cv_signal_vintage=4.2bsd
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+
+      cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+       #include <signal.h>
+       RETSIGTYPE foo() { }
+int
+main ()
+{
+
+               int mask = sigmask(SIGINT);
+               sigset(SIGINT, foo); sigrelse(SIGINT);
+               sighold(SIGINT); sigpause(SIGINT);
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+  (eval $ac_link) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag"
+                        || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest$ac_exeext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  bash_cv_signal_vintage=svr3
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+bash_cv_signal_vintage=v7
+
+fi
+rm -f conftest.err conftest.$ac_objext \
+      conftest$ac_exeext conftest.$ac_ext
+
+fi
+rm -f conftest.err conftest.$ac_objext \
+      conftest$ac_exeext conftest.$ac_ext
+
+fi
+rm -f conftest.err conftest.$ac_objext \
+      conftest$ac_exeext conftest.$ac_ext
+
+fi
+
+echo "$as_me:$LINENO: result: $bash_cv_signal_vintage" >&5
+echo "${ECHO_T}$bash_cv_signal_vintage" >&6
+if test "$bash_cv_signal_vintage" = posix; then
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_POSIX_SIGNALS 1
+_ACEOF
+
+elif test "$bash_cv_signal_vintage" = "4.2bsd"; then
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_BSD_SIGNALS 1
+_ACEOF
+
+elif test "$bash_cv_signal_vintage" = svr3; then
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_USG_SIGHOLD 1
+_ACEOF
+
+fi
+
+
+
+echo "$as_me:$LINENO: checking if signal handlers must be reinstalled when invoked" >&5
+echo $ECHO_N "checking if signal handlers must be reinstalled when invoked... $ECHO_C" >&6
+if test "${bash_cv_must_reinstall_sighandlers+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test "$cross_compiling" = yes; then
+  { echo "$as_me:$LINENO: WARNING: cannot check signal handling if cross compiling -- defaulting to no" >&5
+echo "$as_me: WARNING: cannot check signal handling if cross compiling -- defaulting to no" >&2;}
+    bash_cv_must_reinstall_sighandlers=no
+
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+#include <signal.h>
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+
+typedef RETSIGTYPE sigfunc();
+
+int nsigint;
+
+#ifdef HAVE_POSIX_SIGNALS
+sigfunc *
+set_signal_handler(sig, handler)
+     int sig;
+     sigfunc *handler;
+{
+  struct sigaction act, oact;
+  act.sa_handler = handler;
+  act.sa_flags = 0;
+  sigemptyset (&act.sa_mask);
+  sigemptyset (&oact.sa_mask);
+  sigaction (sig, &act, &oact);
+  return (oact.sa_handler);
+}
+#else
+#define set_signal_handler(s, h) signal(s, h)
+#endif
+
+RETSIGTYPE
+sigint(s)
+int s;
+{
+  nsigint++;
+}
+
+main()
+{
+       nsigint = 0;
+       set_signal_handler(SIGINT, sigint);
+       kill((int)getpid(), SIGINT);
+       kill((int)getpid(), SIGINT);
+       exit(nsigint != 2);
+}
+
+_ACEOF
+rm -f conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  bash_cv_must_reinstall_sighandlers=no
+else
+  echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+( exit $ac_status )
+bash_cv_must_reinstall_sighandlers=yes
+fi
+rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+fi
+
+echo "$as_me:$LINENO: result: $bash_cv_must_reinstall_sighandlers" >&5
+echo "${ECHO_T}$bash_cv_must_reinstall_sighandlers" >&6
+if test $bash_cv_must_reinstall_sighandlers = yes; then
+cat >>confdefs.h <<\_ACEOF
+#define MUST_REINSTALL_SIGHANDLERS 1
+_ACEOF
+
+fi
+
+
+
+echo "$as_me:$LINENO: checking for presence of POSIX-style sigsetjmp/siglongjmp" >&5
+echo $ECHO_N "checking for presence of POSIX-style sigsetjmp/siglongjmp... $ECHO_C" >&6
+if test "${bash_cv_func_sigsetjmp+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test "$cross_compiling" = yes; then
+  { echo "$as_me:$LINENO: WARNING: cannot check for sigsetjmp/siglongjmp if cross-compiling -- defaulting to missing" >&5
+echo "$as_me: WARNING: cannot check for sigsetjmp/siglongjmp if cross-compiling -- defaulting to missing" >&2;}
+     bash_cv_func_sigsetjmp=missing
+
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+#include <sys/types.h>
+#include <signal.h>
+#include <setjmp.h>
+
+main()
+{
+#if !defined (_POSIX_VERSION) || !defined (HAVE_POSIX_SIGNALS)
+exit (1);
+#else
+
+int code;
+sigset_t set, oset;
+sigjmp_buf xx;
+
+/* get the mask */
+sigemptyset(&set);
+sigemptyset(&oset);
+sigprocmask(SIG_BLOCK, (sigset_t *)NULL, &set);
+sigprocmask(SIG_BLOCK, (sigset_t *)NULL, &oset);
+
+/* save it */
+code = sigsetjmp(xx, 1);
+if (code)
+  exit(0);     /* could get sigmask and compare to oset here. */
+
+/* change it */
+sigaddset(&set, SIGINT);
+sigprocmask(SIG_BLOCK, &set, (sigset_t *)NULL);
+
+/* and siglongjmp */
+siglongjmp(xx, 10);
+exit(1);
+#endif
+}
+_ACEOF
+rm -f conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  bash_cv_func_sigsetjmp=present
+else
+  echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+( exit $ac_status )
+bash_cv_func_sigsetjmp=missing
+fi
+rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+fi
+
+echo "$as_me:$LINENO: result: $bash_cv_func_sigsetjmp" >&5
+echo "${ECHO_T}$bash_cv_func_sigsetjmp" >&6
+if test $bash_cv_func_sigsetjmp = present; then
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_POSIX_SIGSETJMP 1
+_ACEOF
+
+fi
+
+echo "$as_me:$LINENO: checking for lstat" >&5
+echo $ECHO_N "checking for lstat... $ECHO_C" >&6
+if test "${bash_cv_func_lstat+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+#include <sys/types.h>
+#include <sys/stat.h>
+
+int
+main ()
+{
+ lstat(".",(struct stat *)0);
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+  (eval $ac_link) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag"
+                        || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest$ac_exeext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  bash_cv_func_lstat=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+bash_cv_func_lstat=no
+fi
+rm -f conftest.err conftest.$ac_objext \
+      conftest$ac_exeext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $bash_cv_func_lstat" >&5
+echo "${ECHO_T}$bash_cv_func_lstat" >&6
+if test $bash_cv_func_lstat = yes; then
+  cat >>confdefs.h <<\_ACEOF
+#define HAVE_LSTAT 1
+_ACEOF
+
+fi
+
+
+echo "$as_me:$LINENO: checking whether or not strcoll and strcmp differ" >&5
+echo $ECHO_N "checking whether or not strcoll and strcmp differ... $ECHO_C" >&6
+if test "${bash_cv_func_strcoll_broken+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test "$cross_compiling" = yes; then
+  { echo "$as_me:$LINENO: WARNING: cannot check strcoll if cross compiling -- defaulting to no" >&5
+echo "$as_me: WARNING: cannot check strcoll if cross compiling -- defaulting to no" >&2;}
+    bash_cv_func_strcoll_broken=no
+
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+#include <stdio.h>
+#if defined (HAVE_LOCALE_H)
+#include <locale.h>
+#endif
+
+main(c, v)
+int     c;
+char    *v[];
+{
+        int     r1, r2;
+        char    *deflocale, *defcoll;
+
+#ifdef HAVE_SETLOCALE
+        deflocale = setlocale(LC_ALL, "");
+       defcoll = setlocale(LC_COLLATE, "");
+#endif
+
+#ifdef HAVE_STRCOLL
+       /* These two values are taken from tests/glob-test. */
+        r1 = strcoll("abd", "aXd");
+#else
+       r1 = 0;
+#endif
+        r2 = strcmp("abd", "aXd");
+
+       /* These two should both be greater than 0.  It is permissible for
+          a system to return different values, as long as the sign is the
+          same. */
+
+        /* Exit with 1 (failure) if these two values are both > 0, since
+          this tests whether strcoll(3) is broken with respect to strcmp(3)
+          in the default locale. */
+       exit (r1 > 0 && r2 > 0);
+}
+
+_ACEOF
+rm -f conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  bash_cv_func_strcoll_broken=yes
+else
+  echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+( exit $ac_status )
+bash_cv_func_strcoll_broken=no
+fi
+rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+fi
+
+echo "$as_me:$LINENO: result: $bash_cv_func_strcoll_broken" >&5
+echo "${ECHO_T}$bash_cv_func_strcoll_broken" >&6
+if test $bash_cv_func_strcoll_broken = yes; then
+cat >>confdefs.h <<\_ACEOF
+#define STRCOLL_BROKEN 1
+_ACEOF
+
+fi
+
+
+echo "$as_me:$LINENO: checking whether the ctype macros accept non-ascii characters" >&5
+echo $ECHO_N "checking whether the ctype macros accept non-ascii characters... $ECHO_C" >&6
+if test "${bash_cv_func_ctype_nonascii+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test "$cross_compiling" = yes; then
+  { echo "$as_me:$LINENO: WARNING: cannot check ctype macros if cross compiling -- defaulting to no" >&5
+echo "$as_me: WARNING: cannot check ctype macros if cross compiling -- defaulting to no" >&2;}
+    bash_cv_func_ctype_nonascii=no
+
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+#ifdef HAVE_LOCALE_H
+#include <locale.h>
+#endif
+#include <stdio.h>
+#include <ctype.h>
+
+main(c, v)
+int    c;
+char   *v[];
+{
+       char    *deflocale;
+       unsigned char x;
+       int     r1, r2;
+
+#ifdef HAVE_SETLOCALE
+       /* We take a shot here.  If that locale is not known, try the
+          system default.  We try this one because '\342' (226) is
+          known to be a printable character in that locale. */
+       deflocale = setlocale(LC_ALL, "en_US.ISO8859-1");
+       if (deflocale == 0)
+               deflocale = setlocale(LC_ALL, "");
+#endif
+
+       x = '\342';
+       r1 = isprint(x);
+       x -= 128;
+       r2 = isprint(x);
+       exit (r1 == 0 || r2 == 0);
+}
+
+_ACEOF
+rm -f conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  bash_cv_func_ctype_nonascii=yes
+else
+  echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+( exit $ac_status )
+bash_cv_func_ctype_nonascii=no
+fi
+rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+fi
+
+echo "$as_me:$LINENO: result: $bash_cv_func_ctype_nonascii" >&5
+echo "${ECHO_T}$bash_cv_func_ctype_nonascii" >&6
+if test $bash_cv_func_ctype_nonascii = yes; then
+cat >>confdefs.h <<\_ACEOF
+#define CTYPE_NON_ASCII 1
+_ACEOF
+
+fi
+
+
+echo "$as_me:$LINENO: checking whether getpw functions are declared in pwd.h" >&5
+echo $ECHO_N "checking whether getpw functions are declared in pwd.h... $ECHO_C" >&6
+if test "${bash_cv_getpw_declared+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+#include <sys/types.h>
+#ifdef HAVE_UNISTD_H
+#  include <unistd.h>
+#endif
+#include <pwd.h>
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "getpwuid" >/dev/null 2>&1; then
+  bash_cv_getpw_declared=yes
+else
+  bash_cv_getpw_declared=no
+fi
+rm -f conftest*
+
+fi
+
+echo "$as_me:$LINENO: result: $bash_cv_getpw_declared" >&5
+echo "${ECHO_T}$bash_cv_getpw_declared" >&6
+if test $bash_cv_getpw_declared = yes; then
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_GETPW_DECLS 1
+_ACEOF
+
+fi
+
+
+echo "$as_me:$LINENO: checking whether termios.h defines TIOCGWINSZ" >&5
+echo $ECHO_N "checking whether termios.h defines TIOCGWINSZ... $ECHO_C" >&6
+if test "${ac_cv_sys_tiocgwinsz_in_termios_h+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <sys/types.h>
+#include <termios.h>
+#ifdef TIOCGWINSZ
+  yes
+#endif
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "yes" >/dev/null 2>&1; then
+  ac_cv_sys_tiocgwinsz_in_termios_h=yes
+else
+  ac_cv_sys_tiocgwinsz_in_termios_h=no
+fi
+rm -f conftest*
+
+fi
+echo "$as_me:$LINENO: result: $ac_cv_sys_tiocgwinsz_in_termios_h" >&5
+echo "${ECHO_T}$ac_cv_sys_tiocgwinsz_in_termios_h" >&6
+
+if test $ac_cv_sys_tiocgwinsz_in_termios_h != yes; then
+  echo "$as_me:$LINENO: checking whether sys/ioctl.h defines TIOCGWINSZ" >&5
+echo $ECHO_N "checking whether sys/ioctl.h defines TIOCGWINSZ... $ECHO_C" >&6
+if test "${ac_cv_sys_tiocgwinsz_in_sys_ioctl_h+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <sys/types.h>
+#include <sys/ioctl.h>
+#ifdef TIOCGWINSZ
+  yes
+#endif
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "yes" >/dev/null 2>&1; then
+  ac_cv_sys_tiocgwinsz_in_sys_ioctl_h=yes
+else
+  ac_cv_sys_tiocgwinsz_in_sys_ioctl_h=no
+fi
+rm -f conftest*
+
+fi
+echo "$as_me:$LINENO: result: $ac_cv_sys_tiocgwinsz_in_sys_ioctl_h" >&5
+echo "${ECHO_T}$ac_cv_sys_tiocgwinsz_in_sys_ioctl_h" >&6
+
+  if test $ac_cv_sys_tiocgwinsz_in_sys_ioctl_h = yes; then
+
+cat >>confdefs.h <<\_ACEOF
+#define GWINSZ_IN_SYS_IOCTL 1
+_ACEOF
+
+  fi
+fi
+
+
+echo "$as_me:$LINENO: checking whether signal handlers are of type void" >&5
+echo $ECHO_N "checking whether signal handlers are of type void... $ECHO_C" >&6
+if test "${bash_cv_void_sighandler+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <sys/types.h>
+#include <signal.h>
+#ifdef signal
+#undef signal
+#endif
+#ifdef __cplusplus
+extern "C"
+#endif
+void (*signal ()) ();
+int
+main ()
+{
+int i;
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag"
+                        || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  bash_cv_void_sighandler=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+bash_cv_void_sighandler=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $bash_cv_void_sighandler" >&5
+echo "${ECHO_T}$bash_cv_void_sighandler" >&6
+if test $bash_cv_void_sighandler = yes; then
+cat >>confdefs.h <<\_ACEOF
+#define VOID_SIGHANDLER 1
+_ACEOF
+
+fi
+
+echo "$as_me:$LINENO: checking for TIOCSTAT in sys/ioctl.h" >&5
+echo $ECHO_N "checking for TIOCSTAT in sys/ioctl.h... $ECHO_C" >&6
+if test "${bash_cv_tiocstat_in_ioctl+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <sys/types.h>
+#include <sys/ioctl.h>
+int
+main ()
+{
+int x = TIOCSTAT;
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag"
+                        || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  bash_cv_tiocstat_in_ioctl=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+bash_cv_tiocstat_in_ioctl=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+
+echo "$as_me:$LINENO: result: $bash_cv_tiocstat_in_ioctl" >&5
+echo "${ECHO_T}$bash_cv_tiocstat_in_ioctl" >&6
+if test $bash_cv_tiocstat_in_ioctl = yes; then
+cat >>confdefs.h <<\_ACEOF
+#define TIOCSTAT_IN_SYS_IOCTL 1
+_ACEOF
+
+fi
+
+echo "$as_me:$LINENO: checking for FIONREAD in sys/ioctl.h" >&5
+echo $ECHO_N "checking for FIONREAD in sys/ioctl.h... $ECHO_C" >&6
+if test "${bash_cv_fionread_in_ioctl+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <sys/types.h>
+#include <sys/ioctl.h>
+int
+main ()
+{
+int x = FIONREAD;
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag"
+                        || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  bash_cv_fionread_in_ioctl=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+bash_cv_fionread_in_ioctl=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+
+echo "$as_me:$LINENO: result: $bash_cv_fionread_in_ioctl" >&5
+echo "${ECHO_T}$bash_cv_fionread_in_ioctl" >&6
+if test $bash_cv_fionread_in_ioctl = yes; then
+cat >>confdefs.h <<\_ACEOF
+#define FIONREAD_IN_SYS_IOCTL 1
+_ACEOF
+
+fi
+
+echo "$as_me:$LINENO: checking for speed_t in sys/types.h" >&5
+echo $ECHO_N "checking for speed_t in sys/types.h... $ECHO_C" >&6
+if test "${bash_cv_speed_t_in_sys_types+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <sys/types.h>
+int
+main ()
+{
+speed_t x;
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag"
+                        || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  bash_cv_speed_t_in_sys_types=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+bash_cv_speed_t_in_sys_types=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+
+echo "$as_me:$LINENO: result: $bash_cv_speed_t_in_sys_types" >&5
+echo "${ECHO_T}$bash_cv_speed_t_in_sys_types" >&6
+if test $bash_cv_speed_t_in_sys_types = yes; then
+cat >>confdefs.h <<\_ACEOF
+#define SPEED_T_IN_SYS_TYPES 1
+_ACEOF
+
+fi
+
+echo "$as_me:$LINENO: checking for struct winsize in sys/ioctl.h and termios.h" >&5
+echo $ECHO_N "checking for struct winsize in sys/ioctl.h and termios.h... $ECHO_C" >&6
+if test "${bash_cv_struct_winsize_header+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <sys/types.h>
+#include <sys/ioctl.h>
+int
+main ()
+{
+struct winsize x;
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag"
+                        || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  bash_cv_struct_winsize_header=ioctl_h
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <sys/types.h>
+#include <termios.h>
+int
+main ()
+{
+struct winsize x;
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag"
+                        || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  bash_cv_struct_winsize_header=termios_h
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+bash_cv_struct_winsize_header=other
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+
+if test $bash_cv_struct_winsize_header = ioctl_h; then
+  echo "$as_me:$LINENO: result: sys/ioctl.h" >&5
+echo "${ECHO_T}sys/ioctl.h" >&6
+  cat >>confdefs.h <<\_ACEOF
+#define STRUCT_WINSIZE_IN_SYS_IOCTL 1
+_ACEOF
+
+elif test $bash_cv_struct_winsize_header = termios_h; then
+  echo "$as_me:$LINENO: result: termios.h" >&5
+echo "${ECHO_T}termios.h" >&6
+  cat >>confdefs.h <<\_ACEOF
+#define STRUCT_WINSIZE_IN_TERMIOS 1
+_ACEOF
+
+else
+  echo "$as_me:$LINENO: result: not found" >&5
+echo "${ECHO_T}not found" >&6
+fi
+
+
+echo "$as_me:$LINENO: checking for struct dirent.d_ino" >&5
+echo $ECHO_N "checking for struct dirent.d_ino... $ECHO_C" >&6
+if test "${bash_cv_dirent_has_dino+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+#include <stdio.h>
+#include <sys/types.h>
+#ifdef HAVE_UNISTD_H
+# include <unistd.h>
+#endif /* HAVE_UNISTD_H */
+#if defined(HAVE_DIRENT_H)
+# include <dirent.h>
+#else
+# define dirent direct
+# ifdef HAVE_SYS_NDIR_H
+#  include <sys/ndir.h>
+# endif /* SYSNDIR */
+# ifdef HAVE_SYS_DIR_H
+#  include <sys/dir.h>
+# endif /* SYSDIR */
+# ifdef HAVE_NDIR_H
+#  include <ndir.h>
+# endif
+#endif /* HAVE_DIRENT_H */
+
+int
+main ()
+{
+
+struct dirent d; int z; z = d.d_ino;
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag"
+                        || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  bash_cv_dirent_has_dino=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+bash_cv_dirent_has_dino=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+
+echo "$as_me:$LINENO: result: $bash_cv_dirent_has_dino" >&5
+echo "${ECHO_T}$bash_cv_dirent_has_dino" >&6
+if test $bash_cv_dirent_has_dino = yes; then
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_STRUCT_DIRENT_D_INO 1
+_ACEOF
+
+fi
+
+
+echo "$as_me:$LINENO: checking for struct dirent.d_fileno" >&5
+echo $ECHO_N "checking for struct dirent.d_fileno... $ECHO_C" >&6
+if test "${bash_cv_dirent_has_d_fileno+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+#include <stdio.h>
+#include <sys/types.h>
+#ifdef HAVE_UNISTD_H
+# include <unistd.h>
+#endif /* HAVE_UNISTD_H */
+#if defined(HAVE_DIRENT_H)
+# include <dirent.h>
+#else
+# define dirent direct
+# ifdef HAVE_SYS_NDIR_H
+#  include <sys/ndir.h>
+# endif /* SYSNDIR */
+# ifdef HAVE_SYS_DIR_H
+#  include <sys/dir.h>
+# endif /* SYSDIR */
+# ifdef HAVE_NDIR_H
+#  include <ndir.h>
+# endif
+#endif /* HAVE_DIRENT_H */
+
+int
+main ()
+{
+
+struct dirent d; int z; z = d.d_fileno;
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag"
+                        || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  bash_cv_dirent_has_d_fileno=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+bash_cv_dirent_has_d_fileno=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+
+echo "$as_me:$LINENO: result: $bash_cv_dirent_has_d_fileno" >&5
+echo "${ECHO_T}$bash_cv_dirent_has_d_fileno" >&6
+if test $bash_cv_dirent_has_d_fileno = yes; then
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_STRUCT_DIRENT_D_FILENO 1
+_ACEOF
+
+fi
+
+
+case "$host_os" in
+aix*)   prefer_curses=yes ;;
+esac
+
+if test "X$bash_cv_termcap_lib" = "X"; then
+_bash_needmsg=yes
+else
+echo "$as_me:$LINENO: checking which library has the termcap functions" >&5
+echo $ECHO_N "checking which library has the termcap functions... $ECHO_C" >&6
+_bash_needmsg=
+fi
+if test "${bash_cv_termcap_lib+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  echo "$as_me:$LINENO: checking for tgetent" >&5
+echo $ECHO_N "checking for tgetent... $ECHO_C" >&6
+if test "${ac_cv_func_tgetent+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+/* Define tgetent to an innocuous variant, in case <limits.h> declares tgetent.
+   For example, HP-UX 11i <limits.h> declares gettimeofday.  */
+#define tgetent innocuous_tgetent
+
+/* System header to define __stub macros and hopefully few prototypes,
+    which can conflict with char tgetent (); below.
+    Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+    <limits.h> exists even on freestanding compilers.  */
+
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+
+#undef tgetent
+
+/* Override any gcc2 internal prototype to avoid an error.  */
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+/* We use char because int might match the return type of a gcc2
+   builtin and then its argument prototype would still apply.  */
+char tgetent ();
+/* 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_tgetent) || defined (__stub___tgetent)
+choke me
+#else
+char (*f) () = tgetent;
+#endif
+#ifdef __cplusplus
+}
+#endif
+
+int
+main ()
+{
+return f != tgetent;
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+  (eval $ac_link) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag"
+                        || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest$ac_exeext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_func_tgetent=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_func_tgetent=no
+fi
+rm -f conftest.err conftest.$ac_objext \
+      conftest$ac_exeext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_func_tgetent" >&5
+echo "${ECHO_T}$ac_cv_func_tgetent" >&6
+if test $ac_cv_func_tgetent = yes; then
+  bash_cv_termcap_lib=libc
+else
+  echo "$as_me:$LINENO: checking for tgetent in -ltermcap" >&5
+echo $ECHO_N "checking for tgetent in -ltermcap... $ECHO_C" >&6
+if test "${ac_cv_lib_termcap_tgetent+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-ltermcap  $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+/* Override any gcc2 internal prototype to avoid an error.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+   builtin and then its argument prototype would still apply.  */
+char tgetent ();
+int
+main ()
+{
+tgetent ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+  (eval $ac_link) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag"
+                        || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest$ac_exeext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_lib_termcap_tgetent=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_lib_termcap_tgetent=no
+fi
+rm -f conftest.err conftest.$ac_objext \
+      conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:$LINENO: result: $ac_cv_lib_termcap_tgetent" >&5
+echo "${ECHO_T}$ac_cv_lib_termcap_tgetent" >&6
+if test $ac_cv_lib_termcap_tgetent = yes; then
+  bash_cv_termcap_lib=libtermcap
+else
+  echo "$as_me:$LINENO: checking for tgetent in -ltinfo" >&5
+echo $ECHO_N "checking for tgetent in -ltinfo... $ECHO_C" >&6
+if test "${ac_cv_lib_tinfo_tgetent+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-ltinfo  $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+/* Override any gcc2 internal prototype to avoid an error.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+   builtin and then its argument prototype would still apply.  */
+char tgetent ();
+int
+main ()
+{
+tgetent ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+  (eval $ac_link) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag"
+                        || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest$ac_exeext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_lib_tinfo_tgetent=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_lib_tinfo_tgetent=no
+fi
+rm -f conftest.err conftest.$ac_objext \
+      conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:$LINENO: result: $ac_cv_lib_tinfo_tgetent" >&5
+echo "${ECHO_T}$ac_cv_lib_tinfo_tgetent" >&6
+if test $ac_cv_lib_tinfo_tgetent = yes; then
+  bash_cv_termcap_lib=libtinfo
+else
+  echo "$as_me:$LINENO: checking for tgetent in -lcurses" >&5
+echo $ECHO_N "checking for tgetent in -lcurses... $ECHO_C" >&6
+if test "${ac_cv_lib_curses_tgetent+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lcurses  $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+/* Override any gcc2 internal prototype to avoid an error.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+   builtin and then its argument prototype would still apply.  */
+char tgetent ();
+int
+main ()
+{
+tgetent ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+  (eval $ac_link) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag"
+                        || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest$ac_exeext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_lib_curses_tgetent=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_lib_curses_tgetent=no
+fi
+rm -f conftest.err conftest.$ac_objext \
+      conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:$LINENO: result: $ac_cv_lib_curses_tgetent" >&5
+echo "${ECHO_T}$ac_cv_lib_curses_tgetent" >&6
+if test $ac_cv_lib_curses_tgetent = yes; then
+  bash_cv_termcap_lib=libcurses
+else
+  echo "$as_me:$LINENO: checking for tgetent in -lncurses" >&5
+echo $ECHO_N "checking for tgetent in -lncurses... $ECHO_C" >&6
+if test "${ac_cv_lib_ncurses_tgetent+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lncurses  $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+/* Override any gcc2 internal prototype to avoid an error.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+   builtin and then its argument prototype would still apply.  */
+char tgetent ();
+int
+main ()
+{
+tgetent ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+  (eval $ac_link) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag"
+                        || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest$ac_exeext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_lib_ncurses_tgetent=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_lib_ncurses_tgetent=no
+fi
+rm -f conftest.err conftest.$ac_objext \
+      conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:$LINENO: result: $ac_cv_lib_ncurses_tgetent" >&5
+echo "${ECHO_T}$ac_cv_lib_ncurses_tgetent" >&6
+if test $ac_cv_lib_ncurses_tgetent = yes; then
+  bash_cv_termcap_lib=libncurses
+else
+  bash_cv_termcap_lib=gnutermcap
+fi
+
+fi
+
+fi
+
+fi
+
+fi
+
+fi
+
+if test "X$_bash_needmsg" = "Xyes"; then
+echo "$as_me:$LINENO: checking which library has the termcap functions" >&5
+echo $ECHO_N "checking which library has the termcap functions... $ECHO_C" >&6
+fi
+echo "$as_me:$LINENO: result: using $bash_cv_termcap_lib" >&5
+echo "${ECHO_T}using $bash_cv_termcap_lib" >&6
+if test $bash_cv_termcap_lib = gnutermcap && test -z "$prefer_curses"; then
+LDFLAGS="$LDFLAGS -L./lib/termcap"
+TERMCAP_LIB="./lib/termcap/libtermcap.a"
+TERMCAP_DEP="./lib/termcap/libtermcap.a"
+elif test $bash_cv_termcap_lib = libtermcap && test -z "$prefer_curses"; then
+TERMCAP_LIB=-ltermcap
+TERMCAP_DEP=
+elif test $bash_cv_termcap_lib = libtinfo; then
+TERMCAP_LIB=-ltinfo
+TERMCAP_DEP=
+elif test $bash_cv_termcap_lib = libncurses; then
+TERMCAP_LIB=-lncurses
+TERMCAP_DEP=
+elif test $bash_cv_termcap_lib = libc; then
+TERMCAP_LIB=
+TERMCAP_DEP=
+else
+TERMCAP_LIB=-lcurses
+TERMCAP_DEP=
+fi
+
+if test "$TERMCAP_LIB" = "./lib/termcap/libtermcap.a"; then
+       if test "$prefer_curses" = yes; then
+               TERMCAP_LIB=-lcurses
+       else
+               TERMCAP_LIB=-ltermcap   #default
+       fi
+fi
+
+
+
+for ac_header in wctype.h
+do
+as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+  echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+fi
+echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
+echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
+else
+  # Is the header compilable?
+echo "$as_me:$LINENO: checking $ac_header usability" >&5
+echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+#include <$ac_header>
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag"
+                        || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_header_compiler=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_header_compiler=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
+echo "${ECHO_T}$ac_header_compiler" >&6
+
+# Is the header present?
+echo "$as_me:$LINENO: checking $ac_header presence" >&5
+echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <$ac_header>
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+  (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null; then
+  if test -s conftest.err; then
+    ac_cpp_err=$ac_c_preproc_warn_flag
+    ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
+  else
+    ac_cpp_err=
+  fi
+else
+  ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+  ac_header_preproc=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+  ac_header_preproc=no
+fi
+rm -f conftest.err conftest.$ac_ext
+echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
+echo "${ECHO_T}$ac_header_preproc" >&6
+
+# So?  What about this header?
+case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in
+  yes:no: )
+    { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5
+echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;}
+    { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5
+echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;}
+    ac_header_preproc=yes
+    ;;
+  no:yes:* )
+    { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5
+echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;}
+    { echo "$as_me:$LINENO: WARNING: $ac_header:     check for missing prerequisite headers?" >&5
+echo "$as_me: WARNING: $ac_header:     check for missing prerequisite headers?" >&2;}
+    { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5
+echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;}
+    { echo "$as_me:$LINENO: WARNING: $ac_header:     section \"Present But Cannot Be Compiled\"" >&5
+echo "$as_me: WARNING: $ac_header:     section \"Present But Cannot Be Compiled\"" >&2;}
+    { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5
+echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;}
+    { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5
+echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;}
+    (
+      cat <<\_ASBOX
+## ----------------------------------- ##
+## Report this to bug-readline@gnu.org ##
+## ----------------------------------- ##
+_ASBOX
+    ) |
+      sed "s/^/$as_me: WARNING:     /" >&2
+    ;;
+esac
+echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  eval "$as_ac_Header=\$ac_header_preproc"
+fi
+echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
+echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
+
+fi
+if test `eval echo '${'$as_ac_Header'}'` = yes; then
+  cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+
+done
+
+
+for ac_header in wchar.h
+do
+as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+  echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+fi
+echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
+echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
+else
+  # Is the header compilable?
+echo "$as_me:$LINENO: checking $ac_header usability" >&5
+echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+#include <$ac_header>
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag"
+                        || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_header_compiler=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_header_compiler=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
+echo "${ECHO_T}$ac_header_compiler" >&6
+
+# Is the header present?
+echo "$as_me:$LINENO: checking $ac_header presence" >&5
+echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <$ac_header>
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+  (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null; then
+  if test -s conftest.err; then
+    ac_cpp_err=$ac_c_preproc_warn_flag
+    ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
+  else
+    ac_cpp_err=
+  fi
+else
+  ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+  ac_header_preproc=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+  ac_header_preproc=no
+fi
+rm -f conftest.err conftest.$ac_ext
+echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
+echo "${ECHO_T}$ac_header_preproc" >&6
+
+# So?  What about this header?
+case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in
+  yes:no: )
+    { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5
+echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;}
+    { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5
+echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;}
+    ac_header_preproc=yes
+    ;;
+  no:yes:* )
+    { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5
+echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;}
+    { echo "$as_me:$LINENO: WARNING: $ac_header:     check for missing prerequisite headers?" >&5
+echo "$as_me: WARNING: $ac_header:     check for missing prerequisite headers?" >&2;}
+    { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5
+echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;}
+    { echo "$as_me:$LINENO: WARNING: $ac_header:     section \"Present But Cannot Be Compiled\"" >&5
+echo "$as_me: WARNING: $ac_header:     section \"Present But Cannot Be Compiled\"" >&2;}
+    { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5
+echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;}
+    { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5
+echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;}
+    (
+      cat <<\_ASBOX
+## ----------------------------------- ##
+## Report this to bug-readline@gnu.org ##
+## ----------------------------------- ##
+_ASBOX
+    ) |
+      sed "s/^/$as_me: WARNING:     /" >&2
+    ;;
+esac
+echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  eval "$as_ac_Header=\$ac_header_preproc"
+fi
+echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
+echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
+
+fi
+if test `eval echo '${'$as_ac_Header'}'` = yes; then
+  cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+
+done
+
+
+for ac_header in langinfo.h
+do
+as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+  echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+fi
+echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
+echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
+else
+  # Is the header compilable?
+echo "$as_me:$LINENO: checking $ac_header usability" >&5
+echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+#include <$ac_header>
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag"
+                        || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_header_compiler=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_header_compiler=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
+echo "${ECHO_T}$ac_header_compiler" >&6
+
+# Is the header present?
+echo "$as_me:$LINENO: checking $ac_header presence" >&5
+echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <$ac_header>
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+  (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null; then
+  if test -s conftest.err; then
+    ac_cpp_err=$ac_c_preproc_warn_flag
+    ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
+  else
+    ac_cpp_err=
+  fi
+else
+  ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+  ac_header_preproc=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+  ac_header_preproc=no
+fi
+rm -f conftest.err conftest.$ac_ext
+echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
+echo "${ECHO_T}$ac_header_preproc" >&6
+
+# So?  What about this header?
+case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in
+  yes:no: )
+    { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5
+echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;}
+    { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5
+echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;}
+    ac_header_preproc=yes
+    ;;
+  no:yes:* )
+    { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5
+echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;}
+    { echo "$as_me:$LINENO: WARNING: $ac_header:     check for missing prerequisite headers?" >&5
+echo "$as_me: WARNING: $ac_header:     check for missing prerequisite headers?" >&2;}
+    { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5
+echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;}
+    { echo "$as_me:$LINENO: WARNING: $ac_header:     section \"Present But Cannot Be Compiled\"" >&5
+echo "$as_me: WARNING: $ac_header:     section \"Present But Cannot Be Compiled\"" >&2;}
+    { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5
+echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;}
+    { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5
+echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;}
+    (
+      cat <<\_ASBOX
+## ----------------------------------- ##
+## Report this to bug-readline@gnu.org ##
+## ----------------------------------- ##
+_ASBOX
+    ) |
+      sed "s/^/$as_me: WARNING:     /" >&2
+    ;;
+esac
+echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  eval "$as_ac_Header=\$ac_header_preproc"
+fi
+echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
+echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
+
+fi
+if test `eval echo '${'$as_ac_Header'}'` = yes; then
+  cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+
+done
+
+
+echo "$as_me:$LINENO: checking for mbsrtowcs" >&5
+echo $ECHO_N "checking for mbsrtowcs... $ECHO_C" >&6
+if test "${ac_cv_func_mbsrtowcs+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+/* Define mbsrtowcs to an innocuous variant, in case <limits.h> declares mbsrtowcs.
+   For example, HP-UX 11i <limits.h> declares gettimeofday.  */
+#define mbsrtowcs innocuous_mbsrtowcs
+
+/* System header to define __stub macros and hopefully few prototypes,
+    which can conflict with char mbsrtowcs (); below.
+    Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+    <limits.h> exists even on freestanding compilers.  */
+
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+
+#undef mbsrtowcs
+
+/* Override any gcc2 internal prototype to avoid an error.  */
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+/* We use char because int might match the return type of a gcc2
+   builtin and then its argument prototype would still apply.  */
+char mbsrtowcs ();
+/* 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_mbsrtowcs) || defined (__stub___mbsrtowcs)
+choke me
+#else
+char (*f) () = mbsrtowcs;
+#endif
+#ifdef __cplusplus
+}
+#endif
+
+int
+main ()
+{
+return f != mbsrtowcs;
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+  (eval $ac_link) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag"
+                        || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest$ac_exeext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_func_mbsrtowcs=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_func_mbsrtowcs=no
+fi
+rm -f conftest.err conftest.$ac_objext \
+      conftest$ac_exeext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_func_mbsrtowcs" >&5
+echo "${ECHO_T}$ac_cv_func_mbsrtowcs" >&6
+if test $ac_cv_func_mbsrtowcs = yes; then
+  cat >>confdefs.h <<\_ACEOF
+#define HAVE_MBSRTOWCS 1
+_ACEOF
+
+fi
+
+echo "$as_me:$LINENO: checking for mbrlen" >&5
+echo $ECHO_N "checking for mbrlen... $ECHO_C" >&6
+if test "${ac_cv_func_mbrlen+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+/* Define mbrlen to an innocuous variant, in case <limits.h> declares mbrlen.
+   For example, HP-UX 11i <limits.h> declares gettimeofday.  */
+#define mbrlen innocuous_mbrlen
+
+/* System header to define __stub macros and hopefully few prototypes,
+    which can conflict with char mbrlen (); below.
+    Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+    <limits.h> exists even on freestanding compilers.  */
+
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+
+#undef mbrlen
+
+/* Override any gcc2 internal prototype to avoid an error.  */
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+/* We use char because int might match the return type of a gcc2
+   builtin and then its argument prototype would still apply.  */
+char mbrlen ();
+/* 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_mbrlen) || defined (__stub___mbrlen)
+choke me
+#else
+char (*f) () = mbrlen;
+#endif
+#ifdef __cplusplus
+}
+#endif
+
+int
+main ()
+{
+return f != mbrlen;
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+  (eval $ac_link) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag"
+                        || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest$ac_exeext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_func_mbrlen=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_func_mbrlen=no
+fi
+rm -f conftest.err conftest.$ac_objext \
+      conftest$ac_exeext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_func_mbrlen" >&5
+echo "${ECHO_T}$ac_cv_func_mbrlen" >&6
+if test $ac_cv_func_mbrlen = yes; then
+  cat >>confdefs.h <<\_ACEOF
+#define HAVE_MBRLEN 1
+_ACEOF
+
+fi
+
+
+echo "$as_me:$LINENO: checking for wcrtomb" >&5
+echo $ECHO_N "checking for wcrtomb... $ECHO_C" >&6
+if test "${ac_cv_func_wcrtomb+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+/* Define wcrtomb to an innocuous variant, in case <limits.h> declares wcrtomb.
+   For example, HP-UX 11i <limits.h> declares gettimeofday.  */
+#define wcrtomb innocuous_wcrtomb
+
+/* System header to define __stub macros and hopefully few prototypes,
+    which can conflict with char wcrtomb (); below.
+    Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+    <limits.h> exists even on freestanding compilers.  */
+
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+
+#undef wcrtomb
+
+/* Override any gcc2 internal prototype to avoid an error.  */
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+/* We use char because int might match the return type of a gcc2
+   builtin and then its argument prototype would still apply.  */
+char wcrtomb ();
+/* 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_wcrtomb) || defined (__stub___wcrtomb)
+choke me
+#else
+char (*f) () = wcrtomb;
+#endif
+#ifdef __cplusplus
+}
+#endif
+
+int
+main ()
+{
+return f != wcrtomb;
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+  (eval $ac_link) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag"
+                        || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest$ac_exeext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_func_wcrtomb=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_func_wcrtomb=no
+fi
+rm -f conftest.err conftest.$ac_objext \
+      conftest$ac_exeext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_func_wcrtomb" >&5
+echo "${ECHO_T}$ac_cv_func_wcrtomb" >&6
+if test $ac_cv_func_wcrtomb = yes; then
+  cat >>confdefs.h <<\_ACEOF
+#define HAVE_WCRTOMB 1
+_ACEOF
+
+fi
+
+echo "$as_me:$LINENO: checking for wcscoll" >&5
+echo $ECHO_N "checking for wcscoll... $ECHO_C" >&6
+if test "${ac_cv_func_wcscoll+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+/* Define wcscoll to an innocuous variant, in case <limits.h> declares wcscoll.
+   For example, HP-UX 11i <limits.h> declares gettimeofday.  */
+#define wcscoll innocuous_wcscoll
+
+/* System header to define __stub macros and hopefully few prototypes,
+    which can conflict with char wcscoll (); below.
+    Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+    <limits.h> exists even on freestanding compilers.  */
+
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+
+#undef wcscoll
+
+/* Override any gcc2 internal prototype to avoid an error.  */
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+/* We use char because int might match the return type of a gcc2
+   builtin and then its argument prototype would still apply.  */
+char wcscoll ();
+/* 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_wcscoll) || defined (__stub___wcscoll)
+choke me
+#else
+char (*f) () = wcscoll;
+#endif
+#ifdef __cplusplus
+}
+#endif
+
+int
+main ()
+{
+return f != wcscoll;
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+  (eval $ac_link) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag"
+                        || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest$ac_exeext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_func_wcscoll=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_func_wcscoll=no
+fi
+rm -f conftest.err conftest.$ac_objext \
+      conftest$ac_exeext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_func_wcscoll" >&5
+echo "${ECHO_T}$ac_cv_func_wcscoll" >&6
+if test $ac_cv_func_wcscoll = yes; then
+  cat >>confdefs.h <<\_ACEOF
+#define HAVE_WCSCOLL 1
+_ACEOF
+
+fi
+
+echo "$as_me:$LINENO: checking for wcsdup" >&5
+echo $ECHO_N "checking for wcsdup... $ECHO_C" >&6
+if test "${ac_cv_func_wcsdup+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+/* Define wcsdup to an innocuous variant, in case <limits.h> declares wcsdup.
+   For example, HP-UX 11i <limits.h> declares gettimeofday.  */
+#define wcsdup innocuous_wcsdup
+
+/* System header to define __stub macros and hopefully few prototypes,
+    which can conflict with char wcsdup (); below.
+    Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+    <limits.h> exists even on freestanding compilers.  */
+
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+
+#undef wcsdup
+
+/* Override any gcc2 internal prototype to avoid an error.  */
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+/* We use char because int might match the return type of a gcc2
+   builtin and then its argument prototype would still apply.  */
+char wcsdup ();
+/* 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_wcsdup) || defined (__stub___wcsdup)
+choke me
+#else
+char (*f) () = wcsdup;
+#endif
+#ifdef __cplusplus
+}
+#endif
+
+int
+main ()
+{
+return f != wcsdup;
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+  (eval $ac_link) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag"
+                        || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest$ac_exeext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_func_wcsdup=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_func_wcsdup=no
+fi
+rm -f conftest.err conftest.$ac_objext \
+      conftest$ac_exeext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_func_wcsdup" >&5
+echo "${ECHO_T}$ac_cv_func_wcsdup" >&6
+if test $ac_cv_func_wcsdup = yes; then
+  cat >>confdefs.h <<\_ACEOF
+#define HAVE_WCSDUP 1
+_ACEOF
+
+fi
+
+echo "$as_me:$LINENO: checking for wcwidth" >&5
+echo $ECHO_N "checking for wcwidth... $ECHO_C" >&6
+if test "${ac_cv_func_wcwidth+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+/* Define wcwidth to an innocuous variant, in case <limits.h> declares wcwidth.
+   For example, HP-UX 11i <limits.h> declares gettimeofday.  */
+#define wcwidth innocuous_wcwidth
+
+/* System header to define __stub macros and hopefully few prototypes,
+    which can conflict with char wcwidth (); below.
+    Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+    <limits.h> exists even on freestanding compilers.  */
+
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+
+#undef wcwidth
+
+/* Override any gcc2 internal prototype to avoid an error.  */
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+/* We use char because int might match the return type of a gcc2
+   builtin and then its argument prototype would still apply.  */
+char wcwidth ();
+/* 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_wcwidth) || defined (__stub___wcwidth)
+choke me
+#else
+char (*f) () = wcwidth;
+#endif
+#ifdef __cplusplus
+}
+#endif
+
+int
+main ()
+{
+return f != wcwidth;
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+  (eval $ac_link) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag"
+                        || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest$ac_exeext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_func_wcwidth=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_func_wcwidth=no
+fi
+rm -f conftest.err conftest.$ac_objext \
+      conftest$ac_exeext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_func_wcwidth" >&5
+echo "${ECHO_T}$ac_cv_func_wcwidth" >&6
+if test $ac_cv_func_wcwidth = yes; then
+  cat >>confdefs.h <<\_ACEOF
+#define HAVE_WCWIDTH 1
+_ACEOF
+
+fi
+
+echo "$as_me:$LINENO: checking for wctype" >&5
+echo $ECHO_N "checking for wctype... $ECHO_C" >&6
+if test "${ac_cv_func_wctype+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+/* Define wctype to an innocuous variant, in case <limits.h> declares wctype.
+   For example, HP-UX 11i <limits.h> declares gettimeofday.  */
+#define wctype innocuous_wctype
+
+/* System header to define __stub macros and hopefully few prototypes,
+    which can conflict with char wctype (); below.
+    Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+    <limits.h> exists even on freestanding compilers.  */
+
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+
+#undef wctype
+
+/* Override any gcc2 internal prototype to avoid an error.  */
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+/* We use char because int might match the return type of a gcc2
+   builtin and then its argument prototype would still apply.  */
+char wctype ();
+/* 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_wctype) || defined (__stub___wctype)
+choke me
+#else
+char (*f) () = wctype;
+#endif
+#ifdef __cplusplus
+}
+#endif
+
+int
+main ()
+{
+return f != wctype;
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+  (eval $ac_link) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag"
+                        || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest$ac_exeext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_func_wctype=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_func_wctype=no
+fi
+rm -f conftest.err conftest.$ac_objext \
+      conftest$ac_exeext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_func_wctype" >&5
+echo "${ECHO_T}$ac_cv_func_wctype" >&6
+if test $ac_cv_func_wctype = yes; then
+  cat >>confdefs.h <<\_ACEOF
+#define HAVE_WCTYPE 1
+_ACEOF
+
+fi
+
+
+
+  echo "$as_me:$LINENO: checking whether mbrtowc and mbstate_t are properly declared" >&5
+echo $ECHO_N "checking whether mbrtowc and mbstate_t are properly declared... $ECHO_C" >&6
+if test "${ac_cv_func_mbrtowc+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <wchar.h>
+int
+main ()
+{
+mbstate_t state; return ! (sizeof state && mbrtowc);
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+  (eval $ac_link) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag"
+                        || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest$ac_exeext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_func_mbrtowc=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_func_mbrtowc=no
+fi
+rm -f conftest.err conftest.$ac_objext \
+      conftest$ac_exeext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_func_mbrtowc" >&5
+echo "${ECHO_T}$ac_cv_func_mbrtowc" >&6
+  if test $ac_cv_func_mbrtowc = yes; then
+
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_MBRTOWC 1
+_ACEOF
+
+  fi
+
+if test $ac_cv_func_mbrtowc = yes; then
+       cat >>confdefs.h <<\_ACEOF
+#define HAVE_MBSTATE_T 1
+_ACEOF
+
+fi
+
+
+
+
+
+
+for ac_func in iswlower iswupper towlower towupper iswctype
+do
+as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
+echo "$as_me:$LINENO: checking for $ac_func" >&5
+echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6
+if eval "test \"\${$as_ac_var+set}\" = set"; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+/* Define $ac_func to an innocuous variant, in case <limits.h> declares $ac_func.
+   For example, HP-UX 11i <limits.h> declares gettimeofday.  */
+#define $ac_func innocuous_$ac_func
+
+/* System header to define __stub macros and hopefully few prototypes,
+    which can conflict with char $ac_func (); below.
+    Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+    <limits.h> exists even on freestanding compilers.  */
+
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+
+#undef $ac_func
+
+/* Override any gcc2 internal prototype to avoid an error.  */
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+/* 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 ();
+/* 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
+char (*f) () = $ac_func;
+#endif
+#ifdef __cplusplus
+}
+#endif
+
+int
+main ()
+{
+return f != $ac_func;
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+  (eval $ac_link) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag"
+                        || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest$ac_exeext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  eval "$as_ac_var=yes"
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+eval "$as_ac_var=no"
+fi
+rm -f conftest.err conftest.$ac_objext \
+      conftest$ac_exeext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5
+echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6
+if test `eval echo '${'$as_ac_var'}'` = yes; then
+  cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+done
+
+
+echo "$as_me:$LINENO: checking for nl_langinfo and CODESET" >&5
+echo $ECHO_N "checking for nl_langinfo and CODESET... $ECHO_C" >&6
+if test "${bash_cv_langinfo_codeset+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <langinfo.h>
+int
+main ()
+{
+char* cs = nl_langinfo(CODESET);
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+  (eval $ac_link) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag"
+                        || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest$ac_exeext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  bash_cv_langinfo_codeset=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+bash_cv_langinfo_codeset=no
+fi
+rm -f conftest.err conftest.$ac_objext \
+      conftest$ac_exeext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $bash_cv_langinfo_codeset" >&5
+echo "${ECHO_T}$bash_cv_langinfo_codeset" >&6
+if test $bash_cv_langinfo_codeset = yes; then
+  cat >>confdefs.h <<\_ACEOF
+#define HAVE_LANGINFO_CODESET 1
+_ACEOF
+
+fi
+
+echo "$as_me:$LINENO: checking for wchar_t in wchar.h" >&5
+echo $ECHO_N "checking for wchar_t in wchar.h... $ECHO_C" >&6
+if test "${bash_cv_type_wchar_t+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <wchar.h>
+
+int
+main ()
+{
+
+        wchar_t foo;
+        foo = 0;
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag"
+                        || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  bash_cv_type_wchar_t=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+bash_cv_type_wchar_t=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $bash_cv_type_wchar_t" >&5
+echo "${ECHO_T}$bash_cv_type_wchar_t" >&6
+if test $bash_cv_type_wchar_t = yes; then
+
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_WCHAR_T 1
+_ACEOF
+
+fi
+
+echo "$as_me:$LINENO: checking for wctype_t in wctype.h" >&5
+echo $ECHO_N "checking for wctype_t in wctype.h... $ECHO_C" >&6
+if test "${bash_cv_type_wctype_t+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <wctype.h>
+int
+main ()
+{
+
+        wctype_t foo;
+        foo = 0;
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag"
+                        || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  bash_cv_type_wctype_t=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+bash_cv_type_wctype_t=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $bash_cv_type_wctype_t" >&5
+echo "${ECHO_T}$bash_cv_type_wctype_t" >&6
+if test $bash_cv_type_wctype_t = yes; then
+
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_WCTYPE_T 1
+_ACEOF
+
+fi
+
+echo "$as_me:$LINENO: checking for wint_t in wctype.h" >&5
+echo $ECHO_N "checking for wint_t in wctype.h... $ECHO_C" >&6
+if test "${bash_cv_type_wint_t+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <wctype.h>
+int
+main ()
+{
+
+        wint_t foo;
+        foo = 0;
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag"
+                        || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  bash_cv_type_wint_t=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+bash_cv_type_wint_t=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $bash_cv_type_wint_t" >&5
+echo "${ECHO_T}$bash_cv_type_wint_t" >&6
+if test $bash_cv_type_wint_t = yes; then
+
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_WINT_T 1
+_ACEOF
+
+fi
+
+
+
+case "$host_cpu" in
+*cray*)        LOCAL_CFLAGS=-DCRAY ;;
+*s390*) LOCAL_CFLAGS=-fsigned-char ;;
+esac
+
+case "$host_os" in
+isc*)  LOCAL_CFLAGS=-Disc386 ;;
+esac
+
+# shared library configuration section
+#
+# Shared object configuration section.  These values are generated by
+# ${srcdir}/support/shobj-conf
+#
+if test -f ${srcdir}/support/shobj-conf; then
+        echo "$as_me:$LINENO: checking configuration for building shared libraries" >&5
+echo $ECHO_N "checking configuration for building shared libraries... $ECHO_C" >&6
+        eval `TERMCAP_LIB=$TERMCAP_LIB ${CONFIG_SHELL-/bin/sh} ${srcdir}/support/shobj-conf -C "${CC}" -c ${host_cpu} -o ${host_os} -v ${host_vendor}`
+
+#      case "$SHLIB_LIBS" in
+#      *curses*|*termcap*|*termlib*)   ;;
+#      *)                      SHLIB_LIBS="$SHLIB_LIBS $TERMCAP_LIB" ;;
+#      esac
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+        echo "$as_me:$LINENO: result: $SHLIB_STATUS" >&5
+echo "${ECHO_T}$SHLIB_STATUS" >&6
+
+       # SHLIB_STATUS is either `supported' or `unsupported'.  If it's
+       # `unsupported', turn off any default shared library building
+       if test "$SHLIB_STATUS" = 'unsupported'; then
+               opt_shared_libs=no
+       fi
+
+       # shared library versioning
+       # quoted for m4 so I can use character classes
+       SHLIB_MAJOR=`expr "$LIBVERSION" : '\([0-9]\)\..*'`
+       SHLIB_MINOR=`expr "$LIBVERSION" : '[0-9]\.\([0-9]\).*'`
+
+
+fi
+
+if test "$opt_static_libs" = "yes"; then
+       STATIC_TARGET=static
+       STATIC_INSTALL_TARGET=install-static
+fi
+if test "$opt_shared_libs" = "yes"; then
+       SHARED_TARGET=shared
+       SHARED_INSTALL_TARGET=install-shared
+fi
+
+
+
+
+
+
+case "$host_os" in
+msdosdjgpp*)   BUILD_DIR=`pwd.exe` ;;  # to prevent //d/path/file
+*)             BUILD_DIR=`pwd` ;;
+esac
+
+case "$BUILD_DIR" in
+*\ *)  BUILD_DIR=`echo "$BUILD_DIR" | sed 's: :\\\\ :g'` ;;
+*)     ;;
+esac
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+                                        ac_config_files="$ac_config_files Makefile doc/Makefile examples/Makefile shlib/Makefile"
+          ac_config_commands="$ac_config_commands default"
+cat >confcache <<\_ACEOF
+# This file is a shell script that caches the results of configure
+# tests run on this system so they can be shared between configure
+# scripts and configure runs, see configure's option --config-cache.
+# It is not useful on other systems.  If it contains results you don't
+# want to keep, you may remove or edit it.
+#
+# config.status only pays attention to the cache file if you give it
+# the --recheck option to rerun configure.
+#
+# `ac_cv_env_foo' variables (set or unset) will be overridden when
+# loading this file, other *unset* `ac_cv_foo' will be assigned the
+# following values.
+
+_ACEOF
+
+# The following way of writing the cache mishandles newlines in values,
+# but we know of no workaround that is simple, portable, and efficient.
+# So, don't put newlines in cache variables' values.
+# Ultrix sh set writes to stderr and can't be redirected directly,
+# and sets the high bit in the cache file unless we assign to the vars.
+{
+  (set) 2>&1 |
+    case `(ac_space=' '; set | grep ac_space) 2>&1` in
+    *ac_space=\ *)
+      # `set' does not quote correctly, so add quotes (double-quote
+      # substitution turns \\\\ into \\, and sed turns \\ into \).
+      sed -n \
+       "s/'/'\\\\''/g;
+         s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p"
+      ;;
+    *)
+      # `set' quotes correctly as required by POSIX, so do not add quotes.
+      sed -n \
+       "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p"
+      ;;
+    esac;
+} |
+  sed '
+     t clear
+     : clear
+     s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/
+     t end
+     /^ac_cv_env/!s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/
+     : end' >>confcache
+if diff $cache_file confcache >/dev/null 2>&1; then :; else
+  if test -w $cache_file; then
+    test "x$cache_file" != "x/dev/null" && echo "updating cache $cache_file"
+    cat confcache >$cache_file
+  else
+    echo "not updating unwritable cache $cache_file"
+  fi
+fi
+rm -f confcache
+
+test "x$prefix" = xNONE && prefix=$ac_default_prefix
+# Let make expand exec_prefix.
+test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
+
+# VPATH may cause trouble with some makes, so we remove $(srcdir),
+# ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and
+# trailing colons and then remove the whole line if VPATH becomes empty
+# (actually we leave an empty line to preserve line numbers).
+if test "x$srcdir" = x.; then
+  ac_vpsub='/^[         ]*VPATH[        ]*=/{
+s/:*\$(srcdir):*/:/;
+s/:*\${srcdir}:*/:/;
+s/:*@srcdir@:*/:/;
+s/^\([^=]*=[    ]*\):*/\1/;
+s/:*$//;
+s/^[^=]*=[      ]*$//;
+}'
+fi
+
+DEFS=-DHAVE_CONFIG_H
+
+ac_libobjs=
+ac_ltlibobjs=
+for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue
+  # 1. Remove the extension, and $U if already installed.
+  ac_i=`echo "$ac_i" |
+        sed 's/\$U\././;s/\.o$//;s/\.obj$//'`
+  # 2. Add them.
+  ac_libobjs="$ac_libobjs $ac_i\$U.$ac_objext"
+  ac_ltlibobjs="$ac_ltlibobjs $ac_i"'$U.lo'
+done
+LIBOBJS=$ac_libobjs
+
+LTLIBOBJS=$ac_ltlibobjs
+
+
+
+: ${CONFIG_STATUS=./config.status}
+ac_clean_files_save=$ac_clean_files
+ac_clean_files="$ac_clean_files $CONFIG_STATUS"
+{ echo "$as_me:$LINENO: creating $CONFIG_STATUS" >&5
+echo "$as_me: creating $CONFIG_STATUS" >&6;}
+cat >$CONFIG_STATUS <<_ACEOF
+#! $SHELL
+# Generated by $as_me.
+# Run this file to recreate the current configuration.
+# Compiler output produced by configure, useful for debugging
+# configure, is in config.log if it exists.
+
+debug=false
+ac_cs_recheck=false
+ac_cs_silent=false
+SHELL=\${CONFIG_SHELL-$SHELL}
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+## --------------------- ##
+## M4sh Initialization.  ##
+## --------------------- ##
+
+# Be Bourne compatible
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
+  emulate sh
+  NULLCMD=:
+  # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '${1+"$@"}'='"$@"'
+elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then
+  set -o posix
+fi
+DUALCASE=1; export DUALCASE # for MKS sh
+
+# Support unset when possible.
+if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
+  as_unset=unset
+else
+  as_unset=false
+fi
+
+
+# Work around bugs in pre-3.0 UWIN ksh.
+$as_unset ENV MAIL MAILPATH
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# NLS nuisances.
+for as_var in \
+  LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \
+  LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \
+  LC_TELEPHONE LC_TIME
+do
+  if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then
+    eval $as_var=C; export $as_var
+  else
+    $as_unset $as_var
+  fi
+done
+
+# Required to use basename.
+if expr a : '\(a\)' >/dev/null 2>&1; then
+  as_expr=expr
+else
+  as_expr=false
+fi
+
+if (basename /) >/dev/null 2>&1 && test "X`basename / 2>&1`" = "X/"; then
+  as_basename=basename
+else
+  as_basename=false
+fi
+
+
+# Name of the executable.
+as_me=`$as_basename "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+        X"$0" : 'X\(//\)$' \| \
+        X"$0" : 'X\(/\)$' \| \
+        .     : '\(.\)' 2>/dev/null ||
+echo X/"$0" |
+    sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/; q; }
+         /^X\/\(\/\/\)$/{ s//\1/; q; }
+         /^X\/\(\/\).*/{ s//\1/; q; }
+         s/.*/./; q'`
+
+
+# PATH needs CR, and LINENO needs CR and PATH.
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+  echo "#! /bin/sh" >conf$$.sh
+  echo  "exit 0"   >>conf$$.sh
+  chmod +x conf$$.sh
+  if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then
+    PATH_SEPARATOR=';'
+  else
+    PATH_SEPARATOR=:
+  fi
+  rm -f conf$$.sh
+fi
+
+
+  as_lineno_1=$LINENO
+  as_lineno_2=$LINENO
+  as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null`
+  test "x$as_lineno_1" != "x$as_lineno_2" &&
+  test "x$as_lineno_3"  = "x$as_lineno_2"  || {
+  # Find who we are.  Look in the path if we contain no path at all
+  # relative or not.
+  case $0 in
+    *[\\/]* ) as_myself=$0 ;;
+    *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+done
+
+       ;;
+  esac
+  # We did not find ourselves, most probably we were run as `sh COMMAND'
+  # in which case we are not to be found in the path.
+  if test "x$as_myself" = x; then
+    as_myself=$0
+  fi
+  if test ! -f "$as_myself"; then
+    { { echo "$as_me:$LINENO: error: cannot find myself; rerun with an absolute path" >&5
+echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2;}
+   { (exit 1); exit 1; }; }
+  fi
+  case $CONFIG_SHELL in
+  '')
+    as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for as_base in sh bash ksh sh5; do
+        case $as_dir in
+        /*)
+          if ("$as_dir/$as_base" -c '
+  as_lineno_1=$LINENO
+  as_lineno_2=$LINENO
+  as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null`
+  test "x$as_lineno_1" != "x$as_lineno_2" &&
+  test "x$as_lineno_3"  = "x$as_lineno_2" ') 2>/dev/null; then
+            $as_unset BASH_ENV || test "${BASH_ENV+set}" != set || { BASH_ENV=; export BASH_ENV; }
+            $as_unset ENV || test "${ENV+set}" != set || { ENV=; export ENV; }
+            CONFIG_SHELL=$as_dir/$as_base
+            export CONFIG_SHELL
+            exec "$CONFIG_SHELL" "$0" ${1+"$@"}
+          fi;;
+        esac
+       done
+done
+;;
+  esac
+
+  # Create $as_me.lineno as a copy of $as_myself, but with $LINENO
+  # uniformly replaced by the line number.  The first 'sed' inserts a
+  # line-number line before each line; the second 'sed' does the real
+  # work.  The second script uses 'N' to pair each line-number line
+  # with the numbered line, and appends trailing '-' during
+  # substitution so that $LINENO is not a special case at line end.
+  # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the
+  # second 'sed' script.  Blame Lee E. McMahon for sed's syntax.  :-)
+  sed '=' <$as_myself |
+    sed '
+      N
+      s,$,-,
+      : loop
+      s,^\(['$as_cr_digits']*\)\(.*\)[$]LINENO\([^'$as_cr_alnum'_]\),\1\2\1\3,
+      t loop
+      s,-$,,
+      s,^['$as_cr_digits']*\n,,
+    ' >$as_me.lineno &&
+  chmod +x $as_me.lineno ||
+    { { echo "$as_me:$LINENO: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&5
+echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2;}
+   { (exit 1); exit 1; }; }
+
+  # Don't try to exec as it changes $[0], causing all sort of problems
+  # (the dirname of $[0] is not the place where we might find the
+  # original and so on.  Autoconf is especially sensible to this).
+  . ./$as_me.lineno
+  # Exit status is that of the last command.
+  exit
+}
+
+
+case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in
+  *c*,-n*) ECHO_N= ECHO_C='
+' ECHO_T='     ' ;;
+  *c*,*  ) ECHO_N=-n ECHO_C= ECHO_T= ;;
+  *)       ECHO_N= ECHO_C='\c' ECHO_T= ;;
+esac
+
+if expr a : '\(a\)' >/dev/null 2>&1; then
+  as_expr=expr
+else
+  as_expr=false
+fi
+
+rm -f conf$$ conf$$.exe conf$$.file
+echo >conf$$.file
+if ln -s conf$$.file conf$$ 2>/dev/null; then
+  # We could just check for DJGPP; but this test a) works b) is more generic
+  # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04).
+  if test -f conf$$.exe; then
+    # Don't use ln at all; we don't have any links
+    as_ln_s='cp -p'
+  else
+    as_ln_s='ln -s'
+  fi
+elif ln conf$$.file conf$$ 2>/dev/null; then
+  as_ln_s=ln
+else
+  as_ln_s='cp -p'
+fi
+rm -f conf$$ conf$$.exe conf$$.file
+
+if mkdir -p . 2>/dev/null; then
+  as_mkdir_p=:
+else
+  test -d ./-p && rmdir ./-p
+  as_mkdir_p=false
+fi
+
+as_executable_p="test -f"
+
+# Sed expression to map a string onto a valid CPP name.
+as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
+
+# Sed expression to map a string onto a valid variable name.
+as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
+
+
+# IFS
+# We need space, tab and new line, in precisely that order.
+as_nl='
+'
+IFS="  $as_nl"
+
+# CDPATH.
+$as_unset CDPATH
+
+exec 6>&1
+
+# Open the log real soon, to keep \$[0] and so on meaningful, and to
+# report actual input values of CONFIG_FILES etc. instead of their
+# values after options handling.  Logging --version etc. is OK.
+exec 5>>config.log
+{
+  echo
+  sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX
+## Running $as_me. ##
+_ASBOX
+} >&5
+cat >&5 <<_CSEOF
+
+This file was extended by readline $as_me 5.2, which was
+generated by GNU Autoconf 2.59.  Invocation command line was
+
+  CONFIG_FILES    = $CONFIG_FILES
+  CONFIG_HEADERS  = $CONFIG_HEADERS
+  CONFIG_LINKS    = $CONFIG_LINKS
+  CONFIG_COMMANDS = $CONFIG_COMMANDS
+  $ $0 $@
+
+_CSEOF
+echo "on `(hostname || uname -n) 2>/dev/null | sed 1q`" >&5
+echo >&5
+_ACEOF
+
+# Files that config.status was made for.
+if test -n "$ac_config_files"; then
+  echo "config_files=\"$ac_config_files\"" >>$CONFIG_STATUS
+fi
+
+if test -n "$ac_config_headers"; then
+  echo "config_headers=\"$ac_config_headers\"" >>$CONFIG_STATUS
+fi
+
+if test -n "$ac_config_links"; then
+  echo "config_links=\"$ac_config_links\"" >>$CONFIG_STATUS
+fi
+
+if test -n "$ac_config_commands"; then
+  echo "config_commands=\"$ac_config_commands\"" >>$CONFIG_STATUS
+fi
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+
+ac_cs_usage="\
+\`$as_me' instantiates files from templates according to the
+current configuration.
+
+Usage: $0 [OPTIONS] [FILE]...
+
+  -h, --help       print this help, then exit
+  -V, --version    print version number, then exit
+  -q, --quiet      do not print progress messages
+  -d, --debug      don't remove temporary files
+      --recheck    update $as_me by reconfiguring in the same conditions
+  --file=FILE[:TEMPLATE]
+                  instantiate the configuration file FILE
+  --header=FILE[:TEMPLATE]
+                  instantiate the configuration header FILE
+
+Configuration files:
+$config_files
+
+Configuration headers:
+$config_headers
+
+Configuration commands:
+$config_commands
+
+Report bugs to <bug-autoconf@gnu.org>."
+_ACEOF
+
+cat >>$CONFIG_STATUS <<_ACEOF
+ac_cs_version="\\
+readline config.status 5.2
+configured by $0, generated by GNU Autoconf 2.59,
+  with options \\"`echo "$ac_configure_args" | sed 's/[\\""\`\$]/\\\\&/g'`\\"
+
+Copyright (C) 2003 Free Software Foundation, Inc.
+This config.status script is free software; the Free Software Foundation
+gives unlimited permission to copy, distribute and modify it."
+srcdir=$srcdir
+INSTALL="$INSTALL"
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+# If no file are specified by the user, then we need to provide default
+# value.  By we need to know if files were specified by the user.
+ac_need_defaults=:
+while test $# != 0
+do
+  case $1 in
+  --*=*)
+    ac_option=`expr "x$1" : 'x\([^=]*\)='`
+    ac_optarg=`expr "x$1" : 'x[^=]*=\(.*\)'`
+    ac_shift=:
+    ;;
+  -*)
+    ac_option=$1
+    ac_optarg=$2
+    ac_shift=shift
+    ;;
+  *) # This is not an option, so the user has probably given explicit
+     # arguments.
+     ac_option=$1
+     ac_need_defaults=false;;
+  esac
+
+  case $ac_option in
+  # Handling of the options.
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF
+  -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
+    ac_cs_recheck=: ;;
+  --version | --vers* | -V )
+    echo "$ac_cs_version"; exit 0 ;;
+  --he | --h)
+    # Conflict between --help and --header
+    { { echo "$as_me:$LINENO: error: ambiguous option: $1
+Try \`$0 --help' for more information." >&5
+echo "$as_me: error: ambiguous option: $1
+Try \`$0 --help' for more information." >&2;}
+   { (exit 1); exit 1; }; };;
+  --help | --hel | -h )
+    echo "$ac_cs_usage"; exit 0 ;;
+  --debug | --d* | -d )
+    debug=: ;;
+  --file | --fil | --fi | --f )
+    $ac_shift
+    CONFIG_FILES="$CONFIG_FILES $ac_optarg"
+    ac_need_defaults=false;;
+  --header | --heade | --head | --hea )
+    $ac_shift
+    CONFIG_HEADERS="$CONFIG_HEADERS $ac_optarg"
+    ac_need_defaults=false;;
+  -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+  | -silent | --silent | --silen | --sile | --sil | --si | --s)
+    ac_cs_silent=: ;;
+
+  # This is an error.
+  -*) { { echo "$as_me:$LINENO: error: unrecognized option: $1
+Try \`$0 --help' for more information." >&5
+echo "$as_me: error: unrecognized option: $1
+Try \`$0 --help' for more information." >&2;}
+   { (exit 1); exit 1; }; } ;;
+
+  *) ac_config_targets="$ac_config_targets $1" ;;
+
+  esac
+  shift
+done
+
+ac_configure_extra_args=
+
+if $ac_cs_silent; then
+  exec 6>/dev/null
+  ac_configure_extra_args="$ac_configure_extra_args --silent"
+fi
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF
+if \$ac_cs_recheck; then
+  echo "running $SHELL $0 " $ac_configure_args \$ac_configure_extra_args " --no-create --no-recursion" >&6
+  exec $SHELL $0 $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion
+fi
+
+_ACEOF
+
+
+
+
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+for ac_config_target in $ac_config_targets
+do
+  case "$ac_config_target" in
+  # Handling of arguments.
+  "Makefile" ) CONFIG_FILES="$CONFIG_FILES Makefile" ;;
+  "doc/Makefile" ) CONFIG_FILES="$CONFIG_FILES doc/Makefile" ;;
+  "examples/Makefile" ) CONFIG_FILES="$CONFIG_FILES examples/Makefile" ;;
+  "shlib/Makefile" ) CONFIG_FILES="$CONFIG_FILES shlib/Makefile" ;;
+  "default" ) CONFIG_COMMANDS="$CONFIG_COMMANDS default" ;;
+  "config.h" ) CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;;
+  *) { { echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5
+echo "$as_me: error: invalid argument: $ac_config_target" >&2;}
+   { (exit 1); exit 1; }; };;
+  esac
+done
+
+# If the user did not use the arguments to specify the items to instantiate,
+# then the envvar interface is used.  Set only those that are not.
+# We use the long form for the default assignment because of an extremely
+# bizarre bug on SunOS 4.1.3.
+if $ac_need_defaults; then
+  test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files
+  test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers
+  test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands
+fi
+
+# Have a temporary directory for convenience.  Make it in the build tree
+# simply because there is no reason to put it here, and in addition,
+# creating and moving files from /tmp can sometimes cause problems.
+# Create a temporary directory, and hook for its removal unless debugging.
+$debug ||
+{
+  trap 'exit_status=$?; rm -rf $tmp && exit $exit_status' 0
+  trap '{ (exit 1); exit 1; }' 1 2 13 15
+}
+
+# Create a (secure) tmp directory for tmp files.
+
+{
+  tmp=`(umask 077 && mktemp -d -q "./confstatXXXXXX") 2>/dev/null` &&
+  test -n "$tmp" && test -d "$tmp"
+}  ||
+{
+  tmp=./confstat$$-$RANDOM
+  (umask 077 && mkdir $tmp)
+} ||
+{
+   echo "$me: cannot create a temporary directory in ." >&2
+   { (exit 1); exit 1; }
+}
+
+_ACEOF
+
+cat >>$CONFIG_STATUS <<_ACEOF
+
+#
+# CONFIG_FILES section.
+#
+
+# No need to generate the scripts if there are no CONFIG_FILES.
+# This happens for instance when ./config.status config.h
+if test -n "\$CONFIG_FILES"; then
+  # Protect against being on the right side of a sed subst in config.status.
+  sed 's/,@/@@/; s/@,/@@/; s/,;t t\$/@;t t/; /@;t t\$/s/[\\\\&,]/\\\\&/g;
+   s/@@/,@/; s/@@/@,/; s/@;t t\$/,;t t/' >\$tmp/subs.sed <<\\CEOF
+s,@SHELL@,$SHELL,;t t
+s,@PATH_SEPARATOR@,$PATH_SEPARATOR,;t t
+s,@PACKAGE_NAME@,$PACKAGE_NAME,;t t
+s,@PACKAGE_TARNAME@,$PACKAGE_TARNAME,;t t
+s,@PACKAGE_VERSION@,$PACKAGE_VERSION,;t t
+s,@PACKAGE_STRING@,$PACKAGE_STRING,;t t
+s,@PACKAGE_BUGREPORT@,$PACKAGE_BUGREPORT,;t t
+s,@exec_prefix@,$exec_prefix,;t t
+s,@prefix@,$prefix,;t t
+s,@program_transform_name@,$program_transform_name,;t t
+s,@bindir@,$bindir,;t t
+s,@sbindir@,$sbindir,;t t
+s,@libexecdir@,$libexecdir,;t t
+s,@datadir@,$datadir,;t t
+s,@sysconfdir@,$sysconfdir,;t t
+s,@sharedstatedir@,$sharedstatedir,;t t
+s,@localstatedir@,$localstatedir,;t t
+s,@libdir@,$libdir,;t t
+s,@includedir@,$includedir,;t t
+s,@oldincludedir@,$oldincludedir,;t t
+s,@infodir@,$infodir,;t t
+s,@mandir@,$mandir,;t t
+s,@build_alias@,$build_alias,;t t
+s,@host_alias@,$host_alias,;t t
+s,@target_alias@,$target_alias,;t t
+s,@DEFS@,$DEFS,;t t
+s,@ECHO_C@,$ECHO_C,;t t
+s,@ECHO_N@,$ECHO_N,;t t
+s,@ECHO_T@,$ECHO_T,;t t
+s,@LIBS@,$LIBS,;t t
+s,@build@,$build,;t t
+s,@build_cpu@,$build_cpu,;t t
+s,@build_vendor@,$build_vendor,;t t
+s,@build_os@,$build_os,;t t
+s,@host@,$host,;t t
+s,@host_cpu@,$host_cpu,;t t
+s,@host_vendor@,$host_vendor,;t t
+s,@host_os@,$host_os,;t t
+s,@CROSS_COMPILE@,$CROSS_COMPILE,;t t
+s,@SET_MAKE@,$SET_MAKE,;t t
+s,@CC@,$CC,;t t
+s,@CFLAGS@,$CFLAGS,;t t
+s,@LDFLAGS@,$LDFLAGS,;t t
+s,@CPPFLAGS@,$CPPFLAGS,;t t
+s,@ac_ct_CC@,$ac_ct_CC,;t t
+s,@EXEEXT@,$EXEEXT,;t t
+s,@OBJEXT@,$OBJEXT,;t t
+s,@CPP@,$CPP,;t t
+s,@EGREP@,$EGREP,;t t
+s,@INSTALL_PROGRAM@,$INSTALL_PROGRAM,;t t
+s,@INSTALL_SCRIPT@,$INSTALL_SCRIPT,;t t
+s,@INSTALL_DATA@,$INSTALL_DATA,;t t
+s,@AR@,$AR,;t t
+s,@RANLIB@,$RANLIB,;t t
+s,@ac_ct_RANLIB@,$ac_ct_RANLIB,;t t
+s,@MAKE_SHELL@,$MAKE_SHELL,;t t
+s,@SHOBJ_CC@,$SHOBJ_CC,;t t
+s,@SHOBJ_CFLAGS@,$SHOBJ_CFLAGS,;t t
+s,@SHOBJ_LD@,$SHOBJ_LD,;t t
+s,@SHOBJ_LDFLAGS@,$SHOBJ_LDFLAGS,;t t
+s,@SHOBJ_XLDFLAGS@,$SHOBJ_XLDFLAGS,;t t
+s,@SHOBJ_LIBS@,$SHOBJ_LIBS,;t t
+s,@SHOBJ_STATUS@,$SHOBJ_STATUS,;t t
+s,@SHLIB_STATUS@,$SHLIB_STATUS,;t t
+s,@SHLIB_XLDFLAGS@,$SHLIB_XLDFLAGS,;t t
+s,@SHLIB_DOT@,$SHLIB_DOT,;t t
+s,@SHLIB_LIBPREF@,$SHLIB_LIBPREF,;t t
+s,@SHLIB_LIBSUFF@,$SHLIB_LIBSUFF,;t t
+s,@SHLIB_LIBVERSION@,$SHLIB_LIBVERSION,;t t
+s,@SHLIB_DLLVERSION@,$SHLIB_DLLVERSION,;t t
+s,@SHLIB_LIBS@,$SHLIB_LIBS,;t t
+s,@SHLIB_MAJOR@,$SHLIB_MAJOR,;t t
+s,@SHLIB_MINOR@,$SHLIB_MINOR,;t t
+s,@STATIC_TARGET@,$STATIC_TARGET,;t t
+s,@SHARED_TARGET@,$SHARED_TARGET,;t t
+s,@STATIC_INSTALL_TARGET@,$STATIC_INSTALL_TARGET,;t t
+s,@SHARED_INSTALL_TARGET@,$SHARED_INSTALL_TARGET,;t t
+s,@PURIFY@,$PURIFY,;t t
+s,@BUILD_DIR@,$BUILD_DIR,;t t
+s,@LOCAL_CFLAGS@,$LOCAL_CFLAGS,;t t
+s,@LOCAL_LDFLAGS@,$LOCAL_LDFLAGS,;t t
+s,@LOCAL_DEFS@,$LOCAL_DEFS,;t t
+s,@ARFLAGS@,$ARFLAGS,;t t
+s,@LIBVERSION@,$LIBVERSION,;t t
+s,@TERMCAP_LIB@,$TERMCAP_LIB,;t t
+s,@LIBOBJS@,$LIBOBJS,;t t
+s,@LTLIBOBJS@,$LTLIBOBJS,;t t
+CEOF
+
+_ACEOF
+
+  cat >>$CONFIG_STATUS <<\_ACEOF
+  # Split the substitutions into bite-sized pieces for seds with
+  # small command number limits, like on Digital OSF/1 and HP-UX.
+  ac_max_sed_lines=48
+  ac_sed_frag=1 # Number of current file.
+  ac_beg=1 # First line for current file.
+  ac_end=$ac_max_sed_lines # Line after last line for current file.
+  ac_more_lines=:
+  ac_sed_cmds=
+  while $ac_more_lines; do
+    if test $ac_beg -gt 1; then
+      sed "1,${ac_beg}d; ${ac_end}q" $tmp/subs.sed >$tmp/subs.frag
+    else
+      sed "${ac_end}q" $tmp/subs.sed >$tmp/subs.frag
+    fi
+    if test ! -s $tmp/subs.frag; then
+      ac_more_lines=false
+    else
+      # The purpose of the label and of the branching condition is to
+      # speed up the sed processing (if there are no `@' at all, there
+      # is no need to browse any of the substitutions).
+      # These are the two extra sed commands mentioned above.
+      (echo ':t
+  /@[a-zA-Z_][a-zA-Z_0-9]*@/!b' && cat $tmp/subs.frag) >$tmp/subs-$ac_sed_frag.sed
+      if test -z "$ac_sed_cmds"; then
+       ac_sed_cmds="sed -f $tmp/subs-$ac_sed_frag.sed"
+      else
+       ac_sed_cmds="$ac_sed_cmds | sed -f $tmp/subs-$ac_sed_frag.sed"
+      fi
+      ac_sed_frag=`expr $ac_sed_frag + 1`
+      ac_beg=$ac_end
+      ac_end=`expr $ac_end + $ac_max_sed_lines`
+    fi
+  done
+  if test -z "$ac_sed_cmds"; then
+    ac_sed_cmds=cat
+  fi
+fi # test -n "$CONFIG_FILES"
+
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF
+for ac_file in : $CONFIG_FILES; do test "x$ac_file" = x: && continue
+  # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in".
+  case $ac_file in
+  - | *:- | *:-:* ) # input from stdin
+       cat >$tmp/stdin
+       ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'`
+       ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;;
+  *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'`
+       ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;;
+  * )   ac_file_in=$ac_file.in ;;
+  esac
+
+  # Compute @srcdir@, @top_srcdir@, and @INSTALL@ for subdirectories.
+  ac_dir=`(dirname "$ac_file") 2>/dev/null ||
+$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+        X"$ac_file" : 'X\(//\)[^/]' \| \
+        X"$ac_file" : 'X\(//\)$' \| \
+        X"$ac_file" : 'X\(/\)' \| \
+        .     : '\(.\)' 2>/dev/null ||
+echo X"$ac_file" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+         /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+         /^X\(\/\/\)$/{ s//\1/; q; }
+         /^X\(\/\).*/{ s//\1/; q; }
+         s/.*/./; q'`
+  { if $as_mkdir_p; then
+    mkdir -p "$ac_dir"
+  else
+    as_dir="$ac_dir"
+    as_dirs=
+    while test ! -d "$as_dir"; do
+      as_dirs="$as_dir $as_dirs"
+      as_dir=`(dirname "$as_dir") 2>/dev/null ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+        X"$as_dir" : 'X\(//\)[^/]' \| \
+        X"$as_dir" : 'X\(//\)$' \| \
+        X"$as_dir" : 'X\(/\)' \| \
+        .     : '\(.\)' 2>/dev/null ||
+echo X"$as_dir" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+         /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+         /^X\(\/\/\)$/{ s//\1/; q; }
+         /^X\(\/\).*/{ s//\1/; q; }
+         s/.*/./; q'`
+    done
+    test ! -n "$as_dirs" || mkdir $as_dirs
+  fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5
+echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;}
+   { (exit 1); exit 1; }; }; }
+
+  ac_builddir=.
+
+if test "$ac_dir" != .; then
+  ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'`
+  # A "../" for each directory in $ac_dir_suffix.
+  ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'`
+else
+  ac_dir_suffix= ac_top_builddir=
+fi
+
+case $srcdir in
+  .)  # No --srcdir option.  We are building in place.
+    ac_srcdir=.
+    if test -z "$ac_top_builddir"; then
+       ac_top_srcdir=.
+    else
+       ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'`
+    fi ;;
+  [\\/]* | ?:[\\/]* )  # Absolute path.
+    ac_srcdir=$srcdir$ac_dir_suffix;
+    ac_top_srcdir=$srcdir ;;
+  *) # Relative path.
+    ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix
+    ac_top_srcdir=$ac_top_builddir$srcdir ;;
+esac
+
+# Do not use `cd foo && pwd` to compute absolute paths, because
+# the directories may not exist.
+case `pwd` in
+.) ac_abs_builddir="$ac_dir";;
+*)
+  case "$ac_dir" in
+  .) ac_abs_builddir=`pwd`;;
+  [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";;
+  *) ac_abs_builddir=`pwd`/"$ac_dir";;
+  esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_top_builddir=${ac_top_builddir}.;;
+*)
+  case ${ac_top_builddir}. in
+  .) ac_abs_top_builddir=$ac_abs_builddir;;
+  [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;;
+  *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;;
+  esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_srcdir=$ac_srcdir;;
+*)
+  case $ac_srcdir in
+  .) ac_abs_srcdir=$ac_abs_builddir;;
+  [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;;
+  *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;;
+  esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_top_srcdir=$ac_top_srcdir;;
+*)
+  case $ac_top_srcdir in
+  .) ac_abs_top_srcdir=$ac_abs_builddir;;
+  [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;;
+  *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;;
+  esac;;
+esac
+
+
+  case $INSTALL in
+  [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;;
+  *) ac_INSTALL=$ac_top_builddir$INSTALL ;;
+  esac
+
+  if test x"$ac_file" != x-; then
+    { echo "$as_me:$LINENO: creating $ac_file" >&5
+echo "$as_me: creating $ac_file" >&6;}
+    rm -f "$ac_file"
+  fi
+  # Let's still pretend it is `configure' which instantiates (i.e., don't
+  # use $as_me), people would be surprised to read:
+  #    /* config.h.  Generated by config.status.  */
+  if test x"$ac_file" = x-; then
+    configure_input=
+  else
+    configure_input="$ac_file.  "
+  fi
+  configure_input=$configure_input"Generated from `echo $ac_file_in |
+                                    sed 's,.*/,,'` by configure."
+
+  # First look for the input files in the build tree, otherwise in the
+  # src tree.
+  ac_file_inputs=`IFS=:
+    for f in $ac_file_in; do
+      case $f in
+      -) echo $tmp/stdin ;;
+      [\\/$]*)
+        # Absolute (can't be DOS-style, as IFS=:)
+        test -f "$f" || { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5
+echo "$as_me: error: cannot find input file: $f" >&2;}
+   { (exit 1); exit 1; }; }
+        echo "$f";;
+      *) # Relative
+        if test -f "$f"; then
+          # Build tree
+          echo "$f"
+        elif test -f "$srcdir/$f"; then
+          # Source tree
+          echo "$srcdir/$f"
+        else
+          # /dev/null tree
+          { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5
+echo "$as_me: error: cannot find input file: $f" >&2;}
+   { (exit 1); exit 1; }; }
+        fi;;
+      esac
+    done` || { (exit 1); exit 1; }
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF
+  sed "$ac_vpsub
+$extrasub
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF
+:t
+/@[a-zA-Z_][a-zA-Z_0-9]*@/!b
+s,@configure_input@,$configure_input,;t t
+s,@srcdir@,$ac_srcdir,;t t
+s,@abs_srcdir@,$ac_abs_srcdir,;t t
+s,@top_srcdir@,$ac_top_srcdir,;t t
+s,@abs_top_srcdir@,$ac_abs_top_srcdir,;t t
+s,@builddir@,$ac_builddir,;t t
+s,@abs_builddir@,$ac_abs_builddir,;t t
+s,@top_builddir@,$ac_top_builddir,;t t
+s,@abs_top_builddir@,$ac_abs_top_builddir,;t t
+s,@INSTALL@,$ac_INSTALL,;t t
+" $ac_file_inputs | (eval "$ac_sed_cmds") >$tmp/out
+  rm -f $tmp/stdin
+  if test x"$ac_file" != x-; then
+    mv $tmp/out $ac_file
+  else
+    cat $tmp/out
+    rm -f $tmp/out
+  fi
+
+done
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF
+
+#
+# CONFIG_HEADER section.
+#
+
+# These sed commands are passed to sed as "A NAME B NAME C VALUE D", where
+# NAME is the cpp macro being defined and VALUE is the value it is being given.
+#
+# ac_d sets the value in "#define NAME VALUE" lines.
+ac_dA='s,^\([   ]*\)#\([        ]*define[       ][      ]*\)'
+ac_dB='[        ].*$,\1#\2'
+ac_dC=' '
+ac_dD=',;t'
+# ac_u turns "#undef NAME" without trailing blanks into "#define NAME VALUE".
+ac_uA='s,^\([   ]*\)#\([        ]*\)undef\([    ][      ]*\)'
+ac_uB='$,\1#\2define\3'
+ac_uC=' '
+ac_uD=',;t'
+
+for ac_file in : $CONFIG_HEADERS; do test "x$ac_file" = x: && continue
+  # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in".
+  case $ac_file in
+  - | *:- | *:-:* ) # input from stdin
+       cat >$tmp/stdin
+       ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'`
+       ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;;
+  *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'`
+       ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;;
+  * )   ac_file_in=$ac_file.in ;;
+  esac
+
+  test x"$ac_file" != x- && { echo "$as_me:$LINENO: creating $ac_file" >&5
+echo "$as_me: creating $ac_file" >&6;}
+
+  # First look for the input files in the build tree, otherwise in the
+  # src tree.
+  ac_file_inputs=`IFS=:
+    for f in $ac_file_in; do
+      case $f in
+      -) echo $tmp/stdin ;;
+      [\\/$]*)
+        # Absolute (can't be DOS-style, as IFS=:)
+        test -f "$f" || { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5
+echo "$as_me: error: cannot find input file: $f" >&2;}
+   { (exit 1); exit 1; }; }
+        # Do quote $f, to prevent DOS paths from being IFS'd.
+        echo "$f";;
+      *) # Relative
+        if test -f "$f"; then
+          # Build tree
+          echo "$f"
+        elif test -f "$srcdir/$f"; then
+          # Source tree
+          echo "$srcdir/$f"
+        else
+          # /dev/null tree
+          { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5
+echo "$as_me: error: cannot find input file: $f" >&2;}
+   { (exit 1); exit 1; }; }
+        fi;;
+      esac
+    done` || { (exit 1); exit 1; }
+  # Remove the trailing spaces.
+  sed 's/[      ]*$//' $ac_file_inputs >$tmp/in
+
+_ACEOF
+
+# Transform confdefs.h into two sed scripts, `conftest.defines' and
+# `conftest.undefs', that substitutes the proper values into
+# config.h.in to produce config.h.  The first handles `#define'
+# templates, and the second `#undef' templates.
+# And first: Protect against being on the right side of a sed subst in
+# config.status.  Protect against being in an unquoted here document
+# in config.status.
+rm -f conftest.defines conftest.undefs
+# Using a here document instead of a string reduces the quoting nightmare.
+# Putting comments in sed scripts is not portable.
+#
+# `end' is used to avoid that the second main sed command (meant for
+# 0-ary CPP macros) applies to n-ary macro definitions.
+# See the Autoconf documentation for `clear'.
+cat >confdef2sed.sed <<\_ACEOF
+s/[\\&,]/\\&/g
+s,[\\$`],\\&,g
+t clear
+: clear
+s,^[    ]*#[    ]*define[       ][      ]*\([^  (][^    (]*\)\(([^)]*)\)[       ]*\(.*\)$,${ac_dA}\1${ac_dB}\1\2${ac_dC}\3${ac_dD},gp
+t end
+s,^[    ]*#[    ]*define[       ][      ]*\([^  ][^     ]*\)[   ]*\(.*\)$,${ac_dA}\1${ac_dB}\1${ac_dC}\2${ac_dD},gp
+: end
+_ACEOF
+# If some macros were called several times there might be several times
+# the same #defines, which is useless.  Nevertheless, we may not want to
+# sort them, since we want the *last* AC-DEFINE to be honored.
+uniq confdefs.h | sed -n -f confdef2sed.sed >conftest.defines
+sed 's/ac_d/ac_u/g' conftest.defines >conftest.undefs
+rm -f confdef2sed.sed
+
+# This sed command replaces #undef with comments.  This is necessary, for
+# example, in the case of _POSIX_SOURCE, which is predefined and required
+# on some systems where configure will not decide to define it.
+cat >>conftest.undefs <<\_ACEOF
+s,^[    ]*#[    ]*undef[        ][      ]*[a-zA-Z_][a-zA-Z_0-9]*,/* & */,
+_ACEOF
+
+# Break up conftest.defines because some shells have a limit on the size
+# of here documents, and old seds have small limits too (100 cmds).
+echo '  # Handle all the #define templates only if necessary.' >>$CONFIG_STATUS
+echo '  if grep "^[     ]*#[    ]*define" $tmp/in >/dev/null; then' >>$CONFIG_STATUS
+echo '  # If there are no defines, we may have an empty if/fi' >>$CONFIG_STATUS
+echo '  :' >>$CONFIG_STATUS
+rm -f conftest.tail
+while grep . conftest.defines >/dev/null
+do
+  # Write a limited-size here document to $tmp/defines.sed.
+  echo '  cat >$tmp/defines.sed <<CEOF' >>$CONFIG_STATUS
+  # Speed up: don't consider the non `#define' lines.
+  echo '/^[     ]*#[    ]*define/!b' >>$CONFIG_STATUS
+  # Work around the forget-to-reset-the-flag bug.
+  echo 't clr' >>$CONFIG_STATUS
+  echo ': clr' >>$CONFIG_STATUS
+  sed ${ac_max_here_lines}q conftest.defines >>$CONFIG_STATUS
+  echo 'CEOF
+  sed -f $tmp/defines.sed $tmp/in >$tmp/out
+  rm -f $tmp/in
+  mv $tmp/out $tmp/in
+' >>$CONFIG_STATUS
+  sed 1,${ac_max_here_lines}d conftest.defines >conftest.tail
+  rm -f conftest.defines
+  mv conftest.tail conftest.defines
+done
+rm -f conftest.defines
+echo '  fi # grep' >>$CONFIG_STATUS
+echo >>$CONFIG_STATUS
+
+# Break up conftest.undefs because some shells have a limit on the size
+# of here documents, and old seds have small limits too (100 cmds).
+echo '  # Handle all the #undef templates' >>$CONFIG_STATUS
+rm -f conftest.tail
+while grep . conftest.undefs >/dev/null
+do
+  # Write a limited-size here document to $tmp/undefs.sed.
+  echo '  cat >$tmp/undefs.sed <<CEOF' >>$CONFIG_STATUS
+  # Speed up: don't consider the non `#undef'
+  echo '/^[     ]*#[    ]*undef/!b' >>$CONFIG_STATUS
+  # Work around the forget-to-reset-the-flag bug.
+  echo 't clr' >>$CONFIG_STATUS
+  echo ': clr' >>$CONFIG_STATUS
+  sed ${ac_max_here_lines}q conftest.undefs >>$CONFIG_STATUS
+  echo 'CEOF
+  sed -f $tmp/undefs.sed $tmp/in >$tmp/out
+  rm -f $tmp/in
+  mv $tmp/out $tmp/in
+' >>$CONFIG_STATUS
+  sed 1,${ac_max_here_lines}d conftest.undefs >conftest.tail
+  rm -f conftest.undefs
+  mv conftest.tail conftest.undefs
+done
+rm -f conftest.undefs
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+  # Let's still pretend it is `configure' which instantiates (i.e., don't
+  # use $as_me), people would be surprised to read:
+  #    /* config.h.  Generated by config.status.  */
+  if test x"$ac_file" = x-; then
+    echo "/* Generated by configure.  */" >$tmp/config.h
+  else
+    echo "/* $ac_file.  Generated by configure.  */" >$tmp/config.h
+  fi
+  cat $tmp/in >>$tmp/config.h
+  rm -f $tmp/in
+  if test x"$ac_file" != x-; then
+    if diff $ac_file $tmp/config.h >/dev/null 2>&1; then
+      { echo "$as_me:$LINENO: $ac_file is unchanged" >&5
+echo "$as_me: $ac_file is unchanged" >&6;}
+    else
+      ac_dir=`(dirname "$ac_file") 2>/dev/null ||
+$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+        X"$ac_file" : 'X\(//\)[^/]' \| \
+        X"$ac_file" : 'X\(//\)$' \| \
+        X"$ac_file" : 'X\(/\)' \| \
+        .     : '\(.\)' 2>/dev/null ||
+echo X"$ac_file" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+         /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+         /^X\(\/\/\)$/{ s//\1/; q; }
+         /^X\(\/\).*/{ s//\1/; q; }
+         s/.*/./; q'`
+      { if $as_mkdir_p; then
+    mkdir -p "$ac_dir"
+  else
+    as_dir="$ac_dir"
+    as_dirs=
+    while test ! -d "$as_dir"; do
+      as_dirs="$as_dir $as_dirs"
+      as_dir=`(dirname "$as_dir") 2>/dev/null ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+        X"$as_dir" : 'X\(//\)[^/]' \| \
+        X"$as_dir" : 'X\(//\)$' \| \
+        X"$as_dir" : 'X\(/\)' \| \
+        .     : '\(.\)' 2>/dev/null ||
+echo X"$as_dir" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+         /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+         /^X\(\/\/\)$/{ s//\1/; q; }
+         /^X\(\/\).*/{ s//\1/; q; }
+         s/.*/./; q'`
+    done
+    test ! -n "$as_dirs" || mkdir $as_dirs
+  fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5
+echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;}
+   { (exit 1); exit 1; }; }; }
+
+      rm -f $ac_file
+      mv $tmp/config.h $ac_file
+    fi
+  else
+    cat $tmp/config.h
+    rm -f $tmp/config.h
+  fi
+done
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF
+
+#
+# CONFIG_COMMANDS section.
+#
+for ac_file in : $CONFIG_COMMANDS; do test "x$ac_file" = x: && continue
+  ac_dest=`echo "$ac_file" | sed 's,:.*,,'`
+  ac_source=`echo "$ac_file" | sed 's,[^:]*:,,'`
+  ac_dir=`(dirname "$ac_dest") 2>/dev/null ||
+$as_expr X"$ac_dest" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+        X"$ac_dest" : 'X\(//\)[^/]' \| \
+        X"$ac_dest" : 'X\(//\)$' \| \
+        X"$ac_dest" : 'X\(/\)' \| \
+        .     : '\(.\)' 2>/dev/null ||
+echo X"$ac_dest" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+         /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+         /^X\(\/\/\)$/{ s//\1/; q; }
+         /^X\(\/\).*/{ s//\1/; q; }
+         s/.*/./; q'`
+  { if $as_mkdir_p; then
+    mkdir -p "$ac_dir"
+  else
+    as_dir="$ac_dir"
+    as_dirs=
+    while test ! -d "$as_dir"; do
+      as_dirs="$as_dir $as_dirs"
+      as_dir=`(dirname "$as_dir") 2>/dev/null ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+        X"$as_dir" : 'X\(//\)[^/]' \| \
+        X"$as_dir" : 'X\(//\)$' \| \
+        X"$as_dir" : 'X\(/\)' \| \
+        .     : '\(.\)' 2>/dev/null ||
+echo X"$as_dir" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+         /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+         /^X\(\/\/\)$/{ s//\1/; q; }
+         /^X\(\/\).*/{ s//\1/; q; }
+         s/.*/./; q'`
+    done
+    test ! -n "$as_dirs" || mkdir $as_dirs
+  fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5
+echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;}
+   { (exit 1); exit 1; }; }; }
+
+  ac_builddir=.
+
+if test "$ac_dir" != .; then
+  ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'`
+  # A "../" for each directory in $ac_dir_suffix.
+  ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'`
+else
+  ac_dir_suffix= ac_top_builddir=
+fi
+
+case $srcdir in
+  .)  # No --srcdir option.  We are building in place.
+    ac_srcdir=.
+    if test -z "$ac_top_builddir"; then
+       ac_top_srcdir=.
+    else
+       ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'`
+    fi ;;
+  [\\/]* | ?:[\\/]* )  # Absolute path.
+    ac_srcdir=$srcdir$ac_dir_suffix;
+    ac_top_srcdir=$srcdir ;;
+  *) # Relative path.
+    ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix
+    ac_top_srcdir=$ac_top_builddir$srcdir ;;
+esac
+
+# Do not use `cd foo && pwd` to compute absolute paths, because
+# the directories may not exist.
+case `pwd` in
+.) ac_abs_builddir="$ac_dir";;
+*)
+  case "$ac_dir" in
+  .) ac_abs_builddir=`pwd`;;
+  [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";;
+  *) ac_abs_builddir=`pwd`/"$ac_dir";;
+  esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_top_builddir=${ac_top_builddir}.;;
+*)
+  case ${ac_top_builddir}. in
+  .) ac_abs_top_builddir=$ac_abs_builddir;;
+  [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;;
+  *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;;
+  esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_srcdir=$ac_srcdir;;
+*)
+  case $ac_srcdir in
+  .) ac_abs_srcdir=$ac_abs_builddir;;
+  [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;;
+  *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;;
+  esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_top_srcdir=$ac_top_srcdir;;
+*)
+  case $ac_top_srcdir in
+  .) ac_abs_top_srcdir=$ac_abs_builddir;;
+  [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;;
+  *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;;
+  esac;;
+esac
+
+
+  { echo "$as_me:$LINENO: executing $ac_dest commands" >&5
+echo "$as_me: executing $ac_dest commands" >&6;}
+  case $ac_dest in
+    default )
+# Makefile uses this timestamp file to record whether config.h is up to date.
+echo > stamp-h
+ ;;
+  esac
+done
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+
+{ (exit 0); exit 0; }
+_ACEOF
+chmod +x $CONFIG_STATUS
+ac_clean_files=$ac_clean_files_save
+
+
+# configure is writing to config.log, and then calls config.status.
+# config.status does its own redirection, appending to config.log.
+# Unfortunately, on DOS this fails, as config.log is still kept open
+# by configure, so config.status won't be able to write to it; its
+# output is simply discarded.  So we exec the FD to /dev/null,
+# effectively closing config.log, so it can be properly (re)opened and
+# appended to by config.status.  When coming back to configure, we
+# need to make the FD available again.
+if test "$no_create" != yes; then
+  ac_cs_success=:
+  ac_config_status_args=
+  test "$silent" = yes &&
+    ac_config_status_args="$ac_config_status_args --quiet"
+  exec 5>/dev/null
+  $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false
+  exec 5>>config.log
+  # Use ||, not &&, to avoid exiting from the if with $? = 1, which
+  # would make configure fail if this is the last instruction.
+  $ac_cs_success || { (exit 1); exit 1; }
+fi
+
diff --git a/configure.in b/configure.in
new file mode 100644 (file)
index 0000000..868773b
--- /dev/null
@@ -0,0 +1,296 @@
+dnl
+dnl Configure script for readline library
+dnl
+dnl report bugs to chet@po.cwru.edu
+dnl
+dnl Process this file with autoconf to produce a configure script.
+
+# Copyright (C) 1987-2005 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+# 02111-1307, USA.
+
+AC_REVISION([for Readline 5.2, version 2.61])
+
+AC_INIT(readline, 5.2, bug-readline@gnu.org)
+
+dnl make sure we are using a recent autoconf version
+AC_PREREQ(2.50)
+
+AC_CONFIG_SRCDIR(readline.h)
+AC_CONFIG_AUX_DIR(./support)
+AC_CONFIG_HEADERS(config.h)
+
+dnl update the value of RL_READLINE_VERSION in readline.h when this changes
+LIBVERSION=5.2
+
+AC_CANONICAL_HOST
+
+dnl configure defaults
+opt_curses=no
+opt_purify=no
+
+dnl arguments to configure
+AC_ARG_WITH(curses, AC_HELP_STRING([--with-curses], [use the curses library instead of the termcap library]), opt_curses=$withval)
+AC_ARG_WITH(purify, AC_HELP_STRING([--with-purify], [configure to postprocess with purify]), opt_purify=$withval)
+
+if test "$opt_curses" = "yes"; then
+       prefer_curses=yes
+fi
+
+if test "$opt_purify" = yes; then
+       PURIFY="purify"
+else
+       PURIFY=
+fi
+
+dnl option parsing for optional features
+opt_multibyte=yes
+opt_static_libs=yes
+opt_shared_libs=yes
+
+AC_ARG_ENABLE(multibyte, AC_HELP_STRING([--enable-multibyte], [enable multibyte characters if OS supports them]), opt_multibyte=$enableval)
+AC_ARG_ENABLE(shared, AC_HELP_STRING([--enable-shared], [build shared libraries [[default=YES]]]), opt_shared_libs=$enableval)
+AC_ARG_ENABLE(static, AC_HELP_STRING([--enable-static], [build static libraries [[default=YES]]]), opt_static_libs=$enableval)
+
+if test $opt_multibyte = no; then
+AC_DEFINE(NO_MULTIBYTE_SUPPORT)
+fi
+
+dnl load up the cross-building cache file -- add more cases and cache
+dnl files as necessary
+
+dnl Note that host and target machine are the same, and different than the
+dnl build machine.
+
+CROSS_COMPILE=
+if test "x$cross_compiling" = "xyes"; then
+    case "${host}" in
+    *-cygwin*)
+        cross_cache=${srcdir}/cross-build/cygwin.cache
+        ;;
+    *-mingw*)
+        cross_cache=${srcdir}/cross-build/mingw.cache
+        ;;
+    i[[3456]]86-*-beos*)
+        cross_cache=${srcdir}/cross-build/x86-beos.cache
+        ;;
+    *)  echo "configure: cross-compiling for $host is not supported" >&2
+        ;;
+    esac
+    if test -n "${cross_cache}" && test -r "${cross_cache}"; then
+        echo "loading cross-build cache file ${cross_cache}"
+        . ${cross_cache}
+    fi
+    unset cross_cache
+    CROSS_COMPILE='-DCROSS_COMPILING'
+    AC_SUBST(CROSS_COMPILE)
+fi
+
+echo ""
+echo "Beginning configuration for readline-$LIBVERSION for ${host_cpu}-${host_vendor}-${host_os}"
+echo ""
+
+# We want these before the checks, so the checks can modify their values.
+test -z "$CFLAGS" && CFLAGS=-g auto_cflags=1
+
+AC_PROG_MAKE_SET
+AC_PROG_CC
+dnl AC_AIX
+AC_MINIX
+
+# If we're using gcc and the user hasn't specified CFLAGS, add -O to CFLAGS.
+test -n "$GCC" && test -n "$auto_cflags" && CFLAGS="$CFLAGS -O"
+
+AC_PROG_GCC_TRADITIONAL
+AC_PROG_INSTALL
+AC_CHECK_PROG(AR, ar, , ar)
+dnl Set default for ARFLAGS, since autoconf does not have a macro for it.
+dnl This allows people to set it when running configure or make
+test -n "$ARFLAGS" || ARFLAGS="cr"
+AC_PROG_RANLIB
+
+MAKE_SHELL=/bin/sh
+AC_SUBST(MAKE_SHELL)
+
+AC_C_CONST
+AC_C_PROTOTYPES
+AC_C_CHAR_UNSIGNED
+
+AC_TYPE_SIGNAL
+
+AC_TYPE_SIZE_T
+AC_CHECK_TYPE(ssize_t, int)
+
+AC_HEADER_STDC
+
+AC_HEADER_STAT
+AC_HEADER_DIRENT
+
+AC_CHECK_FUNCS(fcntl kill lstat)
+AC_CHECK_FUNCS(memmove putenv select setenv setlocale \
+               strcasecmp strpbrk tcgetattr vsnprintf)
+AC_CHECK_FUNCS(isascii isxdigit)
+AC_CHECK_FUNCS(getpwent getpwnam getpwuid)
+
+AC_FUNC_STRCOLL
+
+AC_CHECK_HEADERS(fcntl.h unistd.h stdlib.h varargs.h stdarg.h string.h strings.h \
+               limits.h locale.h pwd.h memory.h termcap.h termios.h termio.h)
+AC_CHECK_HEADERS(sys/pte.h sys/stream.h sys/select.h sys/file.h)
+
+AC_CHECK_HEADERS(sys/ptem.h,,,
+[[
+#if HAVE_SYS_STREAM_H
+#  include <sys/stream.h>
+#endif
+]])
+
+BASH_SYS_SIGNAL_VINTAGE
+BASH_SYS_REINSTALL_SIGHANDLERS
+
+BASH_FUNC_POSIX_SETJMP
+BASH_FUNC_LSTAT
+BASH_FUNC_STRCOLL
+BASH_FUNC_CTYPE_NONASCII
+
+BASH_CHECK_GETPW_FUNCS
+
+AC_HEADER_TIOCGWINSZ
+
+BASH_TYPE_SIGHANDLER
+BASH_HAVE_TIOCSTAT
+BASH_HAVE_FIONREAD
+BASH_CHECK_SPEED_T
+BASH_STRUCT_WINSIZE
+BASH_STRUCT_DIRENT_D_INO
+BASH_STRUCT_DIRENT_D_FILENO
+
+dnl yuck
+case "$host_os" in
+aix*)   prefer_curses=yes ;;
+esac
+BASH_CHECK_LIB_TERMCAP
+if test "$TERMCAP_LIB" = "./lib/termcap/libtermcap.a"; then
+       if test "$prefer_curses" = yes; then
+               TERMCAP_LIB=-lcurses
+       else
+               TERMCAP_LIB=-ltermcap   #default
+       fi
+fi
+
+BASH_CHECK_MULTIBYTE
+
+case "$host_cpu" in
+*cray*)        LOCAL_CFLAGS=-DCRAY ;;
+*s390*) LOCAL_CFLAGS=-fsigned-char ;;
+esac
+
+case "$host_os" in
+isc*)  LOCAL_CFLAGS=-Disc386 ;;
+esac
+
+# shared library configuration section
+#
+# Shared object configuration section.  These values are generated by
+# ${srcdir}/support/shobj-conf
+#
+if test -f ${srcdir}/support/shobj-conf; then
+        AC_MSG_CHECKING(configuration for building shared libraries)
+        eval `TERMCAP_LIB=$TERMCAP_LIB ${CONFIG_SHELL-/bin/sh} ${srcdir}/support/shobj-conf -C "${CC}" -c ${host_cpu} -o ${host_os} -v ${host_vendor}`
+
+#      case "$SHLIB_LIBS" in
+#      *curses*|*termcap*|*termlib*)   ;;
+#      *)                      SHLIB_LIBS="$SHLIB_LIBS $TERMCAP_LIB" ;;
+#      esac
+       
+        AC_SUBST(SHOBJ_CC)
+        AC_SUBST(SHOBJ_CFLAGS)
+        AC_SUBST(SHOBJ_LD)
+        AC_SUBST(SHOBJ_LDFLAGS)
+       AC_SUBST(SHOBJ_XLDFLAGS)
+        AC_SUBST(SHOBJ_LIBS)
+        AC_SUBST(SHOBJ_STATUS)
+       AC_SUBST(SHLIB_STATUS)
+       AC_SUBST(SHLIB_XLDFLAGS)
+       AC_SUBST(SHLIB_DOT)
+       AC_SUBST(SHLIB_LIBPREF)
+       AC_SUBST(SHLIB_LIBSUFF)
+       AC_SUBST(SHLIB_LIBVERSION)
+       AC_SUBST(SHLIB_DLLVERSION)
+       AC_SUBST(SHLIB_LIBS)
+        AC_MSG_RESULT($SHLIB_STATUS)
+
+       # SHLIB_STATUS is either `supported' or `unsupported'.  If it's
+       # `unsupported', turn off any default shared library building
+       if test "$SHLIB_STATUS" = 'unsupported'; then
+               opt_shared_libs=no
+       fi
+
+       # shared library versioning
+       # quoted for m4 so I can use character classes
+       SHLIB_MAJOR=[`expr "$LIBVERSION" : '\([0-9]\)\..*'`]
+       SHLIB_MINOR=[`expr "$LIBVERSION" : '[0-9]\.\([0-9]\).*'`]
+       AC_SUBST(SHLIB_MAJOR)
+       AC_SUBST(SHLIB_MINOR)
+fi
+
+if test "$opt_static_libs" = "yes"; then
+       STATIC_TARGET=static
+       STATIC_INSTALL_TARGET=install-static
+fi
+if test "$opt_shared_libs" = "yes"; then
+       SHARED_TARGET=shared
+       SHARED_INSTALL_TARGET=install-shared
+fi
+
+AC_SUBST(STATIC_TARGET)
+AC_SUBST(SHARED_TARGET)
+AC_SUBST(STATIC_INSTALL_TARGET)
+AC_SUBST(SHARED_INSTALL_TARGET)
+
+case "$host_os" in
+msdosdjgpp*)   BUILD_DIR=`pwd.exe` ;;  # to prevent //d/path/file
+*)             BUILD_DIR=`pwd` ;;
+esac
+
+case "$BUILD_DIR" in
+*\ *)  BUILD_DIR=`echo "$BUILD_DIR" | sed 's: :\\\\ :g'` ;;
+*)     ;;
+esac
+
+AC_SUBST(PURIFY)
+AC_SUBST(BUILD_DIR)
+
+AC_SUBST(CFLAGS)
+AC_SUBST(LOCAL_CFLAGS)
+AC_SUBST(LOCAL_LDFLAGS)
+AC_SUBST(LOCAL_DEFS)
+
+AC_SUBST(AR)
+AC_SUBST(ARFLAGS)
+
+AC_SUBST(host_cpu)
+AC_SUBST(host_os)
+
+AC_SUBST(LIBVERSION)
+
+AC_SUBST(TERMCAP_LIB)
+
+AC_OUTPUT([Makefile doc/Makefile examples/Makefile shlib/Makefile],
+[
+# Makefile uses this timestamp file to record whether config.h is up to date.
+echo > stamp-h
+])
diff --git a/debian/README.Debian b/debian/README.Debian
new file mode 100644 (file)
index 0000000..bd2514b
--- /dev/null
@@ -0,0 +1,54 @@
+A kind of FAQ for libreadline on Debian GNU/{Linux,Hurd}
+--------------------------------------------------------
+
+0. symlinked directory completion behavior
+
+   Starting with readline-4.2a, completion on symlinks that point
+   to directories does not append the slash. To restore the behaviour
+   found in readline-4.2, add to /etc/inputrc or ~/.inputrc:
+
+       set mark-symlinked-directories on
+
+1. reenable the paren matching feature in readline-4.1
+
+   Add to /etc/inputrc or ~/.inputrc:
+
+       set blink-matching-paren on
+
+2. key bindings for ESC
+
+   Consider the following .inputrc:
+
+   set editing-mode vi
+
+   keymap vi
+       "\M-[D":        backward-char
+       "\M-[C":        forward-char
+       "\M-[A":        previous-history
+       "\M-[B":        next-history
+
+   And, just to be certain, set -o reports that vi is on.
+
+   However, ESC k does not send me to the previous line.
+
+   I'm guessing that this is a conflict between bash's concept of a meta
+   keymap and its concept of vi's command-mode character -- which is to
+   say that its data structures don't properly reflect its implementation.
+
+   Note that if I remove the meta prefix, leaving lines like:
+       "[A":        previous-history
+
+   That vi command mode keys work fine, and I can use the arrow keys in vi
+   mode, *provided I'm already in command mode already*.  In other words,
+   bash is doing something wrong here such that it doesn't see the escape
+   character at the begining of the key sequence even when in vi insert mode.
+
+   Comment from the upstream author: "This guy destroyed the key binding for
+   ESC, which effectively disabled vi command mode.  It's not as simple as he
+   paints it to be -- the binding for ESC in the vi insertion keymap *must*
+   be a function because of the other things needed when switching
+   from insert mode to command mode.
+
+   If he wants to change something in vi's command mode, he needs
+   to use `set keymap vi-command' and enter key bindings without
+   the \M- prefix (as he discovered)."
diff --git a/debian/changelog b/debian/changelog
new file mode 100644 (file)
index 0000000..375584a
--- /dev/null
@@ -0,0 +1,501 @@
+readline5 (5.2-5slp2+s1) unstable; urgency=low
+
+  * Set myself as SLP maintainer.
+  * Don't build lib32* and lib64* packages on x86.
+  * Git: 165.213.180.234:/git/slp/pkgs/readline5
+  * Tag: readline5_5.2-5slp2+s1
+
+ -- Rafal Krypa <r.krypa@samsung.com>  Tue, 23 Nov 2010 19:05:05 +0900
+
+readline5 (5.2-5) unstable; urgency=medium
+
+  * On amd64, install 32bit libraries into /lib32 and /usr/lib32.
+    Closes: #533014.
+
+ -- Matthias Klose <doko@debian.org>  Sun, 28 Jun 2009 21:55:21 +0200
+
+readline5 (5.2-4) unstable; urgency=low
+
+  * Apply upstream patches up to readline52-013. Closes: #494934.
+  * Remove the patch introduced in 5.2-3.1, obsoleted by the upstream
+    patches.
+  * libreadline5-dev: Set priority to extra.
+
+ -- Matthias Klose <doko@debian.org>  Sat, 28 Feb 2009 19:00:38 +0100
+
+readline5 (5.2-3.1) unstable; urgency=low
+
+  * Non-maintainer upload.
+  * Apply rl-input-eventhook.dpatch: Fix input data validation when run with
+    rl_event_hook. Closes: #498277.
+
+ -- Arnaud Cornet <acornet@debian.org>  Sat, 10 Jan 2009 17:06:46 +0100
+
+readline5 (5.2-3) unstable; urgency=low
+
+  * Build-depend on gcc-multilib instead of lib{32,64}c*-dev-*.
+    Closes: #423995.
+  * Apply upstream patch readline52-001 (readline neglects to reallocate
+    the array it uses to keep track of wrapped screen lines when increasing
+    its size.  This will eventually result in segmentation faults when given
+    sufficiently long input.
+  * Apply upstream patch readline52-003 and readline52-004, fixes
+    for displaying the prompt.
+  * Link biarch builds against ncurses.
+
+ -- Matthias Klose <doko@debian.org>  Thu, 24 May 2007 23:49:39 +0200
+
+readline5 (5.2-2) unstable; urgency=low
+
+  * Apply upstream patch readline52-001 (incorrect display position
+    with multibyte characters).
+
+ -- Matthias Klose <doko@debian.org>  Tue, 19 Dec 2006 16:28:28 +0100
+
+readline5 (5.2-1) unstable; urgency=low
+
+  * New upstream version.
+  * Removed patches applied upstream: rlfe-pts, rl-inputrc.
+  * readline-common: Don't conflict with libreadine4, keep the replaces;
+    eases upgrades from MySQL 5 databases. Closes: #387966.
+
+ -- Matthias Klose <doko@debian.org>  Sat, 28 Oct 2006 13:54:43 +0200
+
+readline5 (5.1-9) unstable; urgency=low
+
+  * Fix libc dependencies for the lib32readline5{,-dev} packages.
+    Closes: #386345.
+  * Set DEB_BUILD_GNU_TYPE. Closes: #390372.
+
+ -- Matthias Klose <doko@debian.org>  Sun, 10 Sep 2006 21:04:52 +0000
+
+readline5 (5.1-8) unstable; urgency=low
+
+  * Build 32bit packages for amd64 and ppc64. Closes: #384198.
+  * Apply cross-compilation fixes, but keep the dependency on readline-common.
+    Closes: #358767.
+  * Fix build failure on ppc64. Closes: #361193.
+
+ -- Matthias Klose <doko@debian.org>  Mon,  4 Sep 2006 00:15:39 +0200
+
+readline5 (5.1-7) unstable; urgency=low
+
+  * Apply upstream patches 003, 004.
+  * Remove build dependency on ia32-libs-dev.
+
+ -- Matthias Klose <doko@debian.org>  Mon, 15 Mar 2006 23:39:50 +0000
+
+readline5 (5.1-6) unstable; urgency=low
+
+  * Apply upstream patch 002.
+  * Fix dangling symlinks in doc directory (closes: #346157, #346158).
+
+ -- Matthias Klose <doko@debian.org>  Tue,  7 Feb 2006 18:46:32 +0100
+
+readline5 (5.1-5) unstable; urgency=high
+
+  * Fix names of libc-dev packages in lib64readline5-dev dependencies.
+    Closes: #344723.
+
+ -- Matthias Klose <doko@debian.org>  Fri, 30 Dec 2005 00:23:24 +0100
+
+readline5 (5.1-4) unstable; urgency=low
+
+  * Add 32/64 bit build dependencies, lib64ncurses-dev doesn't yet depend
+    on it.
+
+ -- Matthias Klose <doko@debian.org>  Thu, 22 Dec 2005 18:36:32 +0000
+
+readline5 (5.1-3) unstable; urgency=medium
+
+  * Don't call dh_shlibdeps for the lib64readline5 package.
+  * Fix build on GNU/kFreeBSD. Closes: #343323.
+  * Fix callback interface (closes: #343477).
+
+ -- Matthias Klose <doko@debian.org>  Thu, 22 Dec 2005 17:29:52 +0100
+
+readline5 (5.1-2) unstable; urgency=low
+
+  * Don't check for cross compilation, when building for 64bit biarchs.
+  * Build 64bit packages for i386 and powerpc as well.
+  * /etc/inputrc: Activate bindings for forward-/backward-word,
+    when term=rxvt. Ubuntu #18927.
+
+ -- Matthias Klose <doko@debian.org>  Sat, 10 Dec 2005 00:03:36 +0100
+
+readline5 (5.1-1) unstable; urgency=low
+
+  * New upstream version (5.1 release).
+    - Works better with non-ASCII input (closes: #332635).
+  * readline-common conflicts/replaces libreadline-common (closes: #339452).
+
+ -- Matthias Klose <doko@debian.org>  Fri,  9 Dec 2005 21:22:24 +0100
+
+readline5 (5.0+5.1rc1-1) unstable; urgency=low
+
+  * New upstream version (5.1-rc1).
+    - Fix rlfe command line parsing (closes: #308315).
+  * Remove patches applied upstream: rl-del-backspace-policy.
+  * Remove /etc/inputrc on purge (closes: #334142).
+
+ -- Matthias Klose <doko@debian.org>  Fri, 11 Nov 2005 12:36:59 +0000
+
+readline5 (5.0+5.1b1-1) unstable; urgency=low
+
+  * New upstream version (5.1-beta1).
+
+ -- Matthias Klose <doko@debian.org>  Thu, 13 Oct 2005 16:03:09 +0200
+
+readline5 (5.0+5.1a1-1) unstable; urgency=low
+
+  * New upstream version (5.1-alpha1).
+  * Remove patches applied upstream:
+    - readline50-*, rl-setenv, rl-display, rl-self-insert, rl-examples.
+  * libreadline5 now depends on libreadline-common, now holding the
+    readline user documentation and the configuration file /etc/inputrc.
+  
+ -- Matthias Klose <doko@debian.org>  Sun, 11 Sep 2005 17:05:28 +0200
+
+readline5 (5.0-11) unstable; urgency=low
+
+  * libreadline5 now depends on readline-common, now holding the
+    readline user documentation and the configuration file /etc/inputrc.
+
+ -- Matthias Klose <doko@debian.org>  Sun, 11 Sep 2005 20:18:27 +0000
+
+readline5 (5.0-10) unstable; urgency=low
+
+  * Update support/config.* files (closes: #290910).
+
+ -- Matthias Klose <doko@debian.org>  Sun, 23 Jan 2005 09:58:30 +0100
+
+readline5 (5.0-9) unstable; urgency=low
+
+  * Fix bug in readline's self-insert command (addresses: #290103).
+  * Fix reference to upstream version (closes: #282252).
+  * Fix re-read-init-file (C-xC-r) not to read /etc/inputrc twice,
+    but /etc/inputrc and ~/.inputrc. Thanks to Vasco Pedro.
+  * rlfe: Use Unix98 pty naming (closes: #287434).
+
+ -- Matthias Klose <doko@debian.org>  Sun, 16 Jan 2005 13:01:21 +0100
+
+readline5 (5.0-8) unstable; urgency=low
+
+  * Fix segfault in the ``reverse-search-history'' feature of the readline
+    library, if the search string matches a previously entered command (ie
+    history) and must overflow the current screen width. Addresses: #288940.
+
+ -- Matthias Klose <doko@debian.org>  Wed, 12 Jan 2005 08:11:36 +0100
+
+readline5 (5.0-7) unstable; urgency=low
+
+  * Add build dependency on autotools-dev (closes: #281429).
+
+ -- Matthias Klose <doko@debian.org>  Mon, 15 Nov 2004 22:53:33 +0100
+
+readline5 (5.0-6) unstable; urgency=low
+
+  * Build-depend on texinfo (closes: #280867).
+
+ -- Matthias Klose <doko@debian.org>  Fri, 12 Nov 2004 08:47:26 +0100
+
+readline5 (5.0-5) unstable; urgency=high
+
+  * Remove the libreadline-common package, until sarge is released.
+    Install the man pages as readline5(3) and history5(3), install the
+    user manual as rl5userman. Closes: #279366.
+
+ -- Matthias Klose <doko@debian.org>  Thu, 11 Nov 2004 08:05:15 +0100
+
+readline5 (5.0-4) unstable; urgency=low
+
+  * Fix typo in rules file.
+
+ -- Matthias Klose <doko@debian.org>  Tue, 26 Oct 2004 07:35:50 +0200
+
+readline5 (5.0-3) unstable; urgency=low
+
+  * Prefer using setenv over putenv.
+
+ -- Matthias Klose <doko@debian.org>  Sun, 17 Oct 2004 11:09:20 +0200
+
+readline5 (5.0-2) unstable; urgency=medium
+
+  * Remove sgid bits from directories (closes: #274667).
+  * libreadline5 now depends on libreadline-common | libreadline4 (<< 4.3-13),
+    becoming installable in sarge, but leaving out the rluserman docs,
+    which is in libreadline-common (closes: #276536).
+
+ -- Matthias Klose <doko@debian.org>  Fri, 15 Oct 2004 00:09:16 +0200
+
+readline5 (5.0-1) unstable; urgency=low
+
+  * Package maintainers: Do not build-depend on libreadline5-dev, unless you
+    want to stick your package to unstable. readline is part of base and
+    therefore frozen for sarge.
+
+  * New upstream release.
+  * Bugs fixed in this release (and the alpha/beta releases):
+    - Fixed a bug that caused the prompt to overwrite previous output when the
+      output doesn't contain a newline and the locale supports multibyte
+      characters.  This same change fixes the problem of readline redisplay
+      slowing down dramatically as the line gets longer in multibyte locales.
+      Closes: #179883.
+    - Speedups to the multibyte character redisplay code. Closes: #154063.
+    - Fixed a problem with EOF detection when using rl_event_hook.
+      Closes: #144585.
+    - Display of multibyte character in readline prompts. Closes: #195678.
+    - Broken column output in UTF-8 locale. Closes: #161750.
+    - Fix a bug in the callback read-char interface. Closes: #172849.
+  * New shared object name. Obsoletes bug about changed symbol size.
+    Closes: #153974.
+  * Exported readline functions now have a rl_ prefix. Closes: #65484.
+
+ -- Matthias Klose <doko@debian.org>  Sun, 19 Sep 2004 11:48:34 +0200
+
+readline4 (4.3-6) unstable; urgency=low
+
+  * Fix package sections and priorities.
+  * Add support for freebsd (closes: #200537).
+  * Add package rlfe (closes: #154400).
+
+ -- Matthias Klose <doko@debian.org>  Fri, 26 Sep 2003 19:05:31 +0200
+
+readline4 (4.3-5) unstable; urgency=low
+
+  * Fix ~ command working in UTF-8 locales (closes: #175127).
+  * Apply upstream patches 001, 002, 003, 004, 005.
+  * Do not redefine __attribute__ (closes: #191209).
+
+ -- Matthias Klose <doko@debian.org>  Sun,  1 Jun 2003 09:39:44 +0200
+
+readline4 (4.3-5) unstable; urgency=low
+
+  * debian/patches/mbutil.dpatch: Fix segfault in mbutil.c.
+
+ -- Matthias Klose <doko@debian.org>  Tue, 24 Sep 2002 13:12:12 +0200
+
+readline4 (4.3-4) unstable; urgency=medium
+
+  * Apply upstream patches:
+    - Fix segfault (closes: #154462).
+    - Fix for repeating an edit in vi mode.
+  * Build dependency on 'mawk | awk' (closes: #154462).
+
+ -- Matthias Klose <doko@debian.org>  Wed, 31 Jul 2002 20:10:44 +0200
+
+readline4 (4.3-3) unstable; urgency=high
+
+  * Do it again. Really link against ncurses library.
+
+ -- Matthias Klose <doko@debian.org>  Sun, 21 Jul 2002 21:44:00 +0200
+
+readline4 (4.3-2) unstable; urgency=high
+
+  * Link against ncurses library.
+
+ -- Matthias Klose <doko@debian.org>  Sat, 20 Jul 2002 18:21:40 +0200
+
+readline4 (4.3-1) unstable; urgency=low
+
+  * New upstream version:
+    - Handle multibyte characters (obsoletes and closes: #113078).
+    - Implement toggable overwrite mode (closes: #36651).
+    - Fixed the event loop to handle the case where the input file descriptor
+      is invalidated (closes: #134615).
+    - Added some default key bindings for common escape sequences produced by
+      HOME and END keys (closes: #150429).
+  * Move debug library to /usr/lib/debug.
+
+ -- Matthias Klose <doko@debian.org>  Sat, 20 Jul 2002 12:40:06 +0200
+
+readline4 (4.2.91-1) unstable; urgency=low
+
+  * New upstream version (4.3 beta1).
+
+ -- Matthias Klose <doko@debian.org>  Fri, 31 May 2002 00:15:04 +0200
+
+readline4 (4.2a-5) unstable; urgency=low
+
+  * Adjust for netbsd linker options (closes: #130349).
+
+ -- Matthias Klose <doko@debian.org>  Sun,  3 Feb 2002 22:03:03 +0100
+
+readline4 (4.2a-4) unstable; urgency=high
+
+  * Taken from the current upstream sources: Make the symlinked directory
+    completion behavior introduced in readline-4.2a a user-settable option.
+    If `mark-symlinked-directories' is set to `on', the symlinked directory
+    completion behavior is disabled, and symlinks that point to directories
+    have a slash appended (closes: #120854, #123602).
+    Same severity as the bash upload (2.05-4), as bash depends on it.
+  * Introduced a new private (but global) variable, so the shlibs version
+    needs an update again.
+
+ -- Matthias Klose <doko@debian.org>  Sat, 12 Jan 2002 16:00:08 +0100
+
+readline4 (4.2a-3) unstable; urgency=medium
+
+  * 4.2a has a new variable `rl_readline_version', so the shlibs version
+    needs to be upgraded to (>= 4.2a).
+  * Don't rely on HAVE_CONFIG_H macro in installed headers (closes: #125398).
+  * Upstream: The completion code now attempts to do a better job of preserving
+    the case of the word the user typed if ignoring case in completions.
+    Closes: #74861.
+
+ -- Matthias Klose <doko@debian.org>  Fri, 21 Dec 2001 00:16:28 +0100
+
+readline4 (4.2a-2) unstable; urgency=high
+
+  * Update config.{sub,guess} from ftp://ftp.gnu.org/pub/gnu/config/.
+    Closes: #119847.
+
+ -- Matthias Klose <doko@debian.org>  Fri, 16 Nov 2001 19:00:07 +0100
+
+readline4 (4.2a-1) unstable; urgency=low
+
+  * Final release.
+  * This is mainly a bugfix and code cleanup release (as you can see
+    from the version number as well). Fixes the following Debian reports:
+    - readline doesn't ignore null prompts anymore (closes: #105231).
+    - Don't include -I/usr/include in CFLAGS.
+  * Fix location of upstream source in copyright file (closes: #118481).
+
+ -- Matthias Klose <doko@debian.org>  Wed, 14 Nov 2001 21:56:29 +0100
+
+readline4 (4.2a-0rc1) unstable; urgency=low
+
+  * New upstream (bug fix) version, release candidate.
+
+ -- Matthias Klose <doko@debian.org>  Fri,  2 Nov 2001 10:35:55 +0100
+
+readline4 (4.2a-0beta1) unstable; urgency=low
+
+  * New upstream (bug fix) version.
+  * Move manual pages to libreadline4 package (closes: #111303).
+
+ -- Matthias Klose <doko@debian.org>  Thu, 11 Oct 2001 22:51:21 +0200
+
+readline4 (4.2-5) unstable; urgency=low
+
+  * Include stdio.h in history.h (closes: #101166).
+  * libreadline4-dbg suggests libreadline4-dev (closes: #101790).
+
+ -- Matthias Klose <doko@debian.org>  Sat, 21 Jul 2001 19:02:53 +0200
+
+readline4 (4.2-4) unstable; urgency=low
+
+  * Fix tilde.h for C++ compatibility as well.
+
+ -- Matthias Klose <doko@debian.org>  Sat,  5 May 2001 01:03:03 +0200
+
+readline4 (4.2-3) unstable; urgency=low
+
+  * Fix header for C++ compatibility (closes #95048, #95758).
+  * Fixed upstream: closes #55626, #75346.
+
+ -- Matthias Klose <doko@debian.org>  Wed,  2 May 2001 23:06:00 +0200
+
+readline4 (4.2-2) unstable; urgency=low
+
+  * Tighten shlibs dependency to >= 4.2-2.
+
+ -- Matthias Klose <doko@debian.org>  Tue, 10 Apr 2001 00:37:22 +0200
+
+readline4 (4.2-1) unstable; urgency=low
+
+  * New upstream release.
+
+ -- Matthias Klose <doko@debian.org>  Mon,  9 Apr 2001 18:28:54 +0200
+
+readline4 (4.2-0beta2) unstable; urgency=low
+
+  * New upstream release 4.2-beta2.
+
+ -- Matthias Klose <doko@debian.org>  Thu, 29 Mar 2001 23:18:10 +0200
+
+readline4 (4.2-0) unstable; urgency=low
+
+  * New upstream release 4.2-beta1.
+
+ -- Matthias Klose <doko@debian.org>  Tue,  6 Feb 2001 21:12:58 +0100
+
+readline4 (4.1-4) unstable; urgency=low
+
+  * Fix build error.
+
+ -- Matthias Klose <doko@debian.org>  Mon, 20 Nov 2000 23:27:16 +0100
+
+readline4 (4.1-3) unstable; urgency=low
+
+  * debian/patches/rl-hurd-build.dpatch: Build on the Hurd (fixes #75342).
+
+ -- Matthias Klose <doko@debian.org>  Sat, 18 Nov 2000 12:55:16 +0100
+
+readline4 (4.1-2) unstable; urgency=low
+
+  * Include stdio.h in readline.h (fixes #70669).
+
+ -- Matthias Klose <doko@debian.org>  Mon,  9 Oct 2000 20:35:23 +0200
+
+readline4 (4.1-1) frozen unstable; urgency=low
+
+  * Final release. Documentation fixes.
+
+ -- Matthias Klose <doko@debian.org>  Mon, 20 Mar 2000 20:08:45 +0100
+
+readline4 (4.1-0beta5db1) frozen unstable; urgency=low
+
+  * Updated beta version.
+  * debian/control: Remove libreadline4-doc suggestions (fixes #57547, #57578).
+
+ -- Matthias Klose <doko@debian.org>  Sun, 20 Feb 2000 21:10:34 +0100
+
+readline4 (4.1-0beta3db3) unstable; urgency=low
+
+  * Update rl.ctrl-char patch from Dan Jacobowitz.
+    Fixes #54805, #54639, #54612.
+
+ -- Matthias Klose <doko@debian.org>  Wed, 12 Jan 2000 10:26:51 +0100
+
+readline4 (4.1-0beta3db2) unstable; urgency=low
+
+  * debian/control: libreadline4-dev depends on libncurses5-dev.
+
+ -- Matthias Klose <doko@debian.org>  Thu,  6 Jan 2000 12:11:29 +0100
+
+readline4 (4.1-0beta3db1) unstable; urgency=low
+
+  * New upstream version.
+  * Remove three patches integrated upstream.
+  * Reports fixed in upstream version: #16797, #22480, #47525.
+  * Put rluserman.info into library package (fixes: #32075).
+  * In lib/readline/chardefs.h do not assume char is signed (fixes #53253).
+
+ -- Matthias Klose <doko@debian.org>  Sat,  1 Jan 2000 16:22:30 +0100
+
+readline4 (4.0-0.1) experimental; urgency=low
+
+  * New upstream version.
+  * Fixed upstream (closes: #22480).
+  * Separated from bash package, since readline is available as a
+    separate source package upstream. The upstream author writes:
+    "It's not appropriate to build shared libraries from the readline
+     shipped with bash.  That is designed to be linked directly into bash."
+  * Make /usr/doc compatibility links.
+  * debian/patches/conf-update.dpatch: New config files from automake
+    (closes #33745).
+  * debian/rules: Add Build-Depends.
+  * debian/rules: Install info files with default perms (closes: #49879).
+  * readline headers fixed upstream (closes: #47525).
+  * debian/etc.inputrc: Document how to enable German umlauts. Should close
+    #38397?  Should close #33168, #36077 and #42775 as well? The first report
+    (33168) contains some more information how to get xemacs to work with 8bit.
+  * Support to build on the Hurd (closes: #35769).
+    Patch from Marcus.Brinkmann@ruhr-uni-bochum.de.
+  * debian/patches/rl-del-backspace-policy.dpatch: Handle Delete/Backspace
+    keys according to Debian policy.
+  * debian/patches/rl-paren-matching.dpatch: Turn on parens matching.
+  * debian/patches/rl-shell-memleak.dpatch: Fix memory leak.
+
+ -- Matthias Klose <doko@debian.org>  Sat, 20 Nov 1999 18:52:00 +0100
diff --git a/debian/compat b/debian/compat
new file mode 100644 (file)
index 0000000..b8626c4
--- /dev/null
@@ -0,0 +1 @@
+4
diff --git a/debian/control b/debian/control
new file mode 100644 (file)
index 0000000..f150a07
--- /dev/null
@@ -0,0 +1,140 @@
+Source: readline5
+Section: libs
+Priority: important
+Maintainer: Rafal Krypa <r.krypa@samsung.com>
+X-Original-Maintainer: Matthias Klose <doko@debian.org>
+Standards-Version: 3.7.2
+Build-Depends: debhelper (>= 4.1), dpatch, libncurses5-dev (>= 5.6), mawk | awk, texinfo, autotools-dev
+
+Package: libreadline5
+Architecture: any
+Depends: readline-common, ${shlibs:Depends}
+Section: libs
+Priority: important
+Description: GNU readline and history libraries, run-time libraries
+ The GNU readline library aids in the consistency of user interface
+ across discrete programs that need to provide a command line
+ interface.
+ .
+ The GNU history library provides a consistent user interface for
+ recalling lines of previously typed input.
+
+Package: lib64readline5
+Architecture: i386 powerpc s390 sparc
+Depends: readline-common, ${shlibs:Depends}
+Section: libs
+Priority: optional
+Description: GNU readline and history libraries, run-time libraries (64-bit)
+ The GNU readline library aids in the consistency of user interface
+ across discrete programs that need to provide a command line
+ interface.
+ .
+ The GNU history library provides a consistent user interface for
+ recalling lines of previously typed input.
+
+Package: readline-common
+Architecture: all
+Section: utils
+Depends: ${shlibs:Depends}
+Conflicts: libreadline5 (<< 5.0-11), libreadline-common
+Replaces: libreadline4 (<< 4.3-16), libreadline5 (<< 5.0-11), libreadline-common
+Priority: standard
+Description: GNU readline and history libraries, common files
+ The GNU readline library aids in the consistency of user interface
+ across discrete programs that need to provide a command line
+ interface.
+ .
+ The GNU history library provides a consistent user interface for
+ recalling lines of previously typed input.
+
+Package: libreadline5-dev
+Architecture: any
+Depends: libreadline5 (= ${Source-Version}), libncurses5-dev
+Conflicts: libreadline-dev
+Provides: libreadline-dev
+Section: libdevel
+Priority: extra
+Description: GNU readline and history libraries, development files
+ The GNU readline library aids in the consistency of user interface
+ across discrete programs that need to provide a command line
+ interface.
+ .
+ The GNU history library provides a consistent user interface for
+ recalling lines of previously typed input.
+ .
+ This package contains as well the readline documentation in info format.
+
+Package: lib64readline5-dev
+Architecture: i386 powerpc s390 sparc
+Depends: lib64readline5 (= ${Source-Version}), lib64ncurses5-dev, ${devxx:Depends}
+Provides: lib64readline-dev
+Conflicts: lib64readline-dev
+Replaces: libreadline5-dev (<< 4.1-6)
+Section: libdevel
+Priority: optional
+Description: GNU readline and history libraries, development files (64-bit)
+ The GNU readline library aids in the consistency of user interface
+ across discrete programs that need to provide a command line
+ interface.
+ .
+ The GNU history library provides a consistent user interface for
+ recalling lines of previously typed input.
+
+Package: libreadline5-dbg
+Architecture: any
+Depends: libreadline5 (= ${Source-Version})
+Conflicts: libreadline-dbg
+Provides: libreadline-dbg
+Suggests: libreadline5-dev
+Section: libdevel
+Priority: extra
+Description: GNU readline and history libraries, debugging libraries
+ The GNU readline library aids in the consistency of user interface
+ across discrete programs that need to provide a command line
+ interface.
+ .
+ The GNU history library provides a consistent user interface for
+ recalling lines of previously typed input.
+
+Package: rlfe
+Architecture: any
+Depends: ${shlibs:Depends}
+Section: utils
+Priority: optional
+Description: A front-end using readline to "cook" input lines for other programs
+ This tool lets you use history and line-editing in any text oriented
+ tool. This is especially useful with third-party proprietary tools that
+ cannot be distributed linked against readline. It is not perfect but it
+ works pretty well.
+ .
+ See the cle package for another program of that kind.
+
+Package: lib32readline5
+Architecture: amd64 ppc64
+Pre-Depends: ${lib32:Predep}
+Depends: readline-common, ${shlibs:Depends}
+Section: libs
+Priority: optional
+Description: GNU readline and history libraries, run-time libraries (32-bit)
+ The GNU readline library aids in the consistency of user interface
+ across discrete programs that need to provide a command line
+ interface.
+ .
+ The GNU history library provides a consistent user interface for
+ recalling lines of previously typed input.
+
+Package: lib32readline5-dev
+Architecture: amd64 ppc64
+Pre-Depends: ${lib32:Predep}
+Depends: lib32readline5 (= ${Source-Version}), lib32ncurses5-dev, ${devxx:Depends}
+Provides: lib32readline-dev
+Conflicts: lib32readline-dev
+Section: libdevel
+Priority: optional
+Description: GNU readline and history libraries, development files (32-bit)
+ The GNU readline library aids in the consistency of user interface
+ across discrete programs that need to provide a command line
+ interface.
+ .
+ The GNU history library provides a consistent user interface for
+ recalling lines of previously typed input.
diff --git a/debian/copyright b/debian/copyright
new file mode 100644 (file)
index 0000000..1f77474
--- /dev/null
@@ -0,0 +1,23 @@
+This is Debian GNU/Linux's prepackaged version of the FSF's GNU
+Readline library.
+
+This package was put together by Matthias Klose <doko@debian.org>, derived
+from the bash package by Guy Maor <maor@debian.org>, from the GNU sources at
+
+       ftp.gnu.org:/pub/gnu/readline/readline-5.0.tar.gz.
+
+The GNU Readline Library 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.
+
+The GNU Readline Library is distributed in the hope that it will be
+useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License with
+your Debian GNU/Linux system, in /usr/share/common-licenses/GPL, or with
+the Debian GNU/Linux bash source package as the file COPYING.  If not,
+write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
+Boston, A 02110-1301, USA.
diff --git a/debian/inputrc b/debian/inputrc
new file mode 100644 (file)
index 0000000..d4dd17b
--- /dev/null
@@ -0,0 +1,66 @@
+# /etc/inputrc - global inputrc for libreadline
+# See readline(3readline) and `info rluserman' for more information.
+
+# Be 8 bit clean.
+set input-meta on
+set output-meta on
+
+# To allow the use of 8bit-characters like the german umlauts, comment out
+# the line below. However this makes the meta key not work as a meta key,
+# which is annoying to those which don't need to type in 8-bit characters.
+
+# set convert-meta off
+
+# try to enable the application keypad when it is called.  Some systems
+# need this to enable the arrow keys.
+# set enable-keypad on
+
+# see /usr/share/doc/bash/inputrc.arrows for other codes of arrow keys
+
+# do not bell on tab-completion
+# set bell-style none
+# set bell-style visible
+
+# some defaults / modifications for the emacs mode
+$if mode=emacs
+
+# allow the use of the Home/End keys
+"\e[1~": beginning-of-line
+"\e[4~": end-of-line
+
+# allow the use of the Delete/Insert keys
+"\e[3~": delete-char
+"\e[2~": quoted-insert
+
+# mappings for "page up" and "page down" to step to the beginning/end
+# of the history
+# "\e[5~": beginning-of-history
+# "\e[6~": end-of-history
+
+# alternate mappings for "page up" and "page down" to search the history
+# "\e[5~": history-search-backward
+# "\e[6~": history-search-forward
+
+# mappings for Ctrl-left-arrow and Ctrl-right-arrow for word moving
+"\e[1;5C": forward-word
+"\e[1;5D": backward-word
+"\e[5C": forward-word
+"\e[5D": backward-word
+"\e\e[C": forward-word
+"\e\e[D": backward-word
+
+$if term=rxvt
+"\e[8~": end-of-line
+"\eOc": forward-word
+"\eOd": backward-word
+$endif
+
+# for non RH/Debian xterm, can't hurt for RH/Debian xterm
+# "\eOH": beginning-of-line
+# "\eOF": end-of-line
+
+# for freebsd console
+# "\e[H": beginning-of-line
+# "\e[F": end-of-line
+
+$endif
diff --git a/debian/inputrc.arrows b/debian/inputrc.arrows
new file mode 100644 (file)
index 0000000..21aed08
--- /dev/null
@@ -0,0 +1,30 @@
+# This file controls the behaviour of line input editing for
+# programs that use the Gnu Readline library.
+#
+# Arrow keys in keypad mode
+#
+"\C-[OD"        backward-char
+"\C-[OC"        forward-char
+"\C-[OA"        previous-history
+"\C-[OB"        next-history
+#
+# Arrow keys in ANSI mode
+#
+"\C-[[D"        backward-char
+"\C-[[C"        forward-char
+"\C-[[A"        previous-history
+"\C-[[B"        next-history
+#
+# Arrow keys in 8 bit keypad mode
+#
+"\C-M-OD"       backward-char
+"\C-M-OC"       forward-char
+"\C-M-OA"       previous-history
+"\C-M-OB"       next-history
+#
+# Arrow keys in 8 bit ANSI mode
+#
+"\C-M-[D"       backward-char
+"\C-M-[C"       forward-char
+"\C-M-[A"       previous-history
+"\C-M-[B"       next-history
diff --git a/debian/libreadline5-dev.postinst b/debian/libreadline5-dev.postinst
new file mode 100644 (file)
index 0000000..f7eb5a6
--- /dev/null
@@ -0,0 +1,9 @@
+#! /bin/sh -e
+
+install-info --quiet --section "Development" "Development" \
+  --description="GNU History Library" /usr/share/info/history.info.gz
+
+install-info --quiet --section "Development" "Development" \
+  --description="GNU Readline Library" /usr/share/info/readline.info.gz
+
+#DEBHELPER#
diff --git a/debian/libreadline5-dev.prerm b/debian/libreadline5-dev.prerm
new file mode 100644 (file)
index 0000000..842973a
--- /dev/null
@@ -0,0 +1,6 @@
+#! /bin/sh -e
+
+install-info --quiet --remove history
+install-info --quiet --remove readline
+
+#DEBHELPER#
diff --git a/debian/libreadline5.shlibs b/debian/libreadline5.shlibs
new file mode 100644 (file)
index 0000000..1c4924b
--- /dev/null
@@ -0,0 +1,2 @@
+libhistory     5       libreadline5 (>= 5.2)
+libreadline    5       libreadline5 (>= 5.2)
diff --git a/debian/patches/00list b/debian/patches/00list
new file mode 100644 (file)
index 0000000..c93e8c9
--- /dev/null
@@ -0,0 +1,18 @@
+rl-001
+rl-002
+rl-003
+rl-004
+rl-004
+rl-005
+rl-006
+rl-007
+rl-008
+rl-009
+rl-010
+rl-011
+rl-012
+rl-013
+rl-attribute
+rl-header
+rl-no-cross-check
+rl-no-rpath
diff --git a/debian/patches/rl-001 b/debian/patches/rl-001
new file mode 100644 (file)
index 0000000..a0321a3
--- /dev/null
@@ -0,0 +1,41 @@
+#! /bin/sh /usr/share/dpatch/dpatch-run
+## rl-001.dpatch by  <doko@ubuntu.com>
+##
+## All lines beginning with `## DP:' are a description of the patch.
+## DP: In some cases, code that is intended to be used in the presence of multibyte 
+## DP: characters is called when no such characters are present, leading to incorrect 
+## DP: display position calculations and incorrect redisplay. 
+
+
+@DPATCH@
+                          READLINE PATCH REPORT
+                          =====================
+
+Readline-Release: 5.2
+Patch-ID: readline52-001
+
+Bug-Reported-by:       ebb9@byu.net
+Bug-Reference-ID:      <45540862.9030900@byu.net>
+Bug-Reference-URL:     http://lists.gnu.org/archive/html/bug-bash/2006-11/msg00017.html
+                       http://lists.gnu.org/archive/html/bug-bash/2006-11/msg00016.html
+
+Bug-Description:
+
+In some cases, code that is intended to be used in the presence of multibyte
+characters is called when no such characters are present, leading to incorrect
+display position calculations and incorrect redisplay.
+
+Patch:
+
+*** ../readline-5.2/display.c  Thu Sep 14 14:20:12 2006
+--- ./display.c        Mon Nov 13 17:55:57 2006
+***************
+*** 2381,2384 ****
+--- 2409,2414 ----
+    if (end <= start)
+      return 0;
++   if (MB_CUR_MAX == 1 || rl_byte_oriented)
++     return (end - start);
+  
+    memset (&ps, 0, sizeof (mbstate_t));
+
diff --git a/debian/patches/rl-002 b/debian/patches/rl-002
new file mode 100644 (file)
index 0000000..4e3a129
--- /dev/null
@@ -0,0 +1,59 @@
+#! /bin/sh /usr/share/dpatch/dpatch-run
+## rl-001.dpatch by  <doko@ubuntu.com>
+##
+## All lines beginning with `## DP:' are a description of the patch.
+## DP: In some cases, code that is intended to be used in the presence of multibyte 
+## DP: characters is called when no such characters are present, leading to incorrect 
+## DP: display position calculations and incorrect redisplay. 
+
+
+@DPATCH@
+                          READLINE PATCH REPORT
+                          =====================
+
+Readline-Release: 5.2
+Patch-ID: readline52-002
+
+Bug-Reported-by: Magnus Svensson <msvensson@mysql.com>
+Bug-Reference-ID: <45BDC44D.80609@mysql.com>
+Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-readline/2007-01/msg00002.html
+
+Bug-Description:
+
+Readline neglects to reallocate the array it uses to keep track of wrapped
+screen lines when increasing its size.  This will eventually result in
+segmentation faults when given sufficiently long input.
+
+Patch:
+
+*** ../readline-5.2-patched/display.c  Thu Sep 14 14:20:12 2006
+--- ./display.c        Fri Feb  2 20:23:17 2007
+***************
+*** 561,574 ****
+--- 561,586 ----
+        wrap_offset = prompt_invis_chars_first_line = 0;
+      }
+  
++ #if defined (HANDLE_MULTIBYTE)
+  #define CHECK_INV_LBREAKS() \
+        do { \
+       if (newlines >= (inv_lbsize - 2)) \
+         { \
+           inv_lbsize *= 2; \
+           inv_lbreaks = (int *)xrealloc (inv_lbreaks, inv_lbsize * sizeof (int)); \
++          _rl_wrapped_line = (int *)xrealloc (_rl_wrapped_line, inv_lbsize * sizeof (int)); \
+         } \
+        } while (0)
++ #else
++ #define CHECK_INV_LBREAKS() \
++       do { \
++      if (newlines >= (inv_lbsize - 2)) \
++        { \
++          inv_lbsize *= 2; \
++          inv_lbreaks = (int *)xrealloc (inv_lbreaks, inv_lbsize * sizeof (int)); \
++        } \
++       } while (0)
++ #endif /* HANDLE_MULTIBYTE */
+  
+  #if defined (HANDLE_MULTIBYTE)         
+  #define CHECK_LPOS() \
diff --git a/debian/patches/rl-003 b/debian/patches/rl-003
new file mode 100644 (file)
index 0000000..69db893
--- /dev/null
@@ -0,0 +1,48 @@
+#! /bin/sh /usr/share/dpatch/dpatch-run
+## rl-003.dpatch by  <doko@ubuntu.com>
+##
+## All lines beginning with `## DP:' are a description of the patch.
+## DP: When moving the cursor, bash sometimes misplaces the cursor when the prompt
+## DP: contains two or more multibyte characters.  The particular circumstance that
+## DP: uncovered the problem was having the (multibyte) current directory name in
+## DP: the prompt string.
+
+
+@DPATCH@
+                          READLINE PATCH REPORT
+                          =====================
+
+Readline-Release: 5.2
+Patch-ID: readline52-003
+
+Bug-Reported-by: Peter Volkov <torre_cremata@mail.ru>
+Bug-Reference-ID: <1171795523.8021.18.camel@localhost>
+Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-bash/2007-02/msg00054.html
+
+Bug-Description:
+
+When moving the cursor, bash sometimes misplaces the cursor when the prompt
+contains two or more multibyte characters.  The particular circumstance that
+uncovered the problem was having the (multibyte) current directory name in
+the prompt string.
+
+Patch:
+
+*** ../readline-5.2.2/display.c        Fri Jan 19 13:34:50 2007
+--- ./display.c        Sat Mar 10 17:25:44 2007
+***************
+*** 1745,1749 ****
+      {
+        dpos = _rl_col_width (data, 0, new);
+!       if (dpos > prompt_last_invisible)              /* XXX - don't use woff here */
+       {
+         dpos -= woff;
+--- 1745,1752 ----
+      {
+        dpos = _rl_col_width (data, 0, new);
+!       /* Use NEW when comparing against the last invisible character in the
+!       prompt string, since they're both buffer indices and DPOS is a
+!       desired display position. */
+!       if (new > prompt_last_invisible)               /* XXX - don't use woff here */
+       {
+         dpos -= woff;
diff --git a/debian/patches/rl-004 b/debian/patches/rl-004
new file mode 100644 (file)
index 0000000..e8da0f2
--- /dev/null
@@ -0,0 +1,80 @@
+#! /bin/sh /usr/share/dpatch/dpatch-run
+## rl-004.dpatch by  <doko@ubuntu.com>
+##
+## All lines beginning with `## DP:' are a description of the patch.
+## DP: When restoring the original prompt after finishing an incremental search,
+## DP: bash sometimes places the cursor incorrectly if the primary prompt contains
+## DP: invisible characters.
+
+
+@DPATCH@
+                          READLINE PATCH REPORT
+                          =====================
+
+Readline-Release: 5.2
+Patch-ID: readline52-004
+
+Bug-Reported-by: Peter Volkov <torre_cremata@mail.ru>
+Bug-Reference-ID: <1173636022.7039.36.camel@localhost>
+Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-bash/2007-03/msg00039.html
+
+Bug-Description:
+
+When restoring the original prompt after finishing an incremental search,
+bash sometimes places the cursor incorrectly if the primary prompt contains
+invisible characters.
+
+Patch:
+
+*** ../readline-5.2.3/display.c        Fri Apr 20 13:30:16 2007
+--- ./display.c        Fri Apr 20 15:17:01 2007
+***************
+*** 1599,1604 ****
+         if (temp > 0)
+           {
+             _rl_output_some_chars (nfd, temp);
+!            _rl_last_c_pos += _rl_col_width (nfd, 0, temp);;
+           }
+       }
+--- 1599,1618 ----
+         if (temp > 0)
+           {
++            /* If nfd begins at the prompt, or before the invisible
++               characters in the prompt, we need to adjust _rl_last_c_pos
++               in a multibyte locale to account for the wrap offset and
++               set cpos_adjusted accordingly. */
+             _rl_output_some_chars (nfd, temp);
+!            if (MB_CUR_MAX > 1 && rl_byte_oriented == 0)
+!              {
+!                   _rl_last_c_pos += _rl_col_width (nfd, 0, temp);
+!                   if (current_line == 0 && wrap_offset &&  ((nfd - new) <= prompt_last_invisible))
+!                  {
+!                    _rl_last_c_pos -= wrap_offset;
+!                    cpos_adjusted = 1;
+!                  }
+!              }
+!               else
+!                 _rl_last_c_pos += temp;
+           }
+       }
+***************
+*** 1608,1613 ****
+--- 1622,1639 ----
+         if (temp > 0)
+           {
++            /* If nfd begins at the prompt, or before the invisible
++               characters in the prompt, we need to adjust _rl_last_c_pos
++               in a multibyte locale to account for the wrap offset and
++               set cpos_adjusted accordingly. */
+             _rl_output_some_chars (nfd, temp);
+             _rl_last_c_pos += col_temp;               /* XXX */
++            if (MB_CUR_MAX > 1 && rl_byte_oriented == 0)
++              {
++                if (current_line == 0 && wrap_offset &&  ((nfd - new) <= prompt_last_invisible))
++                  {
++                    _rl_last_c_pos -= wrap_offset;
++                    cpos_adjusted = 1;
++                  }
++              }
+           }
+         lendiff = (oe - old) - (ne - new);
diff --git a/debian/patches/rl-005 b/debian/patches/rl-005
new file mode 100644 (file)
index 0000000..b11750c
--- /dev/null
@@ -0,0 +1,335 @@
+#! /bin/sh /usr/share/dpatch/dpatch-run
+## rl-005.dpatch by  <doko@ubuntu.com>
+##
+## All lines beginning with `## DP:' are a description of the patch.
+## DP: readline upstream patch readline52-005.
+
+@DPATCH@
+                          READLINE PATCH REPORT
+                          =====================
+
+Readline-Release: 5.2
+Patch-ID: readline52-005
+
+Bug-Reported-by:        Thomas Loeber <ifp@loeber1.de>
+Bug-Reference-ID:       <200703082223.08919.ifp@loeber1.de>
+Bug-Reference-URL:     http://lists.gnu.org/archive/html/bug-bash/2007-03/msg00036.html
+
+Bug-Description:
+
+When rl_read_key returns -1, indicating that readline's controlling terminal
+has been invalidated for some reason (e.g., receiving a SIGHUP), the error
+status was not reported correctly to the caller.  This could cause input
+loops. 
+
+Patch:
+
+*** ../readline-5.2/complete.c Fri Jul 28 11:35:49 2006
+--- ./complete.c       Tue Mar 13 08:50:16 2007
+***************
+*** 429,433 ****
+        if (c == 'n' || c == 'N' || c == RUBOUT)
+       return (0);
+!       if (c == ABORT_CHAR)
+       _rl_abort_internal ();
+        if (for_pager && (c == NEWLINE || c == RETURN))
+--- 440,444 ----
+        if (c == 'n' || c == 'N' || c == RUBOUT)
+       return (0);
+!       if (c == ABORT_CHAR || c < 0)
+       _rl_abort_internal ();
+        if (for_pager && (c == NEWLINE || c == RETURN))
+*** ../readline-5.2/input.c    Wed Aug 16 15:15:16 2006
+--- ./input.c  Wed May  2 16:07:59 2007
+***************
+*** 514,518 ****
+       int size;
+  {
+!   int mb_len = 0;
+    size_t mbchar_bytes_length;
+    wchar_t wc;
+--- 522,526 ----
+       int size;
+  {
+!   int mb_len, c;
+    size_t mbchar_bytes_length;
+    wchar_t wc;
+***************
+*** 521,531 ****
+    memset(&ps, 0, sizeof (mbstate_t));
+    memset(&ps_back, 0, sizeof (mbstate_t));
+!   
+    while (mb_len < size)
+      {
+        RL_SETSTATE(RL_STATE_MOREINPUT);
+!       mbchar[mb_len++] = rl_read_key ();
+        RL_UNSETSTATE(RL_STATE_MOREINPUT);
+  
+        mbchar_bytes_length = mbrtowc (&wc, mbchar, mb_len, &ps);
+        if (mbchar_bytes_length == (size_t)(-1))
+--- 529,545 ----
+    memset(&ps, 0, sizeof (mbstate_t));
+    memset(&ps_back, 0, sizeof (mbstate_t));
+! 
+!   mb_len = 0;  
+    while (mb_len < size)
+      {
+        RL_SETSTATE(RL_STATE_MOREINPUT);
+!       c = rl_read_key ();
+        RL_UNSETSTATE(RL_STATE_MOREINPUT);
+  
++       if (c < 0)
++      break;
++ 
++       mbchar[mb_len++] = c;
++ 
+        mbchar_bytes_length = mbrtowc (&wc, mbchar, mb_len, &ps);
+        if (mbchar_bytes_length == (size_t)(-1))
+***************
+*** 565,569 ****
+    c = first;
+    memset (mb, 0, mlen);
+!   for (i = 0; i < mlen; i++)
+      {
+        mb[i] = (char)c;
+--- 579,583 ----
+    c = first;
+    memset (mb, 0, mlen);
+!   for (i = 0; c >= 0 && i < mlen; i++)
+      {
+        mb[i] = (char)c;
+*** ../readline-5.2/isearch.c  Mon Dec 26 17:18:53 2005
+--- ./isearch.c        Fri Mar  9 14:30:59 2007
+***************
+*** 328,333 ****
+  
+    f = (rl_command_func_t *)NULL;
+!  
+!  /* Translate the keys we do something with to opcodes. */
+    if (c >= 0 && _rl_keymap[c].type == ISFUNC)
+      {
+--- 328,340 ----
+  
+    f = (rl_command_func_t *)NULL;
+! 
+!   if (c < 0)
+!     {
+!       cxt->sflags |= SF_FAILED;
+!       cxt->history_pos = cxt->last_found_line;
+!       return -1;
+!     }
+! 
+!   /* Translate the keys we do something with to opcodes. */
+    if (c >= 0 && _rl_keymap[c].type == ISFUNC)
+      {
+*** ../readline-5.2/misc.c     Mon Dec 26 17:20:46 2005
+--- ./misc.c   Fri Mar  9 14:44:11 2007
+***************
+*** 147,150 ****
+--- 147,152 ----
+         rl_clear_message ();
+         RL_UNSETSTATE(RL_STATE_NUMERICARG);
++        if (key < 0)
++          return -1;
+         return (_rl_dispatch (key, _rl_keymap));
+       }
+*** ../readline-5.2/readline.c Wed Aug 16 15:00:36 2006
+--- ./readline.c       Fri Mar  9 14:47:24 2007
+***************
+*** 646,649 ****
+--- 669,677 ----
+      {
+        nkey = _rl_subseq_getchar (cxt->okey);
++       if (nkey < 0)
++      {
++        _rl_abort_internal ();
++        return -1;
++      }
+        r = _rl_dispatch_subseq (nkey, cxt->dmap, cxt->subseq_arg);
+        cxt->flags |= KSEQ_DISPATCHED;
+*** ../readline-5.2/text.c     Fri Jul 28 11:55:27 2006
+--- ./text.c   Sun Mar 25 13:41:38 2007
+***************
+*** 858,861 ****
+--- 864,870 ----
+    RL_UNSETSTATE(RL_STATE_MOREINPUT);
+  
++   if (c < 0)
++     return -1;
++ 
+  #if defined (HANDLE_SIGNALS)
+    if (RL_ISSTATE (RL_STATE_CALLBACK) == 0)
+***************
+*** 1521,1524 ****
+--- 1530,1536 ----
+    mb_len = _rl_read_mbchar (mbchar, MB_LEN_MAX);
+  
++   if (mb_len <= 0)
++     return -1;
++ 
+    if (count < 0)
+      return (_rl_char_search_internal (-count, bdir, mbchar, mb_len));
+***************
+*** 1537,1540 ****
+--- 1549,1555 ----
+    RL_UNSETSTATE(RL_STATE_MOREINPUT);
+  
++   if (c < 0)
++     return -1;
++ 
+    if (count < 0)
+      return (_rl_char_search_internal (-count, bdir, c));
+*** ../readline-5.2/vi_mode.c  Sat Jul 29 16:42:28 2006
+--- ./vi_mode.c        Fri Mar  9 15:02:11 2007
+***************
+*** 887,890 ****
+--- 887,897 ----
+    c = rl_read_key ();
+    RL_UNSETSTATE(RL_STATE_MOREINPUT);
++ 
++   if (c < 0)
++     {
++       *nextkey = 0;
++       return -1;
++     }
++ 
+    *nextkey = c;
+  
+***************
+*** 903,906 ****
+--- 910,918 ----
+         c = rl_read_key ();   /* real command */
+         RL_UNSETSTATE(RL_STATE_MOREINPUT);
++        if (c < 0)
++          {
++            *nextkey = 0;
++            return -1;
++          }
+         *nextkey = c;
+       }
+***************
+*** 1225,1236 ****
+       _rl_callback_generic_arg *data;
+  {
+  #if defined (HANDLE_MULTIBYTE)
+!   _rl_vi_last_search_mblen = _rl_read_mbchar (_rl_vi_last_search_mbchar, MB_LEN_MAX);
+  #else
+    RL_SETSTATE(RL_STATE_MOREINPUT);
+!   _rl_vi_last_search_char = rl_read_key ();
+    RL_UNSETSTATE(RL_STATE_MOREINPUT);
+  #endif
+  
+    _rl_callback_func = 0;
+    _rl_want_redisplay = 1;
+--- 1243,1262 ----
+       _rl_callback_generic_arg *data;
+  {
++   int c;
+  #if defined (HANDLE_MULTIBYTE)
+!   c = _rl_vi_last_search_mblen = _rl_read_mbchar (_rl_vi_last_search_mbchar, MB_LEN_MAX);
+  #else
+    RL_SETSTATE(RL_STATE_MOREINPUT);
+!   c = rl_read_key ();
+    RL_UNSETSTATE(RL_STATE_MOREINPUT);
+  #endif
+  
++   if (c <= 0)
++     return -1;
++ 
++ #if !defined (HANDLE_MULTIBYTE)
++   _rl_vi_last_search_char = c;
++ #endif
++ 
+    _rl_callback_func = 0;
+    _rl_want_redisplay = 1;
+***************
+*** 1248,1251 ****
+--- 1274,1278 ----
+       int count, key;
+  {
++   int c;
+  #if defined (HANDLE_MULTIBYTE)
+    static char *target;
+***************
+*** 1294,1302 ****
+       {
+  #if defined (HANDLE_MULTIBYTE)
+!        _rl_vi_last_search_mblen = _rl_read_mbchar (_rl_vi_last_search_mbchar, MB_LEN_MAX);
+  #else
+         RL_SETSTATE(RL_STATE_MOREINPUT);
+!        _rl_vi_last_search_char = rl_read_key ();
+         RL_UNSETSTATE(RL_STATE_MOREINPUT);
+  #endif
+       }
+--- 1321,1335 ----
+       {
+  #if defined (HANDLE_MULTIBYTE)
+!        c = _rl_read_mbchar (_rl_vi_last_search_mbchar, MB_LEN_MAX);
+!        if (c <= 0)
+!          return -1;
+!        _rl_vi_last_search_mblen = c;
+  #else
+         RL_SETSTATE(RL_STATE_MOREINPUT);
+!        c = rl_read_key ();
+         RL_UNSETSTATE(RL_STATE_MOREINPUT);
++        if (c < 0)
++          return -1;
++        _rl_vi_last_search_char = c;
+  #endif
+       }
+***************
+*** 1468,1471 ****
+--- 1501,1507 ----
+    RL_UNSETSTATE(RL_STATE_MOREINPUT);
+  
++   if (c < 0)
++     return -1;
++ 
+  #if defined (HANDLE_MULTIBYTE)
+    if (MB_CUR_MAX > 1 && rl_byte_oriented == 0)
+***************
+*** 1486,1489 ****
+--- 1522,1528 ----
+    _rl_vi_last_replacement = c = _rl_vi_callback_getchar (mb, MB_LEN_MAX);
+  
++   if (c < 0)
++     return -1;
++ 
+    _rl_callback_func = 0;
+    _rl_want_redisplay = 1;
+***************
+*** 1517,1520 ****
+--- 1556,1562 ----
+      _rl_vi_last_replacement = c = _rl_vi_callback_getchar (mb, MB_LEN_MAX);
+  
++   if (c < 0)
++     return -1;
++ 
+    return (_rl_vi_change_char (count, c, mb));
+  }
+***************
+*** 1651,1655 ****
+    RL_UNSETSTATE(RL_STATE_MOREINPUT);
+  
+!   if (ch < 'a' || ch > 'z')
+      {
+        rl_ding ();
+--- 1693,1697 ----
+    RL_UNSETSTATE(RL_STATE_MOREINPUT);
+  
+!   if (ch < 0 || ch < 'a' || ch > 'z')        /* make test against 0 explicit */
+      {
+        rl_ding ();
+***************
+*** 1703,1707 ****
+        return 0;
+      }
+!   else if (ch < 'a' || ch > 'z')
+      {
+        rl_ding ();
+--- 1745,1749 ----
+        return 0;
+      }
+!   else if (ch < 0 || ch < 'a' || ch > 'z')   /* make test against 0 explicit */
+      {
+        rl_ding ();
diff --git a/debian/patches/rl-006 b/debian/patches/rl-006
new file mode 100644 (file)
index 0000000..71c06b8
--- /dev/null
@@ -0,0 +1,69 @@
+#! /bin/sh /usr/share/dpatch/dpatch-run
+## rl-006.dpatch by  <doko@ubuntu.com>
+##
+## All lines beginning with `## DP:' are a description of the patch.
+## DP: readline upstream patch readline52-006.
+
+@DPATCH@
+                          READLINE PATCH REPORT
+                          =====================
+
+Readline-Release: 5.2
+Patch-ID: readline52-006
+
+Bug-Reported-by:        Peter Volkov <torre_cremata@mail.ru>
+Bug-Reference-ID:       <1178376645.9063.25.camel@localhost>
+Bug-Reference-URL:      http://bugs.gentoo.org/177095
+
+Bug-Description:
+
+The readline display code miscalculated the screen position when performing
+a redisplay in which the new text occupies more screen space that the old,
+but takes fewer bytes to do so (e.g., when replacing a shorter string
+containing multibyte characters with a longer one containing only ASCII).
+
+Patch:
+
+*** ../readline-5.2/display.c  Thu Apr 26 11:38:22 2007
+--- ./display.c        Thu Jul 12 23:10:10 2007
+***************
+*** 1519,1527 ****
+        /* Non-zero if we're increasing the number of lines. */
+        int gl = current_line >= _rl_vis_botlin && inv_botlin > _rl_vis_botlin;
+        /* Sometimes it is cheaper to print the characters rather than
+        use the terminal's capabilities.  If we're growing the number
+        of lines, make sure we actually cause the new line to wrap
+        around on auto-wrapping terminals. */
+!       if (_rl_terminal_can_insert && ((2 * col_temp) >= col_lendiff || _rl_term_IC) && (!_rl_term_autowrap || !gl))
+       {
+         /* If lendiff > prompt_visible_length and _rl_last_c_pos == 0 and
+--- 1568,1596 ----
+        /* Non-zero if we're increasing the number of lines. */
+        int gl = current_line >= _rl_vis_botlin && inv_botlin > _rl_vis_botlin;
++       /* If col_lendiff is > 0, implying that the new string takes up more
++       screen real estate than the old, but lendiff is < 0, meaning that it
++       takes fewer bytes, we need to just output the characters starting
++       from the first difference.  These will overwrite what is on the
++       display, so there's no reason to do a smart update.  This can really
++       only happen in a multibyte environment. */
++       if (lendiff < 0)
++      {
++        _rl_output_some_chars (nfd, temp);
++        _rl_last_c_pos += _rl_col_width (nfd, 0, temp);
++        /* If nfd begins before any invisible characters in the prompt,
++           adjust _rl_last_c_pos to account for wrap_offset and set
++           cpos_adjusted to let the caller know. */
++        if (current_line == 0 && wrap_offset && ((nfd - new) <= prompt_last_invisible))
++          {
++            _rl_last_c_pos -= wrap_offset;
++            cpos_adjusted = 1;
++          }
++        return;
++      }
+        /* Sometimes it is cheaper to print the characters rather than
+        use the terminal's capabilities.  If we're growing the number
+        of lines, make sure we actually cause the new line to wrap
+        around on auto-wrapping terminals. */
+!       else if (_rl_terminal_can_insert && ((2 * col_temp) >= col_lendiff || _rl_term_IC) && (!_rl_term_autowrap || !gl))
+       {
+         /* If lendiff > prompt_visible_length and _rl_last_c_pos == 0 and
diff --git a/debian/patches/rl-007 b/debian/patches/rl-007
new file mode 100644 (file)
index 0000000..263d96c
--- /dev/null
@@ -0,0 +1,72 @@
+#! /bin/sh /usr/share/dpatch/dpatch-run
+## rl-007.dpatch by  <doko@ubuntu.com>
+##
+## All lines beginning with `## DP:' are a description of the patch.
+## DP: readline upstream patch readline52-007.
+
+@DPATCH@
+                          READLINE PATCH REPORT
+                          =====================
+
+Readline-Release: 5.2
+Patch-ID: readline52-007
+
+Bug-Reported-by:        Tom Bjorkholm <tom.bjorkholm@ericsson.com>
+Bug-Reference-ID:       <AEA1A32F001C6B4F98614B5B80D7647D01C075E9@esealmw115.eemea.ericsson.se>
+Bug-Reference-URL:     http://lists.gnu.org/archive/html/bug-readline/2007-04/msg00004.html
+
+
+Bug-Description:
+
+An off-by-one error in readline's input buffering caused readline to drop
+each 511th character of buffered input (e.g., when pasting a large amount
+of data into a terminal window).
+
+Patch:
+
+*** ../readline-5.2/input.c    Wed Aug 16 15:15:16 2006
+--- ./input.c  Tue Jul 17 09:24:21 2007
+***************
+*** 134,139 ****
+  
+    *key = ibuffer[pop_index++];
+! 
+    if (pop_index >= ibuffer_len)
+      pop_index = 0;
+  
+--- 134,142 ----
+  
+    *key = ibuffer[pop_index++];
+! #if 0
+    if (pop_index >= ibuffer_len)
++ #else
++   if (pop_index > ibuffer_len)
++ #endif
+      pop_index = 0;
+  
+***************
+*** 251,255 ****
+       {
+         k = (*rl_getc_function) (rl_instream);
+!        rl_stuff_char (k);
+         if (k == NEWLINE || k == RETURN)
+           break;
+--- 254,259 ----
+       {
+         k = (*rl_getc_function) (rl_instream);
+!        if (rl_stuff_char (k) == 0)
+!          break;                      /* some problem; no more room */
+         if (k == NEWLINE || k == RETURN)
+           break;
+***************
+*** 374,378 ****
+--- 378,386 ----
+      }
+    ibuffer[push_index++] = key;
++ #if 0
+    if (push_index >= ibuffer_len)
++ #else
++   if (push_index > ibuffer_len)
++ #endif
+      push_index = 0;
+  
diff --git a/debian/patches/rl-008 b/debian/patches/rl-008
new file mode 100644 (file)
index 0000000..c3dc190
--- /dev/null
@@ -0,0 +1,77 @@
+#! /bin/sh /usr/share/dpatch/dpatch-run
+## rl-008.dpatch by  <doko@ubuntu.com>
+##
+## All lines beginning with `## DP:' are a description of the patch.
+## DP: readline upstream patch readline52-008.
+
+@DPATCH@
+                          READLINE PATCH REPORT
+                          =====================
+
+Readline-Release: 5.2
+Patch-ID: readline52-008
+
+Bug-Reported-by:       dAniel hAhler <ubuntu@thequod.de>
+Bug-Reference-ID:      <4702ED8A.5000503@thequod.de>
+Bug-Reference-URL:     https://bugs.launchpad.net/ubuntu/+source/bash/+bug/119938
+
+Bug-Description:
+
+When updating the display after displaying, for instance, a list of possible
+completions, readline will place the cursor at the wrong position if the
+prompt contains invisible characters and a newline.
+
+Patch:
+
+*** ../readline-5.2-patched/display.c  Mon Aug  6 14:26:29 2007
+--- ./display.c        Wed Oct 10 22:43:58 2007
+***************
+*** 1049,1053 ****
+             else
+               tx = nleft;
+!            if (_rl_last_c_pos > tx)
+               {
+                 _rl_backspace (_rl_last_c_pos - tx);  /* XXX */
+--- 1049,1053 ----
+             else
+               tx = nleft;
+!            if (tx >= 0 && _rl_last_c_pos > tx)
+               {
+                 _rl_backspace (_rl_last_c_pos - tx);  /* XXX */
+***************
+*** 1205,1209 ****
+  {
+    register char *ofd, *ols, *oe, *nfd, *nls, *ne;
+!   int temp, lendiff, wsatend, od, nd;
+    int current_invis_chars;
+    int col_lendiff, col_temp;
+--- 1205,1209 ----
+  {
+    register char *ofd, *ols, *oe, *nfd, *nls, *ne;
+!   int temp, lendiff, wsatend, od, nd, o_cpos;
+    int current_invis_chars;
+    int col_lendiff, col_temp;
+***************
+*** 1466,1469 ****
+--- 1466,1471 ----
+      }
+  
++   o_cpos = _rl_last_c_pos;
++ 
+    /* When this function returns, _rl_last_c_pos is correct, and an absolute
+       cursor postion in multibyte mode, but a buffer index when not in a
+***************
+*** 1475,1479 ****
+       invisible characters in the prompt string.  Let's see if setting this when
+       we make sure we're at the end of the drawn prompt string works. */
+!   if (current_line == 0 && MB_CUR_MAX > 1 && rl_byte_oriented == 0 && _rl_last_c_pos == prompt_physical_chars)
+      cpos_adjusted = 1;
+  #endif
+--- 1477,1483 ----
+       invisible characters in the prompt string.  Let's see if setting this when
+       we make sure we're at the end of the drawn prompt string works. */
+!   if (current_line == 0 && MB_CUR_MAX > 1 && rl_byte_oriented == 0 && 
+!       (_rl_last_c_pos > 0 || o_cpos > 0) &&
+!       _rl_last_c_pos == prompt_physical_chars)
+      cpos_adjusted = 1;
+  #endif
diff --git a/debian/patches/rl-009 b/debian/patches/rl-009
new file mode 100644 (file)
index 0000000..dc92fab
--- /dev/null
@@ -0,0 +1,52 @@
+#! /bin/sh /usr/share/dpatch/dpatch-run
+## rl-009.dpatch by  <doko@ubuntu.com>
+##
+## All lines beginning with `## DP:' are a description of the patch.
+## DP: readline upstream patch readline52-009.
+
+@DPATCH@
+                          READLINE PATCH REPORT
+                          =====================
+
+Readline-Release: 5.2
+Patch-ID: readline52-009
+
+Bug-Reported-by:       dAniel hAhler <ubuntu@thequod.de>
+Bug-Reference-ID:
+Bug-Reference-URL:
+
+Bug-Description:
+
+Under some circumstances, readline will incorrectly display a prompt string
+containing invisible characters after the final newline.
+
+Patch:
+
+*** ../readline-5.2-patched/display.c  2007-08-25 13:47:08.000000000 -0400
+--- ./display.c        2007-11-10 17:51:29.000000000 -0500
+***************
+*** 392,396 ****
+        local_prompt = expand_prompt (p, &prompt_visible_length,
+                                      &prompt_last_invisible,
+!                                     (int *)NULL,
+                                      &prompt_physical_chars);
+        c = *t; *t = '\0';
+--- 420,424 ----
+        local_prompt = expand_prompt (p, &prompt_visible_length,
+                                      &prompt_last_invisible,
+!                                     &prompt_invis_chars_first_line,
+                                      &prompt_physical_chars);
+        c = *t; *t = '\0';
+***************
+*** 399,403 ****
+        local_prompt_prefix = expand_prompt (prompt, &prompt_prefix_length,
+                                                  (int *)NULL,
+!                                                 &prompt_invis_chars_first_line,
+                                                  (int *)NULL);
+        *t = c;
+--- 427,431 ----
+        local_prompt_prefix = expand_prompt (prompt, &prompt_prefix_length,
+                                                  (int *)NULL,
+!                                                 (int *)NULL,
+                                                  (int *)NULL);
+        *t = c;
diff --git a/debian/patches/rl-010 b/debian/patches/rl-010
new file mode 100644 (file)
index 0000000..cc1c89a
--- /dev/null
@@ -0,0 +1,54 @@
+#! /bin/sh /usr/share/dpatch/dpatch-run
+## rl-010.dpatch by  <doko@ubuntu.com>
+##
+## All lines beginning with `## DP:' are a description of the patch.
+## DP: readline upstream patch readline52-010.
+
+@DPATCH@
+                          READLINE PATCH REPORT
+                          =====================
+
+Readline-Release: 5.2
+Patch-ID: readline52-010
+
+Bug-Reported-by:       Miroslav Lichvar <mlichvar@redhat.com>
+Bug-Reference-ID:      Fri, 02 Nov 2007 14:07:45 +0100
+Bug-Reference-URL:     http://lists.gnu.org/archive/html/bug-readline/2007-11/msg00000.html
+
+Bug-Description:
+
+In certain cases when outputting characters at the end of the line,
+e.g., when displaying the prompt string, readline positions the cursor
+incorrectly if the prompt string contains invisible characters and the
+text being drawn begins before the last invisible character in the line.
+
+Patch:
+
+*** ../readline-5.2-patched/display.c  2007-08-25 13:47:08.000000000 -0400
+--- ./display.c        2007-11-10 17:51:29.000000000 -0500
+***************
+*** 1566,1574 ****
+         else
+           {
+-            /* We have horizontal scrolling and we are not inserting at
+-               the end.  We have invisible characters in this line.  This
+-               is a dumb update. */
+             _rl_output_some_chars (nfd, temp);
+             _rl_last_c_pos += col_temp;
+             return;
+           }
+--- 1619,1632 ----
+         else
+           {
+             _rl_output_some_chars (nfd, temp);
+             _rl_last_c_pos += col_temp;
++            /* If nfd begins before any invisible characters in the prompt,
++               adjust _rl_last_c_pos to account for wrap_offset and set
++               cpos_adjusted to let the caller know. */
++            if (current_line == 0 && wrap_offset && ((nfd - new) <= prompt_last_invisible))
++              {
++                _rl_last_c_pos -= wrap_offset;
++                cpos_adjusted = 1;
++              }
+             return;
+           }
diff --git a/debian/patches/rl-011 b/debian/patches/rl-011
new file mode 100644 (file)
index 0000000..a03db77
--- /dev/null
@@ -0,0 +1,39 @@
+#! /bin/sh /usr/share/dpatch/dpatch-run
+## rl-011.dpatch by  <doko@ubuntu.com>
+##
+## All lines beginning with `## DP:' are a description of the patch.
+## DP: readline upstream patch readline52-011.
+
+@DPATCH@
+                          READLINE PATCH REPORT
+                          =====================
+
+Readline-Release: 5.2
+Patch-ID: readline52-011
+
+Bug-Reported-by:       Uwe Doering <gemini@geminix.org>
+Bug-Reference-ID:      <46F3DD72.2090801@geminix.org>
+Bug-Reference-URL:     http://lists.gnu.org/archive/html/bug-bash/2007-09/msg00102.html
+
+Bug-Description:
+
+There is an off-by-one error in the code that buffers characters received
+very quickly in succession, causing characters to be dropped.
+
+Patch:
+
+*** ../readline-5.2-patched/input.c    2007-08-25 13:47:10.000000000 -0400
+--- ./input.c  2007-10-12 22:55:25.000000000 -0400
+***************
+*** 155,159 ****
+        pop_index--;
+        if (pop_index < 0)
+!      pop_index = ibuffer_len - 1;
+        ibuffer[pop_index] = key;
+        return (1);
+--- 155,159 ----
+        pop_index--;
+        if (pop_index < 0)
+!      pop_index = ibuffer_len;
+        ibuffer[pop_index] = key;
+        return (1);
diff --git a/debian/patches/rl-012 b/debian/patches/rl-012
new file mode 100644 (file)
index 0000000..52c6e17
--- /dev/null
@@ -0,0 +1,157 @@
+#! /bin/sh /usr/share/dpatch/dpatch-run
+## rl-012.dpatch by  <doko@ubuntu.com>
+##
+## All lines beginning with `## DP:' are a description of the patch.
+## DP: readline upstream patch readline52-012.
+
+@DPATCH@
+                          READLINE PATCH REPORT
+                          =====================
+
+Readline-Release: 5.2
+Patch-ID: readline52-012
+
+Bug-Reported-by:       Chet Ramey <chet.ramey@case.edu>
+Bug-Reference-ID:
+Bug-Reference-URL:
+
+Bug-Description:
+
+This updates the options required to create shared libraries on several
+systems, including Mac OS X 10.5 (darwin9.x), FreeBSD, NetBSD, OpenBSD,
+AIX, and HP/UX.
+
+Patch:
+
+*** ../readline-5.2-patched/support/shobj-conf 2006-04-11 09:15:43.000000000 -0400
+--- ./support/shobj-conf       2007-12-06 23:46:41.000000000 -0500
+***************
+*** 11,15 ****
+  # chet@po.cwru.edu
+  
+! # Copyright (C) 1996-2002 Free Software Foundation, Inc.
+  #
+  # This program is free software; you can redistribute it and/or modify
+--- 11,15 ----
+  # chet@po.cwru.edu
+  
+! # Copyright (C) 1996-2007 Free Software Foundation, Inc.
+  #
+  # This program is free software; you can redistribute it and/or modify
+***************
+*** 115,119 ****
+       ;;
+  
+! freebsd2* | netbsd*)
+       SHOBJ_CFLAGS=-fpic
+       SHOBJ_LD=ld
+--- 115,119 ----
+       ;;
+  
+! freebsd2*)
+       SHOBJ_CFLAGS=-fpic
+       SHOBJ_LD=ld
+***************
+*** 126,130 ****
+  # FreeBSD-3.x ELF
+  freebsd[3-9]*|freebsdelf[3-9]*|freebsdaout[3-9]*|dragonfly*)
+!      SHOBJ_CFLAGS=-fpic
+       SHOBJ_LD='${CC}'
+  
+--- 126,130 ----
+  # FreeBSD-3.x ELF
+  freebsd[3-9]*|freebsdelf[3-9]*|freebsdaout[3-9]*|dragonfly*)
+!      SHOBJ_CFLAGS=-fPIC
+       SHOBJ_LD='${CC}'
+  
+***************
+*** 143,147 ****
+  
+  # Darwin/MacOS X
+! darwin8*)
+       SHOBJ_STATUS=supported
+       SHLIB_STATUS=supported
+--- 143,147 ----
+  
+  # Darwin/MacOS X
+! darwin[89]*)
+       SHOBJ_STATUS=supported
+       SHLIB_STATUS=supported
+***************
+*** 154,158 ****
+       SHLIB_LIBSUFF='dylib'
+  
+!      SHOBJ_LDFLAGS='-undefined dynamic_lookup'
+       SHLIB_XLDFLAGS='-dynamiclib -arch_only `/usr/bin/arch` -install_name $(libdir)/$@ -current_version $(SHLIB_MAJOR)$(SHLIB_MINOR) -compatibility_version $(SHLIB_MAJOR) -v'
+  
+--- 154,158 ----
+       SHLIB_LIBSUFF='dylib'
+  
+!      SHOBJ_LDFLAGS='-dynamiclib -dynamic -undefined dynamic_lookup -arch_only `/usr/bin/arch`'
+       SHLIB_XLDFLAGS='-dynamiclib -arch_only `/usr/bin/arch` -install_name $(libdir)/$@ -current_version $(SHLIB_MAJOR)$(SHLIB_MINOR) -compatibility_version $(SHLIB_MAJOR) -v'
+  
+***************
+*** 172,176 ****
+  
+       case "${host_os}" in
+!      darwin[78]*)    SHOBJ_LDFLAGS=''
+                       SHLIB_XLDFLAGS='-dynamiclib -arch_only `/usr/bin/arch` -install_name $(libdir)/$@ -current_version $(SHLIB_MAJOR)$(SHLIB_MINOR) -compatibility_version $(SHLIB_MAJOR) -v'
+                       ;;
+--- 172,176 ----
+  
+       case "${host_os}" in
+!      darwin[789]*)   SHOBJ_LDFLAGS=''
+                       SHLIB_XLDFLAGS='-dynamiclib -arch_only `/usr/bin/arch` -install_name $(libdir)/$@ -current_version $(SHLIB_MAJOR)$(SHLIB_MINOR) -compatibility_version $(SHLIB_MAJOR) -v'
+                       ;;
+***************
+*** 183,187 ****
+       ;;
+  
+! openbsd*)
+       SHOBJ_CFLAGS=-fPIC
+       SHOBJ_LD='${CC}'
+--- 183,187 ----
+       ;;
+  
+! openbsd*|netbsd*)
+       SHOBJ_CFLAGS=-fPIC
+       SHOBJ_LD='${CC}'
+***************
+*** 248,252 ****
+       ;;
+  
+! aix4.[2-9]*-*gcc*)           # lightly tested by jik@cisco.com
+       SHOBJ_CFLAGS=-fpic
+       SHOBJ_LD='ld'
+--- 248,252 ----
+       ;;
+  
+! aix4.[2-9]*-*gcc*|aix[5-9].*-*gcc*)          # lightly tested by jik@cisco.com
+       SHOBJ_CFLAGS=-fpic
+       SHOBJ_LD='ld'
+***************
+*** 259,263 ****
+       ;;
+  
+! aix4.[2-9]*)
+       SHOBJ_CFLAGS=-K
+       SHOBJ_LD='ld'
+--- 259,263 ----
+       ;;
+  
+! aix4.[2-9]*|aix[5-9].*)
+       SHOBJ_CFLAGS=-K
+       SHOBJ_LD='ld'
+***************
+*** 330,334 ****
+       # if you have problems linking here, moving the `-Wl,+h,$@' from
+       # SHLIB_XLDFLAGS to SHOBJ_LDFLAGS has been reported to work
+!      SHOBJ_LDFLAGS='-shared -Wl,-b -Wl,+s'
+  
+       SHLIB_XLDFLAGS='-Wl,+h,$@ -Wl,+b,$(libdir)'
+--- 330,334 ----
+       # if you have problems linking here, moving the `-Wl,+h,$@' from
+       # SHLIB_XLDFLAGS to SHOBJ_LDFLAGS has been reported to work
+!      SHOBJ_LDFLAGS='-shared -fpic -Wl,-b -Wl,+s'
+  
+       SHLIB_XLDFLAGS='-Wl,+h,$@ -Wl,+b,$(libdir)'
diff --git a/debian/patches/rl-013 b/debian/patches/rl-013
new file mode 100644 (file)
index 0000000..792fecc
--- /dev/null
@@ -0,0 +1,142 @@
+#! /bin/sh /usr/share/dpatch/dpatch-run
+## rl-013.dpatch by  <doko@ubuntu.com>
+##
+## All lines beginning with `## DP:' are a description of the patch.
+## DP: readline upstream patch readline52-013.
+
+@DPATCH@
+                          READLINE PATCH REPORT
+                          =====================
+
+Readline-Release: 5.2
+Patch-ID: readline52-013
+
+Bug-Reported-by:       slinkp <stuff@slinkp.com>
+Bug-Reference-ID:      <da52a26a-9f38-4861-a918-14d3482b539d@c65g2000hsa.googlegroups.com>
+Bug-Reference-URL:     http://lists.gnu.org/archive/html/bug-bash/2008-05/msg00085.html
+
+Bug-Description:
+
+The presence of invisible characters in a prompt longer than the screenwidth
+with invisible characters on the first and last prompt lines caused readline
+to place the cursor in the wrong physical location.
+
+Patch:
+
+*** ../readline-5.2-patched/display.c  2007-12-14 21:12:40.000000000 -0500
+--- ./display.c        2008-10-23 09:39:46.000000000 -0400
+***************
+*** 911,914 ****
+--- 944,951 ----
+            OFFSET (which has already been calculated above).  */
+  
++ #define INVIS_FIRST()        (prompt_physical_chars > _rl_screenwidth ? prompt_invis_chars_first_line : wrap_offset)
++ #define WRAP_OFFSET(line, offset)  ((line == 0) \
++                                      ? (offset ? INVIS_FIRST() : 0) \
++                                      : ((line == prompt_last_screen_line) ? wrap_offset-prompt_invis_chars_first_line : 0))
+  #define W_OFFSET(line, offset) ((line) == 0 ? offset : 0)
+  #define VIS_LLEN(l)  ((l) > _rl_vis_botlin ? 0 : (vis_lbreaks[l+1] - vis_lbreaks[l]))
+***************
+*** 945,949 ****
+                 _rl_last_c_pos > wrap_offset &&
+                 o_cpos < prompt_last_invisible)
+!              _rl_last_c_pos -= wrap_offset;
+                 
+             /* If this is the line with the prompt, we might need to
+--- 982,992 ----
+                 _rl_last_c_pos > wrap_offset &&
+                 o_cpos < prompt_last_invisible)
+!              _rl_last_c_pos -= prompt_invis_chars_first_line;        /* XXX - was wrap_offset */
+!            else if (linenum == prompt_last_screen_line && prompt_physical_chars > _rl_screenwidth &&
+!                      (MB_CUR_MAX > 1 && rl_byte_oriented == 0) &&
+!                      cpos_adjusted == 0 &&
+!                      _rl_last_c_pos != o_cpos &&
+!                      _rl_last_c_pos > (prompt_last_invisible - _rl_screenwidth - prompt_invis_chars_first_line))
+!              _rl_last_c_pos -= (wrap_offset-prompt_invis_chars_first_line);
+                 
+             /* If this is the line with the prompt, we might need to
+***************
+*** 1205,1209 ****
+  {
+    register char *ofd, *ols, *oe, *nfd, *nls, *ne;
+!   int temp, lendiff, wsatend, od, nd, o_cpos;
+    int current_invis_chars;
+    int col_lendiff, col_temp;
+--- 1264,1268 ----
+  {
+    register char *ofd, *ols, *oe, *nfd, *nls, *ne;
+!   int temp, lendiff, wsatend, od, nd, twidth, o_cpos;
+    int current_invis_chars;
+    int col_lendiff, col_temp;
+***************
+*** 1221,1225 ****
+      temp = _rl_last_c_pos;
+    else
+!     temp = _rl_last_c_pos - W_OFFSET(_rl_last_v_pos, visible_wrap_offset);
+    if (temp == _rl_screenwidth && _rl_term_autowrap && !_rl_horizontal_scroll_mode
+       && _rl_last_v_pos == current_line - 1)
+--- 1280,1284 ----
+      temp = _rl_last_c_pos;
+    else
+!     temp = _rl_last_c_pos - WRAP_OFFSET (_rl_last_v_pos, visible_wrap_offset);
+    if (temp == _rl_screenwidth && _rl_term_autowrap && !_rl_horizontal_scroll_mode
+       && _rl_last_v_pos == current_line - 1)
+***************
+*** 1587,1599 ****
+           {
+             _rl_output_some_chars (nfd + lendiff, temp - lendiff);
+- #if 1
+            /* XXX -- this bears closer inspection.  Fixes a redisplay bug
+               reported against bash-3.0-alpha by Andreas Schwab involving
+               multibyte characters and prompt strings with invisible
+               characters, but was previously disabled. */
+!            _rl_last_c_pos += _rl_col_width (nfd+lendiff, 0, temp-col_lendiff);
+! #else
+!            _rl_last_c_pos += _rl_col_width (nfd+lendiff, 0, temp-lendiff);
+! #endif
+           }
+       }
+--- 1648,1660 ----
+           {
+             _rl_output_some_chars (nfd + lendiff, temp - lendiff);
+            /* XXX -- this bears closer inspection.  Fixes a redisplay bug
+               reported against bash-3.0-alpha by Andreas Schwab involving
+               multibyte characters and prompt strings with invisible
+               characters, but was previously disabled. */
+!            if (MB_CUR_MAX > 1 && rl_byte_oriented == 0)
+!              twidth = _rl_col_width (nfd+lendiff, 0, temp-col_lendiff);
+!            else
+!              twidth = temp - lendiff;
+!            _rl_last_c_pos += twidth;
+           }
+       }
+***************
+*** 1789,1793 ****
+    int cpos, dpos;            /* current and desired cursor positions */
+  
+!   woff = W_OFFSET (_rl_last_v_pos, wrap_offset);
+    cpos = _rl_last_c_pos;
+  #if defined (HANDLE_MULTIBYTE)
+--- 1850,1854 ----
+    int cpos, dpos;            /* current and desired cursor positions */
+  
+!   woff = WRAP_OFFSET (_rl_last_v_pos, wrap_offset);
+    cpos = _rl_last_c_pos;
+  #if defined (HANDLE_MULTIBYTE)
+***************
+*** 1803,1807 ****
+        prompt string, since they're both buffer indices and DPOS is a
+        desired display position. */
+!       if (new > prompt_last_invisible)               /* XXX - don't use woff here */
+       {
+         dpos -= woff;
+--- 1864,1872 ----
+        prompt string, since they're both buffer indices and DPOS is a
+        desired display position. */
+!       if ((new > prompt_last_invisible) ||           /* XXX - don't use woff here */
+!        (prompt_physical_chars > _rl_screenwidth &&
+!         _rl_last_v_pos == prompt_last_screen_line &&
+!         wrap_offset != woff &&
+!         new > (prompt_last_invisible-_rl_screenwidth-wrap_offset)))
+       {
+         dpos -= woff;
diff --git a/debian/patches/rl-attribute.dpatch b/debian/patches/rl-attribute.dpatch
new file mode 100644 (file)
index 0000000..91a305b
--- /dev/null
@@ -0,0 +1,37 @@
+#! /bin/sh /usr/share/dpatch/dpatch-run
+## rl-attribute.dpatch by  <doko@debian.org>
+##
+## All lines beginning with `## DP:' are a description of the patch.
+## DP: Do not redefine __attribute__, define macro __rl_attribute__
+
+@DPATCH@
+diff -urNad readline5-5.2~/readline.h readline5-5.2/readline.h
+--- readline5-5.2~/readline.h  2006-08-16 21:16:59.000000000 +0200
++++ readline5-5.2/readline.h   2006-10-28 14:03:36.000000000 +0200
+@@ -373,7 +373,7 @@
+ extern int rl_crlf PARAMS((void));
+ #if defined (USE_VARARGS) && defined (PREFER_STDARG)
+-extern int rl_message (const char *, ...)  __attribute__((__format__ (printf, 1, 2)));
++extern int rl_message (const char *, ...)  __rl_attribute__((__format__ (printf, 1, 2)));
+ #else
+ extern int rl_message ();
+ #endif
+diff -urNad readline5-5.2~/rlstdc.h readline5-5.2/rlstdc.h
+--- readline5-5.2~/rlstdc.h    2003-05-30 21:08:02.000000000 +0200
++++ readline5-5.2/rlstdc.h     2006-10-28 14:03:36.000000000 +0200
+@@ -36,10 +36,10 @@
+ #  endif
+ #endif
+-#ifndef __attribute__
+-#  if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 8)
+-#    define __attribute__(x)
+-#  endif
++#if defined(__GNUC__) && __GNUC__ >= 2
++#  define __rl_attribute__(x) __attribute__(x)
++#else
++#  define __rl_attribute__(x)
+ #endif
+ #endif /* !_RL_STDC_H_ */
diff --git a/debian/patches/rl-header.dpatch b/debian/patches/rl-header.dpatch
new file mode 100644 (file)
index 0000000..82210c6
--- /dev/null
@@ -0,0 +1,29 @@
+#! /bin/sh /usr/share/dpatch/dpatch-run
+## rl-header.dpatch by  <doko@debian.org>
+##
+## All lines beginning with `## DP:' are a description of the patch.
+## DP: Include stdio.h in readline.h and history.h
+
+@DPATCH@
+diff -urNad readline5-5.2~/history.h readline5-5.2/history.h
+--- readline5-5.2~/history.h   2003-07-31 14:38:44.000000000 +0200
++++ readline5-5.2/history.h    2006-10-28 14:06:20.000000000 +0200
+@@ -32,6 +32,7 @@
+ #  include "rlstdc.h"
+ #  include "rltypedefs.h"
+ #else
++#  include <stdio.h>
+ #  include <readline/rlstdc.h>
+ #  include <readline/rltypedefs.h>
+ #endif
+diff -urNad readline5-5.2~/readline.h readline5-5.2/readline.h
+--- readline5-5.2~/readline.h  2006-08-16 21:16:59.000000000 +0200
++++ readline5-5.2/readline.h   2006-10-28 14:06:20.000000000 +0200
+@@ -33,6 +33,7 @@
+ #  include "keymaps.h"
+ #  include "tilde.h"
+ #else
++#  include <stdio.h>
+ #  include <readline/rlstdc.h>
+ #  include <readline/rltypedefs.h>
+ #  include <readline/keymaps.h>
diff --git a/debian/patches/rl-no-cross-check.dpatch b/debian/patches/rl-no-cross-check.dpatch
new file mode 100644 (file)
index 0000000..e829041
--- /dev/null
@@ -0,0 +1,19 @@
+#! /bin/sh /usr/share/dpatch/dpatch-run
+## rl-no-cross-check.dpatch by  <doko@salsa.net.local>
+##
+## All lines beginning with `## DP:' are a description of the patch.
+## DP: configure: Don't check for cross compilation
+
+@DPATCH@
+diff -urNad readline5-5.2~/configure readline5-5.2/configure
+--- readline5-5.2~/configure   2006-09-28 18:04:36.000000000 +0200
++++ readline5-5.2/configure    2006-10-28 14:20:05.000000000 +0200
+@@ -1938,7 +1938,7 @@
+ echo $ECHO_N "checking whether the C compiler works... $ECHO_C" >&6
+ # FIXME: These cross compiler hacks should be removed for Autoconf 3.0
+ # If not cross compiling, check that we can run a simple program.
+-if test "$cross_compiling" != yes; then
++if false && test "$cross_compiling" != yes; then
+   if { ac_try='./$ac_file'
+   { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+   (eval $ac_try) 2>&5
diff --git a/debian/patches/rl-no-rpath.dpatch b/debian/patches/rl-no-rpath.dpatch
new file mode 100644 (file)
index 0000000..782be5f
--- /dev/null
@@ -0,0 +1,19 @@
+#! /bin/sh /usr/share/dpatch/dpatch-run
+## rl-no-rpath.dpatch by  <doko@salsa.net.local>
+##
+## All lines beginning with `## DP:' are a description of the patch.
+## DP: Don't set a runtime path for linking the shared libraries
+
+@DPATCH@
+diff -urNad readline5-5.2~/support/shobj-conf readline5-5.2/support/shobj-conf
+--- readline5-5.2~/support/shobj-conf  2006-04-11 15:15:43.000000000 +0200
++++ readline5-5.2/support/shobj-conf   2006-10-28 14:21:36.000000000 +0200
+@@ -110,7 +110,7 @@
+       SHOBJ_LD='${CC}'
+       SHOBJ_LDFLAGS='-shared -Wl,-soname,$@'
+-      SHLIB_XLDFLAGS='-Wl,-rpath,$(libdir) -Wl,-soname,`basename $@ $(SHLIB_MINOR)`'
++      SHLIB_XLDFLAGS='-Wl,-soname,`basename $@ $(SHLIB_MINOR)`'
+       SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)$(SHLIB_MINOR)'
+       ;;
diff --git a/debian/readline-common.overrides b/debian/readline-common.overrides
new file mode 100644 (file)
index 0000000..f57ea05
--- /dev/null
@@ -0,0 +1 @@
+readline-common: manpage-section-mismatch
diff --git a/debian/readline-common.postinst b/debian/readline-common.postinst
new file mode 100644 (file)
index 0000000..8225dcf
--- /dev/null
@@ -0,0 +1,16 @@
+#! /bin/sh -e
+
+install_from_default() {
+  if [ ! -f $2 ]; then
+    cp -p $1 $2
+  fi
+}
+
+if [ "$1" = "configure" ] && [ "$2" = "" ]; then
+  install_from_default /usr/share/readline/inputrc /etc/inputrc
+fi
+
+install-info --quiet --section "Miscellaneous" "Miscellaneous" \
+  --description="GNU Readline Library API" /usr/share/info/rluserman.info.gz
+
+#DEBHELPER#
diff --git a/debian/readline-common.postrm b/debian/readline-common.postrm
new file mode 100644 (file)
index 0000000..9a19c2d
--- /dev/null
@@ -0,0 +1,8 @@
+#! /bin/sh -e
+
+case "$1" in
+    purge)
+       rm -f /etc/inputrc
+esac
+
+#DEBHELPER#
diff --git a/debian/readline-common.prerm b/debian/readline-common.prerm
new file mode 100644 (file)
index 0000000..975f30d
--- /dev/null
@@ -0,0 +1,5 @@
+#! /bin/sh -e
+
+install-info --quiet --remove rluserman
+
+#DEBHELPER#
diff --git a/debian/rl-inputrc.dpatch b/debian/rl-inputrc.dpatch
new file mode 100644 (file)
index 0000000..b51ddb1
--- /dev/null
@@ -0,0 +1,102 @@
+#! /bin/sh -e
+
+if [ $# -eq 3 -a "$2" = '-d' ]; then
+    pdir="-d $3"
+elif [ $# -ne 1 ]; then
+    echo >&2 "`basename $0`: script expects -patch|-unpatch as argument"
+    exit 1
+fi
+case "$1" in
+    -patch) patch $pdir -f --no-backup-if-mismatch -p3 < $0;;
+    -unpatch) patch $pdir -f --no-backup-if-mismatch -R -p3 < $0;;
+    *)
+       echo >&2 "`basename $0`: script expects -patch|-unpatch as argument"
+       exit 1
+esac
+exit 0
+
+# DP: Support for /etc/inputrc in addition to ~/inputrc
+
+diff -ur bash.saved/lib/readline/bind.c bash/lib/readline/bind.c
+--- bash.saved/lib/readline/bind.c     2005-01-16 13:18:30.000000000 +0100
++++ bash/lib/readline/bind.c   2005-01-16 13:21:43.000000000 +0100
+@@ -713,6 +713,9 @@
+ /* The last key bindings file read. */
+ static char *last_readline_init_file = (char *)NULL;
++/* Flag to read system init file */
++static int read_system_init_file = 0;
++
+ /* The file we're currently reading key bindings from. */
+ static const char *current_readline_init_file;
+ static int current_readline_init_include_level;
+@@ -780,7 +783,7 @@
+    to the first non-null filename from this list:
+      1. the filename used for the previous call
+      2. the value of the shell variable `INPUTRC'
+-     3. ~/.inputrc
++     3. /etc/inputrc and ~/.inputrc
+    If the file existed and could be opened and read, 0 is returned,
+    otherwise errno is returned. */
+ int
+@@ -791,14 +794,31 @@
+   if (filename == 0)
+     {
+       filename = last_readline_init_file;
+-      if (filename == 0)
++      if (filename == 0) {
+         filename = sh_get_env_value ("INPUTRC");
+-      if (filename == 0)
++      read_system_init_file = 0;
++      }
++      if (filename == 0) {
+       filename = DEFAULT_INPUTRC;
++      read_system_init_file = 1;
++      }
+     }
+-  if (*filename == 0)
++  if (*filename == 0) {
+     filename = DEFAULT_INPUTRC;
++    read_system_init_file = 1;
++  }
++
++  if (read_system_init_file)
++    if (filename == last_readline_init_file)
++      {
++      filename = savestring (filename);
++      _rl_read_init_file (SYSTEM_INPUTRC, 0);
++      free (last_readline_init_file);
++      last_readline_init_file = filename;
++      }
++    else
++      _rl_read_init_file (SYSTEM_INPUTRC, 0);
+ #if defined (__MSDOS__)
+   if (_rl_read_init_file (filename, 0) == 0)
+Only in bash/lib/readline: bind.c.orig
+Only in bash/lib/readline: bind.c.rej
+diff -ur bash.saved/lib/readline/doc/rluser.texi bash/lib/readline/doc/rluser.texi
+--- bash.saved/lib/readline/doc/rluser.texi    2005-01-16 13:18:30.000000000 +0100
++++ bash/lib/readline/doc/rluser.texi  2005-01-16 13:21:28.000000000 +0100
+@@ -336,7 +336,8 @@
+ @ifclear BashFeatures
+ file is taken from the value of the environment variable @env{INPUTRC}.  If
+ @end ifclear
+-that variable is unset, the default is @file{~/.inputrc}.
++that variable is unset, Readline will read both @file{/etc/inputrc} and 
++@file{~/.inputrc}.
+ When a program which uses the Readline library starts up, the
+ init file is read, and the key bindings are set.
+diff -ur bash.saved/lib/readline/rlconf.h bash/lib/readline/rlconf.h
+--- bash.saved/lib/readline/rlconf.h   2005-01-16 13:18:30.000000000 +0100
++++ bash/lib/readline/rlconf.h 2005-01-16 13:21:28.000000000 +0100
+@@ -39,6 +39,7 @@
+ /* The final, last-ditch effort file name for an init file. */
+ #define DEFAULT_INPUTRC "~/.inputrc"
++#define SYSTEM_INPUTRC "/etc/inputrc"
+ /* If defined, expand tabs to spaces. */
+ #define DISPLAY_TABS
diff --git a/debian/rlfe.1 b/debian/rlfe.1
new file mode 100644 (file)
index 0000000..26a20a1
--- /dev/null
@@ -0,0 +1,64 @@
+.TH RLFE 1
+.\" NAME should be all caps, SECTION should be 1-8, maybe w/ subsection
+.\" other parms are allowed: see man(7), man(1)
+.SH NAME
+rlfe \- "cook" input lines for other programs using readline
+.SH SYNOPSIS
+.PP
+\fBrlfe\fP [\fI-l filename\fP] [\fI-a\fP] [\fI-n appname\fP] [\fI-hv\fP] [\fIcommand\fP [\fIarguments ...\fP]]
+.PP
+.SH "DESCRIPTION"
+.PP
+.B rlfe
+lets you use history and line-editing in any text oriented tool. This
+is especially useful with third-party proprietary tools that cannot be
+distributed linked against readline. It is not perfect but it works
+pretty well.
+.SH OPTIONS
+.TP
+-a
+append to the logfile (default is to overwrite).
+.TP
+-l filename
+log into file.
+.TP
+-n appname
+set the readline application name.
+.TP
+-h
+print usage string.
+.TP
+-v
+print version information.
+.SH "SEE ALSO"
+readline(3)
+.SH AUTHOR
+Per Bothner
+.SH PROBLEMS/TODO
+When running mc -c under the Linux console, mc does not recognize
+mouse clicks, which mc does when not running under fep.
+.PP
+Pasting selected text containing tabs is like hitting the tab character,
+which invokes readline completion.  We don't want this.  I don't know
+if this is fixable without integrating fep into a terminal emulator.
+.PP
+Echo suppression is a kludge, but can only be avoided with better kernel
+support: We need a tty mode to disable "real" echoing, while still
+letting the inferior think its tty driver to doing echoing.
+Stevens's book claims SCR$ and BSD4.3+ have TIOCREMOTE.
+.PP
+The latest readline may have some hooks we can use to avoid having
+to back up the prompt.
+.PP
+Desirable readline feature:  When in cooked no-echo mode (e.g. password),
+echo characters are they are types with '*', but remove them when done.
+.PP
+A synchronous output while we're editing an input line should be
+inserted in the output view.PPbefore* the input line, so that the
+lines being edited (with the prompt) float at the end of the input.
+.PP
+A "page mode" option to emulate more/less behavior:  At each page of
+output, pause for a user command.  This required parsing the output
+to keep track of line lengths.  It also requires remembering the
+output, if we want an option to scroll back, which suggests that
+this should be integrated with a terminal emulator like xterm.
diff --git a/debian/rlfe.copyright b/debian/rlfe.copyright
new file mode 100644 (file)
index 0000000..562ce3e
--- /dev/null
@@ -0,0 +1,28 @@
+This is Debian GNU/Linux's prepackaged version of the rlfe program.
+This package was put together by Matthias Klose <doko@debian.org>.
+
+Upstream source:
+       ftp.gnu.org:/pub/gnu/readline/readline-4.3.tar.gz.
+
+Author: Per Bothner
+
+Copyright:
+
+/* A front-end using readline to "cook" input lines for Kawa.
+ *
+ * Copyright (C) 1999  Per Bothner
+ *
+ * This front-end 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.
+ *
+ * Some code from Johnson & Troan: "Linux Application Development"
+ * (Addison-Wesley, 1998) was used directly or for inspiration.
+ */
+
+You should have received a copy of the GNU General Public License with
+your Debian GNU/Linux system, in /usr/share/common-licenses/GPL, or with
+the Debian GNU/Linux bash source package as the file COPYING.  If not,
+write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
+Boston, MA 02110-1301, USA.
diff --git a/debian/rules b/debian/rules
new file mode 100755 (executable)
index 0000000..7d76b8d
--- /dev/null
@@ -0,0 +1,448 @@
+#!/usr/bin/make -f
+# -*- makefile -*-
+
+include /usr/share/dpatch/dpatch.make
+
+soversion = 5
+libversion = $(soversion).2
+
+# architecture dependent variables
+DEB_HOST_ARCH          ?= $(shell dpkg-architecture -qDEB_HOST_ARCH)
+DEB_HOST_ARCH_OS       ?= $(shell dpkg-architecture -qDEB_HOST_ARCH_OS)
+DEB_HOST_GNU_TYPE      ?= $(shell dpkg-architecture -qDEB_HOST_GNU_TYPE)
+DEB_BUILD_GNU_TYPE     ?= $(shell dpkg-architecture -qDEB_BUILD_GNU_TYPE)
+
+#distribution := $(shell lsb_release -is)
+distribution := SLP
+
+ifneq ($(distribution),SLP)
+ifneq (,$(findstring /$(DEB_HOST_ARCH)/,/i386/powerpc/sparc/s390/))
+  build64 = yes
+  CC64 = gcc -m64
+  gencontrol_flags = -- \
+       '-Vdevxx:Depends=libc6-dev-$(ARCH64)'
+  ifeq ($(DEB_HOST_ARCH),i386)
+    ARCH64 = amd64
+    HOST64 = x86_64-linux-gnu
+  endif
+  ifeq ($(DEB_HOST_ARCH),powerpc)
+    ARCH64 = ppc64
+    HOST64 = ppc64-linux-gnu
+  endif
+  ifeq ($(DEB_HOST_ARCH),sparc)
+    ARCH64 = sparc64
+    HOST64 = sparc64-linux-gnu
+  endif
+  ifeq ($(DEB_HOST_ARCH),s390)
+    ARCH64 = s390x
+    HOST64 = s390x-linux-gnu
+  endif
+endif
+
+ifneq (,$(findstring /$(DEB_HOST_ARCH)/,/amd64/ppc64/))
+  build32 = yes
+  CC32 = gcc -m32
+  lib32dir = lib32
+  lib32devdir = usr/lib32
+  gencontrol_flags = -- \
+       '-Vdevxx:Depends=libc6-dev-$(ARCH32)'
+  ifeq ($(DEB_HOST_ARCH),amd64)
+    ARCH32 = i386
+    HOST32 = i486-linux-gnu
+    ifeq ($(distribution),Debian)
+      gencontrol_flags += '-Vlib32:Predep=libc6-i386 (>= 2.9-18)'
+    endif
+  endif
+  ifeq ($(DEB_HOST_ARCH),ppc64)
+    ARCH32 = powerpc
+    HOST32 = powerpc-linux-gnu
+  endif
+endif
+endif
+
+ifeq ($(DEB_HOST_ARCH_OS),netbsd)
+  CC_LINK_FLAGS =
+else
+  CC_LINK_FLAGS = -Wl,
+endif
+CC     = gcc
+
+SHELL  = bash
+
+PWD    := $(shell pwd)
+p_rl   = libreadline$(soversion)
+p_rl32 = lib32readline$(soversion)
+p_rl64 = lib64readline$(soversion)
+p_comm = readline-common
+p_rld  = $(p_rl)-dev
+p_rld32        = $(p_rl32)-dev
+p_rld64        = $(p_rl64)-dev
+p_rlg  = $(p_rl)-dbg
+p_doc  = $(p_rl)-doc
+p_rlfe = rlfe
+
+d      = debian/tmp
+d32    = debian/tmp32
+d64    = debian/tmp64
+d_rl   = debian/$(p_rl)
+d_rl32 = debian/$(p_rl32)
+d_rl64 = debian/$(p_rl64)
+d_comm = debian/$(p_comm)
+d_rld  = debian/$(p_rld)
+d_rld32        = debian/$(p_rld32)
+d_rld64        = debian/$(p_rld64)
+d_rlg  = debian/$(p_rlg)
+d_doc  = debian/$(p_doc)
+d_rlfe = debian/$(p_rlfe)
+
+srcdir         = $(PWD)
+builddir       = $(PWD)/build
+builddir32     = $(PWD)/build32
+builddir64     = $(PWD)/build64
+
+default: build
+
+configure: dpatch configure-stamp
+configure-stamp: patch-stamp
+       dh_testdir
+       cp -p /usr/share/misc/config.* ./support/
+       rm -rf $(builddir)
+       mkdir $(builddir)
+       find . -type d | xargs chmod g-s
+       cd $(builddir) && \
+         CC=$(CC) $(srcdir)/configure \
+               --with-curses --prefix=/usr\
+               --host=$(DEB_HOST_GNU_TYPE)
+
+ifneq ($(build32),)
+       rm -rf $(builddir32)
+       mkdir $(builddir32)
+       cd $(builddir32) && \
+         CC="$(CC32)" $(srcdir)/configure \
+               --host=$(HOST32) --with-curses --prefix=/usr
+endif
+
+ifneq ($(build64),)
+       rm -rf $(builddir64)
+       mkdir $(builddir64)
+       cd $(builddir64) && \
+         CC="$(CC64)" $(srcdir)/configure \
+               --host=$(HOST64) --with-curses --prefix=/usr
+endif
+
+       touch configure-stamp
+
+ifeq ($(DEB_HOST_GNU_TYPE),$(DEB_BUILD_GNU_TYPE))
+build: build-stamp build-rlfe-stamp
+else
+build: build-stamp
+endif
+
+build-stamp: configure-stamp
+       dh_testdir
+       $(MAKE) -C $(builddir) \
+           CFLAGS="-g -O2" \
+           SHOBJ_CFLAGS="-fPIC -D_REENTRANT" \
+           SHLIB_LIBS="-lncurses"
+
+ifneq ($(build32),)
+       $(MAKE) -C $(builddir32) \
+           CC="$(CC32)" \
+           CFLAGS="-g -O2" \
+           SHOBJ_CFLAGS="-fPIC -D_REENTRANT" \
+           SHOBJ_LDFLAGS='-shared' \
+           SHLIB_LIBS="-lncurses" \
+           SHLIB_XLDFLAGS='$(CC_LINK_FLAGS)-soname,`echo $$@ | sed s/\\..$$$$//`'
+endif
+
+ifneq ($(build64),)
+       $(MAKE) -C $(builddir64) \
+           CC="$(CC64)" \
+           CFLAGS="-g -O2" \
+           SHOBJ_CFLAGS="-fPIC -D_REENTRANT" \
+           SHOBJ_LDFLAGS='-shared' \
+           SHLIB_LIBS="-lncurses" \
+           SHLIB_XLDFLAGS='$(CC_LINK_FLAGS)-soname,`echo $$@ | sed s/\\..$$$$//`'
+endif
+       $(MAKE) -C $(builddir)/doc info
+
+       touch build-stamp
+
+build-rlfe-stamp: configure-stamp
+       dh_testdir
+       ln -sf libhistory.so.$(libversion) \
+           $(builddir)/shlib/libhistory.so.$(soversion)
+       ln -sf libhistory.so.$(soversion) $(builddir)/shlib/libhistory.so
+       ln -sf libreadline.so.$(libversion) \
+           $(builddir)/shlib/libreadline.so.$(soversion)
+       ln -sf libreadline.so.$(soversion) $(builddir)/shlib/libreadline.so
+       rm -rf $(builddir)/examples/rlfe
+       cp -a examples/rlfe $(builddir)/examples/
+       ln -sf ../../.. $(builddir)/examples/rlfe/readline
+       cd $(builddir)/examples/rlfe \
+               && ./configure --prefix=/usr --host=$(DEB_HOST_GNU_TYPE)
+       $(MAKE) -C $(builddir)/examples/rlfe \
+           CFLAGS="-g -O2" LDFLAGS="-g -L$(builddir)/shlib" rlfe
+       touch build-rlfe-stamp
+
+clean: unpatch
+       dh_testdir
+       dh_testroot
+       rm -f configure*-stamp build*-stamp install-stamp
+       rm -rf autom4te.cache
+       rm -rf $(builddir)
+ifneq ($(build64),)
+       rm -rf $(builddir64) $(d64)
+endif
+ifneq ($(build32),)
+       rm -rf $(builddir32) $(d32)
+endif
+       rm -f doc/*.dvi
+       rm -f debian/shlibs.local
+       $(MAKE) -f debian/rules unpatch
+       rm -f patch-stamp*
+       find . -type d | xargs chmod g-s
+       rm -f support/config.guess support/config.sub
+       dh_clean
+
+install: install-stamp
+install-stamp:
+       dh_testdir
+       dh_testroot
+       dh_clean -k
+       rm -rf $(d)
+       mkdir -p $(d)/usr/bin
+       $(MAKE) -C $(builddir) install \
+           CFLAGS="-g -O2 -D_REENTRANT" \
+           DESTDIR=$(PWD)/$(d) \
+           mandir=/usr/share/man \
+           infodir=/usr/share/info
+
+       : # move $(p_rl)
+       dh_installdirs -p$(p_rl) \
+               etc \
+               lib \
+               usr/share/doc
+       cp -a $(d)/usr/lib/lib{history,readline}.so.* $(d_rl)/lib/
+#      cp -a $(d)/usr/lib/lib{history,readline}.so.$(libversion) $(d_rl)/lib/
+#      ln -s libhistory.so.$(libversion) \
+#              $(d_rl)/lib/libhistory.so.$(soversion)
+#      ln -s libreadline.so.$(libversion) \
+#              $(d_rl)/lib/libreadline.so.$(soversion)
+
+       : # move $(p_comm)
+       dh_installdirs -p$(p_comm) \
+               etc \
+               usr/share/readline \
+               usr/share/info \
+               usr/share/doc
+       mv $(d)/usr/share/man $(d_comm)/usr/share/.
+       mv $(d_comm)/usr/share/man/man3/history.3 \
+               $(d_comm)/usr/share/man/man3/history.3readline
+       mv $(d_comm)/usr/share/man/man3/readline.3 \
+               $(d_comm)/usr/share/man/man3/readline.3readline
+       mv $(d)/usr/share/info/rluserman.info $(d_comm)/usr/share/info/.
+       install -m 644 debian/inputrc $(d_comm)/usr/share/readline/
+
+       : # move $(p_rlg)
+       dh_installdirs -p$(p_rlg) \
+               usr/lib/debug \
+               usr/share/doc
+       mv $(d)/usr/lib/lib{history,readline}.so.$(libversion) \
+               $(d_rlg)/usr/lib/debug/.
+       ln -s libhistory.so.$(libversion) \
+               $(d_rlg)/usr/lib/debug/libhistory.so.$(soversion)
+       ln -s libreadline.so.$(libversion) \
+               $(d_rlg)/usr/lib/debug/libreadline.so.$(soversion)
+
+       : # move $(p_rld)
+       dh_installdirs -p$(p_rld) \
+               usr/lib \
+               usr/share/doc \
+               usr/share/info
+       ln -s /lib/libhistory.so.$(soversion) $(d_rld)/usr/lib/libhistory.so
+       ln -s /lib/libreadline.so.$(soversion) $(d_rld)/usr/lib/libreadline.so
+       mv $(d)/usr/lib/lib{history,readline}.a $(d_rld)/usr/lib/.
+       mv $(d)/usr/include $(d_rld)/usr/.
+       mv $(d)/usr/share/info/{readline.info,history.info} \
+               $(d_rld)/usr/share/info/.
+
+       : # remove HAVE_CONFIG_H from installed headers
+       awk '/^#if defined \(HAVE_CONFIG_H\)/, /^#endif/ \
+            {if ($$0 == "#else") print "#include <string.h>"; next} {print}' \
+         $(d_rld)/usr/include/readline/chardefs.h \
+         > $(d_rld)/usr/include/readline/chardefs.h.new
+       if diff -u $(d_rld)/usr/include/readline/chardefs.h \
+               $(d_rld)/usr/include/readline/chardefs.h.new; \
+       then \
+         rm -f $(d_rld)/usr/include/readline/chardefs.h.new; \
+       else \
+         mv -f $(d_rld)/usr/include/readline/chardefs.h.new \
+           $(d_rld)/usr/include/readline/chardefs.h; \
+       fi
+
+       : # install $(p_rlfe)
+ifeq ($(DEB_HOST_GNU_TYPE),$(DEB_BUILD_GNU_TYPE))
+       dh_installdirs -p$(p_rlfe) \
+           usr/bin usr/share/man/man1 \
+           usr/share/doc/$(p_rlfe)
+       cp -p $(builddir)/examples/rlfe/rlfe $(d_rlfe)/usr/bin/.
+       cp -p debian/rlfe.1 $(d_rlfe)/usr/share/man/man1/.
+endif
+
+ifneq ($(build32),)
+       rm -rf $(d32)
+       mkdir -p $(d32)/usr/bin
+       $(MAKE) -C $(builddir32) install \
+           CC="$(CC32)" \
+           CFLAGS="-g -O2 -D_REENTRANT" \
+           SHOBJ_LDFLAGS='-shared' \
+           SHLIB_XLDFLAGS='$(CC_LINK_FLAGS)-soname,`echo $$@ | sed s/\\..$$$$//`' \
+           SHLIB_LIBS=-lncurses \
+           DESTDIR=$(PWD)/$(d32) \
+           mandir=/usr/share/man \
+           infodir=/usr/share/info
+
+       dh_installdirs -p$(p_rl32) \
+           $(lib32dir) \
+           usr/share/doc
+       cp -p $(d32)/usr/lib/lib{history,readline}.so.$(libversion) \
+               $(d_rl32)/$(lib32dir)/
+       ln -s libhistory.so.$(libversion) \
+               $(d_rl32)/$(lib32dir)/libhistory.so.$(soversion)
+       ln -s libreadline.so.$(libversion) \
+               $(d_rl32)/$(lib32dir)/libreadline.so.$(soversion)
+
+       dh_installdirs -p$(p_rld32) \
+           $(lib32devdir) \
+           usr/share/doc
+       ln -s /$(lib32dir)/libhistory.so.$(soversion) \
+               $(d_rld32)/$(lib32devdir)/libhistory.so
+       ln -s /$(lib32dir)/libreadline.so.$(soversion) \
+               $(d_rld32)/$(lib32devdir)/libreadline.so
+       mv $(d32)/usr/lib/lib{history,readline}.a $(d_rld32)/$(lib32devdir)/.
+endif
+
+ifneq ($(build64),)
+       rm -rf $(d64)
+       mkdir -p $(d64)/usr/bin
+       $(MAKE) -C $(builddir64) install \
+           CC="$(CC64)" \
+           CFLAGS="-g -O2 -D_REENTRANT" \
+           SHOBJ_LDFLAGS='-shared' \
+           SHLIB_XLDFLAGS='$(CC_LINK_FLAGS)-soname,`echo $$@ | sed s/\\..$$$$//`' \
+           SHLIB_LIBS=-lncurses \
+           DESTDIR=$(PWD)/$(d64) \
+           mandir=/usr/share/man \
+           infodir=/usr/share/info
+
+       dh_installdirs -p$(p_rl64) \
+           lib64 \
+           usr/share/doc
+       dh_installdirs -p$(p_rld64) \
+           usr/share/doc
+       cp -p $(d64)/usr/lib/lib{history,readline}.so.$(libversion) \
+               $(d_rl64)/lib64/
+       ln -s libhistory.so.$(libversion) \
+               $(d_rl64)/lib64/libhistory.so.$(soversion)
+       ln -s libreadline.so.$(libversion) \
+               $(d_rl64)/lib64/libreadline.so.$(soversion)
+
+       dh_installdirs -p$(p_rld64) \
+           usr/lib64 \
+           usr/share/doc
+       ln -s /lib64/libhistory.so.$(soversion) \
+               $(d_rld64)/usr/lib64/libhistory.so
+       ln -s /lib64/libreadline.so.$(soversion) \
+               $(d_rld64)/usr/lib64/libreadline.so
+       mv $(d64)/usr/lib/lib{history,readline}.a $(d_rld64)/usr/lib64/.
+endif
+
+       touch install-stamp
+
+binary-indep: build install
+       dh_testdir
+       dh_testroot
+       mkdir -p $(d_comm)/usr/share/lintian/overrides
+       cp -p debian/readline-common.overrides \
+               $(d_comm)/usr/share/lintian/overrides/readline-common
+       dh_installdocs -p$(p_comm) debian/inputrc.arrows
+       dh_installchangelogs -p$(p_comm)
+       dh_installdocs -p$(p_comm)
+       dh_installchangelogs -p$(p_comm)
+       dh_compress -i
+       dh_installdeb -i
+       dh_gencontrol -i
+       dh_md5sums -i
+       dh_builddeb -i
+
+binary-arch: build install
+       dh_testdir
+       dh_testroot
+       dh_installdocs -p$(p_rl) \
+               USAGE debian/inputrc.arrows
+       dh_installchangelogs -p$(p_rl) CHANGES
+       dh_installexamples -p$(p_rl) \
+               examples/Inputrc
+       mkdir -p $(d_rld)/usr/share/doc/$(p_rl)/examples
+       cp -p $(builddir)/examples/Makefile examples/*.c \
+               $(d_rld)/usr/share/doc/$(p_rl)/examples/
+       ln -sf $(p_rl) $(d_rld)/usr/share/doc/$(p_rld)
+       ln -sf $(p_rl) $(d_rlg)/usr/share/doc/$(p_rlg)
+
+ifeq ($(DEB_HOST_GNU_TYPE),$(DEB_BUILD_GNU_TYPE))
+       dh_installdocs -p$(p_rlfe) examples/rlfe/README
+       dh_installchangelogs -p$(p_rlfe) examples/rlfe/ChangeLog
+
+       dh_fixperms -p$(p_rl) -p$(p_rld) -p$(p_rlg) -p$(p_rlfe)
+       dh_strip -p$(p_rl) -p$(p_rld) -p$(p_rlg) -p$(p_rlfe)
+       dh_compress -p$(p_rl) -p$(p_rld) -p$(p_rlg) -p$(p_rlfe) \
+               -X.c
+       dh_makeshlibs -p$(p_rl) -V '$(p_rl) (>= 5.2)'
+       cp -p debian/$(p_rl).shlibs debian/shlibs.local
+       dh_shlibdeps -p$(p_rl) -p$(p_rld) -p$(p_rlg) -p$(p_rlfe) \
+                -L $(p_rl) -l $(d_rl)/lib
+endif
+
+ifneq ($(build32),)
+       -ls -l $(d_rld)/usr/share/doc/$(p_rl)
+       dh_installdocs -p$(p_rl32) \
+               USAGE debian/inputrc.arrows
+       dh_installchangelogs -p$(p_rl32) CHANGES
+       ln -sf $(p_rl32) $(d_rld32)/usr/share/doc/$(p_rld32)
+       dh_compress -p$(p_rl32) -p$(p_rld32)
+       dh_fixperms -p$(p_rl32) -p$(p_rld32)
+       dh_strip -p$(p_rl32) -p$(p_rld32)
+       dh_makeshlibs -p$(p_rl32) -V '$(p_rl32) (>= 5.2)'
+       -dh_shlibdeps -p$(p_rl32) -p$(p_rld32) \
+                -L $(p_rl32) -l $(d_rl32)/lib
+       -ls -l $(d_rld)/usr/share/doc/$(p_rl)
+endif
+
+ifneq ($(build64),)
+       -ls -l $(d_rld)/usr/share/doc/$(p_rl)
+       dh_installdocs -p$(p_rl64) \
+               USAGE debian/inputrc.arrows
+       dh_installchangelogs -p$(p_rl64) CHANGES
+       ln -sf $(p_rl64) $(d_rld64)/usr/share/doc/$(p_rld64)
+       dh_compress -p$(p_rl64) -p$(p_rld64)
+       dh_fixperms -p$(p_rl64) -p$(p_rld64)
+       dh_strip -p$(p_rl64) -p$(p_rld64)
+       dh_makeshlibs -p$(p_rl64) -V '$(p_rl64) (>= 5.2)'
+       -dh_shlibdeps -p$(p_rl64) -p$(p_rld64) \
+                -L $(p_rl64) -l $(d_rl64)/lib
+       -ls -l $(d_rld)/usr/share/doc/$(p_rl)
+endif
+
+       dh_installdeb -s
+       dh_gencontrol -s $(gencontrol_flags)
+       dh_md5sums -s
+       dh_builddeb -s
+
+binary:                binary-indep binary-arch
+
+.PHONY: binary binary-arch binary-indep clean
+
+# Local Variables:
+# mode: makefile
+# end:
diff --git a/debian/semantic.cache b/debian/semantic.cache
new file mode 100644 (file)
index 0000000..db211f1
--- /dev/null
@@ -0,0 +1,15 @@
+;; Object debian/
+;; SEMANTICDB Tags save file
+(semanticdb-project-database-file "debian/"
+  :tables (list 
+   (semanticdb-table "rules"
+    :major-mode 'makefile-mode
+    :tags '(("soversion" variable (:default-value ("5")) nil [40 54]) ("libversion" variable (:default-value ("$(soversion).1")) nil [54 82]) ("build64" variable (:default-value ("yes")) nil [384 398]) ("CC64" variable (:default-value ("gcc" "-m64")) nil [400 416]) ("gencontrol_flags" variable (:default-value ("--" "'-Vlibxx:Depends=libc6-$(ARCH64)'" "'-Vdevxx:Depends=libc6-dev-$(ARCH64)'")) nil [418 518]) ("ARCH64" variable (:default-value ("amd64")) nil [553 568]) ("HOST64" variable (:default-value ("x86_64-linux-gnu")) nil [572 598]) ("ARCH64" variable (:default-value ("ppc64")) nil [644 659]) ("HOST64" variable (:default-value ("ppc64-linux-gnu")) nil [663 688]) ("ARCH64" variable (:default-value ("sparc64")) nil [732 749]) ("HOST64" variable (:default-value ("sparc64-linux-gnu")) nil [753 780]) ("ARCH64" variable (:default-value ("s390x")) nil [823 838]) ("HOST64" variable (:default-value ("s390x-linux-gnu")) nil [842 867]) ("build32" variable (:default-value ("yes")) nil [940 954]) ("CC32" variable (:default-value ("gcc" "-m32")) nil [956 972]) ("gencontrol_flags" variable (:default-value ("--" "'-Vlibxx:Depends=libc6-$(ARCH32)'" "'-Vdevxx:Depends=libc6-dev-$(ARCH32)'")) nil [974 1074]) ("ARCH32" variable (:default-value ("amd64")) nil [1110 1125]) ("HOST32" variable (:default-value ("i486-linux-gnu")) nil [1129 1153]) ("ARCH32" variable (:default-value ("powerpc")) nil [1197 1214]) ("HOST32" variable (:default-value ("powerpc-linux-gnu")) nil [1218 1245]) ("CC_LINK_FLAGS" variable nil nil [1296 1312]) ("CC_LINK_FLAGS" variable (:default-value ("-Wl,")) nil [1319 1340]) ("CC" variable (:default-value ("gcc")) nil [1346 1355]) ("SHELL" variable (:default-value ("bash")) nil [1356 1369]) ("PWD" variable (:default-value ("$(shell pwd)")) nil [1370 1390]) ("p_rl" variable (:default-value ("libreadline$(soversion)")) nil [1390 1421]) ("p_rl32" variable (:default-value ("lib32readline$(soversion)")) nil [1421 1456]) ("p_rl64" variable (:default-value ("lib64readline$(soversion)")) nil [1456 1491]) ("p_comm" variable (:default-value ("readline-common")) nil [1491 1516]) ("p_rld" variable (:default-value ("$(p_rl)-dev")) nil [1516 1536]) ("p_rld32" variable (:default-value ("$(p_rl32)-dev")) nil [1536 1560]) ("p_rld64" variable (:default-value ("$(p_rl64)-dev")) nil [1560 1584]) ("p_rlg" variable (:default-value ("$(p_rl)-dbg")) nil [1584 1604]) ("p_doc" variable (:default-value ("$(p_rl)-doc")) nil [1604 1624]) ("p_rlfe" variable (:default-value ("rlfe")) nil [1624 1638]) ("d" variable (:default-value ("debian/tmp")) nil [1639 1654]) ("d32" variable (:default-value ("debian/tmp32")) nil [1654 1673]) ("d64" variable (:default-value ("debian/tmp64")) nil [1673 1692]) ("d_rl" variable (:default-value ("debian/$(p_rl)")) nil [1692 1714]) ("d_rl32" variable (:default-value ("debian/$(p_rl32)")) nil [1714 1740]) ("d_rl64" variable (:default-value ("debian/$(p_rl64)")) nil [1740 1766]) ("d_comm" variable (:default-value ("debian/$(p_comm)")) nil [1766 1792]) ("d_rld" variable (:default-value ("debian/$(p_rld)")) nil [1792 1816]) ("d_rld32" variable (:default-value ("debian/$(p_rld32)")) nil [1816 1844]) ("d_rld64" variable (:default-value ("debian/$(p_rld64)")) nil [1844 1872]) ("d_rlg" variable (:default-value ("debian/$(p_rlg)")) nil [1872 1896]) ("d_doc" variable (:default-value ("debian/$(p_doc)")) nil [1896 1920]) ("d_rlfe" variable (:default-value ("debian/$(p_rlfe)")) nil [1920 1946]) ("srcdir" variable (:default-value ("$(PWD)")) nil [1947 1964]) ("builddir" variable (:default-value ("$(PWD)/build")) nil [1964 1988]) ("builddir32" variable (:default-value ("$(PWD)/build32")) nil [1988 2016]) ("builddir64" variable (:default-value ("$(PWD)/build64")) nil [2016 2044]) ("default" function (:arguments ("build")) nil [2045 2061]) ("configure" function (:arguments ("configure-stamp")) nil [2061 2103]) ("configure-stamp" function (:arguments ("patch-stamp")) nil [2088 2331]) ("build" function (:arguments ("build-stamp" "build-rlfe-stamp")) nil [2711 2748]) ("build-stamp" function (:arguments ("configure-stamp")) nil [2748 2908]) ("build-rlfe-stamp" function (:arguments ("configure-stamp")) nil [3453 4125]) ("clean" function nil nil [4125 4256]) ("install" function (:arguments ("install-stamp")) nil [4495 4531]) ("install-stamp" function nil nil [4518 4763]) ("binary-indep" function (:arguments ("build" "install")) nil [9268 9697]) ("binary-arch" function (:arguments ("build" "install")) nil [9697 10140]) ("binary" function (:arguments ("binary-indep" "binary-arch")) nil [11493 11528]) ("patchdir" variable (:default-value ("debian/patches")) nil [11780 11806]) ("debian_patches" variable (:default-value ("readline51-001" "readline51-002" "readline51-003" "readline51-004" "rl-inputrc" "rl-header" "rl-attribute" "rl-no-rpath" "rl-no-cross-check" "rlfe-libs")) nil [11842 12026]) ("patch" function (:arguments ("patch-stamp")) nil [12027 12059]) ("apply-patches" function (:arguments ("patch-stamp")) nil [12046 12074]) ("patch-stamp" function (:arguments ("$(foreach p,$(debian_patches),patch-stamp-$(p))")) nil [12074 12338]) ("reverse-patches" function (:arguments ("unpatch")) nil [12338 12370]) ("unpatch" function nil nil [12363 12945]) ("patch-stamp-%" function (:arguments ("$(patchdir)/%.dpatch")) nil [12945 13161]) (".PHONY" function (:arguments ("binary" "binary-arch" "binary-indep" "clean")) nil [13162 13209]))
+    :file "rules"
+    :pointmax 13252
+    )
+   )
+  :file "semantic.cache"
+  :semantic-tag-version "2.0pre3"
+  :semanticdb-version "2.0pre3"
+  )
diff --git a/debian/watch b/debian/watch
new file mode 100644 (file)
index 0000000..cda8441
--- /dev/null
@@ -0,0 +1,2 @@
+version=2
+ftp://ftp.gnu.org/gnu/readline/readline-([\d\.]*).tar.gz debian uupdate
diff --git a/display.c b/display.c
new file mode 100644 (file)
index 0000000..47ff061
--- /dev/null
+++ b/display.c
@@ -0,0 +1,2451 @@
+/* display.c -- readline redisplay facility. */
+
+/* Copyright (C) 1987-2006 Free Software Foundation, Inc.
+
+   This file is part of the GNU Readline Library, a library for
+   reading lines of text with interactive input and history editing.
+
+   The GNU Readline Library 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.
+
+   The GNU Readline Library is distributed in the hope that it will be
+   useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+   of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   The GNU General Public License is often shipped with GNU software, and
+   is generally kept in a file called COPYING or LICENSE.  If you do not
+   have a copy of the license, write to the Free Software Foundation,
+   59 Temple Place, Suite 330, Boston, MA 02111 USA. */
+#define READLINE_LIBRARY
+
+#if defined (HAVE_CONFIG_H)
+#  include <config.h>
+#endif
+
+#include <sys/types.h>
+
+#if defined (HAVE_UNISTD_H)
+#  include <unistd.h>
+#endif /* HAVE_UNISTD_H */
+
+#include "posixstat.h"
+
+#if defined (HAVE_STDLIB_H)
+#  include <stdlib.h>
+#else
+#  include "ansi_stdlib.h"
+#endif /* HAVE_STDLIB_H */
+
+#include <stdio.h>
+
+/* System-specific feature definitions and include files. */
+#include "rldefs.h"
+#include "rlmbutil.h"
+
+/* Termcap library stuff. */
+#include "tcap.h"
+
+/* Some standard library routines. */
+#include "readline.h"
+#include "history.h"
+
+#include "rlprivate.h"
+#include "xmalloc.h"
+
+#if !defined (strchr) && !defined (__STDC__)
+extern char *strchr (), *strrchr ();
+#endif /* !strchr && !__STDC__ */
+
+static void update_line PARAMS((char *, char *, int, int, int, int));
+static void space_to_eol PARAMS((int));
+static void delete_chars PARAMS((int));
+static void insert_some_chars PARAMS((char *, int, int));
+static void cr PARAMS((void));
+
+#if defined (HANDLE_MULTIBYTE)
+static int _rl_col_width PARAMS((const char *, int, int));
+static int *_rl_wrapped_line;
+#else
+#  define _rl_col_width(l, s, e)       (((e) <= (s)) ? 0 : (e) - (s))
+#endif
+
+static int *inv_lbreaks, *vis_lbreaks;
+static int inv_lbsize, vis_lbsize;
+
+/* Heuristic used to decide whether it is faster to move from CUR to NEW
+   by backing up or outputting a carriage return and moving forward.  CUR
+   and NEW are either both buffer positions or absolute screen positions. */
+#define CR_FASTER(new, cur) (((new) + 1) < ((cur) - (new)))
+
+/* _rl_last_c_pos is an absolute cursor position in multibyte locales and a
+   buffer index in others.  This macro is used when deciding whether the
+   current cursor position is in the middle of a prompt string containing
+   invisible characters. */
+#define PROMPT_ENDING_INDEX \
+  ((MB_CUR_MAX > 1 && rl_byte_oriented == 0) ? prompt_physical_chars : prompt_last_invisible+1)
+  
+
+/* **************************************************************** */
+/*                                                                 */
+/*                     Display stuff                               */
+/*                                                                 */
+/* **************************************************************** */
+
+/* This is the stuff that is hard for me.  I never seem to write good
+   display routines in C.  Let's see how I do this time. */
+
+/* (PWP) Well... Good for a simple line updater, but totally ignores
+   the problems of input lines longer than the screen width.
+
+   update_line and the code that calls it makes a multiple line,
+   automatically wrapping line update.  Careful attention needs
+   to be paid to the vertical position variables. */
+
+/* Keep two buffers; one which reflects the current contents of the
+   screen, and the other to draw what we think the new contents should
+   be.  Then compare the buffers, and make whatever changes to the
+   screen itself that we should.  Finally, make the buffer that we
+   just drew into be the one which reflects the current contents of the
+   screen, and place the cursor where it belongs.
+
+   Commands that want to can fix the display themselves, and then let
+   this function know that the display has been fixed by setting the
+   RL_DISPLAY_FIXED variable.  This is good for efficiency. */
+
+/* Application-specific redisplay function. */
+rl_voidfunc_t *rl_redisplay_function = rl_redisplay;
+
+/* Global variables declared here. */
+/* What YOU turn on when you have handled all redisplay yourself. */
+int rl_display_fixed = 0;
+
+int _rl_suppress_redisplay = 0;
+int _rl_want_redisplay = 0;
+
+/* The stuff that gets printed out before the actual text of the line.
+   This is usually pointing to rl_prompt. */
+char *rl_display_prompt = (char *)NULL;
+
+/* Pseudo-global variables declared here. */
+
+/* The visible cursor position.  If you print some text, adjust this. */
+/* NOTE: _rl_last_c_pos is used as a buffer index when not in a locale
+   supporting multibyte characters, and an absolute cursor position when
+   in such a locale.  This is an artifact of the donated multibyte support.
+   Care must be taken when modifying its value. */
+int _rl_last_c_pos = 0;
+int _rl_last_v_pos = 0;
+
+static int cpos_adjusted;
+static int cpos_buffer_position;
+
+/* Number of lines currently on screen minus 1. */
+int _rl_vis_botlin = 0;
+
+/* Variables used only in this file. */
+/* The last left edge of text that was displayed.  This is used when
+   doing horizontal scrolling.  It shifts in thirds of a screenwidth. */
+static int last_lmargin;
+
+/* The line display buffers.  One is the line currently displayed on
+   the screen.  The other is the line about to be displayed. */
+static char *visible_line = (char *)NULL;
+static char *invisible_line = (char *)NULL;
+
+/* A buffer for `modeline' messages. */
+static char msg_buf[128];
+
+/* Non-zero forces the redisplay even if we thought it was unnecessary. */
+static int forced_display;
+
+/* Default and initial buffer size.  Can grow. */
+static int line_size = 1024;
+
+/* Variables to keep track of the expanded prompt string, which may
+   include invisible characters. */
+
+static char *local_prompt, *local_prompt_prefix;
+static int local_prompt_len;
+static int prompt_visible_length, prompt_prefix_length;
+
+/* The number of invisible characters in the line currently being
+   displayed on the screen. */
+static int visible_wrap_offset;
+
+/* The number of invisible characters in the prompt string.  Static so it
+   can be shared between rl_redisplay and update_line */
+static int wrap_offset;
+
+/* The index of the last invisible character in the prompt string. */
+static int prompt_last_invisible;
+
+/* The length (buffer offset) of the first line of the last (possibly
+   multi-line) buffer displayed on the screen. */
+static int visible_first_line_len;
+
+/* Number of invisible characters on the first physical line of the prompt.
+   Only valid when the number of physical characters in the prompt exceeds
+   (or is equal to) _rl_screenwidth. */
+static int prompt_invis_chars_first_line;
+
+static int prompt_last_screen_line;
+
+static int prompt_physical_chars;
+
+/* Variables to save and restore prompt and display information. */
+
+/* These are getting numerous enough that it's time to create a struct. */
+
+static char *saved_local_prompt;
+static char *saved_local_prefix;
+static int saved_last_invisible;
+static int saved_visible_length;
+static int saved_prefix_length;
+static int saved_local_length;
+static int saved_invis_chars_first_line;
+static int saved_physical_chars;
+
+/* Expand the prompt string S and return the number of visible
+   characters in *LP, if LP is not null.  This is currently more-or-less
+   a placeholder for expansion.  LIP, if non-null is a place to store the
+   index of the last invisible character in the returned string. NIFLP,
+   if non-zero, is a place to store the number of invisible characters in
+   the first prompt line.  The previous are used as byte counts -- indexes
+   into a character buffer. */
+
+/* Current implementation:
+       \001 (^A) start non-visible characters
+       \002 (^B) end non-visible characters
+   all characters except \001 and \002 (following a \001) are copied to
+   the returned string; all characters except those between \001 and
+   \002 are assumed to be `visible'. */        
+
+static char *
+expand_prompt (pmt, lp, lip, niflp, vlp)
+     char *pmt;
+     int *lp, *lip, *niflp, *vlp;
+{
+  char *r, *ret, *p, *igstart;
+  int l, rl, last, ignoring, ninvis, invfl, invflset, ind, pind, physchars;
+
+  /* Short-circuit if we can. */
+  if ((MB_CUR_MAX <= 1 || rl_byte_oriented) && strchr (pmt, RL_PROMPT_START_IGNORE) == 0)
+    {
+      r = savestring (pmt);
+      if (lp)
+       *lp = strlen (r);
+      if (lip)
+       *lip = 0;
+      if (niflp)
+       *niflp = 0;
+      if (vlp)
+       *vlp = lp ? *lp : strlen (r);
+      return r;
+    }
+
+  l = strlen (pmt);
+  r = ret = (char *)xmalloc (l + 1);
+
+  invfl = 0;   /* invisible chars in first line of prompt */
+  invflset = 0;        /* we only want to set invfl once */
+
+  igstart = 0;
+  for (rl = ignoring = last = ninvis = physchars = 0, p = pmt; p && *p; p++)
+    {
+      /* This code strips the invisible character string markers
+        RL_PROMPT_START_IGNORE and RL_PROMPT_END_IGNORE */
+      if (ignoring == 0 && *p == RL_PROMPT_START_IGNORE)               /* XXX - check ignoring? */
+       {
+         ignoring = 1;
+         igstart = p;
+         continue;
+       }
+      else if (ignoring && *p == RL_PROMPT_END_IGNORE)
+       {
+         ignoring = 0;
+         if (p != (igstart + 1))
+           last = r - ret - 1;
+         continue;
+       }
+      else
+       {
+#if defined (HANDLE_MULTIBYTE)
+         if (MB_CUR_MAX > 1 && rl_byte_oriented == 0)
+           {
+             pind = p - pmt;
+             ind = _rl_find_next_mbchar (pmt, pind, 1, MB_FIND_NONZERO);
+             l = ind - pind;
+             while (l--)
+               *r++ = *p++;
+             if (!ignoring)
+               {
+                 rl += ind - pind;
+                 physchars += _rl_col_width (pmt, pind, ind);
+               }
+             else
+               ninvis += ind - pind;
+             p--;                      /* compensate for later increment */
+           }
+         else
+#endif
+           {
+             *r++ = *p;
+             if (!ignoring)
+               {
+                 rl++;                 /* visible length byte counter */
+                 physchars++;
+               }
+             else
+               ninvis++;               /* invisible chars byte counter */
+           }
+
+         if (invflset == 0 && rl >= _rl_screenwidth)
+           {
+             invfl = ninvis;
+             invflset = 1;
+           }
+       }
+    }
+
+  if (rl < _rl_screenwidth)
+    invfl = ninvis;
+
+  *r = '\0';
+  if (lp)
+    *lp = rl;
+  if (lip)
+    *lip = last;
+  if (niflp)
+    *niflp = invfl;
+  if  (vlp)
+    *vlp = physchars;
+  return ret;
+}
+
+/* Just strip out RL_PROMPT_START_IGNORE and RL_PROMPT_END_IGNORE from
+   PMT and return the rest of PMT. */
+char *
+_rl_strip_prompt (pmt)
+     char *pmt;
+{
+  char *ret;
+
+  ret = expand_prompt (pmt, (int *)NULL, (int *)NULL, (int *)NULL, (int *)NULL);
+  return ret;
+}
+
+/*
+ * Expand the prompt string into the various display components, if
+ * necessary.
+ *
+ * local_prompt = expanded last line of string in rl_display_prompt
+ *               (portion after the final newline)
+ * local_prompt_prefix = portion before last newline of rl_display_prompt,
+ *                      expanded via expand_prompt
+ * prompt_visible_length = number of visible characters in local_prompt
+ * prompt_prefix_length = number of visible characters in local_prompt_prefix
+ *
+ * This function is called once per call to readline().  It may also be
+ * called arbitrarily to expand the primary prompt.
+ *
+ * The return value is the number of visible characters on the last line
+ * of the (possibly multi-line) prompt.
+ */
+int
+rl_expand_prompt (prompt)
+     char *prompt;
+{
+  char *p, *t;
+  int c;
+
+  /* Clear out any saved values. */
+  FREE (local_prompt);
+  FREE (local_prompt_prefix);
+
+  local_prompt = local_prompt_prefix = (char *)0;
+  local_prompt_len = 0;
+  prompt_last_invisible = prompt_invis_chars_first_line = 0;
+  prompt_visible_length = prompt_physical_chars = 0;
+
+  if (prompt == 0 || *prompt == 0)
+    return (0);
+
+  p = strrchr (prompt, '\n');
+  if (!p)
+    {
+      /* The prompt is only one logical line, though it might wrap. */
+      local_prompt = expand_prompt (prompt, &prompt_visible_length,
+                                           &prompt_last_invisible,
+                                           &prompt_invis_chars_first_line,
+                                           &prompt_physical_chars);
+      local_prompt_prefix = (char *)0;
+      local_prompt_len = local_prompt ? strlen (local_prompt) : 0;
+      return (prompt_visible_length);
+    }
+  else
+    {
+      /* The prompt spans multiple lines. */
+      t = ++p;
+      local_prompt = expand_prompt (p, &prompt_visible_length,
+                                      &prompt_last_invisible,
+                                      (int *)NULL,
+                                      &prompt_physical_chars);
+      c = *t; *t = '\0';
+      /* The portion of the prompt string up to and including the
+        final newline is now null-terminated. */
+      local_prompt_prefix = expand_prompt (prompt, &prompt_prefix_length,
+                                                  (int *)NULL,
+                                                  &prompt_invis_chars_first_line,
+                                                  (int *)NULL);
+      *t = c;
+      local_prompt_len = local_prompt ? strlen (local_prompt) : 0;
+      return (prompt_prefix_length);
+    }
+}
+
+/* Initialize the VISIBLE_LINE and INVISIBLE_LINE arrays, and their associated
+   arrays of line break markers.  MINSIZE is the minimum size of VISIBLE_LINE
+   and INVISIBLE_LINE; if it is greater than LINE_SIZE, LINE_SIZE is
+   increased.  If the lines have already been allocated, this ensures that
+   they can hold at least MINSIZE characters. */
+static void
+init_line_structures (minsize)
+      int minsize;
+{
+  register int n;
+
+  if (invisible_line == 0)     /* initialize it */
+    {
+      if (line_size < minsize)
+       line_size = minsize;
+      visible_line = (char *)xmalloc (line_size);
+      invisible_line = (char *)xmalloc (line_size);
+    }
+  else if (line_size < minsize)        /* ensure it can hold MINSIZE chars */
+    {
+      line_size *= 2;
+      if (line_size < minsize)
+       line_size = minsize;
+      visible_line = (char *)xrealloc (visible_line, line_size);
+      invisible_line = (char *)xrealloc (invisible_line, line_size);
+    }
+
+  for (n = minsize; n < line_size; n++)
+    {
+      visible_line[n] = 0;
+      invisible_line[n] = 1;
+    }
+
+  if (vis_lbreaks == 0)
+    {
+      /* should be enough. */
+      inv_lbsize = vis_lbsize = 256;
+      inv_lbreaks = (int *)xmalloc (inv_lbsize * sizeof (int));
+      vis_lbreaks = (int *)xmalloc (vis_lbsize * sizeof (int));
+#if defined (HANDLE_MULTIBYTE)
+      _rl_wrapped_line = (int *)xmalloc (vis_lbsize * sizeof (int));
+#endif
+      inv_lbreaks[0] = vis_lbreaks[0] = 0;
+    }
+}
+  
+/* Basic redisplay algorithm. */
+void
+rl_redisplay ()
+{
+  register int in, out, c, linenum, cursor_linenum;
+  register char *line;
+  int inv_botlin, lb_botlin, lb_linenum, o_cpos;
+  int newlines, lpos, temp, modmark, n0, num;
+  char *prompt_this_line;
+#if defined (HANDLE_MULTIBYTE)
+  wchar_t wc;
+  size_t wc_bytes;
+  int wc_width;
+  mbstate_t ps;
+  int _rl_wrapped_multicolumn = 0;
+#endif
+
+  if (!readline_echoing_p)
+    return;
+
+  if (!rl_display_prompt)
+    rl_display_prompt = "";
+
+  if (invisible_line == 0 || vis_lbreaks == 0)
+    {
+      init_line_structures (0);
+      rl_on_new_line ();
+    }
+
+  /* Draw the line into the buffer. */
+  cpos_buffer_position = -1;
+
+  line = invisible_line;
+  out = inv_botlin = 0;
+
+  /* Mark the line as modified or not.  We only do this for history
+     lines. */
+  modmark = 0;
+  if (_rl_mark_modified_lines && current_history () && rl_undo_list)
+    {
+      line[out++] = '*';
+      line[out] = '\0';
+      modmark = 1;
+    }
+
+  /* If someone thought that the redisplay was handled, but the currently
+     visible line has a different modification state than the one about
+     to become visible, then correct the caller's misconception. */
+  if (visible_line[0] != invisible_line[0])
+    rl_display_fixed = 0;
+
+  /* If the prompt to be displayed is the `primary' readline prompt (the
+     one passed to readline()), use the values we have already expanded.
+     If not, use what's already in rl_display_prompt.  WRAP_OFFSET is the
+     number of non-visible characters in the prompt string. */
+  if (rl_display_prompt == rl_prompt || local_prompt)
+    {
+      if (local_prompt_prefix && forced_display)
+       _rl_output_some_chars (local_prompt_prefix, strlen (local_prompt_prefix));
+
+      if (local_prompt_len > 0)
+       {
+         temp = local_prompt_len + out + 2;
+         if (temp >= line_size)
+           {
+             line_size = (temp + 1024) - (temp % 1024);
+             visible_line = (char *)xrealloc (visible_line, line_size);
+             line = invisible_line = (char *)xrealloc (invisible_line, line_size);
+           }
+         strncpy (line + out, local_prompt, local_prompt_len);
+         out += local_prompt_len;
+       }
+      line[out] = '\0';
+      wrap_offset = local_prompt_len - prompt_visible_length;
+    }
+  else
+    {
+      int pmtlen;
+      prompt_this_line = strrchr (rl_display_prompt, '\n');
+      if (!prompt_this_line)
+       prompt_this_line = rl_display_prompt;
+      else
+       {
+         prompt_this_line++;
+         pmtlen = prompt_this_line - rl_display_prompt;        /* temp var */
+         if (forced_display)
+           {
+             _rl_output_some_chars (rl_display_prompt, pmtlen);
+             /* Make sure we are at column zero even after a newline,
+                regardless of the state of terminal output processing. */
+             if (pmtlen < 2 || prompt_this_line[-2] != '\r')
+               cr ();
+           }
+       }
+
+      prompt_physical_chars = pmtlen = strlen (prompt_this_line);
+      temp = pmtlen + out + 2;
+      if (temp >= line_size)
+       {
+         line_size = (temp + 1024) - (temp % 1024);
+         visible_line = (char *)xrealloc (visible_line, line_size);
+         line = invisible_line = (char *)xrealloc (invisible_line, line_size);
+       }
+      strncpy (line + out,  prompt_this_line, pmtlen);
+      out += pmtlen;
+      line[out] = '\0';
+      wrap_offset = prompt_invis_chars_first_line = 0;
+    }
+
+#define CHECK_INV_LBREAKS() \
+      do { \
+       if (newlines >= (inv_lbsize - 2)) \
+         { \
+           inv_lbsize *= 2; \
+           inv_lbreaks = (int *)xrealloc (inv_lbreaks, inv_lbsize * sizeof (int)); \
+         } \
+      } while (0)
+
+#if defined (HANDLE_MULTIBYTE)   
+#define CHECK_LPOS() \
+      do { \
+       lpos++; \
+       if (lpos >= _rl_screenwidth) \
+         { \
+           if (newlines >= (inv_lbsize - 2)) \
+             { \
+               inv_lbsize *= 2; \
+               inv_lbreaks = (int *)xrealloc (inv_lbreaks, inv_lbsize * sizeof (int)); \
+               _rl_wrapped_line = (int *)xrealloc (_rl_wrapped_line, inv_lbsize * sizeof (int)); \
+             } \
+           inv_lbreaks[++newlines] = out; \
+           _rl_wrapped_line[newlines] = _rl_wrapped_multicolumn; \
+           lpos = 0; \
+         } \
+      } while (0)
+#else
+#define CHECK_LPOS() \
+      do { \
+       lpos++; \
+       if (lpos >= _rl_screenwidth) \
+         { \
+           if (newlines >= (inv_lbsize - 2)) \
+             { \
+               inv_lbsize *= 2; \
+               inv_lbreaks = (int *)xrealloc (inv_lbreaks, inv_lbsize * sizeof (int)); \
+             } \
+           inv_lbreaks[++newlines] = out; \
+           lpos = 0; \
+         } \
+      } while (0)
+#endif
+
+  /* inv_lbreaks[i] is where line i starts in the buffer. */
+  inv_lbreaks[newlines = 0] = 0;
+#if 0
+  lpos = out - wrap_offset;
+#else
+  lpos = prompt_physical_chars + modmark;
+#endif
+
+#if defined (HANDLE_MULTIBYTE)
+  memset (_rl_wrapped_line, 0, vis_lbsize);
+  num = 0;
+#endif
+
+  /* prompt_invis_chars_first_line is the number of invisible characters in
+     the first physical line of the prompt.
+     wrap_offset - prompt_invis_chars_first_line is the number of invis
+     chars on the second line. */
+
+  /* what if lpos is already >= _rl_screenwidth before we start drawing the
+     contents of the command line? */
+  while (lpos >= _rl_screenwidth)
+    {
+      int z;
+      /* fix from Darin Johnson <darin@acuson.com> for prompt string with
+         invisible characters that is longer than the screen width.  The
+         prompt_invis_chars_first_line variable could be made into an array
+         saying how many invisible characters there are per line, but that's
+         probably too much work for the benefit gained.  How many people have
+         prompts that exceed two physical lines?
+         Additional logic fix from Edward Catmur <ed@catmur.co.uk> */
+#if defined (HANDLE_MULTIBYTE)
+      if (MB_CUR_MAX > 1 && rl_byte_oriented == 0)
+       {
+         n0 = num;
+          temp = local_prompt_len;
+          while (num < temp)
+           {
+             z = _rl_col_width  (local_prompt, n0, num);
+             if (z > _rl_screenwidth)
+               {
+                 num = _rl_find_prev_mbchar (local_prompt, num, MB_FIND_ANY);
+                 break;
+               }
+             else if (z == _rl_screenwidth)
+               break;
+             num++;
+           }
+          temp = num;
+       }
+      else
+#endif /* !HANDLE_MULTIBYTE */
+       temp = ((newlines + 1) * _rl_screenwidth);
+
+      /* Now account for invisible characters in the current line. */
+      temp += ((local_prompt_prefix == 0) ? ((newlines == 0) ? prompt_invis_chars_first_line
+                                                            : ((newlines == 1) ? wrap_offset : 0))
+                                         : ((newlines == 0) ? wrap_offset :0));
+             
+      inv_lbreaks[++newlines] = temp;
+#if defined (HANDLE_MULTIBYTE)
+      if (MB_CUR_MAX > 1 && rl_byte_oriented == 0)
+       lpos -= _rl_col_width (local_prompt, n0, num);
+      else
+#endif
+       lpos -= _rl_screenwidth;
+    }
+
+  prompt_last_screen_line = newlines;
+
+  /* Draw the rest of the line (after the prompt) into invisible_line, keeping
+     track of where the cursor is (cpos_buffer_position), the number of the line containing
+     the cursor (lb_linenum), the last line number (lb_botlin and inv_botlin).
+     It maintains an array of line breaks for display (inv_lbreaks).
+     This handles expanding tabs for display and displaying meta characters. */
+  lb_linenum = 0;
+#if defined (HANDLE_MULTIBYTE)
+  in = 0;
+  if (MB_CUR_MAX > 1 && rl_byte_oriented == 0)
+    {
+      memset (&ps, 0, sizeof (mbstate_t));
+      wc_bytes = mbrtowc (&wc, rl_line_buffer, rl_end, &ps);
+    }
+  else
+    wc_bytes = 1;
+  while (in < rl_end)
+#else
+  for (in = 0; in < rl_end; in++)
+#endif
+    {
+      c = (unsigned char)rl_line_buffer[in];
+
+#if defined (HANDLE_MULTIBYTE)
+      if (MB_CUR_MAX > 1 && rl_byte_oriented == 0)
+       {
+         if (MB_INVALIDCH (wc_bytes))
+           {
+             /* Byte sequence is invalid or shortened.  Assume that the
+                first byte represents a character. */
+             wc_bytes = 1;
+             /* Assume that a character occupies a single column. */
+             wc_width = 1;
+             memset (&ps, 0, sizeof (mbstate_t));
+           }
+         else if (MB_NULLWCH (wc_bytes))
+           break;                      /* Found '\0' */
+         else
+           {
+             temp = wcwidth (wc);
+             wc_width = (temp >= 0) ? temp : 1;
+           }
+       }
+#endif
+
+      if (out + 8 >= line_size)                /* XXX - 8 for \t */
+       {
+         line_size *= 2;
+         visible_line = (char *)xrealloc (visible_line, line_size);
+         invisible_line = (char *)xrealloc (invisible_line, line_size);
+         line = invisible_line;
+       }
+
+      if (in == rl_point)
+       {
+         cpos_buffer_position = out;
+         lb_linenum = newlines;
+       }
+
+#if defined (HANDLE_MULTIBYTE)
+      if (META_CHAR (c) && _rl_output_meta_chars == 0) /* XXX - clean up */
+#else
+      if (META_CHAR (c))
+#endif
+       {
+         if (_rl_output_meta_chars == 0)
+           {
+             sprintf (line + out, "\\%o", c);
+
+             if (lpos + 4 >= _rl_screenwidth)
+               {
+                 temp = _rl_screenwidth - lpos;
+                 CHECK_INV_LBREAKS ();
+                 inv_lbreaks[++newlines] = out + temp;
+                 lpos = 4 - temp;
+               }
+             else
+               lpos += 4;
+
+             out += 4;
+           }
+         else
+           {
+             line[out++] = c;
+             CHECK_LPOS();
+           }
+       }
+#if defined (DISPLAY_TABS)
+      else if (c == '\t')
+       {
+         register int newout;
+
+#if 0
+         newout = (out | (int)7) + 1;
+#else
+         newout = out + 8 - lpos % 8;
+#endif
+         temp = newout - out;
+         if (lpos + temp >= _rl_screenwidth)
+           {
+             register int temp2;
+             temp2 = _rl_screenwidth - lpos;
+             CHECK_INV_LBREAKS ();
+             inv_lbreaks[++newlines] = out + temp2;
+             lpos = temp - temp2;
+             while (out < newout)
+               line[out++] = ' ';
+           }
+         else
+           {
+             while (out < newout)
+               line[out++] = ' ';
+             lpos += temp;
+           }
+       }
+#endif
+      else if (c == '\n' && _rl_horizontal_scroll_mode == 0 && _rl_term_up && *_rl_term_up)
+       {
+         line[out++] = '\0';   /* XXX - sentinel */
+         CHECK_INV_LBREAKS ();
+         inv_lbreaks[++newlines] = out;
+         lpos = 0;
+       }
+      else if (CTRL_CHAR (c) || c == RUBOUT)
+       {
+         line[out++] = '^';
+         CHECK_LPOS();
+         line[out++] = CTRL_CHAR (c) ? UNCTRL (c) : '?';
+         CHECK_LPOS();
+       }
+      else
+       {
+#if defined (HANDLE_MULTIBYTE)
+         if (MB_CUR_MAX > 1 && rl_byte_oriented == 0)
+           {
+             register int i;
+
+             _rl_wrapped_multicolumn = 0;
+
+             if (_rl_screenwidth < lpos + wc_width)
+               for (i = lpos; i < _rl_screenwidth; i++)
+                 {
+                   /* The space will be removed in update_line() */
+                   line[out++] = ' ';
+                   _rl_wrapped_multicolumn++;
+                   CHECK_LPOS();
+                 }
+             if (in == rl_point)
+               {
+                 cpos_buffer_position = out;
+                 lb_linenum = newlines;
+               }
+             for (i = in; i < in+wc_bytes; i++)
+               line[out++] = rl_line_buffer[i];
+             for (i = 0; i < wc_width; i++)
+               CHECK_LPOS();
+           }
+         else
+           {
+             line[out++] = c;
+             CHECK_LPOS();
+           }
+#else
+         line[out++] = c;
+         CHECK_LPOS();
+#endif
+       }
+
+#if defined (HANDLE_MULTIBYTE)
+      if (MB_CUR_MAX > 1 && rl_byte_oriented == 0)
+       {
+         in += wc_bytes;
+         wc_bytes = mbrtowc (&wc, rl_line_buffer + in, rl_end - in, &ps);
+       }
+      else
+        in++;
+#endif
+
+    }
+  line[out] = '\0';
+  if (cpos_buffer_position < 0)
+    {
+      cpos_buffer_position = out;
+      lb_linenum = newlines;
+    }
+
+  inv_botlin = lb_botlin = newlines;
+  CHECK_INV_LBREAKS ();
+  inv_lbreaks[newlines+1] = out;
+  cursor_linenum = lb_linenum;
+
+  /* CPOS_BUFFER_POSITION == position in buffer where cursor should be placed.
+     CURSOR_LINENUM == line number where the cursor should be placed. */
+
+  /* PWP: now is when things get a bit hairy.  The visible and invisible
+     line buffers are really multiple lines, which would wrap every
+     (screenwidth - 1) characters.  Go through each in turn, finding
+     the changed region and updating it.  The line order is top to bottom. */
+
+  /* If we can move the cursor up and down, then use multiple lines,
+     otherwise, let long lines display in a single terminal line, and
+     horizontally scroll it. */
+
+  if (_rl_horizontal_scroll_mode == 0 && _rl_term_up && *_rl_term_up)
+    {
+      int nleft, pos, changed_screen_line, tx;
+
+      if (!rl_display_fixed || forced_display)
+       {
+         forced_display = 0;
+
+         /* If we have more than a screenful of material to display, then
+            only display a screenful.  We should display the last screen,
+            not the first.  */
+         if (out >= _rl_screenchars)
+           {
+             if (MB_CUR_MAX > 1 && rl_byte_oriented == 0)
+               out = _rl_find_prev_mbchar (line, _rl_screenchars, MB_FIND_ANY);
+             else
+               out = _rl_screenchars - 1;
+           }
+
+         /* The first line is at character position 0 in the buffer.  The
+            second and subsequent lines start at inv_lbreaks[N], offset by
+            OFFSET (which has already been calculated above).  */
+
+#define W_OFFSET(line, offset) ((line) == 0 ? offset : 0)
+#define VIS_LLEN(l)    ((l) > _rl_vis_botlin ? 0 : (vis_lbreaks[l+1] - vis_lbreaks[l]))
+#define INV_LLEN(l)    (inv_lbreaks[l+1] - inv_lbreaks[l])
+#define VIS_CHARS(line) (visible_line + vis_lbreaks[line])
+#define VIS_LINE(line) ((line) > _rl_vis_botlin) ? "" : VIS_CHARS(line)
+#define INV_LINE(line) (invisible_line + inv_lbreaks[line])
+
+         /* For each line in the buffer, do the updating display. */
+         for (linenum = 0; linenum <= inv_botlin; linenum++)
+           {
+             /* This can lead us astray if we execute a program that changes
+                the locale from a non-multibyte to a multibyte one. */
+             o_cpos = _rl_last_c_pos;
+             cpos_adjusted = 0;
+             update_line (VIS_LINE(linenum), INV_LINE(linenum), linenum,
+                          VIS_LLEN(linenum), INV_LLEN(linenum), inv_botlin);
+
+             /* update_line potentially changes _rl_last_c_pos, but doesn't
+                take invisible characters into account, since _rl_last_c_pos
+                is an absolute cursor position in a multibyte locale.  See
+                if compensating here is the right thing, or if we have to
+                change update_line itself.  There is one case in which
+                update_line adjusts _rl_last_c_pos itself (so it can pass
+                _rl_move_cursor_relative accurate values); it communicates
+                this back by setting cpos_adjusted.  If we assume that
+                _rl_last_c_pos is correct (an absolute cursor position) each
+                time update_line is called, then we can assume in our
+                calculations that o_cpos does not need to be adjusted by
+                wrap_offset. */
+             if (linenum == 0 && (MB_CUR_MAX > 1 && rl_byte_oriented == 0) &&
+                 cpos_adjusted == 0 &&
+                 _rl_last_c_pos != o_cpos &&
+                 _rl_last_c_pos > wrap_offset &&
+                 o_cpos < prompt_last_invisible)
+               _rl_last_c_pos -= wrap_offset;
+                 
+             /* If this is the line with the prompt, we might need to
+                compensate for invisible characters in the new line. Do
+                this only if there is not more than one new line (which
+                implies that we completely overwrite the old visible line)
+                and the new line is shorter than the old.  Make sure we are
+                at the end of the new line before clearing. */
+             if (linenum == 0 &&
+                 inv_botlin == 0 && _rl_last_c_pos == out &&
+                 (wrap_offset > visible_wrap_offset) &&
+                 (_rl_last_c_pos < visible_first_line_len))
+               {
+                 if (MB_CUR_MAX > 1 && rl_byte_oriented == 0)
+                   nleft = _rl_screenwidth - _rl_last_c_pos;
+                 else
+                   nleft = _rl_screenwidth + wrap_offset - _rl_last_c_pos;
+                 if (nleft)
+                   _rl_clear_to_eol (nleft);
+               }
+
+             /* Since the new first line is now visible, save its length. */
+             if (linenum == 0)
+               visible_first_line_len = (inv_botlin > 0) ? inv_lbreaks[1] : out - wrap_offset;
+           }
+
+         /* We may have deleted some lines.  If so, clear the left over
+            blank ones at the bottom out. */
+         if (_rl_vis_botlin > inv_botlin)
+           {
+             char *tt;
+             for (; linenum <= _rl_vis_botlin; linenum++)
+               {
+                 tt = VIS_CHARS (linenum);
+                 _rl_move_vert (linenum);
+                 _rl_move_cursor_relative (0, tt);
+                 _rl_clear_to_eol
+                   ((linenum == _rl_vis_botlin) ? strlen (tt) : _rl_screenwidth);
+               }
+           }
+         _rl_vis_botlin = inv_botlin;
+
+         /* CHANGED_SCREEN_LINE is set to 1 if we have moved to a
+            different screen line during this redisplay. */
+         changed_screen_line = _rl_last_v_pos != cursor_linenum;
+         if (changed_screen_line)
+           {
+             _rl_move_vert (cursor_linenum);
+             /* If we moved up to the line with the prompt using _rl_term_up,
+                the physical cursor position on the screen stays the same,
+                but the buffer position needs to be adjusted to account
+                for invisible characters. */
+             if ((MB_CUR_MAX == 1 || rl_byte_oriented) && cursor_linenum == 0 && wrap_offset)
+               _rl_last_c_pos += wrap_offset;
+           }
+
+         /* We have to reprint the prompt if it contains invisible
+            characters, since it's not generally OK to just reprint
+            the characters from the current cursor position.  But we
+            only need to reprint it if the cursor is before the last
+            invisible character in the prompt string. */
+         nleft = prompt_visible_length + wrap_offset;
+         if (cursor_linenum == 0 && wrap_offset > 0 && _rl_last_c_pos > 0 &&
+#if 0
+             _rl_last_c_pos <= PROMPT_ENDING_INDEX && local_prompt)
+#else
+             _rl_last_c_pos < PROMPT_ENDING_INDEX && local_prompt)
+#endif
+           {
+#if defined (__MSDOS__)
+             putc ('\r', rl_outstream);
+#else
+             if (_rl_term_cr)
+               tputs (_rl_term_cr, 1, _rl_output_character_function);
+#endif
+             _rl_output_some_chars (local_prompt, nleft);
+             if (MB_CUR_MAX > 1 && rl_byte_oriented == 0)
+               _rl_last_c_pos = _rl_col_width (local_prompt, 0, nleft) - wrap_offset;
+             else
+               _rl_last_c_pos = nleft;
+           }
+
+         /* Where on that line?  And where does that line start
+            in the buffer? */
+         pos = inv_lbreaks[cursor_linenum];
+         /* nleft == number of characters in the line buffer between the
+            start of the line and the desired cursor position. */
+         nleft = cpos_buffer_position - pos;
+
+         /* NLEFT is now a number of characters in a buffer.  When in a
+            multibyte locale, however, _rl_last_c_pos is an absolute cursor
+            position that doesn't take invisible characters in the prompt
+            into account.  We use a fudge factor to compensate. */
+
+         /* Since _rl_backspace() doesn't know about invisible characters in the
+            prompt, and there's no good way to tell it, we compensate for
+            those characters here and call _rl_backspace() directly. */
+         if (wrap_offset && cursor_linenum == 0 && nleft < _rl_last_c_pos)
+           {
+             /* TX == new physical cursor position in multibyte locale. */
+             if (MB_CUR_MAX > 1 && rl_byte_oriented == 0)
+               tx = _rl_col_width (&visible_line[pos], 0, nleft) - visible_wrap_offset;
+             else
+               tx = nleft;
+             if (_rl_last_c_pos > tx)
+               {
+                 _rl_backspace (_rl_last_c_pos - tx);  /* XXX */
+                 _rl_last_c_pos = tx;
+               }
+           }
+
+         /* We need to note that in a multibyte locale we are dealing with
+            _rl_last_c_pos as an absolute cursor position, but moving to a
+            point specified by a buffer position (NLEFT) that doesn't take
+            invisible characters into account. */
+         if (MB_CUR_MAX > 1 && rl_byte_oriented == 0)
+           _rl_move_cursor_relative (nleft, &invisible_line[pos]);
+         else if (nleft != _rl_last_c_pos)
+           _rl_move_cursor_relative (nleft, &invisible_line[pos]);
+       }
+    }
+  else                         /* Do horizontal scrolling. */
+    {
+#define M_OFFSET(margin, offset) ((margin) == 0 ? offset : 0)
+      int lmargin, ndisp, nleft, phys_c_pos, t;
+
+      /* Always at top line. */
+      _rl_last_v_pos = 0;
+
+      /* Compute where in the buffer the displayed line should start.  This
+        will be LMARGIN. */
+
+      /* The number of characters that will be displayed before the cursor. */
+      ndisp = cpos_buffer_position - wrap_offset;
+      nleft  = prompt_visible_length + wrap_offset;
+      /* Where the new cursor position will be on the screen.  This can be
+        longer than SCREENWIDTH; if it is, lmargin will be adjusted. */
+      phys_c_pos = cpos_buffer_position - (last_lmargin ? last_lmargin : wrap_offset);
+      t = _rl_screenwidth / 3;
+
+      /* If the number of characters had already exceeded the screenwidth,
+        last_lmargin will be > 0. */
+
+      /* If the number of characters to be displayed is more than the screen
+        width, compute the starting offset so that the cursor is about
+        two-thirds of the way across the screen. */
+      if (phys_c_pos > _rl_screenwidth - 2)
+       {
+         lmargin = cpos_buffer_position - (2 * t);
+         if (lmargin < 0)
+           lmargin = 0;
+         /* If the left margin would be in the middle of a prompt with
+            invisible characters, don't display the prompt at all. */
+         if (wrap_offset && lmargin > 0 && lmargin < nleft)
+           lmargin = nleft;
+       }
+      else if (ndisp < _rl_screenwidth - 2)            /* XXX - was -1 */
+       lmargin = 0;
+      else if (phys_c_pos < 1)
+       {
+         /* If we are moving back towards the beginning of the line and
+            the last margin is no longer correct, compute a new one. */
+         lmargin = ((cpos_buffer_position - 1) / t) * t;       /* XXX */
+         if (wrap_offset && lmargin > 0 && lmargin < nleft)
+           lmargin = nleft;
+       }
+      else
+       lmargin = last_lmargin;
+
+      /* If the first character on the screen isn't the first character
+        in the display line, indicate this with a special character. */
+      if (lmargin > 0)
+       line[lmargin] = '<';
+
+      /* If SCREENWIDTH characters starting at LMARGIN do not encompass
+        the whole line, indicate that with a special character at the
+        right edge of the screen.  If LMARGIN is 0, we need to take the
+        wrap offset into account. */
+      t = lmargin + M_OFFSET (lmargin, wrap_offset) + _rl_screenwidth;
+      if (t < out)
+       line[t - 1] = '>';
+
+      if (!rl_display_fixed || forced_display || lmargin != last_lmargin)
+       {
+         forced_display = 0;
+         update_line (&visible_line[last_lmargin],
+                      &invisible_line[lmargin],
+                      0,
+                      _rl_screenwidth + visible_wrap_offset,
+                      _rl_screenwidth + (lmargin ? 0 : wrap_offset),
+                      0);
+
+         /* If the visible new line is shorter than the old, but the number
+            of invisible characters is greater, and we are at the end of
+            the new line, we need to clear to eol. */
+         t = _rl_last_c_pos - M_OFFSET (lmargin, wrap_offset);
+         if ((M_OFFSET (lmargin, wrap_offset) > visible_wrap_offset) &&
+             (_rl_last_c_pos == out) &&
+             t < visible_first_line_len)
+           {
+             nleft = _rl_screenwidth - t;
+             _rl_clear_to_eol (nleft);
+           }
+         visible_first_line_len = out - lmargin - M_OFFSET (lmargin, wrap_offset);
+         if (visible_first_line_len > _rl_screenwidth)
+           visible_first_line_len = _rl_screenwidth;
+
+         _rl_move_cursor_relative (cpos_buffer_position - lmargin, &invisible_line[lmargin]);
+         last_lmargin = lmargin;
+       }
+    }
+  fflush (rl_outstream);
+
+  /* Swap visible and non-visible lines. */
+  {
+    char *vtemp = visible_line;
+    int *itemp = vis_lbreaks, ntemp = vis_lbsize;
+
+    visible_line = invisible_line;
+    invisible_line = vtemp;
+
+    vis_lbreaks = inv_lbreaks;
+    inv_lbreaks = itemp;
+
+    vis_lbsize = inv_lbsize;
+    inv_lbsize = ntemp;
+
+    rl_display_fixed = 0;
+    /* If we are displaying on a single line, and last_lmargin is > 0, we
+       are not displaying any invisible characters, so set visible_wrap_offset
+       to 0. */
+    if (_rl_horizontal_scroll_mode && last_lmargin)
+      visible_wrap_offset = 0;
+    else
+      visible_wrap_offset = wrap_offset;
+  }
+}
+
+/* PWP: update_line() is based on finding the middle difference of each
+   line on the screen; vis:
+
+                            /old first difference
+       /beginning of line   |        /old last same       /old EOL
+       v                    v        v             v
+old:   eddie> Oh, my little gruntle-buggy is to me, as lurgid as
+new:   eddie> Oh, my little buggy says to me, as lurgid as
+       ^                    ^  ^                          ^
+       \beginning of line   |  \new last same     \new end of line
+                            \new first difference
+
+   All are character pointers for the sake of speed.  Special cases for
+   no differences, as well as for end of line additions must be handled.
+
+   Could be made even smarter, but this works well enough */
+static void
+update_line (old, new, current_line, omax, nmax, inv_botlin)
+     register char *old, *new;
+     int current_line, omax, nmax, inv_botlin;
+{
+  register char *ofd, *ols, *oe, *nfd, *nls, *ne;
+  int temp, lendiff, wsatend, od, nd;
+  int current_invis_chars;
+  int col_lendiff, col_temp;
+#if defined (HANDLE_MULTIBYTE)
+  mbstate_t ps_new, ps_old;
+  int new_offset, old_offset;
+#endif
+
+  /* If we're at the right edge of a terminal that supports xn, we're
+     ready to wrap around, so do so.  This fixes problems with knowing
+     the exact cursor position and cut-and-paste with certain terminal
+     emulators.  In this calculation, TEMP is the physical screen
+     position of the cursor. */
+  if (MB_CUR_MAX > 1 && rl_byte_oriented == 0)
+    temp = _rl_last_c_pos;
+  else
+    temp = _rl_last_c_pos - W_OFFSET(_rl_last_v_pos, visible_wrap_offset);
+  if (temp == _rl_screenwidth && _rl_term_autowrap && !_rl_horizontal_scroll_mode
+       && _rl_last_v_pos == current_line - 1)
+    {
+#if defined (HANDLE_MULTIBYTE)
+      if (MB_CUR_MAX > 1 && rl_byte_oriented == 0)
+       {
+         wchar_t wc;
+         mbstate_t ps;
+         int tempwidth, bytes;
+         size_t ret;
+
+         /* This fixes only double-column characters, but if the wrapped
+            character comsumes more than three columns, spaces will be
+            inserted in the string buffer. */
+         if (_rl_wrapped_line[current_line] > 0)
+           _rl_clear_to_eol (_rl_wrapped_line[current_line]);
+
+         memset (&ps, 0, sizeof (mbstate_t));
+         ret = mbrtowc (&wc, new, MB_CUR_MAX, &ps);
+         if (MB_INVALIDCH (ret))
+           {
+             tempwidth = 1;
+             ret = 1;
+           }
+         else if (MB_NULLWCH (ret))
+           tempwidth = 0;
+         else
+           tempwidth = wcwidth (wc);
+
+         if (tempwidth > 0)
+           {
+             int count;
+             bytes = ret;
+             for (count = 0; count < bytes; count++)
+               putc (new[count], rl_outstream);
+             _rl_last_c_pos = tempwidth;
+             _rl_last_v_pos++;
+             memset (&ps, 0, sizeof (mbstate_t));
+             ret = mbrtowc (&wc, old, MB_CUR_MAX, &ps);
+             if (ret != 0 && bytes != 0)
+               {
+                 if (MB_INVALIDCH (ret))
+                   memmove (old+bytes, old+1, strlen (old+1));
+                 else
+                   memmove (old+bytes, old+ret, strlen (old+ret));
+                 memcpy (old, new, bytes);
+               }
+           }
+         else
+           {
+             putc (' ', rl_outstream);
+             _rl_last_c_pos = 1;
+             _rl_last_v_pos++;
+             if (old[0] && new[0])
+               old[0] = new[0];
+           }
+       }
+      else
+#endif
+       {
+         if (new[0])
+           putc (new[0], rl_outstream);
+         else
+           putc (' ', rl_outstream);
+         _rl_last_c_pos = 1;
+         _rl_last_v_pos++;
+         if (old[0] && new[0])
+           old[0] = new[0];
+       }
+    }
+
+      
+  /* Find first difference. */
+#if defined (HANDLE_MULTIBYTE)
+  if (MB_CUR_MAX > 1 && rl_byte_oriented == 0)
+    {
+      /* See if the old line is a subset of the new line, so that the
+        only change is adding characters. */
+      temp = (omax < nmax) ? omax : nmax;
+      if (memcmp (old, new, temp) == 0)
+       {
+         ofd = old + temp;
+         nfd = new + temp;
+       }
+      else
+       {      
+         memset (&ps_new, 0, sizeof(mbstate_t));
+         memset (&ps_old, 0, sizeof(mbstate_t));
+
+         if (omax == nmax && STREQN (new, old, omax))
+           {
+             ofd = old + omax;
+             nfd = new + nmax;
+           }
+         else
+           {
+             new_offset = old_offset = 0;
+             for (ofd = old, nfd = new;
+                   (ofd - old < omax) && *ofd &&
+                   _rl_compare_chars(old, old_offset, &ps_old, new, new_offset, &ps_new); )
+               {
+                 old_offset = _rl_find_next_mbchar (old, old_offset, 1, MB_FIND_ANY);
+                 new_offset = _rl_find_next_mbchar (new, new_offset, 1, MB_FIND_ANY);
+                 ofd = old + old_offset;
+                 nfd = new + new_offset;
+               }
+           }
+       }
+    }
+  else
+#endif
+  for (ofd = old, nfd = new;
+       (ofd - old < omax) && *ofd && (*ofd == *nfd);
+       ofd++, nfd++)
+    ;
+
+  /* Move to the end of the screen line.  ND and OD are used to keep track
+     of the distance between ne and new and oe and old, respectively, to
+     move a subtraction out of each loop. */
+  for (od = ofd - old, oe = ofd; od < omax && *oe; oe++, od++);
+  for (nd = nfd - new, ne = nfd; nd < nmax && *ne; ne++, nd++);
+
+  /* If no difference, continue to next line. */
+  if (ofd == oe && nfd == ne)
+    return;
+
+  wsatend = 1;                 /* flag for trailing whitespace */
+
+#if defined (HANDLE_MULTIBYTE)
+  if (MB_CUR_MAX > 1 && rl_byte_oriented == 0)
+    {
+      ols = old + _rl_find_prev_mbchar (old, oe - old, MB_FIND_ANY);
+      nls = new + _rl_find_prev_mbchar (new, ne - new, MB_FIND_ANY);
+      while ((ols > ofd) && (nls > nfd))
+       {
+         memset (&ps_old, 0, sizeof (mbstate_t));
+         memset (&ps_new, 0, sizeof (mbstate_t));
+
+#if 0
+         /* On advice from jir@yamato.ibm.com */
+         _rl_adjust_point (old, ols - old, &ps_old);
+         _rl_adjust_point (new, nls - new, &ps_new);
+#endif
+
+         if (_rl_compare_chars (old, ols - old, &ps_old, new, nls - new, &ps_new) == 0)
+           break;
+
+         if (*ols == ' ')
+           wsatend = 0;
+
+         ols = old + _rl_find_prev_mbchar (old, ols - old, MB_FIND_ANY);
+         nls = new + _rl_find_prev_mbchar (new, nls - new, MB_FIND_ANY);
+       }
+    }
+  else
+    {
+#endif /* HANDLE_MULTIBYTE */
+  ols = oe - 1;                        /* find last same */
+  nls = ne - 1;
+  while ((ols > ofd) && (nls > nfd) && (*ols == *nls))
+    {
+      if (*ols != ' ')
+       wsatend = 0;
+      ols--;
+      nls--;
+    }
+#if defined (HANDLE_MULTIBYTE)
+    }
+#endif
+
+  if (wsatend)
+    {
+      ols = oe;
+      nls = ne;
+    }
+#if defined (HANDLE_MULTIBYTE)
+  /* This may not work for stateful encoding, but who cares?  To handle
+     stateful encoding properly, we have to scan each string from the
+     beginning and compare. */
+  else if (_rl_compare_chars (ols, 0, NULL, nls, 0, NULL) == 0)
+#else
+  else if (*ols != *nls)
+#endif
+    {
+      if (*ols)                        /* don't step past the NUL */
+       {
+         if (MB_CUR_MAX > 1 && rl_byte_oriented == 0)
+           ols = old + _rl_find_next_mbchar (old, ols - old, 1, MB_FIND_ANY);
+         else
+           ols++;
+       }
+      if (*nls)
+       {
+         if (MB_CUR_MAX > 1 && rl_byte_oriented == 0)
+           nls = new + _rl_find_next_mbchar (new, nls - new, 1, MB_FIND_ANY);
+         else
+           nls++;
+       }
+    }
+
+  /* count of invisible characters in the current invisible line. */
+  current_invis_chars = W_OFFSET (current_line, wrap_offset);
+  if (_rl_last_v_pos != current_line)
+    {
+      _rl_move_vert (current_line);
+      if ((MB_CUR_MAX == 1 || rl_byte_oriented) && current_line == 0 && visible_wrap_offset)
+       _rl_last_c_pos += visible_wrap_offset;
+    }
+
+  /* If this is the first line and there are invisible characters in the
+     prompt string, and the prompt string has not changed, and the current
+     cursor position is before the last invisible character in the prompt,
+     and the index of the character to move to is past the end of the prompt
+     string, then redraw the entire prompt string.  We can only do this
+     reliably if the terminal supports a `cr' capability.
+
+     This is not an efficiency hack -- there is a problem with redrawing
+     portions of the prompt string if they contain terminal escape
+     sequences (like drawing the `unbold' sequence without a corresponding
+     `bold') that manifests itself on certain terminals. */
+
+  lendiff = local_prompt_len;
+  od = ofd - old;      /* index of first difference in visible line */
+  if (current_line == 0 && !_rl_horizontal_scroll_mode &&
+      _rl_term_cr && lendiff > prompt_visible_length && _rl_last_c_pos > 0 &&
+      od >= lendiff && _rl_last_c_pos < PROMPT_ENDING_INDEX)
+    {
+#if defined (__MSDOS__)
+      putc ('\r', rl_outstream);
+#else
+      tputs (_rl_term_cr, 1, _rl_output_character_function);
+#endif
+      _rl_output_some_chars (local_prompt, lendiff);
+      if (MB_CUR_MAX > 1 && rl_byte_oriented == 0)
+       {
+         /* We take wrap_offset into account here so we can pass correct
+            information to _rl_move_cursor_relative. */
+         _rl_last_c_pos = _rl_col_width (local_prompt, 0, lendiff) - wrap_offset;
+         cpos_adjusted = 1;
+       }
+      else
+       _rl_last_c_pos = lendiff;
+    }
+
+  /* When this function returns, _rl_last_c_pos is correct, and an absolute
+     cursor postion in multibyte mode, but a buffer index when not in a
+     multibyte locale. */
+  _rl_move_cursor_relative (od, old);
+#if 1
+#if defined (HANDLE_MULTIBYTE)
+  /* We need to indicate that the cursor position is correct in the presence of
+     invisible characters in the prompt string.  Let's see if setting this when
+     we make sure we're at the end of the drawn prompt string works. */
+  if (current_line == 0 && MB_CUR_MAX > 1 && rl_byte_oriented == 0 && _rl_last_c_pos == prompt_physical_chars)
+    cpos_adjusted = 1;
+#endif
+#endif
+
+  /* if (len (new) > len (old))
+     lendiff == difference in buffer
+     col_lendiff == difference on screen
+     When not using multibyte characters, these are equal */
+  lendiff = (nls - nfd) - (ols - ofd);
+  if (MB_CUR_MAX > 1 && rl_byte_oriented == 0)
+    col_lendiff = _rl_col_width (new, nfd - new, nls - new) - _rl_col_width (old, ofd - old, ols - old);
+  else
+    col_lendiff = lendiff;
+
+  /* If we are changing the number of invisible characters in a line, and
+     the spot of first difference is before the end of the invisible chars,
+     lendiff needs to be adjusted. */
+  if (current_line == 0 && !_rl_horizontal_scroll_mode &&
+      current_invis_chars != visible_wrap_offset)
+    {
+      if (MB_CUR_MAX > 1 && rl_byte_oriented == 0)
+       {
+         lendiff += visible_wrap_offset - current_invis_chars;
+         col_lendiff += visible_wrap_offset - current_invis_chars;
+       }
+      else
+       {
+         lendiff += visible_wrap_offset - current_invis_chars;
+         col_lendiff = lendiff;
+       }
+    }
+
+  /* Insert (diff (len (old), len (new)) ch. */
+  temp = ne - nfd;
+  if (MB_CUR_MAX > 1 && rl_byte_oriented == 0)
+    col_temp = _rl_col_width (new, nfd - new, ne - new);
+  else
+    col_temp = temp;
+
+  if (col_lendiff > 0) /* XXX - was lendiff */
+    {
+      /* Non-zero if we're increasing the number of lines. */
+      int gl = current_line >= _rl_vis_botlin && inv_botlin > _rl_vis_botlin;
+      /* Sometimes it is cheaper to print the characters rather than
+        use the terminal's capabilities.  If we're growing the number
+        of lines, make sure we actually cause the new line to wrap
+        around on auto-wrapping terminals. */
+      if (_rl_terminal_can_insert && ((2 * col_temp) >= col_lendiff || _rl_term_IC) && (!_rl_term_autowrap || !gl))
+       {
+         /* If lendiff > prompt_visible_length and _rl_last_c_pos == 0 and
+            _rl_horizontal_scroll_mode == 1, inserting the characters with
+            _rl_term_IC or _rl_term_ic will screw up the screen because of the
+            invisible characters.  We need to just draw them. */
+         if (*ols && (!_rl_horizontal_scroll_mode || _rl_last_c_pos > 0 ||
+                       lendiff <= prompt_visible_length || !current_invis_chars))
+           {
+             insert_some_chars (nfd, lendiff, col_lendiff);
+             _rl_last_c_pos += col_lendiff;
+           }
+         else if ((MB_CUR_MAX == 1 || rl_byte_oriented != 0) && *ols == 0 && lendiff > 0)
+           {
+             /* At the end of a line the characters do not have to
+                be "inserted".  They can just be placed on the screen. */
+             /* However, this screws up the rest of this block, which
+                assumes you've done the insert because you can. */
+             _rl_output_some_chars (nfd, lendiff);
+             _rl_last_c_pos += col_lendiff;
+           }
+         else
+           {
+             /* We have horizontal scrolling and we are not inserting at
+                the end.  We have invisible characters in this line.  This
+                is a dumb update. */
+             _rl_output_some_chars (nfd, temp);
+             _rl_last_c_pos += col_temp;
+             return;
+           }
+         /* Copy (new) chars to screen from first diff to last match. */
+         temp = nls - nfd;
+         if ((temp - lendiff) > 0)
+           {
+             _rl_output_some_chars (nfd + lendiff, temp - lendiff);
+#if 1
+            /* XXX -- this bears closer inspection.  Fixes a redisplay bug
+               reported against bash-3.0-alpha by Andreas Schwab involving
+               multibyte characters and prompt strings with invisible
+               characters, but was previously disabled. */
+             _rl_last_c_pos += _rl_col_width (nfd+lendiff, 0, temp-col_lendiff);
+#else
+             _rl_last_c_pos += _rl_col_width (nfd+lendiff, 0, temp-lendiff);
+#endif
+           }
+       }
+      else
+       {
+         /* cannot insert chars, write to EOL */
+         _rl_output_some_chars (nfd, temp);
+         _rl_last_c_pos += col_temp;
+         /* If we're in a multibyte locale and were before the last invisible
+            char in the current line (which implies we just output some invisible
+            characters) we need to adjust _rl_last_c_pos, since it represents
+            a physical character position. */
+       }
+    }
+  else                         /* Delete characters from line. */
+    {
+      /* If possible and inexpensive to use terminal deletion, then do so. */
+      if (_rl_term_dc && (2 * col_temp) >= -col_lendiff)
+       {
+         /* If all we're doing is erasing the invisible characters in the
+            prompt string, don't bother.  It screws up the assumptions
+            about what's on the screen. */
+         if (_rl_horizontal_scroll_mode && _rl_last_c_pos == 0 &&
+             -lendiff == visible_wrap_offset)
+           col_lendiff = 0;
+
+         if (col_lendiff)
+           delete_chars (-col_lendiff); /* delete (diff) characters */
+
+         /* Copy (new) chars to screen from first diff to last match */
+         temp = nls - nfd;
+         if (temp > 0)
+           {
+             _rl_output_some_chars (nfd, temp);
+             _rl_last_c_pos += _rl_col_width (nfd, 0, temp);;
+           }
+       }
+      /* Otherwise, print over the existing material. */
+      else
+       {
+         if (temp > 0)
+           {
+             _rl_output_some_chars (nfd, temp);
+             _rl_last_c_pos += col_temp;               /* XXX */
+           }
+         lendiff = (oe - old) - (ne - new);
+         if (MB_CUR_MAX > 1 && rl_byte_oriented == 0)
+           col_lendiff = _rl_col_width (old, 0, oe - old) - _rl_col_width (new, 0, ne - new);
+         else
+           col_lendiff = lendiff;
+
+         if (col_lendiff)
+           {     
+             if (_rl_term_autowrap && current_line < inv_botlin)
+               space_to_eol (col_lendiff);
+             else
+               _rl_clear_to_eol (col_lendiff);
+           }
+       }
+    }
+}
+
+/* Tell the update routines that we have moved onto a new (empty) line. */
+int
+rl_on_new_line ()
+{
+  if (visible_line)
+    visible_line[0] = '\0';
+
+  _rl_last_c_pos = _rl_last_v_pos = 0;
+  _rl_vis_botlin = last_lmargin = 0;
+  if (vis_lbreaks)
+    vis_lbreaks[0] = vis_lbreaks[1] = 0;
+  visible_wrap_offset = 0;
+  return 0;
+}
+
+/* Tell the update routines that we have moved onto a new line with the
+   prompt already displayed.  Code originally from the version of readline
+   distributed with CLISP.  rl_expand_prompt must have already been called
+   (explicitly or implicitly).  This still doesn't work exactly right. */
+int
+rl_on_new_line_with_prompt ()
+{
+  int prompt_size, i, l, real_screenwidth, newlines;
+  char *prompt_last_line, *lprompt;
+
+  /* Initialize visible_line and invisible_line to ensure that they can hold
+     the already-displayed prompt. */
+  prompt_size = strlen (rl_prompt) + 1;
+  init_line_structures (prompt_size);
+
+  /* Make sure the line structures hold the already-displayed prompt for
+     redisplay. */
+  lprompt = local_prompt ? local_prompt : rl_prompt;
+  strcpy (visible_line, lprompt);
+  strcpy (invisible_line, lprompt);
+
+  /* If the prompt contains newlines, take the last tail. */
+  prompt_last_line = strrchr (rl_prompt, '\n');
+  if (!prompt_last_line)
+    prompt_last_line = rl_prompt;
+
+  l = strlen (prompt_last_line);
+  if (MB_CUR_MAX > 1 && rl_byte_oriented == 0)
+    _rl_last_c_pos = _rl_col_width (prompt_last_line, 0, l);   /* XXX */
+  else
+    _rl_last_c_pos = l;
+
+  /* Dissect prompt_last_line into screen lines. Note that here we have
+     to use the real screenwidth. Readline's notion of screenwidth might be
+     one less, see terminal.c. */
+  real_screenwidth = _rl_screenwidth + (_rl_term_autowrap ? 0 : 1);
+  _rl_last_v_pos = l / real_screenwidth;
+  /* If the prompt length is a multiple of real_screenwidth, we don't know
+     whether the cursor is at the end of the last line, or already at the
+     beginning of the next line. Output a newline just to be safe. */
+  if (l > 0 && (l % real_screenwidth) == 0)
+    _rl_output_some_chars ("\n", 1);
+  last_lmargin = 0;
+
+  newlines = 0; i = 0;
+  while (i <= l)
+    {
+      _rl_vis_botlin = newlines;
+      vis_lbreaks[newlines++] = i;
+      i += real_screenwidth;
+    }
+  vis_lbreaks[newlines] = l;
+  visible_wrap_offset = 0;
+
+  rl_display_prompt = rl_prompt;       /* XXX - make sure it's set */
+
+  return 0;
+}
+
+/* Actually update the display, period. */
+int
+rl_forced_update_display ()
+{
+  register char *temp;
+
+  if (visible_line)
+    {
+      temp = visible_line;
+      while (*temp)
+       *temp++ = '\0';
+    }
+  rl_on_new_line ();
+  forced_display++;
+  (*rl_redisplay_function) ();
+  return 0;
+}
+
+/* Move the cursor from _rl_last_c_pos to NEW, which are buffer indices.
+   (Well, when we don't have multibyte characters, _rl_last_c_pos is a
+   buffer index.)
+   DATA is the contents of the screen line of interest; i.e., where
+   the movement is being done. */
+void
+_rl_move_cursor_relative (new, data)
+     int new;
+     const char *data;
+{
+  register int i;
+  int woff;                    /* number of invisible chars on current line */
+  int cpos, dpos;              /* current and desired cursor positions */
+
+  woff = W_OFFSET (_rl_last_v_pos, wrap_offset);
+  cpos = _rl_last_c_pos;
+#if defined (HANDLE_MULTIBYTE)
+  /* If we have multibyte characters, NEW is indexed by the buffer point in
+     a multibyte string, but _rl_last_c_pos is the display position.  In
+     this case, NEW's display position is not obvious and must be
+     calculated.  We need to account for invisible characters in this line,
+     as long as we are past them and they are counted by _rl_col_width. */
+  if (MB_CUR_MAX > 1 && rl_byte_oriented == 0)
+    {
+      dpos = _rl_col_width (data, 0, new);
+      if (dpos > prompt_last_invisible)                /* XXX - don't use woff here */
+       {
+         dpos -= woff;
+         /* Since this will be assigned to _rl_last_c_pos at the end (more
+            precisely, _rl_last_c_pos == dpos when this function returns),
+            let the caller know. */
+         cpos_adjusted = 1;
+       }
+    }
+  else
+#endif
+    dpos = new;
+
+  /* If we don't have to do anything, then return. */
+  if (cpos == dpos)
+    return;
+
+  /* It may be faster to output a CR, and then move forwards instead
+     of moving backwards. */
+  /* i == current physical cursor position. */
+#if defined (HANDLE_MULTIBYTE)
+  if (MB_CUR_MAX > 1 && rl_byte_oriented == 0)
+    i = _rl_last_c_pos;
+  else
+#endif
+  i = _rl_last_c_pos - woff;
+  if (dpos == 0 || CR_FASTER (dpos, _rl_last_c_pos) ||
+      (_rl_term_autowrap && i == _rl_screenwidth))
+    {
+#if defined (__MSDOS__)
+      putc ('\r', rl_outstream);
+#else
+      tputs (_rl_term_cr, 1, _rl_output_character_function);
+#endif /* !__MSDOS__ */
+      cpos = _rl_last_c_pos = 0;
+    }
+
+  if (cpos < dpos)
+    {
+      /* Move the cursor forward.  We do it by printing the command
+        to move the cursor forward if there is one, else print that
+        portion of the output buffer again.  Which is cheaper? */
+
+      /* The above comment is left here for posterity.  It is faster
+        to print one character (non-control) than to print a control
+        sequence telling the terminal to move forward one character.
+        That kind of control is for people who don't know what the
+        data is underneath the cursor. */
+
+      /* However, we need a handle on where the current display position is
+        in the buffer for the immediately preceding comment to be true.
+        In multibyte locales, we don't currently have that info available.
+        Without it, we don't know where the data we have to display begins
+        in the buffer and we have to go back to the beginning of the screen
+        line.  In this case, we can use the terminal sequence to move forward
+        if it's available. */
+      if (MB_CUR_MAX > 1 && rl_byte_oriented == 0)
+       {
+         if (_rl_term_forward_char)
+           {
+             for (i = cpos; i < dpos; i++)
+               tputs (_rl_term_forward_char, 1, _rl_output_character_function);
+           }
+         else
+           {
+             tputs (_rl_term_cr, 1, _rl_output_character_function);
+             for (i = 0; i < new; i++)
+               putc (data[i], rl_outstream);
+           }
+       }
+      else
+       for (i = cpos; i < new; i++)
+         putc (data[i], rl_outstream);
+    }
+
+#if defined (HANDLE_MULTIBYTE)
+  /* NEW points to the buffer point, but _rl_last_c_pos is the display point.
+     The byte length of the string is probably bigger than the column width
+     of the string, which means that if NEW == _rl_last_c_pos, then NEW's
+     display point is less than _rl_last_c_pos. */
+#endif
+  else if (cpos > dpos)
+    _rl_backspace (cpos - dpos);
+
+  _rl_last_c_pos = dpos;
+}
+
+/* PWP: move the cursor up or down. */
+void
+_rl_move_vert (to)
+     int to;
+{
+  register int delta, i;
+
+  if (_rl_last_v_pos == to || to > _rl_screenheight)
+    return;
+
+  if ((delta = to - _rl_last_v_pos) > 0)
+    {
+      for (i = 0; i < delta; i++)
+       putc ('\n', rl_outstream);
+#if defined (__MSDOS__)
+      putc ('\r', rl_outstream);
+#else
+      tputs (_rl_term_cr, 1, _rl_output_character_function);
+#endif
+      _rl_last_c_pos = 0;
+    }
+  else
+    {                  /* delta < 0 */
+      if (_rl_term_up && *_rl_term_up)
+       for (i = 0; i < -delta; i++)
+         tputs (_rl_term_up, 1, _rl_output_character_function);
+    }
+
+  _rl_last_v_pos = to;         /* Now TO is here */
+}
+
+/* Physically print C on rl_outstream.  This is for functions which know
+   how to optimize the display.  Return the number of characters output. */
+int
+rl_show_char (c)
+     int c;
+{
+  int n = 1;
+  if (META_CHAR (c) && (_rl_output_meta_chars == 0))
+    {
+      fprintf (rl_outstream, "M-");
+      n += 2;
+      c = UNMETA (c);
+    }
+
+#if defined (DISPLAY_TABS)
+  if ((CTRL_CHAR (c) && c != '\t') || c == RUBOUT)
+#else
+  if (CTRL_CHAR (c) || c == RUBOUT)
+#endif /* !DISPLAY_TABS */
+    {
+      fprintf (rl_outstream, "C-");
+      n += 2;
+      c = CTRL_CHAR (c) ? UNCTRL (c) : '?';
+    }
+
+  putc (c, rl_outstream);
+  fflush (rl_outstream);
+  return n;
+}
+
+int
+rl_character_len (c, pos)
+     register int c, pos;
+{
+  unsigned char uc;
+
+  uc = (unsigned char)c;
+
+  if (META_CHAR (uc))
+    return ((_rl_output_meta_chars == 0) ? 4 : 1);
+
+  if (uc == '\t')
+    {
+#if defined (DISPLAY_TABS)
+      return (((pos | 7) + 1) - pos);
+#else
+      return (2);
+#endif /* !DISPLAY_TABS */
+    }
+
+  if (CTRL_CHAR (c) || c == RUBOUT)
+    return (2);
+
+  return ((ISPRINT (uc)) ? 1 : 2);
+}
+/* How to print things in the "echo-area".  The prompt is treated as a
+   mini-modeline. */
+static int msg_saved_prompt = 0;
+
+#if defined (USE_VARARGS)
+int
+#if defined (PREFER_STDARG)
+rl_message (const char *format, ...)
+#else
+rl_message (va_alist)
+     va_dcl
+#endif
+{
+  va_list args;
+#if defined (PREFER_VARARGS)
+  char *format;
+#endif
+
+#if defined (PREFER_STDARG)
+  va_start (args, format);
+#else
+  va_start (args);
+  format = va_arg (args, char *);
+#endif
+
+#if defined (HAVE_VSNPRINTF)
+  vsnprintf (msg_buf, sizeof (msg_buf) - 1, format, args);
+#else
+  vsprintf (msg_buf, format, args);
+  msg_buf[sizeof(msg_buf) - 1] = '\0'; /* overflow? */
+#endif
+  va_end (args);
+
+  if (saved_local_prompt == 0)
+    {
+      rl_save_prompt ();
+      msg_saved_prompt = 1;
+    }
+  rl_display_prompt = msg_buf;
+  local_prompt = expand_prompt (msg_buf, &prompt_visible_length,
+                                        &prompt_last_invisible,
+                                        &prompt_invis_chars_first_line,
+                                        &prompt_physical_chars);
+  local_prompt_prefix = (char *)NULL;
+  local_prompt_len = local_prompt ? strlen (local_prompt) : 0;
+  (*rl_redisplay_function) ();
+
+  return 0;
+}
+#else /* !USE_VARARGS */
+int
+rl_message (format, arg1, arg2)
+     char *format;
+{
+  sprintf (msg_buf, format, arg1, arg2);
+  msg_buf[sizeof(msg_buf) - 1] = '\0'; /* overflow? */
+
+  rl_display_prompt = msg_buf;
+  if (saved_local_prompt == 0)
+    {
+      rl_save_prompt ();
+      msg_saved_prompt = 1;
+    }
+  local_prompt = expand_prompt (msg_buf, &prompt_visible_length,
+                                        &prompt_last_invisible,
+                                        &prompt_invis_chars_first_line,
+                                        &prompt_physical_chars);
+  local_prompt_prefix = (char *)NULL;
+  local_prompt_len = local_prompt ? strlen (local_prompt) : 0;
+  (*rl_redisplay_function) ();
+      
+  return 0;
+}
+#endif /* !USE_VARARGS */
+
+/* How to clear things from the "echo-area". */
+int
+rl_clear_message ()
+{
+  rl_display_prompt = rl_prompt;
+  if (msg_saved_prompt)
+    {
+      rl_restore_prompt ();
+      msg_saved_prompt = 0;
+    }
+  (*rl_redisplay_function) ();
+  return 0;
+}
+
+int
+rl_reset_line_state ()
+{
+  rl_on_new_line ();
+
+  rl_display_prompt = rl_prompt ? rl_prompt : "";
+  forced_display = 1;
+  return 0;
+}
+
+void
+rl_save_prompt ()
+{
+  saved_local_prompt = local_prompt;
+  saved_local_prefix = local_prompt_prefix;
+  saved_prefix_length = prompt_prefix_length;
+  saved_local_length = local_prompt_len;
+  saved_last_invisible = prompt_last_invisible;
+  saved_visible_length = prompt_visible_length;
+  saved_invis_chars_first_line = prompt_invis_chars_first_line;
+  saved_physical_chars = prompt_physical_chars;
+
+  local_prompt = local_prompt_prefix = (char *)0;
+  local_prompt_len = 0;
+  prompt_last_invisible = prompt_visible_length = prompt_prefix_length = 0;
+  prompt_invis_chars_first_line = prompt_physical_chars = 0;
+}
+
+void
+rl_restore_prompt ()
+{
+  FREE (local_prompt);
+  FREE (local_prompt_prefix);
+
+  local_prompt = saved_local_prompt;
+  local_prompt_prefix = saved_local_prefix;
+  local_prompt_len = saved_local_length;
+  prompt_prefix_length = saved_prefix_length;
+  prompt_last_invisible = saved_last_invisible;
+  prompt_visible_length = saved_visible_length;
+  prompt_invis_chars_first_line = saved_invis_chars_first_line;
+  prompt_physical_chars = saved_physical_chars;
+
+  /* can test saved_local_prompt to see if prompt info has been saved. */
+  saved_local_prompt = saved_local_prefix = (char *)0;
+  saved_local_length = 0;
+  saved_last_invisible = saved_visible_length = saved_prefix_length = 0;
+  saved_invis_chars_first_line = saved_physical_chars = 0;
+}
+
+char *
+_rl_make_prompt_for_search (pchar)
+     int pchar;
+{
+  int len;
+  char *pmt, *p;
+
+  rl_save_prompt ();
+
+  /* We've saved the prompt, and can do anything with the various prompt
+     strings we need before they're restored.  We want the unexpanded
+     portion of the prompt string after any final newline. */
+  p = rl_prompt ? strrchr (rl_prompt, '\n') : 0;
+  if (p == 0)
+    {
+      len = (rl_prompt && *rl_prompt) ? strlen (rl_prompt) : 0;
+      pmt = (char *)xmalloc (len + 2);
+      if (len)
+       strcpy (pmt, rl_prompt);
+      pmt[len] = pchar;
+      pmt[len+1] = '\0';
+    }
+  else
+    {
+      p++;
+      len = strlen (p);
+      pmt = (char *)xmalloc (len + 2);
+      if (len)
+       strcpy (pmt, p);
+      pmt[len] = pchar;
+      pmt[len+1] = '\0';
+    }  
+
+  /* will be overwritten by expand_prompt, called from rl_message */
+  prompt_physical_chars = saved_physical_chars + 1;
+  return pmt;
+}
+
+/* Quick redisplay hack when erasing characters at the end of the line. */
+void
+_rl_erase_at_end_of_line (l)
+     int l;
+{
+  register int i;
+
+  _rl_backspace (l);
+  for (i = 0; i < l; i++)
+    putc (' ', rl_outstream);
+  _rl_backspace (l);
+  for (i = 0; i < l; i++)
+    visible_line[--_rl_last_c_pos] = '\0';
+  rl_display_fixed++;
+}
+
+/* Clear to the end of the line.  COUNT is the minimum
+   number of character spaces to clear, */
+void
+_rl_clear_to_eol (count)
+     int count;
+{
+  if (_rl_term_clreol)
+    tputs (_rl_term_clreol, 1, _rl_output_character_function);
+  else if (count)
+    space_to_eol (count);
+}
+
+/* Clear to the end of the line using spaces.  COUNT is the minimum
+   number of character spaces to clear, */
+static void
+space_to_eol (count)
+     int count;
+{
+  register int i;
+
+  for (i = 0; i < count; i++)
+   putc (' ', rl_outstream);
+
+  _rl_last_c_pos += count;
+}
+
+void
+_rl_clear_screen ()
+{
+  if (_rl_term_clrpag)
+    tputs (_rl_term_clrpag, 1, _rl_output_character_function);
+  else
+    rl_crlf ();
+}
+
+/* Insert COUNT characters from STRING to the output stream at column COL. */
+static void
+insert_some_chars (string, count, col)
+     char *string;
+     int count, col;
+{
+#if defined (__MSDOS__) || defined (__MINGW32__)
+  _rl_output_some_chars (string, count);
+#else
+  /* DEBUGGING */
+  if (MB_CUR_MAX == 1 || rl_byte_oriented)
+    if (count != col)
+      fprintf(stderr, "readline: debug: insert_some_chars: count (%d) != col (%d)\n", count, col);
+
+  /* If IC is defined, then we do not have to "enter" insert mode. */
+  if (_rl_term_IC)
+    {
+      char *buffer;
+
+      buffer = tgoto (_rl_term_IC, 0, col);
+      tputs (buffer, 1, _rl_output_character_function);
+      _rl_output_some_chars (string, count);
+    }
+  else
+    {
+      register int i;
+
+      /* If we have to turn on insert-mode, then do so. */
+      if (_rl_term_im && *_rl_term_im)
+       tputs (_rl_term_im, 1, _rl_output_character_function);
+
+      /* If there is a special command for inserting characters, then
+        use that first to open up the space. */
+      if (_rl_term_ic && *_rl_term_ic)
+       {
+         for (i = col; i--; )
+           tputs (_rl_term_ic, 1, _rl_output_character_function);
+       }
+
+      /* Print the text. */
+      _rl_output_some_chars (string, count);
+
+      /* If there is a string to turn off insert mode, we had best use
+        it now. */
+      if (_rl_term_ei && *_rl_term_ei)
+       tputs (_rl_term_ei, 1, _rl_output_character_function);
+    }
+#endif /* __MSDOS__ || __MINGW32__ */
+}
+
+/* Delete COUNT characters from the display line. */
+static void
+delete_chars (count)
+     int count;
+{
+  if (count > _rl_screenwidth) /* XXX */
+    return;
+
+#if !defined (__MSDOS__) && !defined (__MINGW32__)
+  if (_rl_term_DC && *_rl_term_DC)
+    {
+      char *buffer;
+      buffer = tgoto (_rl_term_DC, count, count);
+      tputs (buffer, count, _rl_output_character_function);
+    }
+  else
+    {
+      if (_rl_term_dc && *_rl_term_dc)
+       while (count--)
+         tputs (_rl_term_dc, 1, _rl_output_character_function);
+    }
+#endif /* !__MSDOS__ && !__MINGW32__ */
+}
+
+void
+_rl_update_final ()
+{
+  int full_lines;
+
+  full_lines = 0;
+  /* If the cursor is the only thing on an otherwise-blank last line,
+     compensate so we don't print an extra CRLF. */
+  if (_rl_vis_botlin && _rl_last_c_pos == 0 &&
+       visible_line[vis_lbreaks[_rl_vis_botlin]] == 0)
+    {
+      _rl_vis_botlin--;
+      full_lines = 1;
+    }
+  _rl_move_vert (_rl_vis_botlin);
+  /* If we've wrapped lines, remove the final xterm line-wrap flag. */
+  if (full_lines && _rl_term_autowrap && (VIS_LLEN(_rl_vis_botlin) == _rl_screenwidth))
+    {
+      char *last_line;
+
+      last_line = &visible_line[vis_lbreaks[_rl_vis_botlin]];
+      cpos_buffer_position = -1;       /* don't know where we are in buffer */
+      _rl_move_cursor_relative (_rl_screenwidth - 1, last_line);       /* XXX */
+      _rl_clear_to_eol (0);
+      putc (last_line[_rl_screenwidth - 1], rl_outstream);
+    }
+  _rl_vis_botlin = 0;
+  rl_crlf ();
+  fflush (rl_outstream);
+  rl_display_fixed++;
+}
+
+/* Move to the start of the current line. */
+static void
+cr ()
+{
+  if (_rl_term_cr)
+    {
+#if defined (__MSDOS__)
+      putc ('\r', rl_outstream);
+#else
+      tputs (_rl_term_cr, 1, _rl_output_character_function);
+#endif
+      _rl_last_c_pos = 0;
+    }
+}
+
+/* Redraw the last line of a multi-line prompt that may possibly contain
+   terminal escape sequences.  Called with the cursor at column 0 of the
+   line to draw the prompt on. */
+static void
+redraw_prompt (t)
+     char *t;
+{
+  char *oldp;
+
+  oldp = rl_display_prompt;
+  rl_save_prompt ();
+
+  rl_display_prompt = t;
+  local_prompt = expand_prompt (t, &prompt_visible_length,
+                                  &prompt_last_invisible,
+                                  &prompt_invis_chars_first_line,
+                                  &prompt_physical_chars);
+  local_prompt_prefix = (char *)NULL;
+  local_prompt_len = local_prompt ? strlen (local_prompt) : 0;
+
+  rl_forced_update_display ();
+
+  rl_display_prompt = oldp;
+  rl_restore_prompt();
+}
+      
+/* Redisplay the current line after a SIGWINCH is received. */
+void
+_rl_redisplay_after_sigwinch ()
+{
+  char *t;
+
+  /* Clear the current line and put the cursor at column 0.  Make sure
+     the right thing happens if we have wrapped to a new screen line. */
+  if (_rl_term_cr)
+    {
+#if defined (__MSDOS__)
+      putc ('\r', rl_outstream);
+#else
+      tputs (_rl_term_cr, 1, _rl_output_character_function);
+#endif
+      _rl_last_c_pos = 0;
+#if defined (__MSDOS__)
+      space_to_eol (_rl_screenwidth);
+      putc ('\r', rl_outstream);
+#else
+      if (_rl_term_clreol)
+       tputs (_rl_term_clreol, 1, _rl_output_character_function);
+      else
+       {
+         space_to_eol (_rl_screenwidth);
+         tputs (_rl_term_cr, 1, _rl_output_character_function);
+       }
+#endif
+      if (_rl_last_v_pos > 0)
+       _rl_move_vert (0);
+    }
+  else
+    rl_crlf ();
+
+  /* Redraw only the last line of a multi-line prompt. */
+  t = strrchr (rl_display_prompt, '\n');
+  if (t)
+    redraw_prompt (++t);
+  else
+    rl_forced_update_display ();
+}
+
+void
+_rl_clean_up_for_exit ()
+{
+  if (readline_echoing_p)
+    {
+      _rl_move_vert (_rl_vis_botlin);
+      _rl_vis_botlin = 0;
+      fflush (rl_outstream);
+      rl_restart_output (1, 0);
+    }
+}
+
+void
+_rl_erase_entire_line ()
+{
+  cr ();
+  _rl_clear_to_eol (0);
+  cr ();
+  fflush (rl_outstream);
+}
+
+/* return the `current display line' of the cursor -- the number of lines to
+   move up to get to the first screen line of the current readline line. */
+int
+_rl_current_display_line ()
+{
+  int ret, nleft;
+
+  /* Find out whether or not there might be invisible characters in the
+     editing buffer. */
+  if (rl_display_prompt == rl_prompt)
+    nleft = _rl_last_c_pos - _rl_screenwidth - rl_visible_prompt_length;
+  else
+    nleft = _rl_last_c_pos - _rl_screenwidth;
+
+  if (nleft > 0)
+    ret = 1 + nleft / _rl_screenwidth;
+  else
+    ret = 0;
+
+  return ret;
+}
+
+#if defined (HANDLE_MULTIBYTE)
+/* Calculate the number of screen columns occupied by STR from START to END.
+   In the case of multibyte characters with stateful encoding, we have to
+   scan from the beginning of the string to take the state into account. */
+static int
+_rl_col_width (str, start, end)
+     const char *str;
+     int start, end;
+{
+  wchar_t wc;
+  mbstate_t ps;
+  int tmp, point, width, max;
+
+  if (end <= start)
+    return 0;
+
+  memset (&ps, 0, sizeof (mbstate_t));
+
+  point = 0;
+  max = end;
+
+  while (point < start)
+    {
+      tmp = mbrlen (str + point, max, &ps);
+      if (MB_INVALIDCH ((size_t)tmp))
+       {
+         /* In this case, the bytes are invalid or too short to compose a
+            multibyte character, so we assume that the first byte represents
+            a single character. */
+         point++;
+         max--;
+
+         /* Clear the state of the byte sequence, because in this case the
+            effect of mbstate is undefined. */
+         memset (&ps, 0, sizeof (mbstate_t));
+       }
+      else if (MB_NULLWCH (tmp))
+       break;          /* Found '\0' */
+      else
+       {
+         point += tmp;
+         max -= tmp;
+       }
+    }
+
+  /* If START is not a byte that starts a character, then POINT will be
+     greater than START.  In this case, assume that (POINT - START) gives
+     a byte count that is the number of columns of difference. */
+  width = point - start;
+
+  while (point < end)
+    {
+      tmp = mbrtowc (&wc, str + point, max, &ps);
+      if (MB_INVALIDCH ((size_t)tmp))
+       {
+         /* In this case, the bytes are invalid or too short to compose a
+            multibyte character, so we assume that the first byte represents
+            a single character. */
+         point++;
+         max--;
+
+         /* and assume that the byte occupies a single column. */
+         width++;
+
+         /* Clear the state of the byte sequence, because in this case the
+            effect of mbstate is undefined. */
+         memset (&ps, 0, sizeof (mbstate_t));
+       }
+      else if (MB_NULLWCH (tmp))
+       break;                  /* Found '\0' */
+      else
+       {
+         point += tmp;
+         max -= tmp;
+         tmp = wcwidth(wc);
+         width += (tmp >= 0) ? tmp : 1;
+       }
+    }
+
+  width += point - end;
+
+  return width;
+}
+#endif /* HANDLE_MULTIBYTE */
diff --git a/doc/Makefile.in b/doc/Makefile.in
new file mode 100644 (file)
index 0000000..692a4e8
--- /dev/null
@@ -0,0 +1,252 @@
+# This makefile for Readline library documentation is in -*- text -*- mode.
+# Emacs likes it that way.
+
+# Copyright (C) 1996-2004 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111 USA.
+
+topdir = @top_srcdir@
+srcdir = @srcdir@
+VPATH = .:@srcdir@
+
+prefix = @prefix@
+infodir = @infodir@
+
+mandir = @mandir@
+manpfx = man
+
+man1ext = .1
+man1dir = $(mandir)/$(manpfx)1
+man3ext = .3
+man3dir = $(mandir)/$(manpfx)3
+
+# set this to a value to have the HTML documentation installed
+htmldir =
+
+# Support an alternate destination root directory for package building
+DESTDIR =
+
+SHELL = @MAKE_SHELL@
+RM = rm -f
+
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+
+BUILD_DIR = @BUILD_DIR@
+TEXINPUTDIR = $(srcdir)
+
+MAKEINFO    = LANGUAGE= makeinfo
+TEXI2DVI    = $(srcdir)/texi2dvi
+TEXI2HTML   = $(srcdir)/texi2html
+QUIETPS     = #set this to -q to shut up dvips
+PAPERSIZE   = letter
+PSDPI       = 600
+DVIPS       = dvips -D ${PSDPI} $(QUIETPS) -t ${PAPERSIZE} -o $@     # tricky
+
+# These tools might not be available; they're not required
+DVIPDF      = dvipdfm -o $@ -p ${PAPERSIZE}
+PSPDF       = gs -sPAPERSIZE=${PAPERSIZE} -sDEVICE=pdfwrite -dNOPAUSE -dBATCH -sOutputFile=$@
+
+RLSRC = $(srcdir)/rlman.texi $(srcdir)/rluser.texi \
+       $(srcdir)/rltech.texi $(srcdir)/version.texi \
+       $(srcdir)/rluserman.texi
+HISTSRC = $(srcdir)/history.texi $(srcdir)/hsuser.texi \
+         $(srcdir)/hstech.texi $(srcdir)/version.texi
+
+# This should be a program that converts troff to an ascii-readable format
+NROFF       = groff -Tascii
+
+# This should be a program that converts troff to postscript
+GROFF       = groff
+
+DVIOBJ = readline.dvi history.dvi rluserman.dvi
+INFOOBJ = readline.info history.info rluserman.info
+PSOBJ = readline.ps history.ps rluserman.ps readline_3.ps history_3.ps
+HTMLOBJ = readline.html history.html rluserman.html
+TEXTOBJ = readline.0 history.0
+PDFOBJ = readline.pdf history.pdf rluserman.pdf
+
+INTERMEDIATE_OBJ = rlman.dvi
+
+DIST_DOCS = $(DVIOBJ) $(PSOBJ) $(HTMLOBJ) $(INFOOBJ) $(TEXTOBJ)
+
+.SUFFIXES:      .0 .3 .ps .txt .dvi .html .pdf
+
+.3.0:
+       $(RM) $@
+       -${NROFF} -man $< > $@
+
+.ps.pdf:
+       $(RM) $@
+       -${PSPDF} $<
+
+.dvi.pdf:
+       $(RM) $@
+       -${DVIPDF} $<
+
+all: info dvi html ps text
+nodvi: info html text
+
+info:  $(INFOOBJ)
+dvi:   $(DVIOBJ)
+ps:    $(PSOBJ)
+html:  $(HTMLOBJ)
+text:  $(TEXTOBJ)
+pdf:   $(PDFOBJ)
+
+readline.dvi: $(RLSRC)
+       TEXINPUTS=.:$(TEXINPUTDIR):$$TEXINPUTS $(TEXI2DVI) $(srcdir)/rlman.texi
+       mv rlman.dvi readline.dvi
+
+readline.info: $(RLSRC)
+       $(MAKEINFO) --no-split -I $(TEXINPUTDIR) -o $@ $(srcdir)/rlman.texi
+
+rluserman.dvi: $(RLSRC)
+       TEXINPUTS=.:$(TEXINPUTDIR):$$TEXINPUTS $(TEXI2DVI) $(srcdir)/rluserman.texi
+
+rluserman.info: $(RLSRC)
+       $(MAKEINFO) --no-split -I $(TEXINPUTDIR) -o $@ $(srcdir)/rluserman.texi
+
+history.dvi: ${HISTSRC}
+       TEXINPUTS=.:$(TEXINPUTDIR):$$TEXINPUTS $(TEXI2DVI) $(srcdir)/history.texi
+
+history.info: ${HISTSRC}
+       $(MAKEINFO) --no-split -I $(TEXINPUTDIR) -o $@ $(srcdir)/history.texi
+
+readline.ps:   readline.dvi
+       $(RM) $@
+       $(DVIPS) readline.dvi
+
+rluserman.ps:  rluserman.dvi
+       $(RM) $@
+       $(DVIPS) rluserman.dvi
+
+history.ps:    history.dvi
+       $(RM) $@
+       $(DVIPS) history.dvi
+
+#
+# This leaves readline.html and rlman.html -- rlman.html is for www.gnu.org
+#
+readline.html: ${RLSRC}
+       $(TEXI2HTML) -menu -monolithic -I $(TEXINPUTDIR) $(srcdir)/rlman.texi
+       sed -e 's:rlman.html:readline.html:g' rlman.html > readline.html
+       $(RM) rlman.html
+
+rluserman.html:        ${RLSRC}
+       $(TEXI2HTML) -menu -monolithic -I $(TEXINPUTDIR) $(srcdir)/rluserman.texi
+
+history.html:  ${HISTSRC}
+       $(TEXI2HTML) -menu -monolithic -I $(TEXINPUTDIR) $(srcdir)/history.texi
+
+readline.0: readline.3
+
+readline_3.ps: readline.3
+       ${RM} $@
+       ${GROFF} -man < $(srcdir)/readline.3 > $@ 
+
+history.0: history.3
+
+history_3.ps: history.3
+       ${RM} $@
+       ${GROFF} -man < $(srcdir)/history.3 > $@ 
+
+readline.pdf:  readline.dvi
+history.pdf:   history.dvi
+rluserman.pdf: rluserman.dvi
+
+clean:
+       $(RM) *.aux *.bak *.cp *.fn *.ky *.log *.pg *.toc *.tp *.vr *.cps \
+             *.pgs *.bt *.bts *.rw *.rws *.fns *.kys *.tps *.vrs *.o \
+             core *.core
+
+mostlyclean: clean
+
+distclean: clean maybe-clean
+       $(RM) $(INTERMEDIATE_OBJ)
+       $(RM) Makefile
+
+maybe-clean:
+       -if test "X$(topdir)" != "X$(BUILD_DIR)"; then \
+               $(RM) $(DIST_DOCS); \
+       fi
+
+maintainer-clean: clean
+       $(RM) $(DIST_DOCS)
+       $(RM) $(INTERMEDIATE_OBJ)
+       $(RM) $(PDFOBJ)
+       $(RM) Makefile
+
+installdirs:   $(topdir)/support/mkdirs
+       -$(SHELL) $(topdir)/support/mkdirs $(DESTDIR)$(infodir) $(DESTDIR)$(man3dir)
+       -if test -n "${htmldir}" ; then \
+               $(SHELL) $(topdir)/support/mkdirs $(DESTDIR)$(htmldir) ; \
+       fi
+
+install:       installdirs
+       if test -f readline.info; then \
+               ${INSTALL_DATA} readline.info $(DESTDIR)$(infodir)/readline.info; \
+       else \
+               ${INSTALL_DATA} $(srcdir)/readline.info $(DESTDIR)$(infodir)/readline.info; \
+       fi
+       if test -f rluserman.info; then \
+               ${INSTALL_DATA} rluserman.info $(DESTDIR)$(infodir)/rluserman.info; \
+       else \
+               ${INSTALL_DATA} $(srcdir)/rluserman.info $(DESTDIR)$(infodir)/rluserman.info; \
+       fi
+       if test -f history.info; then \
+               ${INSTALL_DATA} history.info $(DESTDIR)$(infodir)/history.info; \
+       else \
+               ${INSTALL_DATA} $(srcdir)/history.info $(DESTDIR)$(infodir)/history.info; \
+       fi
+       -if $(SHELL) -c 'install-info --version' >/dev/null 2>&1; then \
+               install-info --dir-file=$(DESTDIR)$(infodir)/dir \
+                       $(DESTDIR)$(infodir)/readline.info ; \
+               install-info --dir-file=$(DESTDIR)$(infodir)/dir \
+                       $(DESTDIR)$(infodir)/history.info ; \
+               install-info --dir-file=$(DESTDIR)$(infodir)/dir \
+                       $(DESTDIR)$(infodir)/rluserman.info ; \
+       else true; fi
+       -${INSTALL_DATA} $(srcdir)/readline.3 $(DESTDIR)$(man3dir)/readline$(man3ext)
+       -${INSTALL_DATA} $(srcdir)/history.3 $(DESTDIR)$(man3dir)/history$(man3ext)
+       -if test -n "${htmldir}" ; then \
+               if test -f readline.html; then \
+                       ${INSTALL_DATA} readline.html $(DESTDIR)$(htmldir)/readline.html; \
+               else \
+                       ${INSTALL_DATA} $(srcdir)/readline.html $(DESTDIR)$(htmldir)/readline.html; \
+               fi ; \
+               if test -f history.html; then \
+                       ${INSTALL_DATA} history.html $(DESTDIR)$(htmldir)/history.html; \
+               else \
+                       ${INSTALL_DATA} $(srcdir)/history.html $(DESTDIR)$(htmldir)/history.html; \
+               fi ; \
+               if test -f rluserman.html; then \
+                       ${INSTALL_DATA} rluserman.html $(DESTDIR)$(htmldir)/rluserman.html; \
+               else \
+                       ${INSTALL_DATA} $(srcdir)/rluserman.html $(DESTDIR)$(htmldir)/rluserman.html; \
+               fi ; \
+       fi
+
+uninstall:
+       $(RM) $(DESTDIR)$(infodir)/readline.info
+       $(RM) $(DESTDIR)$(infodir)/rluserman.info
+       $(RM) $(DESTDIR)$(infodir)/history.info
+       $(RM) $(DESTDIR)$(man3dir)/readline$(man3ext)
+       $(RM) $(DESTDIR)$(man3dir)/history$(man3ext)
+       -if test -n "${htmldir}" ; then \
+               $(RM) $(DESTDIR)$(htmldir)/readline.html ; \
+               $(RM) $(DESTDIR)$(htmldir)/rluserman.html ; \
+               $(RM) $(DESTDIR)$(htmldir)/history.html ; \
+       fi
diff --git a/doc/fdl.texi b/doc/fdl.texi
new file mode 100644 (file)
index 0000000..47ead9f
--- /dev/null
@@ -0,0 +1,452 @@
+
+@node GNU Free Documentation License
+@appendixsec GNU Free Documentation License
+
+@cindex FDL, GNU Free Documentation License
+@center Version 1.2, November 2002
+
+@display
+Copyright @copyright{} 2000,2001,2002 Free Software Foundation, Inc.
+59 Temple Place, Suite 330, Boston, MA  02111-1307, USA
+
+Everyone is permitted to copy and distribute verbatim copies
+of this license document, but changing it is not allowed.
+@end display
+
+@enumerate 0
+@item
+PREAMBLE
+
+The purpose of this License is to make a manual, textbook, or other
+functional and useful document @dfn{free} in the sense of freedom: to
+assure everyone the effective freedom to copy and redistribute it,
+with or without modifying it, either commercially or noncommercially.
+Secondarily, this License preserves for the author and publisher a way
+to get credit for their work, while not being considered responsible
+for modifications made by others.
+
+This License is a kind of ``copyleft'', which means that derivative
+works of the document must themselves be free in the same sense.  It
+complements the GNU General Public License, which is a copyleft
+license designed for free software.
+
+We have designed this License in order to use it for manuals for free
+software, because free software needs free documentation: a free
+program should come with manuals providing the same freedoms that the
+software does.  But this License is not limited to software manuals;
+it can be used for any textual work, regardless of subject matter or
+whether it is published as a printed book.  We recommend this License
+principally for works whose purpose is instruction or reference.
+
+@item
+APPLICABILITY AND DEFINITIONS
+
+This License applies to any manual or other work, in any medium, that
+contains a notice placed by the copyright holder saying it can be
+distributed under the terms of this License.  Such a notice grants a
+world-wide, royalty-free license, unlimited in duration, to use that
+work under the conditions stated herein.  The ``Document'', below,
+refers to any such manual or work.  Any member of the public is a
+licensee, and is addressed as ``you''.  You accept the license if you
+copy, modify or distribute the work in a way requiring permission
+under copyright law.
+
+A ``Modified Version'' of the Document means any work containing the
+Document or a portion of it, either copied verbatim, or with
+modifications and/or translated into another language.
+
+A ``Secondary Section'' is a named appendix or a front-matter section
+of the Document that deals exclusively with the relationship of the
+publishers or authors of the Document to the Document's overall
+subject (or to related matters) and contains nothing that could fall
+directly within that overall subject.  (Thus, if the Document is in
+part a textbook of mathematics, a Secondary Section may not explain
+any mathematics.)  The relationship could be a matter of historical
+connection with the subject or with related matters, or of legal,
+commercial, philosophical, ethical or political position regarding
+them.
+
+The ``Invariant Sections'' are certain Secondary Sections whose titles
+are designated, as being those of Invariant Sections, in the notice
+that says that the Document is released under this License.  If a
+section does not fit the above definition of Secondary then it is not
+allowed to be designated as Invariant.  The Document may contain zero
+Invariant Sections.  If the Document does not identify any Invariant
+Sections then there are none.
+
+The ``Cover Texts'' are certain short passages of text that are listed,
+as Front-Cover Texts or Back-Cover Texts, in the notice that says that
+the Document is released under this License.  A Front-Cover Text may
+be at most 5 words, and a Back-Cover Text may be at most 25 words.
+
+A ``Transparent'' copy of the Document means a machine-readable copy,
+represented in a format whose specification is available to the
+general public, that is suitable for revising the document
+straightforwardly with generic text editors or (for images composed of
+pixels) generic paint programs or (for drawings) some widely available
+drawing editor, and that is suitable for input to text formatters or
+for automatic translation to a variety of formats suitable for input
+to text formatters.  A copy made in an otherwise Transparent file
+format whose markup, or absence of markup, has been arranged to thwart
+or discourage subsequent modification by readers is not Transparent.
+An image format is not Transparent if used for any substantial amount
+of text.  A copy that is not ``Transparent'' is called ``Opaque''.
+
+Examples of suitable formats for Transparent copies include plain
+@sc{ascii} without markup, Texinfo input format, La@TeX{} input
+format, @acronym{SGML} or @acronym{XML} using a publicly available
+@acronym{DTD}, and standard-conforming simple @acronym{HTML},
+PostScript or @acronym{PDF} designed for human modification.  Examples
+of transparent image formats include @acronym{PNG}, @acronym{XCF} and
+@acronym{JPG}.  Opaque formats include proprietary formats that can be
+read and edited only by proprietary word processors, @acronym{SGML} or
+@acronym{XML} for which the @acronym{DTD} and/or processing tools are
+not generally available, and the machine-generated @acronym{HTML},
+PostScript or @acronym{PDF} produced by some word processors for
+output purposes only.
+
+The ``Title Page'' means, for a printed book, the title page itself,
+plus such following pages as are needed to hold, legibly, the material
+this License requires to appear in the title page.  For works in
+formats which do not have any title page as such, ``Title Page'' means
+the text near the most prominent appearance of the work's title,
+preceding the beginning of the body of the text.
+
+A section ``Entitled XYZ'' means a named subunit of the Document whose
+title either is precisely XYZ or contains XYZ in parentheses following
+text that translates XYZ in another language.  (Here XYZ stands for a
+specific section name mentioned below, such as ``Acknowledgements'',
+``Dedications'', ``Endorsements'', or ``History''.)  To ``Preserve the Title''
+of such a section when you modify the Document means that it remains a
+section ``Entitled XYZ'' according to this definition.
+
+The Document may include Warranty Disclaimers next to the notice which
+states that this License applies to the Document.  These Warranty
+Disclaimers are considered to be included by reference in this
+License, but only as regards disclaiming warranties: any other
+implication that these Warranty Disclaimers may have is void and has
+no effect on the meaning of this License.
+
+@item
+VERBATIM COPYING
+
+You may copy and distribute the Document in any medium, either
+commercially or noncommercially, provided that this License, the
+copyright notices, and the license notice saying this License applies
+to the Document are reproduced in all copies, and that you add no other
+conditions whatsoever to those of this License.  You may not use
+technical measures to obstruct or control the reading or further
+copying of the copies you make or distribute.  However, you may accept
+compensation in exchange for copies.  If you distribute a large enough
+number of copies you must also follow the conditions in section 3.
+
+You may also lend copies, under the same conditions stated above, and
+you may publicly display copies.
+
+@item
+COPYING IN QUANTITY
+
+If you publish printed copies (or copies in media that commonly have
+printed covers) of the Document, numbering more than 100, and the
+Document's license notice requires Cover Texts, you must enclose the
+copies in covers that carry, clearly and legibly, all these Cover
+Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on
+the back cover.  Both covers must also clearly and legibly identify
+you as the publisher of these copies.  The front cover must present
+the full title with all words of the title equally prominent and
+visible.  You may add other material on the covers in addition.
+Copying with changes limited to the covers, as long as they preserve
+the title of the Document and satisfy these conditions, can be treated
+as verbatim copying in other respects.
+
+If the required texts for either cover are too voluminous to fit
+legibly, you should put the first ones listed (as many as fit
+reasonably) on the actual cover, and continue the rest onto adjacent
+pages.
+
+If you publish or distribute Opaque copies of the Document numbering
+more than 100, you must either include a machine-readable Transparent
+copy along with each Opaque copy, or state in or with each Opaque copy
+a computer-network location from which the general network-using
+public has access to download using public-standard network protocols
+a complete Transparent copy of the Document, free of added material.
+If you use the latter option, you must take reasonably prudent steps,
+when you begin distribution of Opaque copies in quantity, to ensure
+that this Transparent copy will remain thus accessible at the stated
+location until at least one year after the last time you distribute an
+Opaque copy (directly or through your agents or retailers) of that
+edition to the public.
+
+It is requested, but not required, that you contact the authors of the
+Document well before redistributing any large number of copies, to give
+them a chance to provide you with an updated version of the Document.
+
+@item
+MODIFICATIONS
+
+You may copy and distribute a Modified Version of the Document under
+the conditions of sections 2 and 3 above, provided that you release
+the Modified Version under precisely this License, with the Modified
+Version filling the role of the Document, thus licensing distribution
+and modification of the Modified Version to whoever possesses a copy
+of it.  In addition, you must do these things in the Modified Version:
+
+@enumerate A
+@item
+Use in the Title Page (and on the covers, if any) a title distinct
+from that of the Document, and from those of previous versions
+(which should, if there were any, be listed in the History section
+of the Document).  You may use the same title as a previous version
+if the original publisher of that version gives permission.
+
+@item
+List on the Title Page, as authors, one or more persons or entities
+responsible for authorship of the modifications in the Modified
+Version, together with at least five of the principal authors of the
+Document (all of its principal authors, if it has fewer than five),
+unless they release you from this requirement.
+
+@item
+State on the Title page the name of the publisher of the
+Modified Version, as the publisher.
+
+@item
+Preserve all the copyright notices of the Document.
+
+@item
+Add an appropriate copyright notice for your modifications
+adjacent to the other copyright notices.
+
+@item
+Include, immediately after the copyright notices, a license notice
+giving the public permission to use the Modified Version under the
+terms of this License, in the form shown in the Addendum below.
+
+@item
+Preserve in that license notice the full lists of Invariant Sections
+and required Cover Texts given in the Document's license notice.
+
+@item
+Include an unaltered copy of this License.
+
+@item
+Preserve the section Entitled ``History'', Preserve its Title, and add
+to it an item stating at least the title, year, new authors, and
+publisher of the Modified Version as given on the Title Page.  If
+there is no section Entitled ``History'' in the Document, create one
+stating the title, year, authors, and publisher of the Document as
+given on its Title Page, then add an item describing the Modified
+Version as stated in the previous sentence.
+
+@item
+Preserve the network location, if any, given in the Document for
+public access to a Transparent copy of the Document, and likewise
+the network locations given in the Document for previous versions
+it was based on.  These may be placed in the ``History'' section.
+You may omit a network location for a work that was published at
+least four years before the Document itself, or if the original
+publisher of the version it refers to gives permission.
+
+@item
+For any section Entitled ``Acknowledgements'' or ``Dedications'', Preserve
+the Title of the section, and preserve in the section all the
+substance and tone of each of the contributor acknowledgements and/or
+dedications given therein.
+
+@item
+Preserve all the Invariant Sections of the Document,
+unaltered in their text and in their titles.  Section numbers
+or the equivalent are not considered part of the section titles.
+
+@item
+Delete any section Entitled ``Endorsements''.  Such a section
+may not be included in the Modified Version.
+
+@item
+Do not retitle any existing section to be Entitled ``Endorsements'' or
+to conflict in title with any Invariant Section.
+
+@item
+Preserve any Warranty Disclaimers.
+@end enumerate
+
+If the Modified Version includes new front-matter sections or
+appendices that qualify as Secondary Sections and contain no material
+copied from the Document, you may at your option designate some or all
+of these sections as invariant.  To do this, add their titles to the
+list of Invariant Sections in the Modified Version's license notice.
+These titles must be distinct from any other section titles.
+
+You may add a section Entitled ``Endorsements'', provided it contains
+nothing but endorsements of your Modified Version by various
+parties---for example, statements of peer review or that the text has
+been approved by an organization as the authoritative definition of a
+standard.
+
+You may add a passage of up to five words as a Front-Cover Text, and a
+passage of up to 25 words as a Back-Cover Text, to the end of the list
+of Cover Texts in the Modified Version.  Only one passage of
+Front-Cover Text and one of Back-Cover Text may be added by (or
+through arrangements made by) any one entity.  If the Document already
+includes a cover text for the same cover, previously added by you or
+by arrangement made by the same entity you are acting on behalf of,
+you may not add another; but you may replace the old one, on explicit
+permission from the previous publisher that added the old one.
+
+The author(s) and publisher(s) of the Document do not by this License
+give permission to use their names for publicity for or to assert or
+imply endorsement of any Modified Version.
+
+@item
+COMBINING DOCUMENTS
+
+You may combine the Document with other documents released under this
+License, under the terms defined in section 4 above for modified
+versions, provided that you include in the combination all of the
+Invariant Sections of all of the original documents, unmodified, and
+list them all as Invariant Sections of your combined work in its
+license notice, and that you preserve all their Warranty Disclaimers.
+
+The combined work need only contain one copy of this License, and
+multiple identical Invariant Sections may be replaced with a single
+copy.  If there are multiple Invariant Sections with the same name but
+different contents, make the title of each such section unique by
+adding at the end of it, in parentheses, the name of the original
+author or publisher of that section if known, or else a unique number.
+Make the same adjustment to the section titles in the list of
+Invariant Sections in the license notice of the combined work.
+
+In the combination, you must combine any sections Entitled ``History''
+in the various original documents, forming one section Entitled
+``History''; likewise combine any sections Entitled ``Acknowledgements'',
+and any sections Entitled ``Dedications''.  You must delete all
+sections Entitled ``Endorsements.''
+
+@item
+COLLECTIONS OF DOCUMENTS
+
+You may make a collection consisting of the Document and other documents
+released under this License, and replace the individual copies of this
+License in the various documents with a single copy that is included in
+the collection, provided that you follow the rules of this License for
+verbatim copying of each of the documents in all other respects.
+
+You may extract a single document from such a collection, and distribute
+it individually under this License, provided you insert a copy of this
+License into the extracted document, and follow this License in all
+other respects regarding verbatim copying of that document.
+
+@item
+AGGREGATION WITH INDEPENDENT WORKS
+
+A compilation of the Document or its derivatives with other separate
+and independent documents or works, in or on a volume of a storage or
+distribution medium, is called an ``aggregate'' if the copyright
+resulting from the compilation is not used to limit the legal rights
+of the compilation's users beyond what the individual works permit.
+When the Document is included an aggregate, this License does not
+apply to the other works in the aggregate which are not themselves
+derivative works of the Document.
+
+If the Cover Text requirement of section 3 is applicable to these
+copies of the Document, then if the Document is less than one half of
+the entire aggregate, the Document's Cover Texts may be placed on
+covers that bracket the Document within the aggregate, or the
+electronic equivalent of covers if the Document is in electronic form.
+Otherwise they must appear on printed covers that bracket the whole
+aggregate.
+
+@item
+TRANSLATION
+
+Translation is considered a kind of modification, so you may
+distribute translations of the Document under the terms of section 4.
+Replacing Invariant Sections with translations requires special
+permission from their copyright holders, but you may include
+translations of some or all Invariant Sections in addition to the
+original versions of these Invariant Sections.  You may include a
+translation of this License, and all the license notices in the
+Document, and any Warranty Disclaimers, provided that you also include
+the original English version of this License and the original versions
+of those notices and disclaimers.  In case of a disagreement between
+the translation and the original version of this License or a notice
+or disclaimer, the original version will prevail.
+
+If a section in the Document is Entitled ``Acknowledgements'',
+``Dedications'', or ``History'', the requirement (section 4) to Preserve
+its Title (section 1) will typically require changing the actual
+title.
+
+@item
+TERMINATION
+
+You may not copy, modify, sublicense, or distribute the Document except
+as expressly provided for under this License.  Any other attempt to
+copy, modify, sublicense or distribute the Document is void, and will
+automatically terminate your rights under this License.  However,
+parties who have received copies, or rights, from you under this
+License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+@item
+FUTURE REVISIONS OF THIS LICENSE
+
+The Free Software Foundation may publish new, revised versions
+of the GNU Free Documentation License from time to time.  Such new
+versions will be similar in spirit to the present version, but may
+differ in detail to address new problems or concerns.  See
+@uref{http://www.gnu.org/copyleft/}.
+
+Each version of the License is given a distinguishing version number.
+If the Document specifies that a particular numbered version of this
+License ``or any later version'' applies to it, you have the option of
+following the terms and conditions either of that specified version or
+of any later version that has been published (not as a draft) by the
+Free Software Foundation.  If the Document does not specify a version
+number of this License, you may choose any version ever published (not
+as a draft) by the Free Software Foundation.
+@end enumerate
+
+@page
+@appendixsubsec ADDENDUM: How to use this License for your documents
+
+To use this License in a document you have written, include a copy of
+the License in the document and put the following copyright and
+license notices just after the title page:
+
+@smallexample
+@group
+  Copyright (C)  @var{year}  @var{your name}.
+  Permission is granted to copy, distribute and/or modify this document
+  under the terms of the GNU Free Documentation License, Version 1.2
+  or any later version published by the Free Software Foundation;
+  with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.
+  A copy of the license is included in the section entitled ``GNU
+  Free Documentation License''.
+@end group
+@end smallexample
+
+If you have Invariant Sections, Front-Cover Texts and Back-Cover Texts,
+replace the ``with...Texts.'' line with this:
+
+@smallexample
+@group
+    with the Invariant Sections being @var{list their titles}, with
+    the Front-Cover Texts being @var{list}, and with the Back-Cover Texts
+    being @var{list}.
+@end group
+@end smallexample
+
+If you have Invariant Sections without Cover Texts, or some other
+combination of the three, merge those two alternatives to suit the
+situation.
+
+If your document contains nontrivial examples of program code, we
+recommend releasing these examples in parallel under your choice of
+free software license, such as the GNU General Public License,
+to permit their use in free software.
+
+@c Local Variables:
+@c ispell-local-pdict: "ispell-dict"
+@c End:
+
diff --git a/doc/history.0 b/doc/history.0
new file mode 100644 (file)
index 0000000..3362294
--- /dev/null
@@ -0,0 +1,488 @@
+HISTORY(3)                                                          HISTORY(3)
+
+
+
+N\bNA\bAM\bME\bE
+       history - GNU History Library
+
+C\bCO\bOP\bPY\bYR\bRI\bIG\bGH\bHT\bT
+       The GNU History Library is Copyright (C) 1989-2002 by the Free Software
+       Foundation, Inc.
+
+D\bDE\bES\bSC\bCR\bRI\bIP\bPT\bTI\bIO\bON\bN
+       Many programs read input from the user a line at a time.  The GNU  His-
+       tory  library is able to keep track of those lines, associate arbitrary
+       data with each line, and utilize information  from  previous  lines  in
+       composing new ones.
+
+
+H\bHI\bIS\bST\bTO\bOR\bRY\bY E\bEX\bXP\bPA\bAN\bNS\bSI\bIO\bON\bN
+       The  history library supports a history expansion feature that is iden-
+       tical to the history expansion in b\bba\bas\bsh\bh.\b.  This  section  describes  what
+       syntax features are available.
+
+       History expansions introduce words from the history list into the input
+       stream, making it easy to repeat commands, insert the  arguments  to  a
+       previous command into the current input line, or fix errors in previous
+       commands quickly.
+
+       History expansion is usually performed  immediately  after  a  complete
+       line  is read.  It takes place in two parts.  The first is to determine
+       which line from the history list to use during substitution.  The  sec-
+       ond  is  to select portions of that line for inclusion into the current
+       one.  The line selected from the history is the _\be_\bv_\be_\bn_\bt, and the portions
+       of  that  line  that  are  acted upon are _\bw_\bo_\br_\bd_\bs.  Various _\bm_\bo_\bd_\bi_\bf_\bi_\be_\br_\bs are
+       available to manipulate the selected words.  The line  is  broken  into
+       words in the same fashion as b\bba\bas\bsh\bh does when reading input, so that sev-
+       eral words that would otherwise be separated are  considered  one  word
+       when  surrounded  by  quotes (see the description of h\bhi\bis\bst\bto\bor\bry\by_\b_t\bto\bok\bke\ben\bni\biz\bze\be(\b()\b)
+       below).  History expansions are introduced by  the  appearance  of  the
+       history expansion character, which is !\b! by default.  Only backslash (\\b\)
+       and single quotes can quote the history expansion character.
+
+   E\bEv\bve\ben\bnt\bt D\bDe\bes\bsi\big\bgn\bna\bat\bto\bor\brs\bs
+       An event designator is a reference to a command line entry in the  his-
+       tory list.
+
+       !\b!      Start  a  history substitution, except when followed by a b\bbl\bla\ban\bnk\bk,
+              newline, = or (.
+       !\b!_\bn     Refer to command line _\bn.
+       !\b!-\b-_\bn    Refer to the current command line minus _\bn.
+       !\b!!\b!     Refer to the previous command.  This is a synonym for `!-1'.
+       !\b!_\bs_\bt_\br_\bi_\bn_\bg
+              Refer to the most recent command starting with _\bs_\bt_\br_\bi_\bn_\bg.
+       !\b!?\b?_\bs_\bt_\br_\bi_\bn_\bg[\b[?\b?]\b]
+              Refer to the most recent command containing _\bs_\bt_\br_\bi_\bn_\bg.  The  trail-
+              ing ?\b? may be omitted if _\bs_\bt_\br_\bi_\bn_\bg is followed immediately by a new-
+              line.
+       ^\b^_\bs_\bt_\br_\bi_\bn_\bg_\b1^\b^_\bs_\bt_\br_\bi_\bn_\bg_\b2^\b^
+              Quick substitution.  Repeat the last command, replacing  _\bs_\bt_\br_\bi_\bn_\bg_\b1
+              with _\bs_\bt_\br_\bi_\bn_\bg_\b2.  Equivalent to ``!!:s/_\bs_\bt_\br_\bi_\bn_\bg_\b1/_\bs_\bt_\br_\bi_\bn_\bg_\b2/'' (see M\bMo\bod\bd-\b-
+              i\bif\bfi\bie\ber\brs\bs below).
+       !\b!#\b#     The entire command line typed so far.
+
+   W\bWo\bor\brd\bd D\bDe\bes\bsi\big\bgn\bna\bat\bto\bor\brs\bs
+       Word designators are used to select desired words from the event.  A  :\b:
+       separates  the event specification from the word designator.  It may be
+       omitted if the word designator begins with a ^\b^, $\b$, *\b*, -\b-, or  %\b%.   Words
+       are  numbered from the beginning of the line, with the first word being
+       denoted by 0 (zero).  Words are inserted into the  current  line  sepa-
+       rated by single spaces.
+
+       0\b0 (\b(z\bze\ber\bro\bo)\b)
+              The zeroth word.  For the shell, this is the command word.
+       _\bn      The _\bnth word.
+       ^\b^      The first argument.  That is, word 1.
+       $\b$      The last argument.
+       %\b%      The word matched by the most recent `?_\bs_\bt_\br_\bi_\bn_\bg?' search.
+       _\bx-\b-_\by    A range of words; `-_\by' abbreviates `0-_\by'.
+       *\b*      All  of  the words but the zeroth.  This is a synonym for `_\b1_\b-_\b$'.
+              It is not an error to use *\b* if there is just  one  word  in  the
+              event; the empty string is returned in that case.
+       x\bx*\b*     Abbreviates _\bx_\b-_\b$.
+       x\bx-\b-     Abbreviates _\bx_\b-_\b$ like x\bx*\b*, but omits the last word.
+
+       If  a  word  designator is supplied without an event specification, the
+       previous command is used as the event.
+
+   M\bMo\bod\bdi\bif\bfi\bie\ber\brs\bs
+       After the optional word designator, there may appear a sequence of  one
+       or more of the following modifiers, each preceded by a `:'.
+
+       h\bh      Remove a trailing file name component, leaving only the head.
+       t\bt      Remove all leading file name components, leaving the tail.
+       r\br      Remove a trailing suffix of the form _\b._\bx_\bx_\bx, leaving the basename.
+       e\be      Remove all but the trailing suffix.
+       p\bp      Print the new command but do not execute it.
+       q\bq      Quote the substituted words, escaping further substitutions.
+       x\bx      Quote the substituted words as with q\bq, but break into  words  at
+              b\bbl\bla\ban\bnk\bks\bs and newlines.
+       s\bs/\b/_\bo_\bl_\bd/\b/_\bn_\be_\bw/\b/
+              Substitute  _\bn_\be_\bw  for  the  first  occurrence of _\bo_\bl_\bd in the event
+              line.  Any delimiter can be used  in  place  of  /.   The  final
+              delimiter  is  optional if it is the last character of the event
+              line.  The delimiter may be quoted in _\bo_\bl_\bd and _\bn_\be_\bw with a  single
+              backslash.   If & appears in _\bn_\be_\bw, it is replaced by _\bo_\bl_\bd.  A sin-
+              gle backslash will quote the &.  If _\bo_\bl_\bd is null, it  is  set  to
+              the  last  _\bo_\bl_\bd substituted, or, if no previous history substitu-
+              tions took place, the last _\bs_\bt_\br_\bi_\bn_\bg in a !\b!?\b?_\bs_\bt_\br_\bi_\bn_\bg[\b[?\b?]\b]  search.
+       &\b&      Repeat the previous substitution.
+       g\bg      Cause changes to be applied over the entire event line.  This is
+              used  in  conjunction  with `:\b:s\bs' (e.g., `:\b:g\bgs\bs/\b/_\bo_\bl_\bd/\b/_\bn_\be_\bw/\b/') or `:\b:&\b&'.
+              If used with `:\b:s\bs', any delimiter can be used in place of /,  and
+              the  final  delimiter is optional if it is the last character of
+              the event line.  An a\ba may be used as a synonym for g\bg.
+       G\bG      Apply the following `s\bs' modifier once to each word in the  event
+              line.
+
+P\bPR\bRO\bOG\bGR\bRA\bAM\bMM\bMI\bIN\bNG\bG W\bWI\bIT\bTH\bH H\bHI\bIS\bST\bTO\bOR\bRY\bY F\bFU\bUN\bNC\bCT\bTI\bIO\bON\bNS\bS
+       This  section  describes  how  to use the History library in other pro-
+       grams.
+
+   I\bIn\bnt\btr\bro\bod\bdu\buc\bct\bti\bio\bon\bn t\bto\bo H\bHi\bis\bst\bto\bor\bry\by
+       The programmer using the History library has  available  functions  for
+       remembering  lines on a history list, associating arbitrary data with a
+       line, removing lines from the list, searching through the  list  for  a
+       line  containing  an arbitrary text string, and referencing any line in
+       the list directly.  In addition, a history _\be_\bx_\bp_\ba_\bn_\bs_\bi_\bo_\bn function is avail-
+       able  which  provides  for a consistent user interface across different
+       programs.
+
+       The user using programs written with the History library has the  bene-
+       fit  of  a  consistent user interface with a set of well-known commands
+       for manipulating the text of previous lines and using that text in  new
+       commands.  The basic history manipulation commands are identical to the
+       history substitution provided by b\bba\bas\bsh\bh.
+
+       If the programmer desires, he  can  use  the  Readline  library,  which
+       includes some history manipulation by default, and has the added advan-
+       tage of command line editing.
+
+       Before declaring any functions  using  any  functionality  the  History
+       library  provides  in  other code, an application writer should include
+       the file  _\b<_\br_\be_\ba_\bd_\bl_\bi_\bn_\be_\b/_\bh_\bi_\bs_\bt_\bo_\br_\by_\b._\bh_\b>  in  any  file  that  uses  the  History
+       library's  features.   It  supplies  extern declarations for all of the
+       library's public functions and variables, and declares all of the  pub-
+       lic data structures.
+
+
+   H\bHi\bis\bst\bto\bor\bry\by S\bSt\bto\bor\bra\bag\bge\be
+       The  history  list  is an array of history entries.  A history entry is
+       declared as follows:
+
+       _\bt_\by_\bp_\be_\bd_\be_\bf _\bv_\bo_\bi_\bd _\b* h\bhi\bis\bst\btd\bda\bat\bta\ba_\b_t\bt;\b;
+
+       typedef struct _hist_entry {
+         char *line;
+         char *timestamp;
+         histdata_t data;
+       } HIST_ENTRY;
+
+       The history list itself might therefore be declared as
+
+       _\bH_\bI_\bS_\bT_\b__\bE_\bN_\bT_\bR_\bY _\b*_\b* t\bth\bhe\be_\b_h\bhi\bis\bst\bto\bor\bry\by_\b_l\bli\bis\bst\bt;\b;
+
+       The state of the History library is encapsulated into a  single  struc-
+       ture:
+
+       /*
+        * A structure used to pass around the current state of the history.
+        */
+       typedef struct _hist_state {
+         HIST_ENTRY **entries; /* Pointer to the entries themselves. */
+         int offset;           /* The location pointer within this array. */
+         int length;           /* Number of elements within this array. */
+         int size;             /* Number of slots allocated to this array. */
+         int flags;
+       } HISTORY_STATE;
+
+       If  the flags member includes H\bHS\bS_\b_S\bST\bTI\bIF\bFL\bLE\bED\bD, the history has been stifled.
+
+H\bHi\bis\bst\bto\bor\bry\by F\bFu\bun\bnc\bct\bti\bio\bon\bns\bs
+       This section describes the calling sequence for the  various  functions
+       exported by the GNU History library.
+
+   I\bIn\bni\bit\bti\bia\bal\bli\biz\bzi\bin\bng\bg H\bHi\bis\bst\bto\bor\bry\by a\ban\bnd\bd S\bSt\bta\bat\bte\be M\bMa\ban\bna\bag\bge\bem\bme\ben\bnt\bt
+       This  section  describes  functions  used  to initialize and manage the
+       state of the History library when you want to use the history functions
+       in your program.
+
+       _\bv_\bo_\bi_\bd u\bus\bsi\bin\bng\bg_\b_h\bhi\bis\bst\bto\bor\bry\by (_\bv_\bo_\bi_\bd)
+       Begin  a  session  in  which the history functions might be used.  This
+       initializes the interactive variables.
+
+       _\bH_\bI_\bS_\bT_\bO_\bR_\bY_\b__\bS_\bT_\bA_\bT_\bE _\b* h\bhi\bis\bst\bto\bor\bry\by_\b_g\bge\bet\bt_\b_h\bhi\bis\bst\bto\bor\bry\by_\b_s\bst\bta\bat\bte\be (_\bv_\bo_\bi_\bd)
+       Return a structure describing the current state of the input history.
+
+       _\bv_\bo_\bi_\bd h\bhi\bis\bst\bto\bor\bry\by_\b_s\bse\bet\bt_\b_h\bhi\bis\bst\bto\bor\bry\by_\b_s\bst\bta\bat\bte\be (_\bH_\bI_\bS_\bT_\bO_\bR_\bY_\b__\bS_\bT_\bA_\bT_\bE _\b*_\bs_\bt_\ba_\bt_\be)
+       Set the state of the history list according to _\bs_\bt_\ba_\bt_\be.
+
+
+   H\bHi\bis\bst\bto\bor\bry\by L\bLi\bis\bst\bt M\bMa\ban\bna\bag\bge\bem\bme\ben\bnt\bt
+       These functions manage individual entries on the history list,  or  set
+       parameters managing the list itself.
+
+       _\bv_\bo_\bi_\bd a\bad\bdd\bd_\b_h\bhi\bis\bst\bto\bor\bry\by (_\bc_\bo_\bn_\bs_\bt _\bc_\bh_\ba_\br _\b*_\bs_\bt_\br_\bi_\bn_\bg)
+       Place _\bs_\bt_\br_\bi_\bn_\bg at the end of the history list.  The associated data field
+       (if any) is set to N\bNU\bUL\bLL\bL.
+
+       _\bv_\bo_\bi_\bd a\bad\bdd\bd_\b_h\bhi\bis\bst\bto\bor\bry\by_\b_t\bti\bim\bme\be (_\bc_\bo_\bn_\bs_\bt _\bc_\bh_\ba_\br _\b*_\bs_\bt_\br_\bi_\bn_\bg)
+       Change the time stamp associated with the most recent history entry  to
+       _\bs_\bt_\br_\bi_\bn_\bg.
+
+       _\bH_\bI_\bS_\bT_\b__\bE_\bN_\bT_\bR_\bY _\b* r\bre\bem\bmo\bov\bve\be_\b_h\bhi\bis\bst\bto\bor\bry\by (_\bi_\bn_\bt _\bw_\bh_\bi_\bc_\bh)
+       Remove  history  entry  at  offset _\bw_\bh_\bi_\bc_\bh from the history.  The removed
+       element is returned so you can free  the  line,  data,  and  containing
+       structure.
+
+       _\bh_\bi_\bs_\bt_\bd_\ba_\bt_\ba_\b__\bt f\bfr\bre\bee\be_\b_h\bhi\bis\bst\bto\bor\bry\by_\b_e\ben\bnt\btr\bry\by (_\bH_\bI_\bS_\bT_\b__\bE_\bN_\bT_\bR_\bY _\b*_\bh_\bi_\bs_\bt_\be_\bn_\bt)
+       Free  the  history  entry  _\bh_\bi_\bs_\bt_\be_\bn_\bt and any history library private data
+       associated with it.   Returns  the  application-specific  data  so  the
+       caller can dispose of it.
+
+       _\bH_\bI_\bS_\bT_\b__\bE_\bN_\bT_\bR_\bY  _\b* r\bre\bep\bpl\bla\bac\bce\be_\b_h\bhi\bis\bst\bto\bor\bry\by_\b_e\ben\bnt\btr\bry\by (_\bi_\bn_\bt _\bw_\bh_\bi_\bc_\bh_\b, _\bc_\bo_\bn_\bs_\bt _\bc_\bh_\ba_\br _\b*_\bl_\bi_\bn_\be_\b, _\bh_\bi_\bs_\bt_\b-
+       _\bd_\ba_\bt_\ba_\b__\bt _\bd_\ba_\bt_\ba)
+       Make the history entry at  offset  _\bw_\bh_\bi_\bc_\bh  have  _\bl_\bi_\bn_\be  and  _\bd_\ba_\bt_\ba.   This
+       returns the old entry so the caller can dispose of any application-spe-
+       cific data.  In the case  of  an  invalid  _\bw_\bh_\bi_\bc_\bh,  a  N\bNU\bUL\bLL\bL  pointer  is
+       returned.
+
+       _\bv_\bo_\bi_\bd c\bcl\ble\bea\bar\br_\b_h\bhi\bis\bst\bto\bor\bry\by (_\bv_\bo_\bi_\bd)
+       Clear the history list by deleting all the entries.
+
+       _\bv_\bo_\bi_\bd s\bst\bti\bif\bfl\ble\be_\b_h\bhi\bis\bst\bto\bor\bry\by (_\bi_\bn_\bt _\bm_\ba_\bx)
+       Stifle the history list, remembering only the last _\bm_\ba_\bx entries.
+
+       _\bi_\bn_\bt u\bun\bns\bst\bti\bif\bfl\ble\be_\b_h\bhi\bis\bst\bto\bor\bry\by (_\bv_\bo_\bi_\bd)
+       Stop  stifling  the  history.   This returns the previously-set maximum
+       number of history entries (as set by  s\bst\bti\bif\bfl\ble\be_\b_h\bhi\bis\bst\bto\bor\bry\by(\b()\b)).   history  was
+       stifled.  The value is positive if the history was stifled, negative if
+       it wasn't.
+
+       _\bi_\bn_\bt h\bhi\bis\bst\bto\bor\bry\by_\b_i\bis\bs_\b_s\bst\bti\bif\bfl\ble\bed\bd (_\bv_\bo_\bi_\bd)
+       Returns non-zero if the history is stifled, zero if it is not.
+
+
+   I\bIn\bnf\bfo\bor\brm\bma\bat\bti\bio\bon\bn A\bAb\bbo\bou\but\bt t\bth\bhe\be H\bHi\bis\bst\bto\bor\bry\by L\bLi\bis\bst\bt
+       These functions return information about the  entire  history  list  or
+       individual list entries.
+
+       _\bH_\bI_\bS_\bT_\b__\bE_\bN_\bT_\bR_\bY _\b*_\b* h\bhi\bis\bst\bto\bor\bry\by_\b_l\bli\bis\bst\bt (_\bv_\bo_\bi_\bd)
+       Return  a  N\bNU\bUL\bLL\bL  terminated  array of _\bH_\bI_\bS_\bT_\b__\bE_\bN_\bT_\bR_\bY _\b* which is the current
+       input history.  Element 0 of this list is the beginning  of  time.   If
+       there is no history, return N\bNU\bUL\bLL\bL.
+
+       _\bi_\bn_\bt w\bwh\bhe\ber\bre\be_\b_h\bhi\bis\bst\bto\bor\bry\by (_\bv_\bo_\bi_\bd)
+       Returns the offset of the current history element.
+
+       _\bH_\bI_\bS_\bT_\b__\bE_\bN_\bT_\bR_\bY _\b* c\bcu\bur\brr\bre\ben\bnt\bt_\b_h\bhi\bis\bst\bto\bor\bry\by (_\bv_\bo_\bi_\bd)
+       Return  the  history  entry  at  the current position, as determined by
+       w\bwh\bhe\ber\bre\be_\b_h\bhi\bis\bst\bto\bor\bry\by(\b()\b).  If there is no entry there, return a N\bNU\bUL\bLL\bL pointer.
+
+       _\bH_\bI_\bS_\bT_\b__\bE_\bN_\bT_\bR_\bY _\b* h\bhi\bis\bst\bto\bor\bry\by_\b_g\bge\bet\bt (_\bi_\bn_\bt _\bo_\bf_\bf_\bs_\be_\bt)
+       Return the  history  entry  at  position  _\bo_\bf_\bf_\bs_\be_\bt,  starting  from  h\bhi\bis\bs-\b-
+       t\bto\bor\bry\by_\b_b\bba\bas\bse\be.   If  there  is no entry there, or if _\bo_\bf_\bf_\bs_\be_\bt is greater than
+       the history length, return a N\bNU\bUL\bLL\bL pointer.
+
+       _\bt_\bi_\bm_\be_\b__\bt h\bhi\bis\bst\bto\bor\bry\by_\b_g\bge\bet\bt_\b_t\bti\bim\bme\be (_\bH_\bI_\bS_\bT_\b__\bE_\bN_\bT_\bR_\bY _\b*)
+       Return the time stamp associated with the history entry passed  as  the
+       argument.
+
+       _\bi_\bn_\bt h\bhi\bis\bst\bto\bor\bry\by_\b_t\bto\bot\bta\bal\bl_\b_b\bby\byt\bte\bes\bs (_\bv_\bo_\bi_\bd)
+       Return  the number of bytes that the primary history entries are using.
+       This function returns the sum of the lengths of all the  lines  in  the
+       history.
+
+
+   M\bMo\bov\bvi\bin\bng\bg A\bAr\bro\bou\bun\bnd\bd t\bth\bhe\be H\bHi\bis\bst\bto\bor\bry\by L\bLi\bis\bst\bt
+       These functions allow the current index into the history list to be set
+       or changed.
+
+       _\bi_\bn_\bt h\bhi\bis\bst\bto\bor\bry\by_\b_s\bse\bet\bt_\b_p\bpo\bos\bs (_\bi_\bn_\bt _\bp_\bo_\bs)
+       Set the current history offset to _\bp_\bo_\bs, an absolute index into the list.
+       Returns  1  on  success, 0 if _\bp_\bo_\bs is less than zero or greater than the
+       number of history entries.
+
+       _\bH_\bI_\bS_\bT_\b__\bE_\bN_\bT_\bR_\bY _\b* p\bpr\bre\bev\bvi\bio\bou\bus\bs_\b_h\bhi\bis\bst\bto\bor\bry\by (_\bv_\bo_\bi_\bd)
+       Back up the current history offset to the previous history  entry,  and
+       return  a pointer to that entry.  If there is no previous entry, return
+       a N\bNU\bUL\bLL\bL pointer.
+
+       _\bH_\bI_\bS_\bT_\b__\bE_\bN_\bT_\bR_\bY _\b* n\bne\bex\bxt\bt_\b_h\bhi\bis\bst\bto\bor\bry\by (_\bv_\bo_\bi_\bd)
+       Move the current history offset forward to the next history entry,  and
+       return  the a pointer to that entry.  If there is no next entry, return
+       a N\bNU\bUL\bLL\bL pointer.
+
+
+   S\bSe\bea\bar\brc\bch\bhi\bin\bng\bg t\bth\bhe\be H\bHi\bis\bst\bto\bor\bry\by L\bLi\bis\bst\bt
+       These functions allow searching of the history list  for  entries  con-
+       taining a specific string.  Searching may be performed both forward and
+       backward  from  the  current  history  position.   The  search  may  be
+       _\ba_\bn_\bc_\bh_\bo_\br_\be_\bd,  meaning  that  the string must match at the beginning of the
+       history entry.
+
+       _\bi_\bn_\bt h\bhi\bis\bst\bto\bor\bry\by_\b_s\bse\bea\bar\brc\bch\bh (_\bc_\bo_\bn_\bs_\bt _\bc_\bh_\ba_\br _\b*_\bs_\bt_\br_\bi_\bn_\bg_\b, _\bi_\bn_\bt _\bd_\bi_\br_\be_\bc_\bt_\bi_\bo_\bn)
+       Search the history for _\bs_\bt_\br_\bi_\bn_\bg, starting at the current history  offset.
+       If  _\bd_\bi_\br_\be_\bc_\bt_\bi_\bo_\bn  is  less  than  0,  then  the search is through previous
+       entries, otherwise through subsequent entries.   If  _\bs_\bt_\br_\bi_\bn_\bg  is  found,
+       then  the  current  history index is set to that history entry, and the
+       value returned is the offset in the line of the entry where _\bs_\bt_\br_\bi_\bn_\bg  was
+       found.  Otherwise, nothing is changed, and a -1 is returned.
+
+       _\bi_\bn_\bt h\bhi\bis\bst\bto\bor\bry\by_\b_s\bse\bea\bar\brc\bch\bh_\b_p\bpr\bre\bef\bfi\bix\bx (_\bc_\bo_\bn_\bs_\bt _\bc_\bh_\ba_\br _\b*_\bs_\bt_\br_\bi_\bn_\bg_\b, _\bi_\bn_\bt _\bd_\bi_\br_\be_\bc_\bt_\bi_\bo_\bn)
+       Search  the history for _\bs_\bt_\br_\bi_\bn_\bg, starting at the current history offset.
+       The search is anchored: matching lines  must  begin  with  _\bs_\bt_\br_\bi_\bn_\bg.   If
+       _\bd_\bi_\br_\be_\bc_\bt_\bi_\bo_\bn  is less than 0, then the search is through previous entries,
+       otherwise through subsequent entries.  If _\bs_\bt_\br_\bi_\bn_\bg  is  found,  then  the
+       current  history index is set to that entry, and the return value is 0.
+       Otherwise, nothing is changed, and a -1 is returned.
+
+       _\bi_\bn_\bt h\bhi\bis\bst\bto\bor\bry\by_\b_s\bse\bea\bar\brc\bch\bh_\b_p\bpo\bos\bs (_\bc_\bo_\bn_\bs_\bt _\bc_\bh_\ba_\br _\b*_\bs_\bt_\br_\bi_\bn_\bg_\b, _\bi_\bn_\bt _\bd_\bi_\br_\be_\bc_\bt_\bi_\bo_\bn_\b, _\bi_\bn_\bt _\bp_\bo_\bs)
+       Search for _\bs_\bt_\br_\bi_\bn_\bg in the history list, starting  at  _\bp_\bo_\bs,  an  absolute
+       index  into  the  list.   If _\bd_\bi_\br_\be_\bc_\bt_\bi_\bo_\bn is negative, the search proceeds
+       backward from _\bp_\bo_\bs, otherwise forward.  Returns the  absolute  index  of
+       the history element where _\bs_\bt_\br_\bi_\bn_\bg was found, or -1 otherwise.
+
+
+   M\bMa\ban\bna\bag\bgi\bin\bng\bg t\bth\bhe\be H\bHi\bis\bst\bto\bor\bry\by F\bFi\bil\ble\be
+       The  History  library can read the history from and write it to a file.
+       This section documents the functions for managing a history file.
+
+       _\bi_\bn_\bt r\bre\bea\bad\bd_\b_h\bhi\bis\bst\bto\bor\bry\by (_\bc_\bo_\bn_\bs_\bt _\bc_\bh_\ba_\br _\b*_\bf_\bi_\bl_\be_\bn_\ba_\bm_\be)
+       Add the contents of _\bf_\bi_\bl_\be_\bn_\ba_\bm_\be to the history list, a line at a time.  If
+       _\bf_\bi_\bl_\be_\bn_\ba_\bm_\be  is N\bNU\bUL\bLL\bL, then read from _\b~_\b/_\b._\bh_\bi_\bs_\bt_\bo_\br_\by.  Returns 0 if successful,
+       or e\ber\brr\brn\bno\bo if not.
+
+       _\bi_\bn_\bt r\bre\bea\bad\bd_\b_h\bhi\bis\bst\bto\bor\bry\by_\b_r\bra\ban\bng\bge\be (_\bc_\bo_\bn_\bs_\bt _\bc_\bh_\ba_\br _\b*_\bf_\bi_\bl_\be_\bn_\ba_\bm_\be_\b, _\bi_\bn_\bt _\bf_\br_\bo_\bm_\b, _\bi_\bn_\bt _\bt_\bo)
+       Read a range of lines from _\bf_\bi_\bl_\be_\bn_\ba_\bm_\be, adding them to the  history  list.
+       Start  reading  at  line _\bf_\br_\bo_\bm and end at _\bt_\bo.  If _\bf_\br_\bo_\bm is zero, start at
+       the beginning.  If _\bt_\bo is less than _\bf_\br_\bo_\bm, then read until the end of the
+       file.   If  _\bf_\bi_\bl_\be_\bn_\ba_\bm_\be  is N\bNU\bUL\bLL\bL, then read from _\b~_\b/_\b._\bh_\bi_\bs_\bt_\bo_\br_\by.  Returns 0 if
+       successful, or e\ber\brr\brn\bno\bo if not.
+
+       _\bi_\bn_\bt w\bwr\bri\bit\bte\be_\b_h\bhi\bis\bst\bto\bor\bry\by (_\bc_\bo_\bn_\bs_\bt _\bc_\bh_\ba_\br _\b*_\bf_\bi_\bl_\be_\bn_\ba_\bm_\be)
+       Write the current history to _\bf_\bi_\bl_\be_\bn_\ba_\bm_\be, overwriting _\bf_\bi_\bl_\be_\bn_\ba_\bm_\be  if  neces-
+       sary.   If _\bf_\bi_\bl_\be_\bn_\ba_\bm_\be is N\bNU\bUL\bLL\bL, then write the history list to _\b~_\b/_\b._\bh_\bi_\bs_\bt_\bo_\br_\by.
+       Returns 0 on success, or e\ber\brr\brn\bno\bo on a read or write error.
+
+
+       _\bi_\bn_\bt a\bap\bpp\bpe\ben\bnd\bd_\b_h\bhi\bis\bst\bto\bor\bry\by (_\bi_\bn_\bt _\bn_\be_\bl_\be_\bm_\be_\bn_\bt_\bs_\b, _\bc_\bo_\bn_\bs_\bt _\bc_\bh_\ba_\br _\b*_\bf_\bi_\bl_\be_\bn_\ba_\bm_\be)
+       Append the last _\bn_\be_\bl_\be_\bm_\be_\bn_\bt_\bs of the history list to _\bf_\bi_\bl_\be_\bn_\ba_\bm_\be.  If _\bf_\bi_\bl_\be_\bn_\ba_\bm_\be
+       is  N\bNU\bUL\bLL\bL, then append to _\b~_\b/_\b._\bh_\bi_\bs_\bt_\bo_\br_\by.  Returns 0 on success, or e\ber\brr\brn\bno\bo on
+       a read or write error.
+
+       _\bi_\bn_\bt h\bhi\bis\bst\bto\bor\bry\by_\b_t\btr\bru\bun\bnc\bca\bat\bte\be_\b_f\bfi\bil\ble\be (_\bc_\bo_\bn_\bs_\bt _\bc_\bh_\ba_\br _\b*_\bf_\bi_\bl_\be_\bn_\ba_\bm_\be_\b, _\bi_\bn_\bt _\bn_\bl_\bi_\bn_\be_\bs)
+       Truncate the history file _\bf_\bi_\bl_\be_\bn_\ba_\bm_\be, leaving only the last _\bn_\bl_\bi_\bn_\be_\bs lines.
+       If  _\bf_\bi_\bl_\be_\bn_\ba_\bm_\be  is N\bNU\bUL\bLL\bL, then _\b~_\b/_\b._\bh_\bi_\bs_\bt_\bo_\br_\by is truncated.  Returns 0 on suc-
+       cess, or e\ber\brr\brn\bno\bo on failure.
+
+
+   H\bHi\bis\bst\bto\bor\bry\by E\bEx\bxp\bpa\ban\bns\bsi\bio\bon\bn
+       These functions implement history expansion.
+
+       _\bi_\bn_\bt h\bhi\bis\bst\bto\bor\bry\by_\b_e\bex\bxp\bpa\ban\bnd\bd (_\bc_\bh_\ba_\br _\b*_\bs_\bt_\br_\bi_\bn_\bg_\b, _\bc_\bh_\ba_\br _\b*_\b*_\bo_\bu_\bt_\bp_\bu_\bt)
+       Expand _\bs_\bt_\br_\bi_\bn_\bg, placing the result into _\bo_\bu_\bt_\bp_\bu_\bt, a pointer to  a  string.
+       Returns:
+              0      If  no  expansions  took place (or, if the only change in
+                     the text was the removal of escape  characters  preceding
+                     the history expansion character);
+              1      if expansions did take place;
+              -1     if there was an error in expansion;
+              2      if  the  returned  line should be displayed, but not exe-
+                     cuted, as with the :\b:p\bp modifier.
+       If an error ocurred in expansion, then _\bo_\bu_\bt_\bp_\bu_\bt  contains  a  descriptive
+       error message.
+
+       _\bc_\bh_\ba_\br _\b* g\bge\bet\bt_\b_h\bhi\bis\bst\bto\bor\bry\by_\b_e\bev\bve\ben\bnt\bt (_\bc_\bo_\bn_\bs_\bt _\bc_\bh_\ba_\br _\b*_\bs_\bt_\br_\bi_\bn_\bg_\b, _\bi_\bn_\bt _\b*_\bc_\bi_\bn_\bd_\be_\bx_\b, _\bi_\bn_\bt _\bq_\bc_\bh_\ba_\br)
+       Returns  the  text  of the history event beginning at _\bs_\bt_\br_\bi_\bn_\bg + _\b*_\bc_\bi_\bn_\bd_\be_\bx.
+       _\b*_\bc_\bi_\bn_\bd_\be_\bx is modified to point to after the event specifier.  At function
+       entry,  _\bc_\bi_\bn_\bd_\be_\bx  points to the index into _\bs_\bt_\br_\bi_\bn_\bg where the history event
+       specification begins.  _\bq_\bc_\bh_\ba_\br is a character that is allowed to end  the
+       event  specification  in addition to the ``normal'' terminating charac-
+       ters.
+
+       _\bc_\bh_\ba_\br _\b*_\b* h\bhi\bis\bst\bto\bor\bry\by_\b_t\bto\bok\bke\ben\bni\biz\bze\be (_\bc_\bo_\bn_\bs_\bt _\bc_\bh_\ba_\br _\b*_\bs_\bt_\br_\bi_\bn_\bg)
+       Return an array of tokens parsed out  of  _\bs_\bt_\br_\bi_\bn_\bg,  much  as  the  shell
+       might.    The   tokens   are  split  on  the  characters  in  the  h\bhi\bis\bs-\b-
+       t\bto\bor\bry\by_\b_w\bwo\bor\brd\bd_\b_d\bde\bel\bli\bim\bmi\bit\bte\ber\brs\bs  variable,  and  shell  quoting  conventions   are
+       obeyed.
+
+       _\bc_\bh_\ba_\br _\b* h\bhi\bis\bst\bto\bor\bry\by_\b_a\bar\brg\bg_\b_e\bex\bxt\btr\bra\bac\bct\bt (_\bi_\bn_\bt _\bf_\bi_\br_\bs_\bt_\b, _\bi_\bn_\bt _\bl_\ba_\bs_\bt_\b, _\bc_\bo_\bn_\bs_\bt _\bc_\bh_\ba_\br _\b*_\bs_\bt_\br_\bi_\bn_\bg)
+       Extract a string segment consisting of the _\bf_\bi_\br_\bs_\bt through _\bl_\ba_\bs_\bt arguments
+       present in _\bs_\bt_\br_\bi_\bn_\bg.  Arguments are split using h\bhi\bis\bst\bto\bor\bry\by_\b_t\bto\bok\bke\ben\bni\biz\bze\be(\b()\b).
+
+
+   H\bHi\bis\bst\bto\bor\bry\by V\bVa\bar\bri\bia\bab\bbl\ble\bes\bs
+       This section describes the externally-visible variables exported by the
+       GNU History Library.
+
+       _\bi_\bn_\bt h\bhi\bis\bst\bto\bor\bry\by_\b_b\bba\bas\bse\be
+       The logical offset of the first entry in the history list.
+
+       _\bi_\bn_\bt h\bhi\bis\bst\bto\bor\bry\by_\b_l\ble\ben\bng\bgt\bth\bh
+       The number of entries currently stored in the history list.
+
+       _\bi_\bn_\bt h\bhi\bis\bst\bto\bor\bry\by_\b_m\bma\bax\bx_\b_e\ben\bnt\btr\bri\bie\bes\bs
+       The maximum number of history entries.  This must be changed using s\bst\bti\bi-\b-
+       f\bfl\ble\be_\b_h\bhi\bis\bst\bto\bor\bry\by(\b()\b).
+
+       _\bi_\bn_\bt h\bhi\bis\bst\bto\bor\bry\by_\b_w\bwr\bri\bit\bte\be_\b_t\bti\bim\bme\bes\bst\bta\bam\bmp\bps\bs
+       If non-zero, timestamps are written to the history file, so they can be
+       preserved  between  sessions.   The  default  value  is 0, meaning that
+       timestamps are not saved.
+
+       _\bc_\bh_\ba_\br h\bhi\bis\bst\bto\bor\bry\by_\b_e\bex\bxp\bpa\ban\bns\bsi\bio\bon\bn_\b_c\bch\bha\bar\br
+       The character that introduces a history event.  The default is !\b!.  Set-
+       ting this to 0 inhibits history expansion.
+
+       _\bc_\bh_\ba_\br h\bhi\bis\bst\bto\bor\bry\by_\b_s\bsu\bub\bbs\bst\bt_\b_c\bch\bha\bar\br
+       The character that invokes word substitution if found at the start of a
+       line.  The default is ^\b^.
+
+       _\bc_\bh_\ba_\br h\bhi\bis\bst\bto\bor\bry\by_\b_c\bco\bom\bmm\bme\ben\bnt\bt_\b_c\bch\bha\bar\br
+       During tokenization, if this character is seen as the  first  character
+       of  a  word,  then it and all subsequent characters up to a newline are
+       ignored, suppressing history expansion for the remainder of  the  line.
+       This is disabled by default.
+
+       _\bc_\bh_\ba_\br _\b* h\bhi\bis\bst\bto\bor\bry\by_\b_w\bwo\bor\brd\bd_\b_d\bde\bel\bli\bim\bmi\bit\bte\ber\brs\bs
+       The  characters  that  separate  tokens  for  h\bhi\bis\bst\bto\bor\bry\by_\b_t\bto\bok\bke\ben\bni\biz\bze\be(\b()\b).   The
+       default value is "\b" \\b\t\bt\\b\n\bn(\b()\b)<\b<>\b>;\b;&\b&|\b|"\b".
+
+       _\bc_\bh_\ba_\br _\b* h\bhi\bis\bst\bto\bor\bry\by_\b_n\bno\bo_\b_e\bex\bxp\bpa\ban\bnd\bd_\b_c\bch\bha\bar\brs\bs
+       The list of characters which inhibit history expansion if found immedi-
+       ately  following  h\bhi\bis\bst\bto\bor\bry\by_\b_e\bex\bxp\bpa\ban\bns\bsi\bio\bon\bn_\b_c\bch\bha\bar\br.   The  default is space, tab,
+       newline, \\b\r\br, and =\b=.
+
+       _\bc_\bh_\ba_\br _\b* h\bhi\bis\bst\bto\bor\bry\by_\b_s\bse\bea\bar\brc\bch\bh_\b_d\bde\bel\bli\bim\bmi\bit\bte\ber\br_\b_c\bch\bha\bar\brs\bs
+       The list of additional characters which can delimit  a  history  search
+       string,  in  addition to space, tab, _\b: and _\b? in the case of a substring
+       search.  The default is empty.
+
+       _\bi_\bn_\bt h\bhi\bis\bst\bto\bor\bry\by_\b_q\bqu\buo\bot\bte\bes\bs_\b_i\bin\bnh\bhi\bib\bbi\bit\bt_\b_e\bex\bxp\bpa\ban\bns\bsi\bio\bon\bn
+       If non-zero, single-quoted words are not scanned for the history expan-
+       sion character.  The default value is 0.
+
+       _\br_\bl_\b__\bl_\bi_\bn_\be_\bb_\bu_\bf_\b__\bf_\bu_\bn_\bc_\b__\bt _\b* h\bhi\bis\bst\bto\bor\bry\by_\b_i\bin\bnh\bhi\bib\bbi\bit\bt_\b_e\bex\bxp\bpa\ban\bns\bsi\bio\bon\bn_\b_f\bfu\bun\bnc\bct\bti\bio\bon\bn
+       This  should  be  set to the address of a function that takes two argu-
+       ments: a c\bch\bha\bar\br *\b* (_\bs_\bt_\br_\bi_\bn_\bg) and an i\bin\bnt\bt index into  that  string  (_\bi).   It
+       should  return  a  non-zero  value if the history expansion starting at
+       _\bs_\bt_\br_\bi_\bn_\bg_\b[_\bi_\b] should not be performed; zero  if  the  expansion  should  be
+       done.   It  is  intended for use by applications like b\bba\bas\bsh\bh that use the
+       history expansion character for additional purposes.  By default,  this
+       variable is set to N\bNU\bUL\bLL\bL.
+
+F\bFI\bIL\bLE\bES\bS
+       _\b~_\b/_\b._\bh_\bi_\bs_\bt_\bo_\br_\by
+              Default filename for reading and writing saved history
+
+S\bSE\bEE\bE A\bAL\bLS\bSO\bO
+       _\bT_\bh_\be _\bG_\bn_\bu _\bR_\be_\ba_\bd_\bl_\bi_\bn_\be _\bL_\bi_\bb_\br_\ba_\br_\by, Brian Fox and Chet Ramey
+       _\bT_\bh_\be _\bG_\bn_\bu _\bH_\bi_\bs_\bt_\bo_\br_\by _\bL_\bi_\bb_\br_\ba_\br_\by, Brian Fox and Chet Ramey
+       _\bb_\ba_\bs_\bh(1)
+       _\br_\be_\ba_\bd_\bl_\bi_\bn_\be(3)
+
+A\bAU\bUT\bTH\bHO\bOR\bRS\bS
+       Brian Fox, Free Software Foundation
+       bfox@gnu.org
+
+       Chet Ramey, Case Western Reserve University
+       chet@ins.CWRU.Edu
+
+B\bBU\bUG\bG R\bRE\bEP\bPO\bOR\bRT\bTS\bS
+       If  you  find  a bug in the h\bhi\bis\bst\bto\bor\bry\by library, you should report it.  But
+       first, you should make sure that it  really  is  a  bug,  and  that  it
+       appears in the latest version of the h\bhi\bis\bst\bto\bor\bry\by library that you have.
+
+       Once  you have determined that a bug actually exists, mail a bug report
+       to _\bb_\bu_\bg_\b-_\br_\be_\ba_\bd_\bl_\bi_\bn_\be@_\bg_\bn_\bu_\b._\bo_\br_\bg.  If you have a fix, you are  welcome  to  mail
+       that  as  well!   Suggestions  and  `philosophical'  bug reports may be
+       mailed to  _\bb_\bu_\bg_\b-_\br_\be_\ba_\bd_\bl_\bi_\bn_\be@_\bg_\bn_\bu_\b._\bo_\br_\bg  or  posted  to  the  Usenet  newsgroup
+       g\bgn\bnu\bu.\b.b\bba\bas\bsh\bh.\b.b\bbu\bug\bg.
+
+       Comments and bug reports concerning this manual page should be directed
+       to _\bc_\bh_\be_\bt_\b@_\bi_\bn_\bs_\b._\bC_\bW_\bR_\bU_\b._\bE_\bd_\bu.
+
+
+
+GNU History 5.0                  2003 July 31                       HISTORY(3)
diff --git a/doc/history.3 b/doc/history.3
new file mode 100644 (file)
index 0000000..3ade839
--- /dev/null
@@ -0,0 +1,663 @@
+.\"
+.\" MAN PAGE COMMENTS to
+.\"
+.\"    Chet Ramey
+.\"    Information Network Services
+.\"    Case Western Reserve University
+.\"    chet@ins.CWRU.Edu
+.\"
+.\"    Last Change: Thu Jul 31 08:46:08 EDT 2003
+.\"
+.TH HISTORY 3 "2003 July 31" "GNU History 5.0"
+.\"
+.\" File Name macro.  This used to be `.PN', for Path Name,
+.\" but Sun doesn't seem to like that very much.
+.\"
+.de FN
+\fI\|\\$1\|\fP
+..
+.ds lp \fR\|(\fP
+.ds rp \fR\|)\fP
+.\" FnN return-value fun-name N arguments
+.de Fn1
+\fI\\$1\fP \fB\\$2\fP \\*(lp\fI\\$3\fP\\*(rp
+.br
+..
+.de Fn2
+.if t \fI\\$1\fP \fB\\$2\fP \\*(lp\fI\\$3,\|\\$4\fP\\*(rp
+.if n \fI\\$1\fP \fB\\$2\fP \\*(lp\fI\\$3, \\$4\fP\\*(rp
+.br
+..
+.de Fn3
+.if t \fI\\$1\fP \fB\\$2\fP \\*(lp\fI\\$3,\|\\$4,\|\\$5\fP\|\\*(rp
+.if n \fI\\$1\fP \fB\\$2\fP \\*(lp\fI\\$3, \\$4, \\$5\fP\\*(rp
+.br
+..
+.de Vb
+\fI\\$1\fP \fB\\$2\fP
+.br
+..
+.SH NAME
+history \- GNU History Library
+.SH COPYRIGHT
+.if t The GNU History Library is Copyright \(co 1989-2002 by the Free Software Foundation, Inc.
+.if n The GNU History Library is Copyright (C) 1989-2002 by the Free Software Foundation, Inc.
+.SH DESCRIPTION
+Many programs read input from the user a line at a time.  The GNU
+History library is able to keep track of those lines, associate arbitrary
+data with each line, and utilize information from previous lines in
+composing new ones. 
+.PP
+.SH "HISTORY EXPANSION"
+.PP
+The history library supports a history expansion feature that
+is identical to the history expansion in
+.BR bash.
+This section describes what syntax features are available.
+.PP
+History expansions introduce words from the history list into
+the input stream, making it easy to repeat commands, insert the
+arguments to a previous command into the current input line, or
+fix errors in previous commands quickly.
+.PP
+History expansion is usually performed immediately after a complete line
+is read.
+It takes place in two parts.
+The first is to determine which line from the history list
+to use during substitution.
+The second is to select portions of that line for inclusion into
+the current one.
+The line selected from the history is the \fIevent\fP,
+and the portions of that line that are acted upon are \fIwords\fP.
+Various \fImodifiers\fP are available to manipulate the selected words.
+The line is broken into words in the same fashion as \fBbash\fP
+does when reading input,
+so that several words that would otherwise be separated 
+are considered one word when surrounded by quotes (see the
+description of \fBhistory_tokenize()\fP below).
+History expansions are introduced by the appearance of the
+history expansion character, which is \^\fB!\fP\^ by default.
+Only backslash (\^\fB\e\fP\^) and single quotes can quote
+the history expansion character.
+.SS Event Designators
+.PP
+An event designator is a reference to a command line entry in the
+history list.
+.PP
+.PD 0
+.TP
+.B !
+Start a history substitution, except when followed by a
+.BR blank ,
+newline, = or (.
+.TP
+.B !\fIn\fR
+Refer to command line
+.IR n .
+.TP
+.B !\-\fIn\fR
+Refer to the current command line minus
+.IR n .
+.TP
+.B !!
+Refer to the previous command.  This is a synonym for `!\-1'.
+.TP
+.B !\fIstring\fR
+Refer to the most recent command starting with 
+.IR string .
+.TP
+.B !?\fIstring\fR\fB[?]\fR
+Refer to the most recent command containing
+.IR string .
+The trailing \fB?\fP may be omitted if
+.I string
+is followed immediately by a newline.
+.TP
+.B \d\s+2^\s-2\u\fIstring1\fP\d\s+2^\s-2\u\fIstring2\fP\d\s+2^\s-2\u
+Quick substitution.  Repeat the last command, replacing
+.I string1
+with
+.IR string2 .
+Equivalent to
+``!!:s/\fIstring1\fP/\fIstring2\fP/''
+(see \fBModifiers\fP below).
+.TP
+.B !#
+The entire command line typed so far.
+.PD
+.SS Word Designators
+.PP
+Word designators are used to select desired words from the event.
+A 
+.B :
+separates the event specification from the word designator.
+It may be omitted if the word designator begins with a
+.BR ^ ,
+.BR $ ,
+.BR * ,
+.BR \- ,
+or
+.BR % .
+Words are numbered from the beginning of the line,
+with the first word being denoted by 0 (zero).
+Words are inserted into the current line separated by single spaces.
+.PP
+.PD 0
+.TP
+.B 0 (zero)
+The zeroth word.  For the shell, this is the command
+word.
+.TP
+.I n
+The \fIn\fRth word.
+.TP
+.B ^
+The first argument.  That is, word 1.
+.TP
+.B $
+The last argument.
+.TP
+.B %
+The word matched by the most recent `?\fIstring\fR?' search.
+.TP
+.I x\fB\-\fPy
+A range of words; `\-\fIy\fR' abbreviates `0\-\fIy\fR'.
+.TP
+.B *
+All of the words but the zeroth.  This is a synonym
+for `\fI1\-$\fP'.  It is not an error to use
+.B *
+if there is just one
+word in the event; the empty string is returned in that case.
+.TP
+.B x*
+Abbreviates \fIx\-$\fP.
+.TP
+.B x\-
+Abbreviates \fIx\-$\fP like \fBx*\fP, but omits the last word.
+.PD
+.PP
+If a word designator is supplied without an event specification, the
+previous command is used as the event.
+.SS Modifiers
+.PP
+After the optional word designator, there may appear a sequence of
+one or more of the following modifiers, each preceded by a `:'.
+.PP
+.PD 0
+.PP
+.TP
+.B h
+Remove a trailing file name component, leaving only the head.
+.TP
+.B t
+Remove all leading file name components, leaving the tail.
+.TP
+.B r
+Remove a trailing suffix of the form \fI.xxx\fP, leaving the
+basename.
+.TP
+.B e
+Remove all but the trailing suffix.
+.TP
+.B p
+Print the new command but do not execute it.
+.TP
+.B q
+Quote the substituted words, escaping further substitutions.
+.TP
+.B x
+Quote the substituted words as with
+.BR q ,
+but break into words at
+.B blanks
+and newlines.
+.TP
+.B s/\fIold\fP/\fInew\fP/
+Substitute
+.I new
+for the first occurrence of
+.I old
+in the event line.  Any delimiter can be used in place of /.  The
+final delimiter is optional if it is the last character of the
+event line.  The delimiter may be quoted in
+.I old
+and
+.I new
+with a single backslash.  If & appears in
+.IR new ,
+it is replaced by
+.IR old .
+A single backslash will quote the &.  If
+.I old
+is null, it is set to the last
+.I old
+substituted, or, if no previous history substitutions took place,
+the last
+.I string
+in a
+.B !?\fIstring\fR\fB[?]\fR
+search.
+.TP
+.B &
+Repeat the previous substitution.
+.TP
+.B g
+Cause changes to be applied over the entire event line.  This is
+used in conjunction with `\fB:s\fP' (e.g., `\fB:gs/\fIold\fP/\fInew\fP/\fR')
+or `\fB:&\fP'.  If used with
+`\fB:s\fP', any delimiter can be used
+in place of /, and the final delimiter is optional
+if it is the last character of the event line.
+An \fBa\fP may be used as a synonym for \fBg\fP.
+.TP
+.B G
+Apply the following `\fBs\fP' modifier once to each word in the event line.
+.PD
+.SH "PROGRAMMING WITH HISTORY FUNCTIONS"
+This section describes how to use the History library in other programs.
+.SS Introduction to History
+.PP
+The programmer using the History library has available functions
+for remembering lines on a history list, associating arbitrary data
+with a line, removing lines from the list, searching through the list
+for a line containing an arbitrary text string, and referencing any line
+in the list directly.  In addition, a history \fIexpansion\fP function
+is available which provides for a consistent user interface across
+different programs.
+.PP
+The user using programs written with the History library has the
+benefit of a consistent user interface with a set of well-known
+commands for manipulating the text of previous lines and using that text
+in new commands.  The basic history manipulation commands are
+identical to
+the history substitution provided by \fBbash\fP.
+.PP
+If the programmer desires, he can use the Readline library, which
+includes some history manipulation by default, and has the added
+advantage of command line editing.
+.PP
+Before declaring any functions using any functionality the History
+library provides in other code, an application writer should include
+the file
+.FN <readline/history.h>
+in any file that uses the
+History library's features.  It supplies extern declarations for all
+of the library's public functions and variables, and declares all of
+the public data structures.
+
+.SS History Storage
+.PP
+The history list is an array of history entries.  A history entry is
+declared as follows:
+.PP
+.Vb "typedef void *" histdata_t;
+.PP
+.nf
+typedef struct _hist_entry {
+  char *line;
+  char *timestamp;
+  histdata_t data;
+} HIST_ENTRY;
+.fi
+.PP
+The history list itself might therefore be declared as
+.PP
+.Vb "HIST_ENTRY **" the_history_list;
+.PP
+The state of the History library is encapsulated into a single structure:
+.PP
+.nf
+/*
+ * A structure used to pass around the current state of the history.
+ */
+typedef struct _hist_state {
+  HIST_ENTRY **entries; /* Pointer to the entries themselves. */
+  int offset;           /* The location pointer within this array. */
+  int length;           /* Number of elements within this array. */
+  int size;             /* Number of slots allocated to this array. */
+  int flags;
+} HISTORY_STATE;
+.fi
+.PP
+If the flags member includes \fBHS_STIFLED\fP, the history has been
+stifled.
+.SH "History Functions"
+.PP
+This section describes the calling sequence for the various functions
+exported by the GNU History library.
+.SS Initializing History and State Management
+This section describes functions used to initialize and manage
+the state of the History library when you want to use the history
+functions in your program.
+
+.Fn1 void using_history void
+Begin a session in which the history functions might be used.  This
+initializes the interactive variables.
+
+.Fn1 "HISTORY_STATE *" history_get_history_state void
+Return a structure describing the current state of the input history.
+
+.Fn1 void history_set_history_state "HISTORY_STATE *state"
+Set the state of the history list according to \fIstate\fP.
+
+.SS History List Management
+
+These functions manage individual entries on the history list, or set
+parameters managing the list itself.
+
+.Fn1 void add_history "const char *string"
+Place \fIstring\fP at the end of the history list.  The associated data
+field (if any) is set to \fBNULL\fP.
+
+.Fn1 void add_history_time "const char *string"
+Change the time stamp associated with the most recent history entry to
+\fIstring\fP.
+
+.Fn1 "HIST_ENTRY *" remove_history "int which"
+Remove history entry at offset \fIwhich\fP from the history.  The
+removed element is returned so you can free the line, data,
+and containing structure.
+
+.Fn1 "histdata_t" free_history_entry "HIST_ENTRY *histent"
+Free the history entry \fIhistent\fP and any history library private
+data associated with it.  Returns the application-specific data
+so the caller can dispose of it.
+
+.Fn3 "HIST_ENTRY *" replace_history_entry "int which" "const char *line" "histdata_t data"
+Make the history entry at offset \fIwhich\fP have \fIline\fP and \fIdata\fP.
+This returns the old entry so the caller can dispose of any
+application-specific data.  In the case
+of an invalid \fIwhich\fP, a \fBNULL\fP pointer is returned.
+
+.Fn1 void clear_history "void"
+Clear the history list by deleting all the entries.
+
+.Fn1 void stifle_history "int max"
+Stifle the history list, remembering only the last \fImax\fP entries.
+
+.Fn1 int unstifle_history "void"
+Stop stifling the history.  This returns the previously-set
+maximum number of history entries (as set by \fBstifle_history()\fP).
+history was stifled.  The value is positive if the history was
+stifled, negative if it wasn't.
+
+.Fn1 int history_is_stifled "void"
+Returns non-zero if the history is stifled, zero if it is not.
+
+.SS Information About the History List
+
+These functions return information about the entire history list or
+individual list entries.
+
+.Fn1 "HIST_ENTRY **" history_list "void"
+Return a \fBNULL\fP terminated array of \fIHIST_ENTRY *\fP which is the
+current input history.  Element 0 of this list is the beginning of time.
+If there is no history, return \fBNULL\fP.
+
+.Fn1 int where_history "void"
+Returns the offset of the current history element.
+
+.Fn1 "HIST_ENTRY *" current_history "void"
+Return the history entry at the current position, as determined by
+\fBwhere_history()\fP.  If there is no entry there, return a \fBNULL\fP
+pointer.
+
+.Fn1 "HIST_ENTRY *" history_get "int offset"
+Return the history entry at position \fIoffset\fP, starting from
+\fBhistory_base\fP.
+If there is no entry there, or if \fIoffset\fP
+is greater than the history length, return a \fBNULL\fP pointer.
+
+.Fn1 "time_t" history_get_time "HIST_ENTRY *"
+Return the time stamp associated with the history entry passed as the argument.
+
+.Fn1 int history_total_bytes "void"
+Return the number of bytes that the primary history entries are using.
+This function returns the sum of the lengths of all the lines in the
+history.
+
+.SS Moving Around the History List
+
+These functions allow the current index into the history list to be
+set or changed.
+
+.Fn1 int history_set_pos "int pos"
+Set the current history offset to \fIpos\fP, an absolute index
+into the list.
+Returns 1 on success, 0 if \fIpos\fP is less than zero or greater
+than the number of history entries.
+
+.Fn1 "HIST_ENTRY *" previous_history "void"
+Back up the current history offset to the previous history entry, and
+return a pointer to that entry.  If there is no previous entry, return
+a \fBNULL\fP pointer.
+
+.Fn1 "HIST_ENTRY *" next_history "void"
+Move the current history offset forward to the next history entry, and
+return the a pointer to that entry.  If there is no next entry, return
+a \fBNULL\fP pointer.
+
+.SS Searching the History List
+
+These functions allow searching of the history list for entries containing
+a specific string.  Searching may be performed both forward and backward
+from the current history position.  The search may be \fIanchored\fP,
+meaning that the string must match at the beginning of the history entry.
+
+.Fn2 int history_search "const char *string" "int direction"
+Search the history for \fIstring\fP, starting at the current history offset.
+If \fIdirection\fP is less than 0, then the search is through
+previous entries, otherwise through subsequent entries.
+If \fIstring\fP is found, then
+the current history index is set to that history entry, and the value
+returned is the offset in the line of the entry where
+\fIstring\fP was found.  Otherwise, nothing is changed, and a -1 is
+returned.
+
+.Fn2 int history_search_prefix "const char *string" "int direction"
+Search the history for \fIstring\fP, starting at the current history
+offset.  The search is anchored: matching lines must begin with
+\fIstring\fP.  If \fIdirection\fP is less than 0, then the search is
+through previous entries, otherwise through subsequent entries.
+If \fIstring\fP is found, then the
+current history index is set to that entry, and the return value is 0. 
+Otherwise, nothing is changed, and a -1 is returned. 
+
+.Fn3 int history_search_pos "const char *string" "int direction" "int pos"
+Search for \fIstring\fP in the history list, starting at \fIpos\fP, an
+absolute index into the list.  If \fIdirection\fP is negative, the search
+proceeds backward from \fIpos\fP, otherwise forward.  Returns the absolute
+index of the history element where \fIstring\fP was found, or -1 otherwise.
+
+.SS Managing the History File
+The History library can read the history from and write it to a file.
+This section documents the functions for managing a history file.
+
+.Fn1 int read_history "const char *filename"
+Add the contents of \fIfilename\fP to the history list, a line at a time.
+If \fIfilename\fP is \fBNULL\fP, then read from \fI~/.history\fP.
+Returns 0 if successful, or \fBerrno\fP if not.
+
+.Fn3 int read_history_range "const char *filename" "int from" "int to"
+Read a range of lines from \fIfilename\fP, adding them to the history list.
+Start reading at line \fIfrom\fP and end at \fIto\fP.
+If \fIfrom\fP is zero, start at the beginning.  If \fIto\fP is less than
+\fIfrom\fP, then read until the end of the file.  If \fIfilename\fP is
+\fBNULL\fP, then read from \fI~/.history\fP.  Returns 0 if successful,
+or \fBerrno\fP if not.
+
+.Fn1 int write_history "const char *filename"
+Write the current history to \fIfilename\fP, overwriting \fIfilename\fP
+if necessary.
+If \fIfilename\fP is \fBNULL\fP, then write the history list to \fI~/.history\fP.
+Returns 0 on success, or \fBerrno\fP on a read or write error.
+
+
+.Fn2 int append_history "int nelements" "const char *filename"
+Append the last \fInelements\fP of the history list to \fIfilename\fP.
+If \fIfilename\fP is \fBNULL\fP, then append to \fI~/.history\fP.
+Returns 0 on success, or \fBerrno\fP on a read or write error.
+
+.Fn2 int history_truncate_file "const char *filename" "int nlines"
+Truncate the history file \fIfilename\fP, leaving only the last
+\fInlines\fP lines.
+If \fIfilename\fP is \fBNULL\fP, then \fI~/.history\fP is truncated.
+Returns 0 on success, or \fBerrno\fP on failure.
+
+.SS History Expansion
+
+These functions implement history expansion.
+
+.Fn2 int history_expand "char *string" "char **output"
+Expand \fIstring\fP, placing the result into \fIoutput\fP, a pointer
+to a string.  Returns:
+.RS
+.PD 0
+.TP
+0
+If no expansions took place (or, if the only change in
+the text was the removal of escape characters preceding the history expansion
+character);
+.TP
+1
+if expansions did take place;
+.TP
+-1
+if there was an error in expansion;
+.TP
+2
+if the returned line should be displayed, but not executed,
+as with the \fB:p\fP modifier.
+.PD
+.RE
+If an error ocurred in expansion, then \fIoutput\fP contains a descriptive
+error message.
+
+.Fn3 "char *" get_history_event "const char *string" "int *cindex" "int qchar"
+Returns the text of the history event beginning at \fIstring\fP +
+\fI*cindex\fP.  \fI*cindex\fP is modified to point to after the event
+specifier.  At function entry, \fIcindex\fP points to the index into
+\fIstring\fP where the history event specification begins.  \fIqchar\fP
+is a character that is allowed to end the event specification in addition
+to the ``normal'' terminating characters.
+
+.Fn1 "char **" history_tokenize "const char *string"
+Return an array of tokens parsed out of \fIstring\fP, much as the
+shell might.
+The tokens are split on the characters in the
+\fBhistory_word_delimiters\fP variable,
+and shell quoting conventions are obeyed.
+
+.Fn3 "char *" history_arg_extract "int first" "int last" "const char *string"
+Extract a string segment consisting of the \fIfirst\fP through \fIlast\fP
+arguments present in \fIstring\fP.  Arguments are split using
+\fBhistory_tokenize()\fP.
+
+.SS History Variables
+
+This section describes the externally-visible variables exported by
+the GNU History Library.
+
+.Vb int history_base
+The logical offset of the first entry in the history list.
+
+.Vb int history_length
+The number of entries currently stored in the history list.
+
+.Vb int history_max_entries
+The maximum number of history entries.  This must be changed using
+\fBstifle_history()\fP.
+
+.Vb int history_write_timestamps
+If non-zero, timestamps are written to the history file, so they can be
+preserved between sessions.  The default value is 0, meaning that
+timestamps are not saved.
+
+.Vb char history_expansion_char
+The character that introduces a history event.  The default is \fB!\fP.
+Setting this to 0 inhibits history expansion.
+
+.Vb char history_subst_char
+The character that invokes word substitution if found at the start of
+a line.  The default is \fB^\fP.
+
+.Vb char history_comment_char
+During tokenization, if this character is seen as the first character
+of a word, then it and all subsequent characters up to a newline are
+ignored, suppressing history expansion for the remainder of the line.
+This is disabled by default.
+
+.Vb "char *" history_word_delimiters
+The characters that separate tokens for \fBhistory_tokenize()\fP.
+The default value is \fB"\ \et\en()<>;&|"\fP.
+
+.Vb "char *" history_no_expand_chars
+The list of characters which inhibit history expansion if found immediately
+following \fBhistory_expansion_char\fP.  The default is space, tab, newline,
+\fB\er\fP, and \fB=\fP.
+
+.Vb "char *" history_search_delimiter_chars
+The list of additional characters which can delimit a history search
+string, in addition to space, tab, \fI:\fP and \fI?\fP in the case of
+a substring search.  The default is empty.
+
+.Vb int history_quotes_inhibit_expansion
+If non-zero, single-quoted words are not scanned for the history expansion
+character.  The default value is 0.
+
+.Vb "rl_linebuf_func_t *" history_inhibit_expansion_function
+This should be set to the address of a function that takes two arguments:
+a \fBchar *\fP (\fIstring\fP)
+and an \fBint\fP index into that string (\fIi\fP).
+It should return a non-zero value if the history expansion starting at
+\fIstring[i]\fP should not be performed; zero if the expansion should
+be done.
+It is intended for use by applications like \fBbash\fP that use the history
+expansion character for additional purposes.
+By default, this variable is set to \fBNULL\fP.
+.SH FILES
+.PD 0 
+.TP
+.FN ~/.history
+Default filename for reading and writing saved history
+.PD
+.SH "SEE ALSO"
+.PD 0
+.TP
+\fIThe Gnu Readline Library\fP, Brian Fox and Chet Ramey
+.TP
+\fIThe Gnu History Library\fP, Brian Fox and Chet Ramey
+.TP
+\fIbash\fP(1)
+.TP
+\fIreadline\fP(3)
+.PD
+.SH AUTHORS
+Brian Fox, Free Software Foundation
+.br
+bfox@gnu.org
+.PP
+Chet Ramey, Case Western Reserve University
+.br
+chet@ins.CWRU.Edu
+.SH BUG REPORTS
+If you find a bug in the
+.B history
+library, you should report it.  But first, you should
+make sure that it really is a bug, and that it appears in the latest
+version of the
+.B history
+library that you have.
+.PP
+Once you have determined that a bug actually exists, mail a
+bug report to \fIbug\-readline\fP@\fIgnu.org\fP.
+If you have a fix, you are welcome to mail that
+as well!  Suggestions and `philosophical' bug reports may be mailed
+to \fPbug-readline\fP@\fIgnu.org\fP or posted to the Usenet
+newsgroup
+.BR gnu.bash.bug .
+.PP
+Comments and bug reports concerning
+this manual page should be directed to
+.IR chet@ins.CWRU.Edu .
diff --git a/doc/history.dvi b/doc/history.dvi
new file mode 100644 (file)
index 0000000..19b3e5c
Binary files /dev/null and b/doc/history.dvi differ
diff --git a/doc/history.html b/doc/history.html
new file mode 100644 (file)
index 0000000..015a3e2
--- /dev/null
@@ -0,0 +1,2270 @@
+<HTML>
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<!-- Created on July, 6  2006 by texi2html 1.64 -->
+<!-- 
+Written by: Lionel Cons <Lionel.Cons@cern.ch> (original author)
+            Karl Berry  <karl@freefriends.org>
+            Olaf Bachmann <obachman@mathematik.uni-kl.de>
+            and many others.
+Maintained by: Olaf Bachmann <obachman@mathematik.uni-kl.de>
+Send bugs and suggestions to <texi2html@mathematik.uni-kl.de>
+-->
+<HEAD>
+<TITLE>GNU History Library: </TITLE>
+
+<META NAME="description" CONTENT="GNU History Library: ">
+<META NAME="keywords" CONTENT="GNU History Library: ">
+<META NAME="resource-type" CONTENT="document">
+<META NAME="distribution" CONTENT="global">
+<META NAME="Generator" CONTENT="texi2html 1.64">
+
+</HEAD>
+
+<BODY LANG="" BGCOLOR="#FFFFFF" TEXT="#000000" LINK="#0000FF" VLINK="#800080" ALINK="#FF0000">
+
+<A NAME="SEC_Top"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC22">Index</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H1>GNU History Library</H1></P><P>
+
+This document describes the GNU History library, a programming tool that
+provides a consistent user interface for recalling lines of previously
+typed input.
+</P><P>
+
+<BLOCKQUOTE><TABLE BORDER=0 CELLSPACING=0> 
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="history.html#SEC1">1. Using History Interactively</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">GNU History User's Manual.</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="history.html#SEC6">2. Programming with GNU History</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">GNU History Programmer's Manual.</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="history.html#SEC19">A. Copying This Manual</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP"></TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="history.html#SEC22">B. Concept Index</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Index of concepts described in this manual.</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="history.html#SEC23">C. Function and Variable Index</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Index of externally visible functions
+                                 and variables.</TD></TR>
+</TABLE></BLOCKQUOTE>
+<P>
+
+<HR SIZE=1>
+<A NAME="SEC1"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC_Top"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC2"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[ &lt;&lt; ]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC_Top"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC6"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC22">Index</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<A NAME="Using History Interactively"></A>
+<H1> 1. Using History Interactively </H1>
+<!--docid::SEC1::-->
+<P>
+
+This chapter describes how to use the GNU History Library interactively,
+from a user's standpoint.  It should be considered a user's guide.  For
+information on using the GNU History Library in your own programs,
+see section <A HREF="history.html#SEC6">2. Programming with GNU History</A>.
+</P><P>
+
+<BLOCKQUOTE><TABLE BORDER=0 CELLSPACING=0> 
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="history.html#SEC2">1.1 History Expansion</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">What it feels like using History as a user.</TD></TR>
+</TABLE></BLOCKQUOTE>
+<P>
+
+<A NAME="History Interaction"></A>
+<HR SIZE="6">
+<A NAME="SEC2"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC1"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC3"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[ &lt;&lt; ]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC1"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC6"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC22">Index</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H2> 1.1 History Expansion </H2>
+<!--docid::SEC2::-->
+<P>
+
+The History library provides a history expansion feature that is similar
+to the history expansion provided by <CODE>csh</CODE>.  This section
+describes the syntax used to manipulate the history information.
+</P><P>
+
+History expansions introduce words from the history list into
+the input stream, making it easy to repeat commands, insert the
+arguments to a previous command into the current input line, or
+fix errors in previous commands quickly.
+</P><P>
+
+History expansion takes place in two parts.  The first is to determine
+which line from the history list should be used during substitution.
+The second is to select portions of that line for inclusion into the
+current one.  The line selected from the history is called the
+<EM>event</EM>, and the portions of that line that are acted upon are
+called <EM>words</EM>.  Various <EM>modifiers</EM> are available to manipulate
+the selected words.  The line is broken into words in the same fashion
+that Bash does, so that several words
+surrounded by quotes are considered one word.
+History expansions are introduced by the appearance of the
+history expansion character, which is <SAMP>`!'</SAMP> by default.
+</P><P>
+
+<BLOCKQUOTE><TABLE BORDER=0 CELLSPACING=0> 
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="history.html#SEC3">1.1.1 Event Designators</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">How to specify which history line to use.</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="history.html#SEC4">1.1.2 Word Designators</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Specifying which words are of interest.</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="history.html#SEC5">1.1.3 Modifiers</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Modifying the results of substitution.</TD></TR>
+</TABLE></BLOCKQUOTE>
+<P>
+
+<A NAME="Event Designators"></A>
+<HR SIZE="6">
+<A NAME="SEC3"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC2"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC4"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[ &lt;&lt; ]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC2"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC6"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC22">Index</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> 1.1.1 Event Designators </H3>
+<!--docid::SEC3::-->
+<P>
+
+An event designator is a reference to a command line entry in the
+history list.
+<A NAME="IDX1"></A>
+</P><P>
+
+<DL COMPACT>
+
+<DT><CODE>!</CODE>
+<DD>Start a history substitution, except when followed by a space, tab,
+the end of the line, or <SAMP>`='</SAMP>.
+<P>
+
+<DT><CODE>!<VAR>n</VAR></CODE>
+<DD>Refer to command line <VAR>n</VAR>.
+<P>
+
+<DT><CODE>!-<VAR>n</VAR></CODE>
+<DD>Refer to the command <VAR>n</VAR> lines back.
+<P>
+
+<DT><CODE>!!</CODE>
+<DD>Refer to the previous command.  This is a synonym for <SAMP>`!-1'</SAMP>.
+<P>
+
+<DT><CODE>!<VAR>string</VAR></CODE>
+<DD>Refer to the most recent command starting with <VAR>string</VAR>.
+<P>
+
+<DT><CODE>!?<VAR>string</VAR>[?]</CODE>
+<DD>Refer to the most recent command containing <VAR>string</VAR>.  The trailing
+<SAMP>`?'</SAMP> may be omitted if the <VAR>string</VAR> is followed immediately by
+a newline.
+<P>
+
+<DT><CODE>^<VAR>string1</VAR>^<VAR>string2</VAR>^</CODE>
+<DD>Quick Substitution.  Repeat the last command, replacing <VAR>string1</VAR>
+with <VAR>string2</VAR>.  Equivalent to
+<CODE>!!:s/<VAR>string1</VAR>/<VAR>string2</VAR>/</CODE>.
+<P>
+
+<DT><CODE>!#</CODE>
+<DD>The entire command line typed so far.
+<P>
+
+</DL>
+<P>
+
+<A NAME="Word Designators"></A>
+<HR SIZE="6">
+<A NAME="SEC4"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC3"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC5"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC5"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC2"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC6"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC22">Index</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> 1.1.2 Word Designators </H3>
+<!--docid::SEC4::-->
+<P>
+
+Word designators are used to select desired words from the event.
+A <SAMP>`:'</SAMP> separates the event specification from the word designator.  It
+may be omitted if the word designator begins with a <SAMP>`^'</SAMP>, <SAMP>`$'</SAMP>,
+<SAMP>`*'</SAMP>, <SAMP>`-'</SAMP>, or <SAMP>`%'</SAMP>.  Words are numbered from the beginning
+of the line, with the first word being denoted by 0 (zero).  Words are
+inserted into the current line separated by single spaces.
+</P><P>
+
+For example,
+</P><P>
+
+<DL COMPACT>
+<DT><CODE>!!</CODE>
+<DD>designates the preceding command.  When you type this, the preceding
+command is repeated in toto.
+<P>
+
+<DT><CODE>!!:$</CODE>
+<DD>designates the last argument of the preceding command.  This may be
+shortened to <CODE>!$</CODE>.
+<P>
+
+<DT><CODE>!fi:2</CODE>
+<DD>designates the second argument of the most recent command starting with
+the letters <CODE>fi</CODE>.
+</DL>
+<P>
+
+Here are the word designators:
+<DL COMPACT>
+
+<DT><CODE>0 (zero)</CODE>
+<DD>The <CODE>0</CODE>th word.  For many applications, this is the command word.
+<P>
+
+<DT><CODE><VAR>n</VAR></CODE>
+<DD>The <VAR>n</VAR>th word.
+<P>
+
+<DT><CODE>^</CODE>
+<DD>The first argument; that is, word 1.
+<P>
+
+<DT><CODE>$</CODE>
+<DD>The last argument.
+<P>
+
+<DT><CODE>%</CODE>
+<DD>The word matched by the most recent <SAMP>`?<VAR>string</VAR>?'</SAMP> search.
+<P>
+
+<DT><CODE><VAR>x</VAR>-<VAR>y</VAR></CODE>
+<DD>A range of words; <SAMP>`-<VAR>y</VAR>'</SAMP> abbreviates <SAMP>`0-<VAR>y</VAR>'</SAMP>.
+<P>
+
+<DT><CODE>*</CODE>
+<DD>All of the words, except the <CODE>0</CODE>th.  This is a synonym for <SAMP>`1-$'</SAMP>.
+It is not an error to use <SAMP>`*'</SAMP> if there is just one word in the event;
+the empty string is returned in that case.
+<P>
+
+<DT><CODE><VAR>x</VAR>*</CODE>
+<DD>Abbreviates <SAMP>`<VAR>x</VAR>-$'</SAMP>
+<P>
+
+<DT><CODE><VAR>x</VAR>-</CODE>
+<DD>Abbreviates <SAMP>`<VAR>x</VAR>-$'</SAMP> like <SAMP>`<VAR>x</VAR>*'</SAMP>, but omits the last word.
+<P>
+
+</DL>
+<P>
+
+If a word designator is supplied without an event specification, the
+previous command is used as the event.
+</P><P>
+
+<A NAME="Modifiers"></A>
+<HR SIZE="6">
+<A NAME="SEC5"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC4"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC6"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[ &lt;&lt; ]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC2"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC6"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC22">Index</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> 1.1.3 Modifiers </H3>
+<!--docid::SEC5::-->
+<P>
+
+After the optional word designator, you can add a sequence of one or more
+of the following modifiers, each preceded by a <SAMP>`:'</SAMP>.
+</P><P>
+
+<DL COMPACT>
+
+<DT><CODE>h</CODE>
+<DD>Remove a trailing pathname component, leaving only the head.
+<P>
+
+<DT><CODE>t</CODE>
+<DD>Remove all leading  pathname  components, leaving the tail.
+<P>
+
+<DT><CODE>r</CODE>
+<DD>Remove a trailing suffix of the form <SAMP>`.<VAR>suffix</VAR>'</SAMP>, leaving
+the basename.
+<P>
+
+<DT><CODE>e</CODE>
+<DD>Remove all but the trailing suffix.
+<P>
+
+<DT><CODE>p</CODE>
+<DD>Print the new command but do not execute it.
+<P>
+
+<DT><CODE>s/<VAR>old</VAR>/<VAR>new</VAR>/</CODE>
+<DD>Substitute <VAR>new</VAR> for the first occurrence of <VAR>old</VAR> in the
+event line.  Any delimiter may be used in place of <SAMP>`/'</SAMP>.
+The delimiter may be quoted in <VAR>old</VAR> and <VAR>new</VAR>
+with a single backslash.  If <SAMP>`&#38;'</SAMP> appears in <VAR>new</VAR>,
+it is replaced by <VAR>old</VAR>.  A single backslash will quote
+the <SAMP>`&#38;'</SAMP>.  The final delimiter is optional if it is the last
+character on the input line.
+<P>
+
+<DT><CODE>&#38;</CODE>
+<DD>Repeat the previous substitution.
+<P>
+
+<DT><CODE>g</CODE>
+<DD><DT><CODE>a</CODE>
+<DD>Cause changes to be applied over the entire event line.  Used in
+conjunction with <SAMP>`s'</SAMP>, as in <CODE>gs/<VAR>old</VAR>/<VAR>new</VAR>/</CODE>,
+or with <SAMP>`&#38;'</SAMP>.
+<P>
+
+<DT><CODE>G</CODE>
+<DD>Apply the following <SAMP>`s'</SAMP> modifier once to each word in the event.
+<P>
+
+</DL>
+<P>
+
+<A NAME="Programming with GNU History"></A>
+<HR SIZE="6">
+<A NAME="SEC6"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC5"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC7"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[ &lt;&lt; ]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC_Top"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC19"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC22">Index</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H1> 2. Programming with GNU History </H1>
+<!--docid::SEC6::-->
+<P>
+
+This chapter describes how to interface programs that you write
+with the GNU History Library.
+It should be considered a technical guide.
+For information on the interactive use of GNU History, see section <A HREF="history.html#SEC1">1. Using History Interactively</A>.
+</P><P>
+
+<BLOCKQUOTE><TABLE BORDER=0 CELLSPACING=0> 
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="history.html#SEC7">2.1 Introduction to History</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">What is the GNU History library for?</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="history.html#SEC8">2.2 History Storage</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">How information is stored.</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="history.html#SEC9">2.3 History Functions</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Functions that you can use.</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="history.html#SEC17">2.4 History Variables</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Variables that control behaviour.</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="history.html#SEC18">2.5 History Programming Example</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Example of using the GNU History Library.</TD></TR>
+</TABLE></BLOCKQUOTE>
+<P>
+
+<A NAME="Introduction to History"></A>
+<HR SIZE="6">
+<A NAME="SEC7"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC6"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC8"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[ &lt;&lt; ]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC6"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC19"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC22">Index</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H2> 2.1 Introduction to History </H2>
+<!--docid::SEC7::-->
+<P>
+
+Many programs read input from the user a line at a time.  The GNU
+History library is able to keep track of those lines, associate arbitrary
+data with each line, and utilize information from previous lines in
+composing new ones. 
+</P><P>
+
+The programmer using the History library has available functions
+for remembering lines on a history list, associating arbitrary data
+with a line, removing lines from the list, searching through the list
+for a line containing an arbitrary text string, and referencing any line
+in the list directly.  In addition, a history <EM>expansion</EM> function
+is available which provides for a consistent user interface across
+different programs.
+</P><P>
+
+The user using programs written with the History library has the
+benefit of a consistent user interface with a set of well-known
+commands for manipulating the text of previous lines and using that text
+in new commands.  The basic history manipulation commands are similar to
+the history substitution provided by <CODE>csh</CODE>.
+</P><P>
+
+If the programmer desires, he can use the Readline library, which
+includes some history manipulation by default, and has the added
+advantage of command line editing.
+</P><P>
+
+Before declaring any functions using any functionality the History
+library provides in other code, an application writer should include
+the file <CODE>&#60;readline/history.h&#62;</CODE> in any file that uses the
+History library's features.  It supplies extern declarations for all
+of the library's public functions and variables, and declares all of
+the public data structures.
+</P><P>
+
+<A NAME="History Storage"></A>
+<HR SIZE="6">
+<A NAME="SEC8"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC7"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC9"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC9"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC6"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC19"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC22">Index</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H2> 2.2 History Storage </H2>
+<!--docid::SEC8::-->
+<P>
+
+The history list is an array of history entries.  A history entry is
+declared as follows:
+</P><P>
+
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>typedef void *histdata_t;
+
+typedef struct _hist_entry {
+  char *line;
+  char *timestamp;
+  histdata_t data;
+} HIST_ENTRY;
+</pre></td></tr></table></P><P>
+
+The history list itself might therefore be declared as
+</P><P>
+
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>HIST_ENTRY **the_history_list;
+</pre></td></tr></table></P><P>
+
+The state of the History library is encapsulated into a single structure:
+</P><P>
+
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>/*
+ * A structure used to pass around the current state of the history.
+ */
+typedef struct _hist_state {
+  HIST_ENTRY **entries; /* Pointer to the entries themselves. */
+  int offset;           /* The location pointer within this array. */
+  int length;           /* Number of elements within this array. */
+  int size;             /* Number of slots allocated to this array. */
+  int flags;
+} HISTORY_STATE;
+</pre></td></tr></table></P><P>
+
+If the flags member includes <CODE>HS_STIFLED</CODE>, the history has been
+stifled.
+</P><P>
+
+<A NAME="History Functions"></A>
+<HR SIZE="6">
+<A NAME="SEC9"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC8"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC10"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC17"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC6"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC17"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC22">Index</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H2> 2.3 History Functions </H2>
+<!--docid::SEC9::-->
+<P>
+
+This section describes the calling sequence for the various functions
+exported by the GNU History library.
+</P><P>
+
+<BLOCKQUOTE><TABLE BORDER=0 CELLSPACING=0> 
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="history.html#SEC10">2.3.1 Initializing History and State Management</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Functions to call when you
+                                               want to use history in a
+                                               program.</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="history.html#SEC11">2.3.2 History List Management</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Functions used to manage the list
+                                       of history entries.</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="history.html#SEC12">2.3.3 Information About the History List</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Functions returning information about
+                                       the history list.</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="history.html#SEC13">2.3.4 Moving Around the History List</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Functions used to change the position
+                                       in the history list.</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="history.html#SEC14">2.3.5 Searching the History List</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Functions to search the history list
+                                       for entries containing a string.</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="history.html#SEC15">2.3.6 Managing the History File</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Functions that read and write a file
+                                       containing the history list.</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="history.html#SEC16">2.3.7 History Expansion</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Functions to perform csh-like history
+                                       expansion.</TD></TR>
+</TABLE></BLOCKQUOTE>
+<P>
+
+<A NAME="Initializing History and State Management"></A>
+<HR SIZE="6">
+<A NAME="SEC10"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC9"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC11"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC17"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC9"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC17"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC22">Index</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> 2.3.1 Initializing History and State Management </H3>
+<!--docid::SEC10::-->
+<P>
+
+This section describes functions used to initialize and manage
+the state of the History library when you want to use the history
+functions in your program.
+</P><P>
+
+<A NAME="IDX2"></A>
+<DL>
+<DT><U>Function:</U> void <B>using_history</B> <I>(void)</I>
+<DD>Begin a session in which the history functions might be used.  This
+initializes the interactive variables.
+</DL>
+</P><P>
+
+<A NAME="IDX3"></A>
+<DL>
+<DT><U>Function:</U> HISTORY_STATE * <B>history_get_history_state</B> <I>(void)</I>
+<DD>Return a structure describing the current state of the input history.
+</DL>
+</P><P>
+
+<A NAME="IDX4"></A>
+<DL>
+<DT><U>Function:</U> void <B>history_set_history_state</B> <I>(HISTORY_STATE *state)</I>
+<DD>Set the state of the history list according to <VAR>state</VAR>.
+</DL>
+</P><P>
+
+<A NAME="History List Management"></A>
+<HR SIZE="6">
+<A NAME="SEC11"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC10"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC12"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC12"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC9"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC17"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC22">Index</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> 2.3.2 History List Management </H3>
+<!--docid::SEC11::-->
+<P>
+
+These functions manage individual entries on the history list, or set
+parameters managing the list itself.
+</P><P>
+
+<A NAME="IDX5"></A>
+<DL>
+<DT><U>Function:</U> void <B>add_history</B> <I>(const char *string)</I>
+<DD>Place <VAR>string</VAR> at the end of the history list.  The associated data
+field (if any) is set to <CODE>NULL</CODE>.
+</DL>
+</P><P>
+
+<A NAME="IDX6"></A>
+<DL>
+<DT><U>Function:</U> void <B>add_history_time</B> <I>(const char *string)</I>
+<DD>Change the time stamp associated with the most recent history entry to
+<VAR>string</VAR>.
+</DL>
+</P><P>
+
+<A NAME="IDX7"></A>
+<DL>
+<DT><U>Function:</U> HIST_ENTRY * <B>remove_history</B> <I>(int which)</I>
+<DD>Remove history entry at offset <VAR>which</VAR> from the history.  The
+removed element is returned so you can free the line, data,
+and containing structure.
+</DL>
+</P><P>
+
+<A NAME="IDX8"></A>
+<DL>
+<DT><U>Function:</U> histdata_t <B>free_history_entry</B> <I>(HIST_ENTRY *histent)</I>
+<DD>Free the history entry <VAR>histent</VAR> and any history library private
+data associated with it.  Returns the application-specific data
+so the caller can dispose of it.
+</DL>
+</P><P>
+
+<A NAME="IDX9"></A>
+<DL>
+<DT><U>Function:</U> HIST_ENTRY * <B>replace_history_entry</B> <I>(int which, const char *line, histdata_t data)</I>
+<DD>Make the history entry at offset <VAR>which</VAR> have <VAR>line</VAR> and <VAR>data</VAR>.
+This returns the old entry so the caller can dispose of any
+application-specific data.  In the case
+of an invalid <VAR>which</VAR>, a <CODE>NULL</CODE> pointer is returned.
+</DL>
+</P><P>
+
+<A NAME="IDX10"></A>
+<DL>
+<DT><U>Function:</U> void <B>clear_history</B> <I>(void)</I>
+<DD>Clear the history list by deleting all the entries.
+</DL>
+</P><P>
+
+<A NAME="IDX11"></A>
+<DL>
+<DT><U>Function:</U> void <B>stifle_history</B> <I>(int max)</I>
+<DD>Stifle the history list, remembering only the last <VAR>max</VAR> entries.
+</DL>
+</P><P>
+
+<A NAME="IDX12"></A>
+<DL>
+<DT><U>Function:</U> int <B>unstifle_history</B> <I>(void)</I>
+<DD>Stop stifling the history.  This returns the previously-set
+maximum number of history entries (as set by <CODE>stifle_history()</CODE>).
+The value is positive if the history was
+stifled, negative if it wasn't.
+</DL>
+</P><P>
+
+<A NAME="IDX13"></A>
+<DL>
+<DT><U>Function:</U> int <B>history_is_stifled</B> <I>(void)</I>
+<DD>Returns non-zero if the history is stifled, zero if it is not.
+</DL>
+</P><P>
+
+<A NAME="Information About the History List"></A>
+<HR SIZE="6">
+<A NAME="SEC12"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC11"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC13"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC13"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC9"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC17"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC22">Index</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> 2.3.3 Information About the History List </H3>
+<!--docid::SEC12::-->
+<P>
+
+These functions return information about the entire history list or
+individual list entries.
+</P><P>
+
+<A NAME="IDX14"></A>
+<DL>
+<DT><U>Function:</U> HIST_ENTRY ** <B>history_list</B> <I>(void)</I>
+<DD>Return a <CODE>NULL</CODE> terminated array of <CODE>HIST_ENTRY *</CODE> which is the
+current input history.  Element 0 of this list is the beginning of time.
+If there is no history, return <CODE>NULL</CODE>.
+</DL>
+</P><P>
+
+<A NAME="IDX15"></A>
+<DL>
+<DT><U>Function:</U> int <B>where_history</B> <I>(void)</I>
+<DD>Returns the offset of the current history element.
+</DL>
+</P><P>
+
+<A NAME="IDX16"></A>
+<DL>
+<DT><U>Function:</U> HIST_ENTRY * <B>current_history</B> <I>(void)</I>
+<DD>Return the history entry at the current position, as determined by
+<CODE>where_history()</CODE>.  If there is no entry there, return a <CODE>NULL</CODE>
+pointer.
+</DL>
+</P><P>
+
+<A NAME="IDX17"></A>
+<DL>
+<DT><U>Function:</U> HIST_ENTRY * <B>history_get</B> <I>(int offset)</I>
+<DD>Return the history entry at position <VAR>offset</VAR>, starting from
+<CODE>history_base</CODE> (see section <A HREF="history.html#SEC17">2.4 History Variables</A>).
+If there is no entry there, or if <VAR>offset</VAR>
+is greater than the history length, return a <CODE>NULL</CODE> pointer.
+</DL>
+</P><P>
+
+<A NAME="IDX18"></A>
+<DL>
+<DT><U>Function:</U> time_t <B>history_get_time</B> <I>(HIST_ENTRY *entry)</I>
+<DD>Return the time stamp associated with the history entry <VAR>entry</VAR>.
+</DL>
+</P><P>
+
+<A NAME="IDX19"></A>
+<DL>
+<DT><U>Function:</U> int <B>history_total_bytes</B> <I>(void)</I>
+<DD>Return the number of bytes that the primary history entries are using.
+This function returns the sum of the lengths of all the lines in the
+history.
+</DL>
+</P><P>
+
+<A NAME="Moving Around the History List"></A>
+<HR SIZE="6">
+<A NAME="SEC13"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC12"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC14"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC14"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC9"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC17"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC22">Index</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> 2.3.4 Moving Around the History List </H3>
+<!--docid::SEC13::-->
+<P>
+
+These functions allow the current index into the history list to be
+set or changed.
+</P><P>
+
+<A NAME="IDX20"></A>
+<DL>
+<DT><U>Function:</U> int <B>history_set_pos</B> <I>(int pos)</I>
+<DD>Set the current history offset to <VAR>pos</VAR>, an absolute index
+into the list.
+Returns 1 on success, 0 if <VAR>pos</VAR> is less than zero or greater
+than the number of history entries.
+</DL>
+</P><P>
+
+<A NAME="IDX21"></A>
+<DL>
+<DT><U>Function:</U> HIST_ENTRY * <B>previous_history</B> <I>(void)</I>
+<DD>Back up the current history offset to the previous history entry, and
+return a pointer to that entry.  If there is no previous entry, return
+a <CODE>NULL</CODE> pointer.
+</DL>
+</P><P>
+
+<A NAME="IDX22"></A>
+<DL>
+<DT><U>Function:</U> HIST_ENTRY * <B>next_history</B> <I>(void)</I>
+<DD>Move the current history offset forward to the next history entry, and
+return the a pointer to that entry.  If there is no next entry, return
+a <CODE>NULL</CODE> pointer.
+</DL>
+</P><P>
+
+<A NAME="Searching the History List"></A>
+<HR SIZE="6">
+<A NAME="SEC14"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC13"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC15"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC15"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC9"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC17"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC22">Index</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> 2.3.5 Searching the History List </H3>
+<!--docid::SEC14::-->
+<P>
+
+These functions allow searching of the history list for entries containing
+a specific string.  Searching may be performed both forward and backward
+from the current history position.  The search may be <EM>anchored</EM>,
+meaning that the string must match at the beginning of the history entry.
+<A NAME="IDX23"></A>
+</P><P>
+
+<A NAME="IDX24"></A>
+<DL>
+<DT><U>Function:</U> int <B>history_search</B> <I>(const char *string, int direction)</I>
+<DD>Search the history for <VAR>string</VAR>, starting at the current history offset.
+If <VAR>direction</VAR> is less than 0, then the search is through
+previous entries, otherwise through subsequent entries.
+If <VAR>string</VAR> is found, then
+the current history index is set to that history entry, and the value
+returned is the offset in the line of the entry where
+<VAR>string</VAR> was found.  Otherwise, nothing is changed, and a -1 is
+returned.
+</DL>
+</P><P>
+
+<A NAME="IDX25"></A>
+<DL>
+<DT><U>Function:</U> int <B>history_search_prefix</B> <I>(const char *string, int direction)</I>
+<DD>Search the history for <VAR>string</VAR>, starting at the current history
+offset.  The search is anchored: matching lines must begin with
+<VAR>string</VAR>.  If <VAR>direction</VAR> is less than 0, then the search is
+through previous entries, otherwise through subsequent entries.
+If <VAR>string</VAR> is found, then the
+current history index is set to that entry, and the return value is 0. 
+Otherwise, nothing is changed, and a -1 is returned. 
+</DL>
+</P><P>
+
+<A NAME="IDX26"></A>
+<DL>
+<DT><U>Function:</U> int <B>history_search_pos</B> <I>(const char *string, int direction, int pos)</I>
+<DD>Search for <VAR>string</VAR> in the history list, starting at <VAR>pos</VAR>, an
+absolute index into the list.  If <VAR>direction</VAR> is negative, the search
+proceeds backward from <VAR>pos</VAR>, otherwise forward.  Returns the absolute
+index of the history element where <VAR>string</VAR> was found, or -1 otherwise.
+</DL>
+</P><P>
+
+<A NAME="Managing the History File"></A>
+<HR SIZE="6">
+<A NAME="SEC15"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC14"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC16"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC16"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC9"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC17"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC22">Index</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> 2.3.6 Managing the History File </H3>
+<!--docid::SEC15::-->
+<P>
+
+The History library can read the history from and write it to a file.
+This section documents the functions for managing a history file.
+</P><P>
+
+<A NAME="IDX27"></A>
+<DL>
+<DT><U>Function:</U> int <B>read_history</B> <I>(const char *filename)</I>
+<DD>Add the contents of <VAR>filename</VAR> to the history list, a line at a time.
+If <VAR>filename</VAR> is <CODE>NULL</CODE>, then read from <TT>`~/.history'</TT>.
+Returns 0 if successful, or <CODE>errno</CODE> if not.
+</DL>
+</P><P>
+
+<A NAME="IDX28"></A>
+<DL>
+<DT><U>Function:</U> int <B>read_history_range</B> <I>(const char *filename, int from, int to)</I>
+<DD>Read a range of lines from <VAR>filename</VAR>, adding them to the history list.
+Start reading at line <VAR>from</VAR> and end at <VAR>to</VAR>.
+If <VAR>from</VAR> is zero, start at the beginning.  If <VAR>to</VAR> is less than
+<VAR>from</VAR>, then read until the end of the file.  If <VAR>filename</VAR> is
+<CODE>NULL</CODE>, then read from <TT>`~/.history'</TT>.  Returns 0 if successful,
+or <CODE>errno</CODE> if not.
+</DL>
+</P><P>
+
+<A NAME="IDX29"></A>
+<DL>
+<DT><U>Function:</U> int <B>write_history</B> <I>(const char *filename)</I>
+<DD>Write the current history to <VAR>filename</VAR>, overwriting <VAR>filename</VAR>
+if necessary.
+If <VAR>filename</VAR> is <CODE>NULL</CODE>, then write the history list to
+<TT>`~/.history'</TT>.
+Returns 0 on success, or <CODE>errno</CODE> on a read or write error.
+</DL>
+</P><P>
+
+<A NAME="IDX30"></A>
+<DL>
+<DT><U>Function:</U> int <B>append_history</B> <I>(int nelements, const char *filename)</I>
+<DD>Append the last <VAR>nelements</VAR> of the history list to <VAR>filename</VAR>.
+If <VAR>filename</VAR> is <CODE>NULL</CODE>, then append to <TT>`~/.history'</TT>.
+Returns 0 on success, or <CODE>errno</CODE> on a read or write error.
+</DL>
+</P><P>
+
+<A NAME="IDX31"></A>
+<DL>
+<DT><U>Function:</U> int <B>history_truncate_file</B> <I>(const char *filename, int nlines)</I>
+<DD>Truncate the history file <VAR>filename</VAR>, leaving only the last
+<VAR>nlines</VAR> lines.
+If <VAR>filename</VAR> is <CODE>NULL</CODE>, then <TT>`~/.history'</TT> is truncated.
+Returns 0 on success, or <CODE>errno</CODE> on failure.
+</DL>
+</P><P>
+
+<A NAME="History Expansion"></A>
+<HR SIZE="6">
+<A NAME="SEC16"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC15"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC17"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC17"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC9"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC17"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC22">Index</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> 2.3.7 History Expansion </H3>
+<!--docid::SEC16::-->
+<P>
+
+These functions implement history expansion.
+</P><P>
+
+<A NAME="IDX32"></A>
+<DL>
+<DT><U>Function:</U> int <B>history_expand</B> <I>(char *string, char **output)</I>
+<DD>Expand <VAR>string</VAR>, placing the result into <VAR>output</VAR>, a pointer
+to a string (see section <A HREF="history.html#SEC2">1.1 History Expansion</A>).  Returns:
+<DL COMPACT>
+<DT><CODE>0</CODE>
+<DD>If no expansions took place (or, if the only change in
+the text was the removal of escape characters preceding the history expansion
+character);
+<DT><CODE>1</CODE>
+<DD>if expansions did take place;
+<DT><CODE>-1</CODE>
+<DD>if there was an error in expansion;
+<DT><CODE>2</CODE>
+<DD>if the returned line should be displayed, but not executed,
+as with the <CODE>:p</CODE> modifier (see section <A HREF="history.html#SEC5">1.1.3 Modifiers</A>).
+</DL>
+<P>
+
+If an error ocurred in expansion, then <VAR>output</VAR> contains a descriptive
+error message.
+</DL>
+</P><P>
+
+<A NAME="IDX33"></A>
+<DL>
+<DT><U>Function:</U> char * <B>get_history_event</B> <I>(const char *string, int *cindex, int qchar)</I>
+<DD>Returns the text of the history event beginning at <VAR>string</VAR> +
+<VAR>*cindex</VAR>.  <VAR>*cindex</VAR> is modified to point to after the event
+specifier.  At function entry, <VAR>cindex</VAR> points to the index into
+<VAR>string</VAR> where the history event specification begins.  <VAR>qchar</VAR>
+is a character that is allowed to end the event specification in addition
+to the "normal" terminating characters.
+</DL>
+</P><P>
+
+<A NAME="IDX34"></A>
+<DL>
+<DT><U>Function:</U> char ** <B>history_tokenize</B> <I>(const char *string)</I>
+<DD>Return an array of tokens parsed out of <VAR>string</VAR>, much as the
+shell might.  The tokens are split on the characters in the
+<VAR>history_word_delimiters</VAR> variable,
+and shell quoting conventions are obeyed.
+</DL>
+</P><P>
+
+<A NAME="IDX35"></A>
+<DL>
+<DT><U>Function:</U> char * <B>history_arg_extract</B> <I>(int first, int last, const char *string)</I>
+<DD>Extract a string segment consisting of the <VAR>first</VAR> through <VAR>last</VAR>
+arguments present in <VAR>string</VAR>.  Arguments are split using
+<CODE>history_tokenize</CODE>.
+</DL>
+</P><P>
+
+<A NAME="History Variables"></A>
+<HR SIZE="6">
+<A NAME="SEC17"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC16"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC18"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC18"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC6"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC19"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC22">Index</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H2> 2.4 History Variables </H2>
+<!--docid::SEC17::-->
+<P>
+
+This section describes the externally-visible variables exported by
+the GNU History Library.
+</P><P>
+
+<A NAME="IDX36"></A>
+<DL>
+<DT><U>Variable:</U> int <B>history_base</B>
+<DD>The logical offset of the first entry in the history list.
+</DL>
+</P><P>
+
+<A NAME="IDX37"></A>
+<DL>
+<DT><U>Variable:</U> int <B>history_length</B>
+<DD>The number of entries currently stored in the history list.
+</DL>
+</P><P>
+
+<A NAME="IDX38"></A>
+<DL>
+<DT><U>Variable:</U> int <B>history_max_entries</B>
+<DD>The maximum number of history entries.  This must be changed using
+<CODE>stifle_history()</CODE>.
+</DL>
+</P><P>
+
+<A NAME="IDX39"></A>
+<DL>
+<DT><U>Variable:</U> int <B>history_write_timestamps</B>
+<DD>If non-zero, timestamps are written to the history file, so they can be
+preserved between sessions.  The default value is 0, meaning that
+timestamps are not saved.
+</DL>
+</P><P>
+
+<A NAME="IDX40"></A>
+<DL>
+<DT><U>Variable:</U> char <B>history_expansion_char</B>
+<DD>The character that introduces a history event.  The default is <SAMP>`!'</SAMP>.
+Setting this to 0 inhibits history expansion.
+</DL>
+</P><P>
+
+<A NAME="IDX41"></A>
+<DL>
+<DT><U>Variable:</U> char <B>history_subst_char</B>
+<DD>The character that invokes word substitution if found at the start of
+a line.  The default is <SAMP>`^'</SAMP>.
+</DL>
+</P><P>
+
+<A NAME="IDX42"></A>
+<DL>
+<DT><U>Variable:</U> char <B>history_comment_char</B>
+<DD>During tokenization, if this character is seen as the first character
+of a word, then it and all subsequent characters up to a newline are
+ignored, suppressing history expansion for the remainder of the line.
+This is disabled by default.
+</DL>
+</P><P>
+
+<A NAME="IDX43"></A>
+<DL>
+<DT><U>Variable:</U> char * <B>history_word_delimiters</B>
+<DD>The characters that separate tokens for <CODE>history_tokenize()</CODE>.
+The default value is <CODE>" \t\n()<>;&|"</CODE>.
+</DL>
+</P><P>
+
+<A NAME="IDX44"></A>
+<DL>
+<DT><U>Variable:</U> char * <B>history_search_delimiter_chars</B>
+<DD>The list of additional characters which can delimit a history search
+string, in addition to space, TAB, <SAMP>`:'</SAMP> and <SAMP>`?'</SAMP> in the case of
+a substring search.  The default is empty.
+</DL>
+</P><P>
+
+<A NAME="IDX45"></A>
+<DL>
+<DT><U>Variable:</U> char * <B>history_no_expand_chars</B>
+<DD>The list of characters which inhibit history expansion if found immediately
+following <VAR>history_expansion_char</VAR>.  The default is space, tab, newline,
+carriage return, and <SAMP>`='</SAMP>.
+</DL>
+</P><P>
+
+<A NAME="IDX46"></A>
+<DL>
+<DT><U>Variable:</U> int <B>history_quotes_inhibit_expansion</B>
+<DD>If non-zero, single-quoted words are not scanned for the history expansion
+character.  The default value is 0.
+</DL>
+</P><P>
+
+<A NAME="IDX47"></A>
+<DL>
+<DT><U>Variable:</U> rl_linebuf_func_t * <B>history_inhibit_expansion_function</B>
+<DD>This should be set to the address of a function that takes two arguments:
+a <CODE>char *</CODE> (<VAR>string</VAR>)
+and an <CODE>int</CODE> index into that string (<VAR>i</VAR>).
+It should return a non-zero value if the history expansion starting at
+<VAR>string[i]</VAR> should not be performed; zero if the expansion should
+be done.
+It is intended for use by applications like Bash that use the history
+expansion character for additional purposes.
+By default, this variable is set to <CODE>NULL</CODE>.
+</DL>
+</P><P>
+
+<A NAME="History Programming Example"></A>
+<HR SIZE="6">
+<A NAME="SEC18"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC17"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC19"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[ &lt;&lt; ]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC6"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC19"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC22">Index</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H2> 2.5 History Programming Example </H2>
+<!--docid::SEC18::-->
+<P>
+
+The following program demonstrates simple use of the GNU History Library.
+</P><P>
+
+<TABLE><tr><td>&nbsp;</td><td class=smallexample><FONT SIZE=-1><pre>#include &#60;stdio.h&#62;
+#include &#60;readline/history.h&#62;
+
+main (argc, argv)
+     int argc;
+     char **argv;
+{
+  char line[1024], *t;
+  int len, done = 0;
+
+  line[0] = 0;
+
+  using_history ();
+  while (!done)
+    {
+      printf ("history$ ");
+      fflush (stdout);
+      t = fgets (line, sizeof (line) - 1, stdin);
+      if (t &#38;&#38; *t)
+        {
+          len = strlen (t);
+          if (t[len - 1] == '\n')
+            t[len - 1] = '\0';
+        }
+
+      if (!t)
+        strcpy (line, "quit");
+
+      if (line[0])
+        {
+          char *expansion;
+          int result;
+
+          result = history_expand (line, &#38;expansion);
+          if (result)
+            fprintf (stderr, "%s\n", expansion);
+
+          if (result &#60; 0 || result == 2)
+            {
+              free (expansion);
+              continue;
+            }
+
+          add_history (expansion);
+          strncpy (line, expansion, sizeof (line) - 1);
+          free (expansion);
+        }
+
+      if (strcmp (line, "quit") == 0)
+        done = 1;
+      else if (strcmp (line, "save") == 0)
+        write_history ("history_file");
+      else if (strcmp (line, "read") == 0)
+        read_history ("history_file");
+      else if (strcmp (line, "list") == 0)
+        {
+          register HIST_ENTRY **the_list;
+          register int i;
+
+          the_list = history_list ();
+          if (the_list)
+            for (i = 0; the_list[i]; i++)
+              printf ("%d: %s\n", i + history_base, the_list[i]-&#62;line);
+        }
+      else if (strncmp (line, "delete", 6) == 0)
+        {
+          int which;
+          if ((sscanf (line + 6, "%d", &#38;which)) == 1)
+            {
+              HIST_ENTRY *entry = remove_history (which);
+              if (!entry)
+                fprintf (stderr, "No such entry %d\n", which);
+              else
+                {
+                  free (entry-&#62;line);
+                  free (entry);
+                }
+            }
+          else
+            {
+              fprintf (stderr, "non-numeric arg given to `delete'\n");
+            }
+        }
+    }
+}
+</FONT></pre></td></tr></table></P><P>
+
+<A NAME="Copying This Manual"></A>
+<HR SIZE="6">
+<A NAME="SEC19"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC18"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC20"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC6"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC_Top"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC22"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC22">Index</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H1> A. Copying This Manual </H1>
+<!--docid::SEC19::-->
+<P>
+
+<BLOCKQUOTE><TABLE BORDER=0 CELLSPACING=0> 
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="history.html#SEC20">A.1 GNU Free Documentation License</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">License for copying this manual.</TD></TR>
+</TABLE></BLOCKQUOTE>
+<P>
+
+<A NAME="GNU Free Documentation License"></A>
+<HR SIZE="6">
+<A NAME="SEC20"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC19"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC21"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC19"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC19"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC22"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC22">Index</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H2> A.1 GNU Free Documentation License </H2>
+<!--docid::SEC20::-->
+<P>
+
+<A NAME="IDX48"></A>
+<center>
+ Version 1.2, November 2002
+</center>
+</P><P>
+
+<TABLE><tr><td>&nbsp;</td><td class=display><pre style="font-family: serif">Copyright (C) 2000,2001,2002 Free Software Foundation, Inc.
+59 Temple Place, Suite 330, Boston, MA  02111-1307, USA
+
+Everyone is permitted to copy and distribute verbatim copies
+of this license document, but changing it is not allowed.
+</pre></td></tr></table></P><P>
+
+<OL>
+<LI>
+PREAMBLE
+<P>
+
+The purpose of this License is to make a manual, textbook, or other
+functional and useful document <EM>free</EM> in the sense of freedom: to
+assure everyone the effective freedom to copy and redistribute it,
+with or without modifying it, either commercially or noncommercially.
+Secondarily, this License preserves for the author and publisher a way
+to get credit for their work, while not being considered responsible
+for modifications made by others.
+</P><P>
+
+This License is a kind of "copyleft", which means that derivative
+works of the document must themselves be free in the same sense.  It
+complements the GNU General Public License, which is a copyleft
+license designed for free software.
+</P><P>
+
+We have designed this License in order to use it for manuals for free
+software, because free software needs free documentation: a free
+program should come with manuals providing the same freedoms that the
+software does.  But this License is not limited to software manuals;
+it can be used for any textual work, regardless of subject matter or
+whether it is published as a printed book.  We recommend this License
+principally for works whose purpose is instruction or reference.
+</P><P>
+
+<LI>
+APPLICABILITY AND DEFINITIONS
+<P>
+
+This License applies to any manual or other work, in any medium, that
+contains a notice placed by the copyright holder saying it can be
+distributed under the terms of this License.  Such a notice grants a
+world-wide, royalty-free license, unlimited in duration, to use that
+work under the conditions stated herein.  The "Document", below,
+refers to any such manual or work.  Any member of the public is a
+licensee, and is addressed as "you".  You accept the license if you
+copy, modify or distribute the work in a way requiring permission
+under copyright law.
+</P><P>
+
+A "Modified Version" of the Document means any work containing the
+Document or a portion of it, either copied verbatim, or with
+modifications and/or translated into another language.
+</P><P>
+
+A "Secondary Section" is a named appendix or a front-matter section
+of the Document that deals exclusively with the relationship of the
+publishers or authors of the Document to the Document's overall
+subject (or to related matters) and contains nothing that could fall
+directly within that overall subject.  (Thus, if the Document is in
+part a textbook of mathematics, a Secondary Section may not explain
+any mathematics.)  The relationship could be a matter of historical
+connection with the subject or with related matters, or of legal,
+commercial, philosophical, ethical or political position regarding
+them.
+</P><P>
+
+The "Invariant Sections" are certain Secondary Sections whose titles
+are designated, as being those of Invariant Sections, in the notice
+that says that the Document is released under this License.  If a
+section does not fit the above definition of Secondary then it is not
+allowed to be designated as Invariant.  The Document may contain zero
+Invariant Sections.  If the Document does not identify any Invariant
+Sections then there are none.
+</P><P>
+
+The "Cover Texts" are certain short passages of text that are listed,
+as Front-Cover Texts or Back-Cover Texts, in the notice that says that
+the Document is released under this License.  A Front-Cover Text may
+be at most 5 words, and a Back-Cover Text may be at most 25 words.
+</P><P>
+
+A "Transparent" copy of the Document means a machine-readable copy,
+represented in a format whose specification is available to the
+general public, that is suitable for revising the document
+straightforwardly with generic text editors or (for images composed of
+pixels) generic paint programs or (for drawings) some widely available
+drawing editor, and that is suitable for input to text formatters or
+for automatic translation to a variety of formats suitable for input
+to text formatters.  A copy made in an otherwise Transparent file
+format whose markup, or absence of markup, has been arranged to thwart
+or discourage subsequent modification by readers is not Transparent.
+An image format is not Transparent if used for any substantial amount
+of text.  A copy that is not "Transparent" is called "Opaque".
+</P><P>
+
+Examples of suitable formats for Transparent copies include plain
+ASCII without markup, Texinfo input format, LaTeX input
+format, <FONT SIZE="-1">SGML</FONT> or <FONT SIZE="-1">XML</FONT> using a publicly available
+<FONT SIZE="-1">DTD</FONT>, and standard-conforming simple <FONT SIZE="-1">HTML</FONT>,
+PostScript or <FONT SIZE="-1">PDF</FONT> designed for human modification.  Examples
+of transparent image formats include <FONT SIZE="-1">PNG</FONT>, <FONT SIZE="-1">XCF</FONT> and
+<FONT SIZE="-1">JPG</FONT>.  Opaque formats include proprietary formats that can be
+read and edited only by proprietary word processors, <FONT SIZE="-1">SGML</FONT> or
+<FONT SIZE="-1">XML</FONT> for which the <FONT SIZE="-1">DTD</FONT> and/or processing tools are
+not generally available, and the machine-generated <FONT SIZE="-1">HTML</FONT>,
+PostScript or <FONT SIZE="-1">PDF</FONT> produced by some word processors for
+output purposes only.
+</P><P>
+
+The "Title Page" means, for a printed book, the title page itself,
+plus such following pages as are needed to hold, legibly, the material
+this License requires to appear in the title page.  For works in
+formats which do not have any title page as such, "Title Page" means
+the text near the most prominent appearance of the work's title,
+preceding the beginning of the body of the text.
+</P><P>
+
+A section "Entitled XYZ" means a named subunit of the Document whose
+title either is precisely XYZ or contains XYZ in parentheses following
+text that translates XYZ in another language.  (Here XYZ stands for a
+specific section name mentioned below, such as "Acknowledgements",
+"Dedications", "Endorsements", or "History".)  To "Preserve the Title"
+of such a section when you modify the Document means that it remains a
+section "Entitled XYZ" according to this definition.
+</P><P>
+
+The Document may include Warranty Disclaimers next to the notice which
+states that this License applies to the Document.  These Warranty
+Disclaimers are considered to be included by reference in this
+License, but only as regards disclaiming warranties: any other
+implication that these Warranty Disclaimers may have is void and has
+no effect on the meaning of this License.
+</P><P>
+
+<LI>
+VERBATIM COPYING
+<P>
+
+You may copy and distribute the Document in any medium, either
+commercially or noncommercially, provided that this License, the
+copyright notices, and the license notice saying this License applies
+to the Document are reproduced in all copies, and that you add no other
+conditions whatsoever to those of this License.  You may not use
+technical measures to obstruct or control the reading or further
+copying of the copies you make or distribute.  However, you may accept
+compensation in exchange for copies.  If you distribute a large enough
+number of copies you must also follow the conditions in section 3.
+</P><P>
+
+You may also lend copies, under the same conditions stated above, and
+you may publicly display copies.
+</P><P>
+
+<LI>
+COPYING IN QUANTITY
+<P>
+
+If you publish printed copies (or copies in media that commonly have
+printed covers) of the Document, numbering more than 100, and the
+Document's license notice requires Cover Texts, you must enclose the
+copies in covers that carry, clearly and legibly, all these Cover
+Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on
+the back cover.  Both covers must also clearly and legibly identify
+you as the publisher of these copies.  The front cover must present
+the full title with all words of the title equally prominent and
+visible.  You may add other material on the covers in addition.
+Copying with changes limited to the covers, as long as they preserve
+the title of the Document and satisfy these conditions, can be treated
+as verbatim copying in other respects.
+</P><P>
+
+If the required texts for either cover are too voluminous to fit
+legibly, you should put the first ones listed (as many as fit
+reasonably) on the actual cover, and continue the rest onto adjacent
+pages.
+</P><P>
+
+If you publish or distribute Opaque copies of the Document numbering
+more than 100, you must either include a machine-readable Transparent
+copy along with each Opaque copy, or state in or with each Opaque copy
+a computer-network location from which the general network-using
+public has access to download using public-standard network protocols
+a complete Transparent copy of the Document, free of added material.
+If you use the latter option, you must take reasonably prudent steps,
+when you begin distribution of Opaque copies in quantity, to ensure
+that this Transparent copy will remain thus accessible at the stated
+location until at least one year after the last time you distribute an
+Opaque copy (directly or through your agents or retailers) of that
+edition to the public.
+</P><P>
+
+It is requested, but not required, that you contact the authors of the
+Document well before redistributing any large number of copies, to give
+them a chance to provide you with an updated version of the Document.
+</P><P>
+
+<LI>
+MODIFICATIONS
+<P>
+
+You may copy and distribute a Modified Version of the Document under
+the conditions of sections 2 and 3 above, provided that you release
+the Modified Version under precisely this License, with the Modified
+Version filling the role of the Document, thus licensing distribution
+and modification of the Modified Version to whoever possesses a copy
+of it.  In addition, you must do these things in the Modified Version:
+</P><P>
+
+<OL>
+<LI>
+Use in the Title Page (and on the covers, if any) a title distinct
+from that of the Document, and from those of previous versions
+(which should, if there were any, be listed in the History section
+of the Document).  You may use the same title as a previous version
+if the original publisher of that version gives permission.
+<P>
+
+<LI>
+List on the Title Page, as authors, one or more persons or entities
+responsible for authorship of the modifications in the Modified
+Version, together with at least five of the principal authors of the
+Document (all of its principal authors, if it has fewer than five),
+unless they release you from this requirement.
+<P>
+
+<LI>
+State on the Title page the name of the publisher of the
+Modified Version, as the publisher.
+<P>
+
+<LI>
+Preserve all the copyright notices of the Document.
+<P>
+
+<LI>
+Add an appropriate copyright notice for your modifications
+adjacent to the other copyright notices.
+<P>
+
+<LI>
+Include, immediately after the copyright notices, a license notice
+giving the public permission to use the Modified Version under the
+terms of this License, in the form shown in the Addendum below.
+<P>
+
+<LI>
+Preserve in that license notice the full lists of Invariant Sections
+and required Cover Texts given in the Document's license notice.
+<P>
+
+<LI>
+Include an unaltered copy of this License.
+<P>
+
+<LI>
+Preserve the section Entitled "History", Preserve its Title, and add
+to it an item stating at least the title, year, new authors, and
+publisher of the Modified Version as given on the Title Page.  If
+there is no section Entitled "History" in the Document, create one
+stating the title, year, authors, and publisher of the Document as
+given on its Title Page, then add an item describing the Modified
+Version as stated in the previous sentence.
+<P>
+
+<LI>
+Preserve the network location, if any, given in the Document for
+public access to a Transparent copy of the Document, and likewise
+the network locations given in the Document for previous versions
+it was based on.  These may be placed in the "History" section.
+You may omit a network location for a work that was published at
+least four years before the Document itself, or if the original
+publisher of the version it refers to gives permission.
+<P>
+
+<LI>
+For any section Entitled "Acknowledgements" or "Dedications", Preserve
+the Title of the section, and preserve in the section all the
+substance and tone of each of the contributor acknowledgements and/or
+dedications given therein.
+<P>
+
+<LI>
+Preserve all the Invariant Sections of the Document,
+unaltered in their text and in their titles.  Section numbers
+or the equivalent are not considered part of the section titles.
+<P>
+
+<LI>
+Delete any section Entitled "Endorsements".  Such a section
+may not be included in the Modified Version.
+<P>
+
+<LI>
+Do not retitle any existing section to be Entitled "Endorsements" or
+to conflict in title with any Invariant Section.
+<P>
+
+<LI>
+Preserve any Warranty Disclaimers.
+</OL>
+<P>
+
+If the Modified Version includes new front-matter sections or
+appendices that qualify as Secondary Sections and contain no material
+copied from the Document, you may at your option designate some or all
+of these sections as invariant.  To do this, add their titles to the
+list of Invariant Sections in the Modified Version's license notice.
+These titles must be distinct from any other section titles.
+</P><P>
+
+You may add a section Entitled "Endorsements", provided it contains
+nothing but endorsements of your Modified Version by various
+parties--for example, statements of peer review or that the text has
+been approved by an organization as the authoritative definition of a
+standard.
+</P><P>
+
+You may add a passage of up to five words as a Front-Cover Text, and a
+passage of up to 25 words as a Back-Cover Text, to the end of the list
+of Cover Texts in the Modified Version.  Only one passage of
+Front-Cover Text and one of Back-Cover Text may be added by (or
+through arrangements made by) any one entity.  If the Document already
+includes a cover text for the same cover, previously added by you or
+by arrangement made by the same entity you are acting on behalf of,
+you may not add another; but you may replace the old one, on explicit
+permission from the previous publisher that added the old one.
+</P><P>
+
+The author(s) and publisher(s) of the Document do not by this License
+give permission to use their names for publicity for or to assert or
+imply endorsement of any Modified Version.
+</P><P>
+
+<LI>
+COMBINING DOCUMENTS
+<P>
+
+You may combine the Document with other documents released under this
+License, under the terms defined in section 4 above for modified
+versions, provided that you include in the combination all of the
+Invariant Sections of all of the original documents, unmodified, and
+list them all as Invariant Sections of your combined work in its
+license notice, and that you preserve all their Warranty Disclaimers.
+</P><P>
+
+The combined work need only contain one copy of this License, and
+multiple identical Invariant Sections may be replaced with a single
+copy.  If there are multiple Invariant Sections with the same name but
+different contents, make the title of each such section unique by
+adding at the end of it, in parentheses, the name of the original
+author or publisher of that section if known, or else a unique number.
+Make the same adjustment to the section titles in the list of
+Invariant Sections in the license notice of the combined work.
+</P><P>
+
+In the combination, you must combine any sections Entitled "History"
+in the various original documents, forming one section Entitled
+"History"; likewise combine any sections Entitled "Acknowledgements",
+and any sections Entitled "Dedications".  You must delete all
+sections Entitled "Endorsements."
+</P><P>
+
+<LI>
+COLLECTIONS OF DOCUMENTS
+<P>
+
+You may make a collection consisting of the Document and other documents
+released under this License, and replace the individual copies of this
+License in the various documents with a single copy that is included in
+the collection, provided that you follow the rules of this License for
+verbatim copying of each of the documents in all other respects.
+</P><P>
+
+You may extract a single document from such a collection, and distribute
+it individually under this License, provided you insert a copy of this
+License into the extracted document, and follow this License in all
+other respects regarding verbatim copying of that document.
+</P><P>
+
+<LI>
+AGGREGATION WITH INDEPENDENT WORKS
+<P>
+
+A compilation of the Document or its derivatives with other separate
+and independent documents or works, in or on a volume of a storage or
+distribution medium, is called an "aggregate" if the copyright
+resulting from the compilation is not used to limit the legal rights
+of the compilation's users beyond what the individual works permit.
+When the Document is included an aggregate, this License does not
+apply to the other works in the aggregate which are not themselves
+derivative works of the Document.
+</P><P>
+
+If the Cover Text requirement of section 3 is applicable to these
+copies of the Document, then if the Document is less than one half of
+the entire aggregate, the Document's Cover Texts may be placed on
+covers that bracket the Document within the aggregate, or the
+electronic equivalent of covers if the Document is in electronic form.
+Otherwise they must appear on printed covers that bracket the whole
+aggregate.
+</P><P>
+
+<LI>
+TRANSLATION
+<P>
+
+Translation is considered a kind of modification, so you may
+distribute translations of the Document under the terms of section 4.
+Replacing Invariant Sections with translations requires special
+permission from their copyright holders, but you may include
+translations of some or all Invariant Sections in addition to the
+original versions of these Invariant Sections.  You may include a
+translation of this License, and all the license notices in the
+Document, and any Warranty Disclaimers, provided that you also include
+the original English version of this License and the original versions
+of those notices and disclaimers.  In case of a disagreement between
+the translation and the original version of this License or a notice
+or disclaimer, the original version will prevail.
+</P><P>
+
+If a section in the Document is Entitled "Acknowledgements",
+"Dedications", or "History", the requirement (section 4) to Preserve
+its Title (section 1) will typically require changing the actual
+title.
+</P><P>
+
+<LI>
+TERMINATION
+<P>
+
+You may not copy, modify, sublicense, or distribute the Document except
+as expressly provided for under this License.  Any other attempt to
+copy, modify, sublicense or distribute the Document is void, and will
+automatically terminate your rights under this License.  However,
+parties who have received copies, or rights, from you under this
+License will not have their licenses terminated so long as such
+parties remain in full compliance.
+</P><P>
+
+<LI>
+FUTURE REVISIONS OF THIS LICENSE
+<P>
+
+The Free Software Foundation may publish new, revised versions
+of the GNU Free Documentation License from time to time.  Such new
+versions will be similar in spirit to the present version, but may
+differ in detail to address new problems or concerns.  See
+<A HREF="http://www.gnu.org/copyleft/">http://www.gnu.org/copyleft/</A>.
+</P><P>
+
+Each version of the License is given a distinguishing version number.
+If the Document specifies that a particular numbered version of this
+License "or any later version" applies to it, you have the option of
+following the terms and conditions either of that specified version or
+of any later version that has been published (not as a draft) by the
+Free Software Foundation.  If the Document does not specify a version
+number of this License, you may choose any version ever published (not
+as a draft) by the Free Software Foundation.
+</OL>
+<P>
+
+<HR SIZE="6">
+<A NAME="SEC21"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC20"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC22"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC19"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC20"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC22"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC22">Index</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> A.1.1 ADDENDUM: How to use this License for your documents </H3>
+<!--docid::SEC21::-->
+<P>
+
+To use this License in a document you have written, include a copy of
+the License in the document and put the following copyright and
+license notices just after the title page:
+</P><P>
+
+<TABLE><tr><td>&nbsp;</td><td class=smallexample><FONT SIZE=-1><pre>  Copyright (C)  <VAR>year</VAR>  <VAR>your name</VAR>.
+  Permission is granted to copy, distribute and/or modify this document
+  under the terms of the GNU Free Documentation License, Version 1.2
+  or any later version published by the Free Software Foundation;
+  with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.
+  A copy of the license is included in the section entitled ``GNU
+  Free Documentation License''.
+</FONT></pre></td></tr></table></P><P>
+
+If you have Invariant Sections, Front-Cover Texts and Back-Cover Texts,
+replace the "with...Texts." line with this:
+</P><P>
+
+<TABLE><tr><td>&nbsp;</td><td class=smallexample><FONT SIZE=-1><pre>    with the Invariant Sections being <VAR>list their titles</VAR>, with
+    the Front-Cover Texts being <VAR>list</VAR>, and with the Back-Cover Texts
+    being <VAR>list</VAR>.
+</FONT></pre></td></tr></table></P><P>
+
+If you have Invariant Sections without Cover Texts, or some other
+combination of the three, merge those two alternatives to suit the
+situation.
+</P><P>
+
+If your document contains nontrivial examples of program code, we
+recommend releasing these examples in parallel under your choice of
+free software license, such as the GNU General Public License,
+to permit their use in free software.
+</P><P>
+
+<A NAME="Concept Index"></A>
+<HR SIZE="6">
+<A NAME="SEC22"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC21"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC23"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC23"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC_Top"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC23"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC22">Index</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H1> B. Concept Index </H1>
+<!--docid::SEC22::-->
+<table><tr><th valign=top>Jump to: &nbsp; </th><td><A HREF="history.html#cp_A" style="text-decoration:none"><b>A</b></A>
+ &nbsp; 
+<A HREF="history.html#cp_E" style="text-decoration:none"><b>E</b></A>
+ &nbsp; 
+<A HREF="history.html#cp_F" style="text-decoration:none"><b>F</b></A>
+ &nbsp; 
+<A HREF="history.html#cp_H" style="text-decoration:none"><b>H</b></A>
+ &nbsp; 
+</td></tr></table><br><P></P>
+<TABLE border=0>
+<TR><TD></TD><TH ALIGN=LEFT>Index Entry</TH><TH ALIGN=LEFT> Section</TH></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="cp_A"></A>A</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="history.html#IDX23">anchored search</A></TD><TD valign=top><A HREF="history.html#SEC14">2.3.5 Searching the History List</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="cp_E"></A>E</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="history.html#SEC3">event designators</A></TD><TD valign=top><A HREF="history.html#SEC3">1.1.1 Event Designators</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="cp_F"></A>F</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="history.html#IDX48">FDL, GNU Free Documentation License</A></TD><TD valign=top><A HREF="history.html#SEC20">A.1 GNU Free Documentation License</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="cp_H"></A>H</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="history.html#IDX1">history events</A></TD><TD valign=top><A HREF="history.html#SEC3">1.1.1 Event Designators</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="history.html#SEC2">history expansion</A></TD><TD valign=top><A HREF="history.html#SEC2">1.1 History Expansion</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="history.html#SEC14">History Searching</A></TD><TD valign=top><A HREF="history.html#SEC14">2.3.5 Searching the History List</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+</TABLE><P></P><table><tr><th valign=top>Jump to: &nbsp; </th><td><A HREF="history.html#cp_A" style="text-decoration:none"><b>A</b></A>
+ &nbsp; 
+<A HREF="history.html#cp_E" style="text-decoration:none"><b>E</b></A>
+ &nbsp; 
+<A HREF="history.html#cp_F" style="text-decoration:none"><b>F</b></A>
+ &nbsp; 
+<A HREF="history.html#cp_H" style="text-decoration:none"><b>H</b></A>
+ &nbsp; 
+</td></tr></table><br><P>
+
+<A NAME="Function and Variable Index"></A>
+<HR SIZE="6">
+<A NAME="SEC23"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC22"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[ &gt; ]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[ &lt;&lt; ]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC_Top"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[ &gt;&gt; ]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC22">Index</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H1> C. Function and Variable Index </H1>
+<!--docid::SEC23::-->
+<table><tr><th valign=top>Jump to: &nbsp; </th><td><A HREF="history.html#vr_A" style="text-decoration:none"><b>A</b></A>
+ &nbsp; 
+<A HREF="history.html#vr_C" style="text-decoration:none"><b>C</b></A>
+ &nbsp; 
+<A HREF="history.html#vr_F" style="text-decoration:none"><b>F</b></A>
+ &nbsp; 
+<A HREF="history.html#vr_G" style="text-decoration:none"><b>G</b></A>
+ &nbsp; 
+<A HREF="history.html#vr_H" style="text-decoration:none"><b>H</b></A>
+ &nbsp; 
+<A HREF="history.html#vr_N" style="text-decoration:none"><b>N</b></A>
+ &nbsp; 
+<A HREF="history.html#vr_P" style="text-decoration:none"><b>P</b></A>
+ &nbsp; 
+<A HREF="history.html#vr_R" style="text-decoration:none"><b>R</b></A>
+ &nbsp; 
+<A HREF="history.html#vr_S" style="text-decoration:none"><b>S</b></A>
+ &nbsp; 
+<A HREF="history.html#vr_U" style="text-decoration:none"><b>U</b></A>
+ &nbsp; 
+<A HREF="history.html#vr_W" style="text-decoration:none"><b>W</b></A>
+ &nbsp; 
+</td></tr></table><br><P></P>
+<TABLE border=0>
+<TR><TD></TD><TH ALIGN=LEFT>Index Entry</TH><TH ALIGN=LEFT> Section</TH></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="vr_A"></A>A</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="history.html#IDX5"><CODE>add_history</CODE></A></TD><TD valign=top><A HREF="history.html#SEC11">2.3.2 History List Management</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="history.html#IDX6"><CODE>add_history_time</CODE></A></TD><TD valign=top><A HREF="history.html#SEC11">2.3.2 History List Management</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="history.html#IDX30"><CODE>append_history</CODE></A></TD><TD valign=top><A HREF="history.html#SEC15">2.3.6 Managing the History File</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="vr_C"></A>C</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="history.html#IDX10"><CODE>clear_history</CODE></A></TD><TD valign=top><A HREF="history.html#SEC11">2.3.2 History List Management</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="history.html#IDX16"><CODE>current_history</CODE></A></TD><TD valign=top><A HREF="history.html#SEC12">2.3.3 Information About the History List</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="vr_F"></A>F</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="history.html#IDX8"><CODE>free_history_entry</CODE></A></TD><TD valign=top><A HREF="history.html#SEC11">2.3.2 History List Management</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="vr_G"></A>G</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="history.html#IDX33"><CODE>get_history_event</CODE></A></TD><TD valign=top><A HREF="history.html#SEC16">2.3.7 History Expansion</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="vr_H"></A>H</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="history.html#IDX35"><CODE>history_arg_extract</CODE></A></TD><TD valign=top><A HREF="history.html#SEC16">2.3.7 History Expansion</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="history.html#IDX36"><CODE>history_base</CODE></A></TD><TD valign=top><A HREF="history.html#SEC17">2.4 History Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="history.html#IDX42"><CODE>history_comment_char</CODE></A></TD><TD valign=top><A HREF="history.html#SEC17">2.4 History Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="history.html#IDX32"><CODE>history_expand</CODE></A></TD><TD valign=top><A HREF="history.html#SEC16">2.3.7 History Expansion</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="history.html#IDX40"><CODE>history_expansion_char</CODE></A></TD><TD valign=top><A HREF="history.html#SEC17">2.4 History Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="history.html#IDX17"><CODE>history_get</CODE></A></TD><TD valign=top><A HREF="history.html#SEC12">2.3.3 Information About the History List</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="history.html#IDX3"><CODE>history_get_history_state</CODE></A></TD><TD valign=top><A HREF="history.html#SEC10">2.3.1 Initializing History and State Management</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="history.html#IDX18"><CODE>history_get_time</CODE></A></TD><TD valign=top><A HREF="history.html#SEC12">2.3.3 Information About the History List</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="history.html#IDX47"><CODE>history_inhibit_expansion_function</CODE></A></TD><TD valign=top><A HREF="history.html#SEC17">2.4 History Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="history.html#IDX13"><CODE>history_is_stifled</CODE></A></TD><TD valign=top><A HREF="history.html#SEC11">2.3.2 History List Management</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="history.html#IDX37"><CODE>history_length</CODE></A></TD><TD valign=top><A HREF="history.html#SEC17">2.4 History Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="history.html#IDX14"><CODE>history_list</CODE></A></TD><TD valign=top><A HREF="history.html#SEC12">2.3.3 Information About the History List</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="history.html#IDX38"><CODE>history_max_entries</CODE></A></TD><TD valign=top><A HREF="history.html#SEC17">2.4 History Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="history.html#IDX45"><CODE>history_no_expand_chars</CODE></A></TD><TD valign=top><A HREF="history.html#SEC17">2.4 History Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="history.html#IDX46"><CODE>history_quotes_inhibit_expansion</CODE></A></TD><TD valign=top><A HREF="history.html#SEC17">2.4 History Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="history.html#IDX24"><CODE>history_search</CODE></A></TD><TD valign=top><A HREF="history.html#SEC14">2.3.5 Searching the History List</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="history.html#IDX44"><CODE>history_search_delimiter_chars</CODE></A></TD><TD valign=top><A HREF="history.html#SEC17">2.4 History Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="history.html#IDX26"><CODE>history_search_pos</CODE></A></TD><TD valign=top><A HREF="history.html#SEC14">2.3.5 Searching the History List</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="history.html#IDX25"><CODE>history_search_prefix</CODE></A></TD><TD valign=top><A HREF="history.html#SEC14">2.3.5 Searching the History List</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="history.html#IDX4"><CODE>history_set_history_state</CODE></A></TD><TD valign=top><A HREF="history.html#SEC10">2.3.1 Initializing History and State Management</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="history.html#IDX20"><CODE>history_set_pos</CODE></A></TD><TD valign=top><A HREF="history.html#SEC13">2.3.4 Moving Around the History List</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="history.html#IDX41"><CODE>history_subst_char</CODE></A></TD><TD valign=top><A HREF="history.html#SEC17">2.4 History Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="history.html#IDX34"><CODE>history_tokenize</CODE></A></TD><TD valign=top><A HREF="history.html#SEC16">2.3.7 History Expansion</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="history.html#IDX19"><CODE>history_total_bytes</CODE></A></TD><TD valign=top><A HREF="history.html#SEC12">2.3.3 Information About the History List</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="history.html#IDX31"><CODE>history_truncate_file</CODE></A></TD><TD valign=top><A HREF="history.html#SEC15">2.3.6 Managing the History File</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="history.html#IDX43"><CODE>history_word_delimiters</CODE></A></TD><TD valign=top><A HREF="history.html#SEC17">2.4 History Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="history.html#IDX39"><CODE>history_write_timestamps</CODE></A></TD><TD valign=top><A HREF="history.html#SEC17">2.4 History Variables</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="vr_N"></A>N</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="history.html#IDX22"><CODE>next_history</CODE></A></TD><TD valign=top><A HREF="history.html#SEC13">2.3.4 Moving Around the History List</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="vr_P"></A>P</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="history.html#IDX21"><CODE>previous_history</CODE></A></TD><TD valign=top><A HREF="history.html#SEC13">2.3.4 Moving Around the History List</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="vr_R"></A>R</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="history.html#IDX27"><CODE>read_history</CODE></A></TD><TD valign=top><A HREF="history.html#SEC15">2.3.6 Managing the History File</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="history.html#IDX28"><CODE>read_history_range</CODE></A></TD><TD valign=top><A HREF="history.html#SEC15">2.3.6 Managing the History File</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="history.html#IDX7"><CODE>remove_history</CODE></A></TD><TD valign=top><A HREF="history.html#SEC11">2.3.2 History List Management</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="history.html#IDX9"><CODE>replace_history_entry</CODE></A></TD><TD valign=top><A HREF="history.html#SEC11">2.3.2 History List Management</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="vr_S"></A>S</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="history.html#IDX11"><CODE>stifle_history</CODE></A></TD><TD valign=top><A HREF="history.html#SEC11">2.3.2 History List Management</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="vr_U"></A>U</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="history.html#IDX12"><CODE>unstifle_history</CODE></A></TD><TD valign=top><A HREF="history.html#SEC11">2.3.2 History List Management</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="history.html#IDX2"><CODE>using_history</CODE></A></TD><TD valign=top><A HREF="history.html#SEC10">2.3.1 Initializing History and State Management</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="vr_W"></A>W</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="history.html#IDX15"><CODE>where_history</CODE></A></TD><TD valign=top><A HREF="history.html#SEC12">2.3.3 Information About the History List</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="history.html#IDX29"><CODE>write_history</CODE></A></TD><TD valign=top><A HREF="history.html#SEC15">2.3.6 Managing the History File</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+</TABLE><P></P><table><tr><th valign=top>Jump to: &nbsp; </th><td><A HREF="history.html#vr_A" style="text-decoration:none"><b>A</b></A>
+ &nbsp; 
+<A HREF="history.html#vr_C" style="text-decoration:none"><b>C</b></A>
+ &nbsp; 
+<A HREF="history.html#vr_F" style="text-decoration:none"><b>F</b></A>
+ &nbsp; 
+<A HREF="history.html#vr_G" style="text-decoration:none"><b>G</b></A>
+ &nbsp; 
+<A HREF="history.html#vr_H" style="text-decoration:none"><b>H</b></A>
+ &nbsp; 
+<A HREF="history.html#vr_N" style="text-decoration:none"><b>N</b></A>
+ &nbsp; 
+<A HREF="history.html#vr_P" style="text-decoration:none"><b>P</b></A>
+ &nbsp; 
+<A HREF="history.html#vr_R" style="text-decoration:none"><b>R</b></A>
+ &nbsp; 
+<A HREF="history.html#vr_S" style="text-decoration:none"><b>S</b></A>
+ &nbsp; 
+<A HREF="history.html#vr_U" style="text-decoration:none"><b>U</b></A>
+ &nbsp; 
+<A HREF="history.html#vr_W" style="text-decoration:none"><b>W</b></A>
+ &nbsp; 
+</td></tr></table><br><P>
+
+<HR SIZE="6">
+<A NAME="SEC_Contents"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC22">Index</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H1>Table of Contents</H1>
+<UL>
+<A NAME="TOC1" HREF="history.html#SEC1">1. Using History Interactively</A>
+<BR>
+<UL>
+<A NAME="TOC2" HREF="history.html#SEC2">1.1 History Expansion</A>
+<BR>
+<UL>
+<A NAME="TOC3" HREF="history.html#SEC3">1.1.1 Event Designators</A>
+<BR>
+<A NAME="TOC4" HREF="history.html#SEC4">1.1.2 Word Designators</A>
+<BR>
+<A NAME="TOC5" HREF="history.html#SEC5">1.1.3 Modifiers</A>
+<BR>
+</UL>
+</UL>
+<A NAME="TOC6" HREF="history.html#SEC6">2. Programming with GNU History</A>
+<BR>
+<UL>
+<A NAME="TOC7" HREF="history.html#SEC7">2.1 Introduction to History</A>
+<BR>
+<A NAME="TOC8" HREF="history.html#SEC8">2.2 History Storage</A>
+<BR>
+<A NAME="TOC9" HREF="history.html#SEC9">2.3 History Functions</A>
+<BR>
+<UL>
+<A NAME="TOC10" HREF="history.html#SEC10">2.3.1 Initializing History and State Management</A>
+<BR>
+<A NAME="TOC11" HREF="history.html#SEC11">2.3.2 History List Management</A>
+<BR>
+<A NAME="TOC12" HREF="history.html#SEC12">2.3.3 Information About the History List</A>
+<BR>
+<A NAME="TOC13" HREF="history.html#SEC13">2.3.4 Moving Around the History List</A>
+<BR>
+<A NAME="TOC14" HREF="history.html#SEC14">2.3.5 Searching the History List</A>
+<BR>
+<A NAME="TOC15" HREF="history.html#SEC15">2.3.6 Managing the History File</A>
+<BR>
+<A NAME="TOC16" HREF="history.html#SEC16">2.3.7 History Expansion</A>
+<BR>
+</UL>
+<A NAME="TOC17" HREF="history.html#SEC17">2.4 History Variables</A>
+<BR>
+<A NAME="TOC18" HREF="history.html#SEC18">2.5 History Programming Example</A>
+<BR>
+</UL>
+<A NAME="TOC19" HREF="history.html#SEC19">A. Copying This Manual</A>
+<BR>
+<UL>
+<A NAME="TOC20" HREF="history.html#SEC20">A.1 GNU Free Documentation License</A>
+<BR>
+<UL>
+<A NAME="TOC21" HREF="history.html#SEC21">A.1.1 ADDENDUM: How to use this License for your documents</A>
+<BR>
+</UL>
+</UL>
+<A NAME="TOC22" HREF="history.html#SEC22">B. Concept Index</A>
+<BR>
+<A NAME="TOC23" HREF="history.html#SEC23">C. Function and Variable Index</A>
+<BR>
+</UL>
+<HR SIZE=1>
+<A NAME="SEC_OVERVIEW"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC22">Index</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H1>Short Table of Contents</H1>
+<BLOCKQUOTE>
+<A NAME="TOC1" HREF="history.html#SEC1">1. Using History Interactively</A>
+<BR>
+<A NAME="TOC6" HREF="history.html#SEC6">2. Programming with GNU History</A>
+<BR>
+<A NAME="TOC19" HREF="history.html#SEC19">A. Copying This Manual</A>
+<BR>
+<A NAME="TOC22" HREF="history.html#SEC22">B. Concept Index</A>
+<BR>
+<A NAME="TOC23" HREF="history.html#SEC23">C. Function and Variable Index</A>
+<BR>
+
+</BLOCKQUOTE>
+<HR SIZE=1>
+<A NAME="SEC_About"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC22">Index</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H1>About this document</H1>
+This document was generated by <I>Chet Ramey</I> on <I>July, 6  2006</I>
+using <A HREF="http://www.mathematik.uni-kl.de/~obachman/Texi2html
+"><I>texi2html</I></A>
+<P></P>  
+The buttons in the navigation panels have the following meaning:
+<P></P>
+<table border = "1">
+<TR>
+<TH> Button </TH>
+<TH> Name </TH>
+<TH> Go to </TH>
+<TH> From 1.2.3 go to</TH>
+</TR>
+<TR>
+<TD ALIGN="CENTER">
+ [ &lt; ] </TD>
+<TD ALIGN="CENTER">
+Back
+</TD>
+<TD>
+previous section in reading order
+</TD>
+<TD>
+1.2.2
+</TD>
+</TR>
+<TR>
+<TD ALIGN="CENTER">
+ [ &gt; ] </TD>
+<TD ALIGN="CENTER">
+Forward
+</TD>
+<TD>
+next section in reading order
+</TD>
+<TD>
+1.2.4
+</TD>
+</TR>
+<TR>
+<TD ALIGN="CENTER">
+ [ &lt;&lt; ] </TD>
+<TD ALIGN="CENTER">
+FastBack
+</TD>
+<TD>
+previous or up-and-previous section 
+</TD>
+<TD>
+1.1
+</TD>
+</TR>
+<TR>
+<TD ALIGN="CENTER">
+ [ Up ] </TD>
+<TD ALIGN="CENTER">
+Up
+</TD>
+<TD>
+up section
+</TD>
+<TD>
+1.2
+</TD>
+</TR>
+<TR>
+<TD ALIGN="CENTER">
+ [ &gt;&gt; ] </TD>
+<TD ALIGN="CENTER">
+FastForward
+</TD>
+<TD>
+next or up-and-next section
+</TD>
+<TD>
+1.3
+</TD>
+</TR>
+<TR>
+<TD ALIGN="CENTER">
+ [Top] </TD>
+<TD ALIGN="CENTER">
+Top
+</TD>
+<TD>
+cover (top) of document
+</TD>
+<TD>
+ &nbsp; 
+</TD>
+</TR>
+<TR>
+<TD ALIGN="CENTER">
+ [Contents] </TD>
+<TD ALIGN="CENTER">
+Contents
+</TD>
+<TD>
+table of contents
+</TD>
+<TD>
+ &nbsp; 
+</TD>
+</TR>
+<TR>
+<TD ALIGN="CENTER">
+ [Index] </TD>
+<TD ALIGN="CENTER">
+Index
+</TD>
+<TD>
+concept index
+</TD>
+<TD>
+ &nbsp; 
+</TD>
+</TR>
+<TR>
+<TD ALIGN="CENTER">
+ [ ? ] </TD>
+<TD ALIGN="CENTER">
+About
+</TD>
+<TD>
+this page
+</TD>
+<TD>
+ &nbsp; 
+</TD>
+</TR>
+</TABLE>
+<P></P>
+where the <STRONG> Example </STRONG> assumes that the current position 
+is at <STRONG> Subsubsection One-Two-Three </STRONG> of a document of 
+the following structure:
+<UL>
+<LI> 1. Section One  </LI>
+<UL>
+<LI>1.1 Subsection One-One</LI>
+<UL>
+<LI> ... </LI>
+</UL>
+<LI>1.2 Subsection One-Two</LI>
+<UL>
+<LI>1.2.1 Subsubsection One-Two-One
+</LI><LI>1.2.2 Subsubsection One-Two-Two
+</LI><LI>1.2.3 Subsubsection One-Two-Three &nbsp; &nbsp; <STRONG>
+&lt;== Current Position </STRONG>
+</LI><LI>1.2.4 Subsubsection One-Two-Four
+</LI></UL>
+<LI>1.3 Subsection One-Three</LI>
+<UL>
+<LI> ... </LI>
+</UL>
+<LI>1.4 Subsection One-Four</LI>
+</UL>
+</UL>
+
+<HR SIZE=1>
+<BR>  
+<FONT SIZE="-1">
+This document was generated
+by <I>Chet Ramey</I> on <I>July, 6  2006</I>
+using <A HREF="http://www.mathematik.uni-kl.de/~obachman/Texi2html
+"><I>texi2html</I></A>
+
+</BODY>
+</HTML>
diff --git a/doc/history.info b/doc/history.info
new file mode 100644 (file)
index 0000000..50c2598
--- /dev/null
@@ -0,0 +1,1352 @@
+This is history.info, produced by makeinfo version 4.7 from
+/Users/chet/src/bash/readline-src/doc/history.texi.
+
+   This document describes the GNU History library (version 5.2, 26
+April 2006), a programming tool that provides a consistent user
+interface for recalling lines of previously typed input.
+
+   Copyright (C) 1988-2006 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.
+
+     Permission is granted to copy, distribute and/or modify this
+     document under the terms of the GNU Free Documentation License,
+     Version 1.2 or any later version published by the Free Software
+     Foundation; with no Invariant Sections, with the Front-Cover texts
+     being "A GNU Manual," and with the Back-Cover Texts as in (a)
+     below.  A copy of the license is included in the section entitled
+     "GNU Free Documentation License."
+
+     (a) The FSF's Back-Cover Text is: "You have freedom to copy and
+     modify this GNU Manual, like GNU software.  Copies published by
+     the Free Software Foundation raise funds for GNU development."
+
+INFO-DIR-SECTION Libraries
+START-INFO-DIR-ENTRY
+* History: (history).       The GNU history library API.
+END-INFO-DIR-ENTRY
+
+\1f
+File: history.info,  Node: Top,  Next: Using History Interactively,  Up: (dir)
+
+GNU History Library
+*******************
+
+This document describes the GNU History library, a programming tool that
+provides a consistent user interface for recalling lines of previously
+typed input.
+
+* Menu:
+
+* Using History Interactively::          GNU History User's Manual.
+* Programming with GNU History::  GNU History Programmer's Manual.
+* Copying This Manual::                  Copying This Manual.
+* Concept Index::                Index of concepts described in this manual.
+* Function and Variable Index::          Index of externally visible functions
+                                 and variables.
+
+\1f
+File: history.info,  Node: Using History Interactively,  Next: Programming with GNU History,  Prev: Top,  Up: Top
+
+1 Using History Interactively
+*****************************
+
+This chapter describes how to use the GNU History Library interactively,
+from a user's standpoint.  It should be considered a user's guide.  For
+information on using the GNU History Library in your own programs,
+*note Programming with GNU History::.
+
+* Menu:
+
+* History Interaction::                What it feels like using History as a user.
+
+\1f
+File: history.info,  Node: History Interaction,  Up: Using History Interactively
+
+1.1 History Expansion
+=====================
+
+The History library provides a history expansion feature that is similar
+to the history expansion provided by `csh'.  This section describes the
+syntax used to manipulate the history information.
+
+   History expansions introduce words from the history list into the
+input stream, making it easy to repeat commands, insert the arguments
+to a previous command into the current input line, or fix errors in
+previous commands quickly.
+
+   History expansion takes place in two parts.  The first is to
+determine which line from the history list should be used during
+substitution.  The second is to select portions of that line for
+inclusion into the current one.  The line selected from the history is
+called the "event", and the portions of that line that are acted upon
+are called "words".  Various "modifiers" are available to manipulate
+the selected words.  The line is broken into words in the same fashion
+that Bash does, so that several words surrounded by quotes are
+considered one word.  History expansions are introduced by the
+appearance of the history expansion character, which is `!' by default.
+
+* Menu:
+
+* Event Designators::  How to specify which history line to use.
+* Word Designators::   Specifying which words are of interest.
+* Modifiers::          Modifying the results of substitution.
+
+\1f
+File: history.info,  Node: Event Designators,  Next: Word Designators,  Up: History Interaction
+
+1.1.1 Event Designators
+-----------------------
+
+An event designator is a reference to a command line entry in the
+history list.  
+
+`!'
+     Start a history substitution, except when followed by a space, tab,
+     the end of the line, or `='.
+
+`!N'
+     Refer to command line N.
+
+`!-N'
+     Refer to the command N lines back.
+
+`!!'
+     Refer to the previous command.  This is a synonym for `!-1'.
+
+`!STRING'
+     Refer to the most recent command starting with STRING.
+
+`!?STRING[?]'
+     Refer to the most recent command containing STRING.  The trailing
+     `?' may be omitted if the STRING is followed immediately by a
+     newline.
+
+`^STRING1^STRING2^'
+     Quick Substitution.  Repeat the last command, replacing STRING1
+     with STRING2.  Equivalent to `!!:s/STRING1/STRING2/'.
+
+`!#'
+     The entire command line typed so far.
+
+
+\1f
+File: history.info,  Node: Word Designators,  Next: Modifiers,  Prev: Event Designators,  Up: History Interaction
+
+1.1.2 Word Designators
+----------------------
+
+Word designators are used to select desired words from the event.  A
+`:' separates the event specification from the word designator.  It may
+be omitted if the word designator begins with a `^', `$', `*', `-', or
+`%'.  Words are numbered from the beginning of the line, with the first
+word being denoted by 0 (zero).  Words are inserted into the current
+line separated by single spaces.
+
+   For example,
+
+`!!'
+     designates the preceding command.  When you type this, the
+     preceding command is repeated in toto.
+
+`!!:$'
+     designates the last argument of the preceding command.  This may be
+     shortened to `!$'.
+
+`!fi:2'
+     designates the second argument of the most recent command starting
+     with the letters `fi'.
+
+   Here are the word designators:
+
+`0 (zero)'
+     The `0'th word.  For many applications, this is the command word.
+
+`N'
+     The Nth word.
+
+`^'
+     The first argument; that is, word 1.
+
+`$'
+     The last argument.
+
+`%'
+     The word matched by the most recent `?STRING?' search.
+
+`X-Y'
+     A range of words; `-Y' abbreviates `0-Y'.
+
+`*'
+     All of the words, except the `0'th.  This is a synonym for `1-$'.
+     It is not an error to use `*' if there is just one word in the
+     event; the empty string is returned in that case.
+
+`X*'
+     Abbreviates `X-$'
+
+`X-'
+     Abbreviates `X-$' like `X*', but omits the last word.
+
+
+   If a word designator is supplied without an event specification, the
+previous command is used as the event.
+
+\1f
+File: history.info,  Node: Modifiers,  Prev: Word Designators,  Up: History Interaction
+
+1.1.3 Modifiers
+---------------
+
+After the optional word designator, you can add a sequence of one or
+more of the following modifiers, each preceded by a `:'.
+
+`h'
+     Remove a trailing pathname component, leaving only the head.
+
+`t'
+     Remove all leading  pathname  components, leaving the tail.
+
+`r'
+     Remove a trailing suffix of the form `.SUFFIX', leaving the
+     basename.
+
+`e'
+     Remove all but the trailing suffix.
+
+`p'
+     Print the new command but do not execute it.
+
+`s/OLD/NEW/'
+     Substitute NEW for the first occurrence of OLD in the event line.
+     Any delimiter may be used in place of `/'.  The delimiter may be
+     quoted in OLD and NEW with a single backslash.  If `&' appears in
+     NEW, it is replaced by OLD.  A single backslash will quote the
+     `&'.  The final delimiter is optional if it is the last character
+     on the input line.
+
+`&'
+     Repeat the previous substitution.
+
+`g'
+`a'
+     Cause changes to be applied over the entire event line.  Used in
+     conjunction with `s', as in `gs/OLD/NEW/', or with `&'.
+
+`G'
+     Apply the following `s' modifier once to each word in the event.
+
+
+\1f
+File: history.info,  Node: Programming with GNU History,  Next: Copying This Manual,  Prev: Using History Interactively,  Up: Top
+
+2 Programming with GNU History
+******************************
+
+This chapter describes how to interface programs that you write with
+the GNU History Library.  It should be considered a technical guide.
+For information on the interactive use of GNU History, *note Using
+History Interactively::.
+
+* Menu:
+
+* Introduction to History::    What is the GNU History library for?
+* History Storage::            How information is stored.
+* History Functions::          Functions that you can use.
+* History Variables::          Variables that control behaviour.
+* History Programming Example::        Example of using the GNU History Library.
+
+\1f
+File: history.info,  Node: Introduction to History,  Next: History Storage,  Up: Programming with GNU History
+
+2.1 Introduction to History
+===========================
+
+Many programs read input from the user a line at a time.  The GNU
+History library is able to keep track of those lines, associate
+arbitrary data with each line, and utilize information from previous
+lines in composing new ones.
+
+   The programmer using the History library has available functions for
+remembering lines on a history list, associating arbitrary data with a
+line, removing lines from the list, searching through the list for a
+line containing an arbitrary text string, and referencing any line in
+the list directly.  In addition, a history "expansion" function is
+available which provides for a consistent user interface across
+different programs.
+
+   The user using programs written with the History library has the
+benefit of a consistent user interface with a set of well-known
+commands for manipulating the text of previous lines and using that text
+in new commands.  The basic history manipulation commands are similar to
+the history substitution provided by `csh'.
+
+   If the programmer desires, he can use the Readline library, which
+includes some history manipulation by default, and has the added
+advantage of command line editing.
+
+   Before declaring any functions using any functionality the History
+library provides in other code, an application writer should include
+the file `<readline/history.h>' in any file that uses the History
+library's features.  It supplies extern declarations for all of the
+library's public functions and variables, and declares all of the
+public data structures.
+
+\1f
+File: history.info,  Node: History Storage,  Next: History Functions,  Prev: Introduction to History,  Up: Programming with GNU History
+
+2.2 History Storage
+===================
+
+The history list is an array of history entries.  A history entry is
+declared as follows:
+
+     typedef void *histdata_t;
+
+     typedef struct _hist_entry {
+       char *line;
+       char *timestamp;
+       histdata_t data;
+     } HIST_ENTRY;
+
+   The history list itself might therefore be declared as
+
+     HIST_ENTRY **the_history_list;
+
+   The state of the History library is encapsulated into a single
+structure:
+
+     /*
+      * A structure used to pass around the current state of the history.
+      */
+     typedef struct _hist_state {
+       HIST_ENTRY **entries; /* Pointer to the entries themselves. */
+       int offset;           /* The location pointer within this array. */
+       int length;           /* Number of elements within this array. */
+       int size;             /* Number of slots allocated to this array. */
+       int flags;
+     } HISTORY_STATE;
+
+   If the flags member includes `HS_STIFLED', the history has been
+stifled.
+
+\1f
+File: history.info,  Node: History Functions,  Next: History Variables,  Prev: History Storage,  Up: Programming with GNU History
+
+2.3 History Functions
+=====================
+
+This section describes the calling sequence for the various functions
+exported by the GNU History library.
+
+* Menu:
+
+* Initializing History and State Management::  Functions to call when you
+                                               want to use history in a
+                                               program.
+* History List Management::            Functions used to manage the list
+                                       of history entries.
+* Information About the History List:: Functions returning information about
+                                       the history list.
+* Moving Around the History List::     Functions used to change the position
+                                       in the history list.
+* Searching the History List::         Functions to search the history list
+                                       for entries containing a string.
+* Managing the History File::          Functions that read and write a file
+                                       containing the history list.
+* History Expansion::                  Functions to perform csh-like history
+                                       expansion.
+
+\1f
+File: history.info,  Node: Initializing History and State Management,  Next: History List Management,  Up: History Functions
+
+2.3.1 Initializing History and State Management
+-----------------------------------------------
+
+This section describes functions used to initialize and manage the
+state of the History library when you want to use the history functions
+in your program.
+
+ -- Function: void using_history (void)
+     Begin a session in which the history functions might be used.  This
+     initializes the interactive variables.
+
+ -- Function: HISTORY_STATE * history_get_history_state (void)
+     Return a structure describing the current state of the input
+     history.
+
+ -- Function: void history_set_history_state (HISTORY_STATE *state)
+     Set the state of the history list according to STATE.
+
+\1f
+File: history.info,  Node: History List Management,  Next: Information About the History List,  Prev: Initializing History and State Management,  Up: History Functions
+
+2.3.2 History List Management
+-----------------------------
+
+These functions manage individual entries on the history list, or set
+parameters managing the list itself.
+
+ -- Function: void add_history (const char *string)
+     Place STRING at the end of the history list.  The associated data
+     field (if any) is set to `NULL'.
+
+ -- Function: void add_history_time (const char *string)
+     Change the time stamp associated with the most recent history
+     entry to STRING.
+
+ -- Function: HIST_ENTRY * remove_history (int which)
+     Remove history entry at offset WHICH from the history.  The
+     removed element is returned so you can free the line, data, and
+     containing structure.
+
+ -- Function: histdata_t free_history_entry (HIST_ENTRY *histent)
+     Free the history entry HISTENT and any history library private
+     data associated with it.  Returns the application-specific data so
+     the caller can dispose of it.
+
+ -- Function: HIST_ENTRY * replace_history_entry (int which, const char
+          *line, histdata_t data)
+     Make the history entry at offset WHICH have LINE and DATA.  This
+     returns the old entry so the caller can dispose of any
+     application-specific data.  In the case of an invalid WHICH, a
+     `NULL' pointer is returned.
+
+ -- Function: void clear_history (void)
+     Clear the history list by deleting all the entries.
+
+ -- Function: void stifle_history (int max)
+     Stifle the history list, remembering only the last MAX entries.
+
+ -- Function: int unstifle_history (void)
+     Stop stifling the history.  This returns the previously-set
+     maximum number of history entries (as set by `stifle_history()').
+     The value is positive if the history was stifled, negative if it
+     wasn't.
+
+ -- Function: int history_is_stifled (void)
+     Returns non-zero if the history is stifled, zero if it is not.
+
+\1f
+File: history.info,  Node: Information About the History List,  Next: Moving Around the History List,  Prev: History List Management,  Up: History Functions
+
+2.3.3 Information About the History List
+----------------------------------------
+
+These functions return information about the entire history list or
+individual list entries.
+
+ -- Function: HIST_ENTRY ** history_list (void)
+     Return a `NULL' terminated array of `HIST_ENTRY *' which is the
+     current input history.  Element 0 of this list is the beginning of
+     time.  If there is no history, return `NULL'.
+
+ -- Function: int where_history (void)
+     Returns the offset of the current history element.
+
+ -- Function: HIST_ENTRY * current_history (void)
+     Return the history entry at the current position, as determined by
+     `where_history()'.  If there is no entry there, return a `NULL'
+     pointer.
+
+ -- Function: HIST_ENTRY * history_get (int offset)
+     Return the history entry at position OFFSET, starting from
+     `history_base' (*note History Variables::).  If there is no entry
+     there, or if OFFSET is greater than the history length, return a
+     `NULL' pointer.
+
+ -- Function: time_t history_get_time (HIST_ENTRY *entry)
+     Return the time stamp associated with the history entry ENTRY.
+
+ -- Function: int history_total_bytes (void)
+     Return the number of bytes that the primary history entries are
+     using.  This function returns the sum of the lengths of all the
+     lines in the history.
+
+\1f
+File: history.info,  Node: Moving Around the History List,  Next: Searching the History List,  Prev: Information About the History List,  Up: History Functions
+
+2.3.4 Moving Around the History List
+------------------------------------
+
+These functions allow the current index into the history list to be set
+or changed.
+
+ -- Function: int history_set_pos (int pos)
+     Set the current history offset to POS, an absolute index into the
+     list.  Returns 1 on success, 0 if POS is less than zero or greater
+     than the number of history entries.
+
+ -- Function: HIST_ENTRY * previous_history (void)
+     Back up the current history offset to the previous history entry,
+     and return a pointer to that entry.  If there is no previous
+     entry, return a `NULL' pointer.
+
+ -- Function: HIST_ENTRY * next_history (void)
+     Move the current history offset forward to the next history entry,
+     and return the a pointer to that entry.  If there is no next
+     entry, return a `NULL' pointer.
+
+\1f
+File: history.info,  Node: Searching the History List,  Next: Managing the History File,  Prev: Moving Around the History List,  Up: History Functions
+
+2.3.5 Searching the History List
+--------------------------------
+
+These functions allow searching of the history list for entries
+containing a specific string.  Searching may be performed both forward
+and backward from the current history position.  The search may be
+"anchored", meaning that the string must match at the beginning of the
+history entry.  
+
+ -- Function: int history_search (const char *string, int direction)
+     Search the history for STRING, starting at the current history
+     offset.  If DIRECTION is less than 0, then the search is through
+     previous entries, otherwise through subsequent entries.  If STRING
+     is found, then the current history index is set to that history
+     entry, and the value returned is the offset in the line of the
+     entry where STRING was found.  Otherwise, nothing is changed, and
+     a -1 is returned.
+
+ -- Function: int history_search_prefix (const char *string, int
+          direction)
+     Search the history for STRING, starting at the current history
+     offset.  The search is anchored: matching lines must begin with
+     STRING.  If DIRECTION is less than 0, then the search is through
+     previous entries, otherwise through subsequent entries.  If STRING
+     is found, then the current history index is set to that entry, and
+     the return value is 0.  Otherwise, nothing is changed, and a -1 is
+     returned.
+
+ -- Function: int history_search_pos (const char *string, int
+          direction, int pos)
+     Search for STRING in the history list, starting at POS, an
+     absolute index into the list.  If DIRECTION is negative, the search
+     proceeds backward from POS, otherwise forward.  Returns the
+     absolute index of the history element where STRING was found, or
+     -1 otherwise.
+
+\1f
+File: history.info,  Node: Managing the History File,  Next: History Expansion,  Prev: Searching the History List,  Up: History Functions
+
+2.3.6 Managing the History File
+-------------------------------
+
+The History library can read the history from and write it to a file.
+This section documents the functions for managing a history file.
+
+ -- Function: int read_history (const char *filename)
+     Add the contents of FILENAME to the history list, a line at a time.
+     If FILENAME is `NULL', then read from `~/.history'.  Returns 0 if
+     successful, or `errno' if not.
+
+ -- Function: int read_history_range (const char *filename, int from,
+          int to)
+     Read a range of lines from FILENAME, adding them to the history
+     list.  Start reading at line FROM and end at TO.  If FROM is zero,
+     start at the beginning.  If TO is less than FROM, then read until
+     the end of the file.  If FILENAME is `NULL', then read from
+     `~/.history'.  Returns 0 if successful, or `errno' if not.
+
+ -- Function: int write_history (const char *filename)
+     Write the current history to FILENAME, overwriting FILENAME if
+     necessary.  If FILENAME is `NULL', then write the history list to
+     `~/.history'.  Returns 0 on success, or `errno' on a read or write
+     error.
+
+ -- Function: int append_history (int nelements, const char *filename)
+     Append the last NELEMENTS of the history list to FILENAME.  If
+     FILENAME is `NULL', then append to `~/.history'.  Returns 0 on
+     success, or `errno' on a read or write error.
+
+ -- Function: int history_truncate_file (const char *filename, int
+          nlines)
+     Truncate the history file FILENAME, leaving only the last NLINES
+     lines.  If FILENAME is `NULL', then `~/.history' is truncated.
+     Returns 0 on success, or `errno' on failure.
+
+\1f
+File: history.info,  Node: History Expansion,  Prev: Managing the History File,  Up: History Functions
+
+2.3.7 History Expansion
+-----------------------
+
+These functions implement history expansion.
+
+ -- Function: int history_expand (char *string, char **output)
+     Expand STRING, placing the result into OUTPUT, a pointer to a
+     string (*note History Interaction::).  Returns:
+    `0'
+          If no expansions took place (or, if the only change in the
+          text was the removal of escape characters preceding the
+          history expansion character);
+
+    `1'
+          if expansions did take place;
+
+    `-1'
+          if there was an error in expansion;
+
+    `2'
+          if the returned line should be displayed, but not executed,
+          as with the `:p' modifier (*note Modifiers::).
+
+     If an error ocurred in expansion, then OUTPUT contains a
+     descriptive error message.
+
+ -- Function: char * get_history_event (const char *string, int
+          *cindex, int qchar)
+     Returns the text of the history event beginning at STRING +
+     *CINDEX.  *CINDEX is modified to point to after the event
+     specifier.  At function entry, CINDEX points to the index into
+     STRING where the history event specification begins.  QCHAR is a
+     character that is allowed to end the event specification in
+     addition to the "normal" terminating characters.
+
+ -- Function: char ** history_tokenize (const char *string)
+     Return an array of tokens parsed out of STRING, much as the shell
+     might.  The tokens are split on the characters in the
+     HISTORY_WORD_DELIMITERS variable, and shell quoting conventions
+     are obeyed.
+
+ -- Function: char * history_arg_extract (int first, int last, const
+          char *string)
+     Extract a string segment consisting of the FIRST through LAST
+     arguments present in STRING.  Arguments are split using
+     `history_tokenize'.
+
+\1f
+File: history.info,  Node: History Variables,  Next: History Programming Example,  Prev: History Functions,  Up: Programming with GNU History
+
+2.4 History Variables
+=====================
+
+This section describes the externally-visible variables exported by the
+GNU History Library.
+
+ -- Variable: int history_base
+     The logical offset of the first entry in the history list.
+
+ -- Variable: int history_length
+     The number of entries currently stored in the history list.
+
+ -- Variable: int history_max_entries
+     The maximum number of history entries.  This must be changed using
+     `stifle_history()'.
+
+ -- Variable: int history_write_timestamps
+     If non-zero, timestamps are written to the history file, so they
+     can be preserved between sessions.  The default value is 0,
+     meaning that timestamps are not saved.
+
+ -- Variable: char history_expansion_char
+     The character that introduces a history event.  The default is `!'.
+     Setting this to 0 inhibits history expansion.
+
+ -- Variable: char history_subst_char
+     The character that invokes word substitution if found at the start
+     of a line.  The default is `^'.
+
+ -- Variable: char history_comment_char
+     During tokenization, if this character is seen as the first
+     character of a word, then it and all subsequent characters up to a
+     newline are ignored, suppressing history expansion for the
+     remainder of the line.  This is disabled by default.
+
+ -- Variable: char * history_word_delimiters
+     The characters that separate tokens for `history_tokenize()'.  The
+     default value is `" \t\n()<>;&|"'.
+
+ -- Variable: char * history_search_delimiter_chars
+     The list of additional characters which can delimit a history
+     search string, in addition to space, TAB, `:' and `?' in the case
+     of a substring search.  The default is empty.
+
+ -- Variable: char * history_no_expand_chars
+     The list of characters which inhibit history expansion if found
+     immediately following HISTORY_EXPANSION_CHAR.  The default is
+     space, tab, newline, carriage return, and `='.
+
+ -- Variable: int history_quotes_inhibit_expansion
+     If non-zero, single-quoted words are not scanned for the history
+     expansion character.  The default value is 0.
+
+ -- Variable: rl_linebuf_func_t * history_inhibit_expansion_function
+     This should be set to the address of a function that takes two
+     arguments: a `char *' (STRING) and an `int' index into that string
+     (I).  It should return a non-zero value if the history expansion
+     starting at STRING[I] should not be performed; zero if the
+     expansion should be done.  It is intended for use by applications
+     like Bash that use the history expansion character for additional
+     purposes.  By default, this variable is set to `NULL'.
+
+\1f
+File: history.info,  Node: History Programming Example,  Prev: History Variables,  Up: Programming with GNU History
+
+2.5 History Programming Example
+===============================
+
+The following program demonstrates simple use of the GNU History
+Library.
+
+     #include <stdio.h>
+     #include <readline/history.h>
+
+     main (argc, argv)
+          int argc;
+          char **argv;
+     {
+       char line[1024], *t;
+       int len, done = 0;
+
+       line[0] = 0;
+
+       using_history ();
+       while (!done)
+         {
+           printf ("history$ ");
+           fflush (stdout);
+           t = fgets (line, sizeof (line) - 1, stdin);
+           if (t && *t)
+             {
+               len = strlen (t);
+               if (t[len - 1] == '\n')
+                 t[len - 1] = '\0';
+             }
+
+           if (!t)
+             strcpy (line, "quit");
+
+           if (line[0])
+             {
+               char *expansion;
+               int result;
+
+               result = history_expand (line, &expansion);
+               if (result)
+                 fprintf (stderr, "%s\n", expansion);
+
+               if (result < 0 || result == 2)
+                 {
+                   free (expansion);
+                   continue;
+                 }
+
+               add_history (expansion);
+               strncpy (line, expansion, sizeof (line) - 1);
+               free (expansion);
+             }
+
+           if (strcmp (line, "quit") == 0)
+             done = 1;
+           else if (strcmp (line, "save") == 0)
+             write_history ("history_file");
+           else if (strcmp (line, "read") == 0)
+             read_history ("history_file");
+           else if (strcmp (line, "list") == 0)
+             {
+               register HIST_ENTRY **the_list;
+               register int i;
+
+               the_list = history_list ();
+               if (the_list)
+                 for (i = 0; the_list[i]; i++)
+                   printf ("%d: %s\n", i + history_base, the_list[i]->line);
+             }
+           else if (strncmp (line, "delete", 6) == 0)
+             {
+               int which;
+               if ((sscanf (line + 6, "%d", &which)) == 1)
+                 {
+                   HIST_ENTRY *entry = remove_history (which);
+                   if (!entry)
+                     fprintf (stderr, "No such entry %d\n", which);
+                   else
+                     {
+                       free (entry->line);
+                       free (entry);
+                     }
+                 }
+               else
+                 {
+                   fprintf (stderr, "non-numeric arg given to `delete'\n");
+                 }
+             }
+         }
+     }
+
+\1f
+File: history.info,  Node: Copying This Manual,  Next: Concept Index,  Prev: Programming with GNU History,  Up: Top
+
+Appendix A Copying This Manual
+******************************
+
+* Menu:
+
+* GNU Free Documentation License::     License for copying this manual.
+
+\1f
+File: history.info,  Node: GNU Free Documentation License,  Up: Copying This Manual
+
+A.1 GNU Free Documentation License
+==================================
+
+                      Version 1.2, November 2002
+
+     Copyright (C) 2000,2001,2002 Free Software Foundation, Inc.
+     59 Temple Place, Suite 330, Boston, MA  02111-1307, USA
+
+     Everyone is permitted to copy and distribute verbatim copies
+     of this license document, but changing it is not allowed.
+
+  0. PREAMBLE
+
+     The purpose of this License is to make a manual, textbook, or other
+     functional and useful document "free" in the sense of freedom: to
+     assure everyone the effective freedom to copy and redistribute it,
+     with or without modifying it, either commercially or
+     noncommercially.  Secondarily, this License preserves for the
+     author and publisher a way to get credit for their work, while not
+     being considered responsible for modifications made by others.
+
+     This License is a kind of "copyleft", which means that derivative
+     works of the document must themselves be free in the same sense.
+     It complements the GNU General Public License, which is a copyleft
+     license designed for free software.
+
+     We have designed this License in order to use it for manuals for
+     free software, because free software needs free documentation: a
+     free program should come with manuals providing the same freedoms
+     that the software does.  But this License is not limited to
+     software manuals; it can be used for any textual work, regardless
+     of subject matter or whether it is published as a printed book.
+     We recommend this License principally for works whose purpose is
+     instruction or reference.
+
+  1. APPLICABILITY AND DEFINITIONS
+
+     This License applies to any manual or other work, in any medium,
+     that contains a notice placed by the copyright holder saying it
+     can be distributed under the terms of this License.  Such a notice
+     grants a world-wide, royalty-free license, unlimited in duration,
+     to use that work under the conditions stated herein.  The
+     "Document", below, refers to any such manual or work.  Any member
+     of the public is a licensee, and is addressed as "you".  You
+     accept the license if you copy, modify or distribute the work in a
+     way requiring permission under copyright law.
+
+     A "Modified Version" of the Document means any work containing the
+     Document or a portion of it, either copied verbatim, or with
+     modifications and/or translated into another language.
+
+     A "Secondary Section" is a named appendix or a front-matter section
+     of the Document that deals exclusively with the relationship of the
+     publishers or authors of the Document to the Document's overall
+     subject (or to related matters) and contains nothing that could
+     fall directly within that overall subject.  (Thus, if the Document
+     is in part a textbook of mathematics, a Secondary Section may not
+     explain any mathematics.)  The relationship could be a matter of
+     historical connection with the subject or with related matters, or
+     of legal, commercial, philosophical, ethical or political position
+     regarding them.
+
+     The "Invariant Sections" are certain Secondary Sections whose
+     titles are designated, as being those of Invariant Sections, in
+     the notice that says that the Document is released under this
+     License.  If a section does not fit the above definition of
+     Secondary then it is not allowed to be designated as Invariant.
+     The Document may contain zero Invariant Sections.  If the Document
+     does not identify any Invariant Sections then there are none.
+
+     The "Cover Texts" are certain short passages of text that are
+     listed, as Front-Cover Texts or Back-Cover Texts, in the notice
+     that says that the Document is released under this License.  A
+     Front-Cover Text may be at most 5 words, and a Back-Cover Text may
+     be at most 25 words.
+
+     A "Transparent" copy of the Document means a machine-readable copy,
+     represented in a format whose specification is available to the
+     general public, that is suitable for revising the document
+     straightforwardly with generic text editors or (for images
+     composed of pixels) generic paint programs or (for drawings) some
+     widely available drawing editor, and that is suitable for input to
+     text formatters or for automatic translation to a variety of
+     formats suitable for input to text formatters.  A copy made in an
+     otherwise Transparent file format whose markup, or absence of
+     markup, has been arranged to thwart or discourage subsequent
+     modification by readers is not Transparent.  An image format is
+     not Transparent if used for any substantial amount of text.  A
+     copy that is not "Transparent" is called "Opaque".
+
+     Examples of suitable formats for Transparent copies include plain
+     ASCII without markup, Texinfo input format, LaTeX input format,
+     SGML or XML using a publicly available DTD, and
+     standard-conforming simple HTML, PostScript or PDF designed for
+     human modification.  Examples of transparent image formats include
+     PNG, XCF and JPG.  Opaque formats include proprietary formats that
+     can be read and edited only by proprietary word processors, SGML or
+     XML for which the DTD and/or processing tools are not generally
+     available, and the machine-generated HTML, PostScript or PDF
+     produced by some word processors for output purposes only.
+
+     The "Title Page" means, for a printed book, the title page itself,
+     plus such following pages as are needed to hold, legibly, the
+     material this License requires to appear in the title page.  For
+     works in formats which do not have any title page as such, "Title
+     Page" means the text near the most prominent appearance of the
+     work's title, preceding the beginning of the body of the text.
+
+     A section "Entitled XYZ" means a named subunit of the Document
+     whose title either is precisely XYZ or contains XYZ in parentheses
+     following text that translates XYZ in another language.  (Here XYZ
+     stands for a specific section name mentioned below, such as
+     "Acknowledgements", "Dedications", "Endorsements", or "History".)
+     To "Preserve the Title" of such a section when you modify the
+     Document means that it remains a section "Entitled XYZ" according
+     to this definition.
+
+     The Document may include Warranty Disclaimers next to the notice
+     which states that this License applies to the Document.  These
+     Warranty Disclaimers are considered to be included by reference in
+     this License, but only as regards disclaiming warranties: any other
+     implication that these Warranty Disclaimers may have is void and
+     has no effect on the meaning of this License.
+
+  2. VERBATIM COPYING
+
+     You may copy and distribute the Document in any medium, either
+     commercially or noncommercially, provided that this License, the
+     copyright notices, and the license notice saying this License
+     applies to the Document are reproduced in all copies, and that you
+     add no other conditions whatsoever to those of this License.  You
+     may not use technical measures to obstruct or control the reading
+     or further copying of the copies you make or distribute.  However,
+     you may accept compensation in exchange for copies.  If you
+     distribute a large enough number of copies you must also follow
+     the conditions in section 3.
+
+     You may also lend copies, under the same conditions stated above,
+     and you may publicly display copies.
+
+  3. COPYING IN QUANTITY
+
+     If you publish printed copies (or copies in media that commonly
+     have printed covers) of the Document, numbering more than 100, and
+     the Document's license notice requires Cover Texts, you must
+     enclose the copies in covers that carry, clearly and legibly, all
+     these Cover Texts: Front-Cover Texts on the front cover, and
+     Back-Cover Texts on the back cover.  Both covers must also clearly
+     and legibly identify you as the publisher of these copies.  The
+     front cover must present the full title with all words of the
+     title equally prominent and visible.  You may add other material
+     on the covers in addition.  Copying with changes limited to the
+     covers, as long as they preserve the title of the Document and
+     satisfy these conditions, can be treated as verbatim copying in
+     other respects.
+
+     If the required texts for either cover are too voluminous to fit
+     legibly, you should put the first ones listed (as many as fit
+     reasonably) on the actual cover, and continue the rest onto
+     adjacent pages.
+
+     If you publish or distribute Opaque copies of the Document
+     numbering more than 100, you must either include a
+     machine-readable Transparent copy along with each Opaque copy, or
+     state in or with each Opaque copy a computer-network location from
+     which the general network-using public has access to download
+     using public-standard network protocols a complete Transparent
+     copy of the Document, free of added material.  If you use the
+     latter option, you must take reasonably prudent steps, when you
+     begin distribution of Opaque copies in quantity, to ensure that
+     this Transparent copy will remain thus accessible at the stated
+     location until at least one year after the last time you
+     distribute an Opaque copy (directly or through your agents or
+     retailers) of that edition to the public.
+
+     It is requested, but not required, that you contact the authors of
+     the Document well before redistributing any large number of
+     copies, to give them a chance to provide you with an updated
+     version of the Document.
+
+  4. MODIFICATIONS
+
+     You may copy and distribute a Modified Version of the Document
+     under the conditions of sections 2 and 3 above, provided that you
+     release the Modified Version under precisely this License, with
+     the Modified Version filling the role of the Document, thus
+     licensing distribution and modification of the Modified Version to
+     whoever possesses a copy of it.  In addition, you must do these
+     things in the Modified Version:
+
+       A. Use in the Title Page (and on the covers, if any) a title
+          distinct from that of the Document, and from those of
+          previous versions (which should, if there were any, be listed
+          in the History section of the Document).  You may use the
+          same title as a previous version if the original publisher of
+          that version gives permission.
+
+       B. List on the Title Page, as authors, one or more persons or
+          entities responsible for authorship of the modifications in
+          the Modified Version, together with at least five of the
+          principal authors of the Document (all of its principal
+          authors, if it has fewer than five), unless they release you
+          from this requirement.
+
+       C. State on the Title page the name of the publisher of the
+          Modified Version, as the publisher.
+
+       D. Preserve all the copyright notices of the Document.
+
+       E. Add an appropriate copyright notice for your modifications
+          adjacent to the other copyright notices.
+
+       F. Include, immediately after the copyright notices, a license
+          notice giving the public permission to use the Modified
+          Version under the terms of this License, in the form shown in
+          the Addendum below.
+
+       G. Preserve in that license notice the full lists of Invariant
+          Sections and required Cover Texts given in the Document's
+          license notice.
+
+       H. Include an unaltered copy of this License.
+
+       I. Preserve the section Entitled "History", Preserve its Title,
+          and add to it an item stating at least the title, year, new
+          authors, and publisher of the Modified Version as given on
+          the Title Page.  If there is no section Entitled "History" in
+          the Document, create one stating the title, year, authors,
+          and publisher of the Document as given on its Title Page,
+          then add an item describing the Modified Version as stated in
+          the previous sentence.
+
+       J. Preserve the network location, if any, given in the Document
+          for public access to a Transparent copy of the Document, and
+          likewise the network locations given in the Document for
+          previous versions it was based on.  These may be placed in
+          the "History" section.  You may omit a network location for a
+          work that was published at least four years before the
+          Document itself, or if the original publisher of the version
+          it refers to gives permission.
+
+       K. For any section Entitled "Acknowledgements" or "Dedications",
+          Preserve the Title of the section, and preserve in the
+          section all the substance and tone of each of the contributor
+          acknowledgements and/or dedications given therein.
+
+       L. Preserve all the Invariant Sections of the Document,
+          unaltered in their text and in their titles.  Section numbers
+          or the equivalent are not considered part of the section
+          titles.
+
+       M. Delete any section Entitled "Endorsements".  Such a section
+          may not be included in the Modified Version.
+
+       N. Do not retitle any existing section to be Entitled
+          "Endorsements" or to conflict in title with any Invariant
+          Section.
+
+       O. Preserve any Warranty Disclaimers.
+
+     If the Modified Version includes new front-matter sections or
+     appendices that qualify as Secondary Sections and contain no
+     material copied from the Document, you may at your option
+     designate some or all of these sections as invariant.  To do this,
+     add their titles to the list of Invariant Sections in the Modified
+     Version's license notice.  These titles must be distinct from any
+     other section titles.
+
+     You may add a section Entitled "Endorsements", provided it contains
+     nothing but endorsements of your Modified Version by various
+     parties--for example, statements of peer review or that the text
+     has been approved by an organization as the authoritative
+     definition of a standard.
+
+     You may add a passage of up to five words as a Front-Cover Text,
+     and a passage of up to 25 words as a Back-Cover Text, to the end
+     of the list of Cover Texts in the Modified Version.  Only one
+     passage of Front-Cover Text and one of Back-Cover Text may be
+     added by (or through arrangements made by) any one entity.  If the
+     Document already includes a cover text for the same cover,
+     previously added by you or by arrangement made by the same entity
+     you are acting on behalf of, you may not add another; but you may
+     replace the old one, on explicit permission from the previous
+     publisher that added the old one.
+
+     The author(s) and publisher(s) of the Document do not by this
+     License give permission to use their names for publicity for or to
+     assert or imply endorsement of any Modified Version.
+
+  5. COMBINING DOCUMENTS
+
+     You may combine the Document with other documents released under
+     this License, under the terms defined in section 4 above for
+     modified versions, provided that you include in the combination
+     all of the Invariant Sections of all of the original documents,
+     unmodified, and list them all as Invariant Sections of your
+     combined work in its license notice, and that you preserve all
+     their Warranty Disclaimers.
+
+     The combined work need only contain one copy of this License, and
+     multiple identical Invariant Sections may be replaced with a single
+     copy.  If there are multiple Invariant Sections with the same name
+     but different contents, make the title of each such section unique
+     by adding at the end of it, in parentheses, the name of the
+     original author or publisher of that section if known, or else a
+     unique number.  Make the same adjustment to the section titles in
+     the list of Invariant Sections in the license notice of the
+     combined work.
+
+     In the combination, you must combine any sections Entitled
+     "History" in the various original documents, forming one section
+     Entitled "History"; likewise combine any sections Entitled
+     "Acknowledgements", and any sections Entitled "Dedications".  You
+     must delete all sections Entitled "Endorsements."
+
+  6. COLLECTIONS OF DOCUMENTS
+
+     You may make a collection consisting of the Document and other
+     documents released under this License, and replace the individual
+     copies of this License in the various documents with a single copy
+     that is included in the collection, provided that you follow the
+     rules of this License for verbatim copying of each of the
+     documents in all other respects.
+
+     You may extract a single document from such a collection, and
+     distribute it individually under this License, provided you insert
+     a copy of this License into the extracted document, and follow
+     this License in all other respects regarding verbatim copying of
+     that document.
+
+  7. AGGREGATION WITH INDEPENDENT WORKS
+
+     A compilation of the Document or its derivatives with other
+     separate and independent documents or works, in or on a volume of
+     a storage or distribution medium, is called an "aggregate" if the
+     copyright resulting from the compilation is not used to limit the
+     legal rights of the compilation's users beyond what the individual
+     works permit.  When the Document is included an aggregate, this
+     License does not apply to the other works in the aggregate which
+     are not themselves derivative works of the Document.
+
+     If the Cover Text requirement of section 3 is applicable to these
+     copies of the Document, then if the Document is less than one half
+     of the entire aggregate, the Document's Cover Texts may be placed
+     on covers that bracket the Document within the aggregate, or the
+     electronic equivalent of covers if the Document is in electronic
+     form.  Otherwise they must appear on printed covers that bracket
+     the whole aggregate.
+
+  8. TRANSLATION
+
+     Translation is considered a kind of modification, so you may
+     distribute translations of the Document under the terms of section
+     4.  Replacing Invariant Sections with translations requires special
+     permission from their copyright holders, but you may include
+     translations of some or all Invariant Sections in addition to the
+     original versions of these Invariant Sections.  You may include a
+     translation of this License, and all the license notices in the
+     Document, and any Warranty Disclaimers, provided that you also
+     include the original English version of this License and the
+     original versions of those notices and disclaimers.  In case of a
+     disagreement between the translation and the original version of
+     this License or a notice or disclaimer, the original version will
+     prevail.
+
+     If a section in the Document is Entitled "Acknowledgements",
+     "Dedications", or "History", the requirement (section 4) to
+     Preserve its Title (section 1) will typically require changing the
+     actual title.
+
+  9. TERMINATION
+
+     You may not copy, modify, sublicense, or distribute the Document
+     except as expressly provided for under this License.  Any other
+     attempt to copy, modify, sublicense or distribute the Document is
+     void, and will automatically terminate your rights under this
+     License.  However, parties who have received copies, or rights,
+     from you under this License will not have their licenses
+     terminated so long as such parties remain in full compliance.
+
+ 10. FUTURE REVISIONS OF THIS LICENSE
+
+     The Free Software Foundation may publish new, revised versions of
+     the GNU Free Documentation License from time to time.  Such new
+     versions will be similar in spirit to the present version, but may
+     differ in detail to address new problems or concerns.  See
+     `http://www.gnu.org/copyleft/'.
+
+     Each version of the License is given a distinguishing version
+     number.  If the Document specifies that a particular numbered
+     version of this License "or any later version" applies to it, you
+     have the option of following the terms and conditions either of
+     that specified version or of any later version that has been
+     published (not as a draft) by the Free Software Foundation.  If
+     the Document does not specify a version number of this License,
+     you may choose any version ever published (not as a draft) by the
+     Free Software Foundation.
+
+A.1.1 ADDENDUM: How to use this License for your documents
+----------------------------------------------------------
+
+To use this License in a document you have written, include a copy of
+the License in the document and put the following copyright and license
+notices just after the title page:
+
+       Copyright (C)  YEAR  YOUR NAME.
+       Permission is granted to copy, distribute and/or modify this document
+       under the terms of the GNU Free Documentation License, Version 1.2
+       or any later version published by the Free Software Foundation;
+       with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.
+       A copy of the license is included in the section entitled ``GNU
+       Free Documentation License''.
+
+   If you have Invariant Sections, Front-Cover Texts and Back-Cover
+Texts, replace the "with...Texts." line with this:
+
+         with the Invariant Sections being LIST THEIR TITLES, with
+         the Front-Cover Texts being LIST, and with the Back-Cover Texts
+         being LIST.
+
+   If you have Invariant Sections without Cover Texts, or some other
+combination of the three, merge those two alternatives to suit the
+situation.
+
+   If your document contains nontrivial examples of program code, we
+recommend releasing these examples in parallel under your choice of
+free software license, such as the GNU General Public License, to
+permit their use in free software.
+
+\1f
+File: history.info,  Node: Concept Index,  Next: Function and Variable Index,  Prev: Copying This Manual,  Up: Top
+
+Appendix B Concept Index
+************************
+
+\0\b[index\0\b]
+* Menu:
+
+* anchored search:                       Searching the History List.
+                                                               (line 10)
+* event designators:                     Event Designators.    (line  6)
+* FDL, GNU Free Documentation License:   GNU Free Documentation License.
+                                                               (line  6)
+* history events:                        Event Designators.    (line  7)
+* history expansion:                     History Interaction.  (line  6)
+* History Searching:                     Searching the History List.
+                                                               (line  6)
+
+\1f
+File: history.info,  Node: Function and Variable Index,  Prev: Concept Index,  Up: Top
+
+Appendix C Function and Variable Index
+**************************************
+
+\0\b[index\0\b]
+* Menu:
+
+* add_history:                           History List Management.
+                                                               (line 10)
+* add_history_time:                      History List Management.
+                                                               (line 14)
+* append_history:                        Managing the History File.
+                                                               (line 29)
+* clear_history:                         History List Management.
+                                                               (line 35)
+* current_history:                       Information About the History List.
+                                                               (line 18)
+* free_history_entry:                    History List Management.
+                                                               (line 23)
+* get_history_event:                     History Expansion.    (line 31)
+* history_arg_extract:                   History Expansion.    (line 46)
+* history_base:                          History Variables.    (line 10)
+* history_comment_char:                  History Variables.    (line 33)
+* history_expand:                        History Expansion.    (line  9)
+* history_expansion_char:                History Variables.    (line 25)
+* history_get:                           Information About the History List.
+                                                               (line 23)
+* history_get_history_state:             Initializing History and State Management.
+                                                               (line 15)
+* history_get_time:                      Information About the History List.
+                                                               (line 29)
+* history_inhibit_expansion_function:    History Variables.    (line 57)
+* history_is_stifled:                    History List Management.
+                                                               (line 47)
+* history_length:                        History Variables.    (line 13)
+* history_list:                          Information About the History List.
+                                                               (line 10)
+* history_max_entries:                   History Variables.    (line 16)
+* history_no_expand_chars:               History Variables.    (line 48)
+* history_quotes_inhibit_expansion:      History Variables.    (line 53)
+* history_search:                        Searching the History List.
+                                                               (line 13)
+* history_search_delimiter_chars:        History Variables.    (line 43)
+* history_search_pos:                    Searching the History List.
+                                                               (line 33)
+* history_search_prefix:                 Searching the History List.
+                                                               (line 23)
+* history_set_history_state:             Initializing History and State Management.
+                                                               (line 19)
+* history_set_pos:                       Moving Around the History List.
+                                                               (line 10)
+* history_subst_char:                    History Variables.    (line 29)
+* history_tokenize:                      History Expansion.    (line 39)
+* history_total_bytes:                   Information About the History List.
+                                                               (line 32)
+* history_truncate_file:                 Managing the History File.
+                                                               (line 35)
+* history_word_delimiters:               History Variables.    (line 39)
+* history_write_timestamps:              History Variables.    (line 20)
+* next_history:                          Moving Around the History List.
+                                                               (line 20)
+* previous_history:                      Moving Around the History List.
+                                                               (line 15)
+* read_history:                          Managing the History File.
+                                                               (line 10)
+* read_history_range:                    Managing the History File.
+                                                               (line 16)
+* remove_history:                        History List Management.
+                                                               (line 18)
+* replace_history_entry:                 History List Management.
+                                                               (line 29)
+* stifle_history:                        History List Management.
+                                                               (line 38)
+* unstifle_history:                      History List Management.
+                                                               (line 41)
+* using_history:                         Initializing History and State Management.
+                                                               (line 11)
+* where_history:                         Information About the History List.
+                                                               (line 15)
+* write_history:                         Managing the History File.
+                                                               (line 23)
+
+
+\1f
+Tag Table:
+Node: Top\7f1314
+Node: Using History Interactively\7f1939
+Node: History Interaction\7f2447
+Node: Event Designators\7f3871
+Node: Word Designators\7f4806
+Node: Modifiers\7f6445
+Node: Programming with GNU History\7f7672
+Node: Introduction to History\7f8404
+Node: History Storage\7f10094
+Node: History Functions\7f11229
+Node: Initializing History and State Management\7f12218
+Node: History List Management\7f13030
+Node: Information About the History List\7f15062
+Node: Moving Around the History List\7f16559
+Node: Searching the History List\7f17560
+Node: Managing the History File\7f19492
+Node: History Expansion\7f21312
+Node: History Variables\7f23220
+Node: History Programming Example\7f26026
+Node: Copying This Manual\7f28703
+Node: GNU Free Documentation License\7f28963
+Node: Concept Index\7f51369
+Node: Function and Variable Index\7f52209
+\1f
+End Tag Table
diff --git a/doc/history.pdf b/doc/history.pdf
new file mode 100644 (file)
index 0000000..2ed10c4
Binary files /dev/null and b/doc/history.pdf differ
diff --git a/doc/history.ps b/doc/history.ps
new file mode 100644 (file)
index 0000000..b00ec89
--- /dev/null
@@ -0,0 +1,4807 @@
+%!PS-Adobe-2.0
+%%Creator: dvips(k) 5.92b Copyright 2002 Radical Eye Software
+%%Title: history.dvi
+%%Pages: 28
+%%PageOrder: Ascend
+%%BoundingBox: 0 0 612 792
+%%DocumentFonts: CMBX12 CMR10 CMTT10 CMSY10 CMBXTI10 CMTI10 CMCSC10
+%%+ CMSL10 CMSLTT10 CMBX10 CMSS10 CMTT9 CMR9 CMTI9
+%%EndComments
+%DVIPSWebPage: (www.radicaleye.com)
+%DVIPSCommandLine: dvips -D 600 -t letter -o history.ps history.dvi
+%DVIPSParameters: dpi=600, compressed
+%DVIPSSource:  TeX output 2006.07.06:0935
+%%BeginProcSet: texc.pro
+%!
+/TeXDict 300 dict def TeXDict begin/N{def}def/B{bind def}N/S{exch}N/X{S
+N}B/A{dup}B/TR{translate}N/isls false N/vsize 11 72 mul N/hsize 8.5 72
+mul N/landplus90{false}def/@rigin{isls{[0 landplus90{1 -1}{-1 1}ifelse 0
+0 0]concat}if 72 Resolution div 72 VResolution div neg scale isls{
+landplus90{VResolution 72 div vsize mul 0 exch}{Resolution -72 div hsize
+mul 0}ifelse TR}if Resolution VResolution vsize -72 div 1 add mul TR[
+matrix currentmatrix{A A round sub abs 0.00001 lt{round}if}forall round
+exch round exch]setmatrix}N/@landscape{/isls true N}B/@manualfeed{
+statusdict/manualfeed true put}B/@copies{/#copies X}B/FMat[1 0 0 -1 0 0]
+N/FBB[0 0 0 0]N/nn 0 N/IEn 0 N/ctr 0 N/df-tail{/nn 8 dict N nn begin
+/FontType 3 N/FontMatrix fntrx N/FontBBox FBB N string/base X array
+/BitMaps X/BuildChar{CharBuilder}N/Encoding IEn N end A{/foo setfont}2
+array copy cvx N load 0 nn put/ctr 0 N[}B/sf 0 N/df{/sf 1 N/fntrx FMat N
+df-tail}B/dfs{div/sf X/fntrx[sf 0 0 sf neg 0 0]N df-tail}B/E{pop nn A
+definefont setfont}B/Cw{Cd A length 5 sub get}B/Ch{Cd A length 4 sub get
+}B/Cx{128 Cd A length 3 sub get sub}B/Cy{Cd A length 2 sub get 127 sub}
+B/Cdx{Cd A length 1 sub get}B/Ci{Cd A type/stringtype ne{ctr get/ctr ctr
+1 add N}if}B/id 0 N/rw 0 N/rc 0 N/gp 0 N/cp 0 N/G 0 N/CharBuilder{save 3
+1 roll S A/base get 2 index get S/BitMaps get S get/Cd X pop/ctr 0 N Cdx
+0 Cx Cy Ch sub Cx Cw add Cy setcachedevice Cw Ch true[1 0 0 -1 -.1 Cx
+sub Cy .1 sub]/id Ci N/rw Cw 7 add 8 idiv string N/rc 0 N/gp 0 N/cp 0 N{
+rc 0 ne{rc 1 sub/rc X rw}{G}ifelse}imagemask restore}B/G{{id gp get/gp
+gp 1 add N A 18 mod S 18 idiv pl S get exec}loop}B/adv{cp add/cp X}B
+/chg{rw cp id gp 4 index getinterval putinterval A gp add/gp X adv}B/nd{
+/cp 0 N rw exit}B/lsh{rw cp 2 copy get A 0 eq{pop 1}{A 255 eq{pop 254}{
+A A add 255 and S 1 and or}ifelse}ifelse put 1 adv}B/rsh{rw cp 2 copy
+get A 0 eq{pop 128}{A 255 eq{pop 127}{A 2 idiv S 128 and or}ifelse}
+ifelse put 1 adv}B/clr{rw cp 2 index string putinterval adv}B/set{rw cp
+fillstr 0 4 index getinterval putinterval adv}B/fillstr 18 string 0 1 17
+{2 copy 255 put pop}for N/pl[{adv 1 chg}{adv 1 chg nd}{1 add chg}{1 add
+chg nd}{adv lsh}{adv lsh nd}{adv rsh}{adv rsh nd}{1 add adv}{/rc X nd}{
+1 add set}{1 add clr}{adv 2 chg}{adv 2 chg nd}{pop nd}]A{bind pop}
+forall N/D{/cc X A type/stringtype ne{]}if nn/base get cc ctr put nn
+/BitMaps get S ctr S sf 1 ne{A A length 1 sub A 2 index S get sf div put
+}if put/ctr ctr 1 add N}B/I{cc 1 add D}B/bop{userdict/bop-hook known{
+bop-hook}if/SI save N @rigin 0 0 moveto/V matrix currentmatrix A 1 get A
+mul exch 0 get A mul add .99 lt{/QV}{/RV}ifelse load def pop pop}N/eop{
+SI restore userdict/eop-hook known{eop-hook}if showpage}N/@start{
+userdict/start-hook known{start-hook}if pop/VResolution X/Resolution X
+1000 div/DVImag X/IEn 256 array N 2 string 0 1 255{IEn S A 360 add 36 4
+index cvrs cvn put}for pop 65781.76 div/vsize X 65781.76 div/hsize X}N
+/p{show}N/RMat[1 0 0 -1 0 0]N/BDot 260 string N/Rx 0 N/Ry 0 N/V{}B/RV/v{
+/Ry X/Rx X V}B statusdict begin/product where{pop false[(Display)(NeXT)
+(LaserWriter 16/600)]{A length product length le{A length product exch 0
+exch getinterval eq{pop true exit}if}{pop}ifelse}forall}{false}ifelse
+end{{gsave TR -.1 .1 TR 1 1 scale Rx Ry false RMat{BDot}imagemask
+grestore}}{{gsave TR -.1 .1 TR Rx Ry scale 1 1 false RMat{BDot}
+imagemask grestore}}ifelse B/QV{gsave newpath transform round exch round
+exch itransform moveto Rx 0 rlineto 0 Ry neg rlineto Rx neg 0 rlineto
+fill grestore}B/a{moveto}B/delta 0 N/tail{A/delta X 0 rmoveto}B/M{S p
+delta add tail}B/b{S p tail}B/c{-4 M}B/d{-3 M}B/e{-2 M}B/f{-1 M}B/g{0 M}
+B/h{1 M}B/i{2 M}B/j{3 M}B/k{4 M}B/w{0 rmoveto}B/l{p -4 w}B/m{p -3 w}B/n{
+p -2 w}B/o{p -1 w}B/q{p 1 w}B/r{p 2 w}B/s{p 3 w}B/t{p 4 w}B/x{0 S
+rmoveto}B/y{3 2 roll p a}B/bos{/SS save N}B/eos{SS restore}B end
+
+%%EndProcSet
+%%BeginProcSet: f7b6d320.enc
+% Thomas Esser, Dec 2002. public domain
+%
+% Encoding for:
+%     cmb10 cmbx10 cmbx12 cmbx5 cmbx6 cmbx7 cmbx8 cmbx9 cmbxsl10
+%     cmdunh10 cmr10 cmr12 cmr17cmr6 cmr7 cmr8 cmr9 cmsl10 cmsl12 cmsl8
+%     cmsl9 cmss10cmss12 cmss17 cmss8 cmss9 cmssbx10 cmssdc10 cmssi10
+%     cmssi12 cmssi17 cmssi8cmssi9 cmssq8 cmssqi8 cmvtt10
+%
+/TeXf7b6d320Encoding [
+/Gamma /Delta /Theta /Lambda /Xi /Pi /Sigma /Upsilon /Phi /Psi /Omega
+/ff /fi /fl /ffi /ffl /dotlessi /dotlessj /grave /acute /caron /breve
+/macron /ring /cedilla /germandbls /ae /oe /oslash /AE /OE /Oslash
+/suppress /exclam /quotedblright /numbersign /dollar /percent /ampersand
+/quoteright /parenleft /parenright /asterisk /plus /comma /hyphen
+/period /slash /zero /one /two /three /four /five /six /seven /eight
+/nine /colon /semicolon /exclamdown /equal /questiondown /question /at
+/A /B /C /D /E /F /G /H /I /J /K /L /M /N /O /P /Q /R /S /T /U /V /W /X
+/Y /Z /bracketleft /quotedblleft /bracketright /circumflex /dotaccent
+/quoteleft /a /b /c /d /e /f /g /h /i /j /k /l /m /n /o /p /q /r /s /t /u
+/v /w /x /y /z /endash /emdash /hungarumlaut /tilde /dieresis /suppress
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /space
+/Gamma /Delta /Theta /Lambda /Xi /Pi /Sigma /Upsilon /Phi /Psi /.notdef
+/.notdef /Omega /ff /fi /fl /ffi /ffl /dotlessi /dotlessj /grave /acute
+/caron /breve /macron /ring /cedilla /germandbls /ae /oe /oslash /AE
+/OE /Oslash /suppress /dieresis /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+] def
+
+%%EndProcSet
+%%BeginProcSet: 09fbbfac.enc
+% Thomas Esser, Dec 2002. public domain
+%
+% Encoding for:
+%     cmsltt10 cmtt10 cmtt12 cmtt8 cmtt9
+/TeX09fbbfacEncoding [
+/Gamma /Delta /Theta /Lambda /Xi /Pi /Sigma /Upsilon /Phi /Psi
+/Omega /arrowup /arrowdown /quotesingle /exclamdown /questiondown
+/dotlessi /dotlessj /grave /acute /caron /breve /macron /ring /cedilla
+/germandbls /ae /oe /oslash /AE /OE /Oslash /visiblespace /exclam
+/quotedbl /numbersign /dollar /percent /ampersand /quoteright /parenleft
+/parenright /asterisk /plus /comma /hyphen /period /slash /zero /one
+/two /three /four /five /six /seven /eight /nine /colon /semicolon /less
+/equal /greater /question /at /A /B /C /D /E /F /G /H /I /J /K /L /M /N
+/O /P /Q /R /S /T /U /V /W /X /Y /Z /bracketleft /backslash /bracketright
+/asciicircum /underscore /quoteleft /a /b /c /d /e /f /g /h /i /j /k /l
+/m /n /o /p /q /r /s /t /u /v /w /x /y /z /braceleft /bar /braceright
+/asciitilde /dieresis /visiblespace /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /space /Gamma /Delta /Theta /Lambda /Xi /Pi
+/Sigma /Upsilon /Phi /Psi /.notdef /.notdef /Omega /arrowup /arrowdown
+/quotesingle /exclamdown /questiondown /dotlessi /dotlessj /grave /acute
+/caron /breve /macron /ring /cedilla /germandbls /ae /oe /oslash /AE
+/OE /Oslash /visiblespace /dieresis /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+] def
+
+%%EndProcSet
+%%BeginProcSet: bbad153f.enc
+% Thomas Esser, Dec 2002. public domain
+%
+% Encoding for:
+%     cmsy10 cmsy5 cmsy6 cmsy7 cmsy8 cmsy9
+%
+/TeXbbad153fEncoding [
+/minus /periodcentered /multiply /asteriskmath /divide /diamondmath
+/plusminus /minusplus /circleplus /circleminus /circlemultiply
+/circledivide /circledot /circlecopyrt /openbullet /bullet
+/equivasymptotic /equivalence /reflexsubset /reflexsuperset /lessequal
+/greaterequal /precedesequal /followsequal /similar /approxequal
+/propersubset /propersuperset /lessmuch /greatermuch /precedes /follows
+/arrowleft /arrowright /arrowup /arrowdown /arrowboth /arrownortheast
+/arrowsoutheast /similarequal /arrowdblleft /arrowdblright /arrowdblup
+/arrowdbldown /arrowdblboth /arrownorthwest /arrowsouthwest /proportional
+/prime /infinity /element /owner /triangle /triangleinv /negationslash
+/mapsto /universal /existential /logicalnot /emptyset /Rfractur /Ifractur
+/latticetop /perpendicular /aleph /A /B /C /D /E /F /G /H /I /J /K
+/L /M /N /O /P /Q /R /S /T /U /V /W /X /Y /Z /union /intersection
+/unionmulti /logicaland /logicalor /turnstileleft /turnstileright
+/floorleft /floorright /ceilingleft /ceilingright /braceleft /braceright
+/angbracketleft /angbracketright /bar /bardbl /arrowbothv /arrowdblbothv
+/backslash /wreathproduct /radical /coproduct /nabla /integral
+/unionsq /intersectionsq /subsetsqequal /supersetsqequal /section
+/dagger /daggerdbl /paragraph /club /diamond /heart /spade /arrowleft
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/minus /periodcentered /multiply /asteriskmath /divide /diamondmath
+/plusminus /minusplus /circleplus /circleminus /.notdef /.notdef
+/circlemultiply /circledivide /circledot /circlecopyrt /openbullet
+/bullet /equivasymptotic /equivalence /reflexsubset /reflexsuperset
+/lessequal /greaterequal /precedesequal /followsequal /similar
+/approxequal /propersubset /propersuperset /lessmuch /greatermuch
+/precedes /follows /arrowleft /spade /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+] def
+
+%%EndProcSet
+%%BeginProcSet: 74afc74c.enc
+% Thomas Esser, Dec 2002. public domain
+%
+% Encoding for:
+%     cmbxti10 cmff10 cmfi10 cmfib8 cmti10 cmti12 cmti7 cmti8cmti9 cmu10
+%
+/TeX74afc74cEncoding [
+/Gamma /Delta /Theta /Lambda /Xi /Pi /Sigma /Upsilon /Phi /Psi /Omega
+/ff /fi /fl /ffi /ffl /dotlessi /dotlessj /grave /acute /caron /breve
+/macron /ring /cedilla /germandbls /ae /oe /oslash /AE /OE /Oslash
+/suppress /exclam /quotedblright /numbersign /sterling /percent
+/ampersand /quoteright /parenleft /parenright /asterisk /plus /comma
+/hyphen /period /slash /zero /one /two /three /four /five /six /seven
+/eight /nine /colon /semicolon /exclamdown /equal /questiondown /question
+/at /A /B /C /D /E /F /G /H /I /J /K /L /M /N /O /P /Q /R /S /T /U /V /W
+/X /Y /Z /bracketleft /quotedblleft /bracketright /circumflex /dotaccent
+/quoteleft /a /b /c /d /e /f /g /h /i /j /k /l /m /n /o /p /q /r /s /t /u
+/v /w /x /y /z /endash /emdash /hungarumlaut /tilde /dieresis /suppress
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /space
+/Gamma /Delta /Theta /Lambda /Xi /Pi /Sigma /Upsilon /Phi /Psi /.notdef
+/.notdef /Omega /ff /fi /fl /ffi /ffl /dotlessi /dotlessj /grave /acute
+/caron /breve /macron /ring /cedilla /germandbls /ae /oe /oslash /AE
+/OE /Oslash /suppress /dieresis /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+] def
+
+%%EndProcSet
+%%BeginProcSet: 0ef0afca.enc
+% Thomas Esser, Dec 2002. public domain
+%
+% Encoding for:
+%     cmr5
+%
+/TeX0ef0afcaEncoding [
+/Gamma /Delta /Theta /Lambda /Xi /Pi /Sigma /Upsilon /Phi /Psi /Omega
+/arrowup /arrowdown /quotesingle /exclamdown /questiondown /dotlessi
+/dotlessj /grave /acute /caron /breve /macron /ring /cedilla /germandbls
+/ae /oe /oslash /AE /OE /Oslash /suppress /exclam /quotedblright
+/numbersign /dollar /percent /ampersand /quoteright /parenleft
+/parenright /asterisk /plus /comma /hyphen /period /slash /zero /one
+/two /three /four /five /six /seven /eight /nine /colon /semicolon
+/less /equal /greater /question /at /A /B /C /D /E /F /G /H /I /J /K
+/L /M /N /O /P /Q /R /S /T /U /V /W /X /Y /Z /bracketleft /quotedblleft
+/bracketright /circumflex /dotaccent /quoteleft /a /b /c /d /e /f /g /h
+/i /j /k /l /m /n /o /p /q /r /s /t /u /v /w /x /y /z /endash /emdash
+/hungarumlaut /tilde /dieresis /suppress /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /space /Gamma /Delta /Theta /Lambda
+/Xi /Pi /Sigma /Upsilon /Phi /Psi /.notdef /.notdef /Omega /arrowup
+/arrowdown /quotesingle /exclamdown /questiondown /dotlessi /dotlessj
+/grave /acute /caron /breve /macron /ring /cedilla /germandbls /ae /oe
+/oslash /AE /OE /Oslash /suppress /dieresis /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+] def
+
+%%EndProcSet
+%%BeginProcSet: texps.pro
+%!
+TeXDict begin/rf{findfont dup length 1 add dict begin{1 index/FID ne 2
+index/UniqueID ne and{def}{pop pop}ifelse}forall[1 index 0 6 -1 roll
+exec 0 exch 5 -1 roll VResolution Resolution div mul neg 0 0]FontType 0
+ne{/Metrics exch def dict begin Encoding{exch dup type/integertype ne{
+pop pop 1 sub dup 0 le{pop}{[}ifelse}{FontMatrix 0 get div Metrics 0 get
+div def}ifelse}forall Metrics/Metrics currentdict end def}{{1 index type
+/nametype eq{exit}if exch pop}loop}ifelse[2 index currentdict end
+definefont 3 -1 roll makefont/setfont cvx]cvx def}def/ObliqueSlant{dup
+sin S cos div neg}B/SlantFont{4 index mul add}def/ExtendFont{3 -1 roll
+mul exch}def/ReEncodeFont{CharStrings rcheck{/Encoding false def dup[
+exch{dup CharStrings exch known not{pop/.notdef/Encoding true def}if}
+forall Encoding{]exch pop}{cleartomark}ifelse}if/Encoding exch def}def
+end
+
+%%EndProcSet
+%%BeginFont: CMTI9
+%!PS-AdobeFont-1.1: CMTI9 1.0
+%%CreationDate: 1991 Aug 18 21:08:07
+% Copyright (C) 1997 American Mathematical Society. All Rights Reserved.
+11 dict begin
+/FontInfo 7 dict dup begin
+/version (1.0) readonly def
+/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def
+/FullName (CMTI9) readonly def
+/FamilyName (Computer Modern) readonly def
+/Weight (Medium) readonly def
+/ItalicAngle -14.04 def
+/isFixedPitch false def
+end readonly def
+/FontName /CMTI9 def
+/PaintType 0 def
+/FontType 1 def
+/FontMatrix [0.001 0 0 0.001 0 0] readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 0 /.notdef put
+readonly def
+/FontBBox{-35 -250 1148 750}readonly def
+/UniqueID 5000827 def
+currentdict end
+currentfile eexec
+D9D66F633B846A97B686A97E45A3D0AA0529731C99A784CCBE85B4993B2EEBDE
+3B12D472B7CF54651EF21185116A69AB1096ED4BAD2F646635E019B6417CC77B
+532F85D811C70D1429A19A5307EF63EB5C5E02C89FC6C20F6D9D89E7D91FE470
+B72BEFDA23F5DF76BE05AF4CE93137A219ED8A04A9D7D6FDF37E6B7FCDE0D90B
+986423E5960A5D9FBB4C956556E8DF90CBFAEC476FA36FD9A5C8175C9AF513FE
+D919C2DDD26BDC0D99398B9F4D03D5993DFC0930297866E1CD0A319B6B1FD958
+9E3948FFB3DF7BFF10C9BDA4EFE5F68A8CB1526990D1357AE6D2F7C2D2EF8496
+4E47B39E6712EB8908A3265E5FAB40567E866C244814449F1E993AAB422C3F1D
+DFA8C7118584F2E5197FD4BFA3A8AE9E953C6CD4672C0FF51E41C3A919749C1A
+F06650DF4C5E17492164BDBCDF22609A74BFA7F69960A64B9F949FFC2A807458
+8579366C4F41BDE1FDFBCC4845FA19BBB6963D65EE8532549274BAEBDFF24FA6
+03235D1BE37C06B1938AF369DA75BF38DDBC87A1FF445EAA16E1895ABE9506B9
+211955753E447865D33CEF007391D2666A046277A30A49804FFCED3FEA5EB2C3
+E52EE14A9F75241EA10C91974CDA6236EB840FD44D6DDE4D9B3266C3B99BD38B
+D835BCA8CB819C073480FB972CC028D218F6A1D344CE1B63F4FBF2C826F412E1
+6E0B05A26125865A14FD7B7030B478BB8BC6BC395335C3BA940E1C348267F4F9
+0AF97BBEE253511940F1048E175D3569F7D05A28851B6F50765FEB6C9654FEDC
+1BF52F535DB5BB90C1BD5D2EBF75E0AEBE82B20507F3C28A03746781018D4EB2
+298E4F2C27ACF73FA73EBE43F014BB575AAD516C0407B29E1653375135ECB74D
+C91372F06FA8EF37C31AF3FA48AE65318EAA6C34830A5377ABB2DFA5DA53A574
+433484BA1466709A4B186761655C8E482833B697673E847C691079E7F1DCB8D6
+1AD91101D757B83E2090337D525AEECB028FB3C9F6A6E6AD2F322CFDC5A833E6
+1CE4EDBF41FD34FD61630581D222F854A76C2EA9FD72796A7C9CC1F6C2FCCD16
+E95CA05826A4ECFADA6A5FB83C41A7131E52BA6585DD6DD78515D8F7327DFC6F
+9404F89293D6ACB433CD0802C43F0E74C6C4766A23A6AE3788FE6CAE82E1A104
+BAEC8BEFDEFE4F292F625E60362F3886F602CE4121BF0AAD93526314BCBB5971
+40091A7BBF7EFB3BA355B88C897D9C70C841DE41309348751EDFFA8675215988
+49CB1599834A01EC6CD4FD813AFF97A614F56975775D5F48E9C1A9CE532FAEB1
+4EBE20C3FA87CFE03664C428BFC5C894668E507950005BD8C2BCA8998C1FB92C
+4E6B791BA05B79F332EB8AF5B0F851B8B7EE372EC0861B09C007CDF43F82D0B7
+35446F682A0DA7F4112CDABE4F922EACFCB7B8C88BF550B60957E7
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+%%EndFont 
+%%BeginFont: CMR9
+%!PS-AdobeFont-1.1: CMR9 1.0
+%%CreationDate: 1991 Aug 20 16:39:59
+% Copyright (C) 1997 American Mathematical Society. All Rights Reserved.
+11 dict begin
+/FontInfo 7 dict dup begin
+/version (1.0) readonly def
+/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def
+/FullName (CMR9) readonly def
+/FamilyName (Computer Modern) readonly def
+/Weight (Medium) readonly def
+/ItalicAngle 0 def
+/isFixedPitch false def
+end readonly def
+/FontName /CMR9 def
+/PaintType 0 def
+/FontType 1 def
+/FontMatrix [0.001 0 0 0.001 0 0] readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 0 /.notdef put
+readonly def
+/FontBBox{-39 -250 1036 750}readonly def
+/UniqueID 5000792 def
+currentdict end
+currentfile eexec
+D9D66F633B846A97B686A97E45A3D0AA052A014267B7904EB3C0D3BD0B83D891
+016CA6CA4B712ADEB258FAAB9A130EE605E61F77FC1B738ABC7C51CD46EF8171
+9098D5FEE67660E69A7AB91B58F29A4D79E57022F783EB0FBBB6D4F4EC35014F
+D2DECBA99459A4C59DF0C6EBA150284454E707DC2100C15B76B4C19B84363758
+469A6C558785B226332152109871A9883487DD7710949204DDCF837E6A8708B8
+2BDBF16FBC7512FAA308A093FE5CF7158F1163BC1F3352E22A1452E73FECA8A4
+87100FB1FFC4C8AF409B2067537220E605DA0852CA49839E1386AF9D7A1A455F
+D1F017CE45884D76EF2CB9BC5821FD25365DDEA6E45F332B5F68A44AD8A530F0
+92A36FADB679CF58BAFDD3E51DFDD314B91A605515D729EE20C42505FD4E0835
+3C9D365B14C003BC6DD352F0228A8C161F172D2551CD1C67CD0B1B21DED53203
+046FAFF9B1129167921DD82C5964F9DDDFE0D2686875BD075FC81831A941F20E
+C5CD90040A092E559F6D1D3B0E9BB71733595AE0EA6093F986377A96060BF12A
+A1B525CD9FA741FE051DD54A32BECD55A868DD63119A4370F8322CCBEC889BC2
+A723CB4015FC4AA90AE873EA14DE13382CA9CF0D8DFB65F0ABEDFD9A64BB3F4D
+731E2E1C9A1789228FF44116230A70C339C9819676022AB31B5C9C589AE9094B
+09882051AD4637C1710D93E8DD117B4E7B478493B91EA6306FDB3FA6D738AAB1
+49FBB21A00AC2A999C21445DE3177F21D8B6AAB33869C882613EA6B5EC56476B
+5634181ECBF03BFEDB57F079EACE3B334F6F384BDF9D70AEBD592C8ECF21378B
+54A8B5DBF7CB9282E16AA517E14843909339B5E7C55B038BF3BB493F3B884A1C
+C25F9E8FB912CBE23199AD9D2C3E573727701BA301526C66C3617B9514D6F11F
+11930B1D97C17816C85B1BFD9B973A191B33CC3B391815AD14F1CBE935942AEC
+D4004E6BEF379066FD72209DC88D2E634E79BCC2B98C766CBD92C561F2703F8A
+109E6C6CEC7B866F2FC7ADF646BF492E520319F3B949AB5D84AE990B33344A40
+3971F58DFDF8D8D67FA0B8F2A0D884F8C09A5A721319B911DBA0A35903877343
+C37BC36C5EB32353272D1E6ED5FCA611BE319A7E1E842CB7576E7DFC9BE98C04
+07AB81FFA0DF072948F163C014692806D9D0739EE9ECDE57FB6B4E8444A7BF3F
+57BA77A5B85C09209D100200D1254D1A955F92899E0CC2F0901F01F8DD6EBFDE
+0501C3A8645283E8FFDF47BCB83752A4AD5C94CE1F64D664B0583E69C9ED9E2E
+BAC3FB641A7B838DD8D9BA1EE40DE683F5B694561160D08A58F4C53E6346CAA5
+58F8EB6323884F1FA776B161890712BF54CC0E5A54FF1407D8805BBFBDD39BEA
+8F1C47E7589E3C04DE43F3F9390B87C81A47FCAC3BCF056E2DAE0B266479C3E4
+55AD44629ECBE69C17E4357BA1E0AEDDB614942519741E52D7CA9C0E229AEBB6
+E0AC8BE5129AEB56EB59DA82DA56B54E8E39E6B817F5EF1F8BC7AC5A4DC520C4
+D494811451F213EF198092405D82ADA72C249F6D5D2657FBC6EA372867D2021E
+EA6828FC107BC22B5192121A59D527187D990EAE65A72B2FC47AC650AEA43CB3
+20B04A91AF599929E03670D1E956BF56D302DB0769E91FE4021E0F790980A242
+A5D76D024A11EB57F9A84A040AB2093170D8C9EE54296BE826470077B39C4CE8
+2702AB49D06FACC7785CE175B92B5C98747613A7FF87D62E2433603C4F122CB1
+305D9F4913F805A2AFABEBBCC99F7F67A60842EE8677976428B7F6E150C93BAF
+6D4B8085C2A77794527F35FBAB758FEE0DF77CC94A56CE73825EFF0AF966BE3D
+10046B790C73AA615416079E5EC150FC6C157E62ABF8EB6B17857B8AF525F1D1
+E39EA402C5E795C9662750AA35EB853AD3EB87AA78B1CFD3F3F926E6E75B0A09
+746F816E651862466008001BE791573B8C05AADB4AACF9237BC0326CB0C732FA
+8CD0F289CE02AC1453B2B1732EC190DA4C3480E397272C045615709130DD125A
+DFDDBC4B2D2745824DC94F5D239D95A2E4379982515952A51B9EE6D00D71A3E6
+F6C5B93F5400B553154512DC0DDC57D92BFB241617C83068CD7EC9E6B0F9EBA3
+64685D3E6B68149A64B0D19B3558EEB7C9FA389B206021014FB99EC18CA67E19
+7E589382E77B802FAA0B79AA5F3BC1DDFABF9113D3AF85B19E0F43A27C2D1E62
+1C7B580D573E9504BA119506EA424273DDECEE01FB94FCD893BFAA6FF0332CED
+4F64D6EACDE630BA4A8E41B8120D8DB529531D4ACCA9ABFB6A27CE41029590F3
+46AAA9EFA728FC6492779AAD249D9EFDE27A2D987DE0FE1D9E4D7A91128761EA
+FD0A89AC4FBC4DADFDA502E7D01292D85EE63E6422615C6FEDF75F9256C6C3DF
+F7BFD47F477A1B93F5B8B8C950449856E34C36284F0FDCC05635F173341D509D
+8DA223987F6BFAD2F6D004368D9A82EC77207ABF8E4801B59A30CAD6E04BDC52
+6C3068E0F4141F6F76D655F657AAFABC87E78C999A1C40894A5F776E2F868907
+376FF64C0782BD815D39FA2C290686756807E888EB002E077101F36229EEF79F
+5AAE4D00AD85B4913CE4FB7AF667FD0198A52016A7B58B09CA5A9D4DE3A9B333
+28F623199C93E47E09D70AD3D2AABE3BCD6EE9EAA8B8D8F3F42FEE7BC3D846AD
+DAA4E31B62120EDE8B7DF8CB5BEFB6C5350ABAFB27FFBB57D312C4192EE98837
+5F959B63A6718C983F4072015EB8A4FACAE77EA1D6233B0AD532349F0CD15335
+6D8E1D99D543ACFB5B381FA56AF8B223EB57FD674B8484FFFF2BC0127121F68B
+4A43ECCDE282B294B1DD39556DE0D73592C2911AADA2DCAEB67A78ECE80AF5BE
+F54C5DE76F128C6BF010D65270B58334575309D907CBEB138A1E3CF889CBAF5F
+83368C5DE80B5DC665C6A7CA4054A673D75939E732ECCDFFD617677299A0EEEA
+FFCC76EF9E237CD7EFEAA6FA40029D9BB2BF563C969195353C28BDBE788BD14C
+031216D5E46BD3B144A6E5859C8747677260B4E07C35FCB1939785C458CDC0F6
+9EAB2CAF77CE96DF0F44BAAFEEA51A0F455964C3349ED7593742237A8FFAB3C7
+4A7A976B203664AB65AC996F8A961B3D6559874FE93A808D4E19E0BC84CF4BD2
+5D991C4DF859F136E619CDF1B5D88315FCE55684B8A452B657C5275609B61DD2
+5C2D7476288D9E8A04DA330CBB10FEA5829EC3E22A7A6596C748683A9B038B96
+0ECBBC13DF9B63C2B9989A1D1028B1426E48EB1F3DDE0BE63DD65CE6C80A6345
+2060E5F11BCE38AEF6ABEA5F3591D840952BE27B3DFA574AB3B6406B020A519E
+81A34FFAE360C9628D88C8E006A926884347A87E576344DC249DF32FE14CF02A
+F54147639C5F5A2C14DE888E497D9F9E62256AEBF70D2E88EAACED5439715B98
+FD09A5AA5AE1C937F82576953C724A0B8C8E2BC58F75840E87A87782DD3CB1DF
+D6F3A2421354339A04D2F1B2A2F7B13230E06BE82ED286CEBE37DFCAE4C6DF0D
+28D11A05F0C6A1A2DB756E508C0E7D8C9494D34A8ED76F7ED51A1C51E3EDF913
+345E0F296474DA42C2B148C48C647DA813EDA97F5D39B8B9CC8DE806774C5A99
+72BFC97D7F1D51388F8F4E4D31BA1A7B3F81EFB20DD597730427DB06500E0A8F
+61B27DFA7761110EAF5F5CA259B6DC97586421AF73A631866648B732F7A8300E
+9DDC21ADE33101788FFFCE3E9FFC67FD8A343DE64DFB53C575ECFF188E123C69
+75A4261C1735884916BA454D3EBD6162807B3C29BA48E771A731ED54E43E2BF0
+31DA4CE66B1CC113ED74F04964DA0B86EA8D3BFF1D682DBA606B6D6D0BF95544
+DBC524EFE702BC1FBFCAC129B31581D7807F762471999DA10374D4684E59AFF9
+DF7E03DA10D3896011C433A70889E42BD273FFF5616390FAC757B1ACB0444380
+139037855FD194E58FACA991E96337A8ACEE430875AA1EFF3B7A022D9E56CD0C
+FD5ED52EFFB79B72241963E91B1198A2E17745F07B36B31E1BC580AC24AA8B1C
+5E8F59B7E19FFDACB14199B5CAF4AB2EF223D59199B0BCD9C6DB2399A144BA03
+517B2766DA8D6104CFFC0B7A29B405C21FAD7B9ABF356A0149CEEC522ED19839
+D861BA710589FB46F2A52AF26D3B1E9D9664257FFA6594C524ACDD43865FFC47
+E52D2AFC3F7C4AF04344ACE67F36EDB52CCD754FD6F93482D351D8C114D02B5A
+AF11A38276CF1C8527CAC28B97427963542ED96B9E79D82C5CD157CF83E7B379
+F0044C578BCF872D940FC6F4B68FB21A50478AE6C015C18B69F01A5A5617D54C
+0321981183D5F53DD9A27BD89747FC8D8936F2251F2A9290CACADB37B584F448
+9FA0215B6FC33F5A12E5A7677AC6056E67A6E881D32B76879E77CB62B596B027
+275E0C63744064AE2E4330639BA92FA33936C30C18C4997EAEFF4912A8E11067
+359C434B98256311E87EB99760A3CB7ED90210172FD107D9B7881788E3D22DE8
+D7D58E3550D9A5CE0C59AF4117E34458F4628D734056751BC09D337D49629907
+732455C410D08877E333D0CA430AAFC7DC6DECD3DC2B9C5D382EFC464E9186AA
+3C747CE4BF15C775ECBED2C410E95E01D4B68177CEF4FDDFC18A43ACABD890A0
+99C27485DF967BC6298C9AF4AE53DA28DAC11D5B2B88CB5DC9375DBAC099D39F
+0AEFE1A15D8661B59DF458951F9A962851F7F0A36BAA5D1EFB36B8070A6A91FD
+1C229C611E4F0A20954CC4DFE892F45FC3DB43C6B5D9B539675A28F7F7EAADC7
+0CE005DC7E2B3EB5D83717CBEEC50DCE10C80C3D5BD889BF05484D27FE296F43
+8E67B1DB1C3858874955449F7CC8148930F85B2EB2ABCAC14DBCD75102848360
+434C53100CB9E0E227B1B803D1C042FBC72AA6CC7E968AD34F753A9B31045985
+F7B813CD552F3FE8C7A266013E54E661CC6E3357475625D69139489455541C21
+02E061270EAFE3B05FC5E40C363890799D92AAC2CD67D65ED6F8F7DE04F2BEC2
+E9925CF98FE80EAF13329579C78F938EFA6248144E3F04F0A815851614D02DC0
+0D2D62196135E06AE1154A2F18B3D66D1BC73D513425D6AA7B41B56525B59247
+7BC8D9A40CA3CDFEBF237C63B3E1EF554742CC8BDE9A074659449C96D424BE8B
+8E49EABD5915AC84F9D53F0A7FCFF6370C7AD77FCE2CC87B3B380A7A8C2A4AAA
+7D0E0AA4D467A7CA592484851760C94E0ACDAF42BE0A45E50370BB667E1101B0
+24D79BB4CAFCF86414CFE39B5E6AEEEC9466BF34F7A600E245016E8D8D1FA756
+1E45FF38E5B4484A6292496398AD3F191F7116F117E49C3187612C941FA46CFD
+83058920874109FDF29FF2A9F663D90F3EE75FE9549CF9B7314BBEFEE8499EBD
+CB561F6546847AD610C744F459F51A73D435B5BD2AD351933F8E76261D9A819D
+C65FD387F113DFC3D4FCF13CBB563C6DE69E7347252258C119A6147DD86C3672
+0853B3280BE2C0ECE83DB14317BF4ADCAE40E62EA1A295C693958ABDE0B544C3
+3B02DB82485FD45B0A5068F623015720F3F53BDBB9C8AAD7466A83357E0BA273
+AFC6A6DD60C0C9F98ACDD44D0926CAA24B76112A9254D99AD577C28D5D6E96E3
+386240AE572864DBD7131DD6C8892B79E0A3262EBBD68ED9B42E5D076DAC3354
+92F05A01C056DED791B9C71B1CB72A23FA86C96DDA2DA640D259B9C1F2E3E9BA
+3E115411F1CEE748013A60EBE3218847B20185419E1A8E1F2A1F002E4DA1261E
+5C8285E7C90C8A2C976C595868D43A6174968368186E1EA63DB4E9A7F7BF3F2D
+0685B921A21600B0E291700FC74B61D5F010FA467AA2747328EE08F94C838224
+E540DBEFCDA1FF5B397C868A11D9BC794D06ABA2FECE7C71F1E0F5F43D33D18F
+6E954D3C7122648C6DEEFAA185E220A37FCCD4848996E4C2E8570D9C91755C07
+D68DA8E12D814788B6C5CA5E1A2B76A39712A9AB568848A3B3BD4F43BE18915E
+F0C1EDD8A5CAFD3EF3E3199146EB1624AD8FF3A59A42BDCED9B2A4DB651338F3
+539BA9081C360F5B1F1055775B2950F144C41E93CCE158DA1BC638FF2D0A3B16
+AE48F309C87EC1A3EC548F55AF1A67C32B1716B56D70F19DDB3D8402E294C2F4
+8B7145400EC637F4E74A4A2C3319A19D2C8B6F049BE419B09E02A14CF5EEA11B
+F466B5BF07F0D25BA30DCBD7EBD036B4AAC76A7BD4E4E801549A2CA8C187CBA1
+D6C6E8F774EA237FC79AA836C86740C79196747ED857C329A240DF23D75F9398
+FE330C56724AC0D13D8B08DDBDCF922218C6B4CC175CD5AC99ADAC896B84A802
+B40D36B4AE9E6DA1FF99264B81B5BC4356CF8B25E683FE7E46C1EA3F3CCAF955
+D08145168C9051DB46B41D9A5E6C6AFC3BBE43B06F924CE25A9D7B63F311ED2A
+6B186DA5FEF9D468614918AC257745FAAEB3632C851F048628CFDB29C6F3E60F
+2C6FFAB377CC344542782671C3B06F3223E6BA4BA20C48DB3AF838B9115AA881
+61DBD8A6F278105B2291CBADD3E2B05BD72746C46B3DB93CC6D78F5786361D8A
+5AB534808BAEE7004E43E32CE00AABB15332420F25FB746AD50F8BFF19FDDCBE
+146449B64900B0D9E2877A6704C965FC444D05326392F006DF818198A292E9FE
+16AFA046317811D136E15B44A402B78843F3F4B397D285716B07236EF0FF2026
+BE9F30206779B2E1EE287238ABA302152718D25567C720694F8D7854155608C9
+310B9C4326892FAEEDE57B9E6AA558C1E632DF9E4F3642324194CE92F31F394E
+18D39EB934133A47C0CFA879585C5B446A3B371E4C331E728642C8ED64754205
+CC6975D7E395AAD0B54B68F421B49BE2DCE5C89395D40D166347CEBEDE8A7DA5
+5EB9F6385A65B176E7D47D875163E4B22B17E54884DF5B51828821673F90013E
+7F543E2CE0AB355DD9769CAC32347F5F69D71FA21459DF2AF5E191AC313E46DC
+8490A21791CFF90C57443C2CA11599D5BBEF581140A00BA471690BE5C5221FD3
+EE8102A8EA43D166F5F530581CDB3E3F2AF38C70FA7760EB6A2F5E53E1AE0673
+550178AAEE7E1FC5E4489478CEDBE4EDC181D1EC1090F6F4AF1B514629DFDB07
+AD3B95A20AC32C3D8B386875FDCB4FE166AFCC310EC644DD24CD051E0ABD8A8F
+EF3816236D6A8DDD7BA106D76F29962E535C2F3E5447A1F2CF445F5C8A588FEA
+208397F477DA82261A3B642837816B70FA39F82D9CF69D957F11D36E1C35B681
+37BBE843A5D1B6DD7E1ADA05DCE43C273E4B1F26293485F7930FAE7C9AF55DCF
+C0AF7444304BE5D68D31B3008740B906D873BB719AEE71A3FD41C44778E32944
+0A8123583530ACFA771E3CC02DC776FDD6C5A99ED857CB344E12569BB0F3B358
+B541746DB9BDDF953B2DCD7AA701984C05210B6EA6C7AD0D2C99BBA5A4E4008E
+6DE433AD469234776162F1E17095824693AECC1BE92416D5602585049BCEB279
+FC3F18D5C054901111E95B77554B919EB92A6C337CCD739D0DE40654C266373E
+4A2262401E36DCAFEF09CE046581E9ACD43F7D5417C98E7F4379827DDA2B8D6D
+A1F82179F7ED427C4CE78399B8C470C4D224E77BA2C57C4F262120B62217A3A6
+5B4C46504BBACC03791A3302A29D9F124FF7A08CF82303111AAD48EBCB7E62F8
+C8BF32D84F7DBC129A1B872096A3703C9B041C8743BF19B6D2B0B22AF820599F
+93181D0C91EAE7540E17B0718EA0FD3443D887740891AB8C4C2D3CA3C505B548
+FEBEED800FEF69CB12C8FAF6662EB15A9EE695424930BE8DC2FCA22201F033FB
+252F0365C2CB7352EA0400FD21F1F100DA96AEE410826D07F1A930C1E1094F9A
+E57AAFD332405CEE40A2D5159483E3CCC12C339D9492E4BE419CD1875B9E3645
+DEE7B00256BD144A5A743D4F21DF191A30ADC88AFC1A1401AB410870F874090B
+E98B347CFE36AB22D68581C47C30A8C6095E8163E1A88995DB89770CD427825C
+D66540AA957F6CFFB26A05BF1A5581B6E50735D101EB5301EE8DAD2B371A884B
+FF281829B836B6404EABCE30AF7F7EA135F0A7BE66E4F3BD2B55ED233B3277A1
+6DB62DB676980AECB2413D86B4CC2BABC18BAAEA8990267B7E52FEFCAD821884
+315182678DA1F36544CB16E0829C408843000C29A1F3221B120F14AC4BA3B18D
+C491CA354747E96FACB7DAB46C0115F3BE564F3435F7DE88536297BF6F30063D
+84AD309FF1AD8A97717243B29C7518F62E9F83DC0FD73EA7876CE05B6D526107
+7533EDD59066091B7577DA2522C1F29BD369C2AB20223F581B9C553A37FF0132
+0FE0971845D56D48053014593CF50EC45016994A36E86DA7D06065C8CA3AE16E
+5E860B970683E00F91FD93AC644D7114DEA31E6E9CBA1D76EE45D119DC0EF0C8
+39C3E9ED52C48C00B917A21160BA46CA3C7B33F696E3564486D5CC2D9388E34C
+CAC3BE8F7998DC89C3068F542B6D9D8D93E68AC73BA4A44E69D794F6035A2658
+27A6692346CF918338CEB7BF710200700ACCB43A5AF13E84865137FA8B1CF338
+AB5260F08FB5371FFEE92CC2D9BA01AA1BB93490FCA55C1DEF6F1D73D6D3F93E
+14EE07E85AE637B4BBDC546452C6D76B8AAC96288BE5723BA0E7AE9386476D10
+4B9A4E58C16EF66A16456135E14C3801CA43684EA28C58B9B5934677A71AF428
+29F1A4015CBB05EEB83AF5FEEA38FABF9FAF815622EC45486B489DE574084B48
+8A35739BDCB3025E8EB0F3A3D83B0787F0E6D599AE490455AB75A79F59AAA612
+CAC364F0C8370981A33422CCD2ED96402B1AEE1E90044ECA7250077023655D73
+2B75D1E0A7B4CFE09C00184DDB3111345ECB8F39C1AB453F19AEABFB5DA03217
+F5B99597826B9370CA481F1D15787BC7B4DC7C29D267DBC055C425F835F844FC
+9253C179DC53D60ADBEA2D2B2588274F435E84F40A106BA1DBED09407888AA49
+7D3E58A45B7034B4BAADF5461522871A139CDDA2B9E37855FCE7C0AEAABCF0EE
+E062E1B6053B1B6A87C30E8BEF2A7337BA97D6583651711B281D7D657FD55F68
+7052E9F69AF5D5AAC8FB2A63C560103392E0D9BBE5FE727C61BD74AF45294FCD
+093A8B2AD2617DDDD401AE3A9AE01EA4D1444642DDBA84031B4B5598AAD8D76A
+7E38EAD377237BB0BDE6E4F10AFA91501A7D177B07FFD936FD7B5441FDF2F3A2
+321D37AEF9DC0212B6F8DD3FAD075FB7E2178BE642E86AEA49BB2DE0209BC8AE
+DEF9FD626C27B1FEBB39E25026E530EE07DA0016DBDE509B02D7113906F07403
+CAE5A5A0DF4E9D890EF34E201B0E14E3C6CE229260B4A08B81F28D941C1117BE
+1A9476071EF84055B87B28D1C3B40450C89114342F42CB995AAC941F5B1E730B
+4919FD646599151EC05EA2877C22D5A79B2E8B8C82038821A63C4A463652B9BC
+29DD00004A701F89B8378E71810C615904011231F6
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+%%EndFont 
+%%BeginFont: CMSLTT10
+%!PS-AdobeFont-1.1: CMSLTT10 1.0
+%%CreationDate: 1991 Aug 20 16:41:43
+% Copyright (C) 1997 American Mathematical Society. All Rights Reserved.
+11 dict begin
+/FontInfo 7 dict dup begin
+/version (1.0) readonly def
+/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def
+/FullName (CMSLTT10) readonly def
+/FamilyName (Computer Modern) readonly def
+/Weight (Medium) readonly def
+/ItalicAngle -9.46 def
+/isFixedPitch true def
+end readonly def
+/FontName /CMSLTT10 def
+/PaintType 0 def
+/FontType 1 def
+/FontMatrix [0.001 0 0 0.001 0 0] readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 0 /.notdef put
+readonly def
+/FontBBox{-20 -233 617 696}readonly def
+/UniqueID 5000800 def
+currentdict end
+currentfile eexec
+D9D66F633B846A97B686A97E45A3D0AA0528A405DF15F03DB1C3DA8B850431F8
+0E5F73DAC973450D1ED0530313057E971FC7E7CA88E61DA6DB9A5CD61F0F76CB
+4DE9105D0627B8DDF51A655098229920CF429CDAFC3F7788C95E7AB30E84F840
+8CED52E98DB4CFF161D2E62B0D28CB8B0AC82E7A8D2C007953BAFB3056D66079
+8064956E257D31C13509FB81A250D9E875C77A4E91CC49E9FB3C0718B2F691D4
+B4A64F351F4DD68133DED7629B0D96E5124584A16FD2AC7A3EB244A934FF059F
+ED7297B0505F3C2994AD66A3CA5D2728B034DE94B64A8AFAF341601BD4DB5858
+C9950A8BB9C598B8960609F48116ABA8C007190AF0ED335EB5BF61BA6871FA5F
+EAB5A26AEB5C7C352EB80799CEB983F19EEFA801093F62086AADD0B80BB6580F
+2CF61B1390FA56DFA1A0B61C58DEF96BA767A8A37EA44730783C600706606C60
+4EE74EA99B7C0F8E2525C8847F3D31907C3C483EFA98F6C416B6B2C343DE6370
+52FAE423008D086A76A1FFB327CC7FD84B1C66B203A4F41582F4599A82F8362D
+38108452EACCC937FFC4F3ABBFE3628DF51367DA6BA3F6826FC6522D6AC5E8EA
+00BAD300FFB6DEDAB93237704202BACD030AA824B1E97C0AFE17FCE8C75F4FA0
+B8A74329A6CF1788C7EB34DA7307411E9AD7ED8D6582884456E06E033B4FFE7D
+CD4DD8B06AD01340CCCFBC382C18CA451E4C886B01D082FF8CC5793F4727C3DF
+B52B4F1A242F31D1EB79D1E39A1D4FD13D6C5E2A42AD4B4D1CC4EE7BA0E5F80F
+802E5AB57EA15F4DE44D82AC408AA86D4BF58EF967FBC6497BBC7F017C0598AE
+32CF865DFFF0FC7FF9E6DCE9B5F2F4C7491AC674F46E8E7660452CE0A77C1EE8
+00DE382ABED85350033F8ECB97398E4E0A75D4877A107F6A909D0C76D14F9A96
+8A6CFDE3FD9D79B6FD82693A9F354BD2ECF30C6D99F7AC522F8D6C93EA214F7B
+3D0ED77F042ACDE9414264C0698E86398562E2C640DEBBA0734AB4C3ACE3907D
+CC79E6B2C6C3C3F9B01526E8CD98237D4A9B403FF8CE3132222FA60C196A19BC
+A2393AE6935C0F8B67FC1D1A13507C100403B61A82AB0165B072581059B844EE
+CE34C714DB54843CA29B306D373EA67C2F6842FC3FE75898FB80AE43E689F641
+ACB7715CF595C8ADDF68D8D5DBF99528FC4FAE495ACEAC9E0B61971641EF17A0
+4015E263840C96C1F2ECC22A3368F9E0A31475185420560CBEE9639AB9280831
+69636C32D1F3E397FF45DD97FAB9222771EC4C50F45E8DCE4BB761DA258F936A
+1067924AD9A066E11FA841E0258039BF264DB97EA12311A8AE9428DBD5A0EEAD
+12915888C3BC3E25EF203BA7D30C9D7ECD8A33F72604FB9DF9DEB133671C993F
+DC7628AC78C3E93D3441733E247F4A364C66C78334B1C31FD803FEDC7845EC70
+593FC75B7833792AE449CC2712A3E054148A9EBD8AC6170E14C7284C434CAD61
+FBBE0BD31D7970A6C032BB9A12E164759735B18471D2E9E19735387607ED1E5B
+56CA84F1874F59A6797CD8181B0EC05F42E02F27A9F63542254DE953559CAD95
+9F4987CB5A72A329F4E8D07A23DEFA2C0A9C4CD8AC65E867007CBF7D0309BE28
+9E515728F9495D1B5F3EB89A51AE836937E548CB10DA7B969F7558DA4CB29E45
+813BE23A40849203DAD5C8890394F1EDD90074E63CC0D6CDCE6143A153E79A9C
+7556EA3C9D7CA44368B81DE3B5ECF4791A4E8955ADE6632B22972A5F8B5EC694
+1EEF90BC65E2C91643058C323CD53CC4059CAB8EB5930DE530817C6E4283E53A
+210C7BCD93B4E2EB9A4530932868FF6924106C3A889A9B0DA120949F9D24B2F9
+8B1D9EAD4F1B84CC9CA63E7E3154A6D42A338564B7FAAC6509E08F47A207F933
+6F4A1813D7958F62EBFED3361E6A3D45A2DC552FFEECD0F18E60222219ACEC20
+45285AE5EF96AF299FB42C9F516E6BA7079D20C9739D73972DCFF9FF27FD8D59
+8397137DEA913CCB5A678062F02008D5780F8BE9C7928F7F6CEFD68BCEFAE707
+91903D42A7068C81CFA224FD71380A04959471DBD86E29945D101B4388D3A602
+7C6D4064720146BCB85DB7184C77F01C1D5A0AD5538FADCB48D3B3C39602EEAD
+D7611D55DF777E114E5EBFBFDBBF7C77F311801F40061DC2CBDBA9F26FDD2745
+CC72A296FA4BB1E5CD41BAEDA4BCFCE3F6A21699F0C8349BCD63D9C21F268461
+D8F1264444E9F6FBF93690970E6DFD201E68D6991B21201990FCB84BDE9D7FB6
+4A4E752D97E1CFCEEC9AA82D8B6AF47569D87C2B3372575BF5E84E0ED1F76C9A
+6E6F6343A50F5728796F4EB21CE80020436D604A37608A43D74C1E8989E43473
+4469EB72EDE6B70938B405847455024F33E52134B08A3194F782F5FA47ED0EC1
+BB6CD75BADEFDE8155D1D9B7FA2BBBC56190F00A6CDDAF4A4CC7EEEBC0FE24AA
+7AFE725A4036C72D827D1D9FBBCF98313F2CF1159870F7A111D8C55B97DF77A1
+93D2BF77CF3FA9AD36114D778C7CCA8D1C32DFA37B298ADAA1758772B945A6EF
+90C44A27B6CAC3A3B4A43885E9F6BF14BCBD877AF6B498D0BD6FC1C7AD0C5962
+0A0327A291FF7278694DEE9E55E882D08D162C2297671685F9EA8BDEBB060977
+CF23C27B1036389C992B3FECAEC85C06816E9DC27D37CEB3AF8B1A3FFCA8CE3C
+9AE090A3B8F72B3BFDB2AC87509499FB0C5D07A76A213E0579B9B48269500C37
+2448CE37E0488008B687947345E1A934F79560A4BDF44C1472D18714192F7706
+F71A3A1ED9A6928E6609055B2B1A049F481B37C4442C78A6FBF91949B3E9EF3C
+453B442CCA9E973265604C673752465786FDE0BAECC038104A9EF6BDF2F2F14D
+79DFF55430837C0111E882DBF56674AE2C2081C1FA5558CF34C6F1B0C16795AE
+541725E0D6329A606FBAF5946054FEB12CCA4575A32A49625E8886A253D7F438
+E4C855F2F04139FB6309BB7147C7ABC18154AA559ECD0A46D70B8F87F5A322E9
+AB517EDD481831CF66B43A6DEEE50E150C19F45F7500F07169D4F7922FD24284
+93AE172849E0570942758D2F5C57B44FE8A939CEFE3E7D708FB8D245FBAFFCB5
+E6B51F90101493A58B7744FF0D135534A2ABD30E22F3541C7C606EB006277A1A
+046FC6569559070DFEE59180284A8717058C2A0C2302694FB35B619731A26E6B
+ECA6C4A99F1DC6636C148411089A56902F9381A05B97C9C657FC03715D34BD3F
+25FA9A3CA78D05C0EA643CFDAF8A4CFD4AEDCF97896F257068516DC6DB23F783
+2142E05DFD8F96ECB5BB268B6738DEF2540751595E1A5612A4688E0D0D1AF9F6
+737E036A0129F2400C05AD9F8D95B01A8743E72EAF700F4E1ACD9EDC1D5D0CC0
+733725A6C604ED2270E0D27677259609A67F5F59246F3A187A74FD2DD8E94F17
+CE32D65DE64C2BF9F5AE2230B0CD64769075B74044CD1237EDC3DBBA2A0D51E9
+5B45FFE2447C2AFCAED3647B2AB12B68ACADC5F3041A85F43BCB2E60C195ECB8
+54A5D979F7A672C978E09777EAED15A2BB20D08C593B327CE89DE8A059141790
+F71A34040F8249BD1F253568E2FE11647A66A9DDD647180BC39BADC5AF42E64F
+316EBDE2B19D26E24FDE3105DAF9F4CA01765E4D7E623D77E988A301458C13E4
+D0BEA87A09B2EEE7DEC079737BCD5C0DE724472800E03BCD16D8F9A6B380C7B0
+B75563584CB753C5B2C0C72555D16E638ED3BF3883047A71D7F9B9BA46F335C7
+90B751ED53836ACBB3DB9524A5F6E26169CC86A3F805C63D027D3D161446FEBF
+E83E2377F39D154881EFF19DADBDCE48D6F3100ABB9C5DC617F3BAB482E4F570
+DDBC1A9F98201E40AA149083AAD5FBE908FAAEC7281CA1AB5D1674DDB3F8E867
+F4E311DA26C71CFF71080B03844285754575C9F94132C6F43A92553E922BA580
+19E418AEE7E71432EFF5994FD43BD4FEA2B5C70480758115CCFDAE38470C8A69
+8EFDE3172C30D0E8BFAF666253ECA7A93AB5DEC246F6DB6562B0D0D9A585EF56
+342E6A2891370C21A4F428682A1C1684514266051F9875875C64745BA8DE1680
+68DEB7407C1DEA7DAF8F7F499F123E7948C1DAD3844BCC12C835A632036E94AA
+0C59E2566F2F7AF26CE5C87C975C481539AF17EC77B1B799C2C1C46C966496CA
+3947C252153B9303EB31C11D0F1415EB2B4DF4CC55B081E514FECD172D82C0C6
+4CBF6ED2EA9DAC8F80563743B20F5D4DEDA1B60629E885EA183DB5119A06C541
+13BF437CCD89EDEEBB8D21CFCBEAF5C3C1112B4710BE66660A7D3726B4AE5FA1
+E773A77E18D6B3A02A6065467D452D75DEA48803CDC1600C089C183E68F04513
+F35FA955DF440EDFC083ED21F4121FC2CBD01D3B6D36504142E7DBD5D870AE81
+495A7D4F4B8504F5F87CA7E246EE341CDF20DC499FE279D8EBCC218CBC0D26D0
+2836C1C124D109F2D697BB54444952E5AF538B6514F222F693DA2CE3BC67ADBB
+8CF143FFEB552224BB54C70AF45663B4CAC25BD25D514D3FC4D011EF9D5AA8B1
+9B16F5ECEE40488512E15798315CC2A85D604BAF68A3A3F980DD04A17D0E02C2
+702AE3E990DA9EF2AAC4957A3B6499771E8F00E7CAD3C207FACF32B372555025
+5392DBAB9E806F516866293506C3A0667C995BFF9AD8027FCBD2560E7BBB27DD
+77CFD1FCC7B7BB072234CC908D7FD87B1410008CFEB63AF0C4B69BF22B75BF71
+6C811369BC4BBF5F410D6C61A12239FD1FE25363312A1BC595028157A185E9CA
+308D7752DA09F6908E1C76A1BC08D254B7D7EDC295A6FF1658985D64DE0B9DBA
+BEEC85A884D80EFAE9A66B7B577AA734E7E662341D2FFFEC2851A2BCF11DC560
+74F28DA227F1F29AA27BB7088C1BDF4DB64490CE3D8D99F903AD9331161E118F
+CC75D0DAEC6AB9F63934371929EA2577CC16D9A2B0D452389FACBDE05B6C08FD
+70A66B7C309F4990BF21EE6EE2B3B7B9BD4EFCC8B419499D4A9C8120FCACDDD5
+1CDB568EB932C74C8AA9D52B5C7B61828D696B41432661FC659B122FF69E7110
+6ADC582B8312F1FF10596833454C0FBF05CACE8E95EF9EB53119C5DE28B449CB
+971F604BD8D7232C2723A155E37DD5519C6E959D365215BAC11AD54D30E42801
+B93423C8C028EF1A9B13773C624106DD59BA15F4252846B4D677F7D71C9870B6
+6AEF7D061AF2A03ACE5A05D050DC3B7CFA03E249C473B3D754A4570DAC910326
+CF6D61B084A54ADAA03A7C6D9B4A70DD94BE6467563A7B426A625C6CD1645E15
+23A707F0E2E119C1230F3BC3109EE3344962F90E37D679394AD3BAF2D557DD49
+4DC2AB31723955E9EBBC387154AA21F407F7F8F8423D5DCA8938BB7C22A65EFC
+C04D60083E7B001031B088A00093B9530A7E71BAC40A5CF652849A77F6999752
+246D794648F8D42A2BFE5F5E4297F92991CA2D157404B1D46851AB529435ED05
+781249F75606BE08CE143545CC8077B25DDD598A8DA2D679A4F4920C4345DDEC
+907CDAF694F6DCC9BF3D50C70E089BFF04A77A7DCDA1D76465D6C5D152C8FE5B
+6772AD632900AAA71EFFF3A4F90C9AB755B124BF079B98C0B811E2A364AE6A5C
+EAF99631D79BB7E144ABA2819811014301CE1C562BF38F9E58B2A4EA8EB8F72F
+4A53F5F08A7FA95BF0A988A62214EFA998AADA81E6753161E8B32B45D4209B5D
+64DE964EBC65220E146FC73BD34E4AEA2D4643453CF0FAF78EECB4B0539D36AE
+853BF4635A063EBD1C1C04773886CFF56A12FF6B3F0FC7C76EEA3BBDCA392F4E
+E64DF93EC4AF5D2528E66ECA77E134EC3D4368E0AD8055D782D5BCE2E43F5830
+F34AD1D64B9797DF1416046326290DCEDF3EA07175381A8C1D268B5A6E7C7C86
+4AF59EE9A71E1042EE5F23D303DB1B0A940D7C40950B4F7C60A78AE637
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+%%EndFont 
+%%BeginFont: CMTT9
+%!PS-AdobeFont-1.1: CMTT9 1.0
+%%CreationDate: 1991 Aug 20 16:46:24
+% Copyright (C) 1997 American Mathematical Society. All Rights Reserved.
+11 dict begin
+/FontInfo 7 dict dup begin
+/version (1.0) readonly def
+/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def
+/FullName (CMTT9) readonly def
+/FamilyName (Computer Modern) readonly def
+/Weight (Medium) readonly def
+/ItalicAngle 0 def
+/isFixedPitch true def
+end readonly def
+/FontName /CMTT9 def
+/PaintType 0 def
+/FontType 1 def
+/FontMatrix [0.001 0 0 0.001 0 0] readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 0 /.notdef put
+readonly def
+/FontBBox{-6 -233 542 698}readonly def
+/UniqueID 5000831 def
+currentdict end
+currentfile eexec
+D9D66F633B846A97B686A97E45A3D0AA052A014267B7904EB3C0D3BD0B83D891
+016CA6CA4B712ADEB258FAAB9A130EE605E61F77FC1B738ABC7C51CD46EF8171
+9098D5FEE67660E69A7AB91B58F29A4D79E57022F783EB0FBBB6D4F4EC35014F
+D2DECBA99459A4C59DF0C6EBA150284454E707DC2100C15B76B4C19B84363758
+469A6C558785B226332152109871A9883487DD7710949204DDCF837E6A8708B8
+2BDBF16FBC7512FAA308A093FE5F00F963068B8232429ED8B7CF6A3D879A2D1E
+2931CE5F5D18C658602059F07BE66E6EFC9239D7AB2FB8A4CBD41675B8ECF279
+650C29E53B14AC0E392A664848C1844B1CECBB2D5CFB72D0916B675C9A9A1E35
+F12696A6F628473C604A95376468E06E295AD6F76CEB939D94113532050B9D5A
+D2F41A9EFB9424D986612313B89EFE9C8A71313340B248F6853B1EDBF02B7F9E
+F447220FE131D7D54CFB8AA1281DBAEA73E665BACB1F164552CC0CEDB63BD4B1
+4A9AE8AC6FA02242DBE8DA46B64B6BFC11762F0784F216FC8B9120D688D1705A
+438B14F5E5DEAF2A98408B3B64620DE3732A4DAE6D08D5D97E34C75DAE19EABD
+BA0796165C1151BCBFB1DF8D29A63A8300DBDB9E3323CB82D0337598B83F4F2B
+A97CF5196D4D1CEC1EDB8966E548C0D9C194C932319610FB43EA1B86322FE641
+AB48770FF13BD475A7267E142388563D1A400419C585B22A9886074687BEDF74
+D905BE8EE440BA2ABF28EAB673399B7F129B9729DD5564C681954621903B84BB
+CAF89AC5ADB2932472DF29ADA2BDBDB4D05F65F28F5F4C529613D61858E0074A
+082A852710A62A147C966F2B85B51B0BE85F11D2057C66FDD61F6C5755367980
+9F4DE680601D4DA41B46F8D2148450000413C27AA39B586B74B977B25F0FD3C0
+4BA1EBFAFDBEC531EA1210365091671CE3C86A6D4BC591C37DCC02570042575A
+9D24252D6E01A8603753934D7EA5CAC1BE4E5AD2BA047DE8F3983B23A8A1511F
+B08D373B69E5076CE4300137B8805EBCC0AAB89BBB312A77835795E3C069322D
+42C893A30AD739E2BDD299679B158F7493764F2321E3965141B5ED1C6F4765ED
+F46D391A646B30C90002B1C461AEE79E5F094CACCA656CEA3DB921CC5205F328
+A2C69F817061D6C60B121EEE844CA5008F23DF08D999D8C635946BF53CDDEC4E
+059481E167C2253B9F7EE17916C028D30C626217C07D5C81CB3DA2E154DB5E3E
+3E812A739086F78F17DA8B363CAE0CCCB67D2814FDAEBF43DF0F99EC06DD6286
+D3E9216952E5416F39B2FAB5CF61C034D2D759D4BBA9270C30B75527A790435C
+4E6326684674D41BAEEBD0DC2FF367FD5E7F9B1F50668EB54DF00F6D0FD060EF
+580CECEFCB7B346839975048606CD88FD88043E9E1B25BF945AFDA309B1F93A7
+59D38F69DE485852109B8C12468CCB7E8757FDF71A4A941B11F0DA5643922EF6
+826E0855F0EC6B7348949F80D7D4734B08895C8C87869F612FC30D3D28EB8D9D
+1E79B7206E5C88E5A65C469831FC61994FBF7A6E6F2D3653FD6259722E05400C
+BDB34DA6F7E9B79458609BCA2C8EC2C0F99BD924EE5AEAE7FE90C328D2D18430
+08E5BFE7EE756FA078667201149F362918E52A75CBDCBCF913BA20865A8FAD47
+6A208F16730FBAB5195DDED6CAC43EDA6A697D2595A5EF262BF747DCA182C6F1
+3F561ED5C6BF8978681B815B376D1EAD4D27A33A9B7BC8F3FB317A9BCD83D9A3
+53404B9D2E52F90B52BF3749E1B269FE1FAC5C449F3E60D92C64274AB011C9F0
+FC4B1A12DD044036479AD76E44AF206A632BD93666E90B95FDFDB3FDE9975C5E
+5BAF9CD833D8FE18BF14B6C00927B7DF4F981F4D0982F7EB7707551D48C6D4F4
+9E9DA529FDCAB1F9D627343667C95D1F0EE6D4739A43FE779013BD61CF131046
+728073E7C51504048275BDE248EFCA8501BAFA0EFD16343AD840C11E8E93DF97
+73DBEEF3E23D6EA9F4285F4B40B76D09177873D07CB0AE21A5760049958EF076
+8B4F0BE92C0AA4B42E51B348553CA4A7D95AAB3E83D9EF3F425B7C19D62DDD24
+58AF2C157533F193EADB02D0EAF6FBC98A249AB08CB8DB2375841257ADA88D21
+3CCEC7B699B0776378CB8341BEFDE52A5873F871FCAA5401747A0B69942160FE
+C17190A7CC63DD4EFDF4286CF819747445A99B2A62F6C1FB61F8A334EA2BCF28
+896C3E0EAFADE5B5E0B6438A5AEC205208BA94B5B0B1F98A0DDE6AB389A05A1D
+85DDCE6D2E82CBEEBA36C21DD0B6D7AAA34C75CCC1C9C74509ECAE3DC0B993F8
+59A839F732F0E6F24BB0A3D324BF69CE4651594329FF786627C888F6329EE8D1
+CC2FEB58D7D516709901A873FA447E728A249922ED3DC0FCF0AAD744566CEDF4
+5AD20891E3771A667C625C1F5D35ACA12E607A500D2A512F9E1EFA810BB1CC8F
+00DFDF692892F94C02170CD1ED7D1837038E9381E6114FE2212E6F5366042235
+281C80B962929EC9A32D127C6BF290BB2ECB5E45292BC2354057BFC547D279C7
+7A841E3437FC69664069AA9509E325AF93D148B1D025DBEFA31C6CACEEDFDBB0
+EB57451DCD25B9D37534B4526E89825B0B750462A5F3FD0943F40560508BDA21
+63207D78B199094BC784B0277EB656F40309989C96AA23368780E8B5ABCA54CE
+6CCA1E86DC9A2F935BF5AE867A6CF511D0BB330406E90C1C5EB93164E709211A
+C4C3BD3DF34ED4AFDA4270389C8E24D87BA370118C827AD1AA7E9D64A58813E5
+0233C0F5ED34862DD74D805558B4E8983FB43AE7B64E3F1955BE2B32C1157407
+801A0FB59E2B2D6F9F16225CB8D4E10D7B7F8C90C06A5492C052318359F7F0BC
+4C715A3C21D7479D8C290532061061FC9981FC5B8A8D01E6571FA77853BADFC7
+EC9A89F16A6D75AFE20E0B31B2A699BBBB6C8FE2A3CB43B2494BC6CE39663ABD
+D4789EA15FE947A5F30D933BAC442B28943BFE72C66FF26384D23306454040A4
+72817FF4087220BAE3FECBB5050E2D2C206E5AC0AD978E6B59D167F7550254F8
+15FF785D7F6EAE5177853F4E9B3FDCB2A0CDA0FA67D0A0F0AF73413B1CDBDE29
+BAF76A74508DEDC3EC6533101611B3AF3FB854021BD89D4F595817059A5CFF00
+CEB4CC210F7A920446AD9C83E5DD84041CC13AD5A0419CA99FFAE27C2FC69971
+4DBB0F1AEA6D8D88605C4BCBBFB93A4E52B7E0AAB3DC3498A86BC4604D4C3575
+899B8B48BDEF6B13E1CEC5B0A9110ED9B1E2FF42F7F17076666EABBB12110BDA
+D88D8938B7F61BB974653DC31B448784EE202D733874CD81BB31C1BE5C78D906
+1408C6B030EDAE6C39E6ADDBB7846CBA642B5EA337A6DBE8E708468E1FC94C2F
+D0B890092E4197C86AEEC94E188CC00EF9539548FFFCBF41C51794E79A258F10
+39348798B2FBCCF53D786D3AD5D2C6C9360B14177E8C1C9BC44CB9362C938C0F
+C09F6B5E959F0A9E57336098454E62592F356B40D05FD132CECD9747DD11D9BB
+5DBC68462F9701B7AD89A3A9DFEE129745CD92FC7A3CD14E1C385D3221CB23AC
+A6E06A359A7E1443BE82D929FBE2331349FB97FA3DBAD83254A92E22D6C95894
+FC2CD2245F41D24A844544C49DE32A4F21C661690EB1C6A1F7024B4A427A6D6E
+6612157ECBE211C3F2E4A7FE08A9D5A219FEF5C21FD5AE9FC38E6DA6C5AEFACF
+A236DDC128EEAF37CFA58E9DD31968ACC4540809D083EA27CF261493DF467FDA
+614870CE334A5876BC87020F8BEC20C12CD808E431E6E1383158D8B46D2511F9
+0750CE5A4A07AAE523390230FEA3511D2230993C40908B61B42C50EFF921DC42
+F22D7557BE4ACD616B196489E88707BFFD3644C2E49F015D2B8BA75A070EE256
+FF459F1B41788C61592AD09D22025C69B1231C9A97BF59C567E651AE86D80428
+43A517362D5B0279F76183E64767CA065A07C82588612CF5691340F649D3ED54
+4EA7E71CBAEADD51614F3CA74A6A761D9E1D19EF7E76D34E6E74347C7404A22C
+53C887FFD6F83EC590A626BB72B538B0B8BF02839BCF3F2E926A84EE37A536EF
+10C079EC0530B59355EA2AE74707F87860185E01A6A1578EAC52902703131EC8
+4115BB2A18F6C062FEA1B16A635CCE2467C34C34E197E89C45A8633FA5F7EBA5
+475857805921FF836D146335D2A0C0F665DB2B880A4E1ED79F03DBB89AF73F18
+07FE54C20106C118FBF8A410AFF0AFF397E248846580B6CC3C42A50095D221E6
+F6E2CE4E880AA773B718C89794E27E6FD1D20287707819C3668B0AE01BD7B1E4
+761554462E05D56E8A259FC97AF94A2BFACAC574EC90BC08B3EED027E8C4CA46
+FA54E53CA4794F99920F6494CF6EF4C0B6C54AE303EF4D32F27F2676C7CE6268
+51940C8FDC40BF16DD4622D803F232AF0255E72A189222F4AEA83E4597E8B9F0
+C56DB69A5A7C0CEC09BB794152054BBA9844D936C6792F9EA17319D0C69D8417
+1A8847562AEB2E433CA94A4341C8781B5A0702C469049CC94E028E881B0B5D4F
+89C3925919C7577B93C25D67D8C093C7DE834A3BC0131394740996E4D6B233A7
+80DF5A380A78299E92DF0FF33E8B8C0E9E81283EFB2C284B8F18439BA4CEE60D
+9BA146A69B57CF41BE979E49A2B90A878F96CF22C81CB7510D56B9AA2B6E60F2
+02EEBBC41A5A852607EB5C00BCCDD117C162A5F1D7441FE4260901D9AED49BFE
+2D9F92B8A6A1E6401BA6224C67A6FA778348EED53ACF1E76E61AA6159A2E9543
+262B9EFBA99819B1DE43D3CD4D623CF8C00515292056AFEE78A2B351D7460FC8
+F8D49FFCA4E45AB4A12FA0CDAB25E084EA60B40B660B8F29B64F0B0C04F38D89
+C1AEAB5C160C90FE0FE02836143C579B76F9C03828A6417098BAF9B4C85FEAB4
+4DCE99E55643ADC2677025948FF1DAA1E5846A0875D6A463BCB4FE13A5AEE274
+1FEF59E21CB0F17DA28BDB4D2F8D8CDC46704A33E990FA9E4B50B3A58606C36F
+B10763DC2E4F50981EDAC1B6DCCF1415D150AC0D97AD7C415317ECC4B6B98C98
+240F9715A25F992A1B7A4250BD36D205CFB3AD2F3F153205B5083916C5466B25
+BCA0D30D5F4E3C8B08D7B3D3597FD7E931FCA30162A86B7305AE9C6AE03B909E
+AF9CE0909560D719136EAEDD8B2655644FFDE826322601E457C7A0A8F73BE730
+03506BF446383C1594DD9D294390F35957FA5FF5F60F8DD7B66399D808F23DE9
+0355AFE0A04FD60CCA0E56A3A4BFA0DFC316C8B1997682AC063DF9E6C6F66EC2
+E094F98F5756E4A25DA6695C71B07F51167CA66BC3F432D280094E1856CBE89D
+B349ECE305C9EE15067D08E4A64EF4484E792A6E57EB2C859A42DEA616178A80
+132C796CA06218388BBB5EC4E262F1682C736B7BFC06096508EE75272A7B5734
+8401507757861EAE30F5B1BB4EBC4D5CFC4755041549D675ED0F08F84BE8804A
+C28CAECAF527AEF5172DBAA077CC0D4ABA31A2A58940406FE0D83A0EBF0F1954
+E621D43E6C71455AA3471857C08E5BFB0270A5C991BF7A13C2815BC19FE4DE38
+3C0201C795AA113648425D04FBEF58A4FA9B39C1B4CAD85D07E5CB402A41B015
+04EA0985B6CC772E401B7DE1403FD88D4E8DD82424200DB7B136F0680289010A
+379AABD0DDB60CA784849B9831500A7B56486B66DF6D18AD92A8705A7BB7A422
+6A61700058187DD41385DDA283759C8028C6E6F08D83F8CC701E58BB22D8F7CF
+FF88802F9CB37A528BCC6FEB7483631402B1BDDC6C1033856935689A29649154
+2290057E12AC15AD1C1FFB6876033DCB14918F2F14508612C84854263CBB9971
+1D83CD39EEE4CBE8483F8296CE20C1960241B4DA55E0B865B822E8C325390786
+18ACA7C548ADFB111F2070A16883075BE56C6684E3809115135744F7E5651106
+2EE5E6A9DF571D01ABACB23F6FA53555F1D1CA8A8BC78D8C017ABC45D2BA37C4
+8B0DA9EBF0B505FB34678C43FC1862DE21ABD217A96E869ADC14B416A4E68006
+2D5B05B8CF9FB94BC82DE73E420DB1DF38EB58B325AE3F2181E508B7440757EF
+A743E92B76EBD90E748E9CCA53D3FEA9F317574F60706E7DB8869DB5D4A10ABE
+6B37AC6AF1CECCF9DD6683E0BBFC74CD76145D9CA3E18930A5E116CD8650CCB8
+CD0AE70FC9EC9BDC5952E41CD2CA7F274E03BE671C0764FA74C3462902CA726C
+296F3B9C4C7A649AD23E89D1D79F4E61872BF34A5681D14F7437D876C9653F11
+5A6CFD1C92398579F5E6EFCF85346A95D1F1862C6E081059A116F2F4B0BB0414
+5522AE3AFAB5C0419A21D158853C90ACA8816A973B1D3EB8132583E70D9CFF93
+39F093298182BDC1D2F9BB3DCCC5F1A697E779762B49771E357E99E56CCFE0B8
+458D8644025AB81FCF125574187E0D975EF42DB0736EB1D9EA27ECA4FBAE87E4
+1DE9FB6E9D3F42638048737DE6C89A4E0EC1A21C51A577785CA610D9C201F205
+987594ADF811D7CF5C7B78505F296A080442134E4F60324BDDDFE5D7458942F4
+FA99DE4CC8DE3B4622C92F216ADC31816E7E1E922E4EFC6887A4BFCC28C4A790
+BBCD0BBC12B726DB85BC1455A8BEB843B32CE2A7AEC5F6B066C8D21D754F97B9
+8E9DF5F61AFB7B94C33BF8BCD218E726F7243A5E7A64390B70C95135B444FBB7
+42369397865EE5D9B2D9B575877ABAC9C6CE59EE395103E14EE1AFDD31701409
+8BA2BB985468960AAB94F462798F1B2B86D2055BB47C84286345E51C929CE8D6
+58A1A083E7A23A63C5795F3C4563A5D7D7A4192289D43D518F52A23784BA0DB5
+F97DC933EB78FDAECF9BC9F049AF415F9EFFB0AFD2DE84BA8CD4F63CA5F6C488
+73CC3625D497200D7D26EAD733DD62E5638D363A9E34EB8463D4213E746882F9
+13E8948B4F1935597DF34BDF3B20FF3660182D8695644138C3AE7E3E99E79755
+CCEEF6F8395536C29E675D3BBBD24C1678FFE64E356A86C142B33E3F921D1E62
+41F8C698C13A94209D1876E090C23EB9DDB670F2BED3D4F7BD5CFB8B40D8193D
+22B051F65EED5BD47E1D788B00E9F8CD717291F2936F190CDF798D47A4DECB4C
+7CAA1F85374316B1425B76C0723EF4B73D1BEAE5B7D62D7779BF6D2EED8B5DEB
+7DCD1015F8A75D6EA8E0DE412328D443CBC9DEA25C8343DED3B3C7201ACF32DF
+5E7CA143D3EDE9315B199364EBB83F79C156B44B4AD267EF71E39A570B951453
+36F971775F67DA78449E480D2CCAE56F1CF9BB502217060003A54970F60571FF
+8C4211FB591AD10D37A88E368D70F46F18653A5DE3794834BD80F96678BE1B87
+F587780357A378F9B9BDFB13915F38184C51E127B26D7587005190EF2CA8106C
+7062334641CF3AF71F084D7383FC5588CF0AADFC995FA89899497611D1A06BCA
+69917F530FFADC98F672810CB8524E7B8B9A81D6E1E636018ED9C6A511C81C18
+94AA72CE1C11DB0B8154C12B31DCF28B2F7EC49949405BE689F0C54ACEDED54F
+F7C13099CB92B197DB63C1B539BE4206DCB1CE8E1ED725C87CEC4A50AE3C85CB
+6107107DC5CA03AD63126A049FAC98FCF5EB23E744410065B519E1354FB8E150
+B3EEE5A201E465CA3C271CC74885768446EC8A8F8C0DA1A389853AA8B82559D2
+A70F4B4F04C80F0879440F70701247B9AF44AF66A9BC378373E7159E46D5C4D9
+FBAD7413E1359D52CA29A8AC6E29727CD5A65DCDF073CB8CD7709D5808B13E37
+3E5CDD794F5E780E169FEDBD1918C71112FCC4708EA9F024A7592E4B24EB2892
+053FB730845CEEA345E5CD538787E5AEF5014E5D603ACABBC5808FA630E9CFE0
+E27DF84092AA6C913F01D43878057A46CBFCFEDC4E403F2A1EB05A0FE0E138CE
+87FE0401623EAE6135D6E75F695BC8880CA14E83AD535A6A91FA5B3E96A0DA60
+771839FFFD8E533961E9DE55E203468033F54CFAFD876A7BE8901AA5302FE8ED
+20F7290B4FC341FEA326530ABD626919ECB6DF8995A534631AE68EBB84866C29
+E7BAFF0D8DFABFA4138F10EF9142C2CB6ED163C0DF31594D0331B254F63739C4
+9C86287001B2E2DB0C479720D629AA8DA67752ACADF48F7846FBBAB7126FF37B
+5FA478F0CA4329CB167693CD6E01BCC5F45B14B4D8D939E05493A313D91FE691
+620B176CF3D98C112B74E05AB5FCA5E4927DE8363FBAA3439935CBDC02DFDFA3
+B405E769CCCCADA2156894A9AC8D9E5064EDA098F9216A36886421BDAC6AAE7E
+9A41A1E1F8D06EAF5B2634C421F83F3B393CE9101AAC1CEACDF1A8E062BBEB0A
+35BBD77311DB45D2DFE80C5FC40BA7F164DA6FDCA80C42BD47EDFD127BE6C854
+F8B7C6183C92635179444246239471F53A07F9BA9624159E4E5B0E62D3B6A325
+51CB065E3A70264EB1643C682B0BC8CDDAFD999C4C5C49D0C082C7508B10CFDF
+0B97FF78F3A7F2FBEDF798FBDF73FC049A4102E0986BD80E0A8173D78F4FF64D
+59F821EE9D055103B29C8EF5ABDAF4B7703C93F2F51F3501723EC21A18256319
+34CD3E50796351385A0F9E5D2ECAA2035BD818DE969E91BC84F9CF728D7089F5
+5EF6D436FF1B82C1EAEE12918614FC870FA778A6997824093E0C2F22540ECCE2
+AB9670D0300ECDC0BA5773F3EC8B5A5B0A1A7589B582286769C2E1B84CF79561
+0ADDE0B1550181522EA254D719724DFB464D9CBBB0265AC65554A708C1B77C20
+532410B1398105EF48610E51F7674E6FB0A36EC7F578636E4E4C1463FC099CB5
+BE569EDE7A60C017E95531B220E3CA0E534DBFD549A187255A77A52C6C77294D
+F6DB3CE2AFFA9512294AB88D753E3924A5991BA8B458A96B4FF576C8F00E06C3
+6936DF540A4981ED013EEC9B56C47B25641D639CFB2B285C05E2441259546892
+02BB04B24AF9AAE71BA71D4A9BD6C8B8FFAD0BD41A6D4CF9CC6C20CF5B8F7358
+A87C170FB6DAB203C59A96D8B68690C92022F39A70F883AAFCB078CEC81D2A5D
+BD5C3A391ECAA6228C43F2E406B0579DE6701CD9AAE58393F5E7F9E56BF195E3
+1F76B78F4710167E3D9C19D7117B2E0203BE1763295063C3FAFC0F7163BBCB48
+F6A27E229696B92D877C5626DE87FC163E3B0F590B0E3EA053463F339C814882
+7D0CDEB24F14E0C1506CCAAA1CE4B14EC2DFDC4A4D87F5B42CDD079BCCBDABBE
+21CCC132F23D67DAA62DB74529B4FDE5EB634F0E3FD77408BADDE551AEDE6937
+0670EC7E277FE19BCB4B36B4831DDAC191A308CCF7086C04EBC3C8EE6BD1687E
+9E678D5490DAD1A746319CC33707A386316C5152C4A7A0164CD463670A534D9D
+0997BB2339DC30D328753058602C3A0FA9BF508C0D955C8BF29D2331B272FB07
+5E365F2A04A74594FEEA5CC21EFAB0C5EA5D602DFCF72E35ADB36F9F5B75DC79
+97774D3D1FBC40C9A0E2DA75E81436F267D75DCD4C4FB814E380F118C4F5F5F4
+15AA464E902740759E922DB75AAACEB6BD0499FDE4DA1453B1ED979AF9F18F38
+A2BB21E4140CFAA1DA2CEAF997F4086F34BC7BB2DF69FB857E21576B5ED55511
+3E1113F174994B4BA18500443766AA8285482A391121FD99CB940C23625911E3
+6553A363FC97C4FE91285BE00A8043517AABAB1B276B0050CED46B53A9EED1E2
+078749595463C192B6442DD82E4FF60A8038F9279B504FE6415AE3E6D380E612
+BB95CB93CB48E054032EFFD4DE2F3E0B2432A6EE6A9245243BD61AF4C9723F14
+26ED79C4B2B0A8AD2DB51D0A61768B3324A2D896CC47AD1F49B3520E312ACAD6
+F485C6FC31263ECA0ED87F39D13D32F5ACB9B6406CC928BDE316908106D348C2
+DCADF8C50737F4B745BAB96E3C668B6F5CA01274F4A6D16329EFA2E2A4C4D08C
+5DBE3020DE859BFF20970F5F5CD0AC8D7F546AC164B2A422512EF01273DE9283
+AE697E98738A08612E06CB85F8DE09049DB661B000380A3EB776BBA8D4058892
+EC83E019A74E3BC8793C7AC7F370ECA6FFC8EC6355CF4D8BF19699E2CC2B7670
+DCD34D5916006DB7DBDE93D5AABE5BEBF20C2B1216FDAA48848C4A704D478771
+415B1A6BB2737CCFE9CF0E8FAB134A6DB2540DAE86EA3150E051172B87C62EA3
+4A89FC2916F0AB0941D9590BB8DCB356E1F2AF650D2EDFABFA0FB359B6C4560F
+9F1D3E467685E3CDECC6A75272F723509B0410D5331F76DA8315B3F9AD8CE15D
+88A45A535BD433E00515568A1ED887AE4ECAD35D66FFBF8508F253C1CC437BB0
+F0D7F17FC58D13BF7978387C65261BE0CBE9EBC9CA9F241CFF2C03A37CA9DED8
+27E4B64508FEFAFBF1F072D9F7C4C552E4431A4964B1872D3A7DF842B1890119
+03C0467D143A069A0A83FB619329FB8AB390CEF29E76C3B6E488C9C786B0AF3E
+CB0D8EABADFD0C59AB5A7BB8E19EABC8C4DB1138E37A902378B6571CCA48171A
+C4C7D04527B76A317174E0DF7DC50CA7DC5F4BA0EBBE98321FA5A7BC4E9167D2
+E2FA85F9AE8502A760B62838BBD6930596C59BCAA879ADE70BE761384D6AE09A
+9B0CFF658BDA93584A31DD715DD1718A67F2D7F3FBBC75135B90C90FA4BC8EEE
+F565EB19A1E92C67085D57124A85A6F6885518FDC363072E82A7043C444E2C8C
+144EA64398D5AD4039D1F228469D5D0EC725449D2D12D5DB3C8FB9E38399C7A9
+4A80CEC20EE84E3FCA86A4008073C2D6EFF3D7ACDE4797C6146B6ABAD6CCBB09
+99EFA2EC0C742F7120F05187E6005EE9203FBA5CC4BE3AA0E7CC707EBF5BFABA
+5DB5E786FC88CA67E06F6D504A7CCA4ACC7002F48A0F0C48903EC136850F0495
+4D042D2E55077888D1531C52AE927AF7011D311CBA1BE836DD755476578966A9
+D3A57A609487750C136DF0B646D8090BDF84474B5B545A8C7A6DF1F3932D8433
+D31BE5C587F84A7B03363A3AA801574F210D44C7EBC04880F67BF44A8173890A
+4422CDC3F3F2C15869CCCBFFE19D912A026FA8992AF3A9BC8284CEF8D1D5236C
+C6038982C697C9770CEBB680C66B60D3E9A34D140B5C6B840CFB5C99161E7D3C
+7B9CF4A7D1A4C50E247E1B8A383A4F2E8A4F62DCBAFCFBFF0E8EFC9C0F35153C
+332E1214E9FBE8BB86AA65F1D9DA16B616B8C781E62C2FC61DD09ED83C5F3664
+28C9DB214AF5DA7A5642C0EC18BFBD099D46AA66BD4D36180A9A27BA8007ACB6
+2FFF27E8561AE693635014DE406C91C0F62B5D9CDACC4AD391889315EB536B90
+80F1CD15954C19416F20F907204E7D9D77346E9BE3B621FD00034F57664FC8C7
+1B164486CFFAD0B0475BDFCBE08D5FC6E602EA4BBAE13B0739E5E12CE867B110
+84248EEE5A98819C2213D557B61F8673F75BDB8B30EF39578F46895AEDCBF4C7
+FA865C930C810217322C383CFDF7C5DC75539543310BB2B2412015689CB6B185
+C2EE7990D16322C569FFD5A984B62C9D70789CDD0EAB73B2C1B9FC4834794457
+B27E1967217CFF0651D927E80A97F63A264325F3122B609A5DA01C1370568995
+8BFBA22CA4E98C0F52F6539297DEDE027B43F7C497A266EEC2BCC41580EC4181
+C23CD495527AEA370920A6C7F25739B934E2A9C369AF17C8BA1081AE371ACC64
+93130A3429A3E7488FC6DCA1824F9E38E6683702F7BE40D8B94A8B26967A709A
+3F072207F8F5E5D3DD1A33F48FF86AF9D7A1811CDC2B514D310929D059B78720
+83AF376F2D28306A26BA16DD0D2D03E11219A453A299EB7BC67008D3437378F0
+CE28C0A7F76AA4269201ECCF9A41D62D826F8AFF629C83F8286138609E31B6EA
+296C8FFA32617DA4327D29B6BDB26AE44D3C2A2682EECCB1A3D9BB58024CECA3
+66135BEB39124B865DED7365A4203F98FB75A3062D538D0901B3325ABF1A2AC5
+348262D968134AC8A65139CD3F60512E9AB6EE562BC6150A2C82ACE44C43B6A1
+9B1908FFB320BF7E6E2692C3E9591E302CA42E8C7D559AF6D46C15DF3021ECB0
+ADB9D8772AB897B00C603EDB98A1AFD99F224262410CB7AAB3F80F1A07EC99EB
+398F16E0FEA1932A344D7A6D92DBC26CD262626ACE8D617AB8FD883F2000FB5E
+62AAE6E450A7FFF2ECE3069FB0F58696B762F35E3F551E4E8BF2E0BCA256EAB0
+E1098DFC31D2EDF4CE4D7BD6A478A8CC74A71C4D2B54BB66E534731447375BC9
+B8077C2166A8C31E14A73EBAA23325BFE1ACC9ADF4C6B9D5339DD8FFBE839709
+0A27E30840EF99E72E889F61B1DAC331C871CB2F14A297E14C77723E9192271D
+8082ADF61193D6A42FECE24A285BE83437A1C3897C2BFDD0DEE8CF7B606F32EE
+BD002CA9D590C5D12B49D05A26018C453400018E08FE2E3B4450B78CDD613F69
+60BCA4635E34C5A4E3C02930E37CC8A6E778082B14BB5C522002CC74FD9B21C7
+62A519F2F9D98CA11563D4817191A74CAA80897D68ECA8E373E820175F38F268
+C48B91276D0F41022E4337F8229B060858AD44B163F9E56ACD5539B2A9934798
+27ED0063058416854C4A288424DEDAAEC8BBBCEE76DE7B443D4E2D6F371CF670
+96655CE9B18EC8CB5024D84825FB6F2F8C831855BEDB0B2650E13F947921A91D
+E728C3DB8DC0CE25A35FF4DF2400ADE317AF7CAD468C3CE94F647124747121F3
+9629DC9EC2B8BEC5E29C0161F4BD6567FA681DC4610F878EC3DD1C8047758127
+5837BA93CFCDE473F470ABAD9E5396A8A97D78F5A3EE519A51FB172A72EFB614
+77F51F1F55BACD353FA7C830D9F7EF9974BB27CE478D68E2C11310A8A83BC7D8
+028C165314AF960F45CB8B8D1610D4014F9B6DE03C8CE6D0BCCA6373A7535519
+D52B7A8447337A4199AD5338F1B19257A2C8948767EAEC66B1DC839D679DBAA3
+025D9A12304F0AF9A621A03752DA6FCF6FF8F103B3F8AAA319C467D9B0BDDE23
+90FBCB5A9F0E53DF354D181A4B410153CC5FAC52282851EC97EC6877674E9411
+7907DB40999F33CEABB3F9D73A8FF97C836640644904A60216A09D3FDCAEDBDE
+FAF13E7885ECADF69B3B3A8C7C48BA5EE9DB4BD6641A254B1EA03EDA77185954
+DFCE6D7663227E2A062414CF06B7C5B4B1CF54A7B2866EDDD893D279DC2E2DAF
+FBED736E3A79A72E602E4887CB0D67FBD1D2996EADB75C48F9835776AE604FBD
+1BB7120E428867967A1FBC57994DA71C8E8D3026A7F2599C072DFEC0AD08783F
+946C382B6C134343D4BFB86D23AE5025EA4B36045B8CD72F0C5C60F404CC9F69
+BD8431150A6E598118A1555D87222563AF1BF8586A99DC57D57BCC9977663927
+0BE9BB80703E1DCA16EB9D3F4875DF55B6E1444F71583259E1AF45621DB86300
+ECBA0B07FA9F73FC17799EF8AE95783C168E4ABA576D48C8005CB8F9AA012321
+3D3710987E0F63A71E5FFA0E19365050160D26D2BC4BF0DFBCEF5CC56FB8867A
+CFEA19E4F0C335D9DF403E52148AD098ACA0DDD9C02546B36F06F6D3F640E40E
+0742315C2D9822072E7A6F320AD549D6333DC707E7EE1EF45C34C422FCF071A3
+5C4AE5D9FCD4EC778CFDA048745B741BC17422367EFEE454450815842FD08943
+EE13C6C38B11F8895139D26E7C559C68E8C8DD827F759564961A9157B4B98517
+B93A55BF2744E3E92CB12E6E971C924EF183AF4A683D345F4B20DC378719E8AA
+3E05DBADA8FBC490C1963146F8C057C64FC894B7A14606E1DD0A308B13D8EE86
+4C6C75FF68023995D33E113A5019B6D481EA33600429453F47815F417EAFCACF
+6224BE0B3012EFE7EA729E7A4311C49A0F876B739F35B8AA9A8D6C69A4AE35AE
+03BA6A731F7DC08BAFBD7C4114FFE951593B4D3BEAAE057E450F43E143B82555
+574B05AF742DE8D42C9A92D32EE480CD06671C642554B440768B071E7495C8B0
+2E8B1CA6F1FAA2FF9EEA25065E1D8FC32446CE916DD1F4175AF24ED37D24BCB6
+B55F5C81321A82A11042D1C01A58FAB6E649B2FDA27E258A235D6847B01B98D0
+CC9B15A30C35874E2B5A0976B232A3F549AEDFD7B1A4E11F1A21EDCD65214BED
+38C7CEFAEB6C9D36517908F5DE580781FF13C11519244CED34DBAC55F7B2349D
+6ED7FC4822CDA966ACFA78AB532E76F8F8AA50C2AE5C33B685AA33CBC5605222
+7F1B46E8E1281F39821291401DB8E68B25346BA84696AED6C6800A7D48B310CA
+743948B4EC7F6C21E7E0932220D3B3861F1DDE667359B510AE27578E4EAB1884
+84B21E420ACBF0717D031FE5D8CBF9AC103D5616A29B46469A5182167AF69713
+D4DE5A1E6B269779FA834A39CDA83A1AF169A9481CE31B941F40D2AF7128D9EC
+0AF513405D1448E329C041996901161ED6D4F7B8E6FD2044B7B355ADAF5520ED
+48C4FAD1394E6D03669D1BBEC48808B89B465149FF642E76C1605A39AEFDA61E
+0399871189B0612305357495DD4D72F9683A41E334FE8213D40BFD8630B4C71C
+A1601AC3AE2533B31D39BA2E70B585DB806E82D8205173100C468F5C2302637B
+CF65E7DC255DD861D3633CE2541AFBBE0F6D88735EF80F48D95E9914A797B4FC
+3A78488EB034B7EBD7AC0EC3B1CF4BFEF57DD9E3CFF172FF38D9C9690CD75E16
+CFAEA6105902810790E602842BD16436B158CC600D7C49942F498A364FF47FFB
+A6678DCDAAE1EC32FC04289F070A93C192F172190DFCE5BCBFC13CFF1BD72289
+8DDC2CABECFDB9F7DF9FED80031C7805F52C3D56080692B2DFE103084D9CF109
+F41E3B1996BBB4934AFBF6199F6495F5E35104DAF1873BD33340DB4E110BE18F
+C67EBC1B79A420360ACD2554C5C29D8357CE6E681D767D0BAD46BC022F257C90
+5801F7A52E3C450D164E7C303E6EFB6F899F115DC1BD20652505F6F733183F41
+585524AD75F9A90DDBD46C5FEEB77BAD89877C663EF5C8D3D9050BA851F2E9E2
+55C8CEE530CB81AA6E303CE0DFE240334570FBD39A50714EF05E1844FD338648
+F34CBE3B92CD718270610603FD3AD63A5030CF48C2E3AA11E054E105EE054F12
+2329B7966CDCC12D160739EF5F94FF7069D508AC3801433EEDB02DB57A9BD9E8
+5191875BB9EF249ACB52AA1D8EC2D4BD27998BA65847A929F9C4C03775982D15
+A5F3BAF94F225C0EBF4524377307383331C668A82D552949B61A3A3B3EDCA39F
+5AF0DE18F09CA7D5560F1337B7E5090417C7CAC2FE4459A417B8D4789E721B8A
+2185C1F6697E9FD0B640BC0B04821C93E26D2C01EAC11C81CF376F508CC4C9C1
+F0E81D216D959A130C5819D99A50DD9CDEA60AB95B7024E2B5A4A51EA90924E8
+5E825ADB2F302A04B2BA3734622DBC9A6024226C3E17CCF4B89359D08DA35C7D
+EB8945A40A1818A9B3D3C8456A9837665CE0477B9541BC11C05B6AC8F430D3F9
+1D106FE932BD93EC002D46AFA13F411C5FA6ADF3A44C6580510DEF798D119E91
+18794470FA5A6694F68282BAD136F0705E599E2BBBC79350902B596DC15B06A4
+3F32DA3A415B67A5BFFEBE01CAE0C895E7C87CCE12B5BD4442300527FCDBE763
+5BBA21CE602E086A475C1A54A6CE2ECDF1A5C6F9099252E24F947ACBB9A2CF4C
+FD92F3CA959748844585C354130E592211D39CFC0C736F273AEE4BCB425C191D
+85CBD4ED9A11E841BDDBDEB1DAFBB07AFB459C3C7C1EB9985EA4886170A8E345
+2ED764D40195F79A38D0BD3B10806AF6ED520FE0E728A2DEBF951EB1D2094FC2
+79E2E4443A5A496779580234923487723A760F4B7B93BF088B6838F9ABD5E907
+D717EE24D3DC0B927D311DF68386769012FAB21D94F564AD4714E5F1778D568E
+EF783C9133B03F3DAE41404CC96FDC88816D8D7E40EEF397FE47C697637EA250
+2B735D200B801E14FB8173EAD8518BFBD0C353F8799147DB8630BB04CA5F2583
+B4A76420CFBBDBED64B1624486FB5A0514E651F7AF489790EE4D95B8D683863C
+9A36DC8C3DE90C5E90CD82093E377D619CB06974852736555CC55A3BD95B534C
+4F0481B338EFFB47CFB9F16617728E11EC5B3583EE3856344E092289D8D89A4F
+951DB5C51B49DEBD07912D6530DDD4AF310464CE75FF6E315A06830C62D45688
+488F114BD47B9C7A167729AA3DE3C7E8B111E420C7BA4BBC343D9B64D50DF5C4
+1C2FF51695F1E6511803D36789F3ECF99120B9CC7503CB7013271ABD88C660B8
+5120063D9AD988729736C152BDC6A29F2D59BE887EC71912A9774C1A7BF2B40B
+BFA63CECEE88EE5797276D89CE7988180861A50B1D3E62DABD3686E0B94A20E4
+55B88889FA2784B4D2E14D7FEF07026E323B1B0582E485839662879D193540BB
+BCE7AE45D77256CEFCBFCE658676209DDAFE6874CF079B603DEFB729F1842E81
+4E169DD973E1E1904EC57A4342A7C16812B75FC4F753A8003BFE25368AF5E02C
+76E5790C61F4DD74A432C71DB22B86AE3241358DE92DAFDA95F5BB2B4F7352DF
+D47A7AF1DBF95E29F30AF79E6569B9702600C804E92D67FFFC1A74DBD01A2773
+F4C10427C32D0BD873ECEB3128B5469943740B7000694D1A1A89B9B5F3D787C0
+D559081D2CF9A9E254C0AAF7AD8E5ABCAD70B79C81624FF1BFE218883C4925
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+%%EndFont 
+%%BeginFont: CMSS10
+%!PS-AdobeFont-1.1: CMSS10 1.0
+%%CreationDate: 1991 Aug 20 17:33:34
+% Copyright (C) 1997 American Mathematical Society. All Rights Reserved.
+11 dict begin
+/FontInfo 7 dict dup begin
+/version (1.0) readonly def
+/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def
+/FullName (CMSS10) readonly def
+/FamilyName (Computer Modern) readonly def
+/Weight (Medium) readonly def
+/ItalicAngle 0 def
+/isFixedPitch false def
+end readonly def
+/FontName /CMSS10 def
+/PaintType 0 def
+/FontType 1 def
+/FontMatrix [0.001 0 0 0.001 0 0] readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 0 /.notdef put
+readonly def
+/FontBBox{-61 -250 999 759}readonly def
+/UniqueID 5000803 def
+currentdict end
+currentfile eexec
+D9D66F633B846A97B686A97E45A3D0AA052A014267B7904EB3C0D3BD0B83D891
+016CA6CA4B712ADEB258FAAB9A130EE605E61F77FC1B738ABC7C51CD46EF8171
+9098D5FEE67660E69A7AB91B58F29A4D79E57022F783EB0FBBB6D4F4EC35014F
+D2DECBA99459A4C59DF0C6EBA150284454E707DC2100C15B76B4C19B84363758
+469A6C558785B226332152109871A9883487DD7710949204DDCF837E6A8708B8
+2BDBF16FBC7512FAA308A093FE5CF7158F1163BDCEEA888D07B439DBD4E8B4C9
+D198C03874B5E6F8FBF4922065A92BC3E66D05DE53971CB1424510E892442858
+D69CE1F76E4DA76C87C763A4B2FE36321E54B1328C9155B8ED6361855A151723
+3386AEA3D042B8D89C8C0E9A33E5DF3B466F7BB8C2C8A4ED4CDAFF55FC6D3EE6
+0AF2CEBFC1AC3A6E6692F8BB81F82D86BAE85016AD62FCB05467082C2E5AD348
+44D1439C2B59F65590E57CA0DE481A7A34E79931B1513C4C30156170409A4BB8
+46D412D1DAF88AD30722F12DBCA1CCC6B4BCC28D06B0D29149DDEC520C8FBA13
+6B82E2E1790F00B216282FF122EF0D47B70A1B29514DDF7C0435ED238C14BDF5
+6DA243117FBEF7398F97EB95597707ED63C6797EBA1B46EA19ABB1DABDA171B3
+16CD500F5D64CBFBE4F9CBC3E66A34427D3C4D0C432710289381F9BFD91B4FF4
+1E3A896C3EEA2F3105C218877D6C0C6B763760FA364D00065E1CAE9DCB5676ED
+286A9ED0D1C946DCA6A2A670EE0936FB4706CC62E234CFEED34AA615C48D2872
+A087F30990C85E64BA68F3D5C117123467DB411C9F2D6F6858CC70C1E352C477
+713097321B4C4FD4C5CDE305415F998E7245908EEDE6E056A736EA77BD8C639C
+3A79FFD0B74B3D28F0494A115F2841CF8A8827AB5608F96FD8998A5F40FB3DFE
+3AA0C7696DE4E1D18DC0D6E84B943175FC38FFC42A9C0CBB13A908978C98BFE5
+034F88480F32B9DEB2FD228FF6CB0B89B045AB02020C82E3F5716DC640613185
+9F597CE262729BC52132F43922B9E28BB71A30AC8709634561B22D13C4FAFE0A
+12C4451969226B220038AD8DDA990A4E2CAD53DBEAB698898BBD3046234EB4EA
+901287E71CB41296C431383AB85F18882F65BE36923F6C0FD6FADAC5B42FDB68
+64C06E047434FA7A659EF7F3D1AA8E547939FBF9C2ED7AC829F03CA59AFFBFA5
+A7AD2E0FC7BBE619961AE1785D09444B333993199FFED007382B54DDAEBE21E0
+1E75E0AB6D309DBE53BC7BB9F95D342F51798574D70B95021FA40163A86BE6C9
+342536A5730837C522D5314B1289D9B7E4EDD108BE7F35A20AB2A16608F6F007
+6DDD702A5A9BA1325CE2C1CD020DF677872135CF04F4E4F1E9AA6B494E2BC22F
+107C331A7E80718B030A1103804D144802E3B03EF7CB083BCCDEAC7B43F1B4F5
+C1BF6016741B741CF7E12B4BF95221A72CC9F4657264771AA69C73DA1DA29102
+65D01A0E61F3024E672AFCCBE13CD0B7F54AE1418B72E357A0BABB4D03073B1D
+F4EB54F899AD4A41A9F94DC200880A0DB99D67235A2451B25F710C29A882865B
+A922E56E9FC16756014FA5CBDB1C32750BD6835A70EB715CEA19A8872041905E
+8C660BACDCA26C8247D6B3C10FA5DC240E433E479AC6AFCF57CF96697FF46BE6
+44748E
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+%%EndFont 
+%%BeginFont: CMBX10
+%!PS-AdobeFont-1.1: CMBX10 1.00B
+%%CreationDate: 1992 Feb 19 19:54:06
+% Copyright (C) 1997 American Mathematical Society. All Rights Reserved.
+11 dict begin
+/FontInfo 7 dict dup begin
+/version (1.00B) readonly def
+/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def
+/FullName (CMBX10) readonly def
+/FamilyName (Computer Modern) readonly def
+/Weight (Bold) readonly def
+/ItalicAngle 0 def
+/isFixedPitch false def
+end readonly def
+/FontName /CMBX10 def
+/PaintType 0 def
+/FontType 1 def
+/FontMatrix [0.001 0 0 0.001 0 0] readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 0 /.notdef put
+readonly def
+/FontBBox{-301 -250 1164 946}readonly def
+/UniqueID 5000768 def
+currentdict end
+currentfile eexec
+D9D66F633B846A97B686A97E45A3D0AA052A014267B7904EB3C0D3BD0B83D891
+016CA6CA4B712ADEB258FAAB9A130EE605E61F77FC1B738ABC7C51CD46EF8171
+9098D5FEE67660E69A7AB91B58F29A4D79E57022F783EB0FBBB6D4F4EC35014F
+D2DECBA99459A4C59DF0C6EBA150284454E707DC2100C15B76B4C19B84363758
+469A6C558785B226332152109871A9883487DD7710949204DDCF837E6A8708B8
+2BDBF16FBC7512FAA308A093FE5F00F963068B8B731A88D7740B0DDAED1B3F82
+7DB9DFB4372D3935C286E39EE7AC9FB6A9B5CE4D2FAE1BC0E55AE02BFC464378
+77B9F65C23E3BAB41EFAE344DDC9AB1B3CCBC0618290D83DC756F9D5BEFECB18
+2DB0E39997F264D408BD076F65A50E7E94C9C88D849AB2E92005CFA316ACCD91
+FF524AAD7262B10351C50EBAD08FB4CD55D2E369F6E836C82C591606E1E5C73F
+DE3FA3CAD272C67C6CBF43B66FE4B8677DAFEEA19288428D07FEB1F4001BAA68
+7AAD6DDBE432714E799CFA49D8A1A128F32E8B280524BC8041F1E64ECE4053C4
+9F0AEC699A75B827002E9F95826DB3F643338F858011008E338A899020962176
+CF66A62E3AEF046D91C88C87DEB03CE6CCDF4FB651990F0E86D17409F121773D
+6877DF0085DFB269A3C07AA6660419BD0F0EF3C53DA2318BA1860AB34E28BAC6
+E82DDB1C43E5203AC9DF9277098F2E42C0F7BD03C6D90B629DE97730245B8E8E
+8903B9225098079C55A37E4E59AE2A9E36B6349FA2C09BB1F5F4433E4EEFC75E
+3F9830EB085E7E6FBE2666AC5A398C2DF228062ACF9FCA5656390A15837C4A99
+EC3740D873CFEF2E248B44CA134693A782594DD0692B4DBF1F16C4CDECA692C4
+0E44FDBEF704101118BC53575BF22731E7F7717934AD715AC33B5D3679B784C9
+4046E6CD3C0AD80ED1F65626B14E33CFDA6EB2825DC444FA6209615BC08173FF
+1805BDFCCA4B11F50D6BD483FD8639F9E8D0245B463D65A0F12C26C8A8EE2910
+757696C3F13144D8EA5649816AAD61A949C3A723ABB585990593F20A35CD6B7E
+0FA0AD8551CEE41F61924DC36A464A10A1B14C33FAFB04862E30C66C1BC55665
+6D07D93B8C0D596E109EE2B1AAB479F7FAA35279ADB468A624BE26D527BFF5ED
+E067598E1B8B78188FA4BCFB0B51692D07B0BEBB930C6F0997B437E2C51B876B
+61A563A2673932C2045833FAA35DB22ADE12102335D5DC734AE3AC5EEE6658D7
+92EB62131E1DFBA441F53EFF9021D9D4C491F26BE8F54C61165CAD778CE8695C
+EEAF70E3B20C64D4C2B34A084B5770BAB2A974E898F62BFE90F132A37E2DCA4F
+43E13DB13C94DFA8ECE2B7374827AE168634FA007F8981ADA046CED3448BF453
+FCD9A4F194FA648F9FC0971734BB69CB75348A88CC361FF06E984C86AF0EA429
+DAA5808CCE3583664AEFE0C59EDA04A147FB51227A5AB0C13942323E9B3733DD
+3EE7DF7F774DE5D0D0980DA8C0192983F1E3EF18481EAF1EFEDA0068BCBDB28A
+7FC7D9191EFFC574588DEC1E180341DC959F8EF56ED5B19F50AA82A4653649B7
+CDCA11A1FF27AFA7FF189A7E8A7C0E94AEEC901DDEB541604DEC0FE90FA0685A
+FDEADECE61CE2731FDDF7FCF2AEF7CC2B1EE7095F483C2597F66694FBD2AD81B
+F68FF2E378BD8357CD1B60A1CEDA2DE760A98868ACB45CCC8CC2370FE267830F
+B795058E0FB0EB3C625259C36BF9AD2EFB5C64A45797E18797CE1A2C0304CDE9
+9D88E11E878A721610EC57958C7E80A5E78226017A263288DEF5D335199E8F28
+787DF769550AD33E15342FC5E4751F8865AA66E78B8CD2388EC3618A619AD302
+5760E9F293085CB54BBBDD47C5ADC3F479E39A795541ED8CC921D1B41C9FB1CE
+57B1340BB4BFAD1329EE4EF2DE599944404B7DF94C759037CBE96073FD77DAC9
+B140B4580EF178A84D0746276D6E667E26671117EE04102304F2F599A423A687
+53CD9E2B061D02D54EF56439E33AD985A84C1CA8F6666CF7746E0DB19A79F249
+AE1F7714AE5E1D6723C5D3AF86E6ADC9F2BEA6A62C3C03A67414A99FCCCFEB42
+4EE4BE9FC8A530F06879F46889624F7D704EFCB951C1DA1613D55D61D33F6213
+F12610A6F071E79918AC289EA5A3AA9049229902B646FE14E8D19DBE673E1D7C
+76577E34ABE80ECF2F5D6E13CE0926F0C9B11F5E5D17EC5986042BA2AB6B1EE9
+B54CF450D616DA46373918953438A7BF83A5707CCCF26590A7EAD89B5D357947
+0B6F8BABCE6FC66BF2AF462C2CB99B5A68F1A2C237143FF92C2646B149EFE040
+41F97A52C48474684B9EDD0F3D0F3838AFFB70E7F7FF8CB8BDA06483F8DD04F8
+914B752F4C116BF243D31CBF9ACF04DA93BDE4B87D181C42111A2C90181E0A11
+9E87434F46801D6CFEB350467A78A899A70DC8E12CB2FCB376647F5A155A83C3
+77B72A0E058550E0F60C273A6320B331A6EA21B51F5B00B6A5271C331235A8D6
+FB9BAF99E4565B1461937DFF6818CCB8A8483BB54E58726C1DE836B9C4706491
+422F243DAFE6BE7369B09D87BC5CE3BC8085344D4C845A45AA9D915695F9BB8D
+9B06CA358A3A330694E6D269BE179704DCEDE985C2D886B7B063AA7F521FC8B9
+E79876B9FC0EB9BA8441E3317316AFA050E3668411CE8134224945A30F2EA5B9
+A5DD581A67B9ED8497F91589BC155957FAB5540E8BBBDADEBCCD2F603DF46B05
+2BCAB7A7EF420C9B3F65FFEE9BB27A58C0EE923DFEC5353B929C620B3DBE5907
+1A9A5C6FF4159148CCD2E6CFCC6E3C177C7B9B13E9D3BBEFE3BBE38FC35F2ABE
+5EBDA74E0C1A3C6088F9D4DEF480CF4159D21CC2053245EA9EC1BFF1FE50185E
+D3E3B571B0993AE6EF09489BAEAA2C651E2B36599BD91EC9CF3807A632FD8242
+987A4BD933A232B6B87B4DE659011DF6A9662F41F92406BA64B662E39B31F32A
+26E6383E35E94459E74818A1079EDD7E7CD7DAB678673AD6323A17E88BEB2179
+001A3E25129CE05627CF59CE93A0B573BD76012EC927D1C1192A4AFD93425E59
+AAD0956F5C7D86B041209C43F812FCAF2313A96D43C46130D2A97EF3BFD5718E
+C9B828682BD0FC3A8C1DD860018349469AE8C381986C7320BD5A43E9D8B6BBB1
+59101E0972207B00682D78C7D0D38BBD88AF888A1D40FDCA4A69FC37A674FADC
+B42C18CCECAD4B7903E604DCA338B1D285C1FE487F5908E91D24581DD7E2E06B
+F0FC950B0BF19082B1089C7B425FF511C296C50446E70F27D06E1507CAF0D0ED
+7DD1174A7C4B7A3C7AFD5F839A29623D84E230EEEEB8447E36922B89806FF2C8
+AF69B87071E0D539B09480BC55785C8A9D80A46BA1248A18471B33D92A13595F
+0EDE6193F5EBF1709D42A63E773ED530EB0B04B8D6A1831CF959644F27D6448E
+67AA52FE371F4FBA8269324A7E8B0E41A605484F6865BE95E17DC2C4BC1FF8C6
+6CD446D36AE4AEE4FA368AC1C040829CB2B306993080C60257834B13D47DA51C
+C091CBFB4CE934C64703826C4EBE1A51B41DA786A6A52A3247AAB64EF62554EA
+E506E462CFB81E37D2BC162273E26308C11057A6F4D3CA089F1D7A96B27EEA60
+CE265B2E1C4ADEEF44AEFFD1D93C4FA05ED77931DA0505228B03B4D63FDC6266
+B0A1BADE5C91E895BCADF2091E7BE64276CF0B3CD653149127C48600BF42FCF1
+49812AE035389822288DD5F4196447D266E737DE7D84AA2A1EB338AD0FA8D70A
+EE35815425EE181370751E1320C7DEE6A4FB3C3118A7F1E5CF0E5D3BE9F34A5C
+E22C4C864AD700BD51025FA86A225F58EB79F4F3A875167E88623E8D8B297333
+7282BFACDC57E51AAC431B40F30B5348393D8705829264BE437E004CEA8DAC95
+C23756E2165F046D62361632E44C10C54F7A0F569A87E2C814B0CF44E1E30032
+A91F58BF9551E9B9EFA5D7E91B0D5D19111DB04DBCF488D3E41E799C3141C641
+7ADA4AED435F4C8F7E3FE50C83E1F8AEA74720D1742D5D51D400490BBBB383A9
+B997B337E2B3E21DFE4DF383F8EE183A2CF426C8AAB91A083C7B567CB1729DE3
+0CF5CEF028388B1D8C5D6CF58752D6261F07DBE1A45526811F4E16EF0936AE24
+EB4FE66A6F008F525660CCD5B8C1DFF81D3C3B90569E1D02455D0A5B69C676AE
+1100E168882E1B027C80E13D91B04945E24E9CD66BB2D8A472DB7656217C7740
+478645255E610ED1660A009AC5A6A59F7276598F53DB7ECA14D98FD8FE49243E
+987625F370D1B018D89396152EBAA897EA46DA433274E28DF1F705BFD767D093
+F92B3F50F54F0619F3847C60DBFF60107C1B4FA5FA6AEEE5D53163F185EFE0F2
+11D22F0C863BD4D11A04445F241CFCA40B5250C646ACD15126FF98F6A2CDE37E
+D00377785349BE7C346F790A3B5B2186A853B8CDD82819231FA5B5FDF25915B9
+6A206F5CC7C194AC07D09DDC0CD806A662AE92945FDAA10AFC8039A221B96214
+214B719784E9A12C9FD5AB9F7329249FEDB3E9D40D3A88330FC39E426795AC2F
+4FD864AFAB653FC435957BDFD52D34C3F3A4522C716E55E84337B5C45E6BBBA5
+3808AEB1E1B60900D7A8C5F67E3FEBEB649BC52A0676C541DED315AFE779682C
+30EC72067C498E1664F4F223BC883D88620D7B542DAEB0CA003B3B171ED2EC0C
+B9E7AA59C09748AE95451E181185180E137013F6BB5D8F3592AF6A397DD70625
+5E4208BE09C2935737333652CE9E4D5ED5EAE7828E66FF712BDDB256E1E8BC81
+7B8714D29A3391CD25BF8A454864E7D6B532A9CC83018848408174703B86D68A
+1A5CC929AB9EDFC761E19294E9201AC307E5A836482047D0CBB0088C22DEC3E7
+A543B962151B9BAEDA8415DD0B033756CC0F098ED8043D9DC258300DB9A634F7
+C28CE3903FC903D398EC69BBDCAA656F53280FA2C4A4732D5485F6E63059D97E
+25C1BB3BC0FF5C49F10D137D7C19C832325A60E6A15A33F2EC4134905059DF64
+4454285D9D7DA92DC963CE154116CF05BC3A35E6673B29FBCE645743245759A1
+F4C131ED6766428B7AA5E7B6FA0FBA7418B620EFA4B837D6187507E00D14C8C4
+ABE61125830B95F8A4EA8E636EABB5B7278A960A761C63DF55F27E310869507B
+1E7963245669FC6A6F7CC0B47E9092614EB3124F590941F75F1E132345439BB8
+CDF5DCE540ABD05EDC63F5B6148EB75EADC57A7DB8DC6AD2101C616480A43600
+E16B14CE6DD00F559641BE7C03E6ADCAF332BFAB42426A32A5EA49C08095EA9D
+D8CFEF2CFFC99C6AC54B2BC381E00AFE9B3D29F16DC87C475C11F1E5CF52C004
+09FF20C7E7D90C5078D61DE6F307D4EC307CF2E593FD96B8712FD0A0F737A8E0
+AEF09E129E7A5C2F577B3F1DF538D90CBACF1B30DCBEFD86A9895D44FFFAE70D
+9660A3F8A820A466CD431C9C2C06FA00CE7DAE4419176E35616ECA9AD2239A72
+EDB1EA56B4CAB9E9EFF8C3E22729261965E0C060D9B15A8A6F761CBA35887E01
+428750FEE2A583E314DD21F65B8D032F3F7F0C6A7CAE0AEE1169BBC762A0D1EB
+C4E42C18B827A986C3AEC866699699A8318E88386646156CC3CE3F3A47230269
+64EAF40964EC1A52B342C551EE1518EA4C6551C3E9FFDB4F9BC87743D3A18D71
+F60486A40A75597BA69674C7E9B71F1B3E069062F8A603DAA823DDF0F26C03F2
+E2BA5F18273C7CC45CCC040C1E0A01CBC5E3C964988FAB19D1543A2C69F9A241
+36313020AA851C4EB9FFBB39CA7F46461AE6CE7FB5B5F2BCED463E1DCEA983AE
+4650CA2D8D3032046DC15E7AE5DA2B6B7562BE28F6B36FF60720173B6096F93A
+36994AECF7B15DF9E1E1A7FA36E2515393B4E0A1A5DB4D7414EFAFBF04A090C9
+9392F0A2634955A3E1CA3D8B86447E48879E95DB4F4092EFB954FF00DAD34134
+4506914914E3FB81CF7455F3028514E95216CDEECF6EC5917E1277A6A3B70B34
+E5EB97B91922020E06CAA774324AE2E29A516F28FD6E718502F8EB18C20A7627
+FA3BC8E4572972D906A46CBCF77A87912D5E523C9C205BE2A2593B0114AEFFD1
+4154E62A82CB766EAF4564FC746DE08A9D89FFD2E9F0A79633555D0C8634FDB7
+3E8F0D78B440DFC00C5B02E4E22731E82FF4110F4B1C697D9285C881E8410639
+C6BB1173197B2AB21C27FD4381BD540C35F56F44428D756B2CAE216257ADF5AC
+294B1FFFE9F0DAEA3FDEAE3B206556EF6044879DEE2E0359B7F03214AB14DF5D
+DC4B0586328D5EA1248876600D9227D627B4B54DE7C4324F438BEB9C3B176A15
+623C28BF6ED326030826EC104DD31980A04FFB0B5420632DB31B3E96CFDA14F6
+F5D59582C1DA4E9B9C2F054C1468E4166F88FEF3C197FA50222BC3EE4629B9F7
+00BC3DF48D0D490F17185A03C2A5B36BCB4CD8CD53B24CAEB00C5C3F82974E84
+228A32F6FC48B21E5AD6778D856E914F7D133BB316969E5D42D146CAE8F76733
+DD146D73C7B983EF91329D39D83B21BF916D27CCB0194ABE686419F565450CF9
+83B3B1205B9F393C0D832783F5C3BF538B365B232163CFDA95C43351CC77CC1E
+3834CE8DC52A6D4AE99208EA5F0418E0B2AD004352F4EC28735EE7C5895CAC30
+CF5851B221E40D124D1F7B4326454390C3D35DB4FE98BDEE3E35F1888B795CD2
+47543AB21EE6B1B14A98CBDE3AE262068132C55E8DE92CCFF3B230BE04E29516
+8B072B52001F766E26775BC17F3DE4FBED085570F010C67BD861E39261FA16AD
+537DD595AEF258E579784CCCDD714018EF547FA81980888CA777FE6DD3F1ED23
+1C4AF7E15CC50E6FB2C4C9689E0FCD12A79A9E35EC43B53400A8EBEC365D3D80
+766E50660757A179708C6D33D83A4C6B964F7C89426FC6B8E56B62C18D5D0D38
+439DD18A60ACFF9FF4AC30AD8672537997B5E0DA80D6AFEC5FF084057BC8146B
+E3B8FB430F0F4369FA1CED42DB88219946915759B06D45305C90EC757B3C540F
+E5CD32B7A0A3CC5463BB9107338601E092F57313C7AD6148130F394E1135E1FD
+BD1ED3D8DC1361D89CF384DEAA0DB95C45FC78FA5CF5A5E50887C486ACF50DE7
+83EDB18AB747BBA8C7D7E2314714759F1D46B13B69ECF5898FD1C2CC5283B113
+9D4E8071D17759CFCAABBC01B266E471BAD6717A8CD101E98A3C2AB037DA6F41
+1AA5BECEC0BAFA3DEDFC486CDF0AF48EFA9117087326975186946AD2B1519D95
+4EE8827EEBADA88A44C7AD29D3BAF35C3B81FD69FDE31DA47D8EB2BBF4B1DE58
+EB5D3B1C4466A670CC3397679BD09BF4AF56C09091A97F9FA40C4A7B9D0ED0F3
+5F7F0DD7031A6805EAB6EE1B6FB2326C7C54E716F388FA1D9D2376656115231E
+24A3538589228B1D74D78E3BA2F92401F929EE1325ED43E274761717152B407C
+9711C4EA0F0430F835CAD9B7E2048C8B05EE8A832C6E571171C7127DF003C557
+FC6DF91C41C53E1BB27A388FAFE3E47BC0EA5EF7E6B0925704FD522906D5D2A5
+49DC34ACDFE059C67B057F415C32DE5ACF3EDFD41F89C9ECC9C51CC58FFB2A7E
+EFC19D8AFCFCF0EBB4758DEBDA39439B18AFAFC3C5A656A83F30AAE799B78930
+C056596AEF43E473B3AC6E0114759A2048D429A7EEB8CBA7C9CE9E7A8493AF79
+32354FFBA5FB27F24A343C608C5AB5CB6FCC962DD46A60E7BAF1FEF39011B500
+5C4C1B195C22F668D2B9A8F6F4A307BC3BE10B58C500DC01753241FC22197D9E
+2E37437B4DF008E4868B39C865B5DA92AB147839FE3E0F5AA329F901B745E908
+5B5B4ACEA87701F16A7BE07B0B5B1D59BC72AA5D7507CEA5A3A331F085D33E45
+2710B96F2A130FD5669CF15FCB986C9F94E67F5E6382F4830B5AEDA4DAA82B47
+797A2DEAFC0B851C101CE4A9DAF6DAB63CD22AFC1127A4DCAFFB6F5C933F8D72
+04F778DC9FE9CE6E7C93E1AB6CCB82A5D1C8FE0AC18FBAC2684AA87592337555
+5F3D53E2A9923FF626B74E7B0C248490668E0D11F1E2CB576D5ABCF9FBB714D7
+961A55FDF0B26D863DF9937494B161A28EF983DB65636BF824C04055E8A6E75D
+D3A22EDC7EDCF47EF5DD95B506AD0F876F1119F58EEB6D838C9F3E1A3F65221F
+721EAD4FF3DD74355745F8BDAB5FBD835A87546A55C6C1648C2982AF76E8A760
+53DE528A5D0DD02B1F068182AF324251654893A61F3A926B6C0AADAA4D3A6613
+B4E703B86F1C3591761E78C86ABDFAF9FEDE1D4523612C2F461B06FF27B96A4F
+E7C6761DB1CB573DD6F76880C1678828CF3706C85B76F3BC292741468CD682B6
+C83B99E5D047759A59F106BF5A21F6BED5E2557F9F3FBE911BC16DE30E830FEF
+66DF51B9D28D6D9D49BFCDA1D2524F83DAEC3282A869E0FCC6D1422789055A80
+1370617A02A159DFF29350EEBDBD941A6357BC79DB69F0726AD66DDB5C8B4B50
+C49192B86374085B8382E2FDC42C314CB58A2C46BF0976A1D9D6A365FAFC08E9
+330CF2E2F3B26F6D997F56C565B113CCAE3F3A979825889A7B7EAEC1E6521E8D
+C7585FFFC2CD3AB2683792C61570DBA2E23C9B66354C2AF757913E785DA632AC
+CBAF1AC1680B13227048D5232C722A84EBA424483E2A0156B538490A0DDF1435
+CD7310DB183F8C941BF1B203A068FFCDE19D09C161375FDFA300B84110531D1F
+735A96C6A2D7F55AF41EF32A81B44907FD0C922EDAC6231D7A19868F4A67A4F6
+E9DD38552B2E56879AA11FBBACA27883CABC44676E22F99CED0E47168D692B61
+7221A595656E7981D35117D729F9136089A3B85CB733D06B0286A7604A9D692B
+CBF2715BCD63BC5288943F2F1432E086165F4F86425FC03CAA91D933E5768E39
+62B1EC282DBCB5DE928A51074C2584A6E2B49C67BAE7CC71F893FE10C89ED1E8
+7C3DC2E3FADD3672D3D6CF95DFDC2D9248A6040E4291D9DCDB0A680AA70700AF
+F3A63FBC3818FDA1B73FB76BD1B21906B6E7EDCA248D1BD4863B0A438AED4707
+4D775B8D9664E118602D16D8A89392C1E5BA8756B52902CC65002F71DCA33C7B
+71BAF36DCC0DE4BC9D11381C5E48
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+%%EndFont 
+%%BeginFont: CMTT10
+%!PS-AdobeFont-1.1: CMTT10 1.00B
+%%CreationDate: 1992 Apr 26 10:42:42
+% Copyright (C) 1997 American Mathematical Society. All Rights Reserved.
+11 dict begin
+/FontInfo 7 dict dup begin
+/version (1.00B) readonly def
+/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def
+/FullName (CMTT10) readonly def
+/FamilyName (Computer Modern) readonly def
+/Weight (Medium) readonly def
+/ItalicAngle 0 def
+/isFixedPitch true def
+end readonly def
+/FontName /CMTT10 def
+/PaintType 0 def
+/FontType 1 def
+/FontMatrix [0.001 0 0 0.001 0 0] readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 0 /.notdef put
+readonly def
+/FontBBox{-4 -235 731 800}readonly def
+/UniqueID 5000832 def
+currentdict end
+currentfile eexec
+D9D66F633B846A97B686A97E45A3D0AA052A014267B7904EB3C0D3BD0B83D891
+016CA6CA4B712ADEB258FAAB9A130EE605E61F77FC1B738ABC7C51CD46EF8171
+9098D5FEE67660E69A7AB91B58F29A4D79E57022F783EB0FBBB6D4F4EC35014F
+D2DECBA99459A4C59DF0C6EBA150284454E707DC2100C15B76B4C19B84363758
+469A6C558785B226332152109871A9883487DD7710949204DDCF837E6A8708B8
+2BDBF16FBC7512FAA308A093FE5F00F963068B8232429ED8B7CF6A3D879A2D19
+38DD5C4467F9DD8C5D1A2000B3A6BF2F25629BAEC199AE8BD4BA6ED9BBF7DABF
+D0E153BAB1C17900D4FCE209622ACD19E7C74C2807D0397357ED07AB460D5204
+EB3A45B7AC4D106B7303AD8348853032A745F417943F9B4FED652B835AA49727
+A8B4117AFF1D4BCE831EB510B6851796D0BE6982B76620CB3CE0C22CACDD4593
+F244C14EEC0E5A7C4AC42392F81C01BC4257FE12AF33F4BFEA9108FF11CF9714
+4DD6EC70A2C4C1E4F328A1EB25E43525FB1E16C07E28CC359DF61F426B7D41EA
+6A0C84DD63275395A503AAE908E1C82D389FD12A21E86999799E7F24A994472E
+A10EAE77096709BE0D11AAD24A30D96E15A51D720AFB3B10D2E0AC8DC1A1204B
+E8725E00D7E3A96F9978BC19377034D93D080C4391E579C34FF9FC2379CB119F
+1E5BBEA91AE20F343C6420BE1E2BD0636B04FCCC0BEE0DC2D56D66F06DB22438
+452822CBEAF03EE9EAA8398F276EC0D92A7FB978C17805DB2F4A7DFBA56FD6AF
+8670EB364F01DE8FCAFBAF657D68C3A03112915736CEABAA8BA5C0AC25288369
+5D49BD891FABEFE8699A0AE3ED85B48ACB22229E15623399C93DE7D935734ADA
+DA7A1462C111D44AD53EA35B57E5D0B5FC0B481820E43222DB8EFCD5D30E15F9
+BA304FA879392EE0BCC0E1A61E74B3A1FC3A3D170218D7244580C7AA0DC65D19
+741FA5FE6F8CBF60250ACC27454BBF0897CA4B909C83A56672958752ED4B5E79
+E18660764F155E86F09EFA9F7685F2F5027EC85A775287B30E2069DE4E4D5712
+E7D033481A53A2702BA7542C71062173039030CF28D8B9C63B5596A9B42B33E7
+D922944A38713383D3648A4AF160A3B0C8F3379BA4372BE2E7EA49AABA75AEEE
+C5DDE1D8BF68483C3D21271280ABB91D54CC819680322EAB72E1250A760BC8DA
+726405EFE420635B5B7F0B48752C06083E92BDE06401C42A2C528C8A60381227
+CEBEF0C9440DC034DAD9C19FB27A350233112B0A339366B7373CE058456E0E1F
+139E2DCAA12133B5B6017B0E08E776403F967AF719E0161CDFBF8BBE8490F57E
+53C78E97517EF7FB7C00035D601CAC8F4EB2F16F8765614227C71C390C32E960
+FC7E9B9BF26D89F808B05C2E483B9171450E4CF3A8690E3B6B1BE17C36157131
+89E42D8A2F51D4CBFFF07F50789D0603806EED2D0A9B5E8B7CC0959E57AA8088
+5F48BBD28B37BD51EAC7264D45CD2BB8B6137529B2B5DEDDD7A740458F045922
+D1A14E07A9E9FCC940D89EF56E274BF533927DB8276C3C0DE704CD8EE4010F39
+365AF1E3665CE873D8D1CCABC9C69A6BA8939F170B873994330F32963C330E9E
+70E95D62A5C4D2D09AC4B8DC7C837D9FE7F5A0D4D082743D038D458D90740478
+2A04E7693C96DB4A91CE237B8ED9D9F07DD4FB4B701891DCF294052EB8263EAB
+5FBF7689500DE29E1121A4460B725C793F71E79A58BEF6EFD29C6CA85702DCF4
+CD2435CA9A0CD4A1D81C15602B768249EFC229A2EFAD0BFC7D5A8BCDA1771DC2
+2641AAEE34E58BF6A236F62E2FF68B3D9E7C68FD5D104811925266AC67F16A32
+9B1EBC55089A05E3025EBD787EF14F4E053B456205C8CE2E24295401232C0AF1
+E01BB90B390E2DA8E42E624C32F3D68ECD59EAE9ED878D07889C7FA8C80E0D27
+527E9E0C57C12DC1B10508A039CEA74CA8BA027FD8DB0BC0356DDB161357C983
+3A144F697E1407791DE270911E25370499A0ECD912B9974490F2B66AB541C9F0
+02DF28DA53E7B3E21299192933DE13DB56210B6FFF3953D09440A8A043987724
+6555A448EF5A54023D8E6CB060F41BA6C3C8CBCCD856FAE2C86A1A0341D380BF
+3236F1B526BF811976506A517AD5913B0681D45D284FA7EAAB535507CBE0420D
+E457EE415EC91B8FA42F9AEA4E63ED29DA0BDA7A7824634309E57D721A422806
+EBA4D2DF543A0050108FA7C6104AE75ABD65EA7274C12CDCA7FCFA6C39F8014E
+3FF49B8FDA5FF5956B72F581DC7CA6A860D2BE2C522ACDB1012E622D211700E6
+DD77FCC8AECC89A787D2F047F08594CCA2DC2658D2CEE3752854AE62F5AA846A
+E022FC901203388B0FEEF795DD5BDAC0103B576E5C8052A696B8D6B3EE6EA3E6
+70E6B2646715C9E74043ADB3ECDBD95A5EBBF4AA112FA800B833CC7FB49F8E12
+35B98E34D63EAD6CBD062C1AE5742C9209DD34458E39EB8655E6B527FA848B86
+53984B3E009AE9D16AB83276141F2ED66D8668A2D2BAC65EC966102F7A8A90AB
+3469707A2778A2BAA4EF3EE6CA7CDDE0B2D7C324D5E17D8D3447C7DB378C2718
+FD1506535B0DAA1FF41130E8FDA53CDCA01893D9427374A0F969A7D69917D208
+370931CC09A9C208EADDAE21563370D6DCFD1E591848685A16CC6D9E7CB721BF
+DCBF09EF118B1D13C0FDAA909B281BA48BA7AD6C7A73A0AA5A4F2DCB93E51912
+51AA351E1ABCCED1DBA4DF7D97253280BEA5C4E123D6C2BD88C3F361437144A3
+B9B93F0C89748A06DCFC12D821107C2BDF700E997D75F69D5F5E9ED4F1C1C474
+AA0E18D6D9F021CB238A01BF3FCE903663E4049D19EA3C07707E779367B696C0
+50BE98D3D4CC8F356F3B4ED8B97BE899A205358552A39355E7C672FD88B94E04
+6C593496F77783ACBD92A642CABFD0AD4150A5F7D7970C02F30CBB0F947AC53D
+3B78A010DC543131E6128AD18C9F9D3030101E269EC58ACFB223C121763BEC1F
+C3A2B8ED77E75395B2D2349A2CDA54A740F0074309C516D38FA7D25E14B90B47
+8D919C4E0D57C84F717E297425F4ADD0853749B9A21418E8BA34579F9816D46B
+DAEE0D92BE78A093BC2846AA3FD7BBCC226C417C6ABCC4E194A3BB7EF01DB553
+DA2C3EE963DCFFD81F9D28788B092D0414BA913E25585D8D884977CCB9CCEB84
+5803FCAB0A16B77BDF4F21D22C850CC32F5E5883453A34FC12F50239DCA3961A
+F4E9F1EA81A6FDCEDC0A4A053203D165BE090E639AE340A1775358D00F40E960
+CA1B852885B0B040D76D61F3E3AF2F525ABE6095544DAB11595C5B0AF5E0ED37
+443A7D44AF469C1136C8E4670DA0CE541B6797CF9199BFB907E4DDF141CCE2A9
+BC2F72401338CD90749FFEDDF626AFD2578388B1C41AA44A033BC4F51469257C
+193A2B62A6DEB712EE81A120A4774D7F601F1FD25B074E94FC85336B79A9B4BA
+66B807F0FAA7A0A65DE3CAAAD6326F110FD7FAFEDAFE4BB55CC50AB35B7DA8F2
+9F4F4907DC451EAEE650D67F0623D7FEFF4252D6727E16FB2961167639A6CC6B
+AE6966D7F2B86F558F706DF92DFD61B07DF1B9D5C4D5F6AD7E1F2DC34FB845E9
+D151F2435453FEF430A79F1248DBE9BACB7F4BBF181138277208EB4E01D46963
+9D38E06D81EF314A8993AA7EBA9BAB51A02F9B0A38AF60EDA811C1BEA5A2A538
+E5A5834625D892A0D4EDBD50E1A6F7B5326405DBA2AC5E67987A4E68C761DC6C
+4DC14CFB81F7E64E2ABA70BB34214D39DB1F786F410B0AF211D95850C0D7CED9
+F7D421D1432CBF4E642D41BD7306F89AFFFBE22BFA3CE0C0C991711C475472C2
+87F2E0EC27C8E12F3C8198051E4EFB4BFD7D48FDE19DECC18B7A4EB5FF3995CE
+5D5EC2AFABB33F50F65C541F23FF7B3428BEECD8F4B6B456579A55A91ADB1F9D
+D32CA440884D36E77E43F532E1A558A28D9BC89492EF878887E8D1D54EFDD0A4
+148DFA9BD5BF57DB9F0B05ECA64165D6493E079ED13D6A4173C2B5F868484262
+5A38C1763674544FA86A017B2CCA3F553F33D2BB50B1C2887A4AD18BBAD03E0D
+66AA907D2C755BA4FDFF7AD251439DA0ACCDD0A6A9BFD8BC74C0FD731918DCD3
+3E5DDD3B97D2D8B15A759F3BACF7F2D6C7A1DCAB9F5CBACA46547EE4243F46FA
+14559105B14506779243C4D98BFA9BC319BD3BA9ACC048038E8E8B14BF49881F
+71AEAFD406E065B3933CFE3E4C08D5CFF2AC90AF8E6A96CB802069CDA7AC92F7
+DE0A370CB5AB593E23B2B9037B44DAFD888C4380C1DEB6693F5212919AFF44C1
+FC66298FDE6321E90EA3C985AB96C7E600B50506D9DFBE405803B02D3E998D06
+F9B7DF3C098BE3E489DEDC21A8DD358C1DA0D5390DF317ED309F6AD082C7BC23
+EDE9EC51636D4711CDECE391FBCC0C5277DD5614E955631DD349DA06D047202F
+BD311D6D70303F437EEA0B65B90B8345460F2BDF324FAA2C7A8F206938312C2B
+63B4E7B51DC727BC7F8EA99509C97626D5CA84B3CBB5C7D65BE822C31B350695
+24E93E904C0DAC7BC53B0920B4F23FB0916975D5A2AA52177937834EBBD82B96
+0892D32316D48ADF29518E4F8CB316CD650621B1A021F6855C2A3A84AE6BF42A
+9DB4D209EC532D8ABC7CA2289FA635B14B5C5C59EC3DFC0DB504615236D106FE
+98363DF080B162F4CA4701782AB53BCC0C7650233F5F7495C72F7523440B44E6
+9842A608A4550932671DFE066FECA714C054A80664CDB9272454A0CF4F4CF071
+E0ED8A2103FCCFE2FA8289C2F588CD2348E33D38A12CB75DAEA71A5D9DFC9463
+CD7DC1C794AFCC65E597460E28FE42B871C4FC8407AE12AF961312B28D4DCB4B
+42172E242CFEAE3B22838711999308990B6D49AE7B65D9469F4712834134CC21
+FAB9EAC1F23B2C8214A1F00F2B59EBDC8F77C08F6BA6A907D05F614F6DEC44CC
+C80993966950BB43BF8F9395BE2BC0C2AED92C483850227D254E2856604A188D
+83282CCF23B170C8EA1F01FF9BF9CE49934B1A613491785249B9740D9583EF0A
+1640869CE4D4FAB60F60D8ED862326817A50FFF03AF0978DAD2A356AF78D768B
+2A12B2DEA9193EE82FF34CE1075457D4F325609C76CFFF546E59EDF5B389CD92
+459CAB05D6DF84254B85E1C220A20BAF6A5D81BD6A83660640D2588354281B88
+04DBADA8203A1A609DAA208CA8D5596ED8392594597441E2900CDAFFA49FA51F
+D65CC39A02AA7CE7E4869A58D29D37F1C659F3A323D7A91F60A61FB54A39B266
+DA47A5E39B8BBBC317A387DD18633A054B2CEAF502B131E618ADA606486B749E
+C6E64CA8745820C560988AA44B30B2CA0A3997BC572F50F0CBAF5B9CB612474B
+661C4211569B1A9591557A197CA580B2AB4ACE30362D08D9793743127E5568D4
+2783C4CA7C07E20B43C749AEB5FF0C21883832A0FA943582FEB3B5010C99FFBB
+A0FC837C27FDE910AC56577FA88F3FAF575687DE5A90B95835154EF384F00D4A
+01AA0E48209DD042AF03C9C7BEAAA31E9BD00AAAE10EAED451C01E377606428B
+B0672BF8F10F7526F84ACB5446528023E01F5E5D4AA4EFA9023492F03F60893C
+EA25E14FC4D26478710C3DEAC1E534196AAEEEE29D266CF2BB9B80970B677353
+C97D691545D78222988FE902865F14F44C079CF7C14ECBE561680EA1DC4A6FA5
+7420C58C4EEC87315A4DAF152222BC979B0CBB4EC17049F677D1C2BC31ECB5E2
+9DB869D0C42363DEAD89512B3560AB65C05F21272A5ED159300C13FA74BD77B2
+D96EF810EFF4F64A864BD09C258EEA32603CFB5DF407AD61DF528C6D6A6D0BEE
+9AFFF0D60FEE18FFBF841DA43AED3480DEDBB652AECACA1A4E5CC93D3304873E
+EBDFB49D16000ED8A04A0F88FB1CEF1F847A439DA1FE93957A5CCF9116EE2FB6
+1EFA6CC5A38D4D855098D6F59427FCFABFE56583078E913516620B634A7BD0BE
+52324D15609D3C035A9B53594FF8395969BAC155BD01B0209AC49279D4BD5667
+46D80D6E54FF98D6A7C1EB07E11277D2EE26DB98BC69411A414AF9761F7AEF27
+DA1766E02B76E8BC6660BFCC2DD4344DBBA0098DCB2888A6E243628D30D45183
+435DB3B91480428B4E44A465FE46B1D554D723AB1F527F9AD2DCD1806996425B
+00FE8CAFB659393FE9AC0F5A896880949A9BB8F476BDB2903EE2CD9036AD07E8
+8BB8DF5550FCF873B348AF96B8CD1C9CE8EEA7AB743F5B3FD659EC6502ACF722
+D5D76A0E6EC89FBA669BC533C930310917C153F567CF6E1EB802A90EE2EFAE7A
+504DE21454974868FF67C8610815C4F69F28EF80CC396D4604756E74C7943E4E
+100203D1FF1ED3788022A0E9337D23BF9B0895A6F7294936A4FCC386FCFFD4DF
+AF48F623C4791E61D7E32C9E28A3DCFC4106265A0BF1832C68B2124A41948CFE
+C1B0394614736D14CA8AFEB7A6130BD8CF4FF7A5797243C6DB868724484C460A
+ED3005C22D75E82D090B3649F0964532A1A48987E2F7E138A2BB55BEC5A5F82D
+FBAB6581276C8E608350AF950651784A9CF3FC65BD589F13DBE1B062C6A53FFB
+BF3E541FC918AFF48B538C095A4F227E02250F737A3B261AF3058D3D632E30FB
+C79ECE7CCBC15239EC5BAA0CE80D730B7CDAB94909A083EDD5EE662D052DB314
+4F6EC57CF202478C32A06F41DB65955BA4BFB080B8979E257486F9201DBEA6F8
+446CA87E01CAED0D8B8923101CB2C0B6A3569E06A400268F4150CA9C72519A6A
+C36F67332959E4D760876ED149B6C42909017CFEF05B776B81911A3B3E1976E5
+25BF0EA073F443E4B448EAC699FFC78D8C41D2035146596E31AEEF0CE4CC54C9
+83007A8283BCBE5DAE2A9A848B64008D0FB672904CCC43ABDBD8378BBA54C367
+C6AC47D9EDE1B848B3FFD68A652BC3DE67F1BC4C119BF07601B7BC8EDE2DD9A7
+EAB5A340CF47871AD3022A5896A56E03A6E25FD960F5128928F49385DB23D6A3
+C7FED79BCACE2BE339FA2C27A24236E3298B1A5F701043EB83528C972C735FAC
+9C9A065E06270ADDE1503A42C4001F33661C98403F4BD0041C71AA7282A577D3
+885D2394800E0FAC158EFDDDBFA151D74742F21962F40BA1CAC0C4D1F24C0246
+FEF440341DD25E478936F2FEF81331F8937F04A6D691B235FC3875708A4162DA
+1C92F9795340C36B1D34DA7D1430466F8C15D41E95434EA889269BADD42C8E57
+12CBA9FC3144D21C57E5EE98412B073147B6B117B20E925AF141CF455B1513C5
+97ABB1BFAE357A9DF3FA0BFD7D7226B878CE3413E04F03FD017FA179C78C51C2
+3FD10BE0B3F18834178D3085F15D19AA0F8C3E6447795B47E86017F44EEB4963
+C806F86516E1F0B4A7FA3A64C55D2C03727AFF10957B6409D2F133D32EAB06C0
+B612F66B4C881D59C78DC9EB6AC60F93C2E96A2B79ED573EB2978BBC0098D828
+B3FDA22E6B5F779D67DEF54714CFFC927FDC717C6FFE14F90DBDC42075D598ED
+54810D8993180BCC5C41A4739E86201DDB5B8B3E80EB68FF6ED19973801564D9
+F4E48CD86224B10B4304740F8CD2EA890E862AA3BCD0B8041516E74BD0221A5D
+26E073049279B20209ABD297DE5844AD9C61499DF968F5B9AB5D3BAEBC36256D
+46805492265F75F906E1ADA46A08974E4F230A52D8A4D84C70194649ADF9782B
+187C449E5C2346EB97298557DEF216DE9729B71B69D48EB018BF38259AC98860
+9DD729939883821E7A1A64537E2CBEB1E6F11A50284594B65D130A48FC73D252
+7185FCD35A3EF61F01F41251DB285C37B8541846C47C7845A0A46E1B986C3788
+A3E7E3E99F151F5CF98EE4BDED2B4CC64303A4900E73B070DF660E927022C641
+1A0D28D993F850BD82078EEB4F9ADA23EE8AE0CCE66F1A6D076E44890DEB5D9D
+B4E8B15A6E58B4E09DD44BD0ECB14825D8C4DA0E7209A930812EC636DAD9EE09
+301888CD25BA944C779110696016D7B3E6FE2E9DC4A1F81A6F61B932E28900E5
+BA43EABB709B33E9E856BB6CA7A33FA08882271E5C2F8F12F8A0A673B6F42D73
+66DE9104027EA7D02F33869E0F06B70F64018549DC99E4B50A7382EB1A36B1E4
+907E8F54A59D4D832D5CC333D1B5037B64D1569091780BE317D9451FF583E0B1
+2D8877EBD3A0EFEA9A0330D31642A6784223E955EE6CB5CA803CE68CECB253C8
+44F74677782D40D6D5DABCA5C244303CE41B1B3CAAF862479453D3AA945D7B83
+ACBCB37BB6D87F134A815FF024D0934907C991D20DFEEBEE22B3966D4CE79893
+00AA038DF7367147556383CE72E85C2144D84A8B13D66722B8AC2C636367CAA3
+1C8D2BC5DF468F47AA78625C35A7362DA519CE31946F28AEBBF16D4983C7DA5A
+AFEAF86F93E25200820747361EE02F06D5109415FB7EEED188310F0B9CF93E1F
+DA929D2FA47AE4C334948D0D75609AEF71DFF8CD11C7312D81760509D6530898
+26E4B2E7F9B1B5EC94D1837F25A7A33BC6748574303DD9B08C8FC223DB659FE6
+13C71C29F0907C36E357A0A81038F944077383B7536337F074EC7161797E110D
+1D8856F64C96DB506CA799197D4579D94C8DBA0D276205EA830F92646A4B0700
+5AAD1B29C58EB222833E8E48D1A79B785EEFE59B11C8A829A829C975C80EFD63
+D47DC9ED98700A3D555807E4844F5033DC6C73266DD4F25A6EFC304560C917AA
+3BE805DEDD3D787797300EE0CEB33CCC4D9A16EAAAE902B986E2C4FF864E2D64
+19EBFF3438035FD9FCA2D9B0C3FDC17CBBDA433544D27E81BF809C89CA30F36E
+D0AD52D33CDACC72650A96E9CD8EECD7A8D50296EB4897E99F28030DA0F2AE93
+7E4A94A87CFD3388642CCD8BF26672482473C4DAEB3D20BBB23C0A97EB3AC5FF
+CF4A8A2CA0EDA2E686EB1E669F2529B027F5FCAADDBE3F75C384B769D09EA28C
+FACFC479964A89B4421C932E4A1CEA3FC5312FD56A3011D6E25C5C6086883930
+704307CED7321A8DEA59338DA843D4C9FDF58C0611E0E53042CB19E04C69B9F4
+ED385B3994A64E1A5685FF6AF0D6F8FF4166483602D28D8E18EE1EA94DD1AB37
+72F1E331DC0E46ABC1131A2CF8C3C08D33AC7BD044F4232724F23A9135FAD97B
+52114A426195C599A3182461AA4E126F1F445FAC9B167F418E172DB630C94782
+4E5E41E0F6315516BCE49EC4346A4BB307893F98B46B46D42113614CE9DA96F3
+6A950EB081E5FADD29F930BB1764DC41407B71D38449AD35913B2787A1A1BA62
+3E71BE24713598DFD96BE5056B7AECD3EE16850B66F6384029F144E19D06A9EF
+4598B15534147880941D0358CDC52B6E08A2D907EAFB536B702C8E6AF76D7F11
+4018566762B88560CEAC97F3DE8AF834AC196D7CD3C3DF440150E894D0A53E6A
+E687B9FD1AB8CB252FE5493CAB2990CF11AB549155DCA114A36B64BE7A835749
+3E86907EB95D9498BB04DF38DC85A34CF1701647FE2237F9639C0FB578D3A4F7
+471B2F21B787ED260775CC8495B6C852F4CB3CBF4F5A3452A29B97B51A4CAE76
+DF1F66F292BB219C387C34399A8415772F7A5439EA3A7602FF7A6AAB74EB1F73
+88563F452B5F10AF6089B4562FC1269895E6A3DEBEFF589643C60640DAF4839E
+BA525A1710F2643A456E0DEBB90CD2EF2C75EE6DD31C3251451F41EA11372717
+9BF47259C422A4C596F1D76672AA27B57E7F903F785CB394029009859931EB4C
+42F9B7A6B1494704E58084978DD2033EED656FC8BE7A2127FB7D3DFCBB0C6B6A
+F9A598B2833CA12B6F9B2F0E253D9652706C4E12A0376F864388407BBF47CA5A
+4E47A3F8567E7C360B6AC74DBA73F686B318E5182B14983FB340A08010170CEF
+6D92BECF86958FC7D409ACCE13CB5DBF5D5B215D7DB86D61EDAD3D9D0FD969A2
+4532689CA7DFDFE46CFADB5ACCBFC73D6FCAAEF1304EAA37D0C9392FED28FDEF
+0D9A1DE83CF6C344EBFFF0E47CA8ECF053AAC4D8064254346D1F01AA8CAD860C
+98D0335B6F211989DB72E96889B2CFA81D424FB75FF678B426C414477F6821B0
+E0255646C15A661E9DD18514329842474F0105FAAE1D43D5D738D5FC84AEE185
+6212C0CC4DADFD74488F6BDC88EE33D2428F7DA04A30C6E543FA57A13091BF3E
+C76B5C4475A66B8148046B62C8B631E7074AC229FF199073FA8F8799C7D602AB
+B95CE248DB1736315B501A0EC560C61C695B372F461C48A506F3F92272029DB3
+13B23BA5BFC29991759B6DFCE5C3186284D4F7EC85348B61712690D709410FB4
+F000D4D59DD639936C25254AEFE481B178027E06CBAEA03EBBA1FCA6CB8AE2C6
+C2F83ABC9D871308AC30DCE86941AF19A3B105EEC3CB4AB9EE20846A67A0EA46
+FB57F71714203FC56A476BDFFC3135778FBB28104B539C4A54D244E8D3ABC7B0
+A515BE0F6DB3AE9D9FC964328F79045D21D98B233FE73EB7898FC48C4908E729
+BA6B9562CEE5965EE9F63D310BADC9040796736B4952CA489318C9EA8948D466
+56A46A3F3091A58D1C227CFB5E8C3D3FDB6EA6B4A16D6FA565335AD569B3E421
+4BA3627D6049E6C87A1E45458A54EA574953885CD8A7CFF065130948DCA0EA63
+B3B1F8FD043AA910C138E1EB546FA676A29AE7AD8F1928EF6B28527053445480
+C278117432723F3DED55BF3E09CF8E142C517A3787BB9DE2787D2CD37B5326EA
+B4C1CDA63F2EEA8F55C5989E35D88F5D75E88C4F383570329C62DCB9186D7AF5
+8FD22AA953C1E21658C9DF0985B55E088CFB7C7C941A692FAF215935A38899C6
+31160CCAE51529BEA466951F1BE5776DF69A2019C33A6428BA43F6662065F16F
+4580B2AFDDE7E9D32D6545BA96BA2D2710F5FDF8C9B3044974BAC9390D4F0FCB
+E693434C32BEA67C69413C7E01DEF1257879C7E044F553FB46604267A1D77750
+2320FA125E385B8CB7C56F70F05D81632F2182636A401C79F97AC61C5ED3F44C
+81104E60175938287762E1B5B0A9B595FBBDB7B5126CA287BA9F4CCF583B1CD7
+74B38884ED467AF4E1AE43555BD3FC71BDF2C4FC041A8791594B410699263DF2
+0B10C5356437BB6CCF6952A6E23373CFCC1F95731DCCD869E5F7B394A8E585F1
+50D14308AC6EE6AA201024040EEC1E55CDDCE9DE74A3AF1F42AD918CFF7F0731
+2B3734F389F6B602CCABE9C13F529EBD194254192B0C8DCDA14E3DA68B3D0654
+3140A875826F93973FB04D64B22AF5B1504D81D677A6307CD0D2EB57C448F2AD
+1C16C5A7B1EB35A044F20D2C4BAC9FB1CE0ADD7E1AE8BA3457DE4BAB168141D5
+DBBB22C31E79B151A815D4CA3E44963D0E28C34840B7F3C596354B3CA3956C95
+4148F24AFD08883A36A691630A298AEE757B92E02A862556778E6E3A2041E4D1
+1AB4580E5FDD4841988B8B7D735803876A4D5C898AF6856321251DF6D42CFB3C
+7115734998020F9E6155E37CD7C2464EB42B96972342F12440451A23F736284D
+C9B98FF4B58E07E35A12C42C70ECE5EF8DAF052EFD32BEF574B67AE003DA2FB1
+A7433ECC75D79D10D2F32C90726C97E64F754529F7724EC8644225C18646F309
+D4D7F22894B3DBCA226473866EE2E9467A7847CD62DE83DF3D68DE2EB993A031
+2E858D3DD47422DD97F257E0B3E2E5B49BC9DDF0AA76463FDB5BF5243C4E64ED
+9C308B167B35B78D2BFC33F087CF8737CB5AFD3318BEB0F08F03B373FF6533DF
+67F9850F5D0FEF6D4394D888CFE283EE50C32305224699E71A1D02B2A16DE21C
+EDB0A53C9C5E312B532AAAF067243D88F5DA40D4FE0A0A2F4385BFF34FA9B5D3
+BE1C1DD5065A386FB88CFF7A8CAC4053918114683EDE4487B7BB85D1AC4EB927
+F1E1A9CAAFB3B23F4ED302CD7D12AC365C69ED004DCE51C729BE9C9A0E9B8874
+E47ED7F9565CA1E5AE8C0972A5FC37CA8A023A3E728C0EEF8AC72552671D500A
+E3D619A309A53E31AFA37CDFD3FEAAAFF7E90E69C96CA07DD0DB4B89061452FA
+8950FF79F1565BF8508496CD55806A62F111C9F46B7DC15EE257D317DB135816
+E42D2BD7EA95D0B6BCCBAAC32D267350604D7798E1198F03B819E80D165E0C7A
+0DA795D1850D48928450B7F7967D58C8E8930A452F160BA5A54A2B7D45F9C8FF
+81CD1918ED808958B9AD4B07353FB328A69F4E73A6804FCE3132A0DF069E25A7
+F40D4B133E0D851EF27A895D04451EBCFE8B07C05095D9E8D9603F8A5C4AC797
+84196B9E09879EC026894A20F217A4BBFDF13DCB519321910535F4BBBD8D31B0
+66253B27C034FD1014A134BFF9393201C8A1A55125BE0EA4EA9B7F56F2C038FD
+0E828902CCDA438F91250C47306AFE4B8C5016CBF360C0621F402DEE13302A66
+9F1793E6D3D352A24349EAAA8D9B320EF85560A935E2A4D2D67BF4F0FAFFA84A
+0FAA45717F23855D19400A1D823C17BE7A005E1B5AF9388A2150E14CF7F229A5
+07096C67460B989066D033C7567003EB6FC8512DD685E44DEBCE8718B1408872
+40226BB9D8D2E2E3409C100401824AEE6914BF53123B7F1D367688D2F3E90CD8
+B2E2FE7911A5B6439D7D421E59EB7BCE4DC0B8D09692DD02629A4A40500C6C83
+C27C127120069536BB5A08105C137A80E112FA949C7DF8F2A78E89169BADA01A
+F444837C8EDAB8D31EE7381BDAF2E3FC227D95784F07ED0C2AC12234D81A07D2
+0B2E26D95FF19FB74DD5CFFBB705BB286C09DA08F4164048B9DF68C5751A6C64
+3B053ED842F997E75A75BA9076985E27E65C1B256B7AF6541BB257B908133225
+C7A7608D62E9E0D28C4BC1FEAB3DCAC226D44F02F2B6BB5D786789E9AB51BA25
+9EF0748C3BD02385391A390D3DC2B49422EF5ECF8A09998EDB111847D830744F
+0FBAB1F688A9A2FF26D16A0EBD334D53D323DB863B8CFAC15C6E48131C4BFC68
+B8038C436F156BA2657F05C9524E8F8BA4DE9C0C5CE3393927F1ADE80359DE51
+2686AC1919CDD6244D58C099125C87A6E27D0CC62214B0ECE2E19AB7E771E099
+272FEFD178889D220E763697AF056160B54EDFC103A161CE16FCE42A1BF4106B
+46500819C85E7668BB2B9DE3242A7FAA558993F4E06DB47912801C79BDF6C10C
+502FB005913DAD8BB35F210F2BD6225C3E9C0D37D599FD296B0487E8F373B28B
+FF8CA001BEF0E6F9DC29C679382EECFFAAC4433C1116C416A6AAD52097B105BA
+1C18592A38C7C97782ADE3AEEAF808809F91B144BB90197900D5A88B752A322F
+99AD6FC16629D1F78E9BCD372310FB5C33F728971CD8CA9555D81E199FF523AF
+BCCCAAEAAD8E951A6D48A704B4D89A3D1065406B82B00A6A421E25E79D147594
+6446382B4028943CFE86287A666FF655DA13878D845BD930CFAB8217EF2DB874
+EE748A9464B77AADA51319CD18C196E4C37F23DAAB0B26857C837761182EB3E7
+41BBD9FE52371D4576012FCEE98F20B91D85C7F0EF8D428DBCA7D0B0F9A93F9A
+8369AF11DD05D35395BA5B79E39B969EEDAD31CFC722ECA91D7A5A3E437C3068
+36F0319EADD7AD35C6383706380D6E5AB63FCFF28A9A21F1706772EA74C40F22
+59C5B338356AA658F479C7E2E7C4176F2105D7957B43F9FE20ECF7FED5CC0A33
+0CA8F9063144E480793010ACE37E3F577C6075138D131576B56F8302D6E4EACD
+1C8E02EDD061BAE820F90FA7C2840867DE92F2783410CC56199C1FE7DF9F3154
+3057B95CE752A30B7BC4AAFADD5BDB3FDC04D7D40A74444B1A135C1F96682188
+BBA5CD3C06B1B84BE01018233829B4A78C54845CA06C20F1C86B1D31207FBD50
+DFAFFCFF029618CABA5782488DCE6D0FBB3C50F27F44E55504D9DCBCCAD6E99D
+49E3F8CF3F9F597EAD433F7E7409FD15BDF7AC32CC09A23259222EE3690F3C7A
+AD0D44DD92DEC93B9C5EBC8571DBD3B80864BC0EB5379C0A4AF50016720FBE36
+8307FFD35CD365241A4CA0D7FC015362A3D8AB49571448461F5B497BC4E8AFFE
+C8E9C61CC91837D1036CC017588B4E3944112405379B6066F3EB0F2D7B0D6C2A
+90E1CC201090A85690DACC92F4BFB4D4DA42D4262DA96A4BC78AAF804CE39863
+8B8DAB0886C27E289633FF58CB49AA3B67B3AA0BC0EB1B3B8B44511BDC19417C
+D7F8272481C7D12424A1C1473749B9FFC50B2BB1649D2AA3DB8439BEFE38F70B
+A1682132EBABA78E41833A05662A690B77C18CFFE6EE308D8584B7247174BDA3
+C64AF4886DAFBC452E2F431AC0B02380FBB2130C0CDB339309EC1C1929F8AB43
+57E8F5D1A47EFAB0CEB2B5E01B2BA8D81FA1E63606342E47DFA92679E6FBFA47
+C93E3490A0DCC5CF2C5DF298F81DDD1B646EF8598F821380983D00BE3C2FB456
+F848F339BA6329D23C727391B84EEC670579F39F3263F5E535960C95962F5A16
+2C1D5A3DD5FF459041C153EA2E549935449D7FE37C2E1D058F8F80F41F2D5C80
+972EC033F5B87A6B1BD65A2BE9A8576D30069745C1DA75F072BB492A212EAD29
+3209E08C3FF6205097FCB14111933252708033589C8AED0D1A28CD86DAB13EC3
+18859BF08EC86D751F370377CC0E724F7CCB632A4B115D2308083E2B5B8F2EFE
+260262D780EF5276AD5CB5E28D73BB6920A8C18D720A4CDA52DFFDDFA2BFFEB2
+31900CE110AC33E086B6DD0FE457FE29E8D010C7CD6D0C6BC2BF9021A4378731
+77FC26E244D06CA5FEAEB6A51A164335F29507E1BE86D75A610012C6F913E64A
+DA7FC95E6BB98FA90E399CD9624699229172E6D2AC88D61C2D0BB651AEF862A1
+FC7EDAEAC0C9BEFF07C533FA1FAD72E929275EE1073D32DB29EE477D4F1275BB
+ECF7960D5ABCAC007A1B9BEA2E555D02D7FD2F8DAB37DFB612F6C59D0B3D6159
+88938E23372FD48E2534EE404F327B53D22AC9A8DD968F50ED144EC1B30B4222
+BFEB70376DBF1C5C9F7BCC1D765953E76894BBF009DD7E83BCE3D56AC4099153
+E5E147B7F1612E84935A5243AD8C420874937D4662EFD9717CF715D68925C2DC
+EDDE5070407F7210CC3A141AA6DA723E7B7057130728972EB466F0EE63D66BDD
+0DD680A09CB69D4D9978556790AD98E3A8F1A5FD15571A4B607DB1EDA51250AE
+8256180D00411469F2C4ED97CA517CD8EAA731B74B7055FA21C6ECADC9FE18C0
+21D063FDFAED57B276D51B33042B2868CCE630771DF7AE0DD9E26C48892FF1FB
+332FA26CB639A581FCFBE19CD022A1B770922FFD38A6AA5E28EEFCF3AFAB7974
+D963F2BA5782C765C81C3535D453667165F6593889C316CE1DB54A4BC928CCD5
+9948E7B7DF992073D2C334130819CDE861B60B463E55F17673BD244804C6E376
+59851D9DEBBD20FF335EF0F32CE99DA138AF75D3C03B72CFD2084253330051FC
+F467C0B06C413F8D71316835AD963600C6E2CB564FB392D6A68DFB98D5A2452B
+45C6ED8548A8D5068B434A993B745F7C49F9E5273636066F2B726E52082EC848
+825A05CDB19FECC21628C80070AF0F80F4B1D858FAFECDAA1C5C689E8AF110F4
+7AC324A037E89A65113883060B08020A1A93A816B6E69DB90C3AC9C2B378A277
+C6FA2AC6FB93ABD6AD2960BFDECADE173AA9A512F2448371C9F4A944D623CB2C
+A53597E7D01C3D6C4AE282FEC4E8232A7617FB535D0E8DFE5C80CA13782327E7
+E581746D460E8040ECBE4321720CB8A6FC181364439F41D4D08C8B7E582C751C
+629F4AFB1A7A390ACDE76ABD0B162282C83E410F3CDC311C1113763D0C4D6C92
+36A117DB6A5B259EC8ECABF53080B9D278CF87BAF14BF5D7AA9ECBEC98EFD0AD
+CD622F9B4D6A92B5C103BB7D5E97F863E2594D306A119871CE7C5CD6592EB0FB
+5338FC288D23D86D493F5AA886155AF1847FCFA0E92E84A1E1BEFC4076F43350
+56E42CB16F7543F5D057D3547E49D75E2CF22B376BA9C1E87370651DF9EFEB07
+91DFD4B59E6A99F45A962C5E021D4EFB3BC1F63953FD6E09928A551C220A98DC
+4BB366A4BFCC58A7B314CF9902BD1FFF53551D19033D8C4D28952ABCCC62B468
+C61A97A76C9CB68B8FFFB8BF91FC96E1AB49D2B161F37A25CBFBD5D4896815E9
+4CC17385F5BB185A15B0B8413FA31E2CFF6D67F74997261568B94C2F85DEC393
+300B794EB87E97C7769BD6FD84CF81827FA260BB161281E7F75D1C37276AB529
+5087F4100BC37879DBCB97723EB71A3A6A40D923234FC1C8348C184710F40DB1
+0B2C0A6DC172FC28BFAE2D2B2B295BAF3CB1A39A6D5A4A73FF52F080D1EBDF30
+3D9434BDE34FC62441911BF2F82FE2154E76A0CCCEE232A7DBD1A22511C39624
+22C76972FD5D299DC8BE9A2BC8BCD5FA48E8FFE729844C41AF0E53044BAF93C1
+36A63F4BE10178F9296D2CA93A8EB0E76743D8EF16447E7A3991AA1BDE4B85A1
+4BBB15378434CE1865218F9EF95F649A6F21B7AA8E75CCEEC717EEBDFD14F6F3
+EFEA304CA35132B59B21FCE65B13326EFA5736DF81447F675118E512E631C747
+2654D4BCF7890CF072C39468CF9B5A4ECE1C6DB0F4A4728A9929D821C7599FDA
+454A6930350475791CFDDEC6F9982A6CBB09E45B75EE0C8202DEB19B74786C51
+09E4F90457DA1BFB94CA77A3C6C7B346314BD5E2990DA7DFC78EC75897C59FB9
+1414D259A9728D14327E5BB151FA2195D80D9BA0A852DE19383AB17D4D6D9717
+144DB34ED80B2910C4F442D4BD722B7F251B938114B4C0872E874C3DB20F7939
+368A79C3C46A13E5E761E397E5A6B3E8BAF6836632D2FC7A1B3252D81D41904D
+13C65774BC8DAE4834C07CAEA4AD04DD6CA8301EA1E20AD4E9C7701907385036
+2DED96B06F5847AAD5D004965F255167231BF07E1FBC6FB101B73F8620765755
+9262273AA6F111626AD38CF86788269CFC4B8611C55AB4E9675EEE714CE2D305
+C9CF8E201CF812702D0DCDCA8BF76F04DB029FF56F7AE4EE3064BA785148E822
+7592906D2C27F043D16A13A48DEF8482193ABD5A45712B0D5ABD3CEFE3BE93D2
+DC5F98C33CD602BC65F3D02EE0007D6057D81B3D3291877F399CA1D04547A274
+322C8E4739543B229703F48F02C6B1945F5F537129288B7289BC2FEB01339565
+40E6DFF827D1582F0B84D517869C7465D00D653C1EE3EDFD9497BF86D03CBB79
+25C4D4D7CC74C6DFB45CAA3EC5DF90A6C117AC984CDB7643B906C6EA625BC933
+892FD590050090C94C
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+%%EndFont 
+%%BeginFont: CMBX12
+%!PS-AdobeFont-1.1: CMBX12 1.0
+%%CreationDate: 1991 Aug 20 16:34:54
+% Copyright (C) 1997 American Mathematical Society. All Rights Reserved.
+11 dict begin
+/FontInfo 7 dict dup begin
+/version (1.0) readonly def
+/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def
+/FullName (CMBX12) readonly def
+/FamilyName (Computer Modern) readonly def
+/Weight (Bold) readonly def
+/ItalicAngle 0 def
+/isFixedPitch false def
+end readonly def
+/FontName /CMBX12 def
+/PaintType 0 def
+/FontType 1 def
+/FontMatrix [0.001 0 0 0.001 0 0] readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 0 /.notdef put
+readonly def
+/FontBBox{-53 -251 1139 750}readonly def
+/UniqueID 5000769 def
+currentdict end
+currentfile eexec
+D9D66F633B846A97B686A97E45A3D0AA052A014267B7904EB3C0D3BD0B83D891
+016CA6CA4B712ADEB258FAAB9A130EE605E61F77FC1B738ABC7C51CD46EF8171
+9098D5FEE67660E69A7AB91B58F29A4D79E57022F783EB0FBBB6D4F4EC35014F
+D2DECBA99459A4C59DF0C6EBA150284454E707DC2100C15B76B4C19B84363758
+469A6C558785B226332152109871A9883487DD7710949204DDCF837E6A8708B8
+2BDBF16FBC7512FAA308A093FE5F0364CD5660F74BEE96790DE35AFA90CCF712
+B1805DA88AE375A04D99598EADFC625BDC1F9C315B6CF28C9BD427F32C745C99
+AEBE70DAAED49EA45AF94F081934AA47894A370D698ABABDA4215500B190AF26
+7FCFB7DDA2BC68605A4EF61ECCA3D61C684B47FFB5887A3BEDE0B4D30E8EBABF
+20980C23312618EB0EAF289B2924FF4A334B85D98FD68545FDADB47F991E7390
+B10EE86A46A5AF8866C010225024D5E5862D49DEB5D8ECCB95D94283C50A363D
+68A49071445610F03CE3600945118A6BC0B3AA4593104E727261C68C4A47F809
+D77E4CF27B3681F6B6F3AC498E45361BF9E01FAF5527F5E3CC790D3084674B3E
+26296F3E03321B5C555D2458578A89E72D3166A3C5D740B3ABB127CF420C316D
+F957873DA04CF0DB25A73574A4DE2E4F2D5D4E8E0B430654CF7F341A1BDB3E26
+77C194764EAD58C585F49EF10843FE020F9FDFD9008D660DE50B9BD7A2A87299
+BC319E66D781101BB956E30643A19B93C8967E1AE4719F300BFE5866F0D6DA5E
+C55E171A24D3B707EFA325D47F473764E99BC8B1108D815CF2ACADFA6C4663E8
+30855D673CE98AB78F5F829F7FA226AB57F07B3E7D4E7CE30ED3B7EB0D3035C5
+148DA8D9FA34483414FDA8E3DC9E6C479E3EEE9A11A0547FC9085FA4631AD19C
+E936E0598E3197207FA7BB6E55CFD5EF72AEC12D9A9675241C7A71316B2E148D
+E2A1732B3627109EA446CB320EBBE2E78281CDF0890E2E72B6711335857F1E23
+337C75E729701E93D5BEC0630CDC7F4E957233EC09F917E5CA703C7E93841598
+0E73843FC6619DE017C8473A6D1B2BE5142DEBA285B98FA1CC5E64D2ADB981E6
+472971848451A245DDF6AA3B8225E9AC8E4630B0FF32D679EC27ACAD85C6394E
+A6F71023B660EE883D8B676837E9EBA4E42BA8F365433A900F1DC3A9F0E88A26
+3318B32500F76B1038FA6122C2AF6261B025BDD004EB9575D102D625A351A20C
+914D7D79EDB0FE343726526D57A9A8E3916B437A95C895F542DF4685E4683CC7
+5729A4B41F0C51BF910AE542A1270EAD05AA2FEB6B95C3C5D068210D457D1D9B
+9901C8946E0E7F47B23BA12743FE43A1E7DD18C56A6CC68C5E4A22180E24EB3D
+2F5A6484A170FF45D2C5CDFEC7958ACD37C305412BF2757630252907C69FE044
+85724CFCBA4A85C02D4F9BD5A5405E4C0FB1EFF4AF9CC41401B5ED407E78B0D1
+5C0676C625A5277809A8DD0E44091329701D8ACE4A981EAA0BDFEB0B26110396
+B24839B5C59B1FE13EDD5D4B4E7893CD85A4712726BE26357F427EF53B157DCF
+77791447877951ACC19D5AF1C2D7375BE53F8AEA5E0CD8A2A049A9A010F44016
+9628A12E5B6E740E5831CBBB715F036066DA33343EB22AA89073787148760EA5
+2D543B42DCD6EE8CCF825D2517702FE270BBEAF8E0A66AE44F449F50768E82B5
+2FF1C533720E8AC2E18BF0674D88A0E4F0886D945C07FAF1986E1BF838C45EE1
+82E2BE8223231B396D5B6D92DFF0856AC03EA1AEBD993F54CCCD58CE6464B075
+EDB4CB853CA500A8A20EE43FF3CD82392656D4FF38F76196CB51A342FC562563
+EDD69C2C184172D19C7B427CE4C129CC61BA35BF65FE6D040B5311884EA16C4B
+0123A05FA94FFC1816637359FB28825C2F87715E1C40CE71329521E7C7A92012
+FCF11D3C94E9BDFC43E18A19EB6E1A8821473D6516B93247B1A832735ED606C1
+6116751239DD1796B4921B67B731CDF45FF38FB615067D07696CFFC6F923D0FD
+24EC833922FFAC22BC4B1E0E9802A64B069EC783F250F034D41623C5DAE1CD7B
+CE63EA49C9D1893ED2B49561573AA2A8B1DA6988B30FB49A68755F65A792A42B
+F2D921E87B2E130D22ED26833FFEF003C8D45B7A060E2039B87E081A69AA68D8
+F31902E1134D23DA8F948BD1756B54919DC4117ABB32BD4E8F3E26B57F0239FD
+67262DBC2A0EF4EB5F318C9692EA8AADBD4448CE15DF8CEE63FADFFC457D413E
+2558832AC91C10C6C268EDDF2D00E9139B47199E2CA386F0821EBD9589C53A01
+663813D56ED0E7358AB0DAF4C3308924A727859FC812BC344FEA19C3AC00F9C7
+48DFAC6CD48FD3E28645458464BFC984D7081CE5A5B5ECE9CB7FAE1BFC00063B
+2EEBDF0E19E8AEDE76CE2EA7D7A61CCB4A38B3C29066DEDB13D30BA7CBA0BE11
+29CB91BB723DDEE57E94E9D82ADE3E1E8FCC275437E98C727EBCA148F56EFE2D
+1E545E514F8E81695527107ECFD91090BF23C2A3C760E5FAB9E10D88E269416B
+79DDAD372757EA4DC7A12F41C4A87F34A1BEB66C02BB472D766ABA60F2257132
+43772C6378C18F75F0BFC2F6B7FB57FEB5647A0A35E1EEC41115D113D1BB2118
+6E60A0DDBDFEC305AC9E46D84EB1296C9EDD2C49AC52226E64F213E5361903E6
+4F213111934D0B2C28CC638CD1E15D1E21ACF6F1CC9481B9A890B012120E08CE
+5D57FDD7A07337AD22726A31A8DA7465504566DE14927A0EA88AF85F396FE7E5
+DCB9C32AC3FAD7BECCC6AF79FC16F39F94903687CF39CA0CDF1A3FD9B10E2FA6
+EFFCCFE76E2C8A60A37BDD75E978304F473FC03AF2ABFA38EA9614012D76D505
+965CEDDA91D3E53BE06A0919AA613E76F5B4ECB6D0274192BB85A7B1A9F597CA
+96CCD0253BFCB69E8184A92E705C71A0C1F51B1DA24C53C1A358673BC055E067
+2FEB7BF9C8D3E1455174C03ED1448BAE5AC7128EBE59697E4A24B3BC6461A8DF
+3FC5F3447D7CB23AB6A0722E7CCACEEFC178E4841FA54B0ADEC7354B49EBE023
+C98B79953D5AF990CF8D409A2EAD724635A20D53DFD46B9EEC62BEADEFDD0A6B
+EB64F0985C5A8CE0E95C6DA596094DC5EF1D719E6B3CD71A7E20FED6B2967F2C
+365B82E865F225697728E8D302FF0FD231A2E71A78783CFB3252E748E235B7DF
+8EE1B10CCB5B18E66A990F6D20656DE153CDD47C5C6EBEAF8BBD23474366D296
+8D07C370F2283013CE6587D8E9F65E334C4F96991A54012516FBAD8A2FD9DC7B
+A2F13E74C01831C6D6C10FA3FA1131107D3A77CEA31F5E57485E52C2F566EADB
+70475F61A74AF672D624C1DB3B49CB827E40909CBE10E5BD3F0D9F3D2065A7A9
+9E8329D75B9B65B0674BC1D3EF63F7B697A80B3EF103B8F31868FE00259084A6
+06CDC3515915293B0B3856F80A8CEE3322B68BFBF39144223F0FC8B80A1CDEB1
+6D2371AE89C9CA2B77FB978F6F2DDB2E628809D233E14384C00D08106D5F68DB
+2259D8DE59F69FCB8458A6CEE232139B9F72FA3A101D54A9474A9BE8A3CDBB79
+64613F90CD7814BA8EA766925B7B37311649690F886A7ABD5C5A14FA72E2F004
+D43FD246BF83346F2D49D3708D0B37B9A7D55B241D6381C6F488A683C8212420
+A68A690865DD17F17CD579A34EC3318C501F1B0F1237088D7E1F647A0641441C
+27BFF16E1456BF253FFB4EEEEE08E3A2E2E39A524CF2B7DD391B9130451F7C10
+FA1D754E5FAEA63CFA78618FA45B4A0AAA2AD482FABF9595352CE99103BFB9B4
+529BD32968334005D9EA26AE33663A323DECD7462F03F7F2F07F015839416F08
+EA006ED12713F24DE165906A87233386E27AFC8E45963EE3B7E03E7EA67C59DC
+709580489C6C255DFF182151042A618DA8C05670939F0BF62175ED90B3745DCF
+49CD881F0E5041DE1B89C636D5433C4EC6DE0227ADE952332674A6C57677A265
+BF1A5F7012582EBBAC5FCC7C3BE258D5020B60C9BFDA7B236919B58256BF8B36
+3922A6793B2FA4975B9B9F53A0EA212CE16B4D2B67956F6A939FABD3BC1A6A20
+97D8D1655EC1AEF330B189A459F24D7BDF1B4BCFD7DD180AC9437D10DC9D4489
+E53AA776C956C4F1C0C8E04B8A06F4A958C41877AE3A0F2DAEA2CBBB07009274
+6C703DD40F9DCD63CFF5B98B7AB8D5ACB3F16FC70BF1707721AC1273D7978996
+34E777DFD5199187BDA107F865E2CC6B5C0C08DCF04509B91602C5750C9A5A3F
+BF2AF84BCDD33233898EF2EB01766D985BFA326ABF0080AAFA40E9992CFDBEFF
+8599696D621940D7AED320411AD515FF250D1BCB9772AC63E703FDCB19C12E71
+18305C430C05740EC063B5E4B38BD32A7044A8FE10213A4C6AD11C25F640418E
+A1DED2480AB59A077F69AD4E201F41D83CD14018C23BB9AEB7688C15A0717E2F
+0351DF1CC6B5BC43FD2144941FD045916C9F5404A8D18E2FD74229C673FF3067
+FA7516B2214ED5AEF5E1E1F058313F6A5E30F3B6691622009E4BC2A80D8992A8
+1531F4F79802F3158818683CFE8C05EAB46290B7BD698C96E1FFA48BBD8DDC94
+050ACA118339CE2D98A7E3C3B929E90FA8CFA62D7F57AB3B07A0002AA2BC5B5E
+6A623EF048B442F587A40A2EE804E72EAE3BD75B5D048B721FF5915C45908AFB
+D28E6116AEAECE7D57952E53E9DC16396ACE32C717D22DB3C38708E7E7C99BD0
+29C299E8E32FE619C4048E7B1359BE4C5B525DCDD9382518D857FC0E1A6E352C
+B321B742C4CA32D74E62BC421459FB2C578CCAD0316A1A4A3C631D9ED4B0F0D0
+6DEFD47F6EBEC82B2F680E300FE42DBA525E0783040E515679FD9E29412218E0
+1F9EFA394D0B7F665AFA72CE42B7ED65D4144E80AB7369C74E9F84B2DB3A6FBF
+8CD88C660F746B452BD99C75C557C6F49E68593D068CF992854B996327277CCA
+7FB50DEC7C17263BB4D209B6A0AEB0D45B77B6DA31895055C392AEDDEFA1FF18
+FE2F5CF4E94D68FCA1439FBC32FDD986AF7A947694F026FA9A72FAAD00C06022
+5E61413D3FF06FC2A74815657666D45C797D20A294ADA0255AB7C6B053C21464
+9B5C0CEBAC0B282A4817F068E86CE1DFEE0B0D2D243077C18D3E134CBAA7A281
+8642C76C1DBD0059FDA73A13AA8DCD378E9CFB16329B2EE2285D4981A5C8FE2A
+A44B3C4130FEE029061A7AD0B4E4E069BDAA1B97A28415203CD47B45B47ECAE9
+F8DC4FB177B7E0599EE0250DA1782D51269E826A15964938F59083A7C372B380
+0E130C5ACB824CB4EB9DCF09449C17FC4ED66D2B21373118AC780958C89CE3E5
+16B89344F7A0207085A9C60B48C57A379BC463BA2DB695C27596F089C541D635
+B57F1304F4ADDF3BFE4F6D4F5DD4807597EB9C1F93E9C451A73AE9FDEAE39BBA
+FF36EC5D920B4B041903960E0F301DA0DBE6AC89578C15D396FD7D30E8B5D452
+5834BEAB6319555DDAAAD16F3208E6AB503D4D12CA34CE5421B65747BBFB8EC9
+DF3F89B704B8330E54353527EA338913843930F131E6877C06612C91D7CA8EF8
+97B11BE6B46F984BA88854EDFBC412054AF5D0954BED5FA40C80049252E2943D
+794252A3A3D8EEC5FCEEC42202BDF237B52C08880C4352986ABF812BA76C8572
+00334BDFAD40518AC034E6CB8E5435D6487EA268708F9CAE63EE39E456420DC1
+56C3A41545A7835D921256A203ED551E79E7F6F9903B4BC1D2D83FEEC81B76F3
+BE19DB4AF3E6BA14E5DCF0B3BCC2B0C86CA2630EFE89D5790A1CFD0C8D52514D
+87573FBDA73E98B0301D2CBEA419B296049DA09666D498203B3758E098FD37F9
+1FEAA2F0C8D49AC5C6C8E04E8087F29150E50C0D4EBD9857EC8C587415B57424
+0F0A3134584BD9FABCA8566AAEFF065F46901BDBB36DA1DE58CD70D6D4DBEB05
+8EF41261CF94AD09A6A02D5D89DBF15F9BD641C6B82773EA38B6392C9F5132B0
+C3707912608756E277D253FE00E23C4B535862A0C99FD7435B8C19AFE3ACC5B2
+B37ACA7BBE0F65273CDC2EFEEE1FF43A511CAB373E873520EFB4D2FBC6FA4C23
+A11EEDA078574C5980471CFA9CCEA5D59F1297C71447FED173DC62CBFF5DEC19
+4EFF6885ED29B857F2DE2312D6F14835FCE098462E9F02D701D0F2D2A94AD756
+E375B950B593CB132D1EC9146B53CC8B1A057E7DDEB1BF9CCD1C88BDA332EC75
+7B7F019180594638792A5B935D7C886A6E6572529DAD20BD16ECCFCF31517608
+207CFE03E8A7E87B0F29BF4363FCD14C18A6FE7CA3974D569BA9FA2922445E39
+BC4242CAA8ED91C4CE36141010A01A17F5CD160F4A1A7C4BBBAD67D9868CE28E
+20EFB97C2B840BFBF5E73A98A04A8DF558E0453BB6A561F5779E91262F962712
+E18F4E2FB5E918AD34E797A7E25E87DAE39E4FA81DA40702499E6BC39391B23B
+5FCCBE0B273C3AFC1FB64E8B6B8AF4B681C868A01E59A04E02231BB8407CD182
+F0570389B4B39CC599E03C66E5C5D03BD5C0759F5E476BCDB1122C3A689EB3ED
+2731820B2EB9F46CA40980EE69E6EE147A2854E8DD060B3AA21E096A8E661CFA
+7ADAF3BA20F230BE6BEEEE59D7B037F421BA2377BAAD5AD9DBD2FE236C16ADFC
+43473B792F9AEB1643576AF86476F6D19DC980DB1B5F4FF4BD385B629B3E1B79
+E3DCC0333D6F63050ADD53D3F84579945DFACE63744C662A092F7C756262743D
+FEE700588806241DCB043B259CDB01078E7C6BA126212597FBCD841B555D90E2
+F79EB9ECE179909F7C44436796FC93DFA327552CA8ECD0C19730B9AB9C9FDF8E
+97FA4066CD918064B53DC4B8A9F564DCD00B476F761BFDE9F605DE2CDCFAFB6C
+06A1F1274B9BEDC5F2683D87A360C4A0549FA3B864416418D9EC75CF7F1EDAE3
+E0E0590C59D3FA8B42C22911FD8244FC588112616346C1A2253F600D0A8CA5D8
+086CDF8505DE847C3321EA8D2297DD4343C5951B928B95E999ECCA8F7CAEE5CD
+326AD2F300C8961E317321A4600B97194E384F84190772F381D543EB860C8EF3
+ED0025344C08CE76A5F768D7217951F3B8675565CA2417349D150B5805BA9089
+792A6135343F1357644C50049BCC150EF05FA7E788DA9515BC0AECCED86B919C
+6862BDE04DB76AADCB7095DD3AD72FE7FBD375A24526C7E0C79CE575879EF500
+DB261BBFF7076C45E03FBCB17F10CFBE5CFE712AA9BE70E9C1AC11BBFE437E0D
+E0811F6D24971DE9C9F7BF0867D7859F808F3A34F9A75E4D64E0F186DFB4C9A2
+16F2DAB020BF454B68B5FF7BC79A2B26149C80D88C258D42B82C0D8C4D2C497A
+43234D6B8F08C10766A237A744B63090BE6480DD3BF61E52A77B24AC8E9263A8
+D18859783FB9D65C991C46C57A3782DB9563A5B8129BC9C78CC087A0A34AD9F5
+383D8AFEAE4EE7AB8DC18C529C0CD79E17EB290206AA872F248E732A1D1C9865
+4B45C50220339B558865784BF6D2D1423A78CDA03B3BB521768427BEBADD7555
+6D180483310D6EACB8CC236F81BBE0685AC8F56795683DDE91722D4A3FFBA24B
+386AED629619715797B88D83091D52B33FBFDCBD3CF8CFD9F993A3DFE464C627
+7FA61A273110BDBC9D897725AA5B1593FE10F74BB68761AB1168194879DF551F
+B464A4AF554DEB374D1FCFF071BC554A5D58FE9E29E5276718EAFB0BDAEE3FE5
+480D2FE83F12BDA1192C9D165677293149296D8DCD78E609270B821651EBE9EE
+17BF9B48BB958181C84B1A455141AD2DC7432074418DEB26FA90B8BE391A70C8
+1A291570EEC07C0D32EDD5D21CF6164FEF20728572AEF32EA74334CA18FECD9C
+34E76C798D187AEF66B51A0D3AB9B396CDF64B80EACE6CB50A2D91FCC0E7D6C0
+1FAE443EA3F8774783238C336E13AA8EE581F3555DD159951D860628BA36F573
+CDCBC6EE351395A5007B4F1BF2BE5E770A8C4F8AEB7CF11DCB80340986B0EE66
+A03B833587D904D1E903C4538AD6091C4C199ECBD5E9A9E7C952398B537B645D
+ED28471C3CA16D4F16B8F9D42E6177D1F5978AF1B35FEE4507E6A90A26B9F459
+19D300A92CE334FC8C653A8EA88A2390760E548C7BB1A81FA23AEA13B7B9A3B4
+95A77283FD0CD439302B1344C349A44DA4A9318C09E841AAAF50BFE7B6B855D3
+4A63FAF84587855C6E96D27C7F32E98EBC015C81E5BBA3B4FD305D1A7EE4DB3B
+C578D18A022D963D12C37630F5E41A062559F6BB8DA38F2FB566DE5AD8E85B35
+B8B1A21EEB6668C65A73CBCB57373BA393254F80C8CF23F9A0C290546E849EFD
+4510E6CE0015511A5B80C46BDDB98FB309218D3DFEEA68016EFE39B6FBDFDABA
+97B81E5EF6642D41B8B67A11FB665CACACD38EDFFEA12C7DF93CAF9AB4638831
+0440281A1EF338475D1198E61A3761C8806DCDC7D67ADF9723093894E47B4D6A
+A492FC0F121F69400B03E5FCD6B9F62DDB79478BBA426FCE1CB4AB4B073444C4
+4CABA465C7618519F021ACF198E058494E1E07EDC4E9FE7DE079DCC1EECEB58A
+5EFD843C9D7789D577266A3993FC8B975FD7CDF34B73A2C7DF0CA67BDCC32E22
+0F51BB22F703BAF05C1F942CE2A1E19059782948480639B4DF983C394D7E7E1E
+F254EC11D4784EA989186FB3FCFC69F56967E78F4DBDD2E42C15E439AFF91B5E
+5596DC299ACD88B2A4A73EF2B849E3EECC0AC9DC5F2AFE412E7CD0C1FF22D7AE
+EFCD278602F24A45D103330C0016A2A03E28257B8A79AAE1B4B5FB10096FE963
+BA3AFCB41BA533817470FC4E6242A21D7BFC0AA63659627F12B590905B1C815A
+C0C4974FD5A7353657E03001E28658FBF3D8CCD38403759B32797118BDDC54A7
+C18752F62DB85C128D88EACCFE237F1D57CB38E5CCC9D07CBB9BF522CBA91BA4
+3C63F201AC013CCCC206CC494286406CB0ACFA548E59F63B9EE7C3C09DBF39ED
+355D9849EECC045CD99384934172D4B06ECFDD103BBBAF6FD72ACAE95ECC222F
+C3E1D52B5FF630FD40322B025F24BC0328C4F7DB73ACA6A4AA41F00A7EF49CD6
+D89698EF1D4461C788A3A0573AA0A51F17443A41DBFBF64C85A2DDB92CFA8439
+FA5B56016CE952BB12D601BA905C6861A90974970C07DD57CB489D9B7F2BDB15
+D32B49FEC3B2DF2B99D23A8A7FCA361414424D4DDC6040585F3A661FA10BA5CA
+717BD3F7AAC86BF54AB116A4C4E293DF0A37253F2DC38833C15D619BF5268865
+10FA87433C9D6FE121AA691D77A4A701577A9BBC488CEDE0D2015D2CDBB3831A
+7A651359194F066A00D0B7D848D6916357641344C7CDF2F1156F681DC4B0F97A
+320BA45B98E0BBB9FA677E876DA142D06DD926FFFFC6DA7F6EC484D3A803BA3C
+08F61CF2ED0ABFCD66ED93060E45B7068325BEF53F6DDF1E48B6145EB887F819
+B39F6F79C70C1658825C28B79561A9A66AF79447C786EB0034890C173185DAB6
+551CD02E1EA6849F75FA6C0A891639F1CA1373A3458CEFC909A89BD6A2FEB96C
+7E38010AECB039A33BA1B82A00E9728B13AF760A7A420B1BBF24B8E9713EBBDD
+57E5D69259F4B50900FAFDD3EF8AF1469189D24BC646F0F958069A563F17F567
+B1846C75DCC8E5068680E7E893B61C99CEF73F52C4A3FDD947F98B4775A754DE
+02778088194C212B1228BAAC6BA26CB133630690D24E2A533ECF1E97586DE1E3
+DC61FABDA612B9548CE55D2413C94815BCC9204E2FE948EEC675CFAFBBD98D75
+A952025DE9217A55B89834E5F60E49494596074473AC25DB530BDEE564CC395E
+D68B70D422FC6896E29220153D8172C0DDCBABD1505A9C0D01DF7689E8B41498
+A4AC0B3FAD5A642747522C52187A2E442EE9E492EA4117172C27B25230121813
+D3ABF7622268AEB835199E84AF2C57DAFBC1ECE9EFDEFFAC71E3D439524D9FBF
+DD51D65D03A0F75F8E1A49E9D350345EE26ADE5ED627F39F1757D2F98F805BA4
+6FDE80FB63B915AE92DB29FBB7F44A57EA530E0EB7CDEAB857CB13C7B7CAF327
+D4BFC320777AAA5CDDA46FDAC045DAB1AFA65981E0B9EBD8C9CD92F75CAB251C
+56C3A5851C675B70AB474C8D2C4E3A844D66F145275865F8F2689445B4FBE274
+A7788411A3216228DFD1C1A70EAB2D803C0A349EF1150B368E2FB6CE5B535D2C
+025A601EA9363AF4A961145363D4B02C1D4DE8FD459AF9AE23F8C885AC8E66B9
+F34197484733B5C41DB7F38223CC18BF8C4B4C682C00EB2680C1A47DF7B1E91C
+3F94171D98B22A6474FCB4239D801CFF4AFD2EC4810619C04ED39CEF51A45523
+B87B774ECA3B61E32C7B1CEEE65C0281FD3F46697F48489BDB14BF0560E0925A
+5ACD0E69FC0BAA13AAD12C5BEB8E6B02EF302EE049023A0839F3501896526DA4
+184FE5CA04D07084BEA4011D556E97C3DE98AA0464918E5DC36FD25F7FC22646
+5D87A66DF8764D70E31D4FD2B8F631D117A106D53C89A49BEE936CDB30E18C49
+C212C0C2DE3ABCD348A48999EC5B204299A0DC82F2495B4EA96E0B4506483157
+3D32E83C83F85100F17EFE625783894E6F0ABFAC2FCD8AAC3EE7EA170E9E3A26
+48D00A9B5E51F69A133E2A58BFFF8D301F6611C72E8AE67BB82158F9A65B63CA
+D173C56BA9C387E2BBA8299A1A8EC5C6CD2E39CB828BE33397DCC7102DF7728A
+4E317B58094F16992E8C1155D8910425D6E4D468554DD16205CE43EDC33D3402
+C67ADAB3271555EAC089D36EE7F751C2B9FEB4186BAA2239D3C5773395194431
+590D4860F9FF5D6960FDD4D28A5B4E92389CAEEA44CC90C36992D780C7E5D0E1
+56BF0E3D75AAABF24C06A12DB86E5B89F473D30458CEB0A4021589391C38D768
+AFAB16056EC8C054513872A7015038237AD27D76EDD37A7E0DEB20D7580296AD
+A70536C4484D0C459E32E331579E923AC0B81B8B7497D778498F98338EF7B3B0
+A564C3C7CCDEDEF299ED4294DFE77D288CE487B10FC63267ECCD88B8F36070A9
+9A3E25FEA50E6BEDF43CE897ED04C6CCCDDE1E6C846CD0AB890126681EA0CFFF
+927EBE23E63161D75375E8B320724E6D896AA3467B75C9E61CBCFCADEC7B1D51
+41862525340CA95FB06E828E5E4E44437CCB14C1E92384846181A727A5748A03
+1E58F47C0CB8332F7B5EAE4CE3DA5380ED887CA1837931FDC508F69F5B47997A
+4A243B254201274F7B0038CFFAD2EBC6D0C653537C427878606A01B1D89552DA
+19EC93A2F36BFA7EBE0EDC86DED777600C6C0235166F02CC9CE77CA0550FFBA7
+7F26C94E7899AF976628ABDDC64F2B3853176E3209CB141EB90D10E62BF95343
+CB42D4E71FC7EBA282C3F52903955611037F74DAFE274AF2EF631A7F89498BBA
+0D61D9A744D113E572BAE7EB176E470B96979119FB738F8E5A048CF9A06543B1
+175CFF919E5CDA4FF3533449390B153E5A7361F01813A3F0B35F73C320C48959
+48A6A46F5EBD1D027D1E2397B95B04EDD775237DACCE343B2D868BC97C009E3F
+3BDEAA329D265B75A18CC22C4A6B6038C218AF3FDE10EC81D29A5895E573CE1A
+0FF3A730510952530A43C1E0093EEC3E1E8D0BA1F32669888C831BC61583DF6A
+E30AA23439F5CEBBFA176E8516868B95B0A47753886C56A03A71AD9EB4DA2FDD
+8E0C66111E0504F2CF6F2E98B2F244850EB7F9D0588F1D135EF0D54253600537
+01EAFDFCD9219558EBEC100444A4ED143D3F0666A010ECA61A61FE4F4086FA87
+9363584AB6689F6072E7E3CF1386CDD52BAABF193444484B90C6DA959781342D
+69F6C37344912B80CC414D3B763314AB2016633D7AD6838DC5DE7169C97EA89A
+FBFAA322E5DD7013CD78CCE43AB9C9F9CB4C549AF48AE1107E0A371720695274
+8AC2B221E321085BEAE67A5F28B913BF82C8BE9C8ECC91F4F0E207CE9DAA453C
+96BA6AB3F816CB68C8CAA7BEE72D06BB81A4EE0D07D62C8B377F5F84F0DC0C5D
+07BE1B902748E92CD91ACF4FA925DC20A87B1D68FCB8BA12BDBECD4CF8158F64
+C786055BA9EE8EB8C04977D513B264CC2553678015B26F0BED0B6B40E9C918FD
+CF921973F8EBBE6069DF657140A78B27FECC079449D2AEBC5AD41D096CF2CD8D
+99849B5F9B0DA598260C4F219AF1C76D786A086B6926A41D8303BF33F59A39F4
+5B4F4222B36107A9DC2CB7A28DA2F6ABAB02EC4B8360436768B941CD0B590E5B
+E8BC36DFB239E726C665C6DD29D3BDC5292201A2D494C53A08B1EBE9AB477977
+BC0F431FC73B4CB24C18E43FF0940577EACC17DF5AA1F68942A97545AD204004
+0C52CCE5F190EB02A982A0F66E5351EC5ACA8AAA3CCD8A29E1AB3F12E5A62E2B
+BE89BA28C2B87C2EE9603DD2AE947C0C9319C7E946E11212A45AE94D5520CD1D
+4335107FE43273384211882110A064486C74715FC6EE0A08A6DCD1BD4C9A463E
+90D973F566C4914DFE7407E1518F90739FD341CF93319E34C5FC2BCC37CEBD1B
+84E1D1C16A6C8D89651160A4980327F82AB41E1DDD66B2F579F70DE0F41009B9
+FB28299E902B4438CD191233B375107693A799B752880A5FFFDEB0BA29F1D454
+20055129029C8EC38D9C73622288B3CF85FAEC74DE342A19F8E91573CAEB9706
+7D6060BE1586EEFD709F325722E4DF41D45C24FAD348B246B14E4C6933F696E3
+1C0325BD8AA56F959381D28E578E1C097252F69570A7FD1F51B23ED588797249
+547690741C8C021CABE87EE439B5C16B6FCA3465C571FEC8CE6B83977B9F037A
+259480AD370875BC54454CE3A7A8C454A70DB840C51C057ECF53CEF2FC995D53
+4C01
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+%%EndFont 
+%%BeginFont: CMSL10
+%!PS-AdobeFont-1.1: CMSL10 1.0
+%%CreationDate: 1991 Aug 20 16:40:20
+% Copyright (C) 1997 American Mathematical Society. All Rights Reserved.
+11 dict begin
+/FontInfo 7 dict dup begin
+/version (1.0) readonly def
+/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def
+/FullName (CMSL10) readonly def
+/FamilyName (Computer Modern) readonly def
+/Weight (Medium) readonly def
+/ItalicAngle -9.46 def
+/isFixedPitch false def
+end readonly def
+/FontName /CMSL10 def
+/PaintType 0 def
+/FontType 1 def
+/FontMatrix [0.001 0 0 0.001 0 0] readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 0 /.notdef put
+readonly def
+/FontBBox{-62 -250 1123 750}readonly def
+/UniqueID 5000798 def
+currentdict end
+currentfile eexec
+D9D66F633B846A97B686A97E45A3D0AA0529731C99A784CCBE85B4993B2EEBDE
+3B12D472B7CF54651EF21185116A69AB1096ED4BAD2F646635E019B6417CC77B
+532F85D811C70D1429A19A5307EF63EB5C5E02C89FC6C20F6D9D89E7D91FE470
+B72BEFDA23F5DF76BE05AF4CE93137A219ED8A04A9D7D6FDF37E6B7FCDE0D90B
+986423E5960A5D9FBB4C956556E8DF90CBFAEC476FA36FD9A5C8175C9AF513FE
+D919C2DDD26BDC0D99398B9F4D03D5993DFC0930297866E1CD0A319B6B1FD958
+9429B9D40924DC059325D9D4CC0344F3F997A99E6CC0676735EBCD685AAC9142
+08DAFEC78BB41AFC2F1C219910BDF41D6279284EF600B69776CA15BC8A34347C
+30783C52AFA60FBE3E353E2AE354CF87B558776A22C776C7A0B5AB5CE1F941EF
+C2D9CAC37294BF407A671F10E4743BF842143F4F7DFEE643BA3BBD8BB9E3F24A
+BCCF7F0ADF8BA500620C81033EAE8C4EF2C1DEF13AC575F1B3BBB66F093D3B78
+5412B82B67FFA087AF57182B2230F9F2137180CA58A7D9B2C822FF04BE6CD01D
+43B2CA7058C7B953F6D9B5D6E91ECBAA5CDE1159B0E59C83DBAD96D6C8C8BAB1
+374EF652D10C0F3EE7104472C98DD3572AAF2D45A70BF7061447E21EE3C3BF23
+DF39C2D1B35B42CD5297BEBE6BC94F7C9DC6E61EC67E4F677256FED9064BD3E4
+B51A71B1D27CA4E5AA9E1D8080E6DAB5310711EEF87C40859FA935B19524AE83
+63B163FA8397BDFF443227FEDF7DB27DC35D89FB1C5E435DA0619A5C88AFC73B
+89A2DF5E767C5B536BC7167A840A0C32BD57A14DE69A7D0D819AC36FF32F908A
+5070F32983BB007437E3500799DF5E0AD3710A4C0000F0098D5BE99F2EB9C1C2
+C444FD9552D0DCA098A94B3BF176F511CEE13DB7EFFAED7C47B5ADCF8D4700F5
+7B6DF50EE617C00966B9A2828882804DB7477F4A8CF5345B7F3568B4F72BCE73
+2E2AA5BC4B4C70E21F3AD9AFC3B8605A00D67EF9ED1F4D13DDAA920D45B43CE0
+0941BF17CF05D2B777C11D4D844AB20C0693D1DDF00B27D9E1AA2D98A4A06CC6
+D342AD8F644F4787B66CA7D861E7CE13FCDA85C1B0C9F94009768EA89838EBA2
+7818F40A3CBAFE9BD3ABDEC16E56A061E3D8BDCAA7496D85236E8E9F367E6A91
+8899D14E4FE387C2622661DD1B2034C83AC85533A4FF10AC4AA0904C9D965C23
+E5FB21A264242B60B3D723712DB1C7E6CDE1725588732D2015D40FD5DEC0863E
+8320029BBF3F90E947D34F99F88CCD346D1DEA83AE8E0D5F898736BAE8398BEF
+E547ED0DCB01E5F4B7D8A8485E9E1C5DF63143FC30A0231DB7571CB33503C85B
+672147CD91A8317522E45BEC7DF430828265EE5A55D33F1B875A075B423E65C1
+55D155EA8F7C766AF61FD509D9C99C8F38872F703739368548855C0B0FEADF46
+F6EA9A77B68F598BEF9535DEABCAE2F70FB0E4B05DC87892CAB78B55D40624C9
+04EDE7C5E525952635FB3059CC14EF7874E823E5520FEAD85613CEA9D5011918
+2FF1F9F1682DDC3E9B10559172A814DB77E89D87102630AE9502222612D14E8B
+18DD83D3F0FA239951E9111AA35CE0FFBF2294C3ECC4F053B1DD3C688164E7C4
+8C965C3474706163EB83BE7031E212DF471C34CE68CF7D70DD29848D8C05236F
+421F25279D061BF76853C3FBD8C0DE771F52AEE2C073C3F41476A2224CAF7390
+856B7A2ECD5BF46EF467E9B287AF931E334DFA1B0018C107C64FEF306452B6A0
+A63117B670FC331F08E0EF834B994A1AF7BCC480922A7FDF74F175D4EEA169D7
+1FF9161B866CD6978AD88F4DEE1CCC0C22498A58BDF7CF4264ECCC81686451AE
+D285F40242479B95BAA84AE32F97AEA31A3AFC45DE6D8E1589F091413B865D72
+99E9231D16326AF8A2B70E0583D57FA6A389B913B206E6FC8EC71136B1C1EB61
+5CFEFEA62B273B47BF2785C20A2B490185CF414800B9C7181DDD2966D19C0A48
+E3949E779E7A37DD5F123228EECADD70FA07614FCA1420B2BAA0B1552F072057
+530A5EED48BA1E49327FECA2888C40C69426905BD60B960C531822346DBD1DFB
+EB71B9BEA3DAC83F6FAD7485BE6ACC31CB469D62EECDBCB3C14CA0A8CD4A72C6
+E516817520FD82D31A1C99A5337F71E1D5632A76E166E68F0757663323A916CB
+3D48CF3448F91109909BF6331982658F418D167C9C8A0133DD53D86A930DEF31
+AF0B2E504EA1F94E68CC14E9AD5E49D41E74759BE49A271EF14D62081959550D
+057A623838930D0515F701110146AAE3E5D6817E4757ACB14B5CFF85A867A3F8
+3B47821D0F16FB60A0346D0F46BBD63ABB6F00D23AB0B3162A72528DE96A7A49
+D33CB75BD8F637D32A2A937AB39700E30411F9C4DC93A7454C485903F81A5C8F
+9F53684D59147F0A783D92FE163965606AA9656E1B245CB21FF345165A6DA0F3
+5FF4BBCBAEB32103F45616EC2963917BC0840669CCD97D46D892BD95D0AFD53A
+5384D36F72A3B2DA10569D05818AD1D55C3BE41834B6992072E693BCF656EE20
+2835996FF99A4EB2075B1EE2E20695E8A039D788B53F9467438C53130D7FE320
+B65A1E16EE040128DF932BF0A0B180C838CE7542ADF8AAD187BB769182F53897
+5E84E3F0836C26D7104A178CDD976B87AF041B0B2DB7B2A0B3B98FB8D16A7B29
+335331C128BF78F0E3CFE186C974AAB8F23CDB283118159DA6766E17DEE5B1EF
+4F608088A0CED6ED465CA01B27A7E6F1BF8DFDD40C559014F8D65D1894F22CC5
+AFA7F18F38F6ADCC89529BB1A5F9B5CE3A5067AA7B17413C5C16086BA8F1AD7A
+0E1065B54F5A0D2511E4E779B2F4CE5E505DCC3CEB98D4BA4F3F28CC7EF2D305
+0656C55134F0EEB77A9CCE3E6151A9CFCC7005ADFE32998C6E79A46D03A53373
+42B7D50641F802F76DC08E8D2ACB7011A6A7AAA346BA6C05BA6B4372F7EF8943
+81E15DD7306E1EBF900220DD72E50A5D55A840C1634FBF4C58F0DDBB3F18CF12
+A99FD758F7A598EA4517D512DB69A06C672DC1F2D1C6FDDDA60289AB9005FED6
+0ACCDB75328F262213699545DF28164F801FF7D86758D7D6AEB69346BF974EFD
+0967F89A38E9C392A72A6E52F09FAE76844C66E38809E23BD20C3C963AE64C4B
+5E4A248FC50AE2C739EED7AA04A8F5663644C9A597E790BDC148D695D9A09DC0
+4255440738E531DA0610D58C84322F7D88A98850BB660430BCCD0E4366D709C9
+1693C7EAFFF3EC5E1E3E1C2ECC1DCACF547072F0DFAEEDC82A761C8BFBF281F5
+32004366503014BBF94D1FA67491BB410B74B399750FE176E55FDBEB5EF05746
+6316C13022E5F0F681BE0B48DA57A08B9C578AE362758A5AFB7AE95C180A3A6E
+BD63388107B0581D2EF6011EC3E6A0F3314D2D5E0CDAFF39BD7CA16D7127B6D7
+BFE2622E9036A97C13B887A808A697563EE375E8BF35184694123A7311004F14
+FB923D3162CF6E18D4101E3D03FC496B4941B24085583DAC124E13185F34BC16
+CB5357031A2EE7D5CF085A06AED38D246553EE200D16F83069F6D5CBB254B882
+C1E1DC0639C7838E8272818E31FC42958EBC9610A02BC76C702F3AAE5FD965B0
+ABDC7E4D76AA33ED2B2672C00146CB84E336C8171DF44FD03768A41BA20E74C4
+E1C8A4B6983D877C4CD574652BC101CDEF68FE7FDFD9890163E9991BBCB9900D
+EB38C0EEA027B1FF1EDE8FAF74298025D4E980AAF78F0F215F8A79CC2FE01AA0
+B2FDFB3B62524E85E57B09844AAC4EE5457EBB6E94B26187F6D9C0CDB40DA66B
+67124BAE194EFAE0DACFC151B4DCFBE62EDAAAF73D3C35406B4DC63A52F640C0
+1BB69E4DAF62B54A455B08C13EE090695E298F7298D60081BB180725E265E234
+6298797DDE5B729BA62EA1476171D371F441C8E812A78C07E93BE7B54595873C
+41802D035746B9913146B8900A0B6A72D45495E9747C6174F425F0D541C4B965
+C93DC19B7DD23028247500D4FC6B56483311CFBE2E3ED7009E0BB448F4260429
+1B6E7F7F51B8EA2CE690FEB9E399C048B8A44BD6427266A531419995F63CA763
+6F33472938317C8B4DF4A08288239DC5CAB08CF2B685E06C025A080F9AE859DD
+92AC686E5A6750E1416CAF269808C2B41456B85E90182ADF7C49EC289A584A13
+8F4423E055FBA92CADA57AEECF0B080F588E467A56C0D5BF3E5474C4AE72C9DE
+7E58CD7019A120985CA7466E7FBDA1A3BBDA5851F29FD9FCEE6D4C7E83DE8D01
+30717D1A87D9B2519F83295DB8D129E9FE6F63EFA562F2887EAB20251B38F8E2
+FE3B426F6B6E3F9DD18044784D031FE559FF54FCE638FBC4E431A5D2B1FB4598
+0599EB21025127EE5984E4B9547C9174949B8BD298851FF2279F49DDB60CD6BB
+C791FD5C98C9F101073CAF431807AAE3EFAFB62C26F20B744BB9C2AB2CA7685B
+EA939E79AB343F7C7682E7049EE484026A87422524D7F05E74946EF3EA3D3138
+14AA4D5B84888F0324BB693DCD9D488F11D9AE9033B9542226D09F3E212ADDC7
+EEDF0E695D5FFA6BB8736924271BC6C0EC991E123F2EFB42CD4738C089626585
+D6D9C81A5B600986D34F5746F58BD4A3C6018786F83ADDE80D4AADAC74AC5D57
+92B3B2AEA8A23CD46D96C73253430550DE6A9D38318D19924172F753A925852C
+E254E291C75D2A2FAF88E8B1EBC9338CD4633891C274A891C34BDB36F11B4539
+09B3DFFBA7C8F69F130782B2C52BC4FFD73AFB85E9B89D77C0E281656E60DE46
+96AD0403E5FA280B5125386976E1931ABF92869B9FD35FAE8CBD8C81C6761A0A
+A58BED448C83D578415C9F3C6651EFF09F06D3232048EDF12BACFB2C79D88C5E
+266A3AE6889C188B9C0AA2B08507960F779B4DD780C1BFD4897B5C9D54AFA801
+821C4BA6E0388CA3A7B4679425C777B390518F169CF463976039BF7FA2EB65F6
+C0430AC41C449B6B86BFEAA1FB31141D790F3AED1BA2A996D09DE2C2562BDD5D
+5CFA628A96891AED8619606A54B7C29F92922F9523CADF456632E7583DE33282
+B450298AFE02A5FF44B03753E69D688049379A58D9D64CF54D838F3ADBC2E189
+FE9533FA4CFAA739984DFC92B242BDC27A9B2D7EA5B7DA2BD8E68F56D3F9C50F
+1787DE3DC6A563E026E0F825EB44E94AE20A166126C23D6C1C50845D69CEDBFE
+E5BF8BB1CD69ADB8719E0D323248A16BD5474EB8866B27D076319E2DD94E22F6
+B5775E1C1730A230DF4A9B6E755FE9ADE2C2E52050812566548AB8D23E3FA2DC
+0D7D40D41E7FD479139C518C62755AA7AB849147A9DA060248AC709BC9AF5397
+E4C2436DE40DCC4DB45F25A6F13A9CEF167844DEA396AF7F276F3E406429BF4D
+77B52727620D1EDEB498AAAF82882A64A536B27428DAD07B65E4F67204F5F6EA
+640BE2DD1A4B0C3219E0A4078F4E724C87EC03F40687457FE0A33BC7ED668E0C
+1ADEDCB711CE4B6C3FF6C6B795C8D94AB21258B80EBE07D5C6750C31141DFCCE
+D040FC0ABBA2F70FCE652DA2B054667AECCBCFF2CE44067C59D9B519DF8D0BC3
+601DF1C69E3C527D3DA14E300AB16DE394C3B6834224E6ABD0D3C5D69CDF3BED
+0F1D25B40E43461A419E09EBE7C064431E1A65E38381C3B499DC14A5EC914115
+0EFFA2A0D3E3410C04BA946888CCF34B9E14CA34A9AEDD7EE33A21616222E1BF
+E452124F8385EB91CB3B150C09CABC844B3AE4A6F160A76402FEFF88143B8EB8
+7861911F813B9F4FBAC396AA1A0044583B6103CD6C06D835067FB4A805F012F6
+8B4DD3A94998DA21774A2F367BF35DC8DE396F2744AA755FA1E9CC924D55936D
+FB5816F04D690C73F9A6745A31F44ADC6AD84E5EED1FEF8C79FAF887254B9B43
+1D7E7D936EA73A6C17FC206CDF381B43CEEAD16372472E1557C331BD84AC314E
+0F0DD068CF5614855302073C29D827D25AA28AF4EDA5ADA51E7A41D82AE8C541
+FFBD51070BE1223BC469284BC7202DD0511BB35187CBF51619FF6AC2C4EDFE3D
+59CFE708C4CCEF1477728909812020747FCB20542187D663538CB4499E0F1E78
+E7A855D1B98CC60EE8E94484067CB726E97FEF6B73806DA6AE03A03A999CD3C0
+448BFA5D5D84D2CA2FC3FF8B9B0C44EA6301536D468066263726581D67AA247F
+2474EC9818DC904B50A6B37CCB054D2BA43BE164D56A52D277ECFFBD89A9996D
+ADC9DFEF4206BB16B1D30F57229E17B22ECD569CC5184B85601B8D4114B1CDF3
+19104059BF448D7784AD86A432ACB9E9CA67D1F7E2E3AD1CB4444BDDBCD42F70
+8B0BEF950219F68CA869D4F9154AE0D98A562EC75BDE9FBB9EDF4BD321544151
+918A39D105A812662B4E1D3BA59EB980AD687F300EE7B4864FB69D6BBF9FB1A0
+23C9DE5EB29A2C67BD41A651D37FAC1EA23FDD1A6A03C2DFFF7B8B0352273FFA
+00F718CEA4DCA42903F88F341F19E16C2BE1A49073F672970206381B4560B701
+21614EA094C3B2447FE83F460867A432A1665AC8A41E099B63A549B7ACD5F451
+D4950B6ED06EA1420D679616D3290CAA8530E83EDE95826B1FBBF20E3935E861
+E36DF20550F20B97D6055B702D897AED20C970EBA4287EC14B933BD3360320B2
+D39147E6C37CFD7E0434D163D1DACC8D2D3BBADC1E064076F0B7F4C2E113C99B
+362F9A6A241ACA27BF0000CBF796C099F56097DC88725D6B7471D840C6641394
+193D994B7B16FF93ED96322766FC9FEE2434BFDDFF5C5CCCD2F7DF30E4942DEC
+8AF62A14CAE56679936650E8140ACABFC0816C72AA29223AC6EA810CA2262316
+4E7AF26429DA8E7A8C0C9C76D54DE98150D94A24A44E19C8C33FADC69BC146B8
+1A0C4E676C3835B1C43817DB3513F2366E2105527CD2AF5BD1D06821292BCD91
+93CABE6F6E4FF381D35492E6D83C21645650E52EAB1D2C2E396264BB3721AEE3
+ADD93B3183961B1F1382CE896E4324D0E113D1427DCA1DFF23E7475D31A866D7
+854BF0B6AF6E7E49CFAEF5F75CD92C3ED123B3CE6ED9B1673ABC5F74829B0C17
+5B30B59AEBFAA4F925D790A9608900D05D332206338852516817CEA0529254C0
+D09F7CE1431E27469C14DB6DF763370FBF8F9AED3D5315F1C463D967CC26A75D
+B1D3DFD5B5C3163304D2C5C05E1E9DF51B2CE1E02A42E28195349CCDECF8A798
+949B49691312BF0C2A6B876BA470B4A687B302639BAEFB4AF896098EAF169644
+DEBBBB7908F6B2CB7B4B90B3BAC1B88CE0A68FB210411BE55DA9FEA6936E9BA3
+FCD10181D209B546D84876AED9374011CAAEBAF81F3F267EE4B006274D39E27B
+F4CAD5E76E753D4B239CDB0968F2826A0AD40CC84E48B5D23783ABF374315F41
+FEB340E77DA6BC30E13B280F7B21B2D1543498E107C625DB4ED729A631D41948
+CEFC84927207FF77235FCC3F72E2BE779B6B60FFDA38B05A14EBFF0436708485
+A11EB6A7EB414994FC636E18CA5CFF432D4B7835CD3472010FFE226B178DAD46
+6A0B0E2AC832D2D32B5994B21270FEAB62F95BCF2F870EAA79A9D5F3480E8F4D
+68EBA4265CAB5563295ADF1D54DDDC9071691D996D5D34C308F9E8C440831798
+B96CE92AE1711CFEEAF45FBC63F4ABD466BCEF2299209473238F302B3B441CD8
+4640956EB3A6976F425FDD8A115EA00FBC420F49F00C5FB237013F502AA1C046
+5D04AD291DBA5ECF1CBAD5681FFC89045BD55BA951DFA7B5407C688FB0C42262
+7AF72CF53C3107F42C34FD968A0B2C4F30771A2DF688037B45A0488BD823BC4B
+0348ED7DFFE7161060DDE1117FB8B7D8883DB3AFB4C0E7FAC095869A593CA8D0
+D2851A6143FFCB3DDFB78A4C5B2795A7D3AB1355A1CA81133CA7CAC78F112759
+13E7EA15C6C0399DC657B2BE607310747070FF8C3A7288C356E28EADB53AEC9B
+47DC9892AA4D9F3FE534083F2F725874F1B610EF85FC6462763AC476243F6749
+F24D18DA615FBA3E0E7CABC0555C5ACFA192C335517EE593D4F572B068DC1875
+16E7143B1D286B6F9EAEEF9AD032357BF686B38DFE9614BED880B60D95757015
+0DAAE0DB5A2AFEDB75628DD65332B0E3E6ED7C9F217D00B5D4748536CBA264B9
+D9AA6CB4C2F91C1F16E3881155C162CE45FB3FAAC36A8AE2395062BA4EF984B1
+5BA305768358BC11B824816DC78C95446DFAC96234AB7D2C50D6C0B9BE90FE36
+1A97EDE7F382702FC6C201C23D7499D88643C0370DB8F8E7762694260B81FE26
+2E1002A9CAAF8ACDFDB6BECC91BC372A04F01E1A66AEACC16D9BB95374D5F050
+6D1C67DABDA03EEB2111E4EE8468037314F4F53F786800511D067426BF09080B
+135EF9FB14FFB49935CA055EDEB99DF36284BD5F24D7224BE0936ECE727698AC
+A7AE07B29F3F717FA4E8F31C3CA91D7F0497B0BF4D1A13B026CAF29902324471
+AECEDFFB9110B6D3F135E00B28054C9122979968E102141E1B3764C4E74DE1DA
+0E2D08B8FF6AA00000E295DE9B00891F016820A9CE091F959CE7FDD0B656C89C
+061971BCB9D12CC9938C309722621E2CC6988EB8EEA37D2C8237CE6D1995C073
+168CED6EB4F49FCBD90D11CD1A424421431681242198618390299A8BB4DFB14D
+852196DED1751576B6A4B0C4B044560212BBDB44A13DBFFEDC5B55CE9E813AB5
+E59BB6474CB6498CF1372B540BAB62CDE9CB522221306984E4D4A93D66168FFC
+94D3D722AEC33B91887A9243A5D3DD6CD7666D6DC14CAB7EB508C0B5803A0F9D
+BB6ACBC2C378AC52DEBD5AFA1EEA68B2070514AF8BA8B451247930F88A09C807
+73AB0E8724E862B6E915266C0A77CC027602316C38AF0CB3E26312731125B516
+0CB71820DAE1038D52981B29898E175B20A780A8228D1438085EE12A159C1EF9
+E86E9D2C43AA40936D0C5EC9AC52CFBD266A509E152F08D6D9A4B82EC5714FB8
+04A101407320EE732C09BCA7CB8E7C476D5D89E046690B645F19B975C2F7C1C6
+1AEDD047ABD0D6851263AA0C23BE521ED1A93B8C8914DEC57A12E6AF6652A95B
+4B5F74D32A31FC0F05EEB0EFA5841E5C42AFF8EBF4960054A930F1E1C93FB1C7
+98AE63B1A79D04780DBF480BDA2CF13165D5A354D8CF051A2EFC44206FAC9341
+D43AC601DF80A80EEC9007AD0862186139B9F94BFEAD5B0A0457BB8D7B606DBC
+419225743817957AB44B5691CD6EA83EBF879D237516
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+%%EndFont 
+%%BeginFont: CMCSC10
+%!PS-AdobeFont-1.1: CMCSC10 1.0
+%%CreationDate: 1991 Aug 18 17:46:49
+% Copyright (C) 1997 American Mathematical Society. All Rights Reserved.
+11 dict begin
+/FontInfo 7 dict dup begin
+/version (1.0) readonly def
+/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def
+/FullName (CMCSC10) readonly def
+/FamilyName (Computer Modern) readonly def
+/Weight (Medium) readonly def
+/ItalicAngle 0 def
+/isFixedPitch false def
+end readonly def
+/FontName /CMCSC10 def
+/PaintType 0 def
+/FontType 1 def
+/FontMatrix [0.001 0 0 0.001 0 0] readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 0 /.notdef put
+readonly def
+/FontBBox{14 -250 1077 750}readonly def
+/UniqueID 5000772 def
+currentdict end
+currentfile eexec
+D9D66F633B846A97B686A97E45A3D0AA0529731C99A784CCBE85B4993B2EEBDE
+3B12D472B7CF54651EF21185116A69AB1096ED4BAD2F646635E019B6417CC77B
+532F85D811C70D1429A19A5307EF63EB5C5E02C89FC6C20F6D9D89E7D91FE470
+B72BEFDA23F5DF76BE05AF4CE93137A219ED8A04A9D7D6FDF37E6B7FCDE0D90B
+986423E5960A5D9FBB4C956556E8DF90CBFAEC476FA36FD9A5C8175C9AF513FE
+D919C2DDD26BDC0D99398B9F4D03D5993DFC0930297866E1CD0A30EB76029337
+900ECFB1390CA5C0C3A04528044F266BA17BE487C79B94FAC6D6484684C5BFEA
+87BCCC77D40AD11552035E95E3007126418ED49B68468B38A14E88E68A267B98
+076F1C9769A5AFBC285E5B158EAC9F926F1D6C0B8F1D57D9C31D25AE27123518
+9D2CD92E5689E0213089BD268DA5E47525CB8EABAA4B78A15AEA34705889AB3A
+FFB8953B5B3482E52BFA0940630ADF8C0AC2177D907324299EE980E850F203CD
+B627962F43D5A678C44243CDE97853BDC6AB45FD5C09AD274DAF89929F583CC9
+CCC24BDFC68B92111055ABA5F26D2DC67C70906F71C2957701D65AE746A60C30
+40E6CB24B97FCDAD0487AE38A201FBF0E41BABD2181981A71940F1E707F91E5D
+C8CA50CB16D8702D188E56D014D92F76CE0B52ABDB9110E32438D2BBF3E6A40B
+7B005F10BB437812CAC6ED2996F7606DC962C4FDE207FF322782C343DF44CEC5
+FF06A55C630C20E9AE1B0D1C5673753C43BA0767D65D1B451CC6380D8BB3C4DC
+81E8FD8AA79BE993218686F29D3CD925566DD587F541A0DA1B1CC3BCEA2E6C7D
+5E1016F6917A871F1BBAD96AF9E867735017119A381FCF33EB2D3E1E7093FD90
+CDB0CED4818CFD9E201A03430CEC713620BE0D3254158931FB657C6877C1B3D2
+24030F377820DA58F4B95CFE645109F3F1B80DB5FACFD7D05AE2909EEFCF95AD
+9CB286C8B6C075CA2267C101B736139863186C193E31085E7C9FD88EF8BBECE3
+933542C85309013325B4BBFE9A5B606780C8580ABDA2F5D0064EBFC23939B307
+08568C3B7F5F053BF367DEBA349FABB9F760C44D100BDEEFBB01F27BFC61FCD7
+5EAC976CB24D67763C8CBC0CB43B872E68A0FAC1127FC65DE1D613223F947D89
+AAFB4FCD676359F7C3A0EE0BE2BF8A912E2E4CE58B7357A05CB75CFB62CD5F9B
+9A0FFD1BCCEA877E2C20231CFC0F7E31F536223146F955D34279086878748772
+0C9D158E3B6CA92EA5C359C620FDBBDA421B3510FEE1D118024735E213B8F03F
+B916582DB3B56D9E704FF55F61AE12B8000ABB7C2ED781978A31EE30C1658128
+F18A4B92BD9CFD1AE5D7BE8E0849AF3E1B762028BD1D1A57EC7EF6BB3EF342A9
+82EE0D16724928E3A1BBEDE05FC967AB3C511578435D0D4958EBFA1FC32C6D2A
+5E1C7E62B8F4BFD82CC2340C95799F57D486E4929F07CBD1C86DB204156E344C
+74B191E911E9476486CCE4D2F0DF2A79ED8F8623DB218CE3E8AFD4B42AF7FDD4
+EFC3A7146816743DA8EC34E955861CCDA22AECF0C74D74FA6402503A2088C564
+D44A87245F246DDD847AB57D2AC8ABFF7045341C6D046045516B2E10B85E0637
+814E135E13BE0439644B8FF8A46423EAA6CA3505F9152C19CE0FEAEB9242037F
+AB2462A87EF274356B5A4F837542378C61EA932ECFB635E4F69628EB0B1C20A9
+095107E0FE465057BD95C0EC8CEAFFF13F3EF5D9758E8BDA1D55C86A2C3D5985
+1D3B67E8B1F5F93C4CFCC75A0BC8ACE6C7855767523DD6C79E253DFC2D49EC38
+B24AB1B7D2D0816542AAA408176C485E7C490CF18F8C73CFC82E449E0976D671
+950C0C35170514AD6227A312BEA851982650498DE535949378ECF3AE72A0E761
+7CC65648D33C5FFDB48C49AF27E9C7E8D8C22EC491197F1384698397F024EE32
+01A97F70759B69AEB138CE12EA7C4E0F12B35DA8B723C43A525E461887234C67
+243CE39372C4EABCB6B0A3521C7DB601708844C6062BC9A93024395B15519BEB
+C56CEDB7898ADF92A9D675788DE3B50A97224C194756508E5C5A4E0B96D6372E
+F27AAE34A3F1BA3389A222B51C2A1373135143B80B71EB4B42AB1F09F60ABBC2
+EBA97400A4398BCDAE99C85F0A9C03366E91F1A19FC22670D608F1097AFF502F
+EFF30748B578FD8D750D28C60C4250896B87E841AABE6D442FDE4586B90FD905
+FC3D19C00DB4DB6719D58F750811B7EB3D5EC40B69E66CD7F5BCC4131B9CA194
+B27DBB7A30BB5121B7950EC6B453FCD5353F734FAA157D1F85B508B75087EE2A
+EAE9ACE82CB3A7D7ECB3DBDD4263A01D128D83B23D3BE98865C90D47C78E0E05
+C28CF793FF756DE91683370E81CF7C36C58CEF19BAAF36A20664E0FF2DC74CD7
+A6271A46FC3848DB589C50A715BFD53716C0B46146CB2920DDCC525BF83D766C
+1E45F6690AB28C45CEFF4BF426E67B82E7CCEAC6A165977BA375D14EDE206067
+56497B7E2D1C81ABBF7A5180067F1A698DDBD9E423ED67B72ECDCC2AB7DAF950
+3385AAA4384490E369C9FFCD8F491EB372A80485DF57ABEE2995BA59C397A858
+39318C7638B511AA9A40A8AD69D053A8B05E3DDF93FB876FA5007EFF920C370C
+368A2657C78F5ADD83890B4F6890C4BDD2041951D58021F5AF4CB5CF5F432E59
+C8A6F5971D354720EED8352B1FE32BCD231D33BC090BF7E1D731574C68FB8CD1
+FF9A7FFD70E3912B2A1181BDCAF989C9CD7FB3B30EF2D8280C7D3D202A7443BF
+F8E44D21CBFD72671DF0D57ABD165A9B4A925E14669A6AB0AA33462ED7EDE70F
+D88D4F43AA8A9326C69D94A76F236F85DBDC13DBDE75F590155CCDB0C18EAA74
+EEDEF95771CFF412D3C9DAC65DB3570D8211BE98C27CF0C2A536202FCA5948D8
+7C83EFB774CC1261962F1C3C05467C2F8EA3E8C3E3BD82B1F39639DCEE46F6FB
+79700257DDB6172206C6CCDBDE82268E3B5E40CB8E1A33E7C87F386086A3B015
+114433522F9D0CE343F1C7CC6E188A29FB93C2D246670D2F92EFC68178D35EDA
+BB2A4BA8355CECBC97254E3CD52F188EADB5B5825FB109E94EACEBDB5597E939
+B7F2BF5A53BACFF6DD24ACCE2DD4597B7921EF21FF911C4812CD236D95C9AF68
+7BDEC554C8B748301EF5BD6BB9C8CEA0F1E505574018CC2D599175E6A9A74285
+1D3DC0E68B0579D9AAAD99EB49D518699990E0B4CD65F7CC8EAF7413ADFDF219
+CEB8F1234D70F6B66064AD518DCDB0BF9E90AB0EE016ED7C323ACA421416BC47
+103D4ACEB453B8302BE7E8679DAC6FCC0BB614D9E312351964BFFD3AD356953F
+62F0B683EA75A83461F88B4303C046EDB518E74E09D19115E6064D62848F9E2E
+4942EEA7AB91DBFB7644390BF11B9E9DB49C4585B6427979F524419B3FD2E7F8
+7517056C688D5F051C821EB196414E3D480420619B1910DD6F7A12B5E01CAB06
+FDDAE550C11E7AC395B1F480A73430D971889772110A806CCA9B5921BC37AE7B
+94105AF102A79E3CDD32C5682043D3EFBAEBDAF7AE922211E4C4C61D37966F56
+17E3FD9A47D40FDDC45D21ADE80F6539AFD69C3AB8A01797FDBB9AC150FDFDAA
+736F3E4F149959C4AEE4B0E529F770E5E7EF9D30B040989201428F8399E3679A
+01D4FC61B6A4879D4764B23D424CBA11256ED3CE090F1D7F1328BCB5F800C705
+A19A1212A9662D86269420B6C7E6BB638DAA9460FAB9BB8545B427B417FF2A82
+486C8D114468FFA2C45B530D59AE72E7FA365F41AE589E3E1957808F065A4A1C
+240AE545A87652356BE9068277BA0B9E79DC84698139D835F3F500348317BB43
+2C59C0C0FF7CAF5CC8350D15CA59101A25E4F2E0CB2DA8E5C094B4934A189DB1
+6288CE469B60FDC50280C232AE7EB1EE123CA4ACCFF7AF51DDE258CE52ED59EB
+36DC6C94893146505F3DAD8E3C838EB3C12B13B2AA38E7F43F3139C5BC1138D4
+F1F2F52B5AE4550D3A820BDCADF1989040DD77B8EF5FCD3AC42BF884FD02C1DD
+13B24556701E3CD43B48C9FB45E5758DC7571EA4ED3442022300FDC555A5E4C5
+1456BAD59F0CB1D389F19E7868A4FE95AAE7D4236671B1E8B6A9FF51477D68A2
+BEF5BE4E86BE81F0A4C87948DFF006D1C2A47B650B9CBD121D388180721E4E1B
+7906582CE91A2A1666208B52728F1B5E4E4943ADDA5F7AA1B9487C207C86C30D
+9973327C8F600CA86DA892D70CF6E734552F6E773473FB5713759C730380F4FF
+E440E57BE60050CF5C33BC1AE10220B0B9673C7BDE4F8BB596BD41CA7DC19CDA
+F27465B9476961AAB3ACE28545F1D5DD855EB441751F838E356D69FD173205A6
+BB52BB602239F612F477DD641A44EA2D556CB113983A040CE61046AB7EB52927
+681AA49626070EB91DA3E2A46FA4A8EAC0468D62BDC73C82073CE5E6BF0D1A93
+DC54F906002DEA32C39C713FAB8EC7342CFDB57485D3E41B7E5067A795D7AD43
+5AA84210EF77C29A319562375A18F2DEF1B0B99A2BD7D5220371078E76DC6D7F
+C4D37A486525C5DA69B34A710CC938AC53C17F5E2B1726F0E552F25750E9C1F9
+5BC12260A0B42AF4710852D8537EA7301911AB40D5ADF26C6738DA192B1058D4
+B61FB1A84B12BE4916B85DD6A721BAB7035287AF68EAAB8B0D5AEF45F25E1E15
+04E9C921235D33AE59996DA03B46A81EE6BFEE517E55F54FE65F509DD7F230DB
+67D4E212757C099E6DF94E27EEA41B54CBE7EEDE78594A07C86AF80957A4C241
+67F5F5E04B0D190FEEA47562E98351B67AB35C513649FC7177C5EDD9BEDA8416
+B112E0A8C28A45CF9A05C6BFD9A09313413245F9D797CDB56E402EEF05C88A61
+9E5108353115F1415FF014E1E9A3CAD6103926BD42945BE01D8EDF875A95AF4C
+E5DB8A4DF4B25E7D25C3BF4CE69C171D21972619EB8DFBCADBEAF4201D299AB3
+FC79BE62A2E850F4FBCF04776398AA2769
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+%%EndFont 
+%%BeginFont: CMTI10
+%!PS-AdobeFont-1.1: CMTI10 1.00B
+%%CreationDate: 1992 Feb 19 19:56:16
+% Copyright (C) 1997 American Mathematical Society. All Rights Reserved.
+11 dict begin
+/FontInfo 7 dict dup begin
+/version (1.00B) readonly def
+/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def
+/FullName (CMTI10) readonly def
+/FamilyName (Computer Modern) readonly def
+/Weight (Medium) readonly def
+/ItalicAngle -14.04 def
+/isFixedPitch false def
+end readonly def
+/FontName /CMTI10 def
+/PaintType 0 def
+/FontType 1 def
+/FontMatrix [0.001 0 0 0.001 0 0] readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 0 /.notdef put
+readonly def
+/FontBBox{-163 -250 1146 969}readonly def
+/UniqueID 5000828 def
+currentdict end
+currentfile eexec
+D9D66F633B846A97B686A97E45A3D0AA0529731C99A784CCBE85B4993B2EEBDE
+3B12D472B7CF54651EF21185116A69AB1096ED4BAD2F646635E019B6417CC77B
+532F85D811C70D1429A19A5307EF63EB5C5E02C89FC6C20F6D9D89E7D91FE470
+B72BEFDA23F5DF76BE05AF4CE93137A219ED8A04A9D7D6FDF37E6B7FCDE0D90B
+986423E5960A5D9FBB4C956556E8DF90CBFAEC476FA36FD9A5C8175C9AF513FE
+D919C2DDD26BDC0D99398B9F4D03D5993DFC0930297866E1CD0A319B6B1FD958
+9E3948FFB0B4E70F212EC976D65099D84E0D37A7A771C3101D6AD26A0513378F
+21EC3643079EECE0C9AB54B4772E5DCA82D0D4ACC7F42FB493AA04A3BF4A1BD6
+06ECE186315DBE9CFDCB1A0303E8D3E83027CD3AFA8F0BD466A8E8CA0E7164CF
+55B332FAD43482748DD4A1CB3F40CB1F5E67192B8216A0D8FE30F9F05BF016F5
+B5CC130A4B0796EE065495422FBA55BEE9BFD99D04464D987AC4D237C208FA86
+0B112E55CE7B3782A34BC22E3DE31755D9AFF19E490C8E43B85E17ECE87FA8B9
+1485831624D24F37C39BF9972D74E6EC4784727AC00B9C4A3AD3DA1C22BD6961
+7E0ADAF55422F22ACA5E4DCD4DF9FCD187A566B7FB661D0530454D0DD6C6C50A
+7A3875C6CBF8EC7769F32A1F3F7FC1C072BADEC97794D4E90E0035282A170402
+356E5A9CD9ABD80AC4342A5283E458A7269252F4541CBB6452B39ED54D336D0B
+19928E9CD1AB26AD83EB209E2EC75011A2643813053B5DBB0246097C4821B5F2
+C92554E9140BE35B2DBFCD98809A8EC9FC910FDE9E0D86457C70ACB056EBF90F
+244DC0A5BBD455E15D6E3180311D52CF50B0BF7D0A7F64F3A1821E0AEDBC2E7B
+AEB549FE1D51088C153799C6E089B5D5D65E1C4E2D2B430CDF1FFA23CCB25D95
+592943209E846E55B4CB54F6658CBA3C0B29796D69D0435D5431ABECF3448C15
+98CA2F36F3659E29AEB79355EC2ADF835CF0886C21B766B9DEBC3950B5B3B496
+2E06D980A8C60305B273232D4604F12632FB4F1B2F9703952C823C098543AED1
+CFB4ECF259A11985F0C944A57B5AFD853374FCF12305601200C2A393E2FC77FD
+F78C2BEB83AB223A89D9E231D1BB561CE1F4D3312049F31CD544C39354493803
+D47CF45482054818E8621801A97461EC7BF53C6AF1C38AC90B38342D51C4615C
+59D45B92606D0479F43149F2579DEF5A20B4D7D10528E9750ADFC4C7DDD73DA8
+432297E60ABBB72A637231049425393426F66BFC0851FE504E589F13351187A9
+D784ACC207B1F46537BAA5F2EBF637EB8DFD9D24982E2631F6D3A2DA47B4E9EA
+0C899DEF82A7DEB0ACDCE6043F36CE1F74BF1B00A1EE0765F497A67B95BE1871
+A8B3263B03D41ED8BD6B03CA5983912E094E2AE47DFDBF
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+%%EndFont 
+%%BeginFont: CMBXTI10
+%!PS-AdobeFont-1.1: CMBXTI10 1.0
+%%CreationDate: 1991 Aug 18 17:46:30
+% Copyright (C) 1997 American Mathematical Society. All Rights Reserved.
+11 dict begin
+/FontInfo 7 dict dup begin
+/version (1.0) readonly def
+/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def
+/FullName (CMBXTI10) readonly def
+/FamilyName (Computer Modern) readonly def
+/Weight (Bold) readonly def
+/ItalicAngle -14.04 def
+/isFixedPitch false def
+end readonly def
+/FontName /CMBXTI10 def
+/PaintType 0 def
+/FontType 1 def
+/FontMatrix [0.001 0 0 0.001 0 0] readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 0 /.notdef put
+readonly def
+/FontBBox{-29 -250 1274 754}readonly def
+/UniqueID 5000771 def
+currentdict end
+currentfile eexec
+D9D66F633B846A97B686A97E45A3D0AA0529731C99A784CCBE85B4993B2EEBDE
+3B12D472B7CF54651EF21185116A69AB1096ED4BAD2F646635E019B6417CC77B
+532F85D811C70D1429A19A5307EF63EB5C5E02C89FC6C20F6D9D89E7D91FE470
+B72BEFDA23F5DF76BE05AF4CE93137A219ED8A04A9D7D6FDF37E6B7FCDE0D90B
+986423E5960A5D9FBB4C956556E8DF90CBFAEC476FA36FD9A5C8175C9AF513FE
+D919C2DDD26BDC0D99398B9F4D004B836D34E88C20EEB527CE1124209388A2DF
+E27A8DF298A2693A9D529916AA0B2176E6ED237F69D84A8FEEB36861D1847207
+BE2BD61C6A412FFFEDFF13AFEC32AC7735BCCE5965F5966418A62ECB99112AB3
+3BC938EC590FF6922659125EB67E260BF02885E49BA6019E696D33F0B53606A2
+F515E0C45F323311613A94B838491BAB9FE230C5CC79D22925E3D882799F2707
+C32975A494F0F9513E4D8332E7E54470D9721FBD345CDBB48286F2F19CC6D66E
+BB631DD6476A509167A49CA525A72CA50E82C1D08C2B372DB54C5949C753B632
+2009B761EB90492ACD3CBE6A35CE1B66F3BC4D8DC36827CE4261A703328451D1
+879438479917C1647772999171DCCF1491A1C9086E0C6393506768F8757BD81D
+141C46EB9BF507EEC29962A0072B6C5D8C8588F3D68886CD2606DD3BD2FECCEF
+63245494E93EEA12AAFB06110E54ADC444C7E7619627A48A464394E5DE06EB46
+4C76A2FF010318BBE48B3776C826A265C66515717F7F2E943C60EBAB23D96B5B
+FD514A1C4E79BB3D3D2DEB936F90CD3FABF7B09FF7F564AB5CF4AF6A40E869FD
+395885A88F4A138B3CA6943A2D430BBE43D91F7F17621CAF52FB7161DA3B2003
+82244FB6EE792DCA1722C03392C296C029A2DCC5BAAB3EA03F8DEB039DC83AE1
+763AAB84776A2CCFFAE9EAF0BFDAE417E8BE682D237FFEDAF224AC09C9665019
+165CE32F5349E857177D94AD6396570932E1657ADE4D3FF57A3419946CCD210E
+57E5A1D91CF708395942527D127606350924D71BC21C6F969288B1C8CA3404ED
+E6219985F7301A20621368F74747EAD38990A4C9F2B62913B8FDB93657409FF5
+178DAA7C97C35EAFA47778CE03E863303582D8A9900EF4F8DA879DED54BACD7A
+4A50C18AA2ED906FC4DC073B1E6CA1E3855AD5B7698EF4A96B77DBE19A12382A
+CFA8717DE230CB6182F2250885B8E90AC42A66484A7B527061B223A6D1CC72D4
+890359E7E04690BFFA99FAB5CC9999F0873A9DBE49E33F79E483FAD72313DF9A
+7B7D926461988C23CCE9F71AB7BB63BDB2B10B3F78176380AFFC154825C9BDCE
+82303FBFC3B59E070438984C28D12E8655BBBF049125BF56DD2B0DE8C0450E55
+82832DA59EBEB001AAD86F2317460DD7ED264611B9043614221ECF
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+%%EndFont 
+%%BeginFont: CMSY10
+%!PS-AdobeFont-1.1: CMSY10 1.0
+%%CreationDate: 1991 Aug 15 07:20:57
+% Copyright (C) 1997 American Mathematical Society. All Rights Reserved.
+11 dict begin
+/FontInfo 7 dict dup begin
+/version (1.0) readonly def
+/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def
+/FullName (CMSY10) readonly def
+/FamilyName (Computer Modern) readonly def
+/Weight (Medium) readonly def
+/ItalicAngle -14.035 def
+/isFixedPitch false def
+end readonly def
+/FontName /CMSY10 def
+/PaintType 0 def
+/FontType 1 def
+/FontMatrix [0.001 0 0 0.001 0 0] readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 0 /.notdef put
+readonly def
+/FontBBox{-29 -960 1116 775}readonly def
+/UniqueID 5000820 def
+currentdict end
+currentfile eexec
+D9D66F633B846A97B686A97E45A3D0AA052F09F9C8ADE9D907C058B87E9B6964
+7D53359E51216774A4EAA1E2B58EC3176BD1184A633B951372B4198D4E8C5EF4
+A213ACB58AA0A658908035BF2ED8531779838A960DFE2B27EA49C37156989C85
+E21B3ABF72E39A89232CD9F4237FC80C9E64E8425AA3BEF7DED60B122A52922A
+221A37D9A807DD01161779DDE7D31FF2B87F97C73D63EECDDA4C49501773468A
+27D1663E0B62F461F6E40A5D6676D1D12B51E641C1D4E8E2771864FC104F8CBF
+5B78EC1D88228725F1C453A678F58A7E1B7BD7CA700717D288EB8DA1F57C4F09
+0ABF1D42C5DDD0C384C7E22F8F8047BE1D4C1CC8E33368FB1AC82B4E96146730
+DE3302B2E6B819CB6AE455B1AF3187FFE8071AA57EF8A6616B9CB7941D44EC7A
+71A7BB3DF755178D7D2E4BB69859EFA4BBC30BD6BB1531133FD4D9438FF99F09
+4ECC068A324D75B5F696B8688EEB2F17E5ED34CCD6D047A4E3806D000C199D7C
+515DB70A8D4F6146FE068DC1E5DE8BC5703711DA090312BA3FC00A08C453C609
+C627A8BFEF75B4DEFAF34B44B356A516B765AFCDD3F5475B1F928731D09D2170
+B97E40F12CCEDF4F6BB3756C4734F6E98D74B7E942A954B1BAAB83D4AD727FF6
+DF6DC50B2223BCB5568A73A112E4860AD490554E64E780073FF3399CB4688D33
+9E8829667CD6EAEF25E0C7D2D44F2BBFA40E999325F9561514844221B50BC8FC
+4C7AD68CA7220D69125C2AF06849A3E068D18733276F0C0A6A2936D3C2C87CDE
+59CD1AF148C44F85784A5DAD569F5FF53C061056C067CE29AEF1E3BD1FD8B0B8
+71A0A638CDAC6AEEDBD5337D4683C084BB60B1859E600F59CB4E19C5FC5C6327
+EC544A68134496A9BD0B87D83AF6FDA3CB62FBF0B54FACE1F0E6A2D84B467AFF
+0F62DB
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+%%EndFont 
+%%BeginFont: CMR10
+%!PS-AdobeFont-1.1: CMR10 1.00B
+%%CreationDate: 1992 Feb 19 19:54:52
+% Copyright (C) 1997 American Mathematical Society. All Rights Reserved.
+11 dict begin
+/FontInfo 7 dict dup begin
+/version (1.00B) readonly def
+/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def
+/FullName (CMR10) readonly def
+/FamilyName (Computer Modern) readonly def
+/Weight (Medium) readonly def
+/ItalicAngle 0 def
+/isFixedPitch false def
+end readonly def
+/FontName /CMR10 def
+/PaintType 0 def
+/FontType 1 def
+/FontMatrix [0.001 0 0 0.001 0 0] readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 0 /.notdef put
+readonly def
+/FontBBox{-251 -250 1009 969}readonly def
+/UniqueID 5000793 def
+currentdict end
+currentfile eexec
+D9D66F633B846A97B686A97E45A3D0AA052A014267B7904EB3C0D3BD0B83D891
+016CA6CA4B712ADEB258FAAB9A130EE605E61F77FC1B738ABC7C51CD46EF8171
+9098D5FEE67660E69A7AB91B58F29A4D79E57022F783EB0FBBB6D4F4EC35014F
+D2DECBA99459A4C59DF0C6EBA150284454E707DC2100C15B76B4C19B84363758
+469A6C558785B226332152109871A9883487DD7710949204DDCF837E6A8708B8
+2BDBF16FBC7512FAA308A093FE5CF7158F1163BC1F3352E22A1452E73FECA8A4
+87100FB1FFC4C8AF409B2067537220E605DA0852CA49839E1386AF9D7A1A455F
+D1F017CE45884D76EF2CB9BC5821FD25365DDEA6E45F332B5F68A44AD8A530F0
+92A36FAC8D27F9087AFEEA2096F839A2BC4B937F24E080EF7C0F9374A18D565C
+295A05210DB96A23175AC59A9BD0147A310EF49C551A417E0A22703F94FF7B75
+409A5D417DA6730A69E310FA6A4229FC7E4F620B0FC4C63C50E99E179EB51E4C
+4BC45217722F1E8E40F1E1428E792EAFE05C5A50D38C52114DFCD24D54027CBF
+2512DD116F0463DE4052A7AD53B641A27E81E481947884CE35661B49153FA19E
+0A2A860C7B61558671303DE6AE06A80E4E450E17067676E6BBB42A9A24ACBC3E
+B0CA7B7A3BFEA84FED39CCFB6D545BB2BCC49E5E16976407AB9D94556CD4F008
+24EF579B6800B6DC3AAF840B3FC6822872368E3B4274DD06CA36AF8F6346C11B
+43C772CC242F3B212C4BD7018D71A1A74C9A94ED0093A5FB6557F4E0751047AF
+D72098ECA301B8AE68110F983796E581F106144951DF5B750432A230FDA3B575
+5A38B5E7972AABC12306A01A99FCF8189D71B8DBF49550BAEA9CF1B97CBFC7CC
+96498ECC938B1A1710B670657DE923A659DB8757147B140A48067328E7E3F9C3
+7D1888B284904301450CE0BC15EEEA00E48CCD6388F3FC3BEFD8D9C400015B65
+0F2F536D035626B1FF0A69D732C7A1836D635C30C06BED4327737029E5BA5830
+B9E88A4024C3326AD2F34F47B54739B48825AD6699F7D117EA4C4AEC4440BF6D
+AA0099DEFD326235965C63647921828BF269ECC87A2B1C8CAD6C78B6E561B007
+97BE2BC7CA32B4534075F6491BE959D1F635463E71679E527F4F456F774B2AF8
+FEF3D8C63B2F8B99FE0F73BA44B3CF15A613471EA3C7A1CD783D3EB41F4ACEE5
+20759B6A4C4466E2D80EF7C7866BAD06E5DF0434D2C607FC82C9EBD4D8902EE4
+0A7617C3AEACCB7CCE00319D0677AA6DB7E0250B51908F966977BD8C8D07FDBD
+F4D058444E7D7D91788DEA997CBE0545902E67194B7BA3CD0BF454FCA60B9A20
+3E6BB526D2D5B5321EE18DD2A0B15E53BCB8E3E01067B30ED2DD2CB9B06D3122
+A737435305D42DE9C6B614926BFD44DF10D14402EBEDFF0B144B1C9BD22D7379
+5262FEEAFE31C8A721C2D46AA00C10681BA9970D09F1EA4FA1566B96E221864A
+45A24ADAEC63F61C9FD18376D3984449A1F998C318A8FE36D0D5020E18A49625
+0F3BB603BA1F3E66FF412F6A32433FF8BD2968D79CE4273AD0E0CDDA5153C2BF
+F8A46A2244F9394A49D339F763F5A7411A3C29336B21CCB01723705AF589B078
+3763035411FE36AB5D744E81379106890688CB5BC41184548B7FEBA08DE7288E
+E6570FEA20C51FACE8E8F824BB61A4A038AB817C47B87391611B77928B2565A9
+3B27A573C05D36ED01D8F27CB2C793370FA9B90021B5696280A55F2CB6117B64
+293EAE0EA5A243F56FD007773CA35DF71B3D28643C25210CCE25F37A5095D6E5
+9CAFD99DD1DB0D7EAD454C13464DF6FF5DD42339797AE5AE467084550FC00139
+6EE818C6365007B2FD6E26285B832CFE6EA7E99665A224C9813C036CED262639
+3FB39C1F05FF8F31D2DEF37BB9B883334F51EA1243332FE1E3FC91864C8AEA79
+16A726F924AFD84F2F4215FB795FC41DCFFC835C90B9E31D291E47AA4BB8C05C
+620F69DF31E91A0FBA8E217CDBFAD7C4D480EBC1EB396029CDE615C227A367AD
+72834BA95539D39A38EA0CA3CF7F1123F70792CF315BAAA38BBCB6DFA80B4493
+5025F33C3696DAD6A0ADF584C71BCB1D29E523EA4B81FFCE15F3204022BBBEA0
+A9483EE8EAC07D581162672A0D66199174821ABD097561A263C0C0F24066FBE6
+0951F31FBBF2675141F3FB4457CC2A94A40191EA0AB2A606CF540BBB8887B6DE
+715EDB1041EBB9D05D0F4A4672F534397B9529EF8743BE88BBA10C81E0A46259
+2F2AA7B638E20C9C8A3A827977AB58ABF7525BE15DB66CE8E9B81457552073B5
+85DF3FA70B5231C447C5724E14730B90FA35ED1B5723036F1658CA8E19EF5A6D
+D333B78E91E4D7032EFBFD40A5A2269B0DFD9F7C3438DB58F94B507EB93032F9
+99E5F15D9F5D8CB031BBBFBCA8A15A617ACEDDE70DD9C2D9EE21179FB17AD913
+B4BF577A9046994689D1BC6A6985FF5F5A67D699C2FD288FD9E5BCAD5453EEC5
+68287BD7B8872726C28CD288B4DED2246B843577173450B6E5760852CF2E1727
+01FDB0FFFBE12CA13ACF6434AEF4B59EFF3E0DB1E87D35075B1D55AC12633167
+5A83A39056C077EAE6F2F7D1DDED300BA43830B8034F0A6AEC562D3023270601
+6C594D0359DF6F230F7B80B54EBAE4880AF338956B813E3B8DB8BC778BE0F612
+7D84939C2878B43EAA45BF10E257F22C28C2C148FF48843D2B52626148E3CAA7
+4527B9F246C17BDE21C6E7EAB4906BB6D9E84906CD1832C4BD9E405AFFE33AA2
+AE086C25EA26BC23D68986639366B99C87359915EBB76D7162AA667ADE4954D0
+B1E18027FAC2468CB2FEA2568E23DBC201E9B6A1151FBF21129A088D89E3E728
+28B2785C1A8B2637F368A93EAB459F80506435BE23A85396969E2AC4E0D6E4B0
+8B12EACD150049EF8942C108B96843159D4408424394B33603F565D1622FCB78
+00330551E05952C8D01D6B77BDF9B395EEC38BA6CF29DA605BA159C93AA7CFC1
+86D03DDEA1C88962B558766182851A4B4E5DA0EC868B177BDA6D3FB0B8E901BD
+9FF2F5BC9D4D2737DDF8C96559C4A0E7578726726F1709A09C2E420823F6B53A
+9B44DE1FFAFC6E105C887050309530B59A11B6B71475427DC210181D49A49CD5
+C620EE0BCC09A206C90E2894669EC12E5927870FF50E0849E2E2B7885D7C204A
+28918B5EF93F7D8A5FE47AD4190DF3348B1E9B7F372E376699F727D6DAC59D6F
+562A989175F66D55F099E3621FC212AB6C2EEDF6B6321DAA777734BBC90BA04E
+0F6C6546D02C02EC0D6CFEFDAA29F3728AC9C94815A94B609AD7EB2AA24EFE23
+954E82008CE6F53FAE7234423348A6E94CF6E22F4AF3E332D702A195B0D36477
+DADF48F6A003463FBB6DC396DD72DBC3F007ED7DF4A432BCBB12867B04467939
+0D1BF98DC45ECABBD047397F91027FA81ECF39907B70095A28FA750E8CBA9348
+EF74CA986897122F5E1DF25347790569B3207167EE79141C01E6D567F7199BE7
+0522AE7C432AA161A83811AC478D8F55D730B96B1D4BB2F50DF5FA4E9C16F95A
+155200B9B406526D05C1A33EA1B6D3ED723E852FCEEA4D77872860FBC2BB998F
+E5EF409C708C5F1497B01BD632C41B63F491BA9D96F12F8F397C3C0E4A46BA36
+33A9CF5CEE2CAA55ACF3823A120893D3FF5554DE1B1F5EBC33B3DF5194275847
+EA8C2BC55B285B393B00F66A3F171A21F1DD6CD8E71C4D93ACB3EE9F8B530957
+DD74644B5163AEFFCCE992338E406CFCCC23E9FB1FE2B4987FAFEE49D7F2A947
+BEC88F6B8F6770D5598191EEAF87737A69A0CFECEBB3CABC19AF1E67F331B5F5
+7C4076FEA887C44A74EDB7DAE9BE5BC0E25B52825E166E3FFE29F8D9E6912BCA
+029AA5CEE2EEE1EE3848A6DE34D86CA3903E11A5FA8EA60C65FFF56091F76F4B
+540C5B437E522A354441E3D5444DC27EFBB63CDA3959622B2329E8C7E5703703
+CE384B9DD89DA4A3D97AE8C0FCE182C7387B37190099014399C8F94EAE897528
+3B52B591725E32EC9CC263603990A2C94C85C979169F31A1B47AB0FD00AE3C60
+046229CEBD812151B0B1651DC705466099F64A88764D40B4E7DBFE5361FAD73D
+29291E83D53F0B7DE595EF311E7EBE0FD3B9953DEAF8E33F571764C8D7ABB362
+FD9632E010F7129DF91AB58C0F9B72562F686DA51BDE657E68CAB6C5CC316C29
+ADAC2F00B63E62F67D28F8D2CF73279A0BF964B9FC9085CB93CCCD7B793690CD
+6F1E19275CCE6299EB3089F1EF286473228191FB5DE46966262CDD0001CB25F6
+32FC206CB3AC71BF17F39A634809A503D2D72AF48B084CB7848A586923DE34BE
+9D90BE94E1D2F1217DF47FD55D3DF4679BD6BB63776F4DD2EB74D25ED7ACD07B
+5261A26615B8C46B08880D3D042E78DCFE83238017FB57BB0B11AC08708FA18B
+AC3C645F2DE6E0825BBE507CCDAD2EB5A66D1C9B1A4EA1C22E9A186A4D266625
+F65E2E4956D78F2FF5C6E07D79A7701CBC6DBA6D7B370F2CB1D8DF7FC5C217EF
+903579058F26B251ECFEB873093DB1E67D2DCD3087A28D9F056E750C276DE42A
+97C2393EC37B70D21B2415D754911BCC6B361A16E6DC0BC7CE89762BB1CF8F07
+4464571FCAB29F29BF5D3E4245DF60164E657F37C0809972103FA09663F397B0
+15FD59BAF59AD8314118BFBEA0A42F8C99B5A376AD009E3834677F0D74321F6D
+7816F94F6E66C56DBBF0F16721ED8BDFF9CECCE7DA91EC3FD945FD98EEC90C85
+0EB836966EFB6233538C28B222FB9752C3364C6EC347165EA2E18C2EC4FE32BB
+27B158CA196E4078FE6A01FC09DB419B0CBB6585518628312D53C471CEF69E68
+48F22A64CCF75DA2EE5C624A118EB52F4D8775228922B65E9A9D9108D2CF4B1B
+696EEDFBAB4A917179089C29D892DE323E983FEEC70E57D071E186021CE9602B
+EF326A933BD677A4E1CF275D78CFE1E9F0B94F8BFBE06920F605BB31CCD8C5DD
+F730870BBD567D53AFE3526C589B68A68875A0F6DB65F7BDD5D722047C7B0CCC
+229D27C0E2B56E47C95C8FC174B08BC1853ED8C1A9D91DA9D0CFE9FA049D77C8
+D27E017C8EAF54C7EBCBA32F7DD3FB44844A57C4E06305F4C9B64B7BFAB4D7AE
+BED0EC1C3C3593BD768DC1E820A7265B9FA826A7295BC81E2AAFE420FEF720DE
+FFDEA87CE4E58CA40ABE280ED790F00D39232538C0C59708098463D602D93BFC
+C02F709EA3E033C76D7C1EF396083E2FD93AF713FF79D6F8181D8D7A7473EEEA
+4897AA7C68F2D33BB963F91F46E36A40E6FAFB67D1C65E03FF42BB53612E8DBA
+2E17AEE373E5409D732947D75FB2DB6AF863D96393B4072187AAEB720DEE98EB
+7CF0B0B631F7AA75D26B451C6D5E559DF79D44C614F9ABC3A78A68B1392180B0
+04622765735BE5BD54600A612B09076D975F46E11E8C7A1CA41C318A627E7AF0
+6DB96ED1E9E550078CF180B09AFA5E94ECFFA4C6826454A3D4E1C580E728EA4D
+7963BC6EB15FDB223DB7162D817EE33F3682D7BCF2A943616838B9EA417B8976
+F4070366DFF22019265C30BB251DBF0975ACF5FF73AE1D7C39FFC9269775DE33
+EAA2E3AC5E180D5B4262323782879EA4DA51516E607893B4DF1A13B9366C710B
+855BF8354095A722A0E8C8482716C950A855C1EC6A148EF354417D28DFA07126
+711D2588BB27D8AA4E0456E02BF8B51B7D253C60C01FF59AC57DB5C8CE4EC7D5
+2C4DA1257EDADC8F7FA3D0FC93ECD2832671C2A55C05DB5AA7F312B3A6C34973
+FA0928A452DC18D9CAAD07DE7D80867A40129AFD28EDD3249991FA538896058B
+FCEA5768DC046796EC6CAC9036FAB816DEAF1FCEE746B2EC3D8855DA0A0D1EFF
+D349151B13F85A32CF849F8FDDAC29D517F68E212E5596F1212261B23ACA33A5
+31D745FB4FEB3F54BFD666AC661D9F87B8563BBDD0B86FFBA9A629CEF10FC074
+B8E22F40C62E1E51280646655B7362AFBE6549DB21148F694F569FB2610A6441
+2B43F73766D0C8887DCCF6B89F25BB85E94D59E4FD7C48787CBE33BFB15C83B6
+E3C4BAB8903D16B544CC5AFACC08F89D7E312C1DFDFB3361119C21FE80F4C4D3
+3224FDDE9062885B67CBBF4A736AA7B20CFD9828C74ABA7EFE4E66D403483C6D
+C244C5DCBE07A2829F2C1E49C30DFCFFC34A847442163279DF034255EC660EE5
+B664F09F9561DE4D8AAC4484A48062972F5FB76436D5FC1A3EC9A54D7DD3DC46
+53037E1009062463D084E9131E605F26E8877D5E36900C099AC5E5A8A82863A5
+C4FF988F1F54DC3E97BB2A680F8ED58F76442B4AE9232CC5E9839AEB31824C5E
+B63F8881AAA55648D0141351DECEB681877FEBA16B59B760596F3A53B4928EB5
+F0FA3F6EE26849DE99907D71A942F9F13D0F6F6B2C77543938339A064ED2B1CF
+C0C4D420D72523582AAC915D9FEF0518951222BF71EF72F0E46EBB68A19C9644
+11A27BF23958169529DC8A2AD216DD89D89FF47E767998C03AC3F85861E94128
+972FE775F64D78DC156B8910552D4CC2CB533A18DB2D0FFF3BD8ED38EF27CC88
+93281D84BF82CC469A89EA63DBF00BEB03F6DEA03D19D1E477B04587E3558B38
+F837D4479ABA7F16966CEA01E54C70678FEF81258481FB448D0DF5A68711E0C1
+261996A25B77AEC76809B1E43FF01D4197FBAFF47D16B1F2CF805F594A0A633F
+FC91B5AACEB32A162AB522A490C3DBF0A4CA85BF29EE489BAAAF9EB8DAA04498
+711C19FC9308D517CCCAA224B31596706BD9402B94CFE5D618B742CE1A418E7D
+7F3222AC04B6A511CBD90BDF5CC9E47E3963C97C5BA77A71A5B05CED9E86CB2E
+5D77AC74F5F7C41D8D957C881321BC6AD6EDC45F022D4B9981B361CC8BD83475
+1691EC11496800BF5051A97F95A8A723CD352A04BE99E57FB04B4974B32D3BE4
+656CB075C80EE9790F06F9EF05EC8440456A01584A56DB18BBCAC48AB3D02B70
+2900A908465DE2225DDEED8CD32A9A80D671CAAE386F73EEB7BCF90D27028978
+FDC638E7CC6E0CB90230AB5E3AD3AA06476A9F7703DEC2967E80F0D9E94A1936
+6CC8FBE9A446EBE6B31A8DF89ADA1187B89C7CCB051369E6626F718A297371F8
+6081FF9B597F4B13D0AA792B0849633CF72D82CB7269AF97B999769031CCD1B2
+8E4F037259F08E7D6B2D820F5F65F8AAE7EC0983377B883B16DAA9613C960D61
+67C6B7AD02C62CBA505F6B26C9CD43D3E2E82FAB30DDD3929CD7206DEBB0F9AF
+84FECCB93ECF13878368D1A3D4141C67513A50C16D5CDB20EF2D1CC293928069
+D2C02E28C363A3E2F13C14901C3AEEBBF4019135AFAC3E5065351E0EA91FD39F
+03AFF76D68AB384C754BEA597CC5C148A29EED791D4370D999EAC2F54ECCD572
+C67AFADD474D5973907A843D0DE7107E5C14A0271126A66933CBA0A62B6686B7
+BD075C03B8B36181C9FD2DE1AAF841E66CEA8B706C84F14B45DB5C966AC1CBE8
+AB9F51330510A6C24257772A63E9FE0108ADB557C7AE17C89F57DC38BF81C482
+3292DC03EA0E2033AFDC75681B975BD55A7F89DBBD0ACA11AD6F4381F6204289
+3C0628C3938E3E533F2757713D047834D2F74BBEC8D29847D3C4C062206C3BA9
+7C005CD4F4119491EEE3370D1FB4FC349CBA44647AA72B10DCE0335C832BA484
+5B963674F092DA2BE6E19462482D31F77B1C69BC819CCE14B4413957964189CE
+98FE7560C575C007FCF6D8B9DE8C742C76294D8662583560E1694F609DFFC7BB
+0B18D9E7354A1204F4A2E58F7031D7FFDB60EC974451CB657356CB1D9CBF65AB
+4D91F275DFEA4D49EC1DD476BF4AD8B33778CBA59456A3C89F1530234A5035BB
+3E36AFA409954B1451BE27E6A73052419B1FA2BF4C880FD664C0CA486B8BC414
+AB5F5DF1AC760079FF643D4AA1E9C044502C7D34F625771F6C6699B1CC4758F5
+B041EEB19E919155F5444F1E2A3C8104E80D18FAB1CDAE66474129E792CA285F
+2096BC90DD37B394293E799031126C9BB7D1F436EB7B2695CC8132FD95CBABE9
+573A56FB129A97458CEC07683315ED4DFAF84033ECDD7FA77E000D36256C4C5A
+A8E61878065D555C9C6D085118D20E0E0B211000725D48AC785CF52EECEE0B83
+EBDE306E95B03448E68A65E89CF66E605D68A51587B46EE39AC733FD7DE618C3
+DA6FE3243753645256EBCE05029587EF9505240E07CBCDFC7E976F9183E3CA28
+A1157AE7D0C201360A1BCF23798B243814ADEC4B617D064ECDACDE6D673360E0
+F3B9A166F61345BD6D85AC42D251E4ACFA83BA7990424DF293234CCE443B5FB9
+E25FC59D2EFB5A240913BD1D1D950B1983562A9BF18474F3AD6FD1FB110F1E5F
+CA22B56AC544DC576FFD31A6E3092C2AE4E14F742A349D7C51EAF98364A9B1DB
+B259D6FC5BA5BF9286F31026A7CBDCAAEC5B3869554A05171CC648504FA3D782
+21DE731F39017B40076846129FB8D25A47851BBBD03645AFA43104A66E07A167
+94E19867E8C016ECF70C24D593815DA93752E2E84B96C3C8ACADEF7A933BC57E
+3FF6BE85807C13FA68327F991071CD6F2B5767CEBBA75B4966FBFF4843ACD1DD
+28995BB456C8D4836A7B5395CE5134CC447C4695356335D6164F235160BEDEFF
+90E431DF6D10F9CA3B0968FEE23AFFC04933F8D1F8B5640FE34848A672C35076
+F4588C04A916005362958DB33E2DE22DBCFAF495E46CC5A5E4FE607ED07CEAEE
+BB7A5F523F5B88C6BD54C73D6805EC51E80F5876EBCC353DF1C0893A37F02B87
+C03ED3439ADCD2EBDB3FABA6358E7F9225238A56541C9D8B285E07EC6B92A4D7
+38BBD0FFCBEB36123FF69945B0C59C053A51841DB7DE08918D27DF0C9547E2A4
+5C6B72878148DE3C0E120C5D6C3F82B708E9CD2908B8076AF772FB050EEAAA30
+129D7EB87BCF3F693E1328FA94CA0263F14EFD722C58A9B87E761D947A920779
+63257BA269148683377E55FE27F99413D48899F7B952492FCE667183DBABBABD
+CD2716B316DE06E606D4E6DC654B137AFD56C90FE8E6C72C91028A83583FBEB1
+33A129ECAF6849EBCB9AD7A8DFDFD32BB4486E150D6F4D1381C07F4686BE6A8E
+C297DA3FE9443943D5C8C419AB5A3ED919E0B22C4A45F1E61BD33EFD1BBB609F
+15DB256670C85432A1F190054303003128643C25213C9C988E344AA219E36945
+2201D049084234E69BA29543860A0F1930E6BFF21305F847245440EDFAF8CFC0
+5C8E01B35929206FEE61707DCF115517577B6CAF6ADE359D2935550941CB741B
+9F15C25EEE1214A2796FF5E13B9018E3618D41F6B3A3F90728F318EDE7058E3F
+89B073A9E70E15FD9DDCA998B8D07B802478CB5289348F46C68173A32D9B0B46
+DC560471B8A48F652E942E78F520AB36B13F8B1F8361617D9DE4E639B85FEF10
+E81A944EB5AE91BE8F58D22F9236ACD43B0B00088C747CBC10890E8440E025FF
+8F9B489B9F7B7BDB911591792940C6ADD30E247280122D2045CDDCEFE3E98439
+22D4D75F42DF135C5E341F6BEA914BD45FD29876C3BA23BA910545669F636647
+5F098E7798F2268788B03A0907E653DD766BBFE61BC544D37388D1709A239A28
+1CA12BC80F24E38D40B197B12460798F0C9A4EBBC80F0EA9EF5858DBE81B57B1
+FD7006635215E7F985BCDE7A59009D9A3EA2D95ED2A8369782BB1DEB1E033244
+C16FB707E95EA293593A4271EC372835E2FBAEC067160B3CC7D31692110B9523
+39CCB82C6F7CC74B0D6F789ADC5248D01D5F1E82BBEEF82B9993622CAD459BFF
+5EAAB41982FFCA324227779F869A76D157DBAB2C70D8C371FAD498D5A22ADC12
+5A093E7BB63E6918EC5090F1AF9D39C9B68FFF5C4B88A8E864F96EED5564BD91
+8F407BDF6318E2EC6D850092E6103FAAFCFD450AD5094E23BA68C2CF181D2CFA
+6392A5A15415A309371E3FD98772E2534D5B214726FE42E24DB99986F20B8B6B
+BCB57650B4504DF9C107FCC4E695A2E8A2DDE5DC5A05A26AFB33712F8AC2E517
+3202ABFB245EF5BFF4C5D7C3C0280D688C0CA04DC283E178233023D9C97021FD
+336DBD040048EE3E6A87249F113DC8AE4F203B1AD6D350955D84990A860B23F6
+B8968F0B68DACB0BA456F26723DD9B87CA4C128276844BADF062539FD19311D9
+BAC598ACB475AE2FD8A96510F0DC5C60120A33FE0B6DC34341638EA75184E4BC
+F4F681C9464762224A73C22F637D881BD6A01943D5A3D3ADED72551D2124EE38
+987A9BF1B596D8871D8990EF361310FC81CAE28F9E8D9A05F4D432248C7A7E3D
+3F211493334182D7A44540E24A6F716E785E4CCB0E31DD2CBF99387DB4ADBCA5
+2A1FF7A0676A58EC6E902D1B9C1D59B3ED82451392F8D93D461005058FEA44CA
+DD0FC204958134D67CC2F547B8A1CAE234AA7C789AD515C7331552D59813F306
+49C17C81B6876F43E4161C4C2F51534FD8FD9032A0FC80317B200E8875C2127E
+7D4AEE9DF1B81ACE6CE4C4C5A76092E8528DD961CBC9B7C23E853F8627395781
+932AD6C0FCEB397B7550B43E9F12E330DAD88D7AAFDFD36F0473F502E563D66C
+CEF6EE1100EDBD2C8B4173CCFB8AE19C8C981EF20D56F693EA5B661B94F61785
+6640112BDFB1559D639BF14DD1EDBC49FEF2FA3E8D61AA9BF0FB545DF8C89048
+F036D83A1AF078099E3EBA246EB8140FC8DF5CB75B0D2F7987AA35CC2BA1CC63
+386F339C0E762A4F4215A3175A4D93322F6C73742B2022AD1524F29F56C32C23
+2FEBF56FEDE4C5883E3C3552B3EBDB777D852558D17C21A5AC4DE320FBA7CE93
+10F4D37C94F6F85C1EFB2FD31BC49F5958142BEEEF277A76865666089FCD68A6
+53C9D945A4D2BD7DC1D532F53D635ED808D3FB0E79890494262B380DFAFB385A
+16EC10A1CA5BDA07787BCAB77D9F56FC2B03A1C500226C4DBB7829B875284602
+0DE17A3B52BA701D24CED02C433109983769121182177EB3E5D579A2DAC7E42E
+376A65997657D435EF8D5F67101A9C6B6E11A1F1D1D1BCEC3DC37DF1D111CB29
+02D1124747CF0AAAFDC4DF3D6BDD23858C0708AF09D1EE6B8E53B6DECB0EC43E
+CFF549F348290E1F53FCBAF6288D614F2DD291E95CD5A80070B0455C422BF31A
+B93580FDAC4FBB599A8800984F75170FAB0BBB4790DF4E1B2C087ADA4A15BCAA
+06FE319FE4715E721691D3E230C57DCB7B9285FA3C0005BA9806BC9AE55224D5
+F501F1B43A11181B263C9E12B16704A7241B17E680B3B69C0219E2390612A43D
+081FEF00A897C6EE3A06F24E24253D4228C7B86F1C13DD9B1791F130B455D833
+11970B10412BC386A5969A00D65DE09BC14D246E40D88B3A066F2C958D2579FF
+72FE992616514C8CC5CEF074D1A20B2032C88B14EA66B2A7062D996098CD786A
+1112F1E9ACF2B9C47FD7BAFC0078DA49F915BAFD32988D086127969A7069BF98
+02B2D0002CF452500FEE691E042911946874B6D7FE30E7AEC280A0BFAE6DF67B
+17623B633107AD4F4868B3DCDC82CFCB098C97A28B9640D8933EE31A875EF639
+B21B9E9D50011B8CE5696241802BD18F9A76F7798F9CDBCDE5A5C6E6C275CED2
+BD1F5A3D1421F14455F363C60EAF0DC65BAB9D5D33DC0BAF346E1EF7CD5B1E11
+061AEE11D0309FDC80F691389312A17DD335496E916BAC06AF60D5E0045B2CD0
+4889A722C581F42AD54D4A9801CB4A50B21A39ECC7A72E9DCE0C8EF26EFECD24
+B70AD3BE3A57A3DFA294C8B35CA9C4103E63B53923B2D9C749D7A75A0159FA9C
+D0038ADC336B78CB3D1F63CE7908A69CF18DBA3F503CEF844022CA366AC8CED6
+B1A5C4F4E6276D2D1C03898495707086DD1EA658CDDFA69A5850C4C00F2B4A24
+089AB4B6A91B9018060B20BC8EBA00919EEFE9E845C8376C94AC35E30C140EA2
+9CEA7C0BF0A5ED1C552C2A1458FAC076E8390F88E157DA1DDE5138C773022376
+0E7CBF3F2621E9620CC1A0D4A03835DCF3368293F2B1A820A3DEE998A1FA7AF4
+7DD73D6B790F6DF789FE29906817F21A808A3F96F45F68EA841AD5600456A270
+E6B13F573797942F51F08E26309C3EA859BB4A8284CECEACD522FE6F5236E174
+B244F493518AFDEFFCDEEBB2B272667CE3AE0CAD031EF9C00F01CB740357630E
+CCB89A894EED041358CC5E709976D5B5532F775ADC37533CA06D114E689B8E28
+D6B282E9098BA1A0C60D5090F630752A2220BEA561E951FE7B4FA1B4862C2787
+2BA9DF98AB161BC0F71CD8BCBCA4910CE692FC321303892419B6CE1EC8FBB8CE
+A01F550638020E1416B638F618F484AED3F0C6F9DB6FF0B5E43808C5A5411141
+BB67E24987386FB84ED503DF168FDF5DD498AA151727AABAF57B9069244E8F1B
+315011AFE51D846D6223A6988FECE00B8A871F047A33DC87A3F896E7B7EDC7B1
+9E0198F35AD796C8AA6E65877E9B8364E1B08ED36469D35859C8F8D2144BDDF9
+097A38D8DB6F165023B93DF4CAB8BAF62A002DAB367311FFCEF16A3644C93097
+67E553E015799D4EBFFCE4877FEC09A99EDC169D258F70DEF8B03C99B4DA93C4
+D026C1FD6656B46A2B9BAAD12ECE95CE43E91B02E1C7C17060A083FD6EBCF506
+89D27FEC0201CDCB33224ABEA32CFE73DB2594DC15E8EF564E7B9F66C8C52747
+95A4BBCC0CF3D3FDB5F2CDC4C8B532EFDC4113A63B54500541BD127646FCAE13
+AD58095D2C65182941AA783EFB2C627F2BE24E423C7AE0C323925A4AA124CC85
+A65CEE1F2B9FFB73B977D8D0FE829B649818DFE26667FB3E118EBB24DFE74F12
+EA03099B17C2A498449E935DEA064AF19B32EE8A81934AC4FE2916C70E81DF39
+65B37773E57C0C66D468A860E04852EDC436ADFC0F7F8C9AD6B3BCDACF9E08FB
+9A5C159E0B335E080F6F51BDA7F53D1EF45B5EEF8647970D19AE63877147693F
+E7C9DD6721CBE6D954A4B784060978BB0C69A8F3FEBE95FF6B48461F7E50DAC8
+236C408E8BF692596EE3D3BAD30D7C90407678594FDCEFBB01C3545DBE5ACE68
+32A7DEE951D5BD1C728EA22990BA511C5240E6AD578D2E8589084E792E2332D0
+F22E1C1C691B9F58D81F999AAD9BB89E16C7A172BBC787D2559A6FD4AF02DF10
+C7621FB38EAF47450633592F350E55D068E248BFA3716666EB2995EAF352838F
+6B43C56C6AB4D1ACC51EFDBE3CDDF2707F423BEE10778809468B0B298F4DF228
+DCB3C2FCA77B53749798BFA306E85C6EC23CEB468D07466D00A73FD16F85848B
+D4806AE5BEB30E2B9259FDAF28588F6931AD231865526A82CB52CE85F8C4E55B
+5422536B5B37A58E5CBE4D082A80565DBF727F78282E5BA118E7EF61DA240A48
+2DF41F320E5B8C16EBE8811E5ADFCEA06F031C5EF40C32A4A8673067F3D05BCD
+D12423D695B89FCA8BF9974001E3349C4EAB5E47E0E93AC884BD3900F382DD74
+583553446FF13995555D4335D6A5BAD8A81D9183B3CB4500AEC276234002190A
+79F3DB3682974A55AA45B8611E8E4256EBDB74DB1F43BF0954D32293B9E74C5F
+3C7576A1DF054E75AC20A0F77C1BD50A92AD0755B7ADEF119A47D9281631C244
+3AEB8745F8B768B6DF18AE893B6C81788EA1F4669A1FE024E9BC91715221DFC5
+01C6F01CFEFFFD670C16ECAA2C21A635341A43F4923BFC4284D71F88533C63E2
+E185E405851DA5A73EC49F6BDDDD1210D90B330A5899D3BC37BF7629700E6C69
+354E61BC87B45477BE4B98C03A8F5360A79E092F5FB7A93D82C94C609C0C5B97
+1CD4BF3CBCF553462BE84671F4E0A4347C7F8C4FC793197AAC17513E15CB7321
+586620A55D501D00120CA1C3855CECDA6BB7C80AD901ACF86EF338C9BD0A3CD5
+C68C7FDCFEEFA3A397C359D91AA1F3B32FC133FD54A7DD6034AB963E8E834A9A
+3CBCEC6D3E66B326958EAC8EE6E2992FD36D3F4C104EC7C80A19B80773C6BE99
+5C69EE6DA0B2ADD514B1330A78B7C4FC361C8F7262EC74B22F2285B864266EB3
+4A5951931B6E40635D27D3A95549609241B86F650DE4EA77EC12483ECA2EA912
+1FCB113BAD6D3AD003FF51340043D39ED67A4E3AB48CC8ABAEDE295F9911EEB8
+96F169EBB43F80665D8E2BC62E17BD752FF9FA78642500177B00E1BF8478941A
+BAF83ED4D53F13165CBE9B84D537D5D65E1C8768B27812A61DF8BC8232541AAE
+77A19209C668E201BC23CFB2C8914437BF3B15CDDF4F65A9AB4A9BC8354900A8
+10B14F217E81324083626E760CCF0B09A8EAAA701749867FF69CD8DF4C0C8229
+43C58016CE1F9649595DE4A8BDEC2D1B06F4B3D4FB0F32055A66FC917A1AA7E3
+B42D9F014EC5831532E4E1AFDD7BE18C9834300D48FF476D2A5D5511D344EB63
+EB6014E883C9ACAC1F79CB671DFB55B0ED4404B555D6C6DEC091EBE5FF5FFCAD
+8EF6D6FD105ED2C15BBD3D22F5E2A1CCAAF7C0C102F3E55968C9D7F308B298F2
+042BDA17F4827850B2255927A67D7C77A51F83B869D171A27FC60E622CE3F99D
+44403C9572D583BCE449A64289B5A1D24CB3CB9044427DCA7ED653F2470FE275
+B97A890E17777B3A2AC27781125440337A7ED2D49897466B6A3B5348C013B879
+398251E2C69AB29183AA581EE0B9C65B459C7AB5010A9837A500600C2F24F8D8
+F811A719468C3B0AF50EA90CC7E39488E95EE556A5E77438C43F757FF92BA2BB
+5006340D06139608D9A6A38BD61E61FEE01277BA739E835FD453575CA1B5995C
+5A50B617B127CD0D03980919C0CEF8BE085808585CC7B8EFE1CF7F002593D677
+6D83A5E09EBF5F49BE4EE35047C2BF6E65FB640DD841A00CBE273042B38E2A16
+3D529CF43EF4D3C5A9E03A6499BFCA8D7387EDC499D9B914EFFE78AB2BD08EF9
+B1B7CFA34B522A28A66C28BF1277EA53EC78D599E4A7F8C2F77BA622EAFD6518
+BDE03DB16D00D6A81AB5ED23EB1D83D4E857B07FDEF93C52219B04F87C9738ED
+B32CA58800749953696271604A7736605CB8EAA8CC84594A7E5338A4F97E60DF
+35172668DAA235EA44404B97E2E010468C08A07AB4E4852C5B9578F07A9DDD58
+6113BBA937088BBDCE82D20DD292E3FB139AE178D3548B66297DA4E1488C340A
+225DDF131F6BE565C153A7670174FD9E3F61B87EE3ADDE9C5B2293C004637A1C
+62166EEB161C837FFB0730B1645C01C6B192B781F1C4BDEA0A3ED9D98270FD93
+94C1C7FC7361FB15C30BBD45AB78AEA8B8E298D56C48F0DDB6C99EEA94CBCD2F
+7D6D3B54E6CBDEC56683D28F613749D516BAB9FE1C2062BB614DDB39D2FADD5B
+3111C9763B201E416B9E378C8EC5C99F6ACBE9017E712769D97639CD44E97E4B
+AE9CF83D6C92E804B427F6BCE8E662C2E3E0E3848A9FC7164F99603D47F7438E
+8BB37377662FFC325E475CD2008CF67DD9D2F5C73FA0673E8156051A34511C3F
+357318865F53C486CDDE9257903923B877C457587A5E53162952DD3C803A6D62
+DC22EB72B362DE0580346B1BE72DEBD91B50131C5F68CF4FEADEFB18E379DC8F
+9BB6DECE1C15E739EB4500C86896A5BCA045B114C36154F11EC1CB31B4E9A267
+415331B68B92FE68284CDF648A9C3D3EA08E718DBC0EE742FEA192EBA63BD40D
+5CE6A2048B564B92CBB411036D66FE76C9FED37602102FF3F89BA7C1ADDBE03E
+DE29D86197A79D938200ED3CB988E30EF612D41D964F1F88EAF2BB18CC924A85
+E5993C07BC003C2CCC6747A9FD651523EA3D1A624530F2DB0E3C8720CC399DF4
+8FF3585485C4EA7F3E16F6B3564684BC84CC107C933B4C38B3C23A1B790713DA
+BEEE1FE5DA79C93CB84AAF800A68F8AE79FBECAFA01D6AE59AE2234BABFEDF0F
+0E8D5473B56C41AAE49C9DCA4EA50B16CBA50A2E92DA0CB5DCF6A917A97277D6
+FA120A7676E9FDF5C768686EBC3268214371FD2FB186968F8A4B61242B4B39C2
+0198BAB835E632DB42974319B5EBD9669342F1F3EC1E49F3AA42461C0182C7C6
+1F0707AB61E448A966698F2D07994CF77A982031466E8778F9BA2C85DD8FE339
+95BDA5FD9DD9E9FFD1E1CF18D3B2F1048E4B0849E92767E83FCA8CA1CE85B9ED
+D2F8DA34E13D2A44F6311C4FCA04FF75E1BC9C72041A0AA1DBE45825B9EBDC3E
+D234C8FE32CC448B9B8A3AAC6BF131D536A1321D21D0733EF62F3237709B77DE
+315D7FB3E52E2AB94AFA14F0C92F699C89DA8278D93DB29DD6D5B390FC9953FA
+52630F9E74F340890B299EC8B1A6531BB5D4DE78897FF8EC1215B84B0B30C709
+F4DE3F9BBF8A7240B739D860AA9C159484DFDDD946FC71987C16A105DD44BDF0
+DEBDADBDE3D10A72B4FB3141D262EA5D1090934DFB40B8E2A53A1C817CB8C708
+A101B0907DE55FE007FBBA36FE644B0AE5C28E0385E13B9CF57FCBC7214113A6
+0554115E85A47F8702CA04A05EA149DCA460D872DB78669DBE0951DFE501C2A7
+9056C2A55F432B8E9B13523AFA2DDB569B854446FA5A530B8D2AEAE92588D36D
+56012B7C82916AF129712003AE4E8E850EB46227D677832578622FA5A55793FF
+6F9439674DE166C9FA586C8877B4A93CB9ECFA21C26A86E1673C7810BA529547
+0934B328E503A49E4CBD88231F29D02EFE40E47D51BD79A027F55107FF4A3BC1
+69A45161A37C9158B595BE3BF540F929F8A29ACED690854B4C4ECB97670CC263
+83E242F32B1B930D5FADC52CB1AB3E0E0117716FBCF419E96BA3799075DA5000
+A8206C5D0AA64476FD80D9EA461A7E5588AB51879AB782D524598B9D1A0C25FC
+46BDEBE7AA35D103CB8568FEDCA4A66006ABB0B9E42D3F9FC53DC343B4E56FE3
+382758F171BB4541756071EAB6FFC31518DD1B45C971138D2E6BF0B98045FA2C
+8D5E5F1FD28DAA0950A2E2CDBB8803939388D3945A56D8F9E9FC1B3AA2A9A418
+9ACE9E76BAD82AAC330B8F0816F8FAD26CF66489498028D7FBB03889263F6B2E
+6B766A11AA56A4F0C719363D168B3873BE6D8922957AE6D57A868CCC9B262946
+F65CE35C3043E3E8B5C6CC40BFCBC30A501E152340CF1EB75C57CC972DA5805E
+EA766382478487E412FD33D7EDF9E00926041C7840F4C986AA1CE59F8484F62E
+ADBA0F244E32990714EE644D7C8A689DE876F1BC166CD8FE59768D10CBCD2425
+1EFBE57E249C183407261094F6B58AC225F695E7A24508FF270245DD05683E64
+5EEAE9A77C90F327DE9DCB1DB242476F11EAD3F7348A2712CBE05622505A8DC3
+7A5C032629C804047B8D3A2E752BC6D9EC4C930227EA9B27AC28E5B9B515B866
+44B177ED4D46DE42751CE13EE826F98A4B964E3C6295C58E1936F8211CF4B483
+BC74ED74463CF98AF1EB8F50F892DB7F66E64DE51D306DB67E9D158412D5E940
+0BDE560C0B2CB9BA1974EC56979678455A74ABB0E096CADF110E7045B956AC95
+C10278C5FA3720BA56F4F8C0547E526482B40BED3D2B9AAA9B2B625FC249D0D6
+F5338247B706A69C6946547E6820E5E8FB56CD83CA9216A1E5DDEA8EB2F008E1
+9DBE852D06D586271AB7C7CB92C310DC3A26DEABF082CE5777011E77E001AA59
+221E14535634DAC9EEA02841DB7BDD3A1EEBD9D630DBAD037F62B7C151CE666F
+51C8911B1E7F57118AAB96F465F4CE7E8AE9ED9E8F91047944342315976E47BF
+8ADF6A1266F3FDCE43DE8C2C770DBB2EA74EC55081171A5B5CA88C402BB976DE
+A049C29AF9202710BF665C74CDCE4E17F4BAB05A2A0CF1D6141227D792123DF9
+ABB0422CBE1A20DB23C3BFFF699E51F858B35D6B679CF3D7A5DE0142EF0E87AF
+8829ABC6AD657D63EE703C1F4F3AE149E9A15C17905C280F6DDDAA2C4CCD0E8F
+ED862C0F5484DE9DAC5292E26761BFF8788A03250E3143238CBF09B807A84285
+CEBC78E4A1040FAF5E29CA92CFA0E4C8BCD3517E86153F5759D2D31E86BB5477
+CD853634460A8BAA79828A1A14F93CC950D9A82D63713EE17CC05983461A2FD4
+D6407786E2D46D16DD6A2F64CCEBAA695649967AD1797AA909F10019C4CC6D2B
+2BF595AE4FD5D05DA3B7B8FF7981E8BA041CFA32998CB7C717783D35802E4872
+3BD9CF2B9F10F0D76BDE330C0B4CB59343411BD03A40682E86CAA27636D5807C
+D2E2C6564A4391496EEAF2FCBA8425CC4B34BB93C01D8B2D8E887603D531E84C
+C7E2675C3E633D28001FBBD8B6D812CE0AFB3CFB9001385B51DE42D0A82154DE
+07195A6CC8914489C3435A7E7885B8497F66E9A404C0BFFCB4E424305A549135
+9DC544B4015BFA1D360E846260DDC0F6DB49C00A3074144A03A5A3D972D397F7
+D61B428A618151C0A10CDCB1514AA0F065B83149016465438DB8CEC4A0B74F21
+DBADB5CD37533E482BF0A59916E5996462E83F405F518E302BBD63C7E543A200
+51634BA387AADD4C10F6A95C86E434E1FB93DB9AE8FD55951AA338E0B58978D9
+B66321DF92C10C83B76449C42B6EBD7F5421D1DAD4935FEDD019B5996CD179BB
+75CB30BBD4E3E4C26D42CC21A741189E4707176CC0C6767EE886E5B88B3D3582
+2B52528B62990E6400F4E584B15611B2E9A7D2684454B8379225C6A6B9490EE2
+C88B9727FE6FE59FD0B9408CB4C4824F8214DE015DB3C935BBA4F250840BA928
+B89A03C4F3B4237551CB69D04B3AE08FE4C86171D305665C6F26DC457FCD2665
+D27801BFE49394D690CB6B5B00BAE77B3841A660E8697EA0190B3ABA01CE132E
+7BB3309686CE6007D322B1CD44CFC025F2B32284DFD5AC1C907DABAA840F13CE
+823CE3CF8EA3D397BA9BDFBFA2DA4DFEF2EC1ED5B3614EEB9C22587D7B0D0D74
+997144A082426B0BA78C4A6989CE4C1160370CB0F4AF3E8D48CACBB05F4F2594
+EE00090A25625EE644820271401DFA4FB2A779890F24F70C091786ADEFD54000
+46D94B45562AF88A7813569805945A3DEEE0099D7DEEF04BD07AECE5127F4F8E
+F30B0A7DF29535D48310B57204FF1814897B55729540B321BBEC4D2157DA22DF
+8E10633D2EFD3C63B473D532F0AFD8D8923EE2164DE6AB4DF537219944D4ACD3
+C9F08A3359111DF6FF662C82059C550535911B7212FA8A1FC1269DB40501D2DB
+3F11383CA84651BD0B18F1668F66B25E15978A424B42B5B44C53102BB9867E4B
+F4DABFD8EBB06FE75FFE8B35BC319542B1B6135AE93997C567CC25F9969AD517
+4C9EC354E3AD7CDD9E3B15E802DBC1170599E45329E7D7FBB01F1B70F8F336D3
+5243E9DA91DDBFF2DB37E6D1790E0AB61B124C8DA9CC011CFFB0C16D57C8F935
+386E9E9016B2ED0AC95508CE6FD54E95D44D14DE4EFA77E00B8D51DBF58DAE0E
+EF1F050F120CF510823F90311415236B5430FE0A1A2CEABB91B01B2F3CD6BFF7
+7F523DEB2A545E62CA65E6AA2CDA21DB273D238B2A319647769E30FC81E5D975
+4886B129F6541181E631F94B11A99D7ADB2EB9BC0E63FA77C169CBE57E8D6FCF
+6CDCF6E0AC94F69295F47821352D2A90647F206B8BAB9410F0DBF4DD6143138C
+8F97959418D9B0C886777401924A948778B0EBBFEA50CF045F8D117714DDF7AB
+44B77A17A69ECA11FC0631D2B73F2C3DBBC690F0848616EC779A3581AAC18BF4
+66E81DA60ED8618CC4DD5550681DF0F0E2A535E0E5F1338E10486C7AFB237093
+1B130D98EAD1077DF16DE506D1181BE6C4B0A71DFFDD2CE49E58D21924195821
+A667A4A237702BBF3EBE714232A1AF00BD9C4FFDDF86E62B6DD50BB3BC1AD5B0
+D5F9AD86689D9148AB899003B3AAAAA186CF92C4CC6FF37BD72A14A68A7ED3D2
+8BCDCF291FC8197EBB03E1F892631006CCD3ADD184DFCAEF37CC4E47925E71CE
+5073C16851A4A042BBC81A8632296CEF049811FAF6D1399E5D827CFA7D3F1208
+A50984CFD55ED7F3821E2F4BA985A2EA207943485F0B5BEAFD4F012957D2D708
+C5152259B8530578A8A7E0C005E82F193900882F61B22675AE940DA9CD55B2F1
+A8EC1C69B0CF9CE47A6627BC13054CE4D00D92D44187F5B7A6C7D8101903102A
+580D69D2DD91958C6F4DD78DE9C2B00D236A891CFB2C7D3A242DC0F1CF6555A7
+8CF6DC94B93472738758A358A67CB88C84F30AC5DF55448237F2B73974619A62
+81DD7B1F524743879D3CB0800BA9A3CBC1CFE2B40134BBEF838BAA25B861E4EF
+E05428DE02E4608A24E468514394266AE4F3978E0F78E4689939331974B22AD9
+A7ED4CE0D140984F4C30EA38E11960DA525BCB57855FEE8109E77ED123803AC8
+A3AF0275BC5C8E9A77E182C10975EE99AADAF9ADED8BB121D11BF2E8A4E99510
+78D8E8F0BA4A41A3B95E961C1350FBB0803F18384B223CDA16005A9F17E88AD8
+EEB6CEE1D3F6FFB14C0EB982A99B3D88E42CF860E015F378DA89D432080616B7
+B59C053200D6A135D2D931B80C6570E87F3725E4A447A99F40F226DDDFA4F94F
+C4E2D8E6AAB62E4ABABC0600154F2C537138FB0677B5EC2260D7018870315E0F
+7DE3FB600537DE5D5412A25E08D5CDD2D6296C8EE0FC46E770A7CC967210A64F
+AB9FA013369CDFFF0D32286D8C79AED8F36DCEB2170B8ACE3F5412AF0B3912BA
+B1ACE2985983D388E0C676C81E329B9B11D6BBA66F580A74162AF6A322A3E696
+FE25676B87BF50A91FE0776E4FE061B46F49650DC7182732A6B0960E754B878E
+D5BD037C79EA9D7351166A2592AA94479FC1FDCB2E1BBCB6C05A2DBE29543AA2
+64C64A7DAE4A0B8C1987463EDEC83EA9E970DAD0FBEBECD47B1DC23198C5592C
+AF2BDC00A08D42C8D05FDC59F4ACD3555927C70BE903D05C6514C223458B064A
+FE25BFB8944878B78C0D816E89F04FF0F040838EFE2D958565F3FA3B5E8A8474
+23635E65D85170F3950BAC5F8C2E37924AD59B23090AFBC30F7F7014D13721BB
+064211D5AF389C58673F562E73C7A7BCC25E232FFF01C555B58AA5BCEBDA898C
+D4ADF8463759574879827CB6232875B9FCA5E1BA2FD426BAC550C2EC8309D1E0
+69D4ACA702C1312D22A141505F79DFE0316DB918F4A1D0753658D679AA071189
+3C6D0D5CDF8D322D2966AC66CCE5268EAB3CAC8B0C2DBF3CB60F03B282585D23
+F93703F0394FAF77344685A86EDA35E1CEB43243B002BD29CAF512F2B16ED359
+36EF8A8B249A53F5204EA8F9E18660C69585BDFA02CF4FB56A3FC3676041FC29
+0857A261D87DA78D9D84B9FE65BFCB7FB98183B987F43298A8C9E87B26B257E1
+82206711EDFF4347ED4A7540EEF397FE5F2EEE19FA3E09458554624E18455FC7
+8CF42E439E3944EB0ADC032EC00011926633513376EB46726AEE12A0F1B7FBEB
+1EB593651D32C27A4A4A07CC1FDF1BF1A9164B673BADACD5FD5C46BCC1AC45B3
+C3A7D76F2106AE8FDDB52B15652126DEF8BD87200C129FDAC00352688727709A
+7DE7EC08BCA9E736E87FDBF6ADCBFE1F62BFBE9EA4A0D7E87BDFA0EE2C29110D
+51B49E36BBCF76EC9F0DAF975938656DC73DEC3D909346BC09BACA2FFE357692
+DA3F60DF14CFDDBB82331A8B22CCAC3987A0F485B8BFE11CF371BE600B60C175
+AA2EC00826A07F068F31FF21B8B5BB5DD3AB729E5EDD2355C7E654984B50E668
+08BE76D12DF93632EC1018E1D558592F3E85BE2737A2D5C13DE23021715FC1CA
+E332FCFDCE37333888533833BFEE6525BB9BEE05
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+%%EndFont 
+TeXDict begin 40258431 52099146 1000 600 600 (history.dvi)
+@start /Fa 209[24 46[{ TeX74afc74cEncoding ReEncodeFont }1
+74.7198 /CMTI9 rf /Fb 134[41 41 1[41 43 30 30 30 1[43
+38 43 64 3[21 43 38 1[34 43 34 1[38 11[58 1[43 4[58 1[48
+3[58 60 50 1[59 10[38 38 38 38 2[38 1[38 38 3[21 44[{
+ TeXf7b6d320Encoding ReEncodeFont }34 74.7198 /CMR9 rf
+/Fc 134[39 3[39 39 39 39 2[39 39 39 39 2[39 39 2[39 3[39
+97[{ TeX09fbbfacEncoding ReEncodeFont }13 74.7198 /CMSLTT10
+rf /Fd 130[39 39 39 39 39 39 39 39 39 39 39 39 39 39
+39 39 39 39 39 1[39 39 39 39 39 39 39 39 39 39 39 1[39
+39 39 1[39 2[39 39 39 39 39 1[39 1[39 1[39 2[39 39 39
+39 39 39 39 39 39 2[39 39 39 39 39 3[39 1[39 1[39 39
+39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 33[{
+ TeX09fbbfacEncoding ReEncodeFont }76 74.7198 /CMTT9
+rf /Fe 214[35 35 40[{ TeXf7b6d320Encoding ReEncodeFont }2
+90.9091 /CMSS10 rf /Ff 133[51 60 60 83 60 64 45 45 47
+60 64 57 64 95 32 60 1[32 64 57 35 53 64 51 64 56 83[64
+64 12[{ TeXf7b6d320Encoding ReEncodeFont }27 99.6264
+/CMBX10 rf /Fg 137[52 52 52 52 52 2[52 52 52 52 2[52
+52 1[52 52 52 52 52 52 1[52 5[52 4[52 52 52 2[52 52 4[52
+52 2[52 3[52 22[52 42[{ TeX09fbbfacEncoding ReEncodeFont }29
+99.6264 /CMTT10 rf /Fh 134[48 48 48 1[48 48 48 48 2[48
+48 1[48 2[48 1[48 48 48 48 49[48 48 49[{
+ TeX09fbbfacEncoding ReEncodeFont }17 90.9091 /CMSLTT10
+rf /Fi 133[55 65 65 89 65 68 48 48 50 1[68 61 68 102
+34 2[34 68 61 37 56 68 55 68 60 9[127 1[94 1[68 4[96
+116 74 2[46 96 1[77 81 94 2[93 6[34 2[61 61 61 61 61
+61 61 2[34 33[68 12[{ TeXf7b6d320Encoding ReEncodeFont }45
+109.091 /CMBX12 rf /Fj 134[48 48 66 48 51 35 36 36 48
+51 45 51 76 25 2[25 51 45 28 40 51 40 1[45 3[25 1[25
+40[45 45 6[45 29[51 53 11[{ TeXf7b6d320Encoding ReEncodeFont }29
+90.9091 /CMSL10 rf /Fk 135[56 2[56 54 42 2[51 1[56 68
+47 1[39 27 56 58 49 1[57 54 1[56 97[{ TeX0ef0afcaEncoding ReEncodeFont }
+16 90.9091 /CMCSC10 rf /Fl 209[28 46[{
+ TeX74afc74cEncoding ReEncodeFont }1 90.9091 /CMTI10
+rf /Fm 209[43 46[{ TeX74afc74cEncoding ReEncodeFont }1
+119.552 /CMBXTI10 rf /Fn 134[85 85 117 85 90 63 64 66
+1[90 81 90 134 45 2[45 90 81 49 74 90 72 90 78 10[122
+124 112 3[110 1[126 153 3[60 126 127 101 2[117 115 122
+14[81 81 49[{ TeXf7b6d320Encoding ReEncodeFont }37 143.462
+/CMBX12 rf /Fo 242[91 13[{ TeXbbad153fEncoding ReEncodeFont }1
+90.9091 /CMSY10 rf /Fp 134[71 71 97 71 75 52 53 55 1[75
+67 75 112 37 2[37 75 67 41 61 75 60 75 65 9[139 102 103
+94 75 100 1[92 1[105 128 81 2[50 105 106 85 88 103 97
+96 102 11[67 67 67 67 67 2[37 1[37 44[{
+ TeXf7b6d320Encoding ReEncodeFont }48 119.552 /CMBX12
+rf /Fq 129[48 48 48 48 48 48 48 48 48 48 48 48 48 48
+48 48 48 48 48 48 1[48 48 48 48 48 48 48 48 48 1[48 48
+48 48 48 1[48 3[48 48 48 48 1[48 48 48 1[48 2[48 48 48
+48 48 48 2[48 1[48 48 48 48 48 48 7[48 48 48 48 48 48
+48 48 48 48 48 1[48 48 48 48 48 48 33[{
+ TeX09fbbfacEncoding ReEncodeFont }73 90.9091 /CMTT10
+rf /Fr 131[91 1[40 48 48 66 48 51 35 36 36 48 51 45 51
+76 25 48 28 25 51 45 28 40 51 40 51 45 25 2[25 45 25
+56 68 68 93 68 68 66 51 67 71 62 71 68 83 57 71 47 33
+68 71 59 62 69 66 64 68 5[25 25 45 45 45 45 45 45 45
+45 45 45 45 25 30 25 2[35 35 25 4[45 19[76 51 51 53 11[{
+ TeXf7b6d320Encoding ReEncodeFont }81 90.9091 /CMR10
+rf /Fs 134[102 4[75 76 79 2[97 5[54 6[108 94 11[149 6[151
+1[116 3[151 152 71[{ TeXf7b6d320Encoding ReEncodeFont }13
+172.154 /CMBX12 rf end
+%%EndProlog
+%%BeginSetup
+%%Feature: *Resolution 600dpi
+TeXDict begin
+%%BeginPaperSize: Letter
+letter
+%%EndPaperSize
+ end
+%%EndSetup
+%%Page: 1 1
+TeXDict begin 1 0 bop 150 1318 a Fs(GNU)65 b(History)h(Library)p
+150 1418 3600 34 v 1920 1515 a Fr(Edition)31 b(5.2,)h(for)e
+Fq(History)e(Library)h Fr(V)-8 b(ersion)31 b(5.2.)3333
+1623 y(April)f(2006)150 4935 y Fp(Chet)45 b(Ramey)-11
+b(,)46 b(Case)g(W)-11 b(estern)46 b(Reserv)l(e)g(Univ)l(ersit)l(y)150
+5068 y(Brian)f(F)-11 b(o)l(x,)45 b(F)-11 b(ree)45 b(Soft)l(w)l(are)h(F)
+-11 b(oundation)p 150 5141 3600 17 v eop end
+%%Page: 2 2
+TeXDict begin 2 1 bop 150 3024 a Fr(This)28 b(do)s(cumen)m(t)i(describ)
+s(es)e(the)i(GNU)g(History)f(library)g(\(v)m(ersion)h(5.2,)h(26)f
+(April)f(2006\),)j(a)e(program-)150 3133 y(ming)38 b(to)s(ol)h(that)f
+(pro)m(vides)g(a)g(consisten)m(t)i(user)d(in)m(terface)i(for)f
+(recalling)h(lines)g(of)f(previously)f(t)m(yp)s(ed)150
+3243 y(input.)150 3377 y(Cop)m(yrigh)m(t)602 3374 y(c)577
+3377 y Fo(\015)30 b Fr(1988-2006)k(F)-8 b(ree)32 b(Soft)m(w)m(are)f(F)
+-8 b(oundation,)32 b(Inc.)150 3512 y(P)m(ermission)g(is)h(gran)m(ted)g
+(to)f(mak)m(e)i(and)d(distribute)h(v)m(erbatim)h(copies)g(of)f(this)g
+(man)m(ual)h(pro)m(vided)f(the)150 3621 y(cop)m(yrigh)m(t)g(notice)f
+(and)f(this)g(p)s(ermission)g(notice)h(are)g(preserv)m(ed)f(on)h(all)g
+(copies.)390 3756 y(P)m(ermission)k(is)h(gran)m(ted)f(to)h(cop)m(y)-8
+b(,)38 b(distribute)d(and/or)g(mo)s(dify)f(this)h(do)s(cumen)m(t)g
+(under)390 3866 y(the)j(terms)g(of)g(the)g(GNU)h(F)-8
+b(ree)39 b(Do)s(cumen)m(tation)h(License,)g(V)-8 b(ersion)39
+b(1.2)g(or)f(an)m(y)g(later)390 3975 y(v)m(ersion)28
+b(published)d(b)m(y)j(the)f(F)-8 b(ree)29 b(Soft)m(w)m(are)f(F)-8
+b(oundation;)30 b(with)d(no)g(In)m(v)-5 b(arian)m(t)28
+b(Sections,)390 4085 y(with)i(the)h(F)-8 b(ron)m(t-Co)m(v)m(er)33
+b(texts)e(b)s(eing)g(\\A)g(GNU)g(Man)m(ual,")h(and)e(with)g(the)h(Bac)m
+(k-Co)m(v)m(er)390 4194 y(T)-8 b(exts)33 b(as)g(in)f(\(a\))h(b)s(elo)m
+(w.)47 b(A)33 b(cop)m(y)g(of)f(the)h(license)g(is)g(included)e(in)h
+(the)h(section)g(en)m(titled)390 4304 y(\\GNU)e(F)-8
+b(ree)32 b(Do)s(cumen)m(tation)g(License.")390 4438 y(\(a\))39
+b(The)f(FSF's)g(Bac)m(k-Co)m(v)m(er)j(T)-8 b(ext)39 b(is:)56
+b(\\Y)-8 b(ou)39 b(ha)m(v)m(e)g(freedom)f(to)h(cop)m(y)f(and)g(mo)s
+(dify)390 4548 y(this)32 b(GNU)i(Man)m(ual,)g(lik)m(e)g(GNU)f(soft)m(w)
+m(are.)49 b(Copies)32 b(published)f(b)m(y)h(the)h(F)-8
+b(ree)34 b(Soft)m(w)m(are)390 4658 y(F)-8 b(oundation)31
+b(raise)g(funds)d(for)j(GNU)g(dev)m(elopmen)m(t.")150
+4902 y(Published)e(b)m(y)h(the)h(F)-8 b(ree)31 b(Soft)m(w)m(are)h(F)-8
+b(oundation)150 5011 y(59)31 b(T)-8 b(emple)31 b(Place,)h(Suite)e(330,)
+150 5121 y(Boston,)i(MA)e(02111-1307)150 5230 y(USA)p
+eop end
+%%Page: -1 3
+TeXDict begin -1 2 bop 3725 -116 a Fr(i)150 299 y Fn(T)-13
+b(able)53 b(of)h(Con)l(ten)l(ts)150 641 y Fp(1)135 b(Using)45
+b(History)h(In)l(teractiv)l(ely)18 b Fm(.)23 b(.)c(.)g(.)h(.)f(.)h(.)f
+(.)h(.)f(.)g(.)h(.)f(.)h(.)f(.)h(.)f(.)63 b Fp(1)449
+778 y Fr(1.1)92 b(History)31 b(Expansion)9 b Fl(.)15
+b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
+g(.)g(.)g(.)39 b Fr(1)748 888 y(1.1.1)93 b(Ev)m(en)m(t)31
+b(Designators)25 b Fl(.)15 b(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
+g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)54 b Fr(1)748 997 y(1.1.2)93 b(W)-8 b(ord)30 b(Designators)9
+b Fl(.)17 b(.)e(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)39
+b Fr(1)748 1107 y(1.1.3)93 b(Mo)s(di\014ers)9 b Fl(.)14
+b(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)
+g(.)g(.)g(.)38 b Fr(2)150 1349 y Fp(2)135 b(Programming)46
+b(with)f(GNU)g(History)33 b Fm(.)19 b(.)h(.)f(.)g(.)h(.)f(.)h(.)f(.)h
+(.)f(.)76 b Fp(5)449 1486 y Fr(2.1)92 b(In)m(tro)s(duction)30
+b(to)h(History)19 b Fl(.)d(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
+g(.)g(.)g(.)g(.)49 b Fr(5)449 1596 y(2.2)92 b(History)31
+b(Storage)25 b Fl(.)15 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
+g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)54 b Fr(5)449
+1705 y(2.3)92 b(History)31 b(F)-8 b(unctions)24 b Fl(.)15
+b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
+g(.)g(.)g(.)53 b Fr(6)748 1815 y(2.3.1)93 b(Initializing)32
+b(History)f(and)e(State)j(Managemen)m(t)f Fl(.)15 b(.)g(.)g(.)g(.)g(.)g
+(.)59 b Fr(6)748 1924 y(2.3.2)93 b(History)31 b(List)f(Managemen)m(t)h
+Fl(.)15 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)h(.)f(.)58 b Fr(6)748 2034 y(2.3.3)93
+b(Information)30 b(Ab)s(out)g(the)g(History)h(List)23
+b Fl(.)15 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)52
+b Fr(7)748 2144 y(2.3.4)93 b(Mo)m(ving)31 b(Around)e(the)i(History)g
+(List)21 b Fl(.)15 b(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
+g(.)g(.)g(.)51 b Fr(7)748 2253 y(2.3.5)93 b(Searc)m(hing)30
+b(the)h(History)g(List)15 b Fl(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)44
+b Fr(8)748 2363 y(2.3.6)93 b(Managing)31 b(the)g(History)g(File)11
+b Fl(.)16 b(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)41 b Fr(8)748 2472 y(2.3.7)93
+b(History)31 b(Expansion)18 b Fl(.)c(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
+g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)48 b Fr(9)449 2582 y(2.4)92 b(History)31 b(V)-8
+b(ariables)11 b Fl(.)17 b(.)e(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
+g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)40 b Fr(10)449 2692
+y(2.5)92 b(History)31 b(Programming)f(Example)13 b Fl(.)j(.)f(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
+g(.)h(.)f(.)g(.)42 b Fr(11)150 2934 y Fp(App)t(endix)i(A)99
+b(Cop)l(ying)46 b(This)e(Man)l(ual)29 b Fm(.)20 b(.)g(.)f(.)h(.)f(.)g
+(.)h(.)f(.)h(.)f(.)74 b Fp(13)449 3071 y Fr(A.1)92 b(GNU)31
+b(F)-8 b(ree)31 b(Do)s(cumen)m(tation)h(License)c Fl(.)15
+b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)56 b Fr(13)748 3181 y(A.1.1)92 b(ADDENDUM:)33
+b(Ho)m(w)e(to)g(use)f(this)g(License)h(for)g(y)m(our)930
+3290 y(do)s(cumen)m(ts)c Fl(.)15 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
+g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)57 b Fr(19)150
+3533 y Fp(App)t(endix)44 b(B)105 b(Concept)46 b(Index)16
+b Fm(.)j(.)h(.)f(.)g(.)h(.)f(.)h(.)f(.)h(.)f(.)g(.)h(.)f(.)h(.)f(.)h(.)
+f(.)61 b Fp(21)150 3802 y(App)t(endix)44 b(C)104 b(F)-11
+b(unction)44 b(and)h(V)-11 b(ariable)46 b(Index)13 b
+Fm(.)19 b(.)g(.)h(.)f(.)58 b Fp(23)p eop end
+%%Page: -2 4
+TeXDict begin -2 3 bop 150 -116 a Fr(ii)2691 b(GNU)31
+b(History)g(Library)p eop end
+%%Page: 1 5
+TeXDict begin 1 4 bop 150 -116 a Fr(Chapter)30 b(1:)41
+b(Using)30 b(History)h(In)m(teractiv)m(ely)2016 b(1)150
+299 y Fn(1)80 b(Using)53 b(History)g(In)l(teractiv)l(ely)275
+562 y Fr(This)32 b(c)m(hapter)i(describ)s(es)e(ho)m(w)h(to)h(use)f(the)
+g Fk(gnu)g Fr(History)h(Library)e(in)m(teractiv)m(ely)-8
+b(,)37 b(from)c(a)h(user's)150 672 y(standp)s(oin)m(t.)76
+b(It)42 b(should)f(b)s(e)h(considered)g(a)g(user's)g(guide.)76
+b(F)-8 b(or)43 b(information)f(on)g(using)g(the)g Fk(gnu)150
+781 y Fr(History)36 b(Library)e(in)h(y)m(our)f(o)m(wn)i(programs,)g
+(see)f(Chapter)g(2)g([Programming)g(with)g(GNU)h(History],)150
+891 y(page)31 b(5.)150 1172 y Fp(1.1)68 b(History)46
+b(Expansion)275 1426 y Fr(The)35 b(History)h(library)f(pro)m(vides)h(a)
+g(history)f(expansion)h(feature)g(that)g(is)g(similar)g(to)g(the)g
+(history)150 1536 y(expansion)22 b(pro)m(vided)f(b)m(y)h
+Fq(csh)p Fr(.)37 b(This)22 b(section)h(describ)s(es)e(the)h(syn)m(tax)h
+(used)e(to)h(manipulate)h(the)f(history)150 1645 y(information.)275
+1789 y(History)31 b(expansions)f(in)m(tro)s(duce)g(w)m(ords)g(from)g
+(the)h(history)f(list)h(in)m(to)g(the)g(input)f(stream,)h(making)150
+1899 y(it)g(easy)g(to)g(rep)s(eat)g(commands,)f(insert)g(the)h(argumen)
+m(ts)f(to)h(a)g(previous)f(command)g(in)m(to)i(the)e(curren)m(t)150
+2009 y(input)f(line,)i(or)g(\014x)f(errors)f(in)h(previous)g(commands)g
+(quic)m(kly)-8 b(.)275 2153 y(History)37 b(expansion)f(tak)m(es)i
+(place)g(in)e(t)m(w)m(o)i(parts.)59 b(The)36 b(\014rst)g(is)h(to)g
+(determine)g(whic)m(h)f(line)h(from)150 2262 y(the)42
+b(history)f(list)h(should)e(b)s(e)h(used)f(during)g(substitution.)74
+b(The)40 b(second)i(is)f(to)h(select)h(p)s(ortions)e(of)150
+2372 y(that)31 b(line)g(for)f(inclusion)h(in)m(to)g(the)g(curren)m(t)f
+(one.)42 b(The)30 b(line)h(selected)h(from)e(the)h(history)f(is)h
+(called)h(the)150 2481 y Fj(ev)m(en)m(t)p Fr(,)e(and)c(the)i(p)s
+(ortions)e(of)i(that)f(line)h(that)g(are)f(acted)i(up)s(on)c(are)j
+(called)g Fj(w)m(ords)p Fr(.)39 b(V)-8 b(arious)28 b
+Fj(mo)s(di\014ers)150 2591 y Fr(are)33 b(a)m(v)-5 b(ailable)36
+b(to)d(manipulate)h(the)f(selected)h(w)m(ords.)48 b(The)32
+b(line)i(is)f(brok)m(en)f(in)m(to)i(w)m(ords)f(in)f(the)i(same)150
+2701 y(fashion)23 b(that)g(Bash)g(do)s(es,)h(so)f(that)h(sev)m(eral)g
+(w)m(ords)e(surrounded)e(b)m(y)j(quotes)g(are)g(considered)g(one)g(w)m
+(ord.)150 2810 y(History)37 b(expansions)g(are)g(in)m(tro)s(duced)f(b)m
+(y)h(the)g(app)s(earance)g(of)g(the)g(history)f(expansion)h(c)m
+(haracter,)150 2920 y(whic)m(h)30 b(is)h(`)p Fq(!)p Fr(')f(b)m(y)g
+(default.)150 3163 y Fi(1.1.1)63 b(Ev)m(en)m(t)39 b(Designators)275
+3417 y Fr(An)30 b(ev)m(en)m(t)h(designator)h(is)e(a)h(reference)g(to)g
+(a)f(command)h(line)f(en)m(try)h(in)f(the)h(history)f(list.)150
+3591 y Fq(!)432 b Fr(Start)34 b(a)f(history)h(substitution,)g(except)g
+(when)f(follo)m(w)m(ed)i(b)m(y)e(a)h(space,)h(tab,)f(the)g(end)f(of)630
+3701 y(the)e(line,)g(or)f(`)p Fq(=)p Fr('.)150 3870 y
+Fq(!)p Fh(n)384 b Fr(Refer)30 b(to)i(command)e(line)g
+Fj(n)p Fr(.)150 4039 y Fq(!-)p Fh(n)336 b Fr(Refer)30
+b(to)i(the)e(command)g Fj(n)g Fr(lines)h(bac)m(k.)150
+4208 y Fq(!!)384 b Fr(Refer)30 b(to)i(the)e(previous)g(command.)40
+b(This)30 b(is)g(a)h(synon)m(ym)f(for)g(`)p Fq(!-1)p
+Fr('.)150 4377 y Fq(!)p Fh(string)144 b Fr(Refer)30 b(to)i(the)e(most)h
+(recen)m(t)g(command)f(starting)i(with)e Fj(string)p
+Fr(.)150 4546 y Fq(!?)p Fh(string)11 b Fq([?])630 4655
+y Fr(Refer)34 b(to)g(the)f(most)h(recen)m(t)h(command)e(con)m(taining)i
+Fj(string)p Fr(.)50 b(The)33 b(trailing)i(`)p Fq(?)p
+Fr(')e(ma)m(y)i(b)s(e)630 4765 y(omitted)c(if)g(the)f
+Fj(string)38 b Fr(is)31 b(follo)m(w)m(ed)h(immediately)g(b)m(y)e(a)h
+(newline.)150 4934 y Fq(^)p Fh(string1)11 b Fq(^)p Fh(string2)g
+Fq(^)630 5044 y Fr(Quic)m(k)32 b(Substitution.)44 b(Rep)s(eat)32
+b(the)g(last)h(command,)f(replacing)g Fj(string1)40 b
+Fr(with)31 b Fj(string2)p Fr(.)630 5153 y(Equiv)-5 b(alen)m(t)31
+b(to)g Fq(!!:s/)p Fh(string1)11 b Fq(/)p Fh(string2)g
+Fq(/)p Fr(.)150 5322 y Fq(!#)384 b Fr(The)30 b(en)m(tire)h(command)f
+(line)h(t)m(yp)s(ed)f(so)h(far.)p eop end
+%%Page: 2 6
+TeXDict begin 2 5 bop 150 -116 a Fr(2)2696 b(GNU)31 b(History)g
+(Library)150 299 y Fi(1.1.2)63 b(W)-10 b(ord)41 b(Designators)275
+542 y Fr(W)-8 b(ord)35 b(designators)g(are)g(used)f(to)h(select)h
+(desired)e(w)m(ords)h(from)f(the)h(ev)m(en)m(t.)55 b(A)34
+b(`)p Fq(:)p Fr(')h(separates)h(the)150 652 y(ev)m(en)m(t)41
+b(sp)s(eci\014cation)f(from)g(the)f(w)m(ord)g(designator.)69
+b(It)40 b(ma)m(y)g(b)s(e)f(omitted)i(if)e(the)h(w)m(ord)f(designator)
+150 761 y(b)s(egins)33 b(with)h(a)h(`)p Fq(^)p Fr(',)g(`)p
+Fq($)p Fr(',)g(`)p Fq(*)p Fr(',)h(`)p Fq(-)p Fr(',)f(or)f(`)p
+Fq(\045)p Fr('.)52 b(W)-8 b(ords)35 b(are)f(n)m(um)m(b)s(ered)f(from)g
+(the)i(b)s(eginning)e(of)h(the)g(line,)150 871 y(with)39
+b(the)h(\014rst)f(w)m(ord)g(b)s(eing)g(denoted)h(b)m(y)g(0)g(\(zero\).)
+70 b(W)-8 b(ords)39 b(are)h(inserted)g(in)m(to)g(the)g(curren)m(t)g
+(line)150 980 y(separated)31 b(b)m(y)f(single)h(spaces.)275
+1114 y(F)-8 b(or)31 b(example,)150 1272 y Fq(!!)384 b
+Fr(designates)37 b(the)f(preceding)g(command.)57 b(When)35
+b(y)m(ou)i(t)m(yp)s(e)f(this,)h(the)f(preceding)g(com-)630
+1381 y(mand)30 b(is)g(rep)s(eated)g(in)g(toto.)150 1539
+y Fq(!!:$)288 b Fr(designates)23 b(the)g(last)g(argumen)m(t)g(of)f(the)
+h(preceding)f(command.)38 b(This)22 b(ma)m(y)h(b)s(e)e(shortened)630
+1648 y(to)31 b Fq(!$)p Fr(.)150 1806 y Fq(!fi:2)240 b
+Fr(designates)30 b(the)g(second)f(argumen)m(t)h(of)f(the)h(most)f
+(recen)m(t)i(command)e(starting)h(with)f(the)630 1916
+y(letters)j Fq(fi)p Fr(.)275 2073 y(Here)e(are)h(the)g(w)m(ord)f
+(designators:)150 2231 y Fq(0)g(\(zero\))114 b Fr(The)30
+b Fq(0)p Fr(th)g(w)m(ord.)40 b(F)-8 b(or)31 b(man)m(y)g(applications,)h
+(this)e(is)g(the)h(command)f(w)m(ord.)150 2388 y Fh(n)432
+b Fr(The)30 b Fj(n)p Fr(th)g(w)m(ord.)150 2546 y Fq(^)432
+b Fr(The)30 b(\014rst)f(argumen)m(t;)j(that)f(is,)f(w)m(ord)g(1.)150
+2703 y Fq($)432 b Fr(The)30 b(last)h(argumen)m(t.)150
+2861 y Fq(\045)432 b Fr(The)30 b(w)m(ord)g(matc)m(hed)h(b)m(y)f(the)h
+(most)g(recen)m(t)g(`)p Fq(?)p Fh(string)11 b Fq(?)p
+Fr(')28 b(searc)m(h.)150 3019 y Fh(x)p Fq(-)p Fh(y)336
+b Fr(A)30 b(range)h(of)g(w)m(ords;)f(`)p Fq(-)p Fh(y)11
+b Fr(')30 b(abbreviates)h(`)p Fq(0-)p Fh(y)11 b Fr('.)150
+3176 y Fq(*)432 b Fr(All)28 b(of)g(the)g(w)m(ords,)g(except)h(the)e
+Fq(0)p Fr(th.)40 b(This)27 b(is)g(a)h(synon)m(ym)f(for)h(`)p
+Fq(1-$)p Fr('.)39 b(It)28 b(is)g(not)g(an)f(error)630
+3286 y(to)j(use)g(`)p Fq(*)p Fr(')f(if)h(there)g(is)g(just)f(one)h(w)m
+(ord)f(in)g(the)h(ev)m(en)m(t;)i(the)d(empt)m(y)i(string)e(is)h
+(returned)e(in)630 3395 y(that)j(case.)150 3553 y Fh(x)11
+b Fq(*)373 b Fr(Abbreviates)31 b(`)p Fh(x)p Fq(-$)p Fr(')150
+3711 y Fh(x)p Fq(-)384 b Fr(Abbreviates)31 b(`)p Fh(x)p
+Fq(-$)p Fr(')f(lik)m(e)h(`)p Fh(x)11 b Fq(*)p Fr(',)31
+b(but)e(omits)i(the)g(last)g(w)m(ord.)275 3868 y(If)i(a)h(w)m(ord)g
+(designator)g(is)g(supplied)f(without)h(an)g(ev)m(en)m(t)h(sp)s
+(eci\014cation,)h(the)e(previous)f(command)150 3978 y(is)d(used)g(as)h
+(the)f(ev)m(en)m(t.)150 4199 y Fi(1.1.3)63 b(Mo)s(di\014ers)275
+4442 y Fr(After)20 b(the)h(optional)h(w)m(ord)f(designator,)i(y)m(ou)e
+(can)g(add)f(a)h(sequence)g(of)g(one)g(or)g(more)g(of)g(the)f(follo)m
+(wing)150 4552 y(mo)s(di\014ers,)29 b(eac)m(h)j(preceded)e(b)m(y)g(a)h
+(`)p Fq(:)p Fr('.)150 4710 y Fq(h)432 b Fr(Remo)m(v)m(e)32
+b(a)f(trailing)g(pathname)g(comp)s(onen)m(t,)g(lea)m(ving)h(only)e(the)
+h(head.)150 4867 y Fq(t)432 b Fr(Remo)m(v)m(e)32 b(all)f(leading)h
+(pathname)e(comp)s(onen)m(ts,)h(lea)m(ving)h(the)e(tail.)150
+5025 y Fq(r)432 b Fr(Remo)m(v)m(e)32 b(a)f(trailing)g(su\016x)f(of)g
+(the)h(form)f(`)p Fq(.)p Fh(suffix)11 b Fr(',)28 b(lea)m(ving)33
+b(the)d(basename.)150 5182 y Fq(e)432 b Fr(Remo)m(v)m(e)32
+b(all)f(but)f(the)h(trailing)g(su\016x.)150 5340 y Fq(p)432
+b Fr(Prin)m(t)30 b(the)h(new)f(command)g(but)g(do)g(not)g(execute)i
+(it.)p eop end
+%%Page: 3 7
+TeXDict begin 3 6 bop 150 -116 a Fr(Chapter)30 b(1:)41
+b(Using)30 b(History)h(In)m(teractiv)m(ely)2016 b(3)150
+299 y Fq(s/)p Fh(old)11 b Fq(/)p Fh(new)g Fq(/)630 408
+y Fr(Substitute)32 b Fj(new)40 b Fr(for)32 b(the)h(\014rst)f(o)s
+(ccurrence)h(of)f Fj(old)37 b Fr(in)32 b(the)h(ev)m(en)m(t)h(line.)48
+b(An)m(y)32 b(delimiter)630 518 y(ma)m(y)25 b(b)s(e)g(used)f(in)g
+(place)i(of)f(`)p Fq(/)p Fr('.)39 b(The)24 b(delimiter)h(ma)m(y)h(b)s
+(e)e(quoted)h(in)f Fj(old)29 b Fr(and)24 b Fj(new)32
+b Fr(with)25 b(a)630 628 y(single)k(bac)m(kslash.)40
+b(If)28 b(`)p Fq(&)p Fr(')g(app)s(ears)g(in)f Fj(new)p
+Fr(,)i(it)f(is)h(replaced)f(b)m(y)g Fj(old)p Fr(.)40
+b(A)28 b(single)h(bac)m(kslash)630 737 y(will)35 b(quote)g(the)g(`)p
+Fq(&)p Fr('.)54 b(The)34 b(\014nal)g(delimiter)i(is)e(optional)i(if)f
+(it)g(is)f(the)h(last)h(c)m(haracter)g(on)630 847 y(the)31
+b(input)e(line.)150 1006 y Fq(&)432 b Fr(Rep)s(eat)31
+b(the)f(previous)g(substitution.)150 1166 y Fq(g)150
+1275 y(a)432 b Fr(Cause)38 b(c)m(hanges)i(to)f(b)s(e)f(applied)h(o)m(v)
+m(er)h(the)f(en)m(tire)g(ev)m(en)m(t)h(line.)66 b(Used)39
+b(in)f(conjunction)630 1385 y(with)30 b(`)p Fq(s)p Fr(',)h(as)f(in)h
+Fq(gs/)p Fh(old)11 b Fq(/)p Fh(new)g Fq(/)p Fr(,)26 b(or)k(with)h(`)p
+Fq(&)p Fr('.)150 1544 y Fq(G)432 b Fr(Apply)30 b(the)g(follo)m(wing)i
+(`)p Fq(s)p Fr(')f(mo)s(di\014er)e(once)i(to)g(eac)m(h)h(w)m(ord)e(in)g
+(the)g(ev)m(en)m(t.)p eop end
+%%Page: 4 8
+TeXDict begin 4 7 bop 150 -116 a Fr(4)2696 b(GNU)31 b(History)g
+(Library)p eop end
+%%Page: 5 9
+TeXDict begin 5 8 bop 150 -116 a Fr(Chapter)30 b(2:)41
+b(Programming)30 b(with)g(GNU)h(History)1780 b(5)150
+299 y Fn(2)80 b(Programming)54 b(with)f(GNU)h(History)275
+525 y Fr(This)31 b(c)m(hapter)i(describ)s(es)f(ho)m(w)g(to)h(in)m
+(terface)h(programs)e(that)h(y)m(ou)g(write)g(with)f(the)g
+Fk(gnu)g Fr(History)150 634 y(Library)-8 b(.)48 b(It)33
+b(should)e(b)s(e)i(considered)f(a)h(tec)m(hnical)i(guide.)48
+b(F)-8 b(or)34 b(information)f(on)g(the)g(in)m(teractiv)m(e)i(use)150
+744 y(of)c Fk(gnu)f Fr(History)-8 b(,)31 b(see)g(Chapter)f(1)h([Using)g
+(History)g(In)m(teractiv)m(ely],)i(page)e(1.)150 996
+y Fp(2.1)68 b(In)l(tro)t(duction)45 b(to)g(History)275
+1239 y Fr(Man)m(y)23 b(programs)f(read)h(input)f(from)g(the)h(user)f(a)
+h(line)g(at)g(a)g(time.)39 b(The)23 b Fk(gnu)f Fr(History)h(library)g
+(is)f(able)150 1348 y(to)29 b(k)m(eep)h(trac)m(k)g(of)f(those)g(lines,)
+h(asso)s(ciate)g(arbitrary)f(data)g(with)g(eac)m(h)h(line,)f(and)g
+(utilize)h(information)150 1458 y(from)g(previous)g(lines)g(in)g(comp)s
+(osing)h(new)f(ones.)275 1591 y(The)d(programmer)g(using)g(the)g
+(History)h(library)f(has)h(a)m(v)-5 b(ailable)29 b(functions)e(for)h
+(remem)m(b)s(ering)f(lines)150 1700 y(on)21 b(a)g(history)f(list,)k
+(asso)s(ciating)e(arbitrary)e(data)i(with)e(a)h(line,)i(remo)m(ving)f
+(lines)f(from)f(the)h(list,)i(searc)m(hing)150 1810 y(through)35
+b(the)g(list)h(for)f(a)h(line)f(con)m(taining)i(an)e(arbitrary)g(text)h
+(string,)h(and)e(referencing)g(an)m(y)h(line)f(in)150
+1919 y(the)c(list)g(directly)-8 b(.)43 b(In)30 b(addition,)h(a)g
+(history)g Fj(expansion)g Fr(function)f(is)h(a)m(v)-5
+b(ailable)33 b(whic)m(h)d(pro)m(vides)h(for)g(a)150 2029
+y(consisten)m(t)h(user)d(in)m(terface)j(across)f(di\013eren)m(t)g
+(programs.)275 2162 y(The)c(user)g(using)g(programs)h(written)g(with)g
+(the)g(History)g(library)g(has)f(the)h(b)s(ene\014t)f(of)h(a)h
+(consisten)m(t)150 2271 y(user)38 b(in)m(terface)j(with)e(a)g(set)g(of)
+h(w)m(ell-kno)m(wn)f(commands)g(for)g(manipulating)g(the)g(text)h(of)f
+(previous)150 2381 y(lines)28 b(and)f(using)g(that)h(text)g(in)g(new)f
+(commands.)39 b(The)27 b(basic)h(history)g(manipulation)f(commands)h
+(are)150 2491 y(similar)j(to)g(the)f(history)h(substitution)f(pro)m
+(vided)g(b)m(y)g Fq(csh)p Fr(.)275 2623 y(If)f(the)g(programmer)g
+(desires,)h(he)g(can)f(use)h(the)f(Readline)i(library)-8
+b(,)30 b(whic)m(h)f(includes)g(some)h(history)150 2733
+y(manipulation)h(b)m(y)f(default,)h(and)e(has)i(the)f(added)g(adv)-5
+b(an)m(tage)32 b(of)f(command)f(line)g(editing.)275 2866
+y(Before)39 b(declaring)f(an)m(y)h(functions)e(using)h(an)m(y)g
+(functionalit)m(y)i(the)e(History)h(library)e(pro)m(vides)h(in)150
+2976 y(other)29 b(co)s(de,)g(an)g(application)h(writer)f(should)e
+(include)i(the)g(\014le)f Fq(<readline/history.h>)23
+b Fr(in)29 b(an)m(y)g(\014le)150 3085 y(that)c(uses)e(the)h(History)h
+(library's)e(features.)39 b(It)24 b(supplies)f(extern)h(declarations)i
+(for)d(all)i(of)f(the)g(library's)150 3195 y(public)30
+b(functions)g(and)f(v)-5 b(ariables,)32 b(and)d(declares)j(all)f(of)f
+(the)h(public)f(data)h(structures.)150 3447 y Fp(2.2)68
+b(History)46 b(Storage)275 3689 y Fr(The)29 b(history)i(list)g(is)f(an)
+g(arra)m(y)h(of)g(history)f(en)m(tries.)42 b(A)30 b(history)g(en)m(try)
+h(is)f(declared)h(as)g(follo)m(ws:)390 3822 y Fq(typedef)46
+b(void)g(*histdata_t;)390 4042 y(typedef)g(struct)g(_hist_entry)f({)485
+4151 y(char)i(*line;)485 4261 y(char)g(*timestamp;)485
+4370 y(histdata_t)e(data;)390 4480 y(})i(HIST_ENTRY;)275
+4613 y Fr(The)29 b(history)i(list)g(itself)g(migh)m(t)g(therefore)g(b)s
+(e)f(declared)g(as)390 4746 y Fq(HIST_ENTRY)45 b(**the_history_list;)
+275 4878 y Fr(The)29 b(state)j(of)f(the)f(History)h(library)f(is)h
+(encapsulated)g(in)m(to)g(a)g(single)g(structure:)390
+5011 y Fq(/*)438 5121 y(*)47 b(A)h(structure)d(used)i(to)g(pass)f
+(around)g(the)h(current)f(state)h(of)g(the)g(history.)438
+5230 y(*/)390 5340 y(typedef)f(struct)g(_hist_state)f({)p
+eop end
+%%Page: 6 10
+TeXDict begin 6 9 bop 150 -116 a Fr(6)2696 b(GNU)31 b(History)g
+(Library)485 299 y Fq(HIST_ENTRY)45 b(**entries;)g(/*)j(Pointer)d(to)j
+(the)f(entries)e(themselves.)g(*/)485 408 y(int)i(offset;)523
+b(/*)48 b(The)f(location)e(pointer)h(within)g(this)h(array.)f(*/)485
+518 y(int)h(length;)523 b(/*)48 b(Number)e(of)h(elements)e(within)i
+(this)f(array.)g(*/)485 628 y(int)h(size;)619 b(/*)48
+b(Number)e(of)h(slots)f(allocated)g(to)h(this)f(array.)g(*/)485
+737 y(int)h(flags;)390 847 y(})g(HISTORY_STATE;)275 985
+y Fr(If)29 b(the)i(\015ags)g(mem)m(b)s(er)e(includes)h
+Fq(HS_STIFLED)p Fr(,)e(the)j(history)f(has)g(b)s(een)g(sti\015ed.)150
+1252 y Fp(2.3)68 b(History)46 b(F)-11 b(unctions)275
+1500 y Fr(This)23 b(section)j(describ)s(es)e(the)h(calling)h(sequence)f
+(for)f(the)h(v)-5 b(arious)25 b(functions)f(exp)s(orted)g(b)m(y)g(the)h
+Fk(gnu)150 1610 y Fr(History)31 b(library)-8 b(.)150
+1842 y Fi(2.3.1)63 b(Initializing)40 b(History)i(and)f(State)f
+(Managemen)m(t)275 2090 y Fr(This)33 b(section)j(describ)s(es)e
+(functions)g(used)g(to)h(initialize)i(and)d(manage)h(the)g(state)h(of)f
+(the)f(History)150 2200 y(library)c(when)f(y)m(ou)i(w)m(an)m(t)g(to)g
+(use)f(the)h(history)f(functions)g(in)g(y)m(our)h(program.)3350
+2392 y([F)-8 b(unction])-3599 b Fg(void)39 b Ff(using)p
+667 2392 35 5 v 50 w(history)46 b Fe(\()p Fq(void)p Fe(\))390
+2501 y Fr(Begin)41 b(a)f(session)g(in)g(whic)m(h)f(the)h(history)g
+(functions)f(migh)m(t)i(b)s(e)e(used.)69 b(This)39 b(initializes)j(the)
+390 2611 y(in)m(teractiv)m(e)33 b(v)-5 b(ariables.)3350
+2803 y([F)d(unction])-3599 b Fg(HISTORY_STATE)42 b(*)d
+Ff(history)p 1317 2803 V 50 w(get)p 1522 2803 V 50 w(history)p
+1922 2803 V 51 w(state)k Fe(\()p Fq(void)p Fe(\))390
+2913 y Fr(Return)30 b(a)g(structure)g(describing)g(the)h(curren)m(t)f
+(state)i(of)e(the)h(input)e(history)-8 b(.)3350 3105
+y([F)g(unction])-3599 b Fg(void)39 b Ff(history)p 755
+3105 V 51 w(set)p 949 3105 V 50 w(history)p 1349 3105
+V 50 w(state)44 b Fe(\()p Fq(HISTORY_STATE)27 b(*state)p
+Fe(\))390 3215 y Fr(Set)k(the)f(state)i(of)e(the)h(history)f(list)h
+(according)h(to)f Fj(state)p Fr(.)150 3447 y Fi(2.3.2)63
+b(History)41 b(List)g(Managemen)m(t)275 3695 y Fr(These)21
+b(functions)g(manage)h(individual)f(en)m(tries)h(on)g(the)f(history)h
+(list,)i(or)d(set)h(parameters)g(managing)150 3804 y(the)31
+b(list)g(itself.)3350 3996 y([F)-8 b(unction])-3599 b
+Fg(void)39 b Ff(add)p 589 3996 V 50 w(history)45 b Fe(\()p
+Fq(const)30 b(char)f(*string)p Fe(\))390 4106 y Fr(Place)i
+Fj(string)38 b Fr(at)31 b(the)f(end)f(of)h(the)g(history)g(list.)42
+b(The)29 b(asso)s(ciated)i(data)g(\014eld)f(\(if)g(an)m(y\))h(is)f(set)
+g(to)390 4216 y Fq(NULL)p Fr(.)3350 4408 y([F)-8 b(unction])-3599
+b Fg(void)39 b Ff(add)p 589 4408 V 50 w(history)p 989
+4408 V 50 w(time)45 b Fe(\()p Fq(const)29 b(char)h(*string)p
+Fe(\))390 4517 y Fr(Change)g(the)h(time)g(stamp)f(asso)s(ciated)i(with)
+e(the)h(most)f(recen)m(t)i(history)e(en)m(try)h(to)g
+Fj(string)p Fr(.)3350 4709 y([F)-8 b(unction])-3599 b
+Fg(HIST_ENTRY)41 b(*)e Ff(remo)m(v)m(e)p 1169 4709 V
+50 w(history)46 b Fe(\()p Fq(int)30 b(which)p Fe(\))390
+4819 y Fr(Remo)m(v)m(e)47 b(history)f(en)m(try)f(at)i(o\013set)f
+Fj(whic)m(h)f Fr(from)g(the)h(history)-8 b(.)86 b(The)45
+b(remo)m(v)m(ed)i(elemen)m(t)g(is)390 4929 y(returned)29
+b(so)i(y)m(ou)g(can)f(free)h(the)f(line,)h(data,)h(and)d(con)m(taining)
+j(structure.)3350 5121 y([F)-8 b(unction])-3599 b Fg(histdata_t)41
+b Ff(free)p 907 5121 V 50 w(history)p 1307 5121 V 50
+w(en)m(try)k Fe(\()p Fq(HIST_ENTRY)28 b(*histent)p Fe(\))390
+5230 y Fr(F)-8 b(ree)29 b(the)f(history)g(en)m(try)g
+Fj(histen)m(t)j Fr(and)c(an)m(y)i(history)e(library)h(priv)-5
+b(ate)28 b(data)h(asso)s(ciated)g(with)f(it.)390 5340
+y(Returns)h(the)i(application-sp)s(eci\014c)h(data)f(so)g(the)f(caller)
+i(can)e(disp)s(ose)g(of)h(it.)p eop end
+%%Page: 7 11
+TeXDict begin 7 10 bop 150 -116 a Fr(Chapter)30 b(2:)41
+b(Programming)30 b(with)g(GNU)h(History)1780 b(7)3350
+299 y([F)-8 b(unction])-3599 b Fg(HIST_ENTRY)41 b(*)e
+Ff(replace)p 1166 299 35 5 v 48 w(history)p 1564 299
+V 51 w(en)m(try)45 b Fe(\()p Fq(int)29 b(which,)g(const)g(char)565
+408 y(*line,)g(histdata_t)e(data)p Fe(\))390 518 y Fr(Mak)m(e)i(the)f
+(history)f(en)m(try)h(at)h(o\013set)f Fj(whic)m(h)g Fr(ha)m(v)m(e)g
+Fj(line)33 b Fr(and)27 b Fj(data)p Fr(.)41 b(This)27
+b(returns)f(the)i(old)g(en)m(try)390 628 y(so)37 b(the)h(caller)g(can)f
+(disp)s(ose)g(of)g(an)m(y)g(application-sp)s(eci\014c)i(data.)61
+b(In)37 b(the)g(case)h(of)f(an)g(in)m(v)-5 b(alid)390
+737 y Fj(whic)m(h)p Fr(,)30 b(a)h Fq(NULL)e Fr(p)s(oin)m(ter)i(is)f
+(returned.)3350 957 y([F)-8 b(unction])-3599 b Fg(void)39
+b Ff(clear)p 644 957 V 50 w(history)46 b Fe(\()p Fq(void)p
+Fe(\))390 1067 y Fr(Clear)31 b(the)f(history)h(list)g(b)m(y)f(deleting)
+h(all)h(the)e(en)m(tries.)3350 1287 y([F)-8 b(unction])-3599
+b Fg(void)39 b Ff(sti\015e)p 644 1287 V 50 w(history)45
+b Fe(\()p Fq(int)30 b(max)p Fe(\))390 1396 y Fr(Sti\015e)g(the)h
+(history)f(list,)h(remem)m(b)s(ering)f(only)h(the)f(last)i
+Fj(max)k Fr(en)m(tries.)3350 1616 y([F)-8 b(unction])-3599
+b Fg(int)39 b Ff(unsti\015e)p 720 1616 V 49 w(history)45
+b Fe(\()p Fq(void)p Fe(\))390 1726 y Fr(Stop)27 b(sti\015ing)h(the)f
+(history)-8 b(.)40 b(This)27 b(returns)f(the)h(previously-set)h(maxim)m
+(um)f(n)m(um)m(b)s(er)f(of)i(history)390 1836 y(en)m(tries)g(\(as)f
+(set)g(b)m(y)g Fq(stifle_history\(\))p Fr(\).)35 b(The)27
+b(v)-5 b(alue)27 b(is)g(p)s(ositiv)m(e)g(if)g(the)g(history)g(w)m(as)g
+(sti\015ed,)390 1945 y(negativ)m(e)33 b(if)d(it)h(w)m(asn't.)3350
+2165 y([F)-8 b(unction])-3599 b Fg(int)39 b Ff(history)p
+703 2165 V 51 w(is)p 831 2165 V 50 w(sti\015ed)44 b Fe(\()p
+Fq(void)p Fe(\))390 2275 y Fr(Returns)29 b(non-zero)i(if)g(the)f
+(history)h(is)f(sti\015ed,)g(zero)i(if)e(it)h(is)f(not.)150
+2535 y Fi(2.3.3)63 b(Information)42 b(Ab)s(out)f(the)g(History)g(List)
+275 2797 y Fr(These)25 b(functions)g(return)g(information)h(ab)s(out)f
+(the)h(en)m(tire)g(history)g(list)g(or)g(individual)f(list)h(en)m
+(tries.)3350 3017 y([F)-8 b(unction])-3599 b Fg(HIST_ENTRY)41
+b(**)e Ff(history)p 1212 3017 V 51 w(list)44 b Fe(\()p
+Fq(void)p Fe(\))390 3126 y Fr(Return)30 b(a)h Fq(NULL)e
+Fr(terminated)i(arra)m(y)g(of)f Fq(HIST_ENTRY)e(*)i Fr(whic)m(h)g(is)h
+(the)g(curren)m(t)f(input)f(history)-8 b(.)390 3236 y(Elemen)m(t)31
+b(0)g(of)g(this)f(list)h(is)f(the)h(b)s(eginning)f(of)g(time.)42
+b(If)29 b(there)i(is)f(no)h(history)-8 b(,)31 b(return)e
+Fq(NULL)p Fr(.)3350 3456 y([F)-8 b(unction])-3599 b Fg(int)39
+b Ff(where)p 653 3456 V 49 w(history)46 b Fe(\()p Fq(void)p
+Fe(\))390 3565 y Fr(Returns)29 b(the)i(o\013set)g(of)g(the)g(curren)m
+(t)f(history)g(elemen)m(t.)3350 3786 y([F)-8 b(unction])-3599
+b Fg(HIST_ENTRY)41 b(*)e Ff(curren)m(t)p 1178 3786 V
+49 w(history)45 b Fe(\()p Fq(void)p Fe(\))390 3895 y
+Fr(Return)24 b(the)h(history)g(en)m(try)g(at)h(the)f(curren)m(t)f(p)s
+(osition,)j(as)e(determined)f(b)m(y)h Fq(where_history\(\))p
+Fr(.)390 4005 y(If)30 b(there)g(is)h(no)f(en)m(try)h(there,)g(return)e
+(a)i Fq(NULL)e Fr(p)s(oin)m(ter.)3350 4225 y([F)-8 b(unction])-3599
+b Fg(HIST_ENTRY)41 b(*)e Ff(history)p 1160 4225 V 50
+w(get)45 b Fe(\()p Fq(int)30 b(offset)p Fe(\))390 4334
+y Fr(Return)41 b(the)g(history)h(en)m(try)g(at)g(p)s(osition)g
+Fj(o\013set)p Fr(,)j(starting)e(from)e Fq(history_base)d
+Fr(\(see)k(Sec-)390 4444 y(tion)30 b(2.4)g([History)h(V)-8
+b(ariables],)31 b(page)f(10\).)42 b(If)28 b(there)i(is)f(no)h(en)m(try)
+f(there,)h(or)g(if)f Fj(o\013set)j Fr(is)e(greater)390
+4553 y(than)g(the)h(history)f(length,)h(return)e(a)i
+Fq(NULL)e Fr(p)s(oin)m(ter.)3350 4774 y([F)-8 b(unction])-3599
+b Fg(time_t)40 b Ff(history)p 860 4774 V 51 w(get)p 1066
+4774 V 49 w(time)45 b Fe(\()p Fq(HIST_ENTRY)28 b(*entry)p
+Fe(\))390 4883 y Fr(Return)i(the)g(time)h(stamp)f(asso)s(ciated)i(with)
+e(the)h(history)f(en)m(try)h Fj(en)m(try)p Fr(.)3350
+5103 y([F)-8 b(unction])-3599 b Fg(int)39 b Ff(history)p
+703 5103 V 51 w(total)p 989 5103 V 49 w(b)m(ytes)45 b
+Fe(\()p Fq(void)p Fe(\))390 5213 y Fr(Return)27 b(the)h(n)m(um)m(b)s
+(er)e(of)i(b)m(ytes)g(that)g(the)g(primary)e(history)i(en)m(tries)g
+(are)g(using.)39 b(This)27 b(function)390 5322 y(returns)i(the)i(sum)e
+(of)i(the)f(lengths)h(of)f(all)i(the)e(lines)h(in)f(the)g(history)-8
+b(.)p eop end
+%%Page: 8 12
+TeXDict begin 8 11 bop 150 -116 a Fr(8)2696 b(GNU)31
+b(History)g(Library)150 299 y Fi(2.3.4)63 b(Mo)m(ving)41
+b(Around)h(the)f(History)g(List)275 544 y Fr(These)30
+b(functions)g(allo)m(w)h(the)g(curren)m(t)f(index)g(in)m(to)h(the)g
+(history)f(list)h(to)g(b)s(e)f(set)h(or)f(c)m(hanged.)3350
+730 y([F)-8 b(unction])-3599 b Fg(int)39 b Ff(history)p
+703 730 35 5 v 51 w(set)p 897 730 V 49 w(p)s(os)46 b
+Fe(\()p Fq(int)30 b(pos)p Fe(\))390 839 y Fr(Set)37 b(the)g(curren)m(t)
+f(history)g(o\013set)i(to)f Fj(p)s(os)p Fr(,)h(an)f(absolute)g(index)f
+(in)m(to)i(the)e(list.)60 b(Returns)36 b(1)h(on)390 949
+y(success,)31 b(0)g(if)f Fj(p)s(os)j Fr(is)e(less)f(than)h(zero)g(or)f
+(greater)i(than)e(the)g(n)m(um)m(b)s(er)f(of)i(history)f(en)m(tries.)
+3350 1135 y([F)-8 b(unction])-3599 b Fg(HIST_ENTRY)41
+b(*)e Ff(previous)p 1232 1135 V 50 w(history)46 b Fe(\()p
+Fq(void)p Fe(\))390 1244 y Fr(Bac)m(k)30 b(up)e(the)h(curren)m(t)g
+(history)f(o\013set)i(to)g(the)f(previous)f(history)h(en)m(try)-8
+b(,)30 b(and)e(return)g(a)h(p)s(oin)m(ter)390 1354 y(to)i(that)g(en)m
+(try)-8 b(.)41 b(If)30 b(there)h(is)f(no)h(previous)f(en)m(try)-8
+b(,)31 b(return)e(a)i Fq(NULL)e Fr(p)s(oin)m(ter.)3350
+1540 y([F)-8 b(unction])-3599 b Fg(HIST_ENTRY)41 b(*)e
+Ff(next)p 1032 1540 V 49 w(history)46 b Fe(\()p Fq(void)p
+Fe(\))390 1649 y Fr(Mo)m(v)m(e)38 b(the)d(curren)m(t)h(history)f
+(o\013set)i(forw)m(ard)e(to)h(the)g(next)f(history)h(en)m(try)-8
+b(,)37 b(and)e(return)g(the)h(a)390 1759 y(p)s(oin)m(ter)30
+b(to)h(that)g(en)m(try)-8 b(.)42 b(If)30 b(there)g(is)h(no)f(next)h(en)
+m(try)-8 b(,)31 b(return)e(a)i Fq(NULL)e Fr(p)s(oin)m(ter.)150
+1985 y Fi(2.3.5)63 b(Searc)m(hing)40 b(the)h(History)h(List)275
+2230 y Fr(These)26 b(functions)g(allo)m(w)i(searc)m(hing)g(of)f(the)g
+(history)f(list)i(for)e(en)m(tries)i(con)m(taining)g(a)f(sp)s(eci\014c)
+g(string.)150 2339 y(Searc)m(hing)h(ma)m(y)g(b)s(e)f(p)s(erformed)f(b)s
+(oth)h(forw)m(ard)f(and)h(bac)m(kw)m(ard)h(from)f(the)h(curren)m(t)f
+(history)h(p)s(osition.)150 2449 y(The)j(searc)m(h)h(ma)m(y)g(b)s(e)e
+Fj(anc)m(hored)p Fr(,)i(meaning)g(that)g(the)f(string)h(m)m(ust)f(matc)
+m(h)h(at)g(the)g(b)s(eginning)e(of)i(the)150 2558 y(history)e(en)m(try)
+-8 b(.)3350 2744 y([F)g(unction])-3599 b Fg(int)39 b
+Ff(history)p 703 2744 V 51 w(searc)m(h)44 b Fe(\()p Fq(const)29
+b(char)h(*string,)e(int)h(direction)p Fe(\))390 2854
+y Fr(Searc)m(h)g(the)g(history)g(for)g Fj(string)p Fr(,)g(starting)h
+(at)f(the)g(curren)m(t)g(history)g(o\013set.)41 b(If)28
+b Fj(direction)i Fr(is)f(less)390 2963 y(than)40 b(0,)j(then)c(the)h
+(searc)m(h)h(is)f(through)f(previous)h(en)m(tries,)j(otherwise)d
+(through)g(subsequen)m(t)390 3073 y(en)m(tries.)i(If)30
+b Fj(string)38 b Fr(is)30 b(found,)g(then)g(the)g(curren)m(t)h(history)
+f(index)g(is)g(set)h(to)h(that)f(history)f(en)m(try)-8
+b(,)390 3183 y(and)33 b(the)g(v)-5 b(alue)34 b(returned)e(is)i(the)g
+(o\013set)g(in)f(the)h(line)f(of)h(the)g(en)m(try)f(where)g
+Fj(string)41 b Fr(w)m(as)34 b(found.)390 3292 y(Otherwise,)c(nothing)h
+(is)f(c)m(hanged,)h(and)f(a)h(-1)g(is)f(returned.)3350
+3478 y([F)-8 b(unction])-3599 b Fg(int)39 b Ff(history)p
+703 3478 V 51 w(searc)m(h)p 1067 3478 V 49 w(pre\014x)45
+b Fe(\()p Fq(const)29 b(char)g(*string,)g(int)g(direction)p
+Fe(\))390 3588 y Fr(Searc)m(h)41 b(the)g(history)f(for)g
+Fj(string)p Fr(,)k(starting)d(at)g(the)g(curren)m(t)f(history)h
+(o\013set.)72 b(The)40 b(searc)m(h)h(is)390 3697 y(anc)m(hored:)f(matc)
+m(hing)31 b(lines)f(m)m(ust)f(b)s(egin)g(with)g Fj(string)p
+Fr(.)40 b(If)29 b Fj(direction)h Fr(is)g(less)f(than)g(0,)i(then)e(the)
+390 3807 y(searc)m(h)j(is)f(through)g(previous)g(en)m(tries,)h
+(otherwise)g(through)e(subsequen)m(t)h(en)m(tries.)44
+b(If)31 b Fj(string)39 b Fr(is)390 3916 y(found,)33 b(then)f(the)h
+(curren)m(t)g(history)g(index)g(is)g(set)g(to)h(that)g(en)m(try)-8
+b(,)34 b(and)f(the)g(return)f(v)-5 b(alue)33 b(is)g(0.)390
+4026 y(Otherwise,)d(nothing)h(is)f(c)m(hanged,)h(and)f(a)h(-1)g(is)f
+(returned.)3350 4212 y([F)-8 b(unction])-3599 b Fg(int)39
+b Ff(history)p 703 4212 V 51 w(searc)m(h)p 1067 4212
+V 49 w(p)s(os)46 b Fe(\()p Fq(const)29 b(char)g(*string,)f(int)i
+(direction,)d(int)565 4321 y(pos)p Fe(\))390 4431 y Fr(Searc)m(h)34
+b(for)g Fj(string)42 b Fr(in)34 b(the)h(history)f(list,)i(starting)f
+(at)g Fj(p)s(os)p Fr(,)g(an)f(absolute)h(index)e(in)m(to)j(the)e(list.)
+390 4541 y(If)i Fj(direction)g Fr(is)g(negativ)m(e,)k(the)c(searc)m(h)h
+(pro)s(ceeds)f(bac)m(kw)m(ard)g(from)g Fj(p)s(os)p Fr(,)h(otherwise)f
+(forw)m(ard.)390 4650 y(Returns)43 b(the)h(absolute)h(index)f(of)g(the)
+g(history)g(elemen)m(t)h(where)f Fj(string)52 b Fr(w)m(as)44
+b(found,)i(or)e(-1)390 4760 y(otherwise.)150 4986 y Fi(2.3.6)63
+b(Managing)41 b(the)g(History)h(File)275 5230 y Fr(The)31
+b(History)h(library)f(can)h(read)f(the)h(history)g(from)f(and)g(write)h
+(it)g(to)g(a)g(\014le.)45 b(This)31 b(section)h(do)s(cu-)150
+5340 y(men)m(ts)f(the)f(functions)g(for)g(managing)h(a)g(history)f
+(\014le.)p eop end
+%%Page: 9 13
+TeXDict begin 9 12 bop 150 -116 a Fr(Chapter)30 b(2:)41
+b(Programming)30 b(with)g(GNU)h(History)1780 b(9)3350
+299 y([F)-8 b(unction])-3599 b Fg(int)39 b Ff(read)p
+573 299 35 5 v 50 w(history)45 b Fe(\()p Fq(const)29
+b(char)h(*filename)p Fe(\))390 408 y Fr(Add)f(the)h(con)m(ten)m(ts)h
+(of)f Fj(\014lename)k Fr(to)d(the)f(history)f(list,)i(a)f(line)g(at)g
+(a)g(time.)41 b(If)29 b Fj(\014lename)35 b Fr(is)30 b
+Fq(NULL)p Fr(,)390 518 y(then)g(read)g(from)g(`)p Fq(~/.history)p
+Fr('.)39 b(Returns)29 b(0)i(if)f(successful,)h(or)f Fq(errno)f
+Fr(if)h(not.)3350 717 y([F)-8 b(unction])-3599 b Fg(int)39
+b Ff(read)p 573 717 V 50 w(history)p 973 717 V 50 w(range)45
+b Fe(\()p Fq(const)29 b(char)g(*filename,)f(int)h(from,)g(int)h(to)p
+Fe(\))390 826 y Fr(Read)e(a)g(range)h(of)f(lines)g(from)f
+Fj(\014lename)p Fr(,)i(adding)e(them)h(to)h(the)f(history)g(list.)40
+b(Start)28 b(reading)g(at)390 936 y(line)f Fj(from)e
+Fr(and)h(end)f(at)i Fj(to)p Fr(.)41 b(If)25 b Fj(from)h
+Fr(is)g(zero,)i(start)f(at)g(the)f(b)s(eginning.)39 b(If)26
+b Fj(to)31 b Fr(is)c(less)f(than)g Fj(from)p Fr(,)390
+1045 y(then)k(read)g(un)m(til)g(the)g(end)g(of)g(the)g(\014le.)41
+b(If)30 b Fj(\014lename)35 b Fr(is)30 b Fq(NULL)p Fr(,)g(then)f(read)h
+(from)g(`)p Fq(~/.history)p Fr('.)390 1155 y(Returns)f(0)i(if)g
+(successful,)f(or)g Fq(errno)f Fr(if)i(not.)3350 1353
+y([F)-8 b(unction])-3599 b Fg(int)39 b Ff(write)p 613
+1353 V 49 w(history)46 b Fe(\()p Fq(const)29 b(char)g(*filename)p
+Fe(\))390 1463 y Fr(W)-8 b(rite)36 b(the)f(curren)m(t)g(history)g(to)g
+Fj(\014lename)p Fr(,)h(o)m(v)m(erwriting)h Fj(\014lename)j
+Fr(if)35 b(necessary)-8 b(.)54 b(If)35 b Fj(\014lename)390
+1573 y Fr(is)d Fq(NULL)p Fr(,)g(then)g(write)g(the)h(history)f(list)h
+(to)g(`)p Fq(~/.history)p Fr('.)44 b(Returns)31 b(0)i(on)f(success,)h
+(or)f Fq(errno)390 1682 y Fr(on)e(a)h(read)f(or)h(write)f(error.)3350
+1881 y([F)-8 b(unction])-3599 b Fg(int)39 b Ff(app)s(end)p
+721 1881 V 48 w(history)46 b Fe(\()p Fq(int)30 b(nelements,)e(const)g
+(char)i(*filename)p Fe(\))390 1990 y Fr(App)s(end)j(the)i(last)g
+Fj(nelemen)m(ts)k Fr(of)c(the)g(history)f(list)i(to)f
+Fj(\014lename)p Fr(.)54 b(If)34 b Fj(\014lename)40 b
+Fr(is)34 b Fq(NULL)p Fr(,)h(then)390 2100 y(app)s(end)29
+b(to)i(`)p Fq(~/.history)p Fr('.)38 b(Returns)30 b(0)g(on)h(success,)g
+(or)f Fq(errno)f Fr(on)h(a)h(read)f(or)h(write)f(error.)3350
+2299 y([F)-8 b(unction])-3599 b Fg(int)39 b Ff(history)p
+703 2299 V 51 w(truncate)p 1179 2299 V 48 w(\014le)44
+b Fe(\()p Fq(const)30 b(char)f(*filename,)e(int)j(nlines)p
+Fe(\))390 2408 y Fr(T)-8 b(runcate)39 b(the)f(history)h(\014le)f
+Fj(\014lename)p Fr(,)j(lea)m(ving)f(only)f(the)g(last)g
+Fj(nlines)j Fr(lines.)65 b(If)38 b Fj(\014lename)44 b
+Fr(is)390 2518 y Fq(NULL)p Fr(,)29 b(then)i(`)p Fq(~/.history)p
+Fr(')d(is)i(truncated.)41 b(Returns)29 b(0)i(on)f(success,)h(or)f
+Fq(errno)f Fr(on)i(failure.)150 2756 y Fi(2.3.7)63 b(History)41
+b(Expansion)275 3007 y Fr(These)30 b(functions)g(implemen)m(t)h
+(history)f(expansion.)3350 3206 y([F)-8 b(unction])-3599
+b Fg(int)39 b Ff(history)p 703 3206 V 51 w(expand)44
+b Fe(\()p Fq(char)29 b(*string,)f(char)i(**output)p Fe(\))390
+3315 y Fr(Expand)j Fj(string)p Fr(,)j(placing)f(the)f(result)h(in)m(to)
+g Fj(output)p Fr(,)g(a)g(p)s(oin)m(ter)f(to)h(a)g(string)f(\(see)i
+(Section)f(1.1)390 3425 y([History)c(In)m(teraction],)i(page)e(1\).)41
+b(Returns:)390 3595 y Fq(0)432 b Fr(If)37 b(no)g(expansions)g(to)s(ok)i
+(place)f(\(or,)i(if)d(the)h(only)f(c)m(hange)i(in)e(the)g(text)i(w)m
+(as)f(the)870 3705 y(remo)m(v)-5 b(al)31 b(of)g(escap)s(e)f(c)m
+(haracters)i(preceding)e(the)g(history)g(expansion)g(c)m(haracter\);)
+390 3871 y Fq(1)432 b Fr(if)30 b(expansions)g(did)g(tak)m(e)i(place;)
+390 4038 y Fq(-1)384 b Fr(if)30 b(there)h(w)m(as)g(an)f(error)g(in)g
+(expansion;)390 4204 y Fq(2)432 b Fr(if)28 b(the)f(returned)g(line)g
+(should)g(b)s(e)g(displa)m(y)m(ed,)i(but)e(not)h(executed,)h(as)f(with)
+f(the)h Fq(:p)870 4314 y Fr(mo)s(di\014er)h(\(see)j(Section)f(1.1.3)h
+([Mo)s(di\014ers],)e(page)i(2\).)390 4484 y(If)e(an)g(error)g(o)s
+(curred)f(in)i(expansion,)f(then)g Fj(output)i Fr(con)m(tains)g(a)e
+(descriptiv)m(e)i(error)e(message.)3350 4682 y([F)-8
+b(unction])-3599 b Fg(char)39 b(*)g Ff(get)p 651 4682
+V 50 w(history)p 1051 4682 V 50 w(ev)m(en)m(t)44 b Fe(\()p
+Fq(const)29 b(char)h(*string,)e(int)h(*cindex,)f(int)565
+4792 y(qchar)p Fe(\))390 4902 y Fr(Returns)45 b(the)g(text)i(of)e(the)h
+(history)f(ev)m(en)m(t)i(b)s(eginning)e(at)h Fj(string)53
+b Fq(+)45 b Fj(*cindex)p Fr(.)87 b Fj(*cindex)52 b Fr(is)390
+5011 y(mo)s(di\014ed)28 b(to)i(p)s(oin)m(t)f(to)h(after)g(the)g(ev)m
+(en)m(t)h(sp)s(eci\014er.)39 b(A)m(t)31 b(function)e(en)m(try)-8
+b(,)30 b Fj(cindex)36 b Fr(p)s(oin)m(ts)29 b(to)h(the)390
+5121 y(index)35 b(in)m(to)i Fj(string)44 b Fr(where)35
+b(the)h(history)g(ev)m(en)m(t)h(sp)s(eci\014cation)g(b)s(egins.)57
+b Fj(qc)m(har)42 b Fr(is)36 b(a)g(c)m(haracter)390 5230
+y(that)27 b(is)g(allo)m(w)m(ed)i(to)f(end)e(the)h(ev)m(en)m(t)h(sp)s
+(eci\014cation)g(in)f(addition)g(to)g(the)g(\\normal")h(terminating)390
+5340 y(c)m(haracters.)p eop end
+%%Page: 10 14
+TeXDict begin 10 13 bop 150 -116 a Fr(10)2651 b(GNU)31
+b(History)g(Library)3350 299 y([F)-8 b(unction])-3599
+b Fg(char)39 b(**)g Ff(history)p 898 299 35 5 v 51 w(tok)m(enize)44
+b Fe(\()p Fq(const)29 b(char)g(*string)p Fe(\))390 408
+y Fr(Return)h(an)h(arra)m(y)g(of)g(tok)m(ens)h(parsed)e(out)h(of)g
+Fj(string)p Fr(,)h(m)m(uc)m(h)e(as)i(the)f(shell)g(migh)m(t.)43
+b(The)30 b(tok)m(ens)390 518 y(are)h(split)g(on)f(the)h(c)m(haracters)h
+(in)e(the)h Fj(history)p 2006 518 28 4 v 40 w(w)m(ord)p
+2241 518 V 39 w(delimiters)k Fr(v)-5 b(ariable,)32 b(and)e(shell)g
+(quoting)390 628 y(con)m(v)m(en)m(tions)i(are)f(ob)s(ey)m(ed.)3350
+818 y([F)-8 b(unction])-3599 b Fg(char)39 b(*)g Ff(history)p
+846 818 35 5 v 50 w(arg)p 1056 818 V 51 w(extract)44
+b Fe(\()p Fq(int)30 b(first,)f(int)g(last,)g(const)g(char)565
+927 y(*string)p Fe(\))390 1037 y Fr(Extract)41 b(a)g(string)f(segmen)m
+(t)i(consisting)f(of)f(the)h Fj(\014rst)g Fr(through)f
+Fj(last)j Fr(argumen)m(ts)e(presen)m(t)f(in)390 1146
+y Fj(string)p Fr(.)h(Argumen)m(ts)30 b(are)h(split)f(using)g
+Fq(history_tokenize)p Fr(.)150 1411 y Fp(2.4)68 b(History)46
+b(V)-11 b(ariables)275 1658 y Fr(This)33 b(section)i(describ)s(es)e
+(the)h(externally-visible)i(v)-5 b(ariables)35 b(exp)s(orted)e(b)m(y)h
+(the)g Fk(gnu)g Fr(History)h(Li-)150 1767 y(brary)-8
+b(.)3371 1957 y([V)g(ariable])-3598 b Fg(int)39 b Ff(history)p
+703 1957 V 51 w(base)390 2067 y Fr(The)30 b(logical)j(o\013set)e(of)g
+(the)f(\014rst)g(en)m(try)g(in)h(the)f(history)g(list.)3371
+2257 y([V)-8 b(ariable])-3598 b Fg(int)39 b Ff(history)p
+703 2257 V 51 w(length)390 2366 y Fr(The)30 b(n)m(um)m(b)s(er)f(of)h
+(en)m(tries)i(curren)m(tly)e(stored)h(in)f(the)g(history)g(list.)3371
+2556 y([V)-8 b(ariable])-3598 b Fg(int)39 b Ff(history)p
+703 2556 V 51 w(max)p 965 2556 V 51 w(en)m(tries)390
+2666 y Fr(The)45 b(maxim)m(um)h(n)m(um)m(b)s(er)f(of)h(history)g(en)m
+(tries.)88 b(This)45 b(m)m(ust)h(b)s(e)f(c)m(hanged)i(using)e
+Fq(stifle_)390 2776 y(history\(\))p Fr(.)3371 2966 y([V)-8
+b(ariable])-3598 b Fg(int)39 b Ff(history)p 703 2966
+V 51 w(write)p 1014 2966 V 49 w(timestamps)390 3075 y
+Fr(If)44 b(non-zero,)49 b(timestamps)c(are)g(written)g(to)g(the)g
+(history)f(\014le,)49 b(so)c(they)f(can)h(b)s(e)f(preserv)m(ed)390
+3185 y(b)s(et)m(w)m(een)31 b(sessions.)41 b(The)30 b(default)g(v)-5
+b(alue)31 b(is)f(0,)h(meaning)g(that)g(timestamps)g(are)g(not)f(sa)m(v)
+m(ed.)3371 3375 y([V)-8 b(ariable])-3598 b Fg(char)39
+b Ff(history)p 755 3375 V 51 w(expansion)p 1301 3375
+V 49 w(c)m(har)390 3484 y Fr(The)c(c)m(haracter)i(that)e(in)m(tro)s
+(duces)g(a)h(history)f(ev)m(en)m(t.)57 b(The)34 b(default)i(is)f(`)p
+Fq(!)p Fr('.)56 b(Setting)35 b(this)h(to)g(0)390 3594
+y(inhibits)30 b(history)g(expansion.)3371 3784 y([V)-8
+b(ariable])-3598 b Fg(char)39 b Ff(history)p 755 3784
+V 51 w(subst)p 1069 3784 V 50 w(c)m(har)390 3893 y Fr(The)h(c)m
+(haracter)i(that)g(in)m(v)m(ok)m(es)g(w)m(ord)f(substitution)f(if)h
+(found)e(at)i(the)g(start)g(of)g(a)g(line.)72 b(The)390
+4003 y(default)31 b(is)f(`)p Fq(^)p Fr('.)3371 4193 y([V)-8
+b(ariable])-3598 b Fg(char)39 b Ff(history)p 755 4193
+V 51 w(commen)m(t)p 1263 4193 V 50 w(c)m(har)390 4303
+y Fr(During)e(tok)m(enization,)43 b(if)38 b(this)f(c)m(haracter)j(is)e
+(seen)f(as)h(the)g(\014rst)f(c)m(haracter)j(of)e(a)g(w)m(ord,)h(then)
+390 4412 y(it)44 b(and)e(all)j(subsequen)m(t)d(c)m(haracters)j(up)d(to)
+i(a)g(newline)f(are)h(ignored,)i(suppressing)c(history)390
+4522 y(expansion)30 b(for)g(the)h(remainder)f(of)g(the)h(line.)41
+b(This)29 b(is)i(disabled)f(b)m(y)g(default.)3371 4712
+y([V)-8 b(ariable])-3598 b Fg(char)39 b(*)g Ff(history)p
+846 4712 V 50 w(w)m(ord)p 1144 4712 V 51 w(delimiters)390
+4821 y Fr(The)27 b(c)m(haracters)i(that)f(separate)h(tok)m(ens)f(for)f
+Fq(history_tokenize\(\))p Fr(.)35 b(The)27 b(default)h(v)-5
+b(alue)28 b(is)f Fq(")390 4931 y(\\t\\n\(\)<>;&|")p Fr(.)3371
+5121 y([V)-8 b(ariable])-3598 b Fg(char)39 b(*)g Ff(history)p
+846 5121 V 50 w(searc)m(h)p 1209 5121 V 50 w(delimiter)p
+1712 5121 V 49 w(c)m(hars)390 5230 y Fr(The)26 b(list)g(of)g
+(additional)h(c)m(haracters)h(whic)m(h)e(can)g(delimit)h(a)f(history)g
+(searc)m(h)h(string,)g(in)f(addition)390 5340 y(to)31
+b(space,)g(T)-8 b(AB,)32 b(`)p Fq(:)p Fr(')e(and)g(`)p
+Fq(?)p Fr(')g(in)g(the)h(case)g(of)g(a)g(substring)e(searc)m(h.)41
+b(The)30 b(default)h(is)f(empt)m(y)-8 b(.)p eop end
+%%Page: 11 15
+TeXDict begin 11 14 bop 150 -116 a Fr(Chapter)30 b(2:)41
+b(Programming)30 b(with)g(GNU)h(History)1734 b(11)3371
+299 y([V)-8 b(ariable])-3598 b Fg(char)39 b(*)g Ff(history)p
+846 299 35 5 v 50 w(no)p 1017 299 V 51 w(expand)p 1429
+299 V 49 w(c)m(hars)390 408 y Fr(The)29 b(list)i(of)f(c)m(haracters)h
+(whic)m(h)e(inhibit)h(history)g(expansion)f(if)h(found)e(immediately)j
+(follo)m(wing)390 518 y Fj(history)p 672 518 28 4 v 40
+w(expansion)p 1104 518 V 40 w(c)m(har)p Fr(.)41 b(The)30
+b(default)g(is)h(space,)g(tab,)g(newline,)f(carriage)i(return,)e(and)g
+(`)p Fq(=)p Fr('.)3371 707 y([V)-8 b(ariable])-3598 b
+Fg(int)39 b Ff(history)p 703 707 35 5 v 51 w(quotes)p
+1078 707 V 50 w(inhibit)p 1461 707 V 48 w(expansion)390
+817 y Fr(If)29 b(non-zero,)h(single-quoted)g(w)m(ords)f(are)g(not)h
+(scanned)f(for)g(the)g(history)g(expansion)g(c)m(haracter.)390
+927 y(The)h(default)g(v)-5 b(alue)31 b(is)g(0.)3371 1116
+y([V)-8 b(ariable])-3598 b Fg(rl_linebuf_func_t)43 b(*)c
+Ff(history)p 1526 1116 V 50 w(inhibit)p 1909 1116 V 49
+w(expansion)p 2453 1116 V 49 w(function)390 1226 y Fr(This)32
+b(should)h(b)s(e)f(set)i(to)g(the)g(address)e(of)i(a)f(function)g(that)
+h(tak)m(es)h(t)m(w)m(o)g(argumen)m(ts:)46 b(a)34 b Fq(char)29
+b(*)390 1335 y Fr(\()p Fj(string)8 b Fr(\))27 b(and)f(an)g
+Fq(int)g Fr(index)g(in)m(to)i(that)f(string)f(\()p Fj(i)5
+b Fr(\).)40 b(It)27 b(should)f(return)f(a)i(non-zero)g(v)-5
+b(alue)27 b(if)g(the)390 1445 y(history)i(expansion)g(starting)h(at)g
+Fj(string[i])j Fr(should)28 b(not)i(b)s(e)e(p)s(erformed;)h(zero)h(if)f
+(the)g(expansion)390 1554 y(should)i(b)s(e)g(done.)45
+b(It)32 b(is)g(in)m(tended)g(for)g(use)g(b)m(y)f(applications)i(lik)m
+(e)h(Bash)e(that)g(use)g(the)g(history)390 1664 y(expansion)e(c)m
+(haracter)i(for)e(additional)i(purp)s(oses.)39 b(By)30
+b(default,)h(this)f(v)-5 b(ariable)31 b(is)g(set)g(to)g
+Fq(NULL)p Fr(.)150 1928 y Fp(2.5)68 b(History)46 b(Programming)g
+(Example)275 2174 y Fr(The)29 b(follo)m(wing)j(program)e(demonstrates)h
+(simple)g(use)f(of)g(the)h Fk(gnu)f Fr(History)h(Library)-8
+b(.)390 2289 y Fd(#include)41 b(<stdio.h>)390 2376 y(#include)g
+(<readline/history.h>)390 2550 y(main)f(\(argc,)h(argv\))586
+2638 y(int)f(argc;)586 2725 y(char)g(**argv;)390 2812
+y({)468 2899 y(char)h(line[1024],)g(*t;)468 2986 y(int)f(len,)g(done)h
+(=)e(0;)468 3161 y(line[0])i(=)f(0;)468 3335 y(using_history)j(\(\);)
+468 3422 y(while)e(\(!done\))547 3509 y({)625 3597 y(printf)g
+(\("history$)g("\);)625 3684 y(fflush)g(\(stdout\);)625
+3771 y(t)f(=)f(fgets)i(\(line,)f(sizeof)h(\(line\))f(-)g(1,)g(stdin\);)
+625 3858 y(if)g(\(t)g(&&)f(*t\))704 3945 y({)782 4032
+y(len)h(=)g(strlen)g(\(t\);)782 4120 y(if)g(\(t[len)h(-)e(1])h(==)f
+('\\n'\))861 4207 y(t[len)h(-)g(1])f(=)h('\\0';)704 4294
+y(})625 4468 y(if)g(\(!t\))704 4555 y(strcpy)g(\(line,)h("quit"\);)625
+4730 y(if)f(\(line[0]\))704 4817 y({)782 4904 y(char)g(*expansion;)782
+4991 y(int)g(result;)782 5166 y(result)h(=)e(history_expand)k(\(line,)d
+(&expansion\);)782 5253 y(if)g(\(result\))861 5340 y(fprintf)h
+(\(stderr,)g("\045s\\n",)f(expansion\);)p eop end
+%%Page: 12 16
+TeXDict begin 12 15 bop 150 -116 a Fr(12)2651 b(GNU)31
+b(History)g(Library)782 386 y Fd(if)40 b(\(result)h(<)e(0)h(||)f
+(result)i(==)f(2\))861 473 y({)939 560 y(free)g(\(expansion\);)939
+648 y(continue;)861 735 y(})782 909 y(add_history)i(\(expansion\);)782
+996 y(strncpy)f(\(line,)g(expansion,)g(sizeof)g(\(line\))f(-)g(1\);)782
+1083 y(free)g(\(expansion\);)704 1171 y(})625 1345 y(if)g(\(strcmp)h
+(\(line,)f("quit"\))h(==)f(0\))704 1432 y(done)g(=)f(1;)625
+1519 y(else)h(if)g(\(strcmp)h(\(line,)g("save"\))f(==)g(0\))704
+1606 y(write_history)i(\("history_file"\);)625 1694 y(else)e(if)g
+(\(strcmp)h(\(line,)g("read"\))f(==)g(0\))704 1781 y(read_history)i
+(\("history_file"\);)625 1868 y(else)e(if)g(\(strcmp)h(\(line,)g
+("list"\))f(==)g(0\))704 1955 y({)782 2042 y(register)h(HIST_ENTRY)h
+(**the_list;)782 2130 y(register)f(int)f(i;)782 2304
+y(the_list)h(=)f(history_list)i(\(\);)782 2391 y(if)e(\(the_list\))861
+2478 y(for)g(\(i)f(=)h(0;)f(the_list[i];)j(i++\))939
+2565 y(printf)f(\("\045d:)f(\045s\\n",)h(i)e(+)h(history_base,)i
+(the_list[i]->line\);)704 2653 y(})625 2740 y(else)e(if)g(\(strncmp)h
+(\(line,)g("delete",)g(6\))f(==)f(0\))704 2827 y({)782
+2914 y(int)h(which;)782 3001 y(if)g(\(\(sscanf)h(\(line)f(+)g(6,)g
+("\045d",)g(&which\)\))h(==)f(1\))861 3088 y({)939 3176
+y(HIST_ENTRY)i(*entry)e(=)g(remove_history)i(\(which\);)939
+3263 y(if)e(\(!entry\))1018 3350 y(fprintf)g(\(stderr,)i("No)d(such)i
+(entry)f(\045d\\n",)h(which\);)939 3437 y(else)1018 3524
+y({)1096 3611 y(free)f(\(entry->line\);)1096 3699 y(free)g(\(entry\);)
+1018 3786 y(})861 3873 y(})782 3960 y(else)861 4047 y({)939
+4134 y(fprintf)h(\(stderr,)g("non-numeric)h(arg)e(given)g(to)g
+(`delete'\\n"\);)861 4222 y(})704 4309 y(})547 4396 y(})390
+4483 y(})p eop end
+%%Page: 13 17
+TeXDict begin 13 16 bop 150 -116 a Fr(App)s(endix)29
+b(A:)h(Cop)m(ying)h(This)f(Man)m(ual)2105 b(13)150 299
+y Fn(App)t(endix)52 b(A)40 b(Cop)l(ying)51 b(This)j(Man)l(ual)150
+690 y Fp(A.1)67 b(GNU)45 b(F)-11 b(ree)45 b(Do)t(cumen)l(tation)h
+(License)1396 909 y Fr(V)-8 b(ersion)31 b(1.2,)h(No)m(v)m(em)m(b)s(er)g
+(2002)390 1052 y(Cop)m(yrigh)m(t)842 1049 y(c)817 1052
+y Fo(\015)e Fr(2000,2001,2002)36 b(F)-8 b(ree)32 b(Soft)m(w)m(are)f(F)
+-8 b(oundation,)32 b(Inc.)390 1161 y(59)f(T)-8 b(emple)31
+b(Place,)h(Suite)e(330,)i(Boston,)g(MA)61 b(02111-1307,)35
+b(USA)390 1380 y(Ev)m(ery)m(one)c(is)g(p)s(ermitted)f(to)h(cop)m(y)g
+(and)f(distribute)g(v)m(erbatim)h(copies)390 1490 y(of)g(this)f
+(license)h(do)s(cumen)m(t,)g(but)e(c)m(hanging)j(it)f(is)f(not)h(allo)m
+(w)m(ed.)199 1632 y(0.)61 b(PREAMBLE)330 1770 y(The)37
+b(purp)s(ose)e(of)i(this)g(License)h(is)f(to)h(mak)m(e)g(a)g(man)m
+(ual,)h(textb)s(o)s(ok,)h(or)d(other)g(functional)h(and)330
+1880 y(useful)29 b(do)s(cumen)m(t)h Fj(free)36 b Fr(in)29
+b(the)i(sense)f(of)g(freedom:)41 b(to)31 b(assure)e(ev)m(ery)m(one)j
+(the)e(e\013ectiv)m(e)j(freedom)330 1990 y(to)f(cop)m(y)g(and)f
+(redistribute)g(it,)h(with)g(or)f(without)g(mo)s(difying)g(it,)i
+(either)f(commercially)h(or)e(non-)330 2099 y(commercially)-8
+b(.)56 b(Secondarily)-8 b(,)36 b(this)f(License)g(preserv)m(es)g(for)f
+(the)h(author)f(and)g(publisher)f(a)i(w)m(a)m(y)330 2209
+y(to)i(get)g(credit)g(for)f(their)g(w)m(ork,)i(while)e(not)g(b)s(eing)g
+(considered)g(resp)s(onsible)f(for)h(mo)s(di\014cations)330
+2318 y(made)30 b(b)m(y)h(others.)330 2457 y(This)22 b(License)i(is)f(a)
+h(kind)e(of)i(\\cop)m(yleft",)j(whic)m(h)c(means)g(that)h(deriv)-5
+b(ativ)m(e)24 b(w)m(orks)f(of)h(the)f(do)s(cumen)m(t)330
+2566 y(m)m(ust)34 b(themselv)m(es)h(b)s(e)e(free)h(in)g(the)g(same)g
+(sense.)51 b(It)34 b(complemen)m(ts)h(the)f(GNU)g(General)h(Public)330
+2676 y(License,)c(whic)m(h)f(is)h(a)f(cop)m(yleft)i(license)g(designed)
+e(for)g(free)h(soft)m(w)m(are.)330 2814 y(W)-8 b(e)31
+b(ha)m(v)m(e)f(designed)g(this)f(License)h(in)f(order)g(to)i(use)e(it)h
+(for)f(man)m(uals)h(for)f(free)h(soft)m(w)m(are,)h(b)s(ecause)330
+2924 y(free)42 b(soft)m(w)m(are)i(needs)e(free)g(do)s(cumen)m(tation:)
+65 b(a)42 b(free)h(program)f(should)f(come)i(with)f(man)m(uals)330
+3033 y(pro)m(viding)29 b(the)g(same)g(freedoms)f(that)i(the)f(soft)m(w)
+m(are)h(do)s(es.)40 b(But)29 b(this)f(License)i(is)f(not)g(limited)g
+(to)330 3143 y(soft)m(w)m(are)j(man)m(uals;)f(it)g(can)g(b)s(e)f(used)g
+(for)g(an)m(y)h(textual)h(w)m(ork,)f(regardless)g(of)g(sub)5
+b(ject)30 b(matter)i(or)330 3252 y(whether)f(it)h(is)f(published)f(as)i
+(a)f(prin)m(ted)g(b)s(o)s(ok.)44 b(W)-8 b(e)32 b(recommend)f(this)h
+(License)g(principally)f(for)330 3362 y(w)m(orks)f(whose)h(purp)s(ose)d
+(is)j(instruction)f(or)g(reference.)199 3500 y(1.)61
+b(APPLICABILITY)29 b(AND)j(DEFINITIONS)330 3639 y(This)39
+b(License)i(applies)f(to)g(an)m(y)h(man)m(ual)f(or)g(other)g(w)m(ork,)i
+(in)e(an)m(y)g(medium,)i(that)e(con)m(tains)i(a)330 3748
+y(notice)h(placed)f(b)m(y)f(the)h(cop)m(yrigh)m(t)h(holder)e(sa)m(ying)
+h(it)g(can)g(b)s(e)f(distributed)f(under)g(the)i(terms)330
+3858 y(of)c(this)f(License.)62 b(Suc)m(h)37 b(a)h(notice)h(gran)m(ts)f
+(a)g(w)m(orld-wide,)h(ro)m(y)m(alt)m(y-free)i(license,)f(unlimited)d
+(in)330 3967 y(duration,)49 b(to)d(use)f(that)g(w)m(ork)h(under)d(the)j
+(conditions)f(stated)h(herein.)85 b(The)45 b(\\Do)s(cumen)m(t",)330
+4077 y(b)s(elo)m(w,)29 b(refers)f(to)h(an)m(y)g(suc)m(h)f(man)m(ual)h
+(or)f(w)m(ork.)40 b(An)m(y)29 b(mem)m(b)s(er)e(of)i(the)f(public)g(is)g
+(a)h(licensee,)i(and)330 4187 y(is)25 b(addressed)f(as)h(\\y)m(ou".)40
+b(Y)-8 b(ou)26 b(accept)g(the)f(license)h(if)f(y)m(ou)h(cop)m(y)-8
+b(,)27 b(mo)s(dify)d(or)h(distribute)g(the)g(w)m(ork)330
+4296 y(in)30 b(a)h(w)m(a)m(y)g(requiring)f(p)s(ermission)f(under)g(cop)
+m(yrigh)m(t)j(la)m(w.)330 4435 y(A)i(\\Mo)s(di\014ed)f(V)-8
+b(ersion")35 b(of)f(the)g(Do)s(cumen)m(t)g(means)g(an)m(y)g(w)m(ork)f
+(con)m(taining)j(the)e(Do)s(cumen)m(t)g(or)330 4544 y(a)k(p)s(ortion)f
+(of)h(it,)i(either)e(copied)g(v)m(erbatim,)i(or)d(with)h(mo)s
+(di\014cations)f(and/or)h(translated)g(in)m(to)330 4654
+y(another)31 b(language.)330 4792 y(A)26 b(\\Secondary)g(Section")h(is)
+f(a)h(named)e(app)s(endix)f(or)i(a)h(fron)m(t-matter)g(section)g(of)f
+(the)g(Do)s(cumen)m(t)330 4902 y(that)c(deals)g(exclusiv)m(ely)h(with)e
+(the)g(relationship)h(of)f(the)h(publishers)d(or)i(authors)g(of)h(the)f
+(Do)s(cumen)m(t)330 5011 y(to)38 b(the)f(Do)s(cumen)m(t's)i(o)m(v)m
+(erall)g(sub)5 b(ject)37 b(\(or)h(to)g(related)g(matters\))g(and)f(con)
+m(tains)h(nothing)f(that)330 5121 y(could)j(fall)h(directly)g(within)f
+(that)h(o)m(v)m(erall)i(sub)5 b(ject.)70 b(\(Th)m(us,)42
+b(if)e(the)h(Do)s(cumen)m(t)g(is)f(in)g(part)h(a)330
+5230 y(textb)s(o)s(ok)24 b(of)g(mathematics,)j(a)d(Secondary)f(Section)
+h(ma)m(y)g(not)g(explain)g(an)m(y)g(mathematics.\))40
+b(The)330 5340 y(relationship)28 b(could)f(b)s(e)g(a)g(matter)i(of)e
+(historical)i(connection)f(with)f(the)h(sub)5 b(ject)27
+b(or)g(with)g(related)p eop end
+%%Page: 14 18
+TeXDict begin 14 17 bop 150 -116 a Fr(14)2651 b(GNU)31
+b(History)g(Library)330 299 y(matters,)38 b(or)d(of)h(legal,)i
+(commercial,)h(philosophical,)f(ethical)f(or)e(p)s(olitical)i(p)s
+(osition)f(regarding)330 408 y(them.)330 549 y(The)25
+b(\\In)m(v)-5 b(arian)m(t)27 b(Sections")g(are)f(certain)g(Secondary)g
+(Sections)g(whose)f(titles)i(are)f(designated,)i(as)330
+659 y(b)s(eing)e(those)h(of)g(In)m(v)-5 b(arian)m(t)27
+b(Sections,)i(in)d(the)h(notice)h(that)f(sa)m(ys)g(that)g(the)g(Do)s
+(cumen)m(t)g(is)g(released)330 769 y(under)f(this)i(License.)40
+b(If)27 b(a)h(section)h(do)s(es)f(not)f(\014t)h(the)g(ab)s(o)m(v)m(e)h
+(de\014nition)e(of)h(Secondary)f(then)h(it)g(is)330 878
+y(not)k(allo)m(w)m(ed)i(to)e(b)s(e)g(designated)g(as)g(In)m(v)-5
+b(arian)m(t.)46 b(The)31 b(Do)s(cumen)m(t)i(ma)m(y)f(con)m(tain)i(zero)
+e(In)m(v)-5 b(arian)m(t)330 988 y(Sections.)39 b(If)25
+b(the)f(Do)s(cumen)m(t)i(do)s(es)e(not)h(iden)m(tify)g(an)m(y)g(In)m(v)
+-5 b(arian)m(t)25 b(Sections)h(then)e(there)h(are)g(none.)330
+1129 y(The)36 b(\\Co)m(v)m(er)i(T)-8 b(exts")38 b(are)f(certain)g
+(short)g(passages)g(of)g(text)g(that)h(are)f(listed,)i(as)d(F)-8
+b(ron)m(t-Co)m(v)m(er)330 1238 y(T)g(exts)26 b(or)f(Bac)m(k-Co)m(v)m
+(er)j(T)-8 b(exts,)27 b(in)d(the)h(notice)i(that)e(sa)m(ys)h(that)g
+(the)f(Do)s(cumen)m(t)h(is)f(released)g(under)330 1348
+y(this)h(License.)40 b(A)25 b(F)-8 b(ron)m(t-Co)m(v)m(er)29
+b(T)-8 b(ext)26 b(ma)m(y)h(b)s(e)e(at)i(most)f(5)g(w)m(ords,)g(and)g(a)
+g(Bac)m(k-Co)m(v)m(er)j(T)-8 b(ext)26 b(ma)m(y)330 1457
+y(b)s(e)k(at)h(most)g(25)g(w)m(ords.)330 1598 y(A)36
+b(\\T)-8 b(ransparen)m(t")36 b(cop)m(y)g(of)g(the)f(Do)s(cumen)m(t)h
+(means)g(a)g(mac)m(hine-readable)h(cop)m(y)-8 b(,)38
+b(represen)m(ted)330 1708 y(in)d(a)h(format)g(whose)g(sp)s
+(eci\014cation)g(is)g(a)m(v)-5 b(ailable)38 b(to)f(the)f(general)g
+(public,)h(that)f(is)g(suitable)g(for)330 1817 y(revising)c(the)g(do)s
+(cumen)m(t)f(straigh)m(tforw)m(ardly)i(with)e(generic)i(text)g(editors)
+f(or)f(\(for)h(images)h(com-)330 1927 y(p)s(osed)23 b(of)h(pixels\))g
+(generic)h(pain)m(t)f(programs)g(or)f(\(for)h(dra)m(wings\))g(some)g
+(widely)g(a)m(v)-5 b(ailable)26 b(dra)m(wing)330 2037
+y(editor,)k(and)f(that)g(is)g(suitable)h(for)f(input)f(to)i(text)g
+(formatters)f(or)g(for)g(automatic)i(translation)f(to)330
+2146 y(a)d(v)-5 b(ariet)m(y)28 b(of)f(formats)g(suitable)h(for)e(input)
+g(to)i(text)g(formatters.)40 b(A)27 b(cop)m(y)g(made)g(in)g(an)g
+(otherwise)330 2256 y(T)-8 b(ransparen)m(t)37 b(\014le)h(format)g
+(whose)f(markup,)i(or)e(absence)h(of)g(markup,)g(has)g(b)s(een)f
+(arranged)g(to)330 2365 y(th)m(w)m(art)27 b(or)g(discourage)g
+(subsequen)m(t)f(mo)s(di\014cation)h(b)m(y)g(readers)f(is)g(not)h(T)-8
+b(ransparen)m(t.)39 b(An)27 b(image)330 2475 y(format)35
+b(is)f(not)h(T)-8 b(ransparen)m(t)34 b(if)g(used)g(for)g(an)m(y)g
+(substan)m(tial)h(amoun)m(t)g(of)g(text.)53 b(A)35 b(cop)m(y)g(that)g
+(is)330 2585 y(not)c(\\T)-8 b(ransparen)m(t")31 b(is)f(called)i
+(\\Opaque".)330 2725 y(Examples)53 b(of)g(suitable)h(formats)f(for)g(T)
+-8 b(ransparen)m(t)53 b(copies)h(include)f(plain)g Fk(asci)r(i)g
+Fr(without)330 2835 y(markup,)41 b(T)-8 b(exinfo)40 b(input)f(format,)j
+(LaT)1775 2855 y(E)1826 2835 y(X)d(input)g(format,)k
+Fk(sgml)c Fr(or)g Fk(xml)g Fr(using)g(a)h(publicly)330
+2945 y(a)m(v)-5 b(ailable)34 b Fk(dtd)p Fr(,)d(and)g
+(standard-conforming)g(simple)h Fk(html)p Fr(,)f(P)m(ostScript)h(or)f
+Fk(pdf)g Fr(designed)g(for)330 3054 y(h)m(uman)37 b(mo)s(di\014cation.)
+65 b(Examples)38 b(of)g(transparen)m(t)g(image)i(formats)e(include)g
+Fk(png)p Fr(,)i Fk(x)n(cf)e Fr(and)330 3164 y Fk(jpg)p
+Fr(.)63 b(Opaque)38 b(formats)g(include)g(proprietary)g(formats)g(that)
+h(can)f(b)s(e)g(read)g(and)f(edited)i(only)330 3273 y(b)m(y)g
+(proprietary)g(w)m(ord)g(pro)s(cessors,)j Fk(sgml)c Fr(or)i
+Fk(xml)e Fr(for)i(whic)m(h)f(the)g Fk(dtd)g Fr(and/or)g(pro)s(cessing)
+330 3383 y(to)s(ols)32 b(are)f(not)g(generally)h(a)m(v)-5
+b(ailable,)34 b(and)c(the)h(mac)m(hine-generated)i Fk(html)p
+Fr(,)d(P)m(ostScript)i(or)f Fk(pdf)330 3493 y Fr(pro)s(duced)e(b)m(y)h
+(some)h(w)m(ord)f(pro)s(cessors)g(for)g(output)g(purp)s(oses)e(only)-8
+b(.)330 3634 y(The)34 b(\\Title)h(P)m(age")i(means,)e(for)f(a)h(prin)m
+(ted)f(b)s(o)s(ok,)h(the)f(title)i(page)f(itself,)h(plus)e(suc)m(h)f
+(follo)m(wing)330 3743 y(pages)28 b(as)g(are)g(needed)g(to)g(hold,)g
+(legibly)-8 b(,)30 b(the)e(material)h(this)f(License)g(requires)f(to)h
+(app)s(ear)f(in)h(the)330 3853 y(title)g(page.)40 b(F)-8
+b(or)28 b(w)m(orks)e(in)g(formats)h(whic)m(h)g(do)f(not)h(ha)m(v)m(e)h
+(an)m(y)e(title)j(page)e(as)g(suc)m(h,)g(\\Title)h(P)m(age")330
+3962 y(means)j(the)f(text)i(near)e(the)h(most)g(prominen)m(t)g(app)s
+(earance)f(of)h(the)g(w)m(ork's)g(title,)h(preceding)f(the)330
+4072 y(b)s(eginning)f(of)g(the)h(b)s(o)s(dy)e(of)h(the)h(text.)330
+4213 y(A)f(section)h(\\En)m(titled)g(XYZ")f(means)f(a)h(named)g
+(subunit)e(of)h(the)h(Do)s(cumen)m(t)h(whose)e(title)i(either)330
+4322 y(is)d(precisely)g(XYZ)g(or)f(con)m(tains)i(XYZ)f(in)f(paren)m
+(theses)i(follo)m(wing)g(text)g(that)f(translates)h(XYZ)e(in)330
+4432 y(another)e(language.)40 b(\(Here)26 b(XYZ)f(stands)f(for)h(a)g
+(sp)s(eci\014c)g(section)h(name)f(men)m(tioned)h(b)s(elo)m(w,)g(suc)m
+(h)330 4542 y(as)i(\\Ac)m(kno)m(wledgemen)m(ts",)33 b(\\Dedications",)e
+(\\Endorsemen)m(ts",)e(or)f(\\History".\))42 b(T)-8 b(o)29
+b(\\Preserv)m(e)330 4651 y(the)34 b(Title")h(of)e(suc)m(h)h(a)g
+(section)g(when)f(y)m(ou)h(mo)s(dify)e(the)i(Do)s(cumen)m(t)h(means)e
+(that)h(it)g(remains)g(a)330 4761 y(section)e(\\En)m(titled)f(XYZ")g
+(according)g(to)g(this)g(de\014nition.)330 4902 y(The)c(Do)s(cumen)m(t)
+i(ma)m(y)f(include)f(W)-8 b(arran)m(t)m(y)30 b(Disclaimers)f(next)f(to)
+g(the)g(notice)h(whic)m(h)e(states)i(that)330 5011 y(this)34
+b(License)g(applies)g(to)h(the)f(Do)s(cumen)m(t.)52 b(These)33
+b(W)-8 b(arran)m(t)m(y)36 b(Disclaimers)f(are)g(considered)e(to)330
+5121 y(b)s(e)k(included)g(b)m(y)g(reference)h(in)g(this)f(License,)j
+(but)d(only)h(as)g(regards)f(disclaiming)i(w)m(arran)m(ties:)330
+5230 y(an)m(y)e(other)g(implication)i(that)e(these)g(W)-8
+b(arran)m(t)m(y)39 b(Disclaimers)f(ma)m(y)g(ha)m(v)m(e)g(is)f(v)m(oid)g
+(and)f(has)h(no)330 5340 y(e\013ect)32 b(on)e(the)h(meaning)f(of)h
+(this)f(License.)p eop end
+%%Page: 15 19
+TeXDict begin 15 18 bop 150 -116 a Fr(App)s(endix)29
+b(A:)h(Cop)m(ying)h(This)f(Man)m(ual)2105 b(15)199 299
+y(2.)61 b(VERBA)-8 b(TIM)31 b(COPYING)330 445 y(Y)-8
+b(ou)39 b(ma)m(y)f(cop)m(y)h(and)e(distribute)h(the)g(Do)s(cumen)m(t)h
+(in)f(an)m(y)g(medium,)h(either)g(commercially)h(or)330
+555 y(noncommercially)-8 b(,)48 b(pro)m(vided)42 b(that)h(this)f
+(License,)47 b(the)42 b(cop)m(yrigh)m(t)i(notices,)j(and)42
+b(the)h(license)330 664 y(notice)37 b(sa)m(ying)g(this)e(License)i
+(applies)e(to)i(the)f(Do)s(cumen)m(t)g(are)g(repro)s(duced)e(in)i(all)g
+(copies,)j(and)330 774 y(that)27 b(y)m(ou)g(add)f(no)h(other)f
+(conditions)h(whatso)s(ev)m(er)h(to)f(those)g(of)g(this)f(License.)40
+b(Y)-8 b(ou)27 b(ma)m(y)g(not)g(use)330 883 y(tec)m(hnical)35
+b(measures)d(to)i(obstruct)f(or)g(con)m(trol)h(the)f(reading)g(or)g
+(further)e(cop)m(ying)j(of)f(the)g(copies)330 993 y(y)m(ou)25
+b(mak)m(e)g(or)g(distribute.)38 b(Ho)m(w)m(ev)m(er,)28
+b(y)m(ou)d(ma)m(y)g(accept)h(comp)s(ensation)f(in)f(exc)m(hange)j(for)d
+(copies.)330 1103 y(If)32 b(y)m(ou)g(distribute)g(a)h(large)g(enough)f
+(n)m(um)m(b)s(er)f(of)h(copies)h(y)m(ou)f(m)m(ust)h(also)g(follo)m(w)g
+(the)f(conditions)330 1212 y(in)e(section)i(3.)330 1358
+y(Y)-8 b(ou)21 b(ma)m(y)h(also)f(lend)g(copies,)i(under)d(the)h(same)g
+(conditions)g(stated)h(ab)s(o)m(v)m(e,)i(and)c(y)m(ou)h(ma)m(y)g
+(publicly)330 1468 y(displa)m(y)31 b(copies.)199 1614
+y(3.)61 b(COPYING)30 b(IN)g(QUANTITY)330 1760 y(If)25
+b(y)m(ou)g(publish)f(prin)m(ted)g(copies)i(\(or)g(copies)g(in)f(media)g
+(that)h(commonly)g(ha)m(v)m(e)g(prin)m(ted)f(co)m(v)m(ers\))i(of)330
+1870 y(the)32 b(Do)s(cumen)m(t,)h(n)m(um)m(b)s(ering)e(more)h(than)f
+(100,)j(and)d(the)h(Do)s(cumen)m(t's)h(license)f(notice)h(requires)330
+1979 y(Co)m(v)m(er)i(T)-8 b(exts,)36 b(y)m(ou)f(m)m(ust)f(enclose)i
+(the)e(copies)h(in)f(co)m(v)m(ers)i(that)f(carry)-8 b(,)36
+b(clearly)f(and)f(legibly)-8 b(,)37 b(all)330 2089 y(these)j(Co)m(v)m
+(er)g(T)-8 b(exts:)59 b(F)-8 b(ron)m(t-Co)m(v)m(er)41
+b(T)-8 b(exts)40 b(on)f(the)g(fron)m(t)g(co)m(v)m(er,)44
+b(and)38 b(Bac)m(k-Co)m(v)m(er)k(T)-8 b(exts)40 b(on)330
+2198 y(the)29 b(bac)m(k)h(co)m(v)m(er.)42 b(Both)30 b(co)m(v)m(ers)h(m)
+m(ust)e(also)h(clearly)g(and)f(legibly)h(iden)m(tify)f(y)m(ou)h(as)f
+(the)h(publisher)330 2308 y(of)k(these)h(copies.)53 b(The)34
+b(fron)m(t)h(co)m(v)m(er)h(m)m(ust)e(presen)m(t)g(the)h(full)f(title)i
+(with)d(all)j(w)m(ords)d(of)i(the)f(title)330 2418 y(equally)e
+(prominen)m(t)e(and)g(visible.)43 b(Y)-8 b(ou)31 b(ma)m(y)g(add)g
+(other)g(material)h(on)f(the)g(co)m(v)m(ers)h(in)e(addition.)330
+2527 y(Cop)m(ying)36 b(with)g(c)m(hanges)h(limited)g(to)g(the)g(co)m(v)
+m(ers,)i(as)d(long)h(as)g(they)f(preserv)m(e)g(the)h(title)g(of)g(the)
+330 2637 y(Do)s(cumen)m(t)h(and)e(satisfy)i(these)f(conditions,)j(can)d
+(b)s(e)g(treated)h(as)f(v)m(erbatim)h(cop)m(ying)g(in)f(other)330
+2746 y(resp)s(ects.)330 2892 y(If)32 b(the)h(required)f(texts)i(for)e
+(either)h(co)m(v)m(er)i(are)e(to)s(o)g(v)m(oluminous)g(to)g(\014t)g
+(legibly)-8 b(,)35 b(y)m(ou)e(should)f(put)330 3002 y(the)h(\014rst)f
+(ones)h(listed)g(\(as)h(man)m(y)f(as)g(\014t)g(reasonably\))g(on)g(the)
+g(actual)h(co)m(v)m(er,)h(and)e(con)m(tin)m(ue)h(the)330
+3112 y(rest)d(on)m(to)g(adjacen)m(t)h(pages.)330 3258
+y(If)27 b(y)m(ou)g(publish)e(or)i(distribute)g(Opaque)f(copies)i(of)f
+(the)h(Do)s(cumen)m(t)f(n)m(um)m(b)s(ering)f(more)i(than)e(100,)330
+3367 y(y)m(ou)i(m)m(ust)g(either)h(include)e(a)i(mac)m(hine-readable)g
+(T)-8 b(ransparen)m(t)28 b(cop)m(y)h(along)g(with)e(eac)m(h)i(Opaque)
+330 3477 y(cop)m(y)-8 b(,)38 b(or)d(state)h(in)f(or)g(with)g(eac)m(h)h
+(Opaque)e(cop)m(y)i(a)g(computer-net)m(w)m(ork)g(lo)s(cation)h(from)d
+(whic)m(h)330 3587 y(the)24 b(general)i(net)m(w)m(ork-using)f(public)e
+(has)h(access)i(to)f(do)m(wnload)f(using)g(public-standard)f(net)m(w)m
+(ork)330 3696 y(proto)s(cols)40 b(a)f(complete)h(T)-8
+b(ransparen)m(t)39 b(cop)m(y)g(of)g(the)h(Do)s(cumen)m(t,)i(free)d(of)g
+(added)f(material.)67 b(If)330 3806 y(y)m(ou)39 b(use)g(the)g(latter)h
+(option,)h(y)m(ou)f(m)m(ust)e(tak)m(e)j(reasonably)e(pruden)m(t)e
+(steps,)k(when)d(y)m(ou)h(b)s(egin)330 3915 y(distribution)f(of)g
+(Opaque)g(copies)h(in)e(quan)m(tit)m(y)-8 b(,)43 b(to)38
+b(ensure)g(that)h(this)f(T)-8 b(ransparen)m(t)38 b(cop)m(y)h(will)330
+4025 y(remain)30 b(th)m(us)g(accessible)i(at)f(the)f(stated)h(lo)s
+(cation)h(un)m(til)e(at)h(least)h(one)e(y)m(ear)h(after)g(the)f(last)h
+(time)330 4134 y(y)m(ou)37 b(distribute)f(an)h(Opaque)f(cop)m(y)i
+(\(directly)g(or)e(through)g(y)m(our)h(agen)m(ts)h(or)f(retailers\))h
+(of)f(that)330 4244 y(edition)31 b(to)g(the)g(public.)330
+4390 y(It)k(is)f(requested,)i(but)e(not)h(required,)g(that)g(y)m(ou)g
+(con)m(tact)h(the)f(authors)f(of)h(the)g(Do)s(cumen)m(t)g(w)m(ell)330
+4500 y(b)s(efore)28 b(redistributing)g(an)m(y)h(large)h(n)m(um)m(b)s
+(er)d(of)i(copies,)h(to)f(giv)m(e)h(them)f(a)g(c)m(hance)h(to)f(pro)m
+(vide)g(y)m(ou)330 4609 y(with)h(an)g(up)s(dated)f(v)m(ersion)i(of)g
+(the)f(Do)s(cumen)m(t.)199 4755 y(4.)61 b(MODIFICA)-8
+b(TIONS)330 4902 y(Y)g(ou)26 b(ma)m(y)g(cop)m(y)g(and)f(distribute)g(a)
+h(Mo)s(di\014ed)f(V)-8 b(ersion)26 b(of)g(the)g(Do)s(cumen)m(t)g(under)
+e(the)h(conditions)330 5011 y(of)c(sections)h(2)g(and)e(3)h(ab)s(o)m(v)
+m(e,)k(pro)m(vided)20 b(that)i(y)m(ou)f(release)i(the)e(Mo)s(di\014ed)f
+(V)-8 b(ersion)22 b(under)d(precisely)330 5121 y(this)29
+b(License,)h(with)f(the)g(Mo)s(di\014ed)f(V)-8 b(ersion)30
+b(\014lling)f(the)g(role)h(of)f(the)g(Do)s(cumen)m(t,)h(th)m(us)f
+(licensing)330 5230 y(distribution)k(and)h(mo)s(di\014cation)g(of)h
+(the)f(Mo)s(di\014ed)f(V)-8 b(ersion)35 b(to)g(who)s(ev)m(er)f(p)s
+(ossesses)f(a)i(cop)m(y)g(of)330 5340 y(it.)41 b(In)30
+b(addition,)h(y)m(ou)f(m)m(ust)h(do)f(these)h(things)f(in)g(the)h(Mo)s
+(di\014ed)e(V)-8 b(ersion:)p eop end
+%%Page: 16 20
+TeXDict begin 16 19 bop 150 -116 a Fr(16)2651 b(GNU)31
+b(History)g(Library)357 299 y(A.)60 b(Use)33 b(in)f(the)h(Title)h(P)m
+(age)g(\(and)f(on)f(the)h(co)m(v)m(ers,)i(if)e(an)m(y\))g(a)g(title)h
+(distinct)f(from)g(that)g(of)g(the)510 408 y(Do)s(cumen)m(t,)j(and)d
+(from)g(those)i(of)f(previous)f(v)m(ersions)h(\(whic)m(h)g(should,)g
+(if)g(there)g(w)m(ere)g(an)m(y)-8 b(,)510 518 y(b)s(e)31
+b(listed)h(in)f(the)g(History)h(section)g(of)g(the)f(Do)s(cumen)m(t\).)
+45 b(Y)-8 b(ou)32 b(ma)m(y)g(use)f(the)g(same)h(title)h(as)510
+628 y(a)e(previous)f(v)m(ersion)g(if)h(the)f(original)i(publisher)d(of)
+h(that)h(v)m(ersion)g(giv)m(es)h(p)s(ermission.)360 758
+y(B.)61 b(List)31 b(on)f(the)h(Title)g(P)m(age,)i(as)d(authors,)h(one)g
+(or)f(more)h(p)s(ersons)e(or)h(en)m(tities)j(resp)s(onsible)c(for)510
+867 y(authorship)c(of)h(the)h(mo)s(di\014cations)f(in)g(the)g(Mo)s
+(di\014ed)f(V)-8 b(ersion,)28 b(together)g(with)d(at)i(least)h(\014v)m
+(e)510 977 y(of)c(the)g(principal)g(authors)f(of)i(the)f(Do)s(cumen)m
+(t)g(\(all)h(of)g(its)f(principal)g(authors,)h(if)f(it)g(has)g(few)m
+(er)510 1087 y(than)30 b(\014v)m(e\),)h(unless)f(they)h(release)g(y)m
+(ou)g(from)f(this)g(requiremen)m(t.)359 1217 y(C.)60
+b(State)32 b(on)e(the)h(Title)h(page)f(the)g(name)g(of)g(the)g
+(publisher)e(of)i(the)g(Mo)s(di\014ed)f(V)-8 b(ersion,)32
+b(as)f(the)510 1326 y(publisher.)355 1456 y(D.)61 b(Preserv)m(e)31
+b(all)g(the)g(cop)m(yrigh)m(t)h(notices)f(of)g(the)f(Do)s(cumen)m(t.)
+363 1587 y(E.)60 b(Add)30 b(an)i(appropriate)f(cop)m(yrigh)m(t)i
+(notice)f(for)g(y)m(our)f(mo)s(di\014cations)g(adjacen)m(t)i(to)f(the)g
+(other)510 1696 y(cop)m(yrigh)m(t)g(notices.)365 1826
+y(F.)61 b(Include,)28 b(immediately)h(after)f(the)h(cop)m(yrigh)m(t)g
+(notices,)h(a)e(license)h(notice)g(giving)g(the)f(public)510
+1936 y(p)s(ermission)23 b(to)j(use)e(the)g(Mo)s(di\014ed)g(V)-8
+b(ersion)25 b(under)e(the)i(terms)f(of)h(this)f(License,)j(in)d(the)g
+(form)510 2045 y(sho)m(wn)30 b(in)g(the)g(Addendum)f(b)s(elo)m(w.)353
+2176 y(G.)61 b(Preserv)m(e)23 b(in)g(that)g(license)h(notice)g(the)f
+(full)g(lists)g(of)g(In)m(v)-5 b(arian)m(t)23 b(Sections)h(and)e
+(required)g(Co)m(v)m(er)510 2285 y(T)-8 b(exts)31 b(giv)m(en)g(in)f
+(the)h(Do)s(cumen)m(t's)g(license)h(notice.)357 2415
+y(H.)60 b(Include)30 b(an)g(unaltered)g(cop)m(y)h(of)g(this)f(License.)
+392 2545 y(I.)60 b(Preserv)m(e)33 b(the)f(section)h(En)m(titled)g
+(\\History",)h(Preserv)m(e)f(its)f(Title,)i(and)d(add)h(to)h(it)f(an)g
+(item)510 2655 y(stating)d(at)g(least)g(the)g(title,)h(y)m(ear,)g(new)d
+(authors,)i(and)e(publisher)f(of)j(the)f(Mo)s(di\014ed)f(V)-8
+b(ersion)510 2765 y(as)32 b(giv)m(en)g(on)f(the)h(Title)g(P)m(age.)45
+b(If)31 b(there)h(is)f(no)g(section)i(En)m(titled)f(\\History")h(in)e
+(the)g(Do)s(cu-)510 2874 y(men)m(t,)37 b(create)f(one)f(stating)h(the)f
+(title,)i(y)m(ear,)g(authors,)f(and)e(publisher)f(of)i(the)g(Do)s
+(cumen)m(t)510 2984 y(as)h(giv)m(en)h(on)f(its)h(Title)g(P)m(age,)i
+(then)d(add)g(an)g(item)g(describing)g(the)g(Mo)s(di\014ed)g(V)-8
+b(ersion)37 b(as)510 3093 y(stated)31 b(in)f(the)h(previous)f(sen)m
+(tence.)378 3224 y(J.)60 b(Preserv)m(e)33 b(the)g(net)m(w)m(ork)g(lo)s
+(cation,)i(if)d(an)m(y)-8 b(,)34 b(giv)m(en)f(in)g(the)f(Do)s(cumen)m
+(t)h(for)g(public)e(access)j(to)510 3333 y(a)e(T)-8 b(ransparen)m(t)30
+b(cop)m(y)i(of)g(the)f(Do)s(cumen)m(t,)h(and)f(lik)m(ewise)h(the)g(net)
+m(w)m(ork)g(lo)s(cations)g(giv)m(en)g(in)510 3443 y(the)g(Do)s(cumen)m
+(t)g(for)g(previous)f(v)m(ersions)h(it)g(w)m(as)g(based)f(on.)45
+b(These)31 b(ma)m(y)h(b)s(e)f(placed)h(in)g(the)510 3552
+y(\\History")27 b(section.)40 b(Y)-8 b(ou)25 b(ma)m(y)h(omit)g(a)f(net)
+m(w)m(ork)h(lo)s(cation)g(for)f(a)h(w)m(ork)f(that)g(w)m(as)h
+(published)510 3662 y(at)36 b(least)h(four)e(y)m(ears)i(b)s(efore)e
+(the)h(Do)s(cumen)m(t)h(itself,)h(or)d(if)h(the)g(original)h(publisher)
+d(of)i(the)510 3771 y(v)m(ersion)31 b(it)g(refers)f(to)h(giv)m(es)h(p)s
+(ermission.)354 3902 y(K.)60 b(F)-8 b(or)24 b(an)m(y)h(section)f(En)m
+(titled)h(\\Ac)m(kno)m(wledgemen)m(ts")i(or)d(\\Dedications",)k
+(Preserv)m(e)c(the)g(Title)510 4011 y(of)j(the)f(section,)j(and)d
+(preserv)m(e)h(in)f(the)h(section)g(all)h(the)e(substance)h(and)f(tone)
+h(of)f(eac)m(h)i(of)f(the)510 4121 y(con)m(tributor)k(ac)m(kno)m
+(wledgemen)m(ts)i(and/or)d(dedications)h(giv)m(en)h(therein.)368
+4251 y(L.)60 b(Preserv)m(e)36 b(all)g(the)g(In)m(v)-5
+b(arian)m(t)36 b(Sections)g(of)f(the)h(Do)s(cumen)m(t,)h(unaltered)f
+(in)f(their)g(text)i(and)510 4361 y(in)f(their)g(titles.)58
+b(Section)37 b(n)m(um)m(b)s(ers)d(or)i(the)g(equiv)-5
+b(alen)m(t)38 b(are)e(not)g(considered)g(part)g(of)g(the)510
+4470 y(section)c(titles.)341 4600 y(M.)61 b(Delete)33
+b(an)m(y)e(section)h(En)m(titled)f(\\Endorsemen)m(ts".)42
+b(Suc)m(h)30 b(a)i(section)f(ma)m(y)h(not)f(b)s(e)f(included)510
+4710 y(in)g(the)h(Mo)s(di\014ed)e(V)-8 b(ersion.)357
+4840 y(N.)60 b(Do)29 b(not)g(retitle)h(an)m(y)e(existing)i(section)f
+(to)g(b)s(e)f(En)m(titled)h(\\Endorsemen)m(ts")g(or)f(to)h(con\015ict)g
+(in)510 4950 y(title)j(with)e(an)m(y)h(In)m(v)-5 b(arian)m(t)31
+b(Section.)354 5080 y(O.)60 b(Preserv)m(e)31 b(an)m(y)g(W)-8
+b(arran)m(t)m(y)32 b(Disclaimers.)330 5230 y(If)h(the)g(Mo)s(di\014ed)g
+(V)-8 b(ersion)34 b(includes)f(new)g(fron)m(t-matter)i(sections)f(or)f
+(app)s(endices)g(that)h(qualify)330 5340 y(as)28 b(Secondary)g
+(Sections)g(and)f(con)m(tain)j(no)d(material)j(copied)e(from)f(the)h
+(Do)s(cumen)m(t,)i(y)m(ou)e(ma)m(y)g(at)p eop end
+%%Page: 17 21
+TeXDict begin 17 20 bop 150 -116 a Fr(App)s(endix)29
+b(A:)h(Cop)m(ying)h(This)f(Man)m(ual)2105 b(17)330 299
+y(y)m(our)32 b(option)h(designate)h(some)e(or)h(all)g(of)f(these)h
+(sections)h(as)e(in)m(v)-5 b(arian)m(t.)48 b(T)-8 b(o)33
+b(do)f(this,)h(add)f(their)330 408 y(titles)37 b(to)f(the)f(list)h(of)g
+(In)m(v)-5 b(arian)m(t)36 b(Sections)g(in)f(the)h(Mo)s(di\014ed)f(V)-8
+b(ersion's)36 b(license)g(notice.)57 b(These)330 518
+y(titles)32 b(m)m(ust)e(b)s(e)g(distinct)h(from)e(an)m(y)i(other)g
+(section)g(titles.)330 650 y(Y)-8 b(ou)43 b(ma)m(y)g(add)f(a)g(section)
+i(En)m(titled)f(\\Endorsemen)m(ts",)j(pro)m(vided)c(it)h(con)m(tains)g
+(nothing)g(but)330 759 y(endorsemen)m(ts)30 b(of)g(y)m(our)f(Mo)s
+(di\014ed)g(V)-8 b(ersion)31 b(b)m(y)e(v)-5 b(arious)30
+b(parties|for)g(example,)g(statemen)m(ts)i(of)330 869
+y(p)s(eer)27 b(review)g(or)g(that)h(the)f(text)i(has)d(b)s(een)h(appro)
+m(v)m(ed)g(b)m(y)g(an)h(organization)h(as)e(the)h(authoritativ)m(e)330
+978 y(de\014nition)i(of)h(a)f(standard.)330 1110 y(Y)-8
+b(ou)29 b(ma)m(y)g(add)e(a)i(passage)g(of)g(up)e(to)i(\014v)m(e)g(w)m
+(ords)e(as)i(a)g(F)-8 b(ron)m(t-Co)m(v)m(er)30 b(T)-8
+b(ext,)30 b(and)e(a)g(passage)i(of)e(up)330 1219 y(to)g(25)g(w)m(ords)e
+(as)i(a)f(Bac)m(k-Co)m(v)m(er)j(T)-8 b(ext,)29 b(to)f(the)f(end)f(of)i
+(the)f(list)h(of)f(Co)m(v)m(er)h(T)-8 b(exts)27 b(in)g(the)h(Mo)s
+(di\014ed)330 1329 y(V)-8 b(ersion.)58 b(Only)35 b(one)h(passage)h(of)f
+(F)-8 b(ron)m(t-Co)m(v)m(er)38 b(T)-8 b(ext)36 b(and)g(one)g(of)g(Bac)m
+(k-Co)m(v)m(er)j(T)-8 b(ext)36 b(ma)m(y)h(b)s(e)330 1439
+y(added)27 b(b)m(y)g(\(or)h(through)f(arrangemen)m(ts)h(made)g(b)m(y\))
+g(an)m(y)g(one)f(en)m(tit)m(y)-8 b(.)42 b(If)27 b(the)h(Do)s(cumen)m(t)
+g(already)330 1548 y(includes)34 b(a)g(co)m(v)m(er)h(text)g(for)f(the)g
+(same)h(co)m(v)m(er,)h(previously)e(added)f(b)m(y)h(y)m(ou)g(or)g(b)m
+(y)g(arrangemen)m(t)330 1658 y(made)h(b)m(y)g(the)h(same)f(en)m(tit)m
+(y)i(y)m(ou)f(are)f(acting)i(on)e(b)s(ehalf)f(of,)j(y)m(ou)f(ma)m(y)g
+(not)f(add)g(another;)j(but)330 1767 y(y)m(ou)c(ma)m(y)h(replace)g(the)
+f(old)g(one,)i(on)e(explicit)h(p)s(ermission)e(from)g(the)i(previous)e
+(publisher)f(that)330 1877 y(added)e(the)g(old)h(one.)330
+2008 y(The)25 b(author\(s\))h(and)f(publisher\(s\))f(of)i(the)f(Do)s
+(cumen)m(t)h(do)g(not)f(b)m(y)h(this)f(License)h(giv)m(e)h(p)s
+(ermission)330 2118 y(to)k(use)f(their)g(names)h(for)f(publicit)m(y)g
+(for)h(or)f(to)h(assert)g(or)f(imply)g(endorsemen)m(t)g(of)h(an)m(y)g
+(Mo)s(di\014ed)330 2228 y(V)-8 b(ersion.)199 2359 y(5.)61
+b(COMBINING)31 b(DOCUMENTS)330 2491 y(Y)-8 b(ou)39 b(ma)m(y)g(com)m
+(bine)h(the)f(Do)s(cumen)m(t)g(with)g(other)f(do)s(cumen)m(ts)h
+(released)g(under)f(this)g(License,)330 2600 y(under)f(the)h(terms)g
+(de\014ned)f(in)h(section)h(4)g(ab)s(o)m(v)m(e)g(for)f(mo)s(di\014ed)f
+(v)m(ersions,)k(pro)m(vided)d(that)h(y)m(ou)330 2710
+y(include)25 b(in)g(the)g(com)m(bination)i(all)f(of)g(the)f(In)m(v)-5
+b(arian)m(t)26 b(Sections)g(of)g(all)g(of)f(the)h(original)g(do)s
+(cumen)m(ts,)330 2819 y(unmo)s(di\014ed,)g(and)g(list)h(them)g(all)g
+(as)g(In)m(v)-5 b(arian)m(t)28 b(Sections)f(of)g(y)m(our)g(com)m(bined)
+g(w)m(ork)f(in)h(its)g(license)330 2929 y(notice,)32
+b(and)e(that)h(y)m(ou)f(preserv)m(e)h(all)g(their)g(W)-8
+b(arran)m(t)m(y)32 b(Disclaimers.)330 3061 y(The)e(com)m(bined)g(w)m
+(ork)h(need)e(only)i(con)m(tain)g(one)g(cop)m(y)g(of)f(this)g(License,)
+i(and)d(m)m(ultiple)i(iden)m(tical)330 3170 y(In)m(v)-5
+b(arian)m(t)33 b(Sections)g(ma)m(y)g(b)s(e)f(replaced)h(with)f(a)h
+(single)g(cop)m(y)-8 b(.)48 b(If)32 b(there)h(are)g(m)m(ultiple)g(In)m
+(v)-5 b(arian)m(t)330 3280 y(Sections)27 b(with)g(the)g(same)g(name)g
+(but)f(di\013eren)m(t)h(con)m(ten)m(ts,)i(mak)m(e)f(the)f(title)h(of)f
+(eac)m(h)h(suc)m(h)f(section)330 3389 y(unique)33 b(b)m(y)h(adding)f
+(at)i(the)f(end)g(of)g(it,)h(in)f(paren)m(theses,)i(the)e(name)g(of)g
+(the)g(original)h(author)f(or)330 3499 y(publisher)23
+b(of)i(that)h(section)g(if)f(kno)m(wn,)h(or)f(else)h(a)f(unique)f(n)m
+(um)m(b)s(er.)38 b(Mak)m(e)26 b(the)g(same)f(adjustmen)m(t)330
+3608 y(to)g(the)g(section)g(titles)h(in)e(the)h(list)g(of)f(In)m(v)-5
+b(arian)m(t)26 b(Sections)f(in)f(the)g(license)i(notice)g(of)e(the)h
+(com)m(bined)330 3718 y(w)m(ork.)330 3850 y(In)41 b(the)g(com)m
+(bination,)46 b(y)m(ou)41 b(m)m(ust)g(com)m(bine)h(an)m(y)g(sections)g
+(En)m(titled)g(\\History")h(in)e(the)g(v)-5 b(ari-)330
+3959 y(ous)32 b(original)h(do)s(cumen)m(ts,)g(forming)f(one)g(section)h
+(En)m(titled)g(\\History";)i(lik)m(ewise)f(com)m(bine)f(an)m(y)330
+4069 y(sections)g(En)m(titled)f(\\Ac)m(kno)m(wledgemen)m(ts",)k(and)31
+b(an)m(y)h(sections)h(En)m(titled)g(\\Dedications".)47
+b(Y)-8 b(ou)330 4178 y(m)m(ust)30 b(delete)i(all)f(sections)h(En)m
+(titled)f(\\Endorsemen)m(ts.")199 4310 y(6.)61 b(COLLECTIONS)28
+b(OF)i(DOCUMENTS)330 4441 y(Y)-8 b(ou)32 b(ma)m(y)h(mak)m(e)g(a)f
+(collection)i(consisting)f(of)f(the)g(Do)s(cumen)m(t)g(and)g(other)g
+(do)s(cumen)m(ts)f(released)330 4551 y(under)41 b(this)h(License,)k
+(and)c(replace)h(the)g(individual)f(copies)h(of)f(this)g(License)h(in)f
+(the)h(v)-5 b(arious)330 4661 y(do)s(cumen)m(ts)42 b(with)g(a)h(single)
+g(cop)m(y)h(that)f(is)f(included)g(in)g(the)h(collection,)48
+b(pro)m(vided)42 b(that)i(y)m(ou)330 4770 y(follo)m(w)38
+b(the)g(rules)e(of)h(this)g(License)h(for)f(v)m(erbatim)h(cop)m(ying)g
+(of)f(eac)m(h)h(of)f(the)h(do)s(cumen)m(ts)e(in)h(all)330
+4880 y(other)31 b(resp)s(ects.)330 5011 y(Y)-8 b(ou)32
+b(ma)m(y)g(extract)h(a)f(single)g(do)s(cumen)m(t)f(from)g(suc)m(h)g(a)h
+(collection,)i(and)d(distribute)g(it)h(individu-)330
+5121 y(ally)k(under)d(this)i(License,)i(pro)m(vided)e(y)m(ou)g(insert)g
+(a)g(cop)m(y)h(of)f(this)g(License)g(in)m(to)h(the)g(extracted)330
+5230 y(do)s(cumen)m(t,)d(and)f(follo)m(w)i(this)e(License)h(in)g(all)g
+(other)g(resp)s(ects)f(regarding)h(v)m(erbatim)g(cop)m(ying)h(of)330
+5340 y(that)d(do)s(cumen)m(t.)p eop end
+%%Page: 18 22
+TeXDict begin 18 21 bop 150 -116 a Fr(18)2651 b(GNU)31
+b(History)g(Library)199 299 y(7.)61 b(A)m(GGREGA)-8 b(TION)32
+b(WITH)e(INDEPENDENT)h(W)m(ORKS)330 428 y(A)d(compilation)i(of)e(the)g
+(Do)s(cumen)m(t)h(or)f(its)g(deriv)-5 b(ativ)m(es)30
+b(with)d(other)i(separate)g(and)e(indep)s(enden)m(t)330
+538 y(do)s(cumen)m(ts)33 b(or)g(w)m(orks,)h(in)f(or)h(on)f(a)g(v)m
+(olume)h(of)g(a)f(storage)i(or)e(distribution)g(medium,)g(is)h(called)
+330 648 y(an)c(\\aggregate")k(if)c(the)g(cop)m(yrigh)m(t)i(resulting)e
+(from)f(the)i(compilation)g(is)f(not)h(used)e(to)i(limit)g(the)330
+757 y(legal)d(righ)m(ts)f(of)g(the)g(compilation's)h(users)e(b)s(ey)m
+(ond)g(what)g(the)h(individual)f(w)m(orks)g(p)s(ermit.)39
+b(When)330 867 y(the)28 b(Do)s(cumen)m(t)g(is)g(included)f(an)g
+(aggregate,)32 b(this)27 b(License)h(do)s(es)g(not)g(apply)f(to)h(the)g
+(other)g(w)m(orks)330 976 y(in)i(the)h(aggregate)i(whic)m(h)d(are)h
+(not)f(themselv)m(es)i(deriv)-5 b(ativ)m(e)32 b(w)m(orks)e(of)h(the)f
+(Do)s(cumen)m(t.)330 1106 y(If)22 b(the)h(Co)m(v)m(er)h(T)-8
+b(ext)23 b(requiremen)m(t)g(of)g(section)h(3)f(is)g(applicable)h(to)f
+(these)h(copies)f(of)g(the)g(Do)s(cumen)m(t,)330 1215
+y(then)f(if)g(the)h(Do)s(cumen)m(t)g(is)g(less)f(than)g(one)h(half)f
+(of)h(the)g(en)m(tire)g(aggregate,)k(the)c(Do)s(cumen)m(t's)g(Co)m(v)m
+(er)330 1325 y(T)-8 b(exts)27 b(ma)m(y)g(b)s(e)f(placed)h(on)g(co)m(v)m
+(ers)h(that)f(brac)m(k)m(et)h(the)f(Do)s(cumen)m(t)g(within)f(the)h
+(aggregate,)j(or)d(the)330 1435 y(electronic)37 b(equiv)-5
+b(alen)m(t)36 b(of)g(co)m(v)m(ers)g(if)f(the)g(Do)s(cumen)m(t)h(is)f
+(in)g(electronic)i(form.)54 b(Otherwise)35 b(they)330
+1544 y(m)m(ust)30 b(app)s(ear)g(on)g(prin)m(ted)g(co)m(v)m(ers)i(that)f
+(brac)m(k)m(et)h(the)f(whole)f(aggregate.)199 1674 y(8.)61
+b(TRANSLA)-8 b(TION)330 1803 y(T)g(ranslation)41 b(is)f(considered)f(a)
+i(kind)e(of)h(mo)s(di\014cation,)j(so)d(y)m(ou)g(ma)m(y)h(distribute)e
+(translations)330 1913 y(of)45 b(the)f(Do)s(cumen)m(t)h(under)e(the)h
+(terms)h(of)f(section)i(4.)83 b(Replacing)45 b(In)m(v)-5
+b(arian)m(t)45 b(Sections)g(with)330 2022 y(translations)h(requires)f
+(sp)s(ecial)h(p)s(ermission)f(from)g(their)g(cop)m(yrigh)m(t)i
+(holders,)i(but)c(y)m(ou)g(ma)m(y)330 2132 y(include)24
+b(translations)i(of)e(some)h(or)g(all)g(In)m(v)-5 b(arian)m(t)25
+b(Sections)g(in)f(addition)h(to)g(the)g(original)h(v)m(ersions)330
+2242 y(of)32 b(these)f(In)m(v)-5 b(arian)m(t)33 b(Sections.)44
+b(Y)-8 b(ou)32 b(ma)m(y)g(include)f(a)h(translation)g(of)g(this)f
+(License,)i(and)d(all)j(the)330 2351 y(license)42 b(notices)g(in)f(the)
+h(Do)s(cumen)m(t,)j(and)40 b(an)m(y)i(W)-8 b(arran)m(t)m(y)42
+b(Disclaimers,)k(pro)m(vided)41 b(that)h(y)m(ou)330 2461
+y(also)f(include)f(the)g(original)h(English)f(v)m(ersion)g(of)g(this)g
+(License)h(and)e(the)h(original)h(v)m(ersions)g(of)330
+2570 y(those)35 b(notices)g(and)e(disclaimers.)53 b(In)33
+b(case)i(of)g(a)f(disagreemen)m(t)h(b)s(et)m(w)m(een)g(the)f
+(translation)i(and)330 2680 y(the)f(original)i(v)m(ersion)e(of)h(this)f
+(License)h(or)f(a)g(notice)i(or)e(disclaimer,)i(the)f(original)g(v)m
+(ersion)g(will)330 2790 y(prev)-5 b(ail.)330 2919 y(If)28
+b(a)h(section)h(in)e(the)h(Do)s(cumen)m(t)h(is)e(En)m(titled)i(\\Ac)m
+(kno)m(wledgemen)m(ts",)i(\\Dedications",)g(or)d(\\His-)330
+3029 y(tory",)f(the)f(requiremen)m(t)f(\(section)i(4\))f(to)g(Preserv)m
+(e)g(its)f(Title)i(\(section)f(1\))g(will)g(t)m(ypically)h(require)330
+3138 y(c)m(hanging)j(the)g(actual)h(title.)199 3268 y(9.)61
+b(TERMINA)-8 b(TION)330 3397 y(Y)g(ou)30 b(ma)m(y)h(not)f(cop)m(y)-8
+b(,)31 b(mo)s(dify)-8 b(,)30 b(sublicense,)g(or)g(distribute)f(the)h
+(Do)s(cumen)m(t)g(except)h(as)f(expressly)330 3507 y(pro)m(vided)41
+b(for)h(under)e(this)i(License.)75 b(An)m(y)42 b(other)g(attempt)h(to)g
+(cop)m(y)-8 b(,)46 b(mo)s(dify)-8 b(,)44 b(sublicense)e(or)330
+3616 y(distribute)36 b(the)h(Do)s(cumen)m(t)g(is)g(v)m(oid,)i(and)d
+(will)h(automatically)i(terminate)f(y)m(our)e(righ)m(ts)h(under)330
+3726 y(this)28 b(License.)40 b(Ho)m(w)m(ev)m(er,)31 b(parties)d(who)f
+(ha)m(v)m(e)i(receiv)m(ed)g(copies,)h(or)d(righ)m(ts,)i(from)f(y)m(ou)g
+(under)e(this)330 3836 y(License)37 b(will)g(not)g(ha)m(v)m(e)h(their)f
+(licenses)g(terminated)h(so)f(long)g(as)g(suc)m(h)f(parties)h(remain)g
+(in)f(full)330 3945 y(compliance.)154 4075 y(10.)61 b(FUTURE)30
+b(REVISIONS)f(OF)i(THIS)e(LICENSE)330 4204 y(The)41 b(F)-8
+b(ree)43 b(Soft)m(w)m(are)f(F)-8 b(oundation)43 b(ma)m(y)f(publish)e
+(new,)k(revised)d(v)m(ersions)h(of)g(the)g(GNU)g(F)-8
+b(ree)330 4314 y(Do)s(cumen)m(tation)34 b(License)e(from)g(time)h(to)g
+(time.)46 b(Suc)m(h)31 b(new)h(v)m(ersions)g(will)h(b)s(e)e(similar)h
+(in)g(spirit)330 4423 y(to)j(the)g(presen)m(t)f(v)m(ersion,)i(but)e(ma)
+m(y)h(di\013er)f(in)g(detail)h(to)g(address)f(new)g(problems)f(or)i
+(concerns.)330 4533 y(See)c Fq(http://www.gnu.org/copy)o(left)o(/)p
+Fr(.)330 4663 y(Eac)m(h)f(v)m(ersion)g(of)g(the)f(License)h(is)g(giv)m
+(en)g(a)g(distinguishing)f(v)m(ersion)h(n)m(um)m(b)s(er.)39
+b(If)29 b(the)g(Do)s(cumen)m(t)330 4772 y(sp)s(eci\014es)45
+b(that)h(a)g(particular)f(n)m(um)m(b)s(ered)f(v)m(ersion)i(of)f(this)g
+(License)h(\\or)g(an)m(y)g(later)g(v)m(ersion")330 4882
+y(applies)33 b(to)g(it,)h(y)m(ou)e(ha)m(v)m(e)i(the)f(option)g(of)f
+(follo)m(wing)i(the)f(terms)f(and)g(conditions)h(either)g(of)f(that)330
+4991 y(sp)s(eci\014ed)37 b(v)m(ersion)i(or)e(of)h(an)m(y)h(later)g(v)m
+(ersion)f(that)g(has)g(b)s(een)f(published)f(\(not)j(as)f(a)g(draft\))g
+(b)m(y)330 5101 y(the)33 b(F)-8 b(ree)34 b(Soft)m(w)m(are)f(F)-8
+b(oundation.)49 b(If)32 b(the)h(Do)s(cumen)m(t)g(do)s(es)g(not)g(sp)s
+(ecify)f(a)h(v)m(ersion)g(n)m(um)m(b)s(er)f(of)330 5210
+y(this)i(License,)j(y)m(ou)d(ma)m(y)i(c)m(ho)s(ose)f(an)m(y)g(v)m
+(ersion)g(ev)m(er)g(published)e(\(not)i(as)g(a)f(draft\))h(b)m(y)f(the)
+h(F)-8 b(ree)330 5320 y(Soft)m(w)m(are)31 b(F)-8 b(oundation.)p
+eop end
+%%Page: 19 23
+TeXDict begin 19 22 bop 150 -116 a Fr(App)s(endix)29
+b(A:)h(Cop)m(ying)h(This)f(Man)m(ual)2105 b(19)150 299
+y Fi(A.1.1)62 b(ADDENDUM:)41 b(Ho)m(w)g(to)g(use)g(this)g(License)g
+(for)h(y)m(our)f(do)s(cumen)m(ts)275 543 y Fr(T)-8 b(o)27
+b(use)g(this)g(License)h(in)f(a)h(do)s(cumen)m(t)f(y)m(ou)h(ha)m(v)m(e)
+g(written,)g(include)f(a)h(cop)m(y)g(of)f(the)h(License)g(in)f(the)150
+653 y(do)s(cumen)m(t)j(and)g(put)g(the)g(follo)m(wing)i(cop)m(yrigh)m
+(t)g(and)e(license)h(notices)g(just)f(after)h(the)g(title)h(page:)468
+765 y Fd(Copyright)42 b(\(C\))79 b Fc(year)88 b(your)40
+b(name)p Fd(.)468 852 y(Permission)i(is)e(granted)g(to)g(copy,)h
+(distribute)g(and/or)g(modify)f(this)g(document)468 939
+y(under)h(the)f(terms)g(of)g(the)g(GNU)g(Free)g(Documentation)i
+(License,)f(Version)g(1.2)468 1026 y(or)f(any)g(later)g(version)h
+(published)h(by)d(the)h(Free)g(Software)h(Foundation;)468
+1113 y(with)g(no)e(Invariant)j(Sections,)f(no)f(Front-Cover)h(Texts,)g
+(and)f(no)f(Back-Cover)j(Texts.)468 1200 y(A)e(copy)g(of)g(the)g
+(license)g(is)g(included)h(in)f(the)g(section)h(entitled)g(``GNU)468
+1288 y(Free)g(Documentation)h(License''.)275 1410 y Fr(If)d(y)m(ou)h
+(ha)m(v)m(e)h(In)m(v)-5 b(arian)m(t)41 b(Sections,)i(F)-8
+b(ron)m(t-Co)m(v)m(er)42 b(T)-8 b(exts)41 b(and)e(Bac)m(k-Co)m(v)m(er)k
+(T)-8 b(exts,)43 b(replace)e(the)150 1520 y(\\with...T)-8
+b(exts.")43 b(line)30 b(with)h(this:)547 1632 y Fd(with)40
+b(the)g(Invariant)h(Sections)g(being)g Fc(list)f(their)g(titles)p
+Fd(,)h(with)547 1719 y(the)f(Front-Cover)i(Texts)e(being)g
+Fc(list)p Fd(,)h(and)f(with)g(the)g(Back-Cover)h(Texts)547
+1806 y(being)f Fc(list)p Fd(.)275 1929 y Fr(If)34 b(y)m(ou)i(ha)m(v)m
+(e)g(In)m(v)-5 b(arian)m(t)36 b(Sections)g(without)f(Co)m(v)m(er)h(T)-8
+b(exts,)38 b(or)d(some)g(other)h(com)m(bination)g(of)g(the)150
+2038 y(three,)31 b(merge)g(those)g(t)m(w)m(o)g(alternativ)m(es)i(to)e
+(suit)f(the)h(situation.)275 2173 y(If)23 b(y)m(our)h(do)s(cumen)m(t)f
+(con)m(tains)i(non)m(trivial)g(examples)g(of)f(program)f(co)s(de,)j(w)m
+(e)e(recommend)g(releasing)150 2283 y(these)44 b(examples)f(in)g
+(parallel)h(under)e(y)m(our)h(c)m(hoice)i(of)e(free)g(soft)m(w)m(are)h
+(license,)k(suc)m(h)43 b(as)g(the)g(GNU)150 2392 y(General)31
+b(Public)f(License,)i(to)f(p)s(ermit)e(their)i(use)f(in)g(free)g(soft)m
+(w)m(are.)p eop end
+%%Page: 20 24
+TeXDict begin 20 23 bop 150 -116 a Fr(20)2651 b(GNU)31
+b(History)g(Library)p eop end
+%%Page: 21 25
+TeXDict begin 21 24 bop 150 -116 a Fr(App)s(endix)29
+b(B:)i(Concept)f(Index)2391 b(21)150 299 y Fn(App)t(endix)52
+b(B)47 b(Concept)k(Index)150 638 y Fp(A)150 796 y Fb(anc)n(hored)26
+b(searc)n(h)7 b Fa(.)12 b(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h
+(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)
+g(.)33 b Fb(8)150 1138 y Fp(E)150 1296 y Fb(ev)n(en)n(t)25
+b(designators)d Fa(.)12 b(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g
+(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)46
+b Fb(1)2025 638 y Fp(F)2025 754 y Fb(FDL,)25 b(GNU)g(F)-6
+b(ree)26 b(Do)r(cumen)n(tation)g(License)11 b Fa(.)i(.)g(.)f(.)g(.)h(.)
+f(.)37 b Fb(13)2025 1005 y Fp(H)2025 1121 y Fb(history)25
+b(ev)n(en)n(ts)d Fa(.)13 b(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g
+(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)
+f(.)g(.)49 b Fb(1)2025 1209 y(history)25 b(expansion)15
+b Fa(.)e(.)f(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)
+f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)41 b
+Fb(1)2025 1296 y(History)25 b(Searc)n(hing)12 b Fa(.)h(.)f(.)h(.)f(.)g
+(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)
+f(.)g(.)h(.)f(.)g(.)h(.)38 b Fb(8)p eop end
+%%Page: 22 26
+TeXDict begin 22 25 bop 150 -116 a Fr(22)2651 b(GNU)31
+b(History)g(Library)p eop end
+%%Page: 23 27
+TeXDict begin 23 26 bop 150 -116 a Fr(App)s(endix)29
+b(C:)h(F)-8 b(unction)31 b(and)f(V)-8 b(ariable)32 b(Index)1832
+b(23)150 299 y Fn(App)t(endix)52 b(C)45 b(F)-13 b(unction)52
+b(and)h(V)-13 b(ariable)53 b(Index)150 638 y Fp(A)150
+755 y Fd(add_history)24 b Fa(.)12 b(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g
+(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)
+f(.)g(.)h(.)f(.)g(.)48 b Fb(6)150 842 y Fd(add_history_time)14
+b Fa(.)i(.)d(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)
+g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)40 b Fb(6)150
+929 y Fd(append_history)17 b Fa(.)f(.)c(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h
+(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)
+g(.)h(.)43 b Fb(9)150 1182 y Fp(C)150 1299 y Fd(clear_history)22
+b Fa(.)12 b(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h
+(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)45
+b Fb(7)150 1386 y Fd(current_history)16 b Fa(.)f(.)e(.)f(.)g(.)h(.)f(.)
+g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f
+(.)g(.)h(.)f(.)g(.)42 b Fb(7)150 1639 y Fp(F)150 1755
+y Fd(free_history_entry)11 b Fa(.)17 b(.)12 b(.)g(.)h(.)f(.)g(.)h(.)f
+(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)
+37 b Fb(6)150 2008 y Fp(G)150 2124 y Fd(get_history_event)13
+b Fa(.)j(.)c(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)
+g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)39 b Fb(9)150
+2377 y Fp(H)150 2494 y Fd(history_arg_extract)9 b Fa(.)17
+b(.)12 b(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)
+f(.)g(.)h(.)f(.)g(.)h(.)34 b Fb(10)150 2581 y Fd(history_base)22
+b Fa(.)12 b(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f
+(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)45
+b Fb(10)150 2669 y Fd(history_comment_char)7 b Fa(.)17
+b(.)c(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h
+(.)f(.)g(.)h(.)f(.)33 b Fb(10)150 2756 y Fd(history_expand)17
+b Fa(.)f(.)c(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)
+f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)43
+b Fb(9)150 2843 y Fd(history_expansion_char)28 b Fa(.)12
+b(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h
+(.)f(.)48 b Fb(10)150 2931 y Fd(history_get)24 b Fa(.)12
+b(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f
+(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)48
+b Fb(7)150 3018 y Fd(history_get_history_state)25 b Fa(.)12
+b(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)45
+b Fb(6)150 3106 y Fd(history_get_time)14 b Fa(.)i(.)d(.)f(.)g(.)h(.)f
+(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)
+h(.)f(.)g(.)h(.)40 b Fb(7)150 3193 y Fd(history_inhibit_expansion_fun)q
+(ctio)q(n)29 b Fa(.)12 b(.)h(.)f(.)g(.)h(.)f(.)49 b Fb(11)150
+3280 y Fd(history_is_stifled)11 b Fa(.)17 b(.)12 b(.)g(.)h(.)f(.)g(.)h
+(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)
+h(.)37 b Fb(7)150 3368 y Fd(history_length)16 b Fa(.)g(.)c(.)g(.)h(.)f
+(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)
+h(.)f(.)g(.)h(.)f(.)g(.)42 b Fb(10)150 3455 y Fd(history_list)23
+b Fa(.)12 b(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f
+(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)46
+b Fb(7)150 3543 y Fd(history_max_entries)9 b Fa(.)17
+b(.)12 b(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)
+f(.)g(.)h(.)f(.)g(.)h(.)34 b Fb(10)150 3630 y Fd
+(history_no_expand_chars)26 b Fa(.)13 b(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g
+(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)47 b Fb(11)150
+3718 y Fd(history_quotes_inhibit_expans)q(ion)9 b Fa(.)18
+b(.)12 b(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)34 b Fb(11)150
+3805 y Fd(history_search)17 b Fa(.)f(.)c(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)
+h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f
+(.)g(.)h(.)43 b Fb(8)150 3892 y Fd(history_search_delimiter_char)q(s)11
+b Fa(.)18 b(.)13 b(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)37
+b Fb(10)150 3980 y Fd(history_search_pos)11 b Fa(.)17
+b(.)12 b(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)
+g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)37 b Fb(8)2025 638 y
+Fd(history_search_prefix)7 b Fa(.)17 b(.)12 b(.)h(.)f(.)g(.)g(.)h(.)f
+(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)33
+b Fb(8)2025 725 y Fd(history_set_history_state)25 b Fa(.)12
+b(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)46
+b Fb(6)2025 813 y Fd(history_set_pos)16 b Fa(.)f(.)e(.)f(.)g(.)h(.)f(.)
+g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h
+(.)f(.)g(.)h(.)f(.)42 b Fb(8)2025 900 y Fd(history_subst_char)10
+b Fa(.)17 b(.)12 b(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f
+(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)36 b Fb(10)2025
+987 y Fd(history_tokenize)13 b Fa(.)j(.)c(.)h(.)f(.)g(.)h(.)f(.)g(.)h
+(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)
+39 b Fb(10)2025 1074 y Fd(history_total_bytes)10 b Fa(.)16
+b(.)d(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h
+(.)f(.)g(.)h(.)f(.)g(.)h(.)36 b Fb(7)2025 1162 y Fd
+(history_truncate_file)7 b Fa(.)17 b(.)12 b(.)h(.)f(.)g(.)g(.)h(.)f(.)g
+(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)33
+b Fb(9)2025 1249 y Fd(history_word_delimiters)26 b Fa(.)13
+b(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f
+(.)47 b Fb(10)2025 1336 y Fd(history_write_timestamps)25
+b Fa(.)12 b(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g
+(.)g(.)46 b Fb(10)2025 1588 y Fp(N)2025 1704 y Fd(next_history)23
+b Fa(.)12 b(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h
+(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)46
+b Fb(8)2025 1956 y Fp(P)2025 2072 y Fd(previous_history)14
+b Fa(.)i(.)c(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)
+g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)41 b Fb(8)2025
+2324 y Fp(R)2025 2440 y Fd(read_history)23 b Fa(.)12
+b(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g
+(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)46
+b Fb(9)2025 2527 y Fd(read_history_range)11 b Fa(.)17
+b(.)12 b(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)
+f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)38 b Fb(9)2025 2614 y
+Fd(remove_history)17 b Fa(.)e(.)e(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h
+(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)
+g(.)44 b Fb(6)2025 2702 y Fd(replace_history_entry)7
+b Fa(.)17 b(.)12 b(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g
+(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)33 b Fb(7)2025 2953 y
+Fp(S)2025 3069 y Fd(stifle_history)17 b Fa(.)e(.)e(.)f(.)g(.)h(.)f(.)g
+(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)
+g(.)h(.)f(.)g(.)g(.)44 b Fb(7)2025 3321 y Fp(U)2025 3437
+y Fd(unstifle_history)14 b Fa(.)i(.)c(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f
+(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)
+41 b Fb(7)2025 3525 y Fd(using_history)21 b Fa(.)13 b(.)f(.)g(.)h(.)f
+(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)
+h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)45 b Fb(6)2025 3776 y
+Fp(W)2025 3893 y Fd(where_history)21 b Fa(.)13 b(.)f(.)g(.)h(.)f(.)g(.)
+h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f
+(.)g(.)h(.)f(.)g(.)h(.)f(.)45 b Fb(7)2025 3980 y Fd(write_history)21
+b Fa(.)13 b(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h
+(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)45
+b Fb(9)p eop end
+%%Page: 24 28
+TeXDict begin 24 27 bop 150 -116 a Fr(24)2651 b(GNU)31
+b(History)g(Library)p eop end
+%%Trailer
+
+userdict /end-hook known{end-hook}if
+%%EOF
diff --git a/doc/history.texi b/doc/history.texi
new file mode 100644 (file)
index 0000000..1af40c7
--- /dev/null
@@ -0,0 +1,104 @@
+\input texinfo    @c -*-texinfo-*-
+@c %**start of header (This is for running Texinfo on a region.)
+@setfilename history.info
+@settitle GNU History Library
+@c %**end of header (This is for running Texinfo on a region.)
+
+@setchapternewpage odd
+
+@include version.texi
+
+@copying
+This document describes the GNU History library
+(version @value{VERSION}, @value{UPDATED}),
+a programming tool that provides a consistent user interface for
+recalling lines of previously typed input.
+
+Copyright @copyright{} 1988-2006 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.
+
+@quotation
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.2 or
+any later version published by the Free Software Foundation; with no
+Invariant Sections, with the Front-Cover texts being ``A GNU Manual,''
+and with the Back-Cover Texts as in (a) below.  A copy of the license is
+included in the section entitled ``GNU Free Documentation License.''
+
+(a) The FSF's Back-Cover Text is: ``You have freedom to copy and modify
+this GNU Manual, like GNU software.  Copies published by the Free
+Software Foundation raise funds for GNU development.''
+@end quotation
+@end copying
+
+@dircategory Libraries
+@direntry
+* History: (history).       The GNU history library API.
+@end direntry
+
+@titlepage
+@title GNU History Library
+@subtitle Edition @value{EDITION}, for @code{History Library} Version @value{VERSION}.
+@subtitle @value{UPDATED-MONTH}
+@author Chet Ramey, Case Western Reserve University
+@author Brian Fox, Free Software Foundation
+
+@page
+
+@vskip 0pt plus 1filll
+@insertcopying
+
+@sp 1
+Published by the Free Software Foundation @*
+59 Temple Place, Suite 330, @*
+Boston, MA 02111-1307 @*
+USA @*
+
+@end titlepage
+
+@contents
+
+@ifnottex
+@node Top
+@top GNU History Library
+
+This document describes the GNU History library, a programming tool that
+provides a consistent user interface for recalling lines of previously
+typed input.
+
+@menu
+* Using History Interactively::          GNU History User's Manual.
+* Programming with GNU History::  GNU History Programmer's Manual.
+* Copying This Manual::                  Copying This Manual.
+* Concept Index::                Index of concepts described in this manual.
+* Function and Variable Index::          Index of externally visible functions
+                                 and variables.
+@end menu
+@end ifnottex
+
+@syncodeindex fn vr
+
+@include hsuser.texi
+@include hstech.texi
+
+@node Copying This Manual
+@appendix Copying This Manual
+
+@menu
+* GNU Free Documentation License::     License for copying this manual.
+@end menu
+
+@include fdl.texi
+
+@node Concept Index
+@appendix Concept Index
+@printindex cp
+
+@node Function and Variable Index
+@appendix Function and Variable Index
+@printindex vr
+
+@bye
diff --git a/doc/history_3.ps b/doc/history_3.ps
new file mode 100644 (file)
index 0000000..855292b
--- /dev/null
@@ -0,0 +1,829 @@
+%!PS-Adobe-3.0
+%%Creator: groff version 1.18.1
+%%CreationDate: Mon Sep 22 09:15:44 2003
+%%DocumentNeededResources: font Times-Roman
+%%+ font Times-Bold
+%%+ font Times-Italic
+%%DocumentSuppliedResources: procset grops 1.18 1
+%%Pages: 7
+%%PageOrder: Ascend
+%%Orientation: Portrait
+%%EndComments
+%%BeginProlog
+%%BeginResource: procset grops 1.18 1
+/setpacking where{
+pop
+currentpacking
+true setpacking
+}if
+/grops 120 dict dup begin
+/SC 32 def
+/A/show load def
+/B{0 SC 3 -1 roll widthshow}bind def
+/C{0 exch ashow}bind def
+/D{0 exch 0 SC 5 2 roll awidthshow}bind def
+/E{0 rmoveto show}bind def
+/F{0 rmoveto 0 SC 3 -1 roll widthshow}bind def
+/G{0 rmoveto 0 exch ashow}bind def
+/H{0 rmoveto 0 exch 0 SC 5 2 roll awidthshow}bind def
+/I{0 exch rmoveto show}bind def
+/J{0 exch rmoveto 0 SC 3 -1 roll widthshow}bind def
+/K{0 exch rmoveto 0 exch ashow}bind def
+/L{0 exch rmoveto 0 exch 0 SC 5 2 roll awidthshow}bind def
+/M{rmoveto show}bind def
+/N{rmoveto 0 SC 3 -1 roll widthshow}bind def
+/O{rmoveto 0 exch ashow}bind def
+/P{rmoveto 0 exch 0 SC 5 2 roll awidthshow}bind def
+/Q{moveto show}bind def
+/R{moveto 0 SC 3 -1 roll widthshow}bind def
+/S{moveto 0 exch ashow}bind def
+/T{moveto 0 exch 0 SC 5 2 roll awidthshow}bind def
+/SF{
+findfont exch
+[exch dup 0 exch 0 exch neg 0 0]makefont
+dup setfont
+[exch/setfont cvx]cvx bind def
+}bind def
+/MF{
+findfont
+[5 2 roll
+0 3 1 roll
+neg 0 0]makefont
+dup setfont
+[exch/setfont cvx]cvx bind def
+}bind def
+/level0 0 def
+/RES 0 def
+/PL 0 def
+/LS 0 def
+/MANUAL{
+statusdict begin/manualfeed true store end
+}bind def
+/PLG{
+gsave newpath clippath pathbbox grestore
+exch pop add exch pop
+}bind def
+/BP{
+/level0 save def
+1 setlinecap
+1 setlinejoin
+72 RES div dup scale
+LS{
+90 rotate
+}{
+0 PL translate
+}ifelse
+1 -1 scale
+}bind def
+/EP{
+level0 restore
+showpage
+}bind def
+/DA{
+newpath arcn stroke
+}bind def
+/SN{
+transform
+.25 sub exch .25 sub exch
+round .25 add exch round .25 add exch
+itransform
+}bind def
+/DL{
+SN
+moveto
+SN
+lineto stroke
+}bind def
+/DC{
+newpath 0 360 arc closepath
+}bind def
+/TM matrix def
+/DE{
+TM currentmatrix pop
+translate scale newpath 0 0 .5 0 360 arc closepath
+TM setmatrix
+}bind def
+/RC/rcurveto load def
+/RL/rlineto load def
+/ST/stroke load def
+/MT/moveto load def
+/CL/closepath load def
+/Fr{
+setrgbcolor fill
+}bind def
+/Fk{
+setcmykcolor fill
+}bind def
+/Fg{
+setgray fill
+}bind def
+/FL/fill load def
+/LW/setlinewidth load def
+/Cr/setrgbcolor load def
+/Ck/setcmykcolor load def
+/Cg/setgray load def
+/RE{
+findfont
+dup maxlength 1 index/FontName known not{1 add}if dict begin
+{
+1 index/FID ne{def}{pop pop}ifelse
+}forall
+/Encoding exch def
+dup/FontName exch def
+currentdict end definefont pop
+}bind def
+/DEFS 0 def
+/EBEGIN{
+moveto
+DEFS begin
+}bind def
+/EEND/end load def
+/CNT 0 def
+/level1 0 def
+/PBEGIN{
+/level1 save def
+translate
+div 3 1 roll div exch scale
+neg exch neg exch translate
+0 setgray
+0 setlinecap
+1 setlinewidth
+0 setlinejoin
+10 setmiterlimit
+[]0 setdash
+/setstrokeadjust where{
+pop
+false setstrokeadjust
+}if
+/setoverprint where{
+pop
+false setoverprint
+}if
+newpath
+/CNT countdictstack def
+userdict begin
+/showpage{}def
+}bind def
+/PEND{
+clear
+countdictstack CNT sub{end}repeat
+level1 restore
+}bind def
+end def
+/setpacking where{
+pop
+setpacking
+}if
+%%EndResource
+%%IncludeResource: font Times-Roman
+%%IncludeResource: font Times-Bold
+%%IncludeResource: font Times-Italic
+grops begin/DEFS 1 dict def DEFS begin/u{.001 mul}bind def end/RES 72
+def/PL 792 def/LS false def/ENC0[/asciicircum/asciitilde/Scaron/Zcaron
+/scaron/zcaron/Ydieresis/trademark/quotesingle/Euro/.notdef/.notdef
+/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
+/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
+/.notdef/.notdef/space/exclam/quotedbl/numbersign/dollar/percent
+/ampersand/quoteright/parenleft/parenright/asterisk/plus/comma/hyphen
+/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon
+/semicolon/less/equal/greater/question/at/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O
+/P/Q/R/S/T/U/V/W/X/Y/Z/bracketleft/backslash/bracketright/circumflex
+/underscore/quoteleft/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y
+/z/braceleft/bar/braceright/tilde/.notdef/quotesinglbase/guillemotleft
+/guillemotright/bullet/florin/fraction/perthousand/dagger/daggerdbl
+/endash/emdash/ff/fi/fl/ffi/ffl/dotlessi/dotlessj/grave/hungarumlaut
+/dotaccent/breve/caron/ring/ogonek/quotedblleft/quotedblright/oe/lslash
+/quotedblbase/OE/Lslash/.notdef/exclamdown/cent/sterling/currency/yen
+/brokenbar/section/dieresis/copyright/ordfeminine/guilsinglleft
+/logicalnot/minus/registered/macron/degree/plusminus/twosuperior
+/threesuperior/acute/mu/paragraph/periodcentered/cedilla/onesuperior
+/ordmasculine/guilsinglright/onequarter/onehalf/threequarters
+/questiondown/Agrave/Aacute/Acircumflex/Atilde/Adieresis/Aring/AE
+/Ccedilla/Egrave/Eacute/Ecircumflex/Edieresis/Igrave/Iacute/Icircumflex
+/Idieresis/Eth/Ntilde/Ograve/Oacute/Ocircumflex/Otilde/Odieresis
+/multiply/Oslash/Ugrave/Uacute/Ucircumflex/Udieresis/Yacute/Thorn
+/germandbls/agrave/aacute/acircumflex/atilde/adieresis/aring/ae/ccedilla
+/egrave/eacute/ecircumflex/edieresis/igrave/iacute/icircumflex/idieresis
+/eth/ntilde/ograve/oacute/ocircumflex/otilde/odieresis/divide/oslash
+/ugrave/uacute/ucircumflex/udieresis/yacute/thorn/ydieresis]def
+/Times-Italic@0 ENC0/Times-Italic RE/Times-Bold@0 ENC0/Times-Bold RE
+/Times-Roman@0 ENC0/Times-Roman RE
+%%EndProlog
+%%Page: 1 1
+%%BeginPageSetup
+BP
+%%EndPageSetup
+/F0 10/Times-Roman@0 SF(HIST)72 48 Q(OR)-.18 E 357.18(Y\(3\) HIST)-.65 F
+(OR)-.18 E(Y\(3\))-.65 E/F1 10.95/Times-Bold@0 SF -.219(NA)72 84 S(ME)
+.219 E F0(history \255 GNU History Library)108 96 Q F1(COPYRIGHT)72
+112.8 Q F0(The GNU History Library is Cop)108 124.8 Q
+(yright \251 1989-2002 by the Free Softw)-.1 E(are F)-.1 E
+(oundation, Inc.)-.15 E F1(DESCRIPTION)72 141.6 Q F0(Man)108 153.6 Q
+2.81(yp)-.15 G .31(rograms read input from the user a line at a time.)
+-2.81 F .309(The GNU History library is able to k)5.309 F .309
+(eep track of)-.1 F .024(those lines, associate arbitrary data with eac\
+h line, and utilize information from pre)108 165.6 R .024
+(vious lines in composing)-.25 F(ne)108 177.6 Q 2.5(wo)-.25 G(nes.)-2.5
+E F1(HIST)72 199.2 Q(OR)-.197 E 2.738(YE)-.383 G(XP)-2.738 E(ANSION)-.81
+E F0 .823(The history library supports a history e)108 211.2 R .822
+(xpansion feature that is identical to the history e)-.15 F .822
+(xpansion in)-.15 F/F2 10/Times-Bold@0 SF(bash.)3.322 E F0
+(This section describes what syntax features are a)108 223.2 Q -.25(va)
+-.2 G(ilable.).25 E 1.305(History e)108 240 R 1.305
+(xpansions introduce w)-.15 F 1.306(ords from the history list into the\
+ input stream, making it easy to repeat)-.1 F .21
+(commands, insert the ar)108 252 R .21(guments to a pre)-.18 F .209
+(vious command into the current input line, or \214x errors in pre)-.25
+F(vious)-.25 E(commands quickly)108 264 Q(.)-.65 E 1.296(History e)108
+280.8 R 1.297(xpansion is usually performed immediately after a complet\
+e line is read.)-.15 F 1.297(It tak)6.297 F 1.297(es place in tw)-.1 F
+(o)-.1 E 2.855(parts. The)108 292.8 R .354(\214rst is to determine whic\
+h line from the history list to use during substitution.)2.855 F .354
+(The second is to)5.354 F .116
+(select portions of that line for inclusion into the current one.)108
+304.8 R .117(The line selected from the history is the)5.116 F/F3 10
+/Times-Italic@0 SF -.15(ev)2.617 G(ent).15 E F0(,)A .846
+(and the portions of that line that are acted upon are)108 316.8 R F3
+(wor)3.346 E(ds)-.37 E F0 5.846(.V)C(arious)-6.956 E F3(modi\214er)3.346
+E(s)-.1 E F0 .846(are a)3.346 F -.25(va)-.2 G .845(ilable to manipulate)
+.25 F .304(the selected w)108 328.8 R 2.804(ords. The)-.1 F .304
+(line is brok)2.804 F .304(en into w)-.1 F .304(ords in the same f)-.1 F
+.304(ashion as)-.1 F F2(bash)2.804 E F0 .305
+(does when reading input, so)2.804 F .539(that se)108 340.8 R -.15(ve)
+-.25 G .539(ral w).15 F .539(ords that w)-.1 F .539
+(ould otherwise be separated are considered one w)-.1 F .538
+(ord when surrounded by quotes)-.1 F .307(\(see the description of)108
+352.8 R F2(history_tok)2.807 E(enize\(\))-.1 E F0(belo)2.807 E 2.807
+(w\). History)-.25 F -.15(ex)2.807 G .307
+(pansions are introduced by the appearance of).15 F .52(the history e)
+108 364.8 R .52(xpansion character)-.15 F 3.02(,w)-.4 G .52(hich is)
+-3.02 F F2(!)3.853 E F0 .52(by def)3.853 F 3.02(ault. Only)-.1 F .52
+(backslash \()3.02 F F2(\\).833 E F0 3.02(\)a).833 G .52
+(nd single quotes can quote the)-3.02 F(history e)108 376.8 Q
+(xpansion character)-.15 E(.)-.55 E F2(Ev)87 393.6 Q(ent Designators)-.1
+E F0(An e)108 405.6 Q -.15(ve)-.25 G(nt designator is a reference to a \
+command line entry in the history list.).15 E F2(!)108 422.4 Q F0
+(Start a history substitution, e)32.67 E(xcept when follo)-.15 E
+(wed by a)-.25 E F2(blank)2.5 E F0 2.5(,n)C -.25(ew)-2.5 G
+(line, = or \(.).25 E F2(!)108 434.4 Q F3(n)A F0(Refer to command line)
+27.67 E F3(n)2.5 E F0(.).24 E F2<21ad>108 446.4 Q F3(n)A F0
+(Refer to the current command line minus)21.97 E F3(n)2.5 E F0(.).24 E
+F2(!!)108 458.4 Q F0(Refer to the pre)29.34 E(vious command.)-.25 E
+(This is a synon)5 E(ym for `!\2551'.)-.15 E F2(!)108 470.4 Q F3(string)
+A F0(Refer to the most recent command starting with)9.33 E F3(string)2.5
+E F0(.).22 E F2(!?)108 482.4 Q F3(string)A F2([?])A F0 1.022
+(Refer to the most recent command containing)144 494.4 R F3(string)3.522
+E F0 6.022(.T).22 G 1.022(he trailing)-6.022 F F2(?)3.522 E F0 1.022
+(may be omitted if)3.522 F F3(string)3.862 E F0(is)3.742 E(follo)144
+506.4 Q(wed immediately by a ne)-.25 E(wline.)-.25 E/F4 12/Times-Bold@0
+SF(^)108 523.4 Q F3(string1)-5 I F4(^)5 I F3(string2)-5 I F4(^)5 I F0
+2.63(Quick substitution.)144 530.4 R 2.629
+(Repeat the last command, replacing)7.629 F F3(string1)5.469 E F0(with)
+5.129 E F3(string2)5.129 E F0 7.629(.E).02 G(qui)-7.629 E -.25(va)-.25 G
+2.629(lent to).25 F -.74(``)144 542.4 S(!!:s/).74 E F3(string1)A F0(/)A
+F3(string2)A F0(/')A 2.5('\()-.74 G(see)-2.5 E F2(Modi\214ers)2.5 E F0
+(belo)2.5 E(w\).)-.25 E F2(!#)108 554.4 Q F0
+(The entire command line typed so f)27.67 E(ar)-.1 E(.)-.55 E F2 -.75
+(Wo)87 571.2 S(rd Designators).75 E F0 -.8(Wo)108 583.2 S 1.313
+(rd designators are used to select desired w).8 F 1.314(ords from the e)
+-.1 F -.15(ve)-.25 G 3.814(nt. A).15 F F2(:)3.814 E F0 1.314
+(separates the e)3.814 F -.15(ve)-.25 G 1.314(nt speci\214cation).15 F
+.53(from the w)108 595.2 R .529(ord designator)-.1 F 5.529(.I)-.55 G
+3.029(tm)-5.529 G .529(ay be omitted if the w)-3.029 F .529
+(ord designator be)-.1 F .529(gins with a)-.15 F F2(^)3.029 E F0(,)A F2
+($)3.029 E F0(,)A F2(*)3.029 E F0(,)A F2<ad>3.029 E F0 3.029(,o)C(r)
+-3.029 E F2(%)3.029 E F0 5.529(.W)C(ords)-6.329 E 1.3
+(are numbered from the be)108 607.2 R 1.3
+(ginning of the line, with the \214rst w)-.15 F 1.301
+(ord being denoted by 0 \(zero\).)-.1 F -.8(Wo)6.301 G 1.301(rds are).8
+F(inserted into the current line separated by single spaces.)108 619.2 Q
+F2 2.5(0\()108 636 S(zer)-2.5 E(o\))-.18 E F0(The zeroth w)144 648 Q 2.5
+(ord. F)-.1 F(or the shell, this is the command w)-.15 E(ord.)-.1 E F3
+(n)108.36 660 Q F0(The)30.64 E F3(n)2.5 E F0(th w)A(ord.)-.1 E F2(^)108
+672 Q F0(The \214rst ar)32.67 E 2.5(gument. That)-.18 F(is, w)2.5 E
+(ord 1.)-.1 E F2($)108 684 Q F0(The last ar)31 E(gument.)-.18 E F2(%)108
+696 Q F0(The w)26 E(ord matched by the most recent `?)-.1 E F3(string)A
+F0(?' search.)A F3(x)108.77 708 Q F2<ad>A F3(y)A F0 2.5(Ar)20.65 G
+(ange of w)-2.5 E(ords; `\255)-.1 E F3(y)A F0 2.5('a)C(bbre)-2.5 E
+(viates `0\255)-.25 E F3(y)A F0('.)A(GNU History 5.0)72 768 Q
+(2003 July 31)139.005 E(1)203.165 E 0 Cg EP
+%%Page: 2 2
+%%BeginPageSetup
+BP
+%%EndPageSetup
+/F0 10/Times-Roman@0 SF(HIST)72 48 Q(OR)-.18 E 357.18(Y\(3\) HIST)-.65 F
+(OR)-.18 E(Y\(3\))-.65 E/F1 10/Times-Bold@0 SF(*)108 84 Q F0 .316
+(All of the w)31 F .316(ords b)-.1 F .316(ut the zeroth.)-.2 F .315
+(This is a synon)5.315 F .315(ym for `)-.15 F/F2 10/Times-Italic@0 SF
+(1\255$)A F0 2.815('. It)B .315(is not an error to use)2.815 F F1(*)
+2.815 E F0 .315(if there is)2.815 F(just one w)144 96 Q(ord in the e)-.1
+E -.15(ve)-.25 G(nt; the empty string is returned in that case.).15 E F1
+(x*)108 108 Q F0(Abbre)26 E(viates)-.25 E F2(x\255$)2.5 E F0(.)A F1
+<78ad>108 120 Q F0(Abbre)25.3 E(viates)-.25 E F2(x\255$)2.5 E F0(lik)2.5
+E(e)-.1 E F1(x*)2.5 E F0 2.5(,b)C(ut omits the last w)-2.7 E(ord.)-.1 E
+(If a w)108 136.8 Q(ord designator is supplied without an e)-.1 E -.15
+(ve)-.25 G(nt speci\214cation, the pre).15 E
+(vious command is used as the e)-.25 E -.15(ve)-.25 G(nt.).15 E F1
+(Modi\214ers)87 153.6 Q F0 .183(After the optional w)108 165.6 R .183
+(ord designator)-.1 F 2.683(,t)-.4 G .184
+(here may appear a sequence of one or more of the follo)-2.683 F .184
+(wing modi\214ers,)-.25 F(each preceded by a `:'.)108 177.6 Q F1(h)108
+194.4 Q F0(Remo)30.44 E .3 -.15(ve a t)-.15 H
+(railing \214le name component, lea).15 E(ving only the head.)-.2 E F1
+(t)108 206.4 Q F0(Remo)32.67 E .3 -.15(ve a)-.15 H
+(ll leading \214le name components, lea).15 E(ving the tail.)-.2 E F1(r)
+108 218.4 Q F0(Remo)31.56 E .3 -.15(ve a t)-.15 H(railing suf).15 E
+(\214x of the form)-.25 E F2(.xxx)2.5 E F0 2.5(,l)C(ea)-2.5 E
+(ving the basename.)-.2 E F1(e)108 230.4 Q F0(Remo)31.56 E .3 -.15(ve a)
+-.15 H(ll b).15 E(ut the trailing suf)-.2 E(\214x.)-.25 E F1(p)108 242.4
+Q F0(Print the ne)30.44 E 2.5(wc)-.25 G(ommand b)-2.5 E(ut do not e)-.2
+E -.15(xe)-.15 G(cute it.).15 E F1(q)108 254.4 Q F0
+(Quote the substituted w)30.44 E(ords, escaping further substitutions.)
+-.1 E F1(x)108 266.4 Q F0(Quote the substituted w)31 E(ords as with)-.1
+E F1(q)2.5 E F0 2.5(,b)C(ut break into w)-2.7 E(ords at)-.1 E F1(blanks)
+2.5 E F0(and ne)2.5 E(wlines.)-.25 E F1(s/)108 278.4 Q F2(old)A F1(/)A
+F2(ne)A(w)-.15 E F1(/)A F0(Substitute)144 290.4 Q F2(ne)3.082 E(w)-.15 E
+F0 .221(for the \214rst occurrence of)3.032 F F2(old)2.951 E F0 .221
+(in the e)3.491 F -.15(ve)-.25 G .221(nt line.).15 F(An)5.221 E 2.721
+(yd)-.15 G .221(elimiter can be used in place)-2.721 F .616(of /.)144
+302.4 R .617
+(The \214nal delimiter is optional if it is the last character of the e)
+5.616 F -.15(ve)-.25 G .617(nt line.).15 F .617(The delimiter may)5.617
+F .666(be quoted in)144 314.4 R F2(old)3.396 E F0(and)3.936 E F2(ne)
+3.526 E(w)-.15 E F0 .666(with a single backslash.)3.476 F .666
+(If & appears in)5.666 F F2(ne)3.166 E(w)-.15 E F0 3.166(,i).31 G 3.166
+(ti)-3.166 G 3.166(sr)-3.166 G .666(eplaced by)-3.166 F F2(old)3.166 E
+F0 5.666(.A).77 G .274(single backslash will quote the &.)144 326.4 R
+(If)5.274 E F2(old)3.004 E F0 .274(is null, it is set to the last)3.544
+F F2(old)3.005 E F0 .275(substituted, or)3.545 F 2.775(,i)-.4 G 2.775
+(fn)-2.775 G 2.775(op)-2.775 G(re)-2.775 E(vi-)-.25 E
+(ous history substitutions took place, the last)144 338.4 Q F2(string)
+2.84 E F0(in a)2.72 E F1(!?)2.5 E F2(string)A F1([?])A F0(search.)5 E F1
+(&)108 350.4 Q F0(Repeat the pre)27.67 E(vious substitution.)-.25 E F1
+(g)108 362.4 Q F0 .398(Cause changes to be applied o)31 F -.15(ve)-.15 G
+2.898(rt).15 G .398(he entire e)-2.898 F -.15(ve)-.25 G .398(nt line.)
+.15 F .397(This is used in conjunction with `)5.398 F F1(:s)A F0 2.897
+('\()C(e.g.,)-2.897 E(`)144 374.4 Q F1(:gs/)A F2(old)A F1(/)A F2(ne)A(w)
+-.15 E F1(/)A F0 1.218('\) or `)B F1(:&)A F0 3.718('. If)B 1.218
+(used with `)3.718 F F1(:s)A F0 1.218(', an)B 3.718(yd)-.15 G 1.219
+(elimiter can be used in place of /, and the \214nal)-3.718 F .09
+(delimiter is optional if it is the last character of the e)144 386.4 R
+-.15(ve)-.25 G .089(nt line.).15 F(An)5.089 E F1(a)2.589 E F0 .089
+(may be used as a synon)2.589 F .089(ym for)-.15 F F1(g)144 398.4 Q F0
+(.)A F1(G)108 410.4 Q F0(Apply the follo)28.22 E(wing `)-.25 E F1(s)A F0
+2.5('m)C(odi\214er once to each w)-2.5 E(ord in the e)-.1 E -.15(ve)-.25
+G(nt line.).15 E/F3 10.95/Times-Bold@0 SF(PR)72 427.2 Q
+(OGRAMMING WITH HIST)-.329 E(OR)-.197 E 2.738(YF)-.383 G(UNCTIONS)-2.738
+E F0(This section describes ho)108 439.2 Q 2.5(wt)-.25 G 2.5(ou)-2.5 G
+(se the History library in other programs.)-2.5 E F1(Intr)87 456 Q
+(oduction to History)-.18 E F0 .796
+(The programmer using the History library has a)108 468 R -.25(va)-.2 G
+.797(ilable functions for remembering lines on a history list,).25 F
+.308(associating arbitrary data with a line, remo)108 480 R .308
+(ving lines from the list, searching through the list for a line con-)
+-.15 F .303(taining an arbitrary te)108 492 R .303
+(xt string, and referencing an)-.15 F 2.803(yl)-.15 G .303
+(ine in the list directly)-2.803 F 5.303(.I)-.65 G 2.803(na)-5.303 G
+.303(ddition, a history)-2.803 F F2 -.2(ex)2.803 G(pansion).2 E F0
+(function is a)108 504 Q -.25(va)-.2 G(ilable which pro).25 E
+(vides for a consistent user interf)-.15 E(ace across dif)-.1 E
+(ferent programs.)-.25 E .059(The user using programs written with the \
+History library has the bene\214t of a consistent user interf)108 520.8
+R .058(ace with a)-.1 F .917(set of well-kno)108 532.8 R .917
+(wn commands for manipulating the te)-.25 F .917(xt of pre)-.15 F .917
+(vious lines and using that te)-.25 F .917(xt in ne)-.15 F 3.418(wc)-.25
+G(om-)-3.418 E 4.184(mands. The)108 544.8 R 1.684(basic history manipul\
+ation commands are identical to the history substitution pro)4.184 F
+1.683(vided by)-.15 F F1(bash)108 556.8 Q F0(.)A .903
+(If the programmer desires, he can use the Readline library)108 573.6 R
+3.403(,w)-.65 G .904(hich includes some history manipulation by)-3.403 F
+(def)108 585.6 Q(ault, and has the added adv)-.1 E
+(antage of command line editing.)-.25 E .39(Before declaring an)108
+602.4 R 2.89(yf)-.15 G .39(unctions using an)-2.89 F 2.89(yf)-.15 G .39
+(unctionality the History library pro)-2.89 F .39
+(vides in other code, an appli-)-.15 F .066
+(cation writer should include the \214le)108 614.4 R F2(<r)4.232 E
+(eadline/history)-.37 E(.h>)-.55 E F0 .067(in an)4.232 F 2.567<798c>-.15
+G .067(le that uses the History library')-2.567 F 2.567(sf)-.55 G
+(eatures.)-2.567 E .539(It supplies e)108 626.4 R .538
+(xtern declarations for all of the library')-.15 F 3.038(sp)-.55 G .538
+(ublic functions and v)-3.038 F .538(ariables, and declares all of the)
+-.25 F(public data structures.)108 638.4 Q F1(History Storage)87 667.2 Q
+F0(The history list is an array of history entries.)108 679.2 Q 2.5(Ah)5
+G(istory entry is declared as follo)-2.5 E(ws:)-.25 E F2(typedef void *)
+108 696 Q F1(histdata_t;)2.5 E F0(typedef struct _hist_entry {)108 712.8
+Q(char *line;)113 724.8 Q(GNU History 5.0)72 768 Q(2003 July 31)139.005
+E(2)203.165 E 0 Cg EP
+%%Page: 3 3
+%%BeginPageSetup
+BP
+%%EndPageSetup
+/F0 10/Times-Roman@0 SF(HIST)72 48 Q(OR)-.18 E 357.18(Y\(3\) HIST)-.65 F
+(OR)-.18 E(Y\(3\))-.65 E(char *timestamp;)113 84 Q(histdata_t data;)113
+96 Q 2.5(}H)108 108 S(IST_ENTR)-2.5 E -.92(Y;)-.65 G
+(The history list itself might therefore be declared as)108 124.8 Q/F1
+10/Times-Italic@0 SF(HIST_ENTR)108 141.6 Q 2.5(Y*)-.18 G(*)-2.5 E/F2 10
+/Times-Bold@0 SF(the_history_list;)2.5 E F0(The state of the History li\
+brary is encapsulated into a single structure:)108 158.4 Q(/*)108 175.2
+Q 2.5(*As)110.5 187.2 S
+(tructure used to pass around the current state of the history)-2.5 E(.)
+-.65 E(*/)110.5 199.2 Q(typedef struct _hist_state {)108 211.2 Q
+(HIST_ENTR)113 223.2 Q 2.5(Y*)-.65 G
+(*entries; /* Pointer to the entries themselv)-2.5 E(es. */)-.15 E
+(int of)113 235.2 Q 25(fset; /*)-.25 F
+(The location pointer within this array)2.5 E 2.5(.*)-.65 G(/)-2.5 E
+(int length;)113 247.2 Q(/* Number of elements within this array)27.5 E
+2.5(.*)-.65 G(/)-2.5 E(int size;)113 259.2 Q
+(/* Number of slots allocated to this array)32.5 E 2.5(.*)-.65 G(/)-2.5
+E(int \215ags;)113 271.2 Q 2.5(}H)108 283.2 S(IST)-2.5 E(OR)-.18 E(Y_ST)
+-.65 E -1.11(AT)-.93 G(E;)1.11 E(If the \215ags member includes)108 300
+Q F2(HS_STIFLED)2.5 E F0 2.5(,t)C(he history has been sti\215ed.)-2.5 E
+/F3 10.95/Times-Bold@0 SF(History Functions)72 316.8 Q F0
+(This section describes the calling sequence for the v)108 328.8 Q
+(arious functions e)-.25 E(xported by the GNU History library)-.15 E(.)
+-.65 E F2(Initializing History and State Management)87 345.6 Q F0 1.274
+(This section describes functions used to initialize and manage the sta\
+te of the History library when you)108 357.6 R -.1(wa)108 369.6 S
+(nt to use the history functions in your program.).1 E F1(void)108 393.6
+Q F2(using_history)2.5 E F0(\()4.166 E F1(void)A F0(\))1.666 E(Be)108
+405.6 Q(gin a session in which the history functions might be used.)-.15
+E(This initializes the interacti)5 E .3 -.15(ve v)-.25 H(ariables.)-.1 E
+F1(HIST)108 429.6 Q(OR)-.18 E(Y_ST)-.18 E -.37(AT)-.5 G 2.5(E*).37 G F2
+(history_get_history_state)A F0(\()4.166 E F1(void)A F0(\))1.666 E
+(Return a structure describing the current state of the input history)
+108 441.6 Q(.)-.65 E F1(void)108 465.6 Q F2(history_set_history_state)
+2.5 E F0(\()4.166 E F1(HIST)A(OR)-.18 E(Y_ST)-.18 E -.37(AT)-.5 G 2.5
+(E*).37 G(state)-2.5 E F0(\))1.666 E
+(Set the state of the history list according to)108 477.6 Q F1(state)2.5
+E F0(.)A F2(History List Management)87 506.4 Q F0
+(These functions manage indi)108 518.4 Q(vidual entries on the history \
+list, or set parameters managing the list itself.)-.25 E F1(void)108
+542.4 Q F2(add_history)2.5 E F0(\()4.166 E F1(const c)A(har *string)-.15
+E F0(\))1.666 E(Place)108 554.4 Q F1(string)2.5 E F0
+(at the end of the history list.)2.5 E
+(The associated data \214eld \(if an)5 E(y\) is set to)-.15 E F2(NULL)
+2.5 E F0(.)A F1(void)108 578.4 Q F2(add_history_time)2.5 E F0(\()4.166 E
+F1(const c)A(har *string)-.15 E F0(\))1.666 E
+(Change the time stamp associated with the most recent history entry to)
+108 590.4 Q F1(string)2.5 E F0(.)A F1(HIST_ENTR)108 614.4 Q 2.5(Y*)-.18
+G F2 -.18(re)C(mo).18 E -.1(ve)-.1 G(_history).1 E F0(\()4.166 E F1
+(int whic)A(h)-.15 E F0(\))1.666 E(Remo)108 626.4 Q .353 -.15(ve h)-.15
+H .053(istory entry at of).15 F(fset)-.25 E F1(whic)2.553 E(h)-.15 E F0
+.053(from the history)2.553 F 5.053(.T)-.65 G .053(he remo)-5.053 F -.15
+(ve)-.15 G 2.553(de).15 G .052(lement is returned so you can free the)
+-2.553 F(line, data, and containing structure.)108 638.4 Q F1
+(histdata_t)108 662.4 Q F2(fr)2.5 E(ee_history_entry)-.18 E F0(\()4.166
+E F1(HIST_ENTR)A 2.5(Y*)-.18 G(histent)-2.5 E F0(\))1.666 E .933
+(Free the history entry)108 674.4 R F1(histent)3.433 E F0 .933(and an)
+3.433 F 3.433(yh)-.15 G .933(istory library pri)-3.433 F -.25(va)-.25 G
+.933(te data associated with it.).25 F .934(Returns the applica-)5.933 F
+(tion-speci\214c data so the caller can dispose of it.)108 686.4 Q F1
+(HIST_ENTR)108 710.4 Q 2.5(Y*)-.18 G F2 -.18(re)C(place_history_entry)
+.18 E F0(\()4.166 E F1(int whic)A -.834(h, const)-.15 F -.15(ch)2.5 G
+(ar *line).15 E 1.666(,h)-.1 G(istdata_t data)-1.666 E F0(\))3.332 E
+(Mak)108 722.4 Q 4.014(et)-.1 G 1.514(he history entry at of)-4.014 F
+(fset)-.25 E F1(whic)4.013 E(h)-.15 E F0(ha)4.013 E -.15(ve)-.2 G F1
+(line)4.163 E F0(and)4.013 E F1(data)4.013 E F0 6.513(.T)C 1.513
+(his returns the old entry so the caller can)-6.513 F(GNU History 5.0)72
+768 Q(2003 July 31)139.005 E(3)203.165 E 0 Cg EP
+%%Page: 4 4
+%%BeginPageSetup
+BP
+%%EndPageSetup
+/F0 10/Times-Roman@0 SF(HIST)72 48 Q(OR)-.18 E 357.18(Y\(3\) HIST)-.65 F
+(OR)-.18 E(Y\(3\))-.65 E(dispose of an)108 84 Q 2.5(ya)-.15 G
+(pplication-speci\214c data.)-2.5 E(In the case of an in)5 E -.25(va)-.4
+G(lid).25 E/F1 10/Times-Italic@0 SF(whic)2.5 E(h)-.15 E F0 2.5(,a)C/F2
+10/Times-Bold@0 SF(NULL)A F0(pointer is returned.)2.5 E F1(void)108 108
+Q F2(clear_history)2.5 E F0(\()4.166 E F1(void)A F0(\))1.666 E
+(Clear the history list by deleting all the entries.)108 120 Q F1(void)
+108 144 Q F2(sti\215e_history)2.5 E F0(\()4.166 E F1(int max)A F0(\))
+1.666 E(Sti\215e the history list, remembering only the last)108 156 Q
+F1(max)2.5 E F0(entries.)2.5 E F1(int)108 180 Q F2(unsti\215e_history)
+2.5 E F0(\()4.166 E F1(void)A F0(\))1.666 E .46
+(Stop sti\215ing the history)108 192 R 5.46(.T)-.65 G .46
+(his returns the pre)-5.46 F .46
+(viously-set maximum number of history entries \(as set by)-.25 F F2
+(sti-)2.96 E(\215e_history\(\))108 204 Q F0 2.5(\). history)B -.1(wa)2.5
+G 2.5(ss).1 G 2.5(ti\215ed. The)-2.5 F -.25(va)2.5 G(lue is positi).25 E
+.3 -.15(ve i)-.25 H 2.5(ft).15 G(he history w)-2.5 E(as sti\215ed, ne)
+-.1 E -.05(ga)-.15 G(ti).05 E .3 -.15(ve i)-.25 H 2.5(fi).15 G 2.5(tw)
+-2.5 G(asn')-2.6 E(t.)-.18 E F1(int)108 228 Q F2(history_is_sti\215ed)
+2.5 E F0(\()4.166 E F1(void)A F0(\))1.666 E
+(Returns non-zero if the history is sti\215ed, zero if it is not.)108
+240 Q F2(Inf)87 268.8 Q(ormation About the History List)-.25 E F0(These\
+ functions return information about the entire history list or indi)108
+280.8 Q(vidual list entries.)-.25 E F1(HIST_ENTR)108 304.8 Q 2.5(Y*)-.18
+G(*)-2.5 E F2(history_list)2.5 E F0(\()4.166 E F1(void)A F0(\))1.666 E
+.708(Return a)108 316.8 R F2(NULL)3.208 E F0 .708(terminated array of)
+3.208 F F1(HIST_ENTR)3.208 E 3.208(Y*)-.18 G F0 .708
+(which is the current input history)B 5.707(.E)-.65 G .707
+(lement 0 of this)-5.707 F(list is the be)108 328.8 Q(ginning of time.)
+-.15 E(If there is no history)5 E 2.5(,r)-.65 G(eturn)-2.5 E F2(NULL)2.5
+E F0(.)A F1(int)108 352.8 Q F2(wher)2.5 E(e_history)-.18 E F0(\()4.166 E
+F1(void)A F0(\))1.666 E(Returns the of)108 364.8 Q
+(fset of the current history element.)-.25 E F1(HIST_ENTR)108 388.8 Q
+2.5(Y*)-.18 G F2(curr)A(ent_history)-.18 E F0(\()4.166 E F1(void)A F0
+(\))1.666 E 1.373
+(Return the history entry at the current position, as determined by)108
+400.8 R F2(wher)3.873 E(e_history\(\))-.18 E F0 6.373(.I)C 3.873(ft)
+-6.373 G 1.374(here is no entry)-3.873 F(there, return a)108 412.8 Q F2
+(NULL)2.5 E F0(pointer)2.5 E(.)-.55 E F1(HIST_ENTR)108 436.8 Q 2.5(Y*)
+-.18 G F2(history_get)A F0(\()4.166 E F1(int of)A(fset)-.18 E F0(\))
+1.666 E .288(Return the history entry at position)108 448.8 R F1(of)
+2.787 E(fset)-.18 E F0 2.787(,s)C .287(tarting from)-2.787 F F2
+(history_base)2.787 E F0 5.287(.I)C 2.787(ft)-5.287 G .287
+(here is no entry there, or if)-2.787 F F1(of)2.787 E(fset)-.18 E F0
+(is greater than the history length, return a)108 460.8 Q F2(NULL)2.5 E
+F0(pointer)2.5 E(.)-.55 E F1(time_t)108 484.8 Q F2(history_get_time)2.5
+E F0(\()4.166 E F1(HIST_ENTR)A 2.5(Y*)-.18 G F0(\))-.834 E(Return the t\
+ime stamp associated with the history entry passed as the ar)108 496.8 Q
+(gument.)-.18 E F1(int)108 520.8 Q F2(history_total_bytes)2.5 E F0(\()
+4.166 E F1(void)A F0(\))1.666 E .391
+(Return the number of bytes that the primary history entries are using.)
+108 532.8 R .392(This function returns the sum of the)5.392 F
+(lengths of all the lines in the history)108 544.8 Q(.)-.65 E F2(Mo)87
+573.6 Q(ving Ar)-.1 E(ound the History List)-.18 E F0
+(These functions allo)108 585.6 Q 2.5(wt)-.25 G(he current inde)-2.5 E
+2.5(xi)-.15 G(nto the history list to be set or changed.)-2.5 E F1(int)
+108 609.6 Q F2(history_set_pos)2.5 E F0(\()4.166 E F1(int pos)A F0(\))
+1.666 E .79(Set the current history of)108 621.6 R .79(fset to)-.25 F F1
+(pos)3.29 E F0 3.29(,a)C 3.29(na)-3.29 G .79(bsolute inde)-3.29 F 3.29
+(xi)-.15 G .79(nto the list.)-3.29 F .79(Returns 1 on success, 0 if)5.79
+F F1(pos)3.29 E F0 .79(is less)3.29 F
+(than zero or greater than the number of history entries.)108 633.6 Q F1
+(HIST_ENTR)108 657.6 Q 2.5(Y*)-.18 G F2(pr)A -.15(ev)-.18 G
+(ious_history).15 E F0(\()4.166 E F1(void)A F0(\))1.666 E .207
+(Back up the current history of)108 669.6 R .207(fset to the pre)-.25 F
+.207(vious history entry)-.25 F 2.708(,a)-.65 G .208
+(nd return a pointer to that entry)-2.708 F 5.208(.I)-.65 G 2.708(ft)
+-5.208 G .208(here is)-2.708 F(no pre)108 681.6 Q(vious entry)-.25 E 2.5
+(,r)-.65 G(eturn a)-2.5 E F2(NULL)2.5 E F0(pointer)2.5 E(.)-.55 E F1
+(HIST_ENTR)108 705.6 Q 2.5(Y*)-.18 G F2(next_history)A F0(\()4.166 E F1
+(void)A F0(\))1.666 E(Mo)108 717.6 Q 1.047 -.15(ve t)-.15 H .747
+(he current history of).15 F .747(fset forw)-.25 F .746(ard to the ne)
+-.1 F .746(xt history entry)-.15 F 3.246(,a)-.65 G .746
+(nd return the a pointer to that entry)-3.246 F 5.746(.I)-.65 G(f)-5.746
+E(there is no ne)108 729.6 Q(xt entry)-.15 E 2.5(,r)-.65 G(eturn a)-2.5
+E F2(NULL)2.5 E F0(pointer)2.5 E(.)-.55 E(GNU History 5.0)72 768 Q
+(2003 July 31)139.005 E(4)203.165 E 0 Cg EP
+%%Page: 5 5
+%%BeginPageSetup
+BP
+%%EndPageSetup
+/F0 10/Times-Roman@0 SF(HIST)72 48 Q(OR)-.18 E 357.18(Y\(3\) HIST)-.65 F
+(OR)-.18 E(Y\(3\))-.65 E/F1 10/Times-Bold@0 SF(Sear)87 84 Q
+(ching the History List)-.18 E F0 .005(These functions allo)108 96 R
+2.505(ws)-.25 G .006(earching of the history list for entries containin\
+g a speci\214c string.)-2.505 F .006(Searching may be)5.006 F 1.452
+(performed both forw)108 108 R 1.452(ard and backw)-.1 F 1.451
+(ard from the current history position.)-.1 F 1.451(The search may be)
+6.451 F/F2 10/Times-Italic@0 SF(anc)3.951 E(hor)-.15 E(ed)-.37 E F0(,)A
+(meaning that the string must match at the be)108 120 Q
+(ginning of the history entry)-.15 E(.)-.65 E F2(int)108 144 Q F1
+(history_sear)2.5 E(ch)-.18 E F0(\()4.166 E F2(const c)A(har *string)
+-.15 E 1.666(,i)-.1 G(nt dir)-1.666 E(ection)-.37 E F0(\))1.666 E .155
+(Search the history for)108 156 R F2(string)2.655 E F0 2.656(,s)C .156
+(tarting at the current history of)-2.656 F 2.656(fset. If)-.25 F F2
+(dir)2.656 E(ection)-.37 E F0 .156(is less than 0, then the search)2.656
+F .802(is through pre)108 168 R .802
+(vious entries, otherwise through subsequent entries.)-.25 F(If)5.801 E
+F2(string)3.301 E F0 .801(is found, then the current his-)3.301 F .064
+(tory inde)108 180 R 2.564(xi)-.15 G 2.564(ss)-2.564 G .064
+(et to that history entry)-2.564 F 2.564(,a)-.65 G .064(nd the v)-2.564
+F .064(alue returned is the of)-.25 F .064
+(fset in the line of the entry where)-.25 F F2(string)2.565 E F0 -.1(wa)
+108 192 S 2.5(sf).1 G 2.5(ound. Otherwise,)-2.5 F
+(nothing is changed, and a -1 is returned.)2.5 E F2(int)108 216 Q F1
+(history_sear)2.5 E(ch_pr)-.18 E(e\214x)-.18 E F0(\()4.166 E F2(const c)
+A(har *string)-.15 E 1.666(,i)-.1 G(nt dir)-1.666 E(ection)-.37 E F0(\))
+1.666 E .684(Search the history for)108 228 R F2(string)3.183 E F0 3.183
+(,s)C .683(tarting at the current history of)-3.183 F 3.183(fset. The)
+-.25 F .683(search is anchored: matching lines)3.183 F 1.063(must be)108
+240 R 1.063(gin with)-.15 F F2(string)3.563 E F0 6.063(.I)C(f)-6.063 E
+F2(dir)3.563 E(ection)-.37 E F0 1.064
+(is less than 0, then the search is through pre)3.563 F 1.064
+(vious entries, otherwise)-.25 F 1.115(through subsequent entries.)108
+252 R(If)6.115 E F2(string)3.615 E F0 1.115
+(is found, then the current history inde)3.615 F 3.614(xi)-.15 G 3.614
+(ss)-3.614 G 1.114(et to that entry)-3.614 F 3.614(,a)-.65 G 1.114
+(nd the)-3.614 F(return v)108 264 Q(alue is 0.)-.25 E
+(Otherwise, nothing is changed, and a -1 is returned.)5 E F2(int)108 288
+Q F1(history_sear)2.5 E(ch_pos)-.18 E F0(\()4.166 E F2(const c)A
+(har *string)-.15 E 1.666(,i)-.1 G(nt dir)-1.666 E -.834(ection, int)
+-.37 F(pos)2.5 E F0(\))3.332 E .603(Search for)108 300 R F2(string)3.103
+E F0 .603(in the history list, starting at)3.103 F F2(pos)3.104 E F0
+3.104(,a)C 3.104(na)-3.104 G .604(bsolute inde)-3.104 F 3.104(xi)-.15 G
+.604(nto the list.)-3.104 F(If)5.604 E F2(dir)3.104 E(ection)-.37 E F0
+.604(is ne)3.104 F -.05(ga)-.15 G(ti).05 E -.15(ve)-.25 G(,).15 E .608
+(the search proceeds backw)108 312 R .608(ard from)-.1 F F2(pos)3.108 E
+F0 3.108(,o)C .608(therwise forw)-3.108 F 3.108(ard. Returns)-.1 F .608
+(the absolute inde)3.108 F 3.108(xo)-.15 G 3.108(ft)-3.108 G .608
+(he history ele-)-3.108 F(ment where)108 324 Q F2(string)2.5 E F0 -.1
+(wa)2.5 G 2.5(sf).1 G(ound, or -1 otherwise.)-2.5 E F1
+(Managing the History File)87 352.8 Q F0 .035(The History library can r\
+ead the history from and write it to a \214le.)108 364.8 R .036
+(This section documents the functions for)5.035 F
+(managing a history \214le.)108 376.8 Q F2(int)108 400.8 Q F1 -.18(re)
+2.5 G(ad_history).18 E F0(\()4.166 E F2(const c)A(har *\214lename)-.15 E
+F0(\))1.666 E .151(Add the contents of)108 412.8 R F2(\214lename)2.651 E
+F0 .151(to the history list, a line at a time.)2.651 F(If)5.15 E F2
+(\214lename)2.65 E F0(is)2.65 E F1(NULL)2.65 E F0 2.65(,t)C .15
+(hen read from)-2.65 F F2(~/.his-)2.65 E(tory)108 424.8 Q F0 5(.R)C
+(eturns 0 if successful, or)-5 E F1(err)2.5 E(no)-.15 E F0(if not.)2.5 E
+F2(int)108 448.8 Q F1 -.18(re)2.5 G(ad_history_range).18 E F0(\()4.166 E
+F2(const c)A(har *\214lename)-.15 E 1.666(,i)-.1 G(nt fr)-1.666 E -.834
+(om, int)-.45 F(to)2.5 E F0(\))3.332 E .052(Read a range of lines from)
+108 460.8 R F2(\214lename)2.553 E F0 2.553(,a)C .053
+(dding them to the history list.)-2.553 F .053(Start reading at line)
+5.053 F F2(fr)2.553 E(om)-.45 E F0 .053(and end at)2.553 F F2(to)2.553 E
+F0(.)A(If)108 472.8 Q F2(fr)2.889 E(om)-.45 E F0 .389
+(is zero, start at the be)2.889 F 2.889(ginning. If)-.15 F F2(to)2.889 E
+F0 .389(is less than)2.889 F F2(fr)2.889 E(om)-.45 E F0 2.889(,t)C .388
+(hen read until the end of the \214le.)-2.889 F(If)5.388 E F2
+(\214lename)2.888 E F0(is)108 484.8 Q F1(NULL)2.5 E F0 2.5(,t)C
+(hen read from)-2.5 E F2(~/.history)2.5 E F0 5(.R)C
+(eturns 0 if successful, or)-5 E F1(err)2.5 E(no)-.15 E F0(if not.)2.5 E
+F2(int)108 508.8 Q F1(write_history)2.5 E F0(\()4.166 E F2(const c)A
+(har *\214lename)-.15 E F0(\))1.666 E .961(Write the current history to)
+108 520.8 R F2(\214lename)3.461 E F0 3.461(,o)C -.15(ve)-3.611 G
+(rwriting).15 E F2(\214lename)3.461 E F0 .961(if necessary)3.461 F 5.961
+(.I)-.65 G(f)-5.961 E F2(\214lename)3.462 E F0(is)3.462 E F1(NULL)3.462
+E F0 3.462(,t)C .962(hen write)-3.462 F(the history list to)108 532.8 Q
+F2(~/.history)2.5 E F0 5(.R)C(eturns 0 on success, or)-5 E F1(err)2.5 E
+(no)-.15 E F0(on a read or write error)2.5 E(.)-.55 E F2(int)108 568.8 Q
+F1(append_history)2.5 E F0(\()4.166 E F2(int nelements,)A(const c)1.666
+E(har *\214lename)-.15 E F0(\))1.666 E .839(Append the last)108 580.8 R
+F2(nelements)3.339 E F0 .839(of the history list to)3.339 F F2
+(\214lename)3.339 E F0 5.839(.I)C(f)-5.839 E F2(\214lename)3.339 E F0
+(is)3.339 E F1(NULL)3.339 E F0 3.339(,t)C .838(hen append to)-3.339 F F2
+(~/.history)3.338 E F0(.)A(Returns 0 on success, or)108 592.8 Q F1(err)
+2.5 E(no)-.15 E F0(on a read or write error)2.5 E(.)-.55 E F2(int)108
+616.8 Q F1(history_truncate_\214le)2.5 E F0(\()4.166 E F2(const c)A
+(har *\214lename)-.15 E 1.666(,i)-.1 G(nt nlines)-1.666 E F0(\))1.666 E
+-.35(Tr)108 628.8 S .38(uncate the history \214le).35 F F2(\214lename)
+2.88 E F0 2.88(,l)C(ea)-2.88 E .38(ving only the last)-.2 F F2(nlines)
+2.881 E F0 2.881(lines. If)2.881 F F2(\214lename)2.881 E F0(is)2.881 E
+F1(NULL)2.881 E F0 2.881(,t)C(hen)-2.881 E F2(~/.history)2.881 E F0(is)
+2.881 E 2.5(truncated. Returns)108 640.8 R 2.5(0o)2.5 G 2.5(ns)-2.5 G
+(uccess, or)-2.5 E F1(err)2.5 E(no)-.15 E F0(on f)2.5 E(ailure.)-.1 E F1
+(History Expansion)87 669.6 Q F0(These functions implement history e)108
+681.6 Q(xpansion.)-.15 E F2(int)108 705.6 Q F1(history_expand)2.5 E F0
+(\()4.166 E F2 -.15(ch)C(ar *string).15 E 1.666(,c)-.1 G(har **output)
+-1.816 E F0(\))1.666 E(Expand)108 717.6 Q F2(string)2.5 E F0 2.5(,p)C
+(lacing the result into)-2.5 E F2(output)2.5 E F0 2.5(,ap)C
+(ointer to a string.)-2.5 E(Returns:)5 E(GNU History 5.0)72 768 Q
+(2003 July 31)139.005 E(5)203.165 E 0 Cg EP
+%%Page: 6 6
+%%BeginPageSetup
+BP
+%%EndPageSetup
+/F0 10/Times-Roman@0 SF(HIST)72 48 Q(OR)-.18 E 357.18(Y\(3\) HIST)-.65 F
+(OR)-.18 E(Y\(3\))-.65 E 31(0I)144 84 S 3.066(fn)-31 G 3.066(oe)-3.066 G
+.566(xpansions took place \(or)-3.216 F 3.065(,i)-.4 G 3.065(ft)-3.065 G
+.565(he only change in the te)-3.065 F .565(xt w)-.15 F .565
+(as the remo)-.1 F -.25(va)-.15 G 3.065(lo).25 G 3.065(fe)-3.065 G
+(scape)-3.065 E(characters preceding the history e)180 96 Q
+(xpansion character\);)-.15 E 31(1i)144 108 S 2.5(fe)-31 G
+(xpansions did tak)-2.65 E 2.5(ep)-.1 G(lace;)-2.5 E 25.17(-1 if)144 120
+R(there w)2.5 E(as an error in e)-.1 E(xpansion;)-.15 E 31(2i)144 132 S
+2.5(ft)-31 G(he returned line should be displayed, b)-2.5 E(ut not e)-.2
+E -.15(xe)-.15 G(cuted, as with the).15 E/F1 10/Times-Bold@0 SF(:p)2.5 E
+F0(modi\214er)2.5 E(.)-.55 E(If an error ocurred in e)108 144 Q
+(xpansion, then)-.15 E/F2 10/Times-Italic@0 SF(output)2.5 E F0
+(contains a descripti)2.5 E .3 -.15(ve e)-.25 H(rror message.).15 E F2
+-.15(ch)108 168 S(ar *).15 E F1(get_history_e)2.5 E -.1(ve)-.15 G(nt).1
+E F0(\()4.166 E F2(const c)A(har *string)-.15 E 1.666(,i)-.1 G
+(nt *cinde)-1.666 E -.834(x, int)-.2 F(qc)2.5 E(har)-.15 E F0(\))3.332 E
+.262(Returns the te)108 180 R .262(xt of the history e)-.15 F -.15(ve)
+-.25 G .262(nt be).15 F .263(ginning at)-.15 F F2(string)2.763 E F0(+)
+2.763 E F2(*cinde)2.763 E(x)-.2 E F0(.)A F2(*cinde)5.263 E(x)-.2 E F0
+.263(is modi\214ed to point to after the)2.763 F -2.15 -.25(ev e)108 192
+T .71(nt speci\214er).25 F 5.71(.A)-.55 G 3.21(tf)-5.71 G .71
+(unction entry)-3.21 F(,)-.65 E F2(cinde)3.21 E(x)-.2 E F0 .709
+(points to the inde)3.21 F 3.209(xi)-.15 G(nto)-3.209 E F2(string)3.209
+E F0 .709(where the history e)3.209 F -.15(ve)-.25 G .709
+(nt speci\214ca-).15 F .527(tion be)108 204 R(gins.)-.15 E F2(qc)5.527 E
+(har)-.15 E F0 .527(is a character that is allo)3.027 F .527
+(wed to end the e)-.25 F -.15(ve)-.25 G .528
+(nt speci\214cation in addition to the `).15 F(`normal')-.74 E(')-.74 E
+(terminating characters.)108 216 Q F2 -.15(ch)108 240 S(ar **).15 E F1
+(history_tok)2.5 E(enize)-.1 E F0(\()4.166 E F2(const c)A(har *string)
+-.15 E F0(\))1.666 E .239(Return an array of tok)108 252 R .239
+(ens parsed out of)-.1 F F2(string)2.739 E F0 2.739(,m)C .238
+(uch as the shell might.)-2.739 F .238(The tok)5.238 F .238
+(ens are split on the charac-)-.1 F(ters in the)108 264 Q F1(history_w)
+2.5 E(ord_delimiters)-.1 E F0 -.25(va)2.5 G
+(riable, and shell quoting con).25 E -.15(ve)-.4 G(ntions are obe).15 E
+(yed.)-.15 E F2 -.15(ch)108 288 S(ar *).15 E F1(history_ar)2.5 E
+(g_extract)-.1 E F0(\()4.166 E F2(int \214r)A -.834(st, int)-.1 F -.834
+(last, const)2.5 F -.15(ch)2.5 G(ar *string).15 E F0(\))3.332 E .025
+(Extract a string se)108 300 R .025(gment consisting of the)-.15 F F2
+<8c72>2.526 E(st)-.1 E F0(through)2.526 E F2(last)2.526 E F0(ar)2.526 E
+.026(guments present in)-.18 F F2(string)2.526 E F0 5.026(.A)C -.18(rg)
+-5.026 G .026(uments are split).18 F(using)108 312 Q F1(history_tok)2.5
+E(enize\(\))-.1 E F0(.)A F1(History V)87 340.8 Q(ariables)-.92 E F0
+(This section describes the e)108 352.8 Q(xternally-visible v)-.15 E
+(ariables e)-.25 E(xported by the GNU History Library)-.15 E(.)-.65 E F2
+(int)108 376.8 Q F1(history_base)2.5 E F0(The logical of)108 388.8 Q
+(fset of the \214rst entry in the history list.)-.25 E F2(int)108 412.8
+Q F1(history_length)2.5 E F0
+(The number of entries currently stored in the history list.)108 424.8 Q
+F2(int)108 448.8 Q F1(history_max_entries)2.5 E F0
+(The maximum number of history entries.)108 460.8 Q
+(This must be changed using)5 E F1(sti\215e_history\(\))2.5 E F0(.)A F2
+(int)108 484.8 Q F1(history_write_timestamps)2.5 E F0 1.468
+(If non-zero, timestamps are written to the history \214le, so the)108
+496.8 R 3.968(yc)-.15 G 1.468(an be preserv)-3.968 F 1.468
+(ed between sessions.)-.15 F(The)6.468 E(def)108 508.8 Q(ault v)-.1 E
+(alue is 0, meaning that timestamps are not sa)-.25 E -.15(ve)-.2 G(d.)
+.15 E F2 -.15(ch)108 532.8 S(ar).15 E F1(history_expansion_char)2.5 E F0
+(The character that introduces a history e)108 544.8 Q -.15(ve)-.25 G
+2.5(nt. The).15 F(def)2.5 E(ault is)-.1 E F1(!)2.5 E F0 5(.S)C
+(etting this to 0 inhibits history e)-5 E(xpansion.)-.15 E F2 -.15(ch)
+108 568.8 S(ar).15 E F1(history_subst_char)2.5 E F0
+(The character that in)108 580.8 Q -.2(vo)-.4 G -.1(ke).2 G 2.5(sw).1 G
+(ord substitution if found at the start of a line.)-2.6 E(The def)5 E
+(ault is)-.1 E F1(^)2.5 E F0(.)A F2 -.15(ch)108 604.8 S(ar).15 E F1
+(history_comment_char)2.5 E F0 .116(During tok)108 616.8 R .117
+(enization, if this character is seen as the \214rst character of a w)
+-.1 F .117(ord, then it and all subsequent char)-.1 F(-)-.2 E .277
+(acters up to a ne)108 628.8 R .276
+(wline are ignored, suppressing history e)-.25 F .276
+(xpansion for the remainder of the line.)-.15 F .276(This is dis-)5.276
+F(abled by def)108 640.8 Q(ault.)-.1 E F2 -.15(ch)108 664.8 S(ar *).15 E
+F1(history_w)2.5 E(ord_delimiters)-.1 E F0
+(The characters that separate tok)108 676.8 Q(ens for)-.1 E F1
+(history_tok)2.5 E(enize\(\))-.1 E F0 5(.T)C(he def)-5 E(ault v)-.1 E
+(alue is)-.25 E F1 2.5("\\)2.5 G(t\\n\(\)<>;&|")-2.5 E F0(.)A F2 -.15
+(ch)108 700.8 S(ar *).15 E F1(history_no_expand_chars)2.5 E F0 2.054
+(The list of characters which inhibit history e)108 712.8 R 2.054
+(xpansion if found immediately follo)-.15 F(wing)-.25 E F1
+(history_expan-)4.555 E(sion_char)108 724.8 Q F0 5(.T)C(he def)-5 E
+(ault is space, tab, ne)-.1 E(wline,)-.25 E F1(\\r)2.5 E F0 2.5(,a)C(nd)
+-2.5 E F1(=)2.5 E F0(.)A(GNU History 5.0)72 768 Q(2003 July 31)139.005 E
+(6)203.165 E 0 Cg EP
+%%Page: 7 7
+%%BeginPageSetup
+BP
+%%EndPageSetup
+/F0 10/Times-Roman@0 SF(HIST)72 48 Q(OR)-.18 E 357.18(Y\(3\) HIST)-.65 F
+(OR)-.18 E(Y\(3\))-.65 E/F1 10/Times-Italic@0 SF -.15(ch)108 84 S(ar *)
+.15 E/F2 10/Times-Bold@0 SF(history_sear)2.5 E(ch_delimiter_chars)-.18 E
+F0 .401(The list of additional characters which can delimit a history s\
+earch string, in addition to space, tab,)108 96 R F1(:)2.901 E F0(and)
+2.901 E F1(?)2.901 E F0(in the case of a substring search.)108 108 Q
+(The def)5 E(ault is empty)-.1 E(.)-.65 E F1(int)108 132 Q F2
+(history_quotes_inhibit_expansion)2.5 E F0 .624
+(If non-zero, single-quoted w)108 144 R .625
+(ords are not scanned for the history e)-.1 F .625(xpansion character)
+-.15 F 5.625(.T)-.55 G .625(he def)-5.625 F .625(ault v)-.1 F .625
+(alue is)-.25 F(0.)108 156 Q F1(rl_lineb)108 180 Q(uf_func_t *)-.2 E F2
+(history_inhibit_expansion_function)2.5 E F0 .348
+(This should be set to the address of a function that tak)108 192 R .348
+(es tw)-.1 F 2.848(oa)-.1 G -.18(rg)-2.848 G .347(uments: a).18 F F2
+.347(char *)2.847 F F0(\()2.847 E F1(string)A F0 2.847(\)a)C .347(nd an)
+-2.847 F F2(int)2.847 E F0(inde)2.847 E(x)-.15 E .227
+(into that string \()108 204 R F1(i)A F0 2.727(\). It)B .227
+(should return a non-zero v)2.727 F .227(alue if the history e)-.25 F
+.227(xpansion starting at)-.15 F F1(string[i])2.728 E F0 .228
+(should not)2.728 F .019(be performed; zero if the e)108 216 R .019
+(xpansion should be done.)-.15 F .019
+(It is intended for use by applications lik)5.019 F(e)-.1 E F2(bash)
+2.519 E F0 .018(that use)2.519 F(the history e)108 228 Q
+(xpansion character for additional purposes.)-.15 E(By def)5 E
+(ault, this v)-.1 E(ariable is set to)-.25 E F2(NULL)2.5 E F0(.)A/F3
+10.95/Times-Bold@0 SF(FILES)72 244.8 Q F1(~/.history)109.666 256.8 Q F0
+(Def)144 268.8 Q(ault \214lename for reading and writing sa)-.1 E -.15
+(ve)-.2 G 2.5(dh).15 G(istory)-2.5 E F3(SEE ALSO)72 285.6 Q F1
+(The Gnu Readline Libr)108 297.6 Q(ary)-.15 E F0 2.5(,B)C(rian F)-2.5 E
+(ox and Chet Rame)-.15 E(y)-.15 E F1(The Gnu History Libr)108 309.6 Q
+(ary)-.15 E F0 2.5(,B)C(rian F)-2.5 E(ox and Chet Rame)-.15 E(y)-.15 E
+F1(bash)108 321.6 Q F0(\(1\))A F1 -.37(re)108 333.6 S(adline).37 E F0
+(\(3\))A F3 -.548(AU)72 350.4 S(THORS).548 E F0(Brian F)108 362.4 Q
+(ox, Free Softw)-.15 E(are F)-.1 E(oundation)-.15 E(bfox@gnu.or)108
+374.4 Q(g)-.18 E(Chet Rame)108 391.2 Q 1.3 -.65(y, C)-.15 H(ase W).65 E
+(estern Reserv)-.8 E 2.5(eU)-.15 G(ni)-2.5 E -.15(ve)-.25 G(rsity).15 E
+(chet@ins.CWR)108 403.2 Q(U.Edu)-.4 E F3 -.11(BU)72 420 S 2.738(GR).11 G
+(EPOR)-2.738 E(TS)-.438 E F0 .16(If you \214nd a b)108 432 R .16
+(ug in the)-.2 F F2(history)2.66 E F0(library)2.66 E 2.66(,y)-.65 G .16
+(ou should report it.)-2.66 F .16(But \214rst, you should mak)5.16 F
+2.66(es)-.1 G .16(ure that it really is)-2.66 F 2.5(ab)108 444 S
+(ug, and that it appears in the latest v)-2.7 E(ersion of the)-.15 E F2
+(history)2.5 E F0(library that you ha)2.5 E -.15(ve)-.2 G(.).15 E .705
+(Once you ha)108 460.8 R 1.005 -.15(ve d)-.2 H .705(etermined that a b)
+.15 F .704(ug actually e)-.2 F .704(xists, mail a b)-.15 F .704
+(ug report to)-.2 F F1 -.2(bu)3.204 G(g\255r).2 E(eadline)-.37 E F0(@)A
+F1(gnu.or)A(g)-.37 E F0 5.704(.I)C 3.204(fy)-5.704 G(ou)-3.204 E(ha)108
+472.8 Q 1.809 -.15(ve a \214)-.2 H 1.509
+(x, you are welcome to mail that as well!).15 F 1.51
+(Suggestions and `philosophical' b)6.51 F 1.51(ug reports may be)-.2 F
+(mailed to)108 484.8 Q F1 -.2(bu)2.5 G(g-r).2 E(eadline)-.37 E F0(@)A F1
+(gnu.or)A(g)-.37 E F0(or posted to the Usenet ne)2.5 E(wsgroup)-.25 E F2
+(gnu.bash.b)2.5 E(ug)-.2 E F0(.)A(Comments and b)108 501.6 Q
+(ug reports concerning this manual page should be directed to)-.2 E F1
+-.15(ch)2.5 G(et@ins.CWR).15 E -.25(U.)-.4 G(Edu).25 E F0(.).25 E
+(GNU History 5.0)72 768 Q(2003 July 31)139.005 E(7)203.165 E 0 Cg EP
+%%Trailer
+end
+%%EOF
diff --git a/doc/hstech.texi b/doc/hstech.texi
new file mode 100644 (file)
index 0000000..47ba8a5
--- /dev/null
@@ -0,0 +1,573 @@
+@ignore
+This file documents the user interface to the GNU History library.
+
+Copyright (C) 1988-2006 Free Software Foundation, Inc.
+Authored by Brian Fox and Chet Ramey.
+
+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 process this file through Tex and print the
+results, provided the printed document carries copying permission notice
+identical to this one except for the removal of this paragraph (this
+paragraph not being relevant to the printed manual).
+
+Permission is granted to copy and distribute modified versions of this
+manual under the conditions for verbatim copying, provided also that the
+GNU Copyright statement is available to the distributee, 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.
+@end ignore
+
+@node Programming with GNU History
+@chapter Programming with GNU History
+
+This chapter describes how to interface programs that you write
+with the @sc{gnu} History Library.
+It should be considered a technical guide.
+For information on the interactive use of @sc{gnu} History, @pxref{Using
+History Interactively}.
+
+@menu
+* Introduction to History::    What is the GNU History library for?
+* History Storage::            How information is stored.
+* History Functions::          Functions that you can use.
+* History Variables::          Variables that control behaviour.
+* History Programming Example::        Example of using the GNU History Library.
+@end menu
+
+@node Introduction to History
+@section Introduction to History
+
+Many programs read input from the user a line at a time.  The @sc{gnu}
+History library is able to keep track of those lines, associate arbitrary
+data with each line, and utilize information from previous lines in
+composing new ones. 
+
+The programmer using the History library has available functions
+for remembering lines on a history list, associating arbitrary data
+with a line, removing lines from the list, searching through the list
+for a line containing an arbitrary text string, and referencing any line
+in the list directly.  In addition, a history @dfn{expansion} function
+is available which provides for a consistent user interface across
+different programs.
+
+The user using programs written with the History library has the
+benefit of a consistent user interface with a set of well-known
+commands for manipulating the text of previous lines and using that text
+in new commands.  The basic history manipulation commands are similar to
+the history substitution provided by @code{csh}.
+
+If the programmer desires, he can use the Readline library, which
+includes some history manipulation by default, and has the added
+advantage of command line editing.
+
+Before declaring any functions using any functionality the History
+library provides in other code, an application writer should include
+the file @code{<readline/history.h>} in any file that uses the
+History library's features.  It supplies extern declarations for all
+of the library's public functions and variables, and declares all of
+the public data structures.
+
+@node History Storage
+@section History Storage
+
+The history list is an array of history entries.  A history entry is
+declared as follows:
+
+@example
+typedef void *histdata_t;
+
+typedef struct _hist_entry @{
+  char *line;
+  char *timestamp;
+  histdata_t data;
+@} HIST_ENTRY;
+@end example
+
+The history list itself might therefore be declared as
+
+@example
+HIST_ENTRY **the_history_list;
+@end example
+
+The state of the History library is encapsulated into a single structure:
+
+@example
+/*
+ * A structure used to pass around the current state of the history.
+ */
+typedef struct _hist_state @{
+  HIST_ENTRY **entries; /* Pointer to the entries themselves. */
+  int offset;           /* The location pointer within this array. */
+  int length;           /* Number of elements within this array. */
+  int size;             /* Number of slots allocated to this array. */
+  int flags;
+@} HISTORY_STATE;
+@end example
+
+If the flags member includes @code{HS_STIFLED}, the history has been
+stifled.
+
+@node History Functions
+@section History Functions
+
+This section describes the calling sequence for the various functions
+exported by the @sc{gnu} History library.
+
+@menu
+* Initializing History and State Management::  Functions to call when you
+                                               want to use history in a
+                                               program.
+* History List Management::            Functions used to manage the list
+                                       of history entries.
+* Information About the History List:: Functions returning information about
+                                       the history list.
+* Moving Around the History List::     Functions used to change the position
+                                       in the history list.
+* Searching the History List::         Functions to search the history list
+                                       for entries containing a string.
+* Managing the History File::          Functions that read and write a file
+                                       containing the history list.
+* History Expansion::                  Functions to perform csh-like history
+                                       expansion.
+@end menu
+
+@node Initializing History and State Management
+@subsection Initializing History and State Management
+
+This section describes functions used to initialize and manage
+the state of the History library when you want to use the history
+functions in your program.
+
+@deftypefun void using_history (void)
+Begin a session in which the history functions might be used.  This
+initializes the interactive variables.
+@end deftypefun
+
+@deftypefun {HISTORY_STATE *} history_get_history_state (void)
+Return a structure describing the current state of the input history.
+@end deftypefun
+
+@deftypefun void history_set_history_state (HISTORY_STATE *state)
+Set the state of the history list according to @var{state}.
+@end deftypefun
+
+@node History List Management
+@subsection History List Management
+
+These functions manage individual entries on the history list, or set
+parameters managing the list itself.
+
+@deftypefun void add_history (const char *string)
+Place @var{string} at the end of the history list.  The associated data
+field (if any) is set to @code{NULL}.
+@end deftypefun
+
+@deftypefun void add_history_time (const char *string)
+Change the time stamp associated with the most recent history entry to
+@var{string}.
+@end deftypefun
+
+@deftypefun {HIST_ENTRY *} remove_history (int which)
+Remove history entry at offset @var{which} from the history.  The
+removed element is returned so you can free the line, data,
+and containing structure.
+@end deftypefun
+
+@deftypefun {histdata_t} free_history_entry (HIST_ENTRY *histent)
+Free the history entry @var{histent} and any history library private
+data associated with it.  Returns the application-specific data
+so the caller can dispose of it.
+@end deftypefun
+
+@deftypefun {HIST_ENTRY *} replace_history_entry (int which, const char *line, histdata_t data)
+Make the history entry at offset @var{which} have @var{line} and @var{data}.
+This returns the old entry so the caller can dispose of any
+application-specific data.  In the case
+of an invalid @var{which}, a @code{NULL} pointer is returned.
+@end deftypefun
+
+@deftypefun void clear_history (void)
+Clear the history list by deleting all the entries.
+@end deftypefun
+
+@deftypefun void stifle_history (int max)
+Stifle the history list, remembering only the last @var{max} entries.
+@end deftypefun
+
+@deftypefun int unstifle_history (void)
+Stop stifling the history.  This returns the previously-set
+maximum number of history entries (as set by @code{stifle_history()}).
+The value is positive if the history was
+stifled, negative if it wasn't.
+@end deftypefun
+
+@deftypefun int history_is_stifled (void)
+Returns non-zero if the history is stifled, zero if it is not.
+@end deftypefun
+
+@node Information About the History List
+@subsection Information About the History List
+
+These functions return information about the entire history list or
+individual list entries.
+
+@deftypefun {HIST_ENTRY **} history_list (void)
+Return a @code{NULL} terminated array of @code{HIST_ENTRY *} which is the
+current input history.  Element 0 of this list is the beginning of time.
+If there is no history, return @code{NULL}.
+@end deftypefun
+
+@deftypefun int where_history (void)
+Returns the offset of the current history element.
+@end deftypefun
+
+@deftypefun {HIST_ENTRY *} current_history (void)
+Return the history entry at the current position, as determined by
+@code{where_history()}.  If there is no entry there, return a @code{NULL}
+pointer.
+@end deftypefun
+
+@deftypefun {HIST_ENTRY *} history_get (int offset)
+Return the history entry at position @var{offset}, starting from
+@code{history_base} (@pxref{History Variables}).
+If there is no entry there, or if @var{offset}
+is greater than the history length, return a @code{NULL} pointer.
+@end deftypefun
+
+@deftypefun time_t history_get_time (HIST_ENTRY *entry)
+Return the time stamp associated with the history entry @var{entry}.
+@end deftypefun
+
+@deftypefun int history_total_bytes (void)
+Return the number of bytes that the primary history entries are using.
+This function returns the sum of the lengths of all the lines in the
+history.
+@end deftypefun
+
+@node Moving Around the History List
+@subsection Moving Around the History List
+
+These functions allow the current index into the history list to be
+set or changed.
+
+@deftypefun int history_set_pos (int pos)
+Set the current history offset to @var{pos}, an absolute index
+into the list.
+Returns 1 on success, 0 if @var{pos} is less than zero or greater
+than the number of history entries.
+@end deftypefun
+
+@deftypefun {HIST_ENTRY *} previous_history (void)
+Back up the current history offset to the previous history entry, and
+return a pointer to that entry.  If there is no previous entry, return
+a @code{NULL} pointer.
+@end deftypefun
+
+@deftypefun {HIST_ENTRY *} next_history (void)
+Move the current history offset forward to the next history entry, and
+return the a pointer to that entry.  If there is no next entry, return
+a @code{NULL} pointer.
+@end deftypefun
+
+@node Searching the History List
+@subsection Searching the History List
+@cindex History Searching
+
+These functions allow searching of the history list for entries containing
+a specific string.  Searching may be performed both forward and backward
+from the current history position.  The search may be @dfn{anchored},
+meaning that the string must match at the beginning of the history entry.
+@cindex anchored search
+
+@deftypefun int history_search (const char *string, int direction)
+Search the history for @var{string}, starting at the current history offset.
+If @var{direction} is less than 0, then the search is through
+previous entries, otherwise through subsequent entries.
+If @var{string} is found, then
+the current history index is set to that history entry, and the value
+returned is the offset in the line of the entry where
+@var{string} was found.  Otherwise, nothing is changed, and a -1 is
+returned.
+@end deftypefun
+
+@deftypefun int history_search_prefix (const char *string, int direction)
+Search the history for @var{string}, starting at the current history
+offset.  The search is anchored: matching lines must begin with
+@var{string}.  If @var{direction} is less than 0, then the search is
+through previous entries, otherwise through subsequent entries.
+If @var{string} is found, then the
+current history index is set to that entry, and the return value is 0. 
+Otherwise, nothing is changed, and a -1 is returned. 
+@end deftypefun
+
+@deftypefun int history_search_pos (const char *string, int direction, int pos)
+Search for @var{string} in the history list, starting at @var{pos}, an
+absolute index into the list.  If @var{direction} is negative, the search
+proceeds backward from @var{pos}, otherwise forward.  Returns the absolute
+index of the history element where @var{string} was found, or -1 otherwise.
+@end deftypefun
+
+@node Managing the History File
+@subsection Managing the History File
+
+The History library can read the history from and write it to a file.
+This section documents the functions for managing a history file.
+
+@deftypefun int read_history (const char *filename)
+Add the contents of @var{filename} to the history list, a line at a time.
+If @var{filename} is @code{NULL}, then read from @file{~/.history}.
+Returns 0 if successful, or @code{errno} if not.
+@end deftypefun
+
+@deftypefun int read_history_range (const char *filename, int from, int to)
+Read a range of lines from @var{filename}, adding them to the history list.
+Start reading at line @var{from} and end at @var{to}.
+If @var{from} is zero, start at the beginning.  If @var{to} is less than
+@var{from}, then read until the end of the file.  If @var{filename} is
+@code{NULL}, then read from @file{~/.history}.  Returns 0 if successful,
+or @code{errno} if not.
+@end deftypefun
+
+@deftypefun int write_history (const char *filename)
+Write the current history to @var{filename}, overwriting @var{filename}
+if necessary.
+If @var{filename} is @code{NULL}, then write the history list to
+@file{~/.history}.
+Returns 0 on success, or @code{errno} on a read or write error.
+@end deftypefun
+
+@deftypefun int append_history (int nelements, const char *filename)
+Append the last @var{nelements} of the history list to @var{filename}.
+If @var{filename} is @code{NULL}, then append to @file{~/.history}.
+Returns 0 on success, or @code{errno} on a read or write error.
+@end deftypefun
+
+@deftypefun int history_truncate_file (const char *filename, int nlines)
+Truncate the history file @var{filename}, leaving only the last
+@var{nlines} lines.
+If @var{filename} is @code{NULL}, then @file{~/.history} is truncated.
+Returns 0 on success, or @code{errno} on failure.
+@end deftypefun
+
+@node History Expansion
+@subsection History Expansion
+
+These functions implement history expansion.
+
+@deftypefun int history_expand (char *string, char **output)
+Expand @var{string}, placing the result into @var{output}, a pointer
+to a string (@pxref{History Interaction}).  Returns:
+@table @code
+@item 0
+If no expansions took place (or, if the only change in
+the text was the removal of escape characters preceding the history expansion
+character);
+@item 1
+if expansions did take place;
+@item -1
+if there was an error in expansion;
+@item 2
+if the returned line should be displayed, but not executed,
+as with the @code{:p} modifier (@pxref{Modifiers}).
+@end table
+
+If an error ocurred in expansion, then @var{output} contains a descriptive
+error message.
+@end deftypefun
+
+@deftypefun {char *} get_history_event (const char *string, int *cindex, int qchar)
+Returns the text of the history event beginning at @var{string} +
+@var{*cindex}.  @var{*cindex} is modified to point to after the event
+specifier.  At function entry, @var{cindex} points to the index into
+@var{string} where the history event specification begins.  @var{qchar}
+is a character that is allowed to end the event specification in addition
+to the ``normal'' terminating characters.
+@end deftypefun
+
+@deftypefun {char **} history_tokenize (const char *string)
+Return an array of tokens parsed out of @var{string}, much as the
+shell might.  The tokens are split on the characters in the
+@var{history_word_delimiters} variable,
+and shell quoting conventions are obeyed.
+@end deftypefun
+
+@deftypefun {char *} history_arg_extract (int first, int last, const char *string)
+Extract a string segment consisting of the @var{first} through @var{last}
+arguments present in @var{string}.  Arguments are split using
+@code{history_tokenize}.
+@end deftypefun
+
+@node History Variables
+@section History Variables
+
+This section describes the externally-visible variables exported by
+the @sc{gnu} History Library.
+
+@deftypevar int history_base
+The logical offset of the first entry in the history list.
+@end deftypevar
+
+@deftypevar int history_length
+The number of entries currently stored in the history list.
+@end deftypevar
+
+@deftypevar int history_max_entries
+The maximum number of history entries.  This must be changed using
+@code{stifle_history()}.
+@end deftypevar
+
+@deftypevar int history_write_timestamps
+If non-zero, timestamps are written to the history file, so they can be
+preserved between sessions.  The default value is 0, meaning that
+timestamps are not saved.
+@end deftypevar
+
+@deftypevar char history_expansion_char
+The character that introduces a history event.  The default is @samp{!}.
+Setting this to 0 inhibits history expansion.
+@end deftypevar
+
+@deftypevar char history_subst_char
+The character that invokes word substitution if found at the start of
+a line.  The default is @samp{^}.
+@end deftypevar
+
+@deftypevar char history_comment_char
+During tokenization, if this character is seen as the first character
+of a word, then it and all subsequent characters up to a newline are
+ignored, suppressing history expansion for the remainder of the line.
+This is disabled by default.
+@end deftypevar
+
+@deftypevar {char *} history_word_delimiters
+The characters that separate tokens for @code{history_tokenize()}.
+The default value is @code{" \t\n()<>;&|"}.
+@end deftypevar
+
+@deftypevar {char *} history_search_delimiter_chars
+The list of additional characters which can delimit a history search
+string, in addition to space, TAB, @samp{:} and @samp{?} in the case of
+a substring search.  The default is empty.
+@end deftypevar
+
+@deftypevar {char *} history_no_expand_chars
+The list of characters which inhibit history expansion if found immediately
+following @var{history_expansion_char}.  The default is space, tab, newline,
+carriage return, and @samp{=}.
+@end deftypevar
+
+@deftypevar int history_quotes_inhibit_expansion
+If non-zero, single-quoted words are not scanned for the history expansion
+character.  The default value is 0.
+@end deftypevar
+
+@deftypevar {rl_linebuf_func_t *} history_inhibit_expansion_function
+This should be set to the address of a function that takes two arguments:
+a @code{char *} (@var{string})
+and an @code{int} index into that string (@var{i}).
+It should return a non-zero value if the history expansion starting at
+@var{string[i]} should not be performed; zero if the expansion should
+be done.
+It is intended for use by applications like Bash that use the history
+expansion character for additional purposes.
+By default, this variable is set to @code{NULL}.
+@end deftypevar
+
+@node History Programming Example
+@section History Programming Example
+
+The following program demonstrates simple use of the @sc{gnu} History Library.
+
+@smallexample
+#include <stdio.h>
+#include <readline/history.h>
+
+main (argc, argv)
+     int argc;
+     char **argv;
+@{
+  char line[1024], *t;
+  int len, done = 0;
+
+  line[0] = 0;
+
+  using_history ();
+  while (!done)
+    @{
+      printf ("history$ ");
+      fflush (stdout);
+      t = fgets (line, sizeof (line) - 1, stdin);
+      if (t && *t)
+        @{
+          len = strlen (t);
+          if (t[len - 1] == '\n')
+            t[len - 1] = '\0';
+        @}
+
+      if (!t)
+        strcpy (line, "quit");
+
+      if (line[0])
+        @{
+          char *expansion;
+          int result;
+
+          result = history_expand (line, &expansion);
+          if (result)
+            fprintf (stderr, "%s\n", expansion);
+
+          if (result < 0 || result == 2)
+            @{
+              free (expansion);
+              continue;
+            @}
+
+          add_history (expansion);
+          strncpy (line, expansion, sizeof (line) - 1);
+          free (expansion);
+        @}
+
+      if (strcmp (line, "quit") == 0)
+        done = 1;
+      else if (strcmp (line, "save") == 0)
+        write_history ("history_file");
+      else if (strcmp (line, "read") == 0)
+        read_history ("history_file");
+      else if (strcmp (line, "list") == 0)
+        @{
+          register HIST_ENTRY **the_list;
+          register int i;
+
+          the_list = history_list ();
+          if (the_list)
+            for (i = 0; the_list[i]; i++)
+              printf ("%d: %s\n", i + history_base, the_list[i]->line);
+        @}
+      else if (strncmp (line, "delete", 6) == 0)
+        @{
+          int which;
+          if ((sscanf (line + 6, "%d", &which)) == 1)
+            @{
+              HIST_ENTRY *entry = remove_history (which);
+              if (!entry)
+                fprintf (stderr, "No such entry %d\n", which);
+              else
+                @{
+                  free (entry->line);
+                  free (entry);
+                @}
+            @}
+          else
+            @{
+              fprintf (stderr, "non-numeric arg given to `delete'\n");
+            @}
+        @}
+    @}
+@}
+@end smallexample
diff --git a/doc/hsuser.texi b/doc/hsuser.texi
new file mode 100644 (file)
index 0000000..f98983b
--- /dev/null
@@ -0,0 +1,457 @@
+@ignore
+This file documents the user interface to the GNU History library.
+
+Copyright (C) 1988-2006 Free Software Foundation, Inc.
+Authored by Brian Fox and Chet Ramey.
+
+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 process this file through Tex and print the
+results, provided the printed document carries copying permission notice
+identical to this one except for the removal of this paragraph (this
+paragraph not being relevant to the printed manual).
+
+Permission is granted to copy and distribute modified versions of this
+manual under the conditions for verbatim copying, provided also that the
+GNU Copyright statement is available to the distributee, 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.
+@end ignore
+
+@node Using History Interactively
+@chapter Using History Interactively
+
+@ifclear BashFeatures
+@defcodeindex bt
+@end ifclear
+
+@ifset BashFeatures
+This chapter describes how to use the @sc{gnu} History Library
+interactively, from a user's standpoint.
+It should be considered a user's guide.
+For information on using the @sc{gnu} History Library in other programs,
+see the @sc{gnu} Readline Library Manual.
+@end ifset
+@ifclear BashFeatures
+This chapter describes how to use the @sc{gnu} History Library interactively,
+from a user's standpoint.  It should be considered a user's guide.  For
+information on using the @sc{gnu} History Library in your own programs,
+@pxref{Programming with GNU History}.
+@end ifclear
+
+@ifset BashFeatures
+@menu
+* Bash History Facilities::    How Bash lets you manipulate your command
+                               history.
+* Bash History Builtins::      The Bash builtin commands that manipulate
+                               the command history.
+* History Interaction::                What it feels like using History as a user.
+@end menu
+@end ifset
+@ifclear BashFeatures
+@menu
+* History Interaction::                What it feels like using History as a user.
+@end menu
+@end ifclear
+
+@ifset BashFeatures
+@node Bash History Facilities
+@section Bash History Facilities
+@cindex command history
+@cindex history list
+
+When the @option{-o history} option to the @code{set} builtin
+is enabled (@pxref{The Set Builtin}),
+the shell provides access to the @dfn{command history},
+the list of commands previously typed.
+The value of the @env{HISTSIZE} shell variable is used as the
+number of commands to save in a history list.
+The text of the last @env{$HISTSIZE}
+commands (default 500) is saved.
+The shell stores each command in the history list prior to
+parameter and variable expansion
+but after history expansion is performed, subject to the
+values of the shell variables
+@env{HISTIGNORE} and @env{HISTCONTROL}.
+
+When the shell starts up, the history is initialized from the
+file named by the @env{HISTFILE} variable (default @file{~/.bash_history}).
+The file named by the value of @env{HISTFILE} is truncated, if
+necessary, to contain no more than the number of lines specified by
+the value of the @env{HISTFILESIZE} variable.
+When an interactive shell exits, the last
+@env{$HISTSIZE} lines are copied from the history list to the file
+named by @env{$HISTFILE}.
+If the @code{histappend} shell option is set (@pxref{Bash Builtins}),
+the lines are appended to the history file,
+otherwise the history file is overwritten.
+If @env{HISTFILE}
+is unset, or if the history file is unwritable, the history is
+not saved.  After saving the history, the history file is truncated
+to contain no more than @env{$HISTFILESIZE}
+lines.  If @env{HISTFILESIZE} is not set, no truncation is performed.
+
+If the @env{HISTTIMEFORMAT} is set, the time stamp information
+associated with each history entry is written to the history file.
+
+The builtin command @code{fc} may be used to list or edit and re-execute
+a portion of the history list.
+The @code{history} builtin may be used to display or modify the history
+list and manipulate the history file.
+When using command-line editing, search commands
+are available in each editing mode that provide access to the
+history list (@pxref{Commands For History}).
+
+The shell allows control over which commands are saved on the history
+list.  The @env{HISTCONTROL} and @env{HISTIGNORE}
+variables may be set to cause the shell to save only a subset of the
+commands entered.
+The @code{cmdhist}
+shell option, if enabled, causes the shell to attempt to save each
+line of a multi-line command in the same history entry, adding
+semicolons where necessary to preserve syntactic correctness.
+The @code{lithist}
+shell option causes the shell to save the command with embedded newlines
+instead of semicolons.
+The @code{shopt} builtin is used to set these options.
+@xref{Bash Builtins}, for a description of @code{shopt}.
+
+@node Bash History Builtins
+@section Bash History Builtins
+@cindex history builtins
+
+Bash provides two builtin commands which manipulate the
+history list and history file.
+
+@table @code
+
+@item fc
+@btindex fc
+@example
+@code{fc [-e @var{ename}] [-nlr] [@var{first}] [@var{last}]}
+@code{fc -s [@var{pat}=@var{rep}] [@var{command}]}
+@end example
+
+Fix Command.  In the first form, a range of commands from @var{first} to
+@var{last} is selected from the history list.  Both @var{first} and
+@var{last} may be specified as a string (to locate the most recent
+command beginning with that string) or as a number (an index into the
+history list, where a negative number is used as an offset from the
+current command number).  If @var{last} is not specified it is set to
+@var{first}.  If @var{first} is not specified it is set to the previous
+command for editing and @minus{}16 for listing.  If the @option{-l} flag is
+given, the commands are listed on standard output.  The @option{-n} flag
+suppresses the command numbers when listing.  The @option{-r} flag
+reverses the order of the listing.  Otherwise, the editor given by
+@var{ename} is invoked on a file containing those commands.  If
+@var{ename} is not given, the value of the following variable expansion
+is used: @code{$@{FCEDIT:-$@{EDITOR:-vi@}@}}.  This says to use the
+value of the @env{FCEDIT} variable if set, or the value of the
+@env{EDITOR} variable if that is set, or @code{vi} if neither is set.
+When editing is complete, the edited commands are echoed and executed.
+
+In the second form, @var{command} is re-executed after each instance
+of @var{pat} in the selected command is replaced by @var{rep}.
+
+A useful alias to use with the @code{fc} command is @code{r='fc -s'}, so
+that typing @samp{r cc} runs the last command beginning with @code{cc}
+and typing @samp{r} re-executes the last command (@pxref{Aliases}).
+
+@item history
+@btindex history
+@example
+history [@var{n}]
+history -c
+history -d @var{offset}
+history [-anrw] [@var{filename}]
+history -ps @var{arg}
+@end example
+
+With no options, display the history list with line numbers.
+Lines prefixed with a @samp{*} have been modified.
+An argument of @var{n} lists only the last @var{n} lines.
+If the shell variable @env{HISTTIMEFORMAT} is set and not null,
+it is used as a format string for @var{strftime} to display
+the time stamp associated with each displayed history entry.
+No intervening blank is printed between the formatted time stamp
+and the history line.
+
+Options, if supplied, have the following meanings:
+
+@table @code
+@item -c
+Clear the history list.  This may be combined
+with the other options to replace the history list completely.
+
+@item -d @var{offset}
+Delete the history entry at position @var{offset}.
+@var{offset} should be specified as it appears when the history is
+displayed.
+
+@item -a
+Append the new
+history lines (history lines entered since the beginning of the
+current Bash session) to the history file.
+
+@item -n
+Append the history lines not already read from the history file
+to the current history list.  These are lines appended to the history
+file since the beginning of the current Bash session.
+
+@item -r
+Read the current history file and append its contents to
+the history list.
+
+@item -w
+Write out the current history to the history file.
+
+@item -p
+Perform history substitution on the @var{arg}s and display the result
+on the standard output, without storing the results in the history list.
+
+@item -s
+The @var{arg}s are added to the end of
+the history list as a single entry.
+
+@end table
+
+When any of the @option{-w}, @option{-r}, @option{-a}, or @option{-n} options is
+used, if @var{filename}
+is given, then it is used as the history file.  If not, then
+the value of the @env{HISTFILE} variable is used.
+
+@end table
+@end ifset
+
+@node History Interaction
+@section History Expansion
+@cindex history expansion
+
+The History library provides a history expansion feature that is similar
+to the history expansion provided by @code{csh}.  This section
+describes the syntax used to manipulate the history information.
+
+History expansions introduce words from the history list into
+the input stream, making it easy to repeat commands, insert the
+arguments to a previous command into the current input line, or
+fix errors in previous commands quickly.
+
+History expansion takes place in two parts.  The first is to determine
+which line from the history list should be used during substitution.
+The second is to select portions of that line for inclusion into the
+current one.  The line selected from the history is called the
+@dfn{event}, and the portions of that line that are acted upon are
+called @dfn{words}.  Various @dfn{modifiers} are available to manipulate
+the selected words.  The line is broken into words in the same fashion
+that Bash does, so that several words
+surrounded by quotes are considered one word.
+History expansions are introduced by the appearance of the
+history expansion character, which is @samp{!} by default.
+@ifset BashFeatures
+Only @samp{\} and @samp{'} may be used to escape the history expansion
+character.
+@end ifset
+
+@ifset BashFeatures
+Several shell options settable with the @code{shopt}
+builtin (@pxref{Bash Builtins}) may be used to tailor
+the behavior of history expansion.  If the
+@code{histverify} shell option is enabled, and Readline
+is being used, history substitutions are not immediately passed to
+the shell parser.
+Instead, the expanded line is reloaded into the Readline
+editing buffer for further modification.
+If Readline is being used, and the @code{histreedit}
+shell option is enabled, a failed history expansion will be
+reloaded into the Readline editing buffer for correction.
+The @option{-p} option to the @code{history} builtin command
+may be used to see what a history expansion will do before using it.
+The @option{-s} option to the @code{history} builtin may be used to
+add commands to the end of the history list without actually executing
+them, so that they are available for subsequent recall.
+This is most useful in conjunction with Readline.
+
+The shell allows control of the various characters used by the
+history expansion mechanism with the @code{histchars} variable.
+@end ifset
+
+@menu
+* Event Designators::  How to specify which history line to use.
+* Word Designators::   Specifying which words are of interest.
+* Modifiers::          Modifying the results of substitution.
+@end menu
+
+@node Event Designators
+@subsection Event Designators
+@cindex event designators
+
+An event designator is a reference to a command line entry in the
+history list.
+@cindex history events
+
+@table @asis
+
+@item @code{!}
+@ifset BashFeatures
+Start a history substitution, except when followed by a space, tab,
+the end of the line, @samp{=} or @samp{(} (when the
+@code{extglob} shell option is enabled using the @code{shopt} builtin).
+@end ifset
+@ifclear BashFeatures
+Start a history substitution, except when followed by a space, tab,
+the end of the line, or @samp{=}.
+@end ifclear
+
+@item @code{!@var{n}}
+Refer to command line @var{n}.
+
+@item @code{!-@var{n}}
+Refer to the command @var{n} lines back.
+
+@item @code{!!}
+Refer to the previous command.  This is a synonym for @samp{!-1}.
+
+@item @code{!@var{string}}
+Refer to the most recent command starting with @var{string}.
+
+@item @code{!?@var{string}[?]}
+Refer to the most recent command containing @var{string}.  The trailing
+@samp{?} may be omitted if the @var{string} is followed immediately by
+a newline.
+
+@item @code{^@var{string1}^@var{string2}^}
+Quick Substitution.  Repeat the last command, replacing @var{string1}
+with @var{string2}.  Equivalent to
+@code{!!:s/@var{string1}/@var{string2}/}.
+
+@item @code{!#}
+The entire command line typed so far.
+
+@end table
+
+@node Word Designators
+@subsection Word Designators
+
+Word designators are used to select desired words from the event.
+A @samp{:} separates the event specification from the word designator.  It
+may be omitted if the word designator begins with a @samp{^}, @samp{$},
+@samp{*}, @samp{-}, or @samp{%}.  Words are numbered from the beginning
+of the line, with the first word being denoted by 0 (zero).  Words are
+inserted into the current line separated by single spaces.
+
+@need 0.75
+For example,
+
+@table @code
+@item !!
+designates the preceding command.  When you type this, the preceding
+command is repeated in toto.
+
+@item !!:$
+designates the last argument of the preceding command.  This may be
+shortened to @code{!$}.
+
+@item !fi:2
+designates the second argument of the most recent command starting with
+the letters @code{fi}.
+@end table
+
+@need 0.75
+Here are the word designators:
+@table @code
+
+@item 0 (zero)
+The @code{0}th word.  For many applications, this is the command word.
+
+@item @var{n}
+The @var{n}th word.
+
+@item ^
+The first argument; that is, word 1.
+
+@item $
+The last argument.
+
+@item %
+The word matched by the most recent @samp{?@var{string}?} search.
+
+@item @var{x}-@var{y}
+A range of words; @samp{-@var{y}} abbreviates @samp{0-@var{y}}.
+
+@item *
+All of the words, except the @code{0}th.  This is a synonym for @samp{1-$}.
+It is not an error to use @samp{*} if there is just one word in the event;
+the empty string is returned in that case.
+
+@item @var{x}*
+Abbreviates @samp{@var{x}-$}
+
+@item @var{x}-
+Abbreviates @samp{@var{x}-$} like @samp{@var{x}*}, but omits the last word.
+
+@end table
+
+If a word designator is supplied without an event specification, the
+previous command is used as the event.
+
+@node Modifiers
+@subsection Modifiers
+
+After the optional word designator, you can add a sequence of one or more
+of the following modifiers, each preceded by a @samp{:}.
+
+@table @code
+
+@item h
+Remove a trailing pathname component, leaving only the head.
+
+@item t
+Remove all leading  pathname  components, leaving the tail.
+
+@item r
+Remove a trailing suffix of the form @samp{.@var{suffix}}, leaving
+the basename.
+
+@item e
+Remove all but the trailing suffix.
+
+@item p
+Print the new command but do not execute it.
+
+@ifset BashFeatures
+@item q
+Quote the substituted words, escaping further substitutions.
+
+@item x
+Quote the substituted words as with @samp{q},
+but break into words at spaces, tabs, and newlines.
+@end ifset
+
+@item s/@var{old}/@var{new}/
+Substitute @var{new} for the first occurrence of @var{old} in the
+event line.  Any delimiter may be used in place of @samp{/}.
+The delimiter may be quoted in @var{old} and @var{new}
+with a single backslash.  If @samp{&} appears in @var{new},
+it is replaced by @var{old}.  A single backslash will quote
+the @samp{&}.  The final delimiter is optional if it is the last
+character on the input line.
+
+@item &
+Repeat the previous substitution.
+
+@item g
+@itemx a
+Cause changes to be applied over the entire event line.  Used in
+conjunction with @samp{s}, as in @code{gs/@var{old}/@var{new}/},
+or with @samp{&}.
+
+@item G
+Apply the following @samp{s} modifier once to each word in the event.
+
+@end table
diff --git a/doc/readline.0 b/doc/readline.0
new file mode 100644 (file)
index 0000000..5d9f609
--- /dev/null
@@ -0,0 +1,929 @@
+READLINE(3)                                                        READLINE(3)
+
+
+
+N\bNA\bAM\bME\bE
+       readline - get a line from a user with editing
+
+S\bSY\bYN\bNO\bOP\bPS\bSI\bIS\bS
+       #\b#i\bin\bnc\bcl\blu\bud\bde\be <\b<s\bst\btd\bdi\bio\bo.\b.h\bh>\b>
+       #\b#i\bin\bnc\bcl\blu\bud\bde\be <\b<r\bre\bea\bad\bdl\bli\bin\bne\be/\b/r\bre\bea\bad\bdl\bli\bin\bne\be.\b.h\bh>\b>
+       #\b#i\bin\bnc\bcl\blu\bud\bde\be <\b<r\bre\bea\bad\bdl\bli\bin\bne\be/\b/h\bhi\bis\bst\bto\bor\bry\by.\b.h\bh>\b>
+
+       _\bc_\bh_\ba_\br _\b*
+       r\bre\bea\bad\bdl\bli\bin\bne\be (_\bc_\bo_\bn_\bs_\bt _\bc_\bh_\ba_\br _\b*_\bp_\br_\bo_\bm_\bp_\bt);
+
+C\bCO\bOP\bPY\bYR\bRI\bIG\bGH\bHT\bT
+       Readline  is  Copyright  (C) 1989-2004 by the Free Software Foundation,
+       Inc.
+
+D\bDE\bES\bSC\bCR\bRI\bIP\bPT\bTI\bIO\bON\bN
+       r\bre\bea\bad\bdl\bli\bin\bne\be will read a line from the terminal and return it, using p\bpr\bro\bom\bmp\bpt\bt
+       as  a  prompt.   If  p\bpr\bro\bom\bmp\bpt\bt  is  N\bNU\bUL\bLL\bL or the empty string, no prompt is
+       issued.  The line returned is allocated with _\bm_\ba_\bl_\bl_\bo_\bc(3); the caller must
+       free  it  when  finished.   The  line  returned  has  the final newline
+       removed, so only the text of the line remains.
+
+       r\bre\bea\bad\bdl\bli\bin\bne\be offers editing capabilities while the  user  is  entering  the
+       line.   By  default,  the line editing commands are similar to those of
+       emacs.  A vi-style line editing interface is also available.
+
+       This manual page describes only the most basic use of  r\bre\bea\bad\bdl\bli\bin\bne\be.   Much
+       more  functionality  is available; see _\bT_\bh_\be _\bG_\bN_\bU _\bR_\be_\ba_\bd_\bl_\bi_\bn_\be _\bL_\bi_\bb_\br_\ba_\br_\by and _\bT_\bh_\be
+       _\bG_\bN_\bU _\bH_\bi_\bs_\bt_\bo_\br_\by _\bL_\bi_\bb_\br_\ba_\br_\by for additional information.
+
+R\bRE\bET\bTU\bUR\bRN\bN V\bVA\bAL\bLU\bUE\bE
+       r\bre\bea\bad\bdl\bli\bin\bne\be returns the text of the line read.  A blank line  returns  the
+       empty string.  If E\bEO\bOF\bF is encountered while reading a line, and the line
+       is empty, N\bNU\bUL\bLL\bL is returned.  If an E\bEO\bOF\bF is read with a  non-empty  line,
+       it is treated as a newline.
+
+N\bNO\bOT\bTA\bAT\bTI\bIO\bON\bN
+       An emacs-style notation is used to denote keystrokes.  Control keys are
+       denoted by C-_\bk_\be_\by, e.g., C-n means Control-N.  Similarly, _\bm_\be_\bt_\ba keys  are
+       denoted  by  M-_\bk_\be_\by,  so M-x means Meta-X.  (On keyboards without a _\bm_\be_\bt_\ba
+       key, M-_\bx means ESC _\bx, i.e., press the Escape key then the _\bx key.   This
+       makes  ESC the _\bm_\be_\bt_\ba _\bp_\br_\be_\bf_\bi_\bx.  The combination M-C-_\bx means ESC-Control-_\bx,
+       or press the Escape key then hold the Control key while pressing the  _\bx
+       key.)
+
+       Readline commands may be given numeric _\ba_\br_\bg_\bu_\bm_\be_\bn_\bt_\bs, which normally act as
+       a repeat count.  Sometimes, however, it is the  sign  of  the  argument
+       that  is  significant.   Passing  a negative argument to a command that
+       acts in the forward direction (e.g., k\bki\bil\bll\bl-\b-l\bli\bin\bne\be) causes that command  to
+       act  in  a  backward direction.  Commands whose behavior with arguments
+       deviates from this are noted.
+
+       When a command is described as _\bk_\bi_\bl_\bl_\bi_\bn_\bg text, the text deleted is  saved
+       for possible future retrieval (_\by_\ba_\bn_\bk_\bi_\bn_\bg).  The killed text is saved in a
+       _\bk_\bi_\bl_\bl _\br_\bi_\bn_\bg.  Consecutive kills cause the text to be accumulated into one
+       unit, which can be yanked all at once.  Commands which do not kill text
+       separate the chunks of text on the kill ring.
+
+I\bIN\bNI\bIT\bTI\bIA\bAL\bLI\bIZ\bZA\bAT\bTI\bIO\bON\bN F\bFI\bIL\bLE\bE
+       Readline is customized by putting commands in  an  initialization  file
+       (the  _\bi_\bn_\bp_\bu_\bt_\br_\bc  file).  The name of this file is taken from the value of
+       the I\bIN\bNP\bPU\bUT\bTR\bRC\bC environment variable.   If  that  variable  is  unset,  the
+       default is _\b~_\b/_\b._\bi_\bn_\bp_\bu_\bt_\br_\bc.  If that file  does not exist or cannot be read,
+       the ultimate default is _\b/_\be_\bt_\bc_\b/_\bi_\bn_\bp_\bu_\bt_\br_\bc.  When a program  which  uses  the
+       readline library starts up, the init file is read, and the key bindings
+       and variables are set.  There are only a few basic  constructs  allowed
+       in  the  readline init file.  Blank lines are ignored.  Lines beginning
+       with a #\b# are comments.  Lines beginning with a $\b$  indicate  conditional
+       constructs.   Other  lines  denote  key bindings and variable settings.
+       Each program using this library may add its own commands and  bindings.
+
+       For example, placing
+
+              M-Control-u: universal-argument
+       or
+              C-Meta-u: universal-argument
+
+       into  the _\bi_\bn_\bp_\bu_\bt_\br_\bc would make M-C-u execute the readline command _\bu_\bn_\bi_\bv_\be_\br_\b-
+       _\bs_\ba_\bl_\b-_\ba_\br_\bg_\bu_\bm_\be_\bn_\bt.
+
+       The following symbolic character names are recognized while  processing
+       key  bindings:  _\bD_\bE_\bL,  _\bE_\bS_\bC,  _\bE_\bS_\bC_\bA_\bP_\bE,  _\bL_\bF_\bD, _\bN_\bE_\bW_\bL_\bI_\bN_\bE, _\bR_\bE_\bT, _\bR_\bE_\bT_\bU_\bR_\bN, _\bR_\bU_\bB_\bO_\bU_\bT,
+       _\bS_\bP_\bA_\bC_\bE, _\bS_\bP_\bC, and _\bT_\bA_\bB.
+
+       In addition to command names, readline allows keys to  be  bound  to  a
+       string that is inserted when the key is pressed (a _\bm_\ba_\bc_\br_\bo).
+
+
+   K\bKe\bey\by B\bBi\bin\bnd\bdi\bin\bng\bgs\bs
+       The  syntax for controlling key bindings in the _\bi_\bn_\bp_\bu_\bt_\br_\bc file is simple.
+       All that is required is the name of the command or the text of a  macro
+       and  a key sequence to which it should be bound. The name may be speci-
+       fied in one of two ways: as a symbolic key name, possibly with _\bM_\be_\bt_\ba_\b- or
+       _\bC_\bo_\bn_\bt_\br_\bo_\bl_\b- prefixes, or as a key sequence.  The name and key sequence are
+       separated by a colon.  There can be no whitespace between the name  and
+       the colon.
+
+       When using the form k\bke\bey\byn\bna\bam\bme\be:_\bf_\bu_\bn_\bc_\bt_\bi_\bo_\bn_\b-_\bn_\ba_\bm_\be or _\bm_\ba_\bc_\br_\bo, _\bk_\be_\by_\bn_\ba_\bm_\be is the name
+       of a key spelled out in English.  For example:
+
+              Control-u: universal-argument
+              Meta-Rubout: backward-kill-word
+              Control-o: "> output"
+
+       In the above example, _\bC_\b-_\bu is bound to the function  u\bun\bni\biv\bve\ber\brs\bsa\bal\bl-\b-a\bar\brg\bgu\bum\bme\ben\bnt\bt,
+       _\bM_\b-_\bD_\bE_\bL  is bound to the function b\bba\bac\bck\bkw\bwa\bar\brd\bd-\b-k\bki\bil\bll\bl-\b-w\bwo\bor\brd\bd, and _\bC_\b-_\bo is bound to
+       run the macro expressed on the right hand side (that is, to insert  the
+       text ``> output'' into the line).
+
+       In  the  second  form,  "\b"k\bke\bey\bys\bse\beq\bq"\b":_\bf_\bu_\bn_\bc_\bt_\bi_\bo_\bn_\b-_\bn_\ba_\bm_\be or _\bm_\ba_\bc_\br_\bo, k\bke\bey\bys\bse\beq\bq differs
+       from k\bke\bey\byn\bna\bam\bme\be above in that strings denoting an entire key sequence  may
+       be  specified  by  placing the sequence within double quotes.  Some GNU
+       Emacs style key escapes can be used, as in the following  example,  but
+       the symbolic character names are not recognized.
+
+              "\C-u": universal-argument
+              "\C-x\C-r": re-read-init-file
+              "\e[11~": "Function Key 1"
+
+       In this example, _\bC_\b-_\bu is again bound to the function u\bun\bni\biv\bve\ber\brs\bsa\bal\bl-\b-a\bar\brg\bgu\bum\bme\ben\bnt\bt.
+       _\bC_\b-_\bx _\bC_\b-_\br is bound to the function r\bre\be-\b-r\bre\bea\bad\bd-\b-i\bin\bni\bit\bt-\b-f\bfi\bil\ble\be, and _\bE_\bS_\bC _\b[ _\b1 _\b1 _\b~  is
+       bound to insert the text ``Function Key 1''.
+
+       The  full set of GNU Emacs style escape sequences available when speci-
+       fying key sequences is
+              \\b\C\bC-\b-    control prefix
+              \\b\M\bM-\b-    meta prefix
+              \\b\e\be     an escape character
+              \\b\\\b\     backslash
+              \\b\"\b"     literal ", a double quote
+              \\b\'\b'     literal ', a single quote
+
+       In addition to the GNU Emacs style escape sequences, a  second  set  of
+       backslash escapes is available:
+              \\b\a\ba     alert (bell)
+              \\b\b\bb     backspace
+              \\b\d\bd     delete
+              \\b\f\bf     form feed
+              \\b\n\bn     newline
+              \\b\r\br     carriage return
+              \\b\t\bt     horizontal tab
+              \\b\v\bv     vertical tab
+              \\b\_\bn_\bn_\bn   the  eight-bit  character  whose value is the octal value
+                     _\bn_\bn_\bn (one to three digits)
+              \\b\x\bx_\bH_\bH   the eight-bit character whose value  is  the  hexadecimal
+                     value _\bH_\bH (one or two hex digits)
+
+       When  entering  the  text of a macro, single or double quotes should be
+       used to indicate a macro definition.  Unquoted text is assumed to be  a
+       function  name.   In  the  macro  body, the backslash escapes described
+       above are expanded.  Backslash will quote any other  character  in  the
+       macro text, including " and '.
+
+       B\bBa\bas\bsh\bh  allows the current readline key bindings to be displayed or modi-
+       fied with the b\bbi\bin\bnd\bd builtin command.  The editing mode may  be  switched
+       during  interactive  use by using the -\b-o\bo option to the s\bse\bet\bt builtin com-
+       mand.  Other programs using this library  provide  similar  mechanisms.
+       The  _\bi_\bn_\bp_\bu_\bt_\br_\bc  file may be edited and re-read if a program does not pro-
+       vide any other means to incorporate new bindings.
+
+   V\bVa\bar\bri\bia\bab\bbl\ble\bes\bs
+       Readline has variables that can be used to further customize its behav-
+       ior.  A variable may be set in the _\bi_\bn_\bp_\bu_\bt_\br_\bc file with a statement of the
+       form
+
+              s\bse\bet\bt _\bv_\ba_\br_\bi_\ba_\bb_\bl_\be_\b-_\bn_\ba_\bm_\be _\bv_\ba_\bl_\bu_\be
+
+       Except where noted, readline variables can take the values  O\bOn\bn  or  O\bOf\bff\bf
+       (without  regard  to  case).   Unrecognized variable names are ignored.
+       When a variable value is read, empty or null values, "on"  (case-insen-
+       sitive), and "1" are equivalent to O\bOn\bn.  All other values are equivalent
+       to O\bOf\bff\bf.  The variables and their default values are:
+
+       b\bbe\bel\bll\bl-\b-s\bst\bty\byl\ble\be (\b(a\bau\bud\bdi\bib\bbl\ble\be)\b)
+              Controls what happens when readline wants to ring  the  terminal
+              bell.  If set to n\bno\bon\bne\be, readline never rings the bell.  If set to
+              v\bvi\bis\bsi\bib\bbl\ble\be, readline uses a visible bell if one is  available.   If
+              set to a\bau\bud\bdi\bib\bbl\ble\be, readline attempts to ring the terminal's bell.
+       b\bbi\bin\bnd\bd-\b-t\btt\bty\by-\b-s\bsp\bpe\bec\bci\bia\bal\bl-\b-c\bch\bha\bar\brs\bs (\b(O\bOn\bn)\b)
+              If  set  to O\bOn\bn, readline attempts to bind the control characters
+              treated specially by the kernel's terminal driver to their read-
+              line equivalents.
+       c\bco\bom\bmm\bme\ben\bnt\bt-\b-b\bbe\beg\bgi\bin\bn (\b(`\b``\b`#\b#'\b''\b')\b)
+              The  string  that is inserted in v\bvi\bi mode when the i\bin\bns\bse\ber\brt\bt-\b-c\bco\bom\bmm\bme\ben\bnt\bt
+              command is executed.  This command is bound to M\bM-\b-#\b# in emacs mode
+              and to #\b# in vi command mode.
+       c\bco\bom\bmp\bpl\ble\bet\bti\bio\bon\bn-\b-i\big\bgn\bno\bor\bre\be-\b-c\bca\bas\bse\be (\b(O\bOf\bff\bf)\b)
+              If set to O\bOn\bn, readline performs filename matching and completion
+              in a case-insensitive fashion.
+       c\bco\bom\bmp\bpl\ble\bet\bti\bio\bon\bn-\b-q\bqu\bue\ber\bry\by-\b-i\bit\bte\bem\bms\bs (\b(1\b10\b00\b0)\b)
+              This determines when the user is queried about viewing the  num-
+              ber  of  possible  completions generated by the p\bpo\bos\bss\bsi\bib\bbl\ble\be-\b-c\bco\bom\bmp\bpl\ble\be-\b-
+              t\bti\bio\bon\bns\bs command.  It may be set to any integer value greater  than
+              or  equal  to  zero.   If  the number of possible completions is
+              greater than or equal to the value of this variable, the user is
+              asked  whether or not he wishes to view them; otherwise they are
+              simply listed on the terminal.  A negative value causes readline
+              to never ask.
+       c\bco\bon\bnv\bve\ber\brt\bt-\b-m\bme\bet\bta\ba (\b(O\bOn\bn)\b)
+              If  set  to O\bOn\bn, readline will convert characters with the eighth
+              bit set to an ASCII key sequence by stripping the eighth bit and
+              prefixing  it  with an escape character (in effect, using escape
+              as the _\bm_\be_\bt_\ba _\bp_\br_\be_\bf_\bi_\bx).
+       d\bdi\bis\bsa\bab\bbl\ble\be-\b-c\bco\bom\bmp\bpl\ble\bet\bti\bio\bon\bn (\b(O\bOf\bff\bf)\b)
+              If set to O\bOn\bn, readline will inhibit word completion.  Completion
+              characters  will  be  inserted into the line as if they had been
+              mapped to s\bse\bel\blf\bf-\b-i\bin\bns\bse\ber\brt\bt.
+       e\bed\bdi\bit\bti\bin\bng\bg-\b-m\bmo\bod\bde\be (\b(e\bem\bma\bac\bcs\bs)\b)
+              Controls whether readline begins with a set of key bindings sim-
+              ilar to emacs or vi.  e\bed\bdi\bit\bti\bin\bng\bg-\b-m\bmo\bod\bde\be can be set to either e\bem\bma\bac\bcs\bs or
+              v\bvi\bi.
+       e\ben\bna\bab\bbl\ble\be-\b-k\bke\bey\byp\bpa\bad\bd (\b(O\bOf\bff\bf)\b)
+              When set to O\bOn\bn, readline will try to enable the application key-
+              pad  when  it  is  called.  Some systems need this to enable the
+              arrow keys.
+       e\bex\bxp\bpa\ban\bnd\bd-\b-t\bti\bil\bld\bde\be (\b(O\bOf\bff\bf)\b)
+              If set  to  o\bon\bn,  tilde  expansion  is  performed  when  readline
+              attempts word completion.
+       h\bhi\bis\bst\bto\bor\bry\by-\b-p\bpr\bre\bes\bse\ber\brv\bve\be-\b-p\bpo\boi\bin\bnt\bt (\b(O\bOf\bff\bf)\b)
+              If  set  to  o\bon\bn, the history code attempts to place point at the
+              same location on each history line retrieved with  p\bpr\bre\bev\bvi\bio\bou\bus\bs-\b-h\bhi\bis\bs-\b-
+              t\bto\bor\bry\by or n\bne\bex\bxt\bt-\b-h\bhi\bis\bst\bto\bor\bry\by.
+       h\bho\bor\bri\biz\bzo\bon\bnt\bta\bal\bl-\b-s\bsc\bcr\bro\bol\bll\bl-\b-m\bmo\bod\bde\be (\b(O\bOf\bff\bf)\b)
+              When  set  to  O\bOn\bn, makes readline use a single line for display,
+              scrolling the input horizontally on a single screen line when it
+              becomes  longer  than the screen width rather than wrapping to a
+              new line.
+       i\bin\bnp\bpu\but\bt-\b-m\bme\bet\bta\ba (\b(O\bOf\bff\bf)\b)
+              If set to O\bOn\bn, readline will enable eight-bit input (that is,  it
+              will  not  clear  the  eighth  bit  in the characters it reads),
+              regardless of what the terminal claims it can support.  The name
+              m\bme\bet\bta\ba-\b-f\bfl\bla\bag\bg is a synonym for this variable.
+       i\bis\bse\bea\bar\brc\bch\bh-\b-t\bte\ber\brm\bmi\bin\bna\bat\bto\bor\brs\bs (\b(`\b``\b`C\bC-\b-[\b[ C\bC-\b-J\bJ'\b''\b')\b)
+              The  string  of  characters that should terminate an incremental
+              search without subsequently executing the character  as  a  com-
+              mand.   If this variable has not been given a value, the charac-
+              ters _\bE_\bS_\bC and _\bC_\b-_\bJ will terminate an incremental search.
+       k\bke\bey\bym\bma\bap\bp (\b(e\bem\bma\bac\bcs\bs)\b)
+              Set the current readline keymap.  The set of legal keymap  names
+              is  _\be_\bm_\ba_\bc_\bs_\b,  _\be_\bm_\ba_\bc_\bs_\b-_\bs_\bt_\ba_\bn_\bd_\ba_\br_\bd_\b, _\be_\bm_\ba_\bc_\bs_\b-_\bm_\be_\bt_\ba_\b, _\be_\bm_\ba_\bc_\bs_\b-_\bc_\bt_\bl_\bx_\b, _\bv_\bi_\b, _\bv_\bi_\b-_\bm_\bo_\bv_\be_\b,
+              _\bv_\bi_\b-_\bc_\bo_\bm_\bm_\ba_\bn_\bd, and _\bv_\bi_\b-_\bi_\bn_\bs_\be_\br_\bt.   _\bv_\bi  is  equivalent  to  _\bv_\bi_\b-_\bc_\bo_\bm_\bm_\ba_\bn_\bd;
+              _\be_\bm_\ba_\bc_\bs  is  equivalent  to  _\be_\bm_\ba_\bc_\bs_\b-_\bs_\bt_\ba_\bn_\bd_\ba_\br_\bd.  The default value is
+              _\be_\bm_\ba_\bc_\bs.  The value  of  e\bed\bdi\bit\bti\bin\bng\bg-\b-m\bmo\bod\bde\be  also  affects  the  default
+              keymap.
+       m\bma\bar\brk\bk-\b-d\bdi\bir\bre\bec\bct\bto\bor\bri\bie\bes\bs (\b(O\bOn\bn)\b)
+              If set to O\bOn\bn, completed directory names have a slash appended.
+       m\bma\bar\brk\bk-\b-m\bmo\bod\bdi\bif\bfi\bie\bed\bd-\b-l\bli\bin\bne\bes\bs (\b(O\bOf\bff\bf)\b)
+              If  set  to  O\bOn\bn,  history lines that have been modified are dis-
+              played with a preceding asterisk (*\b*).
+       m\bma\bar\brk\bk-\b-s\bsy\bym\bml\bli\bin\bnk\bke\bed\bd-\b-d\bdi\bir\bre\bec\bct\bto\bor\bri\bie\bes\bs (\b(O\bOf\bff\bf)\b)
+              If set to O\bOn\bn, completed names which are symbolic links to direc-
+              tories   have   a  slash  appended  (subject  to  the  value  of
+              m\bma\bar\brk\bk-\b-d\bdi\bir\bre\bec\bct\bto\bor\bri\bie\bes\bs).
+       m\bma\bat\btc\bch\bh-\b-h\bhi\bid\bdd\bde\ben\bn-\b-f\bfi\bil\ble\bes\bs (\b(O\bOn\bn)\b)
+              This variable, when set to O\bOn\bn, causes readline  to  match  files
+              whose  names  begin  with  a  `.' (hidden files) when performing
+              filename completion, unless the leading `.' is supplied  by  the
+              user in the filename to be completed.
+       o\bou\but\btp\bpu\but\bt-\b-m\bme\bet\bta\ba (\b(O\bOf\bff\bf)\b)
+              If  set  to O\bOn\bn, readline will display characters with the eighth
+              bit set directly rather than as a meta-prefixed escape sequence.
+       p\bpa\bag\bge\be-\b-c\bco\bom\bmp\bpl\ble\bet\bti\bio\bon\bns\bs (\b(O\bOn\bn)\b)
+              If  set to O\bOn\bn, readline uses an internal _\bm_\bo_\br_\be-like pager to dis-
+              play a screenful of possible completions at a time.
+       p\bpr\bri\bin\bnt\bt-\b-c\bco\bom\bmp\bpl\ble\bet\bti\bio\bon\bns\bs-\b-h\bho\bor\bri\biz\bzo\bon\bnt\bta\bal\bll\bly\by (\b(O\bOf\bff\bf)\b)
+              If set to O\bOn\bn, readline will  display  completions  with  matches
+              sorted  horizontally in alphabetical order, rather than down the
+              screen.
+       s\bsh\bho\bow\bw-\b-a\bal\bll\bl-\b-i\bif\bf-\b-a\bam\bmb\bbi\big\bgu\buo\bou\bus\bs (\b(O\bOf\bff\bf)\b)
+              This alters the default behavior of  the  completion  functions.
+              If set to o\bon\bn, words which have more than one possible completion
+              cause the matches to be listed immediately  instead  of  ringing
+              the bell.
+       s\bsh\bho\bow\bw-\b-a\bal\bll\bl-\b-i\bif\bf-\b-u\bun\bnm\bmo\bod\bdi\bif\bfi\bie\bed\bd (\b(O\bOf\bff\bf)\b)
+              This  alters the default behavior of the completion functions in
+              a fashion similar to s\bsh\bho\bow\bw-\b-a\bal\bll\bl-\b-i\bif\bf-\b-a\bam\bmb\bbi\big\bgu\buo\bou\bus\bs.  If set to o\bon\bn, words
+              which  have more than one possible completion without any possi-
+              ble partial completion (the possible completions don't  share  a
+              common  prefix)  cause  the  matches  to  be  listed immediately
+              instead of ringing the bell.
+       v\bvi\bis\bsi\bib\bbl\ble\be-\b-s\bst\bta\bat\bts\bs (\b(O\bOf\bff\bf)\b)
+              If set to O\bOn\bn, a character denoting a file's type as reported  by
+              _\bs_\bt_\ba_\bt(2)  is  appended to the filename when listing possible com-
+              pletions.
+
+   C\bCo\bon\bnd\bdi\bit\bti\bio\bon\bna\bal\bl C\bCo\bon\bns\bst\btr\bru\buc\bct\bts\bs
+       Readline implements a facility similar in  spirit  to  the  conditional
+       compilation  features  of  the C preprocessor which allows key bindings
+       and variable settings to be performed as the result  of  tests.   There
+       are four parser directives used.
+
+       $\b$i\bif\bf    The  $\b$i\bif\bf construct allows bindings to be made based on the edit-
+              ing mode, the terminal being  used,  or  the  application  using
+              readline.   The text of the test extends to the end of the line;
+              no characters are required to isolate it.
+
+              m\bmo\bod\bde\be   The m\bmo\bod\bde\be=\b= form of the  $\b$i\bif\bf  directive  is  used  to  test
+                     whether  readline  is  in  emacs or vi mode.  This may be
+                     used in conjunction with  the  s\bse\bet\bt  k\bke\bey\bym\bma\bap\bp  command,  for
+                     instance,  to  set  bindings  in  the  _\be_\bm_\ba_\bc_\bs_\b-_\bs_\bt_\ba_\bn_\bd_\ba_\br_\bd and
+                     _\be_\bm_\ba_\bc_\bs_\b-_\bc_\bt_\bl_\bx keymaps only if readline is  starting  out  in
+                     emacs mode.
+
+              t\bte\ber\brm\bm   The  t\bte\ber\brm\bm=\b=  form may be used to include terminal-specific
+                     key bindings, perhaps to bind the key sequences output by
+                     the terminal's function keys.  The word on the right side
+                     of the =\b= is tested against the full name of the  terminal
+                     and  the portion of the terminal name before the first -\b-.
+                     This allows _\bs_\bu_\bn  to  match  both  _\bs_\bu_\bn  and  _\bs_\bu_\bn_\b-_\bc_\bm_\bd,  for
+                     instance.
+
+              a\bap\bpp\bpl\bli\bic\bca\bat\bti\bio\bon\bn
+                     The a\bap\bpp\bpl\bli\bic\bca\bat\bti\bio\bon\bn construct is used to include application-
+                     specific  settings.   Each  program  using  the  readline
+                     library  sets the _\ba_\bp_\bp_\bl_\bi_\bc_\ba_\bt_\bi_\bo_\bn _\bn_\ba_\bm_\be, and an initialization
+                     file can test for a particular value.  This could be used
+                     to  bind key sequences to functions useful for a specific
+                     program.  For instance, the following command adds a  key
+                     sequence  that  quotes  the  current  or previous word in
+                     Bash:
+
+                     $\b$i\bif\bf Bash
+                     # Quote the current or previous word
+                     "\C-xq": "\eb\"\ef\""
+                     $\b$e\ben\bnd\bdi\bif\bf
+
+       $\b$e\ben\bnd\bdi\bif\bf This command, as seen in the previous example, terminates an $\b$i\bif\bf
+              command.
+
+       $\b$e\bel\bls\bse\be  Commands in this branch of the $\b$i\bif\bf directive are executed if the
+              test fails.
+
+       $\b$i\bin\bnc\bcl\blu\bud\bde\be
+              This directive takes a single filename as an argument and  reads
+              commands  and bindings from that file.  For example, the follow-
+              ing directive would read _\b/_\be_\bt_\bc_\b/_\bi_\bn_\bp_\bu_\bt_\br_\bc:
+
+              $\b$i\bin\bnc\bcl\blu\bud\bde\be  _\b/_\be_\bt_\bc_\b/_\bi_\bn_\bp_\bu_\bt_\br_\bc
+
+S\bSE\bEA\bAR\bRC\bCH\bHI\bIN\bNG\bG
+       Readline provides commands for searching through  the  command  history
+       for  lines  containing a specified string.  There are two search modes:
+       _\bi_\bn_\bc_\br_\be_\bm_\be_\bn_\bt_\ba_\bl and _\bn_\bo_\bn_\b-_\bi_\bn_\bc_\br_\be_\bm_\be_\bn_\bt_\ba_\bl.
+
+       Incremental searches begin before the  user  has  finished  typing  the
+       search  string.  As each character of the search string is typed, read-
+       line displays the next entry from the history matching the string typed
+       so  far.   An  incremental  search  requires only as many characters as
+       needed to find the desired history entry.  To search  backward  in  the
+       history for a particular string, type C\bC-\b-r\br.  Typing C\bC-\b-s\bs searches forward
+       through the history.  The  characters  present  in  the  value  of  the
+       i\bis\bse\bea\bar\brc\bch\bh-\b-t\bte\ber\brm\bmi\bin\bna\bat\bto\bor\brs\bs  variable  are  used  to  terminate  an incremental
+       search.  If that variable has not been assigned a value the _\bE_\bs_\bc_\ba_\bp_\be  and
+       C\bC-\b-J\bJ characters will terminate an incremental search.  C\bC-\b-G\bG will abort an
+       incremental search and restore the original line.  When the  search  is
+       terminated,  the history entry containing the search string becomes the
+       current line.
+
+       To find other matching entries in the history list, type C\bC-\b-s\bs or C\bC-\b-r\br  as
+       appropriate.   This  will search backward or forward in the history for
+       the next line matching the search string typed so far.  Any  other  key
+       sequence bound to a readline command will terminate the search and exe-
+       cute that command.  For instance, a newline will terminate  the  search
+       and  accept  the  line,  thereby executing the command from the history
+       list.  A movement command will terminate the search, make the last line
+       found the current line, and begin editing.
+
+       Non-incremental  searches read the entire search string before starting
+       to search for matching history lines.  The search string may  be  typed
+       by the user or be part of the contents of the current line.
+
+E\bED\bDI\bIT\bTI\bIN\bNG\bG C\bCO\bOM\bMM\bMA\bAN\bND\bDS\bS
+       The  following  is  a list of the names of the commands and the default
+       key sequences to which they are bound.  Command names without an accom-
+       panying key sequence are unbound by default.
+
+       In the following descriptions, _\bp_\bo_\bi_\bn_\bt refers to the current cursor posi-
+       tion, and _\bm_\ba_\br_\bk refers to a cursor position saved by the  s\bse\bet\bt-\b-m\bma\bar\brk\bk  com-
+       mand.   The  text  between  the  point  and  mark is referred to as the
+       _\br_\be_\bg_\bi_\bo_\bn.
+
+   C\bCo\bom\bmm\bma\ban\bnd\bds\bs f\bfo\bor\br M\bMo\bov\bvi\bin\bng\bg
+       b\bbe\beg\bgi\bin\bnn\bni\bin\bng\bg-\b-o\bof\bf-\b-l\bli\bin\bne\be (\b(C\bC-\b-a\ba)\b)
+              Move to the start of the current line.
+       e\ben\bnd\bd-\b-o\bof\bf-\b-l\bli\bin\bne\be (\b(C\bC-\b-e\be)\b)
+              Move to the end of the line.
+       f\bfo\bor\brw\bwa\bar\brd\bd-\b-c\bch\bha\bar\br (\b(C\bC-\b-f\bf)\b)
+              Move forward a character.
+       b\bba\bac\bck\bkw\bwa\bar\brd\bd-\b-c\bch\bha\bar\br (\b(C\bC-\b-b\bb)\b)
+              Move back a character.
+       f\bfo\bor\brw\bwa\bar\brd\bd-\b-w\bwo\bor\brd\bd (\b(M\bM-\b-f\bf)\b)
+              Move forward to the end of the next word.  Words are composed of
+              alphanumeric characters (letters and digits).
+       b\bba\bac\bck\bkw\bwa\bar\brd\bd-\b-w\bwo\bor\brd\bd (\b(M\bM-\b-b\bb)\b)
+              Move  back  to the start of the current or previous word.  Words
+              are composed of alphanumeric characters (letters and digits).
+       c\bcl\ble\bea\bar\br-\b-s\bsc\bcr\bre\bee\ben\bn (\b(C\bC-\b-l\bl)\b)
+              Clear the screen leaving the current line  at  the  top  of  the
+              screen.   With  an  argument,  refresh  the current line without
+              clearing the screen.
+       r\bre\bed\bdr\bra\baw\bw-\b-c\bcu\bur\brr\bre\ben\bnt\bt-\b-l\bli\bin\bne\be
+              Refresh the current line.
+
+   C\bCo\bom\bmm\bma\ban\bnd\bds\bs f\bfo\bor\br M\bMa\ban\bni\bip\bpu\bul\bla\bat\bti\bin\bng\bg t\bth\bhe\be H\bHi\bis\bst\bto\bor\bry\by
+       a\bac\bcc\bce\bep\bpt\bt-\b-l\bli\bin\bne\be (\b(N\bNe\bew\bwl\bli\bin\bne\be,\b, R\bRe\bet\btu\bur\brn\bn)\b)
+              Accept the line regardless of where the cursor is.  If this line
+              is  non-empty,  it  may  be added to the history list for future
+              recall with a\bad\bdd\bd_\b_h\bhi\bis\bst\bto\bor\bry\by(\b()\b).  If the line is  a  modified  history
+              line, the history line is restored to its original state.
+       p\bpr\bre\bev\bvi\bio\bou\bus\bs-\b-h\bhi\bis\bst\bto\bor\bry\by (\b(C\bC-\b-p\bp)\b)
+              Fetch the previous command from the history list, moving back in
+              the list.
+       n\bne\bex\bxt\bt-\b-h\bhi\bis\bst\bto\bor\bry\by (\b(C\bC-\b-n\bn)\b)
+              Fetch the next command from the history list, moving forward  in
+              the list.
+       b\bbe\beg\bgi\bin\bnn\bni\bin\bng\bg-\b-o\bof\bf-\b-h\bhi\bis\bst\bto\bor\bry\by (\b(M\bM-\b-<\b<)\b)
+              Move to the first line in the history.
+       e\ben\bnd\bd-\b-o\bof\bf-\b-h\bhi\bis\bst\bto\bor\bry\by (\b(M\bM-\b->\b>)\b)
+              Move  to  the end of the input history, i.e., the line currently
+              being entered.
+       r\bre\bev\bve\ber\brs\bse\be-\b-s\bse\bea\bar\brc\bch\bh-\b-h\bhi\bis\bst\bto\bor\bry\by (\b(C\bC-\b-r\br)\b)
+              Search backward starting at the current  line  and  moving  `up'
+              through  the  history  as  necessary.   This  is  an incremental
+              search.
+       f\bfo\bor\brw\bwa\bar\brd\bd-\b-s\bse\bea\bar\brc\bch\bh-\b-h\bhi\bis\bst\bto\bor\bry\by (\b(C\bC-\b-s\bs)\b)
+              Search forward starting at the current line  and  moving  `down'
+              through  the  history  as  necessary.   This  is  an incremental
+              search.
+       n\bno\bon\bn-\b-i\bin\bnc\bcr\bre\bem\bme\ben\bnt\bta\bal\bl-\b-r\bre\bev\bve\ber\brs\bse\be-\b-s\bse\bea\bar\brc\bch\bh-\b-h\bhi\bis\bst\bto\bor\bry\by (\b(M\bM-\b-p\bp)\b)
+              Search backward through the history starting at the current line
+              using  a  non-incremental  search  for  a string supplied by the
+              user.
+       n\bno\bon\bn-\b-i\bin\bnc\bcr\bre\bem\bme\ben\bnt\bta\bal\bl-\b-f\bfo\bor\brw\bwa\bar\brd\bd-\b-s\bse\bea\bar\brc\bch\bh-\b-h\bhi\bis\bst\bto\bor\bry\by (\b(M\bM-\b-n\bn)\b)
+              Search forward  through  the  history  using  a  non-incremental
+              search for a string supplied by the user.
+       h\bhi\bis\bst\bto\bor\bry\by-\b-s\bse\bea\bar\brc\bch\bh-\b-f\bfo\bor\brw\bwa\bar\brd\bd
+              Search  forward through the history for the string of characters
+              between the start of the current line  and  the  current  cursor
+              position (the _\bp_\bo_\bi_\bn_\bt).  This is a non-incremental search.
+       h\bhi\bis\bst\bto\bor\bry\by-\b-s\bse\bea\bar\brc\bch\bh-\b-b\bba\bac\bck\bkw\bwa\bar\brd\bd
+              Search backward through the history for the string of characters
+              between the start of the current line and the point.  This is  a
+              non-incremental search.
+       y\bya\ban\bnk\bk-\b-n\bnt\bth\bh-\b-a\bar\brg\bg (\b(M\bM-\b-C\bC-\b-y\by)\b)
+              Insert  the  first argument to the previous command (usually the
+              second word on the previous line) at point.  With an argument _\bn,
+              insert  the _\bnth word from the previous command (the words in the
+              previous command  begin  with  word  0).   A  negative  argument
+              inserts the _\bnth word from the end of the previous command.  Once
+              the argument _\bn is computed, the argument is extracted as if  the
+              "!_\bn" history expansion had been specified.
+       y\bya\ban\bnk\bk-\b-l\bla\bas\bst\bt-\b-a\bar\brg\bg (\b(M\bM-\b-.\b.,\b, M\bM-\b-_\b_)\b)
+              Insert  the last argument to the previous command (the last word
+              of the  previous  history  entry).   With  an  argument,  behave
+              exactly  like  y\bya\ban\bnk\bk-\b-n\bnt\bth\bh-\b-a\bar\brg\bg.   Successive calls to y\bya\ban\bnk\bk-\b-l\bla\bas\bst\bt-\b-a\bar\brg\bg
+              move back through the history list, inserting the last  argument
+              of each line in turn.  The history expansion facilities are used
+              to extract the last argument, as if the "!$"  history  expansion
+              had been specified.
+
+   C\bCo\bom\bmm\bma\ban\bnd\bds\bs f\bfo\bor\br C\bCh\bha\ban\bng\bgi\bin\bng\bg T\bTe\bex\bxt\bt
+       d\bde\bel\ble\bet\bte\be-\b-c\bch\bha\bar\br (\b(C\bC-\b-d\bd)\b)
+              Delete  the character at point.  If point is at the beginning of
+              the line, there are no characters in  the  line,  and  the  last
+              character typed was not bound to d\bde\bel\ble\bet\bte\be-\b-c\bch\bha\bar\br, then return E\bEO\bOF\bF.
+       b\bba\bac\bck\bkw\bwa\bar\brd\bd-\b-d\bde\bel\ble\bet\bte\be-\b-c\bch\bha\bar\br (\b(R\bRu\bub\bbo\bou\but\bt)\b)
+              Delete  the  character  behind the cursor.  When given a numeric
+              argument, save the deleted text on the kill ring.
+       f\bfo\bor\brw\bwa\bar\brd\bd-\b-b\bba\bac\bck\bkw\bwa\bar\brd\bd-\b-d\bde\bel\ble\bet\bte\be-\b-c\bch\bha\bar\br
+              Delete the character under the cursor, unless the cursor  is  at
+              the end of the line, in which case the character behind the cur-
+              sor is deleted.
+       q\bqu\buo\bot\bte\bed\bd-\b-i\bin\bns\bse\ber\brt\bt (\b(C\bC-\b-q\bq,\b, C\bC-\b-v\bv)\b)
+              Add the next character that you type to the line verbatim.  This
+              is how to insert characters like C\bC-\b-q\bq, for example.
+       t\bta\bab\bb-\b-i\bin\bns\bse\ber\brt\bt (\b(M\bM-\b-T\bTA\bAB\bB)\b)
+              Insert a tab character.
+       s\bse\bel\blf\bf-\b-i\bin\bns\bse\ber\brt\bt (\b(a\ba,\b, b\bb,\b, A\bA,\b, 1\b1,\b, !\b!,\b, .\b..\b..\b.)\b)
+              Insert the character typed.
+       t\btr\bra\ban\bns\bsp\bpo\bos\bse\be-\b-c\bch\bha\bar\brs\bs (\b(C\bC-\b-t\bt)\b)
+              Drag  the  character  before point forward over the character at
+              point, moving point forward as well.  If point is at the end  of
+              the  line, then this transposes the two characters before point.
+              Negative arguments have no effect.
+       t\btr\bra\ban\bns\bsp\bpo\bos\bse\be-\b-w\bwo\bor\brd\bds\bs (\b(M\bM-\b-t\bt)\b)
+              Drag the word before point past the  word  after  point,  moving
+              point  over  that  word  as well.  If point is at the end of the
+              line, this transposes the last two words on the line.
+       u\bup\bpc\bca\bas\bse\be-\b-w\bwo\bor\brd\bd (\b(M\bM-\b-u\bu)\b)
+              Uppercase the current (or  following)  word.   With  a  negative
+              argument, uppercase the previous word, but do not move point.
+       d\bdo\bow\bwn\bnc\bca\bas\bse\be-\b-w\bwo\bor\brd\bd (\b(M\bM-\b-l\bl)\b)
+              Lowercase  the  current  (or  following)  word.  With a negative
+              argument, lowercase the previous word, but do not move point.
+       c\bca\bap\bpi\bit\bta\bal\bli\biz\bze\be-\b-w\bwo\bor\brd\bd (\b(M\bM-\b-c\bc)\b)
+              Capitalize the current (or following)  word.   With  a  negative
+              argument, capitalize the previous word, but do not move point.
+       o\bov\bve\ber\brw\bwr\bri\bit\bte\be-\b-m\bmo\bod\bde\be
+              Toggle  overwrite mode.  With an explicit positive numeric argu-
+              ment, switches to overwrite mode.  With an explicit non-positive
+              numeric argument, switches to insert mode.  This command affects
+              only e\bem\bma\bac\bcs\bs mode; v\bvi\bi mode does overwrite differently.  Each  call
+              to _\br_\be_\ba_\bd_\bl_\bi_\bn_\be_\b(_\b) starts in insert mode.  In overwrite mode, charac-
+              ters bound to s\bse\bel\blf\bf-\b-i\bin\bns\bse\ber\brt\bt replace the text at point rather  than
+              pushing  the  text  to  the  right.   Characters  bound to b\bba\bac\bck\bk-\b-
+              w\bwa\bar\brd\bd-\b-d\bde\bel\ble\bet\bte\be-\b-c\bch\bha\bar\br replace  the  character  before  point  with  a
+              space.  By default, this command is unbound.
+
+   K\bKi\bil\bll\bli\bin\bng\bg a\ban\bnd\bd Y\bYa\ban\bnk\bki\bin\bng\bg
+       k\bki\bil\bll\bl-\b-l\bli\bin\bne\be (\b(C\bC-\b-k\bk)\b)
+              Kill the text from point to the end of the line.
+       b\bba\bac\bck\bkw\bwa\bar\brd\bd-\b-k\bki\bil\bll\bl-\b-l\bli\bin\bne\be (\b(C\bC-\b-x\bx R\bRu\bub\bbo\bou\but\bt)\b)
+              Kill backward to the beginning of the line.
+       u\bun\bni\bix\bx-\b-l\bli\bin\bne\be-\b-d\bdi\bis\bsc\bca\bar\brd\bd (\b(C\bC-\b-u\bu)\b)
+              Kill  backward  from  point  to  the beginning of the line.  The
+              killed text is saved on the kill-ring.
+       k\bki\bil\bll\bl-\b-w\bwh\bho\bol\ble\be-\b-l\bli\bin\bne\be
+              Kill all characters on the current line, no matter  where  point
+              is.
+       k\bki\bil\bll\bl-\b-w\bwo\bor\brd\bd (\b(M\bM-\b-d\bd)\b)
+              Kill  from  point  the  end  of  the current word, or if between
+              words, to the end of the next word.   Word  boundaries  are  the
+              same as those used by f\bfo\bor\brw\bwa\bar\brd\bd-\b-w\bwo\bor\brd\bd.
+       b\bba\bac\bck\bkw\bwa\bar\brd\bd-\b-k\bki\bil\bll\bl-\b-w\bwo\bor\brd\bd (\b(M\bM-\b-R\bRu\bub\bbo\bou\but\bt)\b)
+              Kill  the  word  behind  point.  Word boundaries are the same as
+              those used by b\bba\bac\bck\bkw\bwa\bar\brd\bd-\b-w\bwo\bor\brd\bd.
+       u\bun\bni\bix\bx-\b-w\bwo\bor\brd\bd-\b-r\bru\bub\bbo\bou\but\bt (\b(C\bC-\b-w\bw)\b)
+              Kill the word behind point, using white space as a  word  bound-
+              ary.  The killed text is saved on the kill-ring.
+       u\bun\bni\bix\bx-\b-f\bfi\bil\ble\ben\bna\bam\bme\be-\b-r\bru\bub\bbo\bou\but\bt
+              Kill  the  word  behind  point,  using white space and the slash
+              character as the word boundaries.  The killed text is  saved  on
+              the kill-ring.
+       d\bde\bel\ble\bet\bte\be-\b-h\bho\bor\bri\biz\bzo\bon\bnt\bta\bal\bl-\b-s\bsp\bpa\bac\bce\be (\b(M\bM-\b-\\b\)\b)
+              Delete all spaces and tabs around point.
+       k\bki\bil\bll\bl-\b-r\bre\beg\bgi\bio\bon\bn
+              Kill  the  text  between  the point and _\bm_\ba_\br_\bk (saved cursor posi-
+              tion).  This text is referred to as the _\br_\be_\bg_\bi_\bo_\bn.
+       c\bco\bop\bpy\by-\b-r\bre\beg\bgi\bio\bon\bn-\b-a\bas\bs-\b-k\bki\bil\bll\bl
+              Copy the text in the region to the kill buffer.
+       c\bco\bop\bpy\by-\b-b\bba\bac\bck\bkw\bwa\bar\brd\bd-\b-w\bwo\bor\brd\bd
+              Copy the word before point to the kill buffer.  The word  bound-
+              aries are the same as b\bba\bac\bck\bkw\bwa\bar\brd\bd-\b-w\bwo\bor\brd\bd.
+       c\bco\bop\bpy\by-\b-f\bfo\bor\brw\bwa\bar\brd\bd-\b-w\bwo\bor\brd\bd
+              Copy  the  word  following  point  to the kill buffer.  The word
+              boundaries are the same as f\bfo\bor\brw\bwa\bar\brd\bd-\b-w\bwo\bor\brd\bd.
+       y\bya\ban\bnk\bk (\b(C\bC-\b-y\by)\b)
+              Yank the top of the kill ring into the buffer at point.
+       y\bya\ban\bnk\bk-\b-p\bpo\bop\bp (\b(M\bM-\b-y\by)\b)
+              Rotate the kill ring, and yank the new top.  Only works  follow-
+              ing y\bya\ban\bnk\bk or y\bya\ban\bnk\bk-\b-p\bpo\bop\bp.
+
+   N\bNu\bum\bme\ber\bri\bic\bc A\bAr\brg\bgu\bum\bme\ben\bnt\bts\bs
+       d\bdi\big\bgi\bit\bt-\b-a\bar\brg\bgu\bum\bme\ben\bnt\bt (\b(M\bM-\b-0\b0,\b, M\bM-\b-1\b1,\b, .\b..\b..\b.,\b, M\bM-\b--\b-)\b)
+              Add  this digit to the argument already accumulating, or start a
+              new argument.  M-- starts a negative argument.
+       u\bun\bni\biv\bve\ber\brs\bsa\bal\bl-\b-a\bar\brg\bgu\bum\bme\ben\bnt\bt
+              This is another way to specify an argument.  If this command  is
+              followed  by one or more digits, optionally with a leading minus
+              sign, those digits define the argument.  If the command is  fol-
+              lowed  by  digits,  executing  u\bun\bni\biv\bve\ber\brs\bsa\bal\bl-\b-a\bar\brg\bgu\bum\bme\ben\bnt\bt again ends the
+              numeric argument, but is otherwise ignored.  As a special  case,
+              if  this  command is immediately followed by a character that is
+              neither a digit or minus sign, the argument count for  the  next
+              command  is multiplied by four.  The argument count is initially
+              one, so executing this function the first time makes  the  argu-
+              ment count four, a second time makes the argument count sixteen,
+              and so on.
+
+   C\bCo\bom\bmp\bpl\ble\bet\bti\bin\bng\bg
+       c\bco\bom\bmp\bpl\ble\bet\bte\be (\b(T\bTA\bAB\bB)\b)
+              Attempt to perform completion on the  text  before  point.   The
+              actual  completion performed is application-specific.  B\bBa\bas\bsh\bh, for
+              instance, attempts completion treating the text  as  a  variable
+              (if  the  text begins with $\b$), username (if the text begins with
+              ~\b~), hostname (if the text begins with @\b@), or command  (including
+              aliases  and  functions)  in  turn.  If none of these produces a
+              match, filename completion is  attempted.   G\bGd\bdb\bb,  on  the  other
+              hand,  allows completion of program functions and variables, and
+              only attempts filename completion under certain circumstances.
+       p\bpo\bos\bss\bsi\bib\bbl\ble\be-\b-c\bco\bom\bmp\bpl\ble\bet\bti\bio\bon\bns\bs (\b(M\bM-\b-?\b?)\b)
+              List the possible completions of the text before point.
+       i\bin\bns\bse\ber\brt\bt-\b-c\bco\bom\bmp\bpl\ble\bet\bti\bio\bon\bns\bs (\b(M\bM-\b-*\b*)\b)
+              Insert all completions of the text before point that would  have
+              been generated by p\bpo\bos\bss\bsi\bib\bbl\ble\be-\b-c\bco\bom\bmp\bpl\ble\bet\bti\bio\bon\bns\bs.
+       m\bme\ben\bnu\bu-\b-c\bco\bom\bmp\bpl\ble\bet\bte\be
+              Similar  to c\bco\bom\bmp\bpl\ble\bet\bte\be, but replaces the word to be completed with
+              a single match from the list of possible completions.   Repeated
+              execution  of  m\bme\ben\bnu\bu-\b-c\bco\bom\bmp\bpl\ble\bet\bte\be  steps through the list of possible
+              completions, inserting each match in turn.  At the  end  of  the
+              list of completions, the bell is rung (subject to the setting of
+              b\bbe\bel\bll\bl-\b-s\bst\bty\byl\ble\be) and the original text is restored.  An argument of _\bn
+              moves  _\bn  positions  forward  in the list of matches; a negative
+              argument may be used to move backward through  the  list.   This
+              command  is  intended  to  be  bound  to  T\bTA\bAB\bB, but is unbound by
+              default.
+       d\bde\bel\ble\bet\bte\be-\b-c\bch\bha\bar\br-\b-o\bor\br-\b-l\bli\bis\bst\bt
+              Deletes the character under the cursor if not at  the  beginning
+              or  end  of  the  line (like d\bde\bel\ble\bet\bte\be-\b-c\bch\bha\bar\br).  If at the end of the
+              line, behaves identically to p\bpo\bos\bss\bsi\bib\bbl\ble\be-\b-c\bco\bom\bmp\bpl\ble\bet\bti\bio\bon\bns\bs.
+
+   K\bKe\bey\byb\bbo\boa\bar\brd\bd M\bMa\bac\bcr\bro\bos\bs
+       s\bst\bta\bar\brt\bt-\b-k\bkb\bbd\bd-\b-m\bma\bac\bcr\bro\bo (\b(C\bC-\b-x\bx (\b()\b)
+              Begin saving the characters  typed  into  the  current  keyboard
+              macro.
+       e\ben\bnd\bd-\b-k\bkb\bbd\bd-\b-m\bma\bac\bcr\bro\bo (\b(C\bC-\b-x\bx )\b))\b)
+              Stop saving the characters typed into the current keyboard macro
+              and store the definition.
+       c\bca\bal\bll\bl-\b-l\bla\bas\bst\bt-\b-k\bkb\bbd\bd-\b-m\bma\bac\bcr\bro\bo (\b(C\bC-\b-x\bx e\be)\b)
+              Re-execute the last keyboard macro defined, by making the  char-
+              acters in the macro appear as if typed at the keyboard.
+
+   M\bMi\bis\bsc\bce\bel\bll\bla\ban\bne\beo\bou\bus\bs
+       r\bre\be-\b-r\bre\bea\bad\bd-\b-i\bin\bni\bit\bt-\b-f\bfi\bil\ble\be (\b(C\bC-\b-x\bx C\bC-\b-r\br)\b)
+              Read  in  the  contents of the _\bi_\bn_\bp_\bu_\bt_\br_\bc file, and incorporate any
+              bindings or variable assignments found there.
+       a\bab\bbo\bor\brt\bt (\b(C\bC-\b-g\bg)\b)
+              Abort the current editing command and ring the  terminal's  bell
+              (subject to the setting of b\bbe\bel\bll\bl-\b-s\bst\bty\byl\ble\be).
+       d\bdo\bo-\b-u\bup\bpp\bpe\ber\brc\bca\bas\bse\be-\b-v\bve\ber\brs\bsi\bio\bon\bn (\b(M\bM-\b-a\ba,\b, M\bM-\b-b\bb,\b, M\bM-\b-_\bx,\b, .\b..\b..\b.)\b)
+              If  the  metafied character _\bx is lowercase, run the command that
+              is bound to the corresponding uppercase character.
+       p\bpr\bre\bef\bfi\bix\bx-\b-m\bme\bet\bta\ba (\b(E\bES\bSC\bC)\b)
+              Metafy the next character typed.  E\bES\bSC\bC f\bf is equivalent to M\bMe\bet\bta\ba-\b-f\bf.
+       u\bun\bnd\bdo\bo (\b(C\bC-\b-_\b_,\b, C\bC-\b-x\bx C\bC-\b-u\bu)\b)
+              Incremental undo, separately remembered for each line.
+       r\bre\bev\bve\ber\brt\bt-\b-l\bli\bin\bne\be (\b(M\bM-\b-r\br)\b)
+              Undo  all changes made to this line.  This is like executing the
+              u\bun\bnd\bdo\bo command enough times to return  the  line  to  its  initial
+              state.
+       t\bti\bil\bld\bde\be-\b-e\bex\bxp\bpa\ban\bnd\bd (\b(M\bM-\b-&\b&)\b)
+              Perform tilde expansion on the current word.
+       s\bse\bet\bt-\b-m\bma\bar\brk\bk (\b(C\bC-\b-@\b@,\b, M\bM-\b-<\b<s\bsp\bpa\bac\bce\be>\b>)\b)
+              Set  the  mark to the point.  If a numeric argument is supplied,
+              the mark is set to that position.
+       e\bex\bxc\bch\bha\ban\bng\bge\be-\b-p\bpo\boi\bin\bnt\bt-\b-a\ban\bnd\bd-\b-m\bma\bar\brk\bk (\b(C\bC-\b-x\bx C\bC-\b-x\bx)\b)
+              Swap the point with the mark.  The current  cursor  position  is
+              set  to the saved position, and the old cursor position is saved
+              as the mark.
+       c\bch\bha\bar\bra\bac\bct\bte\ber\br-\b-s\bse\bea\bar\brc\bch\bh (\b(C\bC-\b-]\b])\b)
+              A character is read and point is moved to the next occurrence of
+              that  character.   A negative count searches for previous occur-
+              rences.
+       c\bch\bha\bar\bra\bac\bct\bte\ber\br-\b-s\bse\bea\bar\brc\bch\bh-\b-b\bba\bac\bck\bkw\bwa\bar\brd\bd (\b(M\bM-\b-C\bC-\b-]\b])\b)
+              A character is read and point is moved to  the  previous  occur-
+              rence  of  that character.  A negative count searches for subse-
+              quent occurrences.
+       i\bin\bns\bse\ber\brt\bt-\b-c\bco\bom\bmm\bme\ben\bnt\bt (\b(M\bM-\b-#\b#)\b)
+              Without a numeric argument,  the  value  of  the  readline  c\bco\bom\bm-\b-
+              m\bme\ben\bnt\bt-\b-b\bbe\beg\bgi\bin\bn  variable is inserted at the beginning of the current
+              line.  If a numeric argument is supplied, this command acts as a
+              toggle:   if  the characters at the beginning of the line do not
+              match the value of c\bco\bom\bmm\bme\ben\bnt\bt-\b-b\bbe\beg\bgi\bin\bn, the value is inserted,  other-
+              wise the characters in c\bco\bom\bmm\bme\ben\bnt\bt-\b-b\bbe\beg\bgi\bin\bn are deleted from the begin-
+              ning of the line.  In either case, the line is accepted as if  a
+              newline  had  been  typed.   The  default value of c\bco\bom\bmm\bme\ben\bnt\bt-\b-b\bbe\beg\bgi\bin\bn
+              makes the current line a shell comment.  If a  numeric  argument
+              causes  the  comment  character  to be removed, the line will be
+              executed by the shell.
+       d\bdu\bum\bmp\bp-\b-f\bfu\bun\bnc\bct\bti\bio\bon\bns\bs
+              Print all of the functions and their key bindings to  the  read-
+              line output stream.  If a numeric argument is supplied, the out-
+              put is formatted in such a way that it can be made  part  of  an
+              _\bi_\bn_\bp_\bu_\bt_\br_\bc file.
+       d\bdu\bum\bmp\bp-\b-v\bva\bar\bri\bia\bab\bbl\ble\bes\bs
+              Print  all  of  the  settable  variables and their values to the
+              readline output stream.  If a numeric argument is supplied,  the
+              output is formatted in such a way that it can be made part of an
+              _\bi_\bn_\bp_\bu_\bt_\br_\bc file.
+       d\bdu\bum\bmp\bp-\b-m\bma\bac\bcr\bro\bos\bs
+              Print all of the readline key sequences bound to macros and  the
+              strings  they  output.   If  a numeric argument is supplied, the
+              output is formatted in such a way that it can be made part of an
+              _\bi_\bn_\bp_\bu_\bt_\br_\bc file.
+       e\bem\bma\bac\bcs\bs-\b-e\bed\bdi\bit\bti\bin\bng\bg-\b-m\bmo\bod\bde\be (\b(C\bC-\b-e\be)\b)
+              When  in  v\bvi\bi command mode, this causes a switch to e\bem\bma\bac\bcs\bs editing
+              mode.
+       v\bvi\bi-\b-e\bed\bdi\bit\bti\bin\bng\bg-\b-m\bmo\bod\bde\be (\b(M\bM-\b-C\bC-\b-j\bj)\b)
+              When in e\bem\bma\bac\bcs\bs editing mode, this causes a switch to  v\bvi\bi  editing
+              mode.
+
+D\bDE\bEF\bFA\bAU\bUL\bLT\bT K\bKE\bEY\bY B\bBI\bIN\bND\bDI\bIN\bNG\bGS\bS
+       The  following is a list of the default emacs and vi bindings.  Charac-
+       ters with the eighth bit set are  written  as  M-<character>,  and  are
+       referred to as _\bm_\be_\bt_\ba_\bf_\bi_\be_\bd characters.  The printable ASCII characters not
+       mentioned in the list of emacs  standard  bindings  are  bound  to  the
+       s\bse\bel\blf\bf-\b-i\bin\bns\bse\ber\brt\bt  function,  which just inserts the given character into the
+       input line.  In vi insertion mode, all characters not specifically men-
+       tioned are bound to s\bse\bel\blf\bf-\b-i\bin\bns\bse\ber\brt\bt.  Characters assigned to signal genera-
+       tion by _\bs_\bt_\bt_\by(1) or the terminal driver, such as C-Z or C-C, retain that
+       function.   Upper  and  lower case metafied characters are bound to the
+       same function in the emacs mode meta keymap.  The remaining  characters
+       are  unbound,  which  causes  readline to ring the bell (subject to the
+       setting of the b\bbe\bel\bll\bl-\b-s\bst\bty\byl\ble\be variable).
+
+   E\bEm\bma\bac\bcs\bs M\bMo\bod\bde\be
+             Emacs Standard bindings
+
+             "C-@"  set-mark
+             "C-A"  beginning-of-line
+             "C-B"  backward-char
+             "C-D"  delete-char
+             "C-E"  end-of-line
+             "C-F"  forward-char
+             "C-G"  abort
+             "C-H"  backward-delete-char
+             "C-I"  complete
+             "C-J"  accept-line
+             "C-K"  kill-line
+             "C-L"  clear-screen
+             "C-M"  accept-line
+             "C-N"  next-history
+             "C-P"  previous-history
+             "C-Q"  quoted-insert
+             "C-R"  reverse-search-history
+             "C-S"  forward-search-history
+             "C-T"  transpose-chars
+             "C-U"  unix-line-discard
+             "C-V"  quoted-insert
+             "C-W"  unix-word-rubout
+             "C-Y"  yank
+             "C-]"  character-search
+             "C-_"  undo
+             " " to "/"  self-insert
+             "0"  to "9"  self-insert
+             ":"  to "~"  self-insert
+             "C-?"  backward-delete-char
+
+             Emacs Meta bindings
+
+             "M-C-G"  abort
+             "M-C-H"  backward-kill-word
+             "M-C-I"  tab-insert
+             "M-C-J"  vi-editing-mode
+             "M-C-M"  vi-editing-mode
+             "M-C-R"  revert-line
+             "M-C-Y"  yank-nth-arg
+             "M-C-["  complete
+             "M-C-]"  character-search-backward
+             "M-space"  set-mark
+             "M-#"  insert-comment
+             "M-&"  tilde-expand
+             "M-*"  insert-completions
+             "M--"  digit-argument
+             "M-."  yank-last-arg
+             "M-0"  digit-argument
+             "M-1"  digit-argument
+             "M-2"  digit-argument
+             "M-3"  digit-argument
+             "M-4"  digit-argument
+             "M-5"  digit-argument
+             "M-6"  digit-argument
+             "M-7"  digit-argument
+             "M-8"  digit-argument
+             "M-9"  digit-argument
+             "M-<"  beginning-of-history
+             "M-="  possible-completions
+             "M->"  end-of-history
+             "M-?"  possible-completions
+             "M-B"  backward-word
+             "M-C"  capitalize-word
+             "M-D"  kill-word
+             "M-F"  forward-word
+             "M-L"  downcase-word
+             "M-N"  non-incremental-forward-search-history
+             "M-P"  non-incremental-reverse-search-history
+             "M-R"  revert-line
+             "M-T"  transpose-words
+             "M-U"  upcase-word
+             "M-Y"  yank-pop
+             "M-\"  delete-horizontal-space
+             "M-~"  tilde-expand
+             "M-C-?"  backward-kill-word
+             "M-_"  yank-last-arg
+
+             Emacs Control-X bindings
+
+             "C-XC-G"  abort
+             "C-XC-R"  re-read-init-file
+             "C-XC-U"  undo
+             "C-XC-X"  exchange-point-and-mark
+             "C-X("  start-kbd-macro
+             "C-X)"  end-kbd-macro
+             "C-XE"  call-last-kbd-macro
+             "C-XC-?"  backward-kill-line
+
+
+   V\bVI\bI M\bMo\bod\bde\be b\bbi\bin\bnd\bdi\bin\bng\bgs\bs
+             VI Insert Mode functions
+
+             "C-D"  vi-eof-maybe
+             "C-H"  backward-delete-char
+             "C-I"  complete
+             "C-J"  accept-line
+             "C-M"  accept-line
+             "C-R"  reverse-search-history
+             "C-S"  forward-search-history
+             "C-T"  transpose-chars
+             "C-U"  unix-line-discard
+             "C-V"  quoted-insert
+             "C-W"  unix-word-rubout
+             "C-Y"  yank
+             "C-["  vi-movement-mode
+             "C-_"  undo
+             " " to "~"  self-insert
+             "C-?"  backward-delete-char
+
+             VI Command Mode functions
+
+             "C-D"  vi-eof-maybe
+             "C-E"  emacs-editing-mode
+             "C-G"  abort
+             "C-H"  backward-char
+             "C-J"  accept-line
+             "C-K"  kill-line
+             "C-L"  clear-screen
+             "C-M"  accept-line
+             "C-N"  next-history
+             "C-P"  previous-history
+             "C-Q"  quoted-insert
+             "C-R"  reverse-search-history
+             "C-S"  forward-search-history
+             "C-T"  transpose-chars
+             "C-U"  unix-line-discard
+             "C-V"  quoted-insert
+             "C-W"  unix-word-rubout
+             "C-Y"  yank
+             "C-_"  vi-undo
+             " "  forward-char
+             "#"  insert-comment
+             "$"  end-of-line
+             "%"  vi-match
+             "&"  vi-tilde-expand
+             "*"  vi-complete
+             "+"  next-history
+             ","  vi-char-search
+             "-"  previous-history
+             "."  vi-redo
+             "/"  vi-search
+             "0"  beginning-of-line
+             "1" to "9"  vi-arg-digit
+             ";"  vi-char-search
+             "="  vi-complete
+             "?"  vi-search
+             "A"  vi-append-eol
+             "B"  vi-prev-word
+             "C"  vi-change-to
+             "D"  vi-delete-to
+             "E"  vi-end-word
+             "F"  vi-char-search
+             "G"  vi-fetch-history
+             "I"  vi-insert-beg
+             "N"  vi-search-again
+             "P"  vi-put
+             "R"  vi-replace
+             "S"  vi-subst
+             "T"  vi-char-search
+             "U"  revert-line
+             "W"  vi-next-word
+             "X"  backward-delete-char
+             "Y"  vi-yank-to
+             "\"  vi-complete
+             "^"  vi-first-print
+             "_"  vi-yank-arg
+             "`"  vi-goto-mark
+             "a"  vi-append-mode
+             "b"  vi-prev-word
+             "c"  vi-change-to
+             "d"  vi-delete-to
+             "e"  vi-end-word
+             "f"  vi-char-search
+             "h"  backward-char
+             "i"  vi-insertion-mode
+             "j"  next-history
+             "k"  prev-history
+             "l"  forward-char
+             "m"  vi-set-mark
+             "n"  vi-search-again
+             "p"  vi-put
+             "r"  vi-change-char
+             "s"  vi-subst
+             "t"  vi-char-search
+             "u"  vi-undo
+             "w"  vi-next-word
+             "x"  vi-delete
+             "y"  vi-yank-to
+             "|"  vi-column
+             "~"  vi-change-case
+
+S\bSE\bEE\bE A\bAL\bLS\bSO\bO
+       _\bT_\bh_\be _\bG_\bn_\bu _\bR_\be_\ba_\bd_\bl_\bi_\bn_\be _\bL_\bi_\bb_\br_\ba_\br_\by, Brian Fox and Chet Ramey
+       _\bT_\bh_\be _\bG_\bn_\bu _\bH_\bi_\bs_\bt_\bo_\br_\by _\bL_\bi_\bb_\br_\ba_\br_\by, Brian Fox and Chet Ramey
+       _\bb_\ba_\bs_\bh(1)
+
+F\bFI\bIL\bLE\bES\bS
+       _\b~_\b/_\b._\bi_\bn_\bp_\bu_\bt_\br_\bc
+              Individual r\bre\bea\bad\bdl\bli\bin\bne\be initialization file
+
+A\bAU\bUT\bTH\bHO\bOR\bRS\bS
+       Brian Fox, Free Software Foundation
+       bfox@gnu.org
+
+       Chet Ramey, Case Western Reserve University
+       chet@ins.CWRU.Edu
+
+B\bBU\bUG\bG R\bRE\bEP\bPO\bOR\bRT\bTS\bS
+       If you find a bug in r\bre\bea\bad\bdl\bli\bin\bne\be,\b, you should report it.   But  first,  you
+       should  make  sure  that it really is a bug, and that it appears in the
+       latest version of the r\bre\bea\bad\bdl\bli\bin\bne\be library that you have.
+
+       Once you have determined that a bug actually exists, mail a bug  report
+       to  _\bb_\bu_\bg_\b-_\br_\be_\ba_\bd_\bl_\bi_\bn_\be@_\bg_\bn_\bu_\b._\bo_\br_\bg.   If  you have a fix, you are welcome to mail
+       that as well!  Suggestions  and  `philosophical'  bug  reports  may  be
+       mailed  to  _\bb_\bu_\bg_\b-_\br_\be_\ba_\bd_\bl_\bi_\bn_\be@_\bg_\bn_\bu_\b._\bo_\br_\bg  or  posted  to  the  Usenet newsgroup
+       g\bgn\bnu\bu.\b.b\bba\bas\bsh\bh.\b.b\bbu\bug\bg.
+
+       Comments and bug reports concerning this manual page should be directed
+       to _\bc_\bh_\be_\bt_\b@_\bi_\bn_\bs_\b._\bC_\bW_\bR_\bU_\b._\bE_\bd_\bu.
+
+B\bBU\bUG\bGS\bS
+       It's too big and too slow.
+
+
+
+GNU Readline 5.2                  2006 Apr 26                      READLINE(3)
diff --git a/doc/readline.3 b/doc/readline.3
new file mode 100644 (file)
index 0000000..2c45ed2
--- /dev/null
@@ -0,0 +1,1304 @@
+.\"
+.\" MAN PAGE COMMENTS to
+.\"
+.\"    Chet Ramey
+.\"    Information Network Services
+.\"    Case Western Reserve University
+.\"    chet@ins.CWRU.Edu
+.\"
+.\"    Last Change: Thu Feb  9 09:49:51 EST 2006
+.\"
+.TH READLINE 3 "2006 Apr 26" "GNU Readline 5.2"
+.\"
+.\" File Name macro.  This used to be `.PN', for Path Name,
+.\" but Sun doesn't seem to like that very much.
+.\"
+.de FN
+\fI\|\\$1\|\fP
+..
+.SH NAME
+readline \- get a line from a user with editing
+.SH SYNOPSIS
+.LP
+.nf
+.ft B
+#include <stdio.h>
+#include <readline/readline.h>
+#include <readline/history.h>
+.ft
+.fi
+.LP
+.nf
+\fIchar *\fP
+.br
+\fBreadline\fP (\fIconst char *prompt\fP);
+.fi
+.SH COPYRIGHT
+.if n Readline is Copyright (C) 1989\-2004 by the Free Software Foundation, Inc.
+.if t Readline is Copyright \(co 1989\-2004 by the Free Software Foundation, Inc.
+.SH DESCRIPTION
+.LP
+.B readline
+will read a line from the terminal
+and return it, using
+.B prompt
+as a prompt.  If 
+.B prompt
+is \fBNULL\fP or the empty string, no prompt is issued.
+The line returned is allocated with
+.IR malloc (3);
+the caller must free it when finished.  The line returned
+has the final newline removed, so only the text of the line
+remains.
+.LP
+.B readline
+offers editing capabilities while the user is entering the
+line.
+By default, the line editing commands
+are similar to those of emacs.
+A vi\-style line editing interface is also available.
+.LP
+This manual page describes only the most basic use of \fBreadline\fP.
+Much more functionality is available; see
+\fIThe GNU Readline Library\fP and \fIThe GNU History Library\fP
+for additional information.
+.SH RETURN VALUE
+.LP
+.B readline
+returns the text of the line read.  A blank line
+returns the empty string.  If
+.B EOF
+is encountered while reading a line, and the line is empty,
+.B NULL
+is returned.  If an
+.B EOF
+is read with a non\-empty line, it is
+treated as a newline.
+.SH NOTATION
+.LP
+An emacs-style notation is used to denote
+keystrokes.  Control keys are denoted by C\-\fIkey\fR, e.g., C\-n
+means Control\-N.  Similarly, 
+.I meta
+keys are denoted by M\-\fIkey\fR, so M\-x means Meta\-X.  (On keyboards
+without a 
+.I meta
+key, M\-\fIx\fP means ESC \fIx\fP, i.e., press the Escape key
+then the
+.I x
+key.  This makes ESC the \fImeta prefix\fP.
+The combination M\-C\-\fIx\fP means ESC\-Control\-\fIx\fP,
+or press the Escape key
+then hold the Control key while pressing the
+.I x
+key.)
+.PP
+Readline commands may be given numeric
+.IR arguments ,
+which normally act as a repeat count.  Sometimes, however, it is the
+sign of the argument that is significant.  Passing a negative argument
+to a command that acts in the forward direction (e.g., \fBkill\-line\fP)
+causes that command to act in a backward direction.  Commands whose
+behavior with arguments deviates from this are noted.
+.PP
+When a command is described as \fIkilling\fP text, the text
+deleted is saved for possible future retrieval
+(\fIyanking\fP).  The killed text is saved in a
+\fIkill ring\fP.  Consecutive kills cause the text to be
+accumulated into one unit, which can be yanked all at once. 
+Commands which do not kill text separate the chunks of text
+on the kill ring.
+.SH INITIALIZATION FILE
+.LP
+Readline is customized by putting commands in an initialization
+file (the \fIinputrc\fP file).
+The name of this file is taken from the value of the
+.B INPUTRC
+environment variable.  If that variable is unset, the default is
+.IR ~/.inputrc .
+If that file  does not exist or cannot be read, the ultimate default is
+.IR /etc/inputrc .
+When a program which uses the readline library starts up, the
+init file is read, and the key bindings and variables are set.
+There are only a few basic constructs allowed in the
+readline init file.  Blank lines are ignored.
+Lines beginning with a \fB#\fP are comments.
+Lines beginning with a \fB$\fP indicate conditional constructs.
+Other lines denote key bindings and variable settings.
+Each program using this library may add its own commands
+and bindings.
+.PP
+For example, placing
+.RS
+.PP
+M\-Control\-u: universal\-argument
+.RE
+or
+.RS
+C\-Meta\-u: universal\-argument
+.RE
+.sp
+into the 
+.I inputrc
+would make M\-C\-u execute the readline command
+.IR universal\-argument .
+.PP
+The following symbolic character names are recognized while
+processing key bindings:
+.IR DEL ,
+.IR ESC ,
+.IR ESCAPE ,
+.IR LFD ,
+.IR NEWLINE ,
+.IR RET ,
+.IR RETURN ,
+.IR RUBOUT ,
+.IR SPACE ,
+.IR SPC ,
+and
+.IR TAB .
+.PP
+In addition to command names, readline allows keys to be bound
+to a string that is inserted when the key is pressed (a \fImacro\fP).
+.PP
+.SS Key Bindings
+.PP
+The syntax for controlling key bindings in the
+.I inputrc
+file is simple.  All that is required is the name of the
+command or the text of a macro and a key sequence to which
+it should be bound. The name may be specified in one of two ways:
+as a symbolic key name, possibly with \fIMeta\-\fP or \fIControl\-\fP
+prefixes, or as a key sequence.
+The name and key sequence are separated by a colon.  There can be no
+whitespace between the name and the colon.
+.PP
+When using the form \fBkeyname\fP:\^\fIfunction-name\fP or \fImacro\fP,
+.I keyname
+is the name of a key spelled out in English.  For example:
+.sp
+.RS
+Control\-u: universal\-argument
+.br
+Meta\-Rubout: backward\-kill\-word
+.br
+Control\-o: "> output"
+.RE
+.LP
+In the above example,
+.I C\-u
+is bound to the function
+.BR universal\-argument ,
+.I M-DEL
+is bound to the function
+.BR backward\-kill\-word ,
+and
+.I C\-o
+is bound to run the macro
+expressed on the right hand side (that is, to insert the text
+.if t \f(CW> output\fP
+.if n ``> output''
+into the line).
+.PP
+In the second form, \fB"keyseq"\fP:\^\fIfunction\-name\fP or \fImacro\fP,
+.B keyseq
+differs from
+.B keyname
+above in that strings denoting
+an entire key sequence may be specified by placing the sequence
+within double quotes.  Some GNU Emacs style key escapes can be
+used, as in the following example, but the symbolic character names
+are not recognized.
+.sp
+.RS
+"\eC\-u": universal\-argument
+.br
+"\eC\-x\eC\-r": re\-read\-init\-file
+.br
+"\ee[11~": "Function Key 1"
+.RE
+.PP
+In this example,
+.I C-u
+is again bound to the function
+.BR universal\-argument .
+.I "C-x C-r"
+is bound to the function
+.BR re\-read\-init\-file ,
+and 
+.I "ESC [ 1 1 ~"
+is bound to insert the text
+.if t \f(CWFunction Key 1\fP.
+.if n ``Function Key 1''.
+.PP
+The full set of GNU Emacs style escape sequences available when specifying
+key sequences is
+.RS
+.PD 0
+.TP
+.B \eC\-
+control prefix
+.TP
+.B \eM\-
+meta prefix
+.TP
+.B \ee
+an escape character
+.TP
+.B \e\e
+backslash
+.TP
+.B \e"
+literal ", a double quote
+.TP
+.B \e'
+literal ', a single quote
+.RE
+.PD
+.PP
+In addition to the GNU Emacs style escape sequences, a second
+set of backslash escapes is available:
+.RS
+.PD 0
+.TP
+.B \ea
+alert (bell)
+.TP
+.B \eb
+backspace
+.TP
+.B \ed
+delete
+.TP
+.B \ef
+form feed
+.TP
+.B \en
+newline
+.TP
+.B \er
+carriage return
+.TP
+.B \et
+horizontal tab
+.TP
+.B \ev
+vertical tab
+.TP
+.B \e\fInnn\fP
+the eight-bit character whose value is the octal value \fInnn\fP
+(one to three digits)
+.TP
+.B \ex\fIHH\fP
+the eight-bit character whose value is the hexadecimal value \fIHH\fP
+(one or two hex digits)
+.RE
+.PD
+.PP
+When entering the text of a macro, single or double quotes should
+be used to indicate a macro definition.  Unquoted text
+is assumed to be a function name.
+In the macro body, the backslash escapes described above are expanded.
+Backslash will quote any other character in the macro text,
+including " and '.
+.PP
+.B Bash
+allows the current readline key bindings to be displayed or modified
+with the
+.B bind
+builtin command.  The editing mode may be switched during interactive
+use by using the
+.B \-o
+option to the
+.B set
+builtin command.  Other programs using this library provide
+similar mechanisms.  The
+.I inputrc
+file may be edited and re-read if a program does not provide
+any other means to incorporate new bindings.
+.SS Variables
+.PP
+Readline has variables that can be used to further customize its
+behavior.  A variable may be set in the
+.I inputrc
+file with a statement of the form
+.RS
+.PP
+\fBset\fP \fIvariable\-name\fP \fIvalue\fP
+.RE
+.PP
+Except where noted, readline variables can take the values
+.B On
+or
+.B Off
+(without regard to case).
+Unrecognized variable names are ignored.
+When a variable value is read, empty or null values, "on" (case-insensitive),
+and "1" are equivalent to \fBOn\fP.  All other values are equivalent to
+\fBOff\fP.
+The variables and their default values are:
+.PP
+.PD 0
+.TP
+.B bell\-style (audible)
+Controls what happens when readline wants to ring the terminal bell.
+If set to \fBnone\fP, readline never rings the bell.  If set to
+\fBvisible\fP, readline uses a visible bell if one is available.
+If set to \fBaudible\fP, readline attempts to ring the terminal's bell.
+.TP
+.B bind\-tty\-special\-chars (On)
+If set to \fBOn\fP, readline attempts to bind the control characters  
+treated specially by the kernel's terminal driver to their readline
+equivalents.
+.TP
+.B comment\-begin (``#'')
+The string that is inserted in \fBvi\fP mode when the
+.B insert\-comment
+command is executed.
+This command is bound to
+.B M\-#
+in emacs mode and to
+.B #
+in vi command mode.
+.TP 
+.B completion\-ignore\-case (Off)
+If set to \fBOn\fP, readline performs filename matching and completion
+in a case\-insensitive fashion.
+.TP
+.B completion\-query\-items (100)
+This determines when the user is queried about viewing
+the number of possible completions
+generated by the \fBpossible\-completions\fP command.
+It may be set to any integer value greater than or equal to
+zero.  If the number of possible completions is greater than
+or equal to the value of this variable, the user is asked whether
+or not he wishes to view them; otherwise they are simply listed
+on the terminal.  A negative value causes readline to never ask.
+.TP
+.B convert\-meta (On)
+If set to \fBOn\fP, readline will convert characters with the
+eighth bit set to an ASCII key sequence
+by stripping the eighth bit and prefixing it with an
+escape character (in effect, using escape as the \fImeta prefix\fP).
+.TP
+.B disable\-completion (Off)
+If set to \fBOn\fP, readline will inhibit word completion.  Completion 
+characters will be inserted into the line as if they had been
+mapped to \fBself-insert\fP.
+.TP
+.B editing\-mode (emacs)
+Controls whether readline begins with a set of key bindings similar
+to emacs or vi.
+.B editing\-mode
+can be set to either
+.B emacs
+or
+.BR vi .
+.TP
+.B enable\-keypad (Off)
+When set to \fBOn\fP, readline will try to enable the application
+keypad when it is called.  Some systems need this to enable the
+arrow keys.
+.TP
+.B expand\-tilde (Off)
+If set to \fBon\fP, tilde expansion is performed when readline
+attempts word completion.
+.TP
+.B history\-preserve\-point (Off)
+If set to \fBon\fP, the history code attempts to place point at the 
+same location on each history line retrieved with \fBprevious-history\fP 
+or \fBnext-history\fP.
+.TP
+.B horizontal\-scroll\-mode (Off)
+When set to \fBOn\fP, makes readline use a single line for display,
+scrolling the input horizontally on a single screen line when it
+becomes longer than the screen width rather than wrapping to a new line.
+.TP
+.B input\-meta (Off)
+If set to \fBOn\fP, readline will enable eight-bit input (that is,
+it will not clear the eighth bit in the characters it reads),
+regardless of what the terminal claims it can support.  The name
+.B meta\-flag
+is a synonym for this variable.
+.TP
+.B isearch\-terminators (``C\-[ C\-J'')
+The string of characters that should terminate an incremental
+search without subsequently executing the character as a command.
+If this variable has not been given a value, the characters
+\fIESC\fP and \fIC\-J\fP will terminate an incremental search.
+.TP
+.B keymap (emacs)
+Set the current readline keymap.  The set of legal keymap names is
+\fIemacs, emacs-standard, emacs-meta, emacs-ctlx, vi, vi-move,
+vi-command\fP, and
+.IR vi-insert .
+\fIvi\fP is equivalent to \fIvi-command\fP; \fIemacs\fP is
+equivalent to \fIemacs-standard\fP.  The default value is
+.IR emacs .
+The value of
+.B editing\-mode
+also affects the default keymap.
+.TP
+.B mark\-directories (On)
+If set to \fBOn\fP, completed directory names have a slash
+appended.
+.TP
+.B mark\-modified\-lines (Off)
+If set to \fBOn\fP, history lines that have been modified are displayed
+with a preceding asterisk (\fB*\fP).
+.TP
+.B mark\-symlinked\-directories (Off)
+If set to \fBOn\fP, completed names which are symbolic links to directories
+have a slash appended (subject to the value of
+\fBmark\-directories\fP).
+.TP
+.B match\-hidden\-files (On)
+This variable, when set to \fBOn\fP, causes readline to match files whose 
+names begin with a `.' (hidden files) when performing filename     
+completion, unless the leading `.' is     
+supplied by the user in the filename to be completed.
+.TP
+.B output\-meta (Off)
+If set to \fBOn\fP, readline will display characters with the
+eighth bit set directly rather than as a meta-prefixed escape
+sequence.
+.TP
+.B page\-completions (On)
+If set to \fBOn\fP, readline uses an internal \fImore\fP-like pager
+to display a screenful of possible completions at a time.
+.TP
+.B print\-completions\-horizontally (Off)
+If set to \fBOn\fP, readline will display completions with matches
+sorted horizontally in alphabetical order, rather than down the screen.
+.TP
+.B show\-all\-if\-ambiguous (Off)
+This alters the default behavior of the completion functions.  If
+set to
+.BR on ,
+words which have more than one possible completion cause the
+matches to be listed immediately instead of ringing the bell.
+.TP
+.B show\-all\-if\-unmodified (Off)
+This alters the default behavior of the completion functions in
+a fashion similar to \fBshow\-all\-if\-ambiguous\fP.
+If set to
+.BR on , 
+words which have more than one possible completion without any
+possible partial completion (the possible completions don't share 
+a common prefix) cause the matches to be listed immediately instead
+of ringing the bell.
+.TP
+.B visible\-stats (Off)
+If set to \fBOn\fP, a character denoting a file's type as reported  
+by \fIstat\fP(2) is appended to the filename when listing possible
+completions.
+.PD
+.SS Conditional Constructs
+.PP
+Readline implements a facility similar in spirit to the conditional
+compilation features of the C preprocessor which allows key
+bindings and variable settings to be performed as the result
+of tests.  There are four parser directives used.
+.IP \fB$if\fP
+The 
+.B $if
+construct allows bindings to be made based on the
+editing mode, the terminal being used, or the application using
+readline.  The text of the test extends to the end of the line;
+no characters are required to isolate it.
+.RS
+.IP \fBmode\fP
+The \fBmode=\fP form of the \fB$if\fP directive is used to test
+whether readline is in emacs or vi mode.
+This may be used in conjunction
+with the \fBset keymap\fP command, for instance, to set bindings in
+the \fIemacs-standard\fP and \fIemacs-ctlx\fP keymaps only if
+readline is starting out in emacs mode.
+.IP \fBterm\fP
+The \fBterm=\fP form may be used to include terminal-specific
+key bindings, perhaps to bind the key sequences output by the
+terminal's function keys.  The word on the right side of the
+.B =
+is tested against the full name of the terminal and the portion
+of the terminal name before the first \fB\-\fP.  This allows
+.I sun
+to match both
+.I sun
+and
+.IR sun\-cmd ,
+for instance.
+.IP \fBapplication\fP
+The \fBapplication\fP construct is used to include
+application-specific settings.  Each program using the readline
+library sets the \fIapplication name\fP, and an initialization
+file can test for a particular value.
+This could be used to bind key sequences to functions useful for
+a specific program.  For instance, the following command adds a
+key sequence that quotes the current or previous word in Bash:
+.sp 1
+.RS
+.nf
+\fB$if\fP Bash
+# Quote the current or previous word
+"\eC-xq": "\eeb\e"\eef\e""
+\fB$endif\fP
+.fi
+.RE
+.RE
+.IP \fB$endif\fP
+This command, as seen in the previous example, terminates an
+\fB$if\fP command.
+.IP \fB$else\fP
+Commands in this branch of the \fB$if\fP directive are executed if
+the test fails.
+.IP \fB$include\fP
+This directive takes a single filename as an argument and reads commands
+and bindings from that file.  For example, the following directive
+would read \fI/etc/inputrc\fP:
+.sp 1
+.RS
+.nf
+\fB$include\fP \^ \fI/etc/inputrc\fP
+.fi 
+.RE
+.SH SEARCHING
+.PP
+Readline provides commands for searching through the command history
+for lines containing a specified string.
+There are two search modes:
+.I incremental
+and
+.IR non-incremental .
+.PP
+Incremental searches begin before the user has finished typing the
+search string.
+As each character of the search string is typed, readline displays
+the next entry from the history matching the string typed so far.
+An incremental search requires only as many characters as needed to
+find the desired history entry.
+To search backward in the history for a particular string, type
+\fBC\-r\fP.  Typing \fBC\-s\fP searches forward through the history.
+The characters present in the value of the \fBisearch-terminators\fP
+variable are used to terminate an incremental search.
+If that variable has not been assigned a value the \fIEscape\fP and
+\fBC\-J\fP characters will terminate an incremental search.
+\fBC\-G\fP will abort an incremental search and restore the original
+line.
+When the search is terminated, the history entry containing the
+search string becomes the current line.
+.PP
+To find other matching entries in the history list, type \fBC\-s\fP or
+\fBC\-r\fP as appropriate.
+This will search backward or forward in the history for the next
+line matching the search string typed so far.
+Any other key sequence bound to a readline command will terminate
+the search and execute that command.
+For instance, a newline will terminate the search and accept
+the line, thereby executing the command from the history list.
+A movement command will terminate the search, make the last line found
+the current line, and begin editing.
+.PP
+Non-incremental searches read the entire search string before starting
+to search for matching history lines.  The search string may be
+typed by the user or be part of the contents of the current line.
+.SH EDITING COMMANDS
+.PP
+The following is a list of the names of the commands and the default
+key sequences to which they are bound.
+Command names without an accompanying key sequence are unbound by default.
+.PP
+In the following descriptions, \fIpoint\fP refers to the current cursor
+position, and \fImark\fP refers to a cursor position saved by the
+\fBset\-mark\fP command.
+The text between the point and mark is referred to as the \fIregion\fP.
+.SS Commands for Moving
+.PP
+.PD 0
+.TP
+.B beginning\-of\-line (C\-a)
+Move to the start of the current line.
+.TP
+.B end\-of\-line (C\-e)
+Move to the end of the line.
+.TP
+.B forward\-char (C\-f)
+Move forward a character.
+.TP
+.B backward\-char (C\-b)
+Move back a character.
+.TP
+.B forward\-word (M\-f)
+Move forward to the end of the next word.  Words are composed of
+alphanumeric characters (letters and digits).
+.TP
+.B backward\-word (M\-b)
+Move back to the start of the current or previous word.  Words are
+composed of alphanumeric characters (letters and digits).
+.TP
+.B clear\-screen (C\-l)
+Clear the screen leaving the current line at the top of the screen.
+With an argument, refresh the current line without clearing the
+screen.
+.TP
+.B redraw\-current\-line
+Refresh the current line.
+.PD
+.SS Commands for Manipulating the History
+.PP
+.PD 0
+.TP
+.B accept\-line (Newline, Return)
+Accept the line regardless of where the cursor is.
+If this line is
+non-empty, it may be added to the history list for future recall with
+\fBadd_history()\fP.
+If the line is a modified history line, the history line is restored to its original state.
+.TP
+.B previous\-history (C\-p)
+Fetch the previous command from the history list, moving back in
+the list.
+.TP
+.B next\-history (C\-n)
+Fetch the next command from the history list, moving forward in the
+list.
+.TP
+.B beginning\-of\-history (M\-<)
+Move to the first line in the history.
+.TP
+.B end\-of\-history (M\->)
+Move to the end of the input history, i.e., the line currently being
+entered.
+.TP
+.B reverse\-search\-history (C\-r)
+Search backward starting at the current line and moving `up' through
+the history as necessary.  This is an incremental search.
+.TP
+.B forward\-search\-history (C\-s)
+Search forward starting at the current line and moving `down' through
+the history as necessary.  This is an incremental search.
+.TP
+.B non\-incremental\-reverse\-search\-history (M\-p)
+Search backward through the history starting at the current line
+using a non-incremental search for a string supplied by the user.
+.TP
+.B non\-incremental\-forward\-search\-history (M\-n)
+Search forward through the history using a non-incremental search
+for a string supplied by the user.
+.TP
+.B history\-search\-forward
+Search forward through the history for the string of characters
+between the start of the current line and the current cursor
+position (the \fIpoint\fP).
+This is a non-incremental search.
+.TP
+.B history\-search\-backward
+Search backward through the history for the string of characters
+between the start of the current line and the point.
+This is a non-incremental search.
+.TP
+.B yank\-nth\-arg (M\-C\-y)
+Insert the first argument to the previous command (usually
+the second word on the previous line) at point.
+With an argument
+.IR n ,
+insert the \fIn\fPth word from the previous command (the words
+in the previous command begin with word 0).  A negative argument
+inserts the \fIn\fPth word from the end of the previous command.
+Once the argument \fIn\fP is computed, the argument is extracted
+as if the "!\fIn\fP" history expansion had been specified.
+.TP
+.B
+yank\-last\-arg (M\-.\^, M\-_\^)
+Insert the last argument to the previous command (the last word of
+the previous history entry).  With an argument,
+behave exactly like \fByank\-nth\-arg\fP.
+Successive calls to \fByank\-last\-arg\fP move back through the history
+list, inserting the last argument of each line in turn.
+The history expansion facilities are used to extract the last argument,
+as if the "!$" history expansion had been specified.
+.PD
+.SS Commands for Changing Text
+.PP
+.PD 0
+.TP
+.B delete\-char (C\-d)
+Delete the character at point.  If point is at the
+beginning of the line, there are no characters in the line, and
+the last character typed was not bound to \fBdelete\-char\fP, then return
+.SM
+.BR EOF .
+.TP
+.B backward\-delete\-char (Rubout)
+Delete the character behind the cursor.  When given a numeric argument,
+save the deleted text on the kill ring.
+.TP
+.B forward\-backward\-delete\-char   
+Delete the character under the cursor, unless the cursor is at the
+end of the line, in which case the character behind the cursor is
+deleted.
+.TP
+.B quoted\-insert (C\-q, C\-v)
+Add the next character that you type to the line verbatim.  This is
+how to insert characters like \fBC\-q\fP, for example.
+.TP
+.B tab\-insert (M-TAB)
+Insert a tab character.
+.TP
+.B self\-insert (a,\ b,\ A,\ 1,\ !,\ ...)
+Insert the character typed.
+.TP
+.B transpose\-chars (C\-t)
+Drag the character before point forward over the character at point,
+moving point forward as well.
+If point is at the end of the line, then this transposes
+the two characters before point.
+Negative arguments have no effect.
+.TP
+.B transpose\-words (M\-t)
+Drag the word before point past the word after point,
+moving point over that word as well.
+If point is at the end of the line, this transposes
+the last two words on the line.
+.TP
+.B upcase\-word (M\-u)
+Uppercase the current (or following) word.  With a negative argument,
+uppercase the previous word, but do not move point.
+.TP
+.B downcase\-word (M\-l)
+Lowercase the current (or following) word.  With a negative argument,
+lowercase the previous word, but do not move point.
+.TP
+.B capitalize\-word (M\-c)
+Capitalize the current (or following) word.  With a negative argument,
+capitalize the previous word, but do not move point.
+.TP
+.B overwrite\-mode
+Toggle overwrite mode.  With an explicit positive numeric argument,
+switches to overwrite mode.  With an explicit non-positive numeric
+argument, switches to insert mode.  This command affects only
+\fBemacs\fP mode; \fBvi\fP mode does overwrite differently.
+Each call to \fIreadline()\fP starts in insert mode.
+In overwrite mode, characters bound to \fBself\-insert\fP replace   
+the text at point rather than pushing the text to the right.
+Characters bound to \fBbackward\-delete\-char\fP replace the character
+before point with a space.  By default, this command is unbound.
+.PD
+.SS Killing and Yanking
+.PP
+.PD 0
+.TP
+.B kill\-line (C\-k)
+Kill the text from point to the end of the line.
+.TP
+.B backward\-kill\-line (C\-x Rubout)
+Kill backward to the beginning of the line.
+.TP
+.B unix\-line\-discard (C\-u)
+Kill backward from point to the beginning of the line.
+The killed text is saved on the kill-ring.
+.\" There is no real difference between this and backward-kill-line
+.TP
+.B kill\-whole\-line
+Kill all characters on the current line, no matter where point is.
+.TP
+.B kill\-word  (M\-d)
+Kill from point the end of the current word, or if between
+words, to the end of the next word.  Word boundaries are the same as
+those used by \fBforward\-word\fP.
+.TP
+.B backward\-kill\-word (M\-Rubout)
+Kill the word behind point.
+Word boundaries are the same as those used by \fBbackward\-word\fP.
+.TP
+.B unix\-word\-rubout (C\-w)
+Kill the word behind point, using white space as a word boundary.
+The killed text is saved on the kill-ring.
+.TP
+.B unix\-filename\-rubout
+Kill the word behind point, using white space and the slash character
+as the word boundaries.
+The killed text is saved on the kill-ring.
+.TP
+.B delete\-horizontal\-space (M\-\e)
+Delete all spaces and tabs around point.
+.TP
+.B kill\-region
+Kill the text between the point and \fImark\fP (saved cursor position).
+This text is referred to as the \fIregion\fP.
+.TP
+.B copy\-region\-as\-kill
+Copy the text in the region to the kill buffer.
+.TP
+.B copy\-backward\-word
+Copy the word before point to the kill buffer.
+The word boundaries are the same as \fBbackward\-word\fP.
+.TP
+.B copy\-forward\-word
+Copy the word following point to the kill buffer.
+The word boundaries are the same as \fBforward\-word\fP.
+.TP
+.B yank (C\-y)
+Yank the top of the kill ring into the buffer at point.
+.TP
+.B yank\-pop (M\-y)
+Rotate the kill ring, and yank the new top.  Only works following
+.B yank
+or
+.BR yank\-pop .
+.PD
+.SS Numeric Arguments
+.PP
+.PD 0
+.TP
+.B digit\-argument (M\-0, M\-1, ..., M\-\-)
+Add this digit to the argument already accumulating, or start a new
+argument.  M\-\- starts a negative argument.
+.TP
+.B universal\-argument
+This is another way to specify an argument.
+If this command is followed by one or more digits, optionally with a
+leading minus sign, those digits define the argument.
+If the command is followed by digits, executing
+.B universal\-argument
+again ends the numeric argument, but is otherwise ignored.
+As a special case, if this command is immediately followed by a
+character that is neither a digit or minus sign, the argument count
+for the next command is multiplied by four.
+The argument count is initially one, so executing this function the
+first time makes the argument count four, a second time makes the
+argument count sixteen, and so on.
+.PD
+.SS Completing
+.PP
+.PD 0
+.TP
+.B complete (TAB)
+Attempt to perform completion on the text before point.
+The actual completion performed is application-specific.
+.BR Bash ,
+for instance, attempts completion treating the text as a variable
+(if the text begins with \fB$\fP), username (if the text begins with
+\fB~\fP), hostname (if the text begins with \fB@\fP), or
+command (including aliases and functions) in turn.  If none
+of these produces a match, filename completion is attempted.
+.BR Gdb ,
+on the other hand,
+allows completion of program functions and variables, and
+only attempts filename completion under certain circumstances.
+.TP
+.B possible\-completions (M\-?)
+List the possible completions of the text before point.
+.TP
+.B insert\-completions (M\-*)
+Insert all completions of the text before point
+that would have been generated by
+\fBpossible\-completions\fP.
+.TP
+.B menu\-complete
+Similar to \fBcomplete\fP, but replaces the word to be completed
+with a single match from the list of possible completions.
+Repeated execution of \fBmenu\-complete\fP steps through the list
+of possible completions, inserting each match in turn.
+At the end of the list of completions, the bell is rung
+(subject to the setting of \fBbell\-style\fP)
+and the original text is restored.
+An argument of \fIn\fP moves \fIn\fP positions forward in the list
+of matches; a negative argument may be used to move backward 
+through the list.
+This command is intended to be bound to \fBTAB\fP, but is unbound
+by default.
+.TP
+.B delete\-char\-or\-list
+Deletes the character under the cursor if not at the beginning or
+end of the line (like \fBdelete-char\fP).
+If at the end of the line, behaves identically to
+\fBpossible-completions\fP.
+.PD
+.SS Keyboard Macros
+.PP
+.PD 0
+.TP
+.B start\-kbd\-macro (C\-x (\^)
+Begin saving the characters typed into the current keyboard macro.
+.TP
+.B end\-kbd\-macro (C\-x )\^)
+Stop saving the characters typed into the current keyboard macro
+and store the definition.
+.TP
+.B call\-last\-kbd\-macro (C\-x e)
+Re-execute the last keyboard macro defined, by making the characters
+in the macro appear as if typed at the keyboard.
+.PD
+.SS Miscellaneous
+.PP
+.PD 0
+.TP
+.B re\-read\-init\-file (C\-x C\-r)
+Read in the contents of the \fIinputrc\fP file, and incorporate
+any bindings or variable assignments found there.
+.TP
+.B abort (C\-g)
+Abort the current editing command and
+ring the terminal's bell (subject to the setting of
+.BR bell\-style ).
+.TP
+.B do\-uppercase\-version (M\-a, M\-b, M\-\fIx\fP, ...)
+If the metafied character \fIx\fP is lowercase, run the command
+that is bound to the corresponding uppercase character.
+.TP
+.B prefix\-meta (ESC)
+Metafy the next character typed.
+.SM
+.B ESC
+.B f
+is equivalent to
+.BR Meta\-f .
+.TP
+.B undo (C\-_, C\-x C\-u)
+Incremental undo, separately remembered for each line.
+.TP
+.B revert\-line (M\-r)
+Undo all changes made to this line.  This is like executing the
+.B undo
+command enough times to return the line to its initial state.
+.TP
+.B tilde\-expand (M\-&)
+Perform tilde expansion on the current word.
+.TP
+.B set\-mark (C\-@, M\-<space>)
+Set the mark to the point.  If a
+numeric argument is supplied, the mark is set to that position.
+.TP
+.B exchange\-point\-and\-mark (C\-x C\-x)
+Swap the point with the mark.  The current cursor position is set to
+the saved position, and the old cursor position is saved as the mark.
+.TP
+.B character\-search (C\-])
+A character is read and point is moved to the next occurrence of that
+character.  A negative count searches for previous occurrences.
+.TP
+.B character\-search\-backward (M\-C\-])
+A character is read and point is moved to the previous occurrence of that
+character.  A negative count searches for subsequent occurrences.
+.TP
+.B insert\-comment (M\-#)
+Without a numeric argument, the value of the readline
+.B comment\-begin
+variable is inserted at the beginning of the current line.
+If a numeric argument is supplied, this command acts as a toggle:  if
+the characters at the beginning of the line do not match the value   
+of \fBcomment\-begin\fP, the value is inserted, otherwise             
+the characters in \fBcomment-begin\fP are deleted from the beginning of
+the line.
+In either case, the line is accepted as if a newline had been typed.
+The default value of
+.B comment\-begin
+makes the current line a shell comment.
+If a numeric argument causes the comment character to be removed, the line
+will be executed by the shell.
+.TP
+.B dump\-functions
+Print all of the functions and their key bindings to the
+readline output stream.  If a numeric argument is supplied,
+the output is formatted in such a way that it can be made part
+of an \fIinputrc\fP file.
+.TP
+.B dump\-variables
+Print all of the settable variables and their values to the
+readline output stream.  If a numeric argument is supplied,
+the output is formatted in such a way that it can be made part
+of an \fIinputrc\fP file.
+.TP
+.B dump\-macros
+Print all of the readline key sequences bound to macros and the
+strings they output.  If a numeric argument is supplied,
+the output is formatted in such a way that it can be made part
+of an \fIinputrc\fP file.
+.TP
+.B emacs\-editing\-mode (C\-e)
+When in
+.B vi
+command mode, this causes a switch to
+.B emacs
+editing mode.
+.TP
+.B vi\-editing\-mode (M\-C\-j)
+When in
+.B emacs
+editing mode, this causes a switch to
+.B vi
+editing mode.
+.PD
+.SH DEFAULT KEY BINDINGS
+.LP
+The following is a list of the default emacs and vi bindings.
+Characters with the eighth bit set are written as M\-<character>, and
+are referred to as
+.I metafied
+characters.
+The printable ASCII characters not mentioned in the list of emacs
+standard bindings are bound to the
+.B self\-insert
+function, which just inserts the given character into the input line.
+In vi insertion mode, all characters not specifically mentioned are
+bound to
+.BR self\-insert .
+Characters assigned to signal generation by
+.IR stty (1)
+or the terminal driver, such as C-Z or C-C,
+retain that function.
+Upper and lower case metafied characters are bound to the same function in
+the emacs mode meta keymap.
+The remaining characters are unbound, which causes readline
+to ring the bell (subject to the setting of the
+.B bell\-style
+variable).
+.SS Emacs Mode
+.RS +.6i
+.nf
+.ta 2.5i
+.sp
+Emacs Standard bindings
+.sp
+"C-@"  set-mark
+"C-A"  beginning-of-line
+"C-B"  backward-char
+"C-D"  delete-char
+"C-E"  end-of-line
+"C-F"  forward-char
+"C-G"  abort
+"C-H"  backward-delete-char
+"C-I"  complete
+"C-J"  accept-line
+"C-K"  kill-line
+"C-L"  clear-screen
+"C-M"  accept-line
+"C-N"  next-history
+"C-P"  previous-history
+"C-Q"  quoted-insert
+"C-R"  reverse-search-history
+"C-S"  forward-search-history
+"C-T"  transpose-chars
+"C-U"  unix-line-discard
+"C-V"  quoted-insert
+"C-W"  unix-word-rubout
+"C-Y"  yank
+"C-]"  character-search
+"C-_"  undo
+"\^ " to "/"  self-insert
+"0"  to "9"  self-insert
+":"  to "~"  self-insert
+"C-?"  backward-delete-char
+.PP
+Emacs Meta bindings
+.sp
+"M-C-G"  abort
+"M-C-H"  backward-kill-word
+"M-C-I"  tab-insert
+"M-C-J"  vi-editing-mode
+"M-C-M"  vi-editing-mode
+"M-C-R"  revert-line
+"M-C-Y"  yank-nth-arg
+"M-C-["  complete
+"M-C-]"  character-search-backward
+"M-space"  set-mark
+"M-#"  insert-comment
+"M-&"  tilde-expand
+"M-*"  insert-completions
+"M--"  digit-argument
+"M-."  yank-last-arg
+"M-0"  digit-argument
+"M-1"  digit-argument
+"M-2"  digit-argument
+"M-3"  digit-argument
+"M-4"  digit-argument
+"M-5"  digit-argument
+"M-6"  digit-argument
+"M-7"  digit-argument
+"M-8"  digit-argument
+"M-9"  digit-argument
+"M-<"  beginning-of-history
+"M-="  possible-completions
+"M->"  end-of-history
+"M-?"  possible-completions
+"M-B"  backward-word
+"M-C"  capitalize-word
+"M-D"  kill-word
+"M-F"  forward-word
+"M-L"  downcase-word
+"M-N"  non-incremental-forward-search-history
+"M-P"  non-incremental-reverse-search-history
+"M-R"  revert-line
+"M-T"  transpose-words
+"M-U"  upcase-word
+"M-Y"  yank-pop
+"M-\e"  delete-horizontal-space
+"M-~"  tilde-expand
+"M-C-?"  backward-kill-word
+"M-_"  yank-last-arg
+.PP
+Emacs Control-X bindings
+.sp
+"C-XC-G"  abort
+"C-XC-R"  re-read-init-file
+"C-XC-U"  undo
+"C-XC-X"  exchange-point-and-mark
+"C-X("  start-kbd-macro
+"C-X)"  end-kbd-macro
+"C-XE"  call-last-kbd-macro
+"C-XC-?"  backward-kill-line
+.sp
+.RE
+.SS VI Mode bindings
+.RS +.6i
+.nf
+.ta 2.5i
+.sp
+.PP
+VI Insert Mode functions
+.sp
+"C-D"  vi-eof-maybe
+"C-H"  backward-delete-char
+"C-I"  complete
+"C-J"  accept-line
+"C-M"  accept-line
+"C-R"  reverse-search-history
+"C-S"  forward-search-history
+"C-T"  transpose-chars
+"C-U"  unix-line-discard
+"C-V"  quoted-insert
+"C-W"  unix-word-rubout
+"C-Y"  yank
+"C-["  vi-movement-mode
+"C-_"  undo
+"\^ " to "~"  self-insert
+"C-?"  backward-delete-char
+.PP
+VI Command Mode functions
+.sp
+"C-D"  vi-eof-maybe
+"C-E"  emacs-editing-mode
+"C-G"  abort
+"C-H"  backward-char
+"C-J"  accept-line
+"C-K"  kill-line
+"C-L"  clear-screen
+"C-M"  accept-line
+"C-N"  next-history
+"C-P"  previous-history
+"C-Q"  quoted-insert
+"C-R"  reverse-search-history
+"C-S"  forward-search-history
+"C-T"  transpose-chars
+"C-U"  unix-line-discard
+"C-V"  quoted-insert
+"C-W"  unix-word-rubout
+"C-Y"  yank
+"C-_"  vi-undo
+"\^ "  forward-char
+"#"  insert-comment
+"$"  end-of-line
+"%"  vi-match
+"&"  vi-tilde-expand
+"*"  vi-complete
+"+"  next-history
+","  vi-char-search
+"-"  previous-history
+"."  vi-redo
+"/"  vi-search
+"0"  beginning-of-line
+"1" to "9"  vi-arg-digit
+";"  vi-char-search
+"="  vi-complete
+"?"  vi-search
+"A"  vi-append-eol
+"B"  vi-prev-word
+"C"  vi-change-to
+"D"  vi-delete-to
+"E"  vi-end-word
+"F"  vi-char-search
+"G"  vi-fetch-history
+"I"  vi-insert-beg
+"N"  vi-search-again
+"P"  vi-put
+"R"  vi-replace
+"S"  vi-subst
+"T"  vi-char-search
+"U"  revert-line
+"W"  vi-next-word
+"X"  backward-delete-char
+"Y"  vi-yank-to
+"\e"  vi-complete
+"^"  vi-first-print
+"_"  vi-yank-arg
+"`"  vi-goto-mark
+"a"  vi-append-mode
+"b"  vi-prev-word
+"c"  vi-change-to
+"d"  vi-delete-to
+"e"  vi-end-word
+"f"  vi-char-search
+"h"  backward-char
+"i"  vi-insertion-mode
+"j"  next-history
+"k"  prev-history
+"l"  forward-char
+"m"  vi-set-mark
+"n"  vi-search-again
+"p"  vi-put
+"r"  vi-change-char
+"s"  vi-subst
+"t"  vi-char-search
+"u"  vi-undo
+"w"  vi-next-word
+"x"  vi-delete
+"y"  vi-yank-to
+"|"  vi-column
+"~"  vi-change-case
+.RE
+.SH "SEE ALSO"
+.PD 0
+.TP
+\fIThe Gnu Readline Library\fP, Brian Fox and Chet Ramey
+.TP
+\fIThe Gnu History Library\fP, Brian Fox and Chet Ramey
+.TP
+\fIbash\fP(1)
+.PD
+.SH FILES
+.PD 0
+.TP
+.FN ~/.inputrc
+Individual \fBreadline\fP initialization file
+.PD
+.SH AUTHORS
+Brian Fox, Free Software Foundation
+.br
+bfox@gnu.org
+.PP
+Chet Ramey, Case Western Reserve University
+.br
+chet@ins.CWRU.Edu
+.SH BUG REPORTS
+If you find a bug in
+.B readline,
+you should report it.  But first, you should
+make sure that it really is a bug, and that it appears in the latest
+version of the
+.B readline
+library that you have.
+.PP
+Once you have determined that a bug actually exists, mail a
+bug report to \fIbug\-readline\fP@\fIgnu.org\fP.
+If you have a fix, you are welcome to mail that
+as well!  Suggestions and `philosophical' bug reports may be mailed
+to \fPbug-readline\fP@\fIgnu.org\fP or posted to the Usenet
+newsgroup
+.BR gnu.bash.bug .
+.PP
+Comments and bug reports concerning
+this manual page should be directed to
+.IR chet@ins.CWRU.Edu .
+.SH BUGS
+.PP
+It's too big and too slow.
diff --git a/doc/readline.dvi b/doc/readline.dvi
new file mode 100644 (file)
index 0000000..5b33fc6
Binary files /dev/null and b/doc/readline.dvi differ
diff --git a/doc/readline.html b/doc/readline.html
new file mode 100644 (file)
index 0000000..b09e42e
--- /dev/null
@@ -0,0 +1,6722 @@
+<HTML>
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<!-- Created on July, 6  2006 by texi2html 1.64 -->
+<!-- 
+Written by: Lionel Cons <Lionel.Cons@cern.ch> (original author)
+            Karl Berry  <karl@freefriends.org>
+            Olaf Bachmann <obachman@mathematik.uni-kl.de>
+            and many others.
+Maintained by: Olaf Bachmann <obachman@mathematik.uni-kl.de>
+Send bugs and suggestions to <texi2html@mathematik.uni-kl.de>
+-->
+<HEAD>
+<TITLE>GNU Readline Library: </TITLE>
+
+<META NAME="description" CONTENT="GNU Readline Library: ">
+<META NAME="keywords" CONTENT="GNU Readline Library: ">
+<META NAME="resource-type" CONTENT="document">
+<META NAME="distribution" CONTENT="global">
+<META NAME="Generator" CONTENT="texi2html 1.64">
+
+</HEAD>
+
+<BODY LANG="" BGCOLOR="#FFFFFF" TEXT="#000000" LINK="#0000FF" VLINK="#800080" ALINK="#FF0000">
+
+<A NAME="SEC_Top"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC52">Index</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H1>GNU Readline Library</H1></P><P>
+
+This document describes the GNU Readline Library, a utility which aids
+in the consistency of user interface across discrete programs which
+provide a command line interface.
+</P><P>
+
+<BLOCKQUOTE><TABLE BORDER=0 CELLSPACING=0> 
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="readline.html#SEC1">1. Command Line Editing</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">GNU Readline User's Manual.</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="readline.html#SEC23">2. Programming with GNU Readline</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">GNU Readline Programmer's Manual.</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="readline.html#SEC49">A. Copying This Manual</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Copying this manual.</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="readline.html#SEC52">Concept Index</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Index of concepts described in this manual.</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="readline.html#SEC53">Function and Variable Index</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Index of externally visible functions
+                                  and variables.</TD></TR>
+</TABLE></BLOCKQUOTE>
+<P>
+
+<HR SIZE=1>
+<A NAME="SEC1"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Top"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC2"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[ &lt;&lt; ]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Top"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC23"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC52">Index</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<A NAME="Command Line Editing"></A>
+<H1> 1. Command Line Editing </H1>
+<!--docid::SEC1::-->
+<P>
+
+This chapter describes the basic features of the GNU
+command line editing interface.
+</P><P>
+
+<BLOCKQUOTE><TABLE BORDER=0 CELLSPACING=0> 
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="readline.html#SEC2">1.1 Introduction to Line Editing</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Notation used in this text.</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="readline.html#SEC3">1.2 Readline Interaction</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">The minimum set of commands for editing a line.</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="readline.html#SEC9">1.3 Readline Init File</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Customizing Readline from a user's view.</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="readline.html#SEC13">1.4 Bindable Readline Commands</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">A description of most of the Readline commands
+                               available for binding</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="readline.html#SEC22">1.5 Readline vi Mode</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">A short description of how to make Readline
+                               behave like the vi editor.</TD></TR>
+</TABLE></BLOCKQUOTE>
+<P>
+
+<A NAME="Introduction and Notation"></A>
+<HR SIZE="6">
+<A NAME="SEC2"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC1"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC3"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[ &lt;&lt; ]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC1"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC23"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC52">Index</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H2> 1.1 Introduction to Line Editing </H2>
+<!--docid::SEC2::-->
+<P>
+
+The following paragraphs describe the notation used to represent
+keystrokes.
+</P><P>
+
+The text <KBD>C-k</KBD> is read as `Control-K' and describes the character
+produced when the <KBD>k</KBD> key is pressed while the Control key
+is depressed.
+</P><P>
+
+The text <KBD>M-k</KBD> is read as `Meta-K' and describes the character
+produced when the Meta key (if you have one) is depressed, and the <KBD>k</KBD>
+key is pressed.
+The Meta key is labeled <KBD>ALT</KBD> on many keyboards.
+On keyboards with two keys labeled <KBD>ALT</KBD> (usually to either side of
+the space bar), the <KBD>ALT</KBD> on the left side is generally set to
+work as a Meta key.
+The <KBD>ALT</KBD> key on the right may also be configured to work as a
+Meta key or may be configured as some other modifier, such as a
+Compose key for typing accented characters.
+</P><P>
+
+If you do not have a Meta or <KBD>ALT</KBD> key, or another key working as
+a Meta key, the identical keystroke can be generated by typing <KBD>ESC</KBD>
+<EM>first</EM>, and then typing <KBD>k</KBD>.
+Either process is known as <EM>metafying</EM> the <KBD>k</KBD> key.
+</P><P>
+
+The text <KBD>M-C-k</KBD> is read as `Meta-Control-k' and describes the
+character produced by <EM>metafying</EM> <KBD>C-k</KBD>.
+</P><P>
+
+In addition, several keys have their own names.  Specifically,
+<KBD>DEL</KBD>, <KBD>ESC</KBD>, <KBD>LFD</KBD>, <KBD>SPC</KBD>, <KBD>RET</KBD>, and <KBD>TAB</KBD> all
+stand for themselves when seen in this text, or in an init file
+(see section <A HREF="readline.html#SEC9">1.3 Readline Init File</A>).
+If your keyboard lacks a <KBD>LFD</KBD> key, typing <KBD>C-j</KBD> will
+produce the desired character.
+The <KBD>RET</KBD> key may be labeled <KBD>Return</KBD> or <KBD>Enter</KBD> on
+some keyboards.
+</P><P>
+
+<A NAME="Readline Interaction"></A>
+<HR SIZE="6">
+<A NAME="SEC3"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC2"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC4"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC9"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC1"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC9"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC52">Index</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H2> 1.2 Readline Interaction </H2>
+<!--docid::SEC3::-->
+<P>
+
+Often during an interactive session you type in a long line of text,
+only to notice that the first word on the line is misspelled.  The
+Readline library gives you a set of commands for manipulating the text
+as you type it in, allowing you to just fix your typo, and not forcing
+you to retype the majority of the line.  Using these editing commands,
+you move the cursor to the place that needs correction, and delete or
+insert the text of the corrections.  Then, when you are satisfied with
+the line, you simply press <KBD>RET</KBD>.  You do not have to be at the
+end of the line to press <KBD>RET</KBD>; the entire line is accepted
+regardless of the location of the cursor within the line.
+</P><P>
+
+<BLOCKQUOTE><TABLE BORDER=0 CELLSPACING=0> 
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="readline.html#SEC4">1.2.1 Readline Bare Essentials</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">The least you need to know about Readline.</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="readline.html#SEC5">1.2.2 Readline Movement Commands</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Moving about the input line.</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="readline.html#SEC6">1.2.3 Readline Killing Commands</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">How to delete text, and how to get it back!</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="readline.html#SEC7">1.2.4 Readline Arguments</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Giving numeric arguments to commands.</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="readline.html#SEC8">1.2.5 Searching for Commands in the History</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Searching through previous lines.</TD></TR>
+</TABLE></BLOCKQUOTE>
+<P>
+
+<A NAME="Readline Bare Essentials"></A>
+<HR SIZE="6">
+<A NAME="SEC4"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC3"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC5"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC9"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC3"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC9"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC52">Index</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> 1.2.1 Readline Bare Essentials </H3>
+<!--docid::SEC4::-->
+<P>
+
+In order to enter characters into the line, simply type them.  The typed
+character appears where the cursor was, and then the cursor moves one
+space to the right.  If you mistype a character, you can use your
+erase character to back up and delete the mistyped character.
+</P><P>
+
+Sometimes you may mistype a character, and
+not notice the error until you have typed several other characters.  In
+that case, you can type <KBD>C-b</KBD> to move the cursor to the left, and then
+correct your mistake.  Afterwards, you can move the cursor to the right
+with <KBD>C-f</KBD>.
+</P><P>
+
+When you add text in the middle of a line, you will notice that characters
+to the right of the cursor are `pushed over' to make room for the text
+that you have inserted.  Likewise, when you delete text behind the cursor,
+characters to the right of the cursor are `pulled back' to fill in the
+blank space created by the removal of the text.  A list of the bare
+essentials for editing the text of an input line follows.
+</P><P>
+
+<DL COMPACT>
+<DT><KBD>C-b</KBD>
+<DD>Move back one character.
+<DT><KBD>C-f</KBD>
+<DD>Move forward one character.
+<DT><KBD>DEL</KBD> or <KBD>Backspace</KBD>
+<DD>Delete the character to the left of the cursor.
+<DT><KBD>C-d</KBD>
+<DD>Delete the character underneath the cursor.
+<DT>Printing characters
+<DD>Insert the character into the line at the cursor.
+<DT><KBD>C-_</KBD> or <KBD>C-x C-u</KBD>
+<DD>Undo the last editing command.  You can undo all the way back to an
+empty line.
+</DL>
+<P>
+
+(Depending on your configuration, the <KBD>Backspace</KBD> key be set to
+delete the character to the left of the cursor and the <KBD>DEL</KBD> key set
+to delete the character underneath the cursor, like <KBD>C-d</KBD>, rather
+than the character to the left of the cursor.)
+</P><P>
+
+<A NAME="Readline Movement Commands"></A>
+<HR SIZE="6">
+<A NAME="SEC5"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC4"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC6"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC6"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC3"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC9"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC52">Index</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> 1.2.2 Readline Movement Commands </H3>
+<!--docid::SEC5::-->
+<P>
+
+The above table describes the most basic keystrokes that you need
+in order to do editing of the input line.  For your convenience, many
+other commands have been added in addition to <KBD>C-b</KBD>, <KBD>C-f</KBD>,
+<KBD>C-d</KBD>, and <KBD>DEL</KBD>.  Here are some commands for moving more rapidly
+about the line.
+</P><P>
+
+<DL COMPACT>
+<DT><KBD>C-a</KBD>
+<DD>Move to the start of the line.
+<DT><KBD>C-e</KBD>
+<DD>Move to the end of the line.
+<DT><KBD>M-f</KBD>
+<DD>Move forward a word, where a word is composed of letters and digits.
+<DT><KBD>M-b</KBD>
+<DD>Move backward a word.
+<DT><KBD>C-l</KBD>
+<DD>Clear the screen, reprinting the current line at the top.
+</DL>
+<P>
+
+Notice how <KBD>C-f</KBD> moves forward a character, while <KBD>M-f</KBD> moves
+forward a word.  It is a loose convention that control keystrokes
+operate on characters while meta keystrokes operate on words.
+</P><P>
+
+<A NAME="Readline Killing Commands"></A>
+<HR SIZE="6">
+<A NAME="SEC6"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC5"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC7"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC7"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC3"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC9"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC52">Index</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> 1.2.3 Readline Killing Commands </H3>
+<!--docid::SEC6::-->
+<P>
+
+<A NAME="IDX1"></A>
+<A NAME="IDX2"></A>
+</P><P>
+
+<EM>Killing</EM> text means to delete the text from the line, but to save
+it away for later use, usually by <EM>yanking</EM> (re-inserting)
+it back into the line.
+(`Cut' and `paste' are more recent jargon for `kill' and `yank'.)
+</P><P>
+
+If the description for a command says that it `kills' text, then you can
+be sure that you can get the text back in a different (or the same)
+place later.
+</P><P>
+
+When you use a kill command, the text is saved in a <EM>kill-ring</EM>.
+Any number of consecutive kills save all of the killed text together, so
+that when you yank it back, you get it all.  The kill
+ring is not line specific; the text that you killed on a previously
+typed line is available to be yanked back later, when you are typing
+another line.
+<A NAME="IDX3"></A>
+</P><P>
+
+Here is the list of commands for killing text.
+</P><P>
+
+<DL COMPACT>
+<DT><KBD>C-k</KBD>
+<DD>Kill the text from the current cursor position to the end of the line.
+<P>
+
+<DT><KBD>M-d</KBD>
+<DD>Kill from the cursor to the end of the current word, or, if between
+words, to the end of the next word.
+Word boundaries are the same as those used by <KBD>M-f</KBD>.
+<P>
+
+<DT><KBD>M-<KBD>DEL</KBD></KBD>
+<DD>Kill from the cursor the start of the current word, or, if between
+words, to the start of the previous word.
+Word boundaries are the same as those used by <KBD>M-b</KBD>.
+<P>
+
+<DT><KBD>C-w</KBD>
+<DD>Kill from the cursor to the previous whitespace.  This is different than
+<KBD>M-<KBD>DEL</KBD></KBD> because the word boundaries differ.
+<P>
+
+</DL>
+<P>
+
+Here is how to <EM>yank</EM> the text back into the line.  Yanking
+means to copy the most-recently-killed text from the kill buffer.
+</P><P>
+
+<DL COMPACT>
+<DT><KBD>C-y</KBD>
+<DD>Yank the most recently killed text back into the buffer at the cursor.
+<P>
+
+<DT><KBD>M-y</KBD>
+<DD>Rotate the kill-ring, and yank the new top.  You can only do this if
+the prior command is <KBD>C-y</KBD> or <KBD>M-y</KBD>.
+</DL>
+<P>
+
+<A NAME="Readline Arguments"></A>
+<HR SIZE="6">
+<A NAME="SEC7"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC6"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC8"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC8"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC3"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC9"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC52">Index</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> 1.2.4 Readline Arguments </H3>
+<!--docid::SEC7::-->
+<P>
+
+You can pass numeric arguments to Readline commands.  Sometimes the
+argument acts as a repeat count, other times it is the <I>sign</I> of the
+argument that is significant.  If you pass a negative argument to a
+command which normally acts in a forward direction, that command will
+act in a backward direction.  For example, to kill text back to the
+start of the line, you might type <SAMP>`M-- C-k'</SAMP>.
+</P><P>
+
+The general way to pass numeric arguments to a command is to type meta
+digits before the command.  If the first `digit' typed is a minus
+sign (<SAMP>`-'</SAMP>), then the sign of the argument will be negative.  Once
+you have typed one meta digit to get the argument started, you can type
+the remainder of the digits, and then the command.  For example, to give
+the <KBD>C-d</KBD> command an argument of 10, you could type <SAMP>`M-1 0 C-d'</SAMP>,
+which will delete the next ten characters on the input line.
+</P><P>
+
+<A NAME="Searching"></A>
+<HR SIZE="6">
+<A NAME="SEC8"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC7"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC9"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC9"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC3"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC9"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC52">Index</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> 1.2.5 Searching for Commands in the History </H3>
+<!--docid::SEC8::-->
+<P>
+
+Readline provides commands for searching through the command history
+for lines containing a specified string.
+There are two search modes:  <EM>incremental</EM> and <EM>non-incremental</EM>.
+</P><P>
+
+Incremental searches begin before the user has finished typing the
+search string.
+As each character of the search string is typed, Readline displays
+the next entry from the history matching the string typed so far.
+An incremental search requires only as many characters as needed to
+find the desired history entry.
+To search backward in the history for a particular string, type
+<KBD>C-r</KBD>.  Typing <KBD>C-s</KBD> searches forward through the history.
+The characters present in the value of the <CODE>isearch-terminators</CODE> variable
+are used to terminate an incremental search.
+If that variable has not been assigned a value, the <KBD>ESC</KBD> and
+<KBD>C-J</KBD> characters will terminate an incremental search.
+<KBD>C-g</KBD> will abort an incremental search and restore the original line.
+When the search is terminated, the history entry containing the
+search string becomes the current line.
+</P><P>
+
+To find other matching entries in the history list, type <KBD>C-r</KBD> or
+<KBD>C-s</KBD> as appropriate.
+This will search backward or forward in the history for the next
+entry matching the search string typed so far.
+Any other key sequence bound to a Readline command will terminate
+the search and execute that command.
+For instance, a <KBD>RET</KBD> will terminate the search and accept
+the line, thereby executing the command from the history list.
+A movement command will terminate the search, make the last line found
+the current line, and begin editing.
+</P><P>
+
+Readline remembers the last incremental search string.  If two
+<KBD>C-r</KBD>s are typed without any intervening characters defining a new
+search string, any remembered search string is used.
+</P><P>
+
+Non-incremental searches read the entire search string before starting
+to search for matching history lines.  The search string may be
+typed by the user or be part of the contents of the current line.
+</P><P>
+
+<A NAME="Readline Init File"></A>
+<HR SIZE="6">
+<A NAME="SEC9"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC8"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC10"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC13"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC1"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC13"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC52">Index</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H2> 1.3 Readline Init File </H2>
+<!--docid::SEC9::-->
+<P>
+
+Although the Readline library comes with a set of Emacs-like
+keybindings installed by default, it is possible to use a different set
+of keybindings.
+Any user can customize programs that use Readline by putting
+commands in an <EM>inputrc</EM> file, conventionally in his home directory.
+The name of this
+file is taken from the value of the environment variable <CODE>INPUTRC</CODE>.  If
+that variable is unset, the default is <TT>`~/.inputrc'</TT>.  If that
+file does not exist or cannot be read, the ultimate default is
+<TT>`/etc/inputrc'</TT>.
+</P><P>
+
+When a program which uses the Readline library starts up, the
+init file is read, and the key bindings are set.
+</P><P>
+
+In addition, the <CODE>C-x C-r</CODE> command re-reads this init file, thus
+incorporating any changes that you might have made to it.
+</P><P>
+
+<BLOCKQUOTE><TABLE BORDER=0 CELLSPACING=0> 
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="readline.html#SEC10">1.3.1 Readline Init File Syntax</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Syntax for the commands in the inputrc file.</TD></TR>
+</TABLE>
+
+<br>
+<TABLE BORDER=0 CELLSPACING=0>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="readline.html#SEC11">1.3.2 Conditional Init Constructs</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Conditional key bindings in the inputrc file.</TD></TR>
+</TABLE>
+
+<br>
+<TABLE BORDER=0 CELLSPACING=0>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="readline.html#SEC12">1.3.3 Sample Init File</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">An example inputrc file.</TD></TR>
+</TABLE></BLOCKQUOTE>
+<P>
+
+<A NAME="Readline Init File Syntax"></A>
+<HR SIZE="6">
+<A NAME="SEC10"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC9"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC11"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC13"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC9"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC13"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC52">Index</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> 1.3.1 Readline Init File Syntax </H3>
+<!--docid::SEC10::-->
+<P>
+
+There are only a few basic constructs allowed in the
+Readline init file.  Blank lines are ignored.
+Lines beginning with a <SAMP>`#'</SAMP> are comments.
+Lines beginning with a <SAMP>`$'</SAMP> indicate conditional
+constructs (see section <A HREF="readline.html#SEC11">1.3.2 Conditional Init Constructs</A>).  Other lines
+denote variable settings and key bindings.
+</P><P>
+
+<DL COMPACT>
+<DT>Variable Settings
+<DD>You can modify the run-time behavior of Readline by
+altering the values of variables in Readline
+using the <CODE>set</CODE> command within the init file.
+The syntax is simple:
+<P>
+
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>set <VAR>variable</VAR> <VAR>value</VAR>
+</pre></td></tr></table></P><P>
+
+Here, for example, is how to
+change from the default Emacs-like key binding to use
+<CODE>vi</CODE> line editing commands:
+</P><P>
+
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>set editing-mode vi
+</pre></td></tr></table></P><P>
+
+Variable names and values, where appropriate, are recognized without regard
+to case.  Unrecognized variable names are ignored.
+</P><P>
+
+Boolean variables (those that can be set to on or off) are set to on if
+the value is null or empty, <VAR>on</VAR> (case-insensitive), or 1.  Any other
+value results in the variable being set to off.
+</P><P>
+
+A great deal of run-time behavior is changeable with the following
+variables.
+</P><P>
+
+<A NAME="IDX4"></A>
+<DL COMPACT>
+
+<DT><CODE>bell-style</CODE>
+<DD><A NAME="IDX5"></A>
+Controls what happens when Readline wants to ring the terminal bell.
+If set to <SAMP>`none'</SAMP>, Readline never rings the bell.  If set to
+<SAMP>`visible'</SAMP>, Readline uses a visible bell if one is available.
+If set to <SAMP>`audible'</SAMP> (the default), Readline attempts to ring
+the terminal's bell.
+<P>
+
+<DT><CODE>bind-tty-special-chars</CODE>
+<DD><A NAME="IDX6"></A>
+If set to <SAMP>`on'</SAMP>, Readline attempts to bind the control characters  
+treated specially by the kernel's terminal driver to their Readline
+equivalents.
+<P>
+
+<DT><CODE>comment-begin</CODE>
+<DD><A NAME="IDX7"></A>
+The string to insert at the beginning of the line when the
+<CODE>insert-comment</CODE> command is executed.  The default value
+is <CODE>"#"</CODE>.
+<P>
+
+<DT><CODE>completion-ignore-case</CODE>
+<DD>If set to <SAMP>`on'</SAMP>, Readline performs filename matching and completion
+in a case-insensitive fashion.
+The default value is <SAMP>`off'</SAMP>.
+<P>
+
+<DT><CODE>completion-query-items</CODE>
+<DD><A NAME="IDX8"></A>
+The number of possible completions that determines when the user is
+asked whether the list of possibilities should be displayed.
+If the number of possible completions is greater than this value,
+Readline will ask the user whether or not he wishes to view
+them; otherwise, they are simply listed.
+This variable must be set to an integer value greater than or equal to 0.
+A negative value means Readline should never ask.
+The default limit is <CODE>100</CODE>.
+<P>
+
+<DT><CODE>convert-meta</CODE>
+<DD><A NAME="IDX9"></A>
+If set to <SAMP>`on'</SAMP>, Readline will convert characters with the
+eighth bit set to an ASCII key sequence by stripping the eighth
+bit and prefixing an <KBD>ESC</KBD> character, converting them to a
+meta-prefixed key sequence.  The default value is <SAMP>`on'</SAMP>.
+<P>
+
+<DT><CODE>disable-completion</CODE>
+<DD><A NAME="IDX10"></A>
+If set to <SAMP>`On'</SAMP>, Readline will inhibit word completion.
+Completion  characters will be inserted into the line as if they had
+been mapped to <CODE>self-insert</CODE>.  The default is <SAMP>`off'</SAMP>.
+<P>
+
+<DT><CODE>editing-mode</CODE>
+<DD><A NAME="IDX11"></A>
+The <CODE>editing-mode</CODE> variable controls which default set of
+key bindings is used.  By default, Readline starts up in Emacs editing
+mode, where the keystrokes are most similar to Emacs.  This variable can be
+set to either <SAMP>`emacs'</SAMP> or <SAMP>`vi'</SAMP>.
+<P>
+
+<DT><CODE>enable-keypad</CODE>
+<DD><A NAME="IDX12"></A>
+When set to <SAMP>`on'</SAMP>, Readline will try to enable the application
+keypad when it is called.  Some systems need this to enable the
+arrow keys.  The default is <SAMP>`off'</SAMP>.
+<P>
+
+<DT><CODE>expand-tilde</CODE>
+<DD><A NAME="IDX13"></A>
+If set to <SAMP>`on'</SAMP>, tilde expansion is performed when Readline
+attempts word completion.  The default is <SAMP>`off'</SAMP>.
+<P>
+
+<DT><CODE>history-preserve-point</CODE>
+<DD><A NAME="IDX14"></A>
+If set to <SAMP>`on'</SAMP>, the history code attempts to place point at the
+same location on each history line retrieved with <CODE>previous-history</CODE>
+or <CODE>next-history</CODE>.  The default is <SAMP>`off'</SAMP>.
+<P>
+
+<DT><CODE>horizontal-scroll-mode</CODE>
+<DD><A NAME="IDX15"></A>
+This variable can be set to either <SAMP>`on'</SAMP> or <SAMP>`off'</SAMP>.  Setting it
+to <SAMP>`on'</SAMP> means that the text of the lines being edited will scroll
+horizontally on a single screen line when they are longer than the width
+of the screen, instead of wrapping onto a new screen line.  By default,
+this variable is set to <SAMP>`off'</SAMP>.
+<P>
+
+<DT><CODE>input-meta</CODE>
+<DD><A NAME="IDX16"></A>
+<A NAME="IDX17"></A>
+If set to <SAMP>`on'</SAMP>, Readline will enable eight-bit input (it
+will not clear the eighth bit in the characters it reads),
+regardless of what the terminal claims it can support.  The
+default value is <SAMP>`off'</SAMP>.  The name <CODE>meta-flag</CODE> is a
+synonym for this variable.
+<P>
+
+<DT><CODE>isearch-terminators</CODE>
+<DD><A NAME="IDX18"></A>
+The string of characters that should terminate an incremental search without
+subsequently executing the character as a command (see section <A HREF="readline.html#SEC8">1.2.5 Searching for Commands in the History</A>).
+If this variable has not been given a value, the characters <KBD>ESC</KBD> and
+<KBD>C-J</KBD> will terminate an incremental search.
+<P>
+
+<DT><CODE>keymap</CODE>
+<DD><A NAME="IDX19"></A>
+Sets Readline's idea of the current keymap for key binding commands.
+Acceptable <CODE>keymap</CODE> names are
+<CODE>emacs</CODE>,
+<CODE>emacs-standard</CODE>,
+<CODE>emacs-meta</CODE>,
+<CODE>emacs-ctlx</CODE>,
+<CODE>vi</CODE>,
+<CODE>vi-move</CODE>,
+<CODE>vi-command</CODE>, and
+<CODE>vi-insert</CODE>.
+<CODE>vi</CODE> is equivalent to <CODE>vi-command</CODE>; <CODE>emacs</CODE> is
+equivalent to <CODE>emacs-standard</CODE>.  The default value is <CODE>emacs</CODE>.
+The value of the <CODE>editing-mode</CODE> variable also affects the
+default keymap.
+<P>
+
+<DT><CODE>mark-directories</CODE>
+<DD>If set to <SAMP>`on'</SAMP>, completed directory names have a slash
+appended.  The default is <SAMP>`on'</SAMP>.
+<P>
+
+<DT><CODE>mark-modified-lines</CODE>
+<DD><A NAME="IDX20"></A>
+This variable, when set to <SAMP>`on'</SAMP>, causes Readline to display an
+asterisk (<SAMP>`*'</SAMP>) at the start of history lines which have been modified.
+This variable is <SAMP>`off'</SAMP> by default.
+<P>
+
+<DT><CODE>mark-symlinked-directories</CODE>
+<DD><A NAME="IDX21"></A>
+If set to <SAMP>`on'</SAMP>, completed names which are symbolic links
+to directories have a slash appended (subject to the value of
+<CODE>mark-directories</CODE>).
+The default is <SAMP>`off'</SAMP>.
+<P>
+
+<DT><CODE>match-hidden-files</CODE>
+<DD><A NAME="IDX22"></A>
+This variable, when set to <SAMP>`on'</SAMP>, causes Readline to match files whose
+names begin with a <SAMP>`.'</SAMP> (hidden files) when performing filename
+completion, unless the leading <SAMP>`.'</SAMP> is
+supplied by the user in the filename to be completed.
+This variable is <SAMP>`on'</SAMP> by default.
+<P>
+
+<DT><CODE>output-meta</CODE>
+<DD><A NAME="IDX23"></A>
+If set to <SAMP>`on'</SAMP>, Readline will display characters with the
+eighth bit set directly rather than as a meta-prefixed escape
+sequence.  The default is <SAMP>`off'</SAMP>.
+<P>
+
+<DT><CODE>page-completions</CODE>
+<DD><A NAME="IDX24"></A>
+If set to <SAMP>`on'</SAMP>, Readline uses an internal <CODE>more</CODE>-like pager
+to display a screenful of possible completions at a time.
+This variable is <SAMP>`on'</SAMP> by default.
+<P>
+
+<DT><CODE>print-completions-horizontally</CODE>
+<DD>If set to <SAMP>`on'</SAMP>, Readline will display completions with matches
+sorted horizontally in alphabetical order, rather than down the screen.
+The default is <SAMP>`off'</SAMP>.
+<P>
+
+<DT><CODE>show-all-if-ambiguous</CODE>
+<DD><A NAME="IDX25"></A>
+This alters the default behavior of the completion functions.  If
+set to <SAMP>`on'</SAMP>, 
+words which have more than one possible completion cause the
+matches to be listed immediately instead of ringing the bell.
+The default value is <SAMP>`off'</SAMP>.
+<P>
+
+<DT><CODE>show-all-if-unmodified</CODE>
+<DD><A NAME="IDX26"></A>
+This alters the default behavior of the completion functions in
+a fashion similar to <VAR>show-all-if-ambiguous</VAR>.
+If set to <SAMP>`on'</SAMP>, 
+words which have more than one possible completion without any
+possible partial completion (the possible completions don't share
+a common prefix) cause the matches to be listed immediately instead
+of ringing the bell.
+The default value is <SAMP>`off'</SAMP>.
+<P>
+
+<DT><CODE>visible-stats</CODE>
+<DD><A NAME="IDX27"></A>
+If set to <SAMP>`on'</SAMP>, a character denoting a file's type
+is appended to the filename when listing possible
+completions.  The default is <SAMP>`off'</SAMP>.
+<P>
+
+</DL>
+<P>
+
+<DT>Key Bindings
+<DD>The syntax for controlling key bindings in the init file is
+simple.  First you need to find the name of the command that you
+want to change.  The following sections contain tables of the command
+name, the default keybinding, if any, and a short description of what
+the command does.
+<P>
+
+Once you know the name of the command, simply place on a line
+in the init file the name of the key
+you wish to bind the command to, a colon, and then the name of the
+command.
+There can be no space between the key name and the colon -- that will be
+interpreted as part of the key name.
+The name of the key can be expressed in different ways, depending on
+what you find most comfortable.
+</P><P>
+
+In addition to command names, readline allows keys to be bound
+to a string that is inserted when the key is pressed (a <VAR>macro</VAR>).
+</P><P>
+
+<DL COMPACT>
+<DT><VAR>keyname</VAR>: <VAR>function-name</VAR> or <VAR>macro</VAR>
+<DD><VAR>keyname</VAR> is the name of a key spelled out in English.  For example:
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>Control-u: universal-argument
+Meta-Rubout: backward-kill-word
+Control-o: "&#62; output"
+</pre></td></tr></table><P>
+
+In the above example, <KBD>C-u</KBD> is bound to the function
+<CODE>universal-argument</CODE>,
+<KBD>M-DEL</KBD> is bound to the function <CODE>backward-kill-word</CODE>, and
+<KBD>C-o</KBD> is bound to run the macro
+expressed on the right hand side (that is, to insert the text
+<SAMP>`&#62; output'</SAMP> into the line).
+</P><P>
+
+A number of symbolic character names are recognized while
+processing this key binding syntax:
+<VAR>DEL</VAR>,
+<VAR>ESC</VAR>,
+<VAR>ESCAPE</VAR>,
+<VAR>LFD</VAR>,
+<VAR>NEWLINE</VAR>,
+<VAR>RET</VAR>,
+<VAR>RETURN</VAR>,
+<VAR>RUBOUT</VAR>,
+<VAR>SPACE</VAR>,
+<VAR>SPC</VAR>,
+and
+<VAR>TAB</VAR>.
+</P><P>
+
+<DT>"<VAR>keyseq</VAR>": <VAR>function-name</VAR> or <VAR>macro</VAR>
+<DD><VAR>keyseq</VAR> differs from <VAR>keyname</VAR> above in that strings
+denoting an entire key sequence can be specified, by placing
+the key sequence in double quotes.  Some GNU Emacs style key
+escapes can be used, as in the following example, but the
+special character names are not recognized.
+<P>
+
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>"\C-u": universal-argument
+"\C-x\C-r": re-read-init-file
+"\e[11~": "Function Key 1"
+</pre></td></tr></table></P><P>
+
+In the above example, <KBD>C-u</KBD> is again bound to the function
+<CODE>universal-argument</CODE> (just as it was in the first example),
+<SAMP>`<KBD>C-x</KBD> <KBD>C-r</KBD>'</SAMP> is bound to the function <CODE>re-read-init-file</CODE>,
+and <SAMP>`<KBD>ESC</KBD> <KBD>[</KBD> <KBD>1</KBD> <KBD>1</KBD> <KBD>~</KBD>'</SAMP> is bound to insert
+the text <SAMP>`Function Key 1'</SAMP>.
+</P><P>
+
+</DL>
+<P>
+
+The following GNU Emacs style escape sequences are available when
+specifying key sequences:
+</P><P>
+
+<DL COMPACT>
+<DT><CODE><KBD>\C-</KBD></CODE>
+<DD>control prefix
+<DT><CODE><KBD>\M-</KBD></CODE>
+<DD>meta prefix
+<DT><CODE><KBD>\e</KBD></CODE>
+<DD>an escape character
+<DT><CODE><KBD>\\</KBD></CODE>
+<DD>backslash
+<DT><CODE><KBD>\"</KBD></CODE>
+<DD><KBD>"</KBD>, a double quotation mark
+<DT><CODE><KBD>\'</KBD></CODE>
+<DD><KBD>'</KBD>, a single quote or apostrophe
+</DL>
+<P>
+
+In addition to the GNU Emacs style escape sequences, a second
+set of backslash escapes is available:
+</P><P>
+
+<DL COMPACT>
+<DT><CODE>\a</CODE>
+<DD>alert (bell)
+<DT><CODE>\b</CODE>
+<DD>backspace
+<DT><CODE>\d</CODE>
+<DD>delete
+<DT><CODE>\f</CODE>
+<DD>form feed
+<DT><CODE>\n</CODE>
+<DD>newline
+<DT><CODE>\r</CODE>
+<DD>carriage return
+<DT><CODE>\t</CODE>
+<DD>horizontal tab
+<DT><CODE>\v</CODE>
+<DD>vertical tab
+<DT><CODE>\<VAR>nnn</VAR></CODE>
+<DD>the eight-bit character whose value is the octal value <VAR>nnn</VAR>
+(one to three digits)
+<DT><CODE>\x<VAR>HH</VAR></CODE>
+<DD>the eight-bit character whose value is the hexadecimal value <VAR>HH</VAR>
+(one or two hex digits)
+</DL>
+<P>
+
+When entering the text of a macro, single or double quotes must
+be used to indicate a macro definition.
+Unquoted text is assumed to be a function name.
+In the macro body, the backslash escapes described above are expanded.
+Backslash will quote any other character in the macro text,
+including <SAMP>`"'</SAMP> and <SAMP>`''</SAMP>.
+For example, the following binding will make <SAMP>`<KBD>C-x</KBD> \'</SAMP>
+insert a single <SAMP>`\'</SAMP> into the line:
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>"\C-x\\": "\\"
+</pre></td></tr></table></P><P>
+
+</DL>
+<P>
+
+<A NAME="Conditional Init Constructs"></A>
+<HR SIZE="6">
+<A NAME="SEC11"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC10"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC12"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC12"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC9"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC13"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC52">Index</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> 1.3.2 Conditional Init Constructs </H3>
+<!--docid::SEC11::-->
+<P>
+
+Readline implements a facility similar in spirit to the conditional
+compilation features of the C preprocessor which allows key
+bindings and variable settings to be performed as the result
+of tests.  There are four parser directives used.
+</P><P>
+
+<DL COMPACT>
+<DT><CODE>$if</CODE>
+<DD>The <CODE>$if</CODE> construct allows bindings to be made based on the
+editing mode, the terminal being used, or the application using
+Readline.  The text of the test extends to the end of the line;
+no characters are required to isolate it.
+<P>
+
+<DL COMPACT>
+<DT><CODE>mode</CODE>
+<DD>The <CODE>mode=</CODE> form of the <CODE>$if</CODE> directive is used to test
+whether Readline is in <CODE>emacs</CODE> or <CODE>vi</CODE> mode.
+This may be used in conjunction
+with the <SAMP>`set keymap'</SAMP> command, for instance, to set bindings in
+the <CODE>emacs-standard</CODE> and <CODE>emacs-ctlx</CODE> keymaps only if
+Readline is starting out in <CODE>emacs</CODE> mode.
+<P>
+
+<DT><CODE>term</CODE>
+<DD>The <CODE>term=</CODE> form may be used to include terminal-specific
+key bindings, perhaps to bind the key sequences output by the
+terminal's function keys.  The word on the right side of the
+<SAMP>`='</SAMP> is tested against both the full name of the terminal and
+the portion of the terminal name before the first <SAMP>`-'</SAMP>.  This
+allows <CODE>sun</CODE> to match both <CODE>sun</CODE> and <CODE>sun-cmd</CODE>,
+for instance.
+<P>
+
+<DT><CODE>application</CODE>
+<DD>The <VAR>application</VAR> construct is used to include
+application-specific settings.  Each program using the Readline
+library sets the <VAR>application name</VAR>, and you can test for
+a particular value. 
+This could be used to bind key sequences to functions useful for
+a specific program.  For instance, the following command adds a
+key sequence that quotes the current or previous word in Bash:
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>$if Bash
+# Quote the current or previous word
+"\C-xq": "\eb\"\ef\""
+$endif
+</pre></td></tr></table></DL>
+<P>
+
+<DT><CODE>$endif</CODE>
+<DD>This command, as seen in the previous example, terminates an
+<CODE>$if</CODE> command.
+<P>
+
+<DT><CODE>$else</CODE>
+<DD>Commands in this branch of the <CODE>$if</CODE> directive are executed if
+the test fails.
+<P>
+
+<DT><CODE>$include</CODE>
+<DD>This directive takes a single filename as an argument and reads commands
+and bindings from that file.
+For example, the following directive reads from <TT>`/etc/inputrc'</TT>:
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>$include /etc/inputrc
+</pre></td></tr></table></DL>
+<P>
+
+<A NAME="Sample Init File"></A>
+<HR SIZE="6">
+<A NAME="SEC12"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC11"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC13"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC13"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC9"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC13"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC52">Index</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> 1.3.3 Sample Init File </H3>
+<!--docid::SEC12::-->
+<P>
+
+Here is an example of an <VAR>inputrc</VAR> file.  This illustrates key
+binding, variable assignment, and conditional syntax.
+</P><P>
+
+<TABLE><tr><td>&nbsp;</td><td class=example><pre># This file controls the behaviour of line input editing for
+# programs that use the GNU Readline library.  Existing
+# programs include FTP, Bash, and GDB.
+#
+# You can re-read the inputrc file with C-x C-r.
+# Lines beginning with '#' are comments.
+#
+# First, include any systemwide bindings and variable
+# assignments from /etc/Inputrc
+$include /etc/Inputrc
+
+#
+# Set various bindings for emacs mode.
+
+set editing-mode emacs 
+
+$if mode=emacs
+
+Meta-Control-h:        backward-kill-word      Text after the function name is ignored
+
+#
+# Arrow keys in keypad mode
+#
+#"\M-OD":        backward-char
+#"\M-OC":        forward-char
+#"\M-OA":        previous-history
+#"\M-OB":        next-history
+#
+# Arrow keys in ANSI mode
+#
+"\M-[D":        backward-char
+"\M-[C":        forward-char
+"\M-[A":        previous-history
+"\M-[B":        next-history
+#
+# Arrow keys in 8 bit keypad mode
+#
+#"\M-\C-OD":       backward-char
+#"\M-\C-OC":       forward-char
+#"\M-\C-OA":       previous-history
+#"\M-\C-OB":       next-history
+#
+# Arrow keys in 8 bit ANSI mode
+#
+#"\M-\C-[D":       backward-char
+#"\M-\C-[C":       forward-char
+#"\M-\C-[A":       previous-history
+#"\M-\C-[B":       next-history
+
+C-q: quoted-insert
+
+$endif
+
+# An old-style binding.  This happens to be the default.
+TAB: complete
+
+# Macros that are convenient for shell interaction
+$if Bash
+# edit the path
+"\C-xp": "PATH=${PATH}\e\C-e\C-a\ef\C-f"
+# prepare to type a quoted word --
+# insert open and close double quotes
+# and move to just after the open quote
+"\C-x\"": "\"\"\C-b"
+# insert a backslash (testing backslash escapes
+# in sequences and macros)
+"\C-x\\": "\\"
+# Quote the current or previous word
+"\C-xq": "\eb\"\ef\""
+# Add a binding to refresh the line, which is unbound
+"\C-xr": redraw-current-line
+# Edit variable on current line.
+"\M-\C-v": "\C-a\C-k$\C-y\M-\C-e\C-a\C-y="
+$endif
+
+# use a visible bell if one is available
+set bell-style visible
+
+# don't strip characters to 7 bits when reading
+set input-meta on
+
+# allow iso-latin1 characters to be inserted rather
+# than converted to prefix-meta sequences
+set convert-meta off
+
+# display characters with the eighth bit set directly
+# rather than as meta-prefixed characters
+set output-meta on
+
+# if there are more than 150 possible completions for
+# a word, ask the user if he wants to see all of them
+set completion-query-items 150
+
+# For FTP
+$if Ftp
+"\C-xg": "get \M-?"
+"\C-xt": "put \M-?"
+"\M-.": yank-last-arg
+$endif
+</pre></td></tr></table></P><P>
+
+<A NAME="Bindable Readline Commands"></A>
+<HR SIZE="6">
+<A NAME="SEC13"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC12"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC14"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC22"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC1"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC22"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC52">Index</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H2> 1.4 Bindable Readline Commands </H2>
+<!--docid::SEC13::-->
+<P>
+
+<BLOCKQUOTE><TABLE BORDER=0 CELLSPACING=0> 
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="readline.html#SEC14">1.4.1 Commands For Moving</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Moving about the line.</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="readline.html#SEC15">1.4.2 Commands For Manipulating The History</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Getting at previous lines.</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="readline.html#SEC16">1.4.3 Commands For Changing Text</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Commands for changing text.</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="readline.html#SEC17">1.4.4 Killing And Yanking</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Commands for killing and yanking.</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="readline.html#SEC18">1.4.5 Specifying Numeric Arguments</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Specifying numeric arguments, repeat counts.</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="readline.html#SEC19">1.4.6 Letting Readline Type For You</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Getting Readline to do the typing for you.</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="readline.html#SEC20">1.4.7 Keyboard Macros</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Saving and re-executing typed characters</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="readline.html#SEC21">1.4.8 Some Miscellaneous Commands</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Other miscellaneous commands.</TD></TR>
+</TABLE></BLOCKQUOTE>
+<P>
+
+This section describes Readline commands that may be bound to key
+sequences.
+Command names without an accompanying key sequence are unbound by default.
+</P><P>
+
+In the following descriptions, <EM>point</EM> refers to the current cursor
+position, and <EM>mark</EM> refers to a cursor position saved by the
+<CODE>set-mark</CODE> command.
+The text between the point and mark is referred to as the <EM>region</EM>.
+</P><P>
+
+<A NAME="Commands For Moving"></A>
+<HR SIZE="6">
+<A NAME="SEC14"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC13"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC15"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC22"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC13"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC22"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC52">Index</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> 1.4.1 Commands For Moving </H3>
+<!--docid::SEC14::-->
+<DL COMPACT>
+<A NAME="IDX28"></A>
+<DT><CODE>beginning-of-line (C-a)</CODE>
+<DD><A NAME="IDX29"></A>
+Move to the start of the current line.
+<P>
+
+<A NAME="IDX30"></A>
+<DT><CODE>end-of-line (C-e)</CODE>
+<DD><A NAME="IDX31"></A>
+Move to the end of the line.
+<P>
+
+<A NAME="IDX32"></A>
+<DT><CODE>forward-char (C-f)</CODE>
+<DD><A NAME="IDX33"></A>
+Move forward a character.
+<P>
+
+<A NAME="IDX34"></A>
+<DT><CODE>backward-char (C-b)</CODE>
+<DD><A NAME="IDX35"></A>
+Move back a character.
+<P>
+
+<A NAME="IDX36"></A>
+<DT><CODE>forward-word (M-f)</CODE>
+<DD><A NAME="IDX37"></A>
+Move forward to the end of the next word.  Words are composed of
+letters and digits.
+<P>
+
+<A NAME="IDX38"></A>
+<DT><CODE>backward-word (M-b)</CODE>
+<DD><A NAME="IDX39"></A>
+Move back to the start of the current or previous word.  Words are
+composed of letters and digits.
+<P>
+
+<A NAME="IDX40"></A>
+<DT><CODE>clear-screen (C-l)</CODE>
+<DD><A NAME="IDX41"></A>
+Clear the screen and redraw the current line,
+leaving the current line at the top of the screen.
+<P>
+
+<A NAME="IDX42"></A>
+<DT><CODE>redraw-current-line ()</CODE>
+<DD><A NAME="IDX43"></A>
+Refresh the current line.  By default, this is unbound.
+<P>
+
+</DL>
+<P>
+
+<A NAME="Commands For History"></A>
+<HR SIZE="6">
+<A NAME="SEC15"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC14"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC16"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC16"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC13"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC22"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC52">Index</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> 1.4.2 Commands For Manipulating The History </H3>
+<!--docid::SEC15::-->
+<P>
+
+<DL COMPACT>
+<A NAME="IDX44"></A>
+<DT><CODE>accept-line (Newline or Return)</CODE>
+<DD><A NAME="IDX45"></A>
+Accept the line regardless of where the cursor is.
+If this line is
+non-empty, it may be added to the history list for future recall with
+<CODE>add_history()</CODE>.
+If this line is a modified history line, the history line is restored
+to its original state.
+<P>
+
+<A NAME="IDX46"></A>
+<DT><CODE>previous-history (C-p)</CODE>
+<DD><A NAME="IDX47"></A>
+Move `back' through the history list, fetching the previous command.
+<P>
+
+<A NAME="IDX48"></A>
+<DT><CODE>next-history (C-n)</CODE>
+<DD><A NAME="IDX49"></A>
+Move `forward' through the history list, fetching the next command.
+<P>
+
+<A NAME="IDX50"></A>
+<DT><CODE>beginning-of-history (M-&#60;)</CODE>
+<DD><A NAME="IDX51"></A>
+Move to the first line in the history.
+<P>
+
+<A NAME="IDX52"></A>
+<DT><CODE>end-of-history (M-&#62;)</CODE>
+<DD><A NAME="IDX53"></A>
+Move to the end of the input history, i.e., the line currently
+being entered.
+<P>
+
+<A NAME="IDX54"></A>
+<DT><CODE>reverse-search-history (C-r)</CODE>
+<DD><A NAME="IDX55"></A>
+Search backward starting at the current line and moving `up' through
+the history as necessary.  This is an incremental search.
+<P>
+
+<A NAME="IDX56"></A>
+<DT><CODE>forward-search-history (C-s)</CODE>
+<DD><A NAME="IDX57"></A>
+Search forward starting at the current line and moving `down' through
+the the history as necessary.  This is an incremental search.
+<P>
+
+<A NAME="IDX58"></A>
+<DT><CODE>non-incremental-reverse-search-history (M-p)</CODE>
+<DD><A NAME="IDX59"></A>
+Search backward starting at the current line and moving `up'
+through the history as necessary using a non-incremental search
+for a string supplied by the user.
+<P>
+
+<A NAME="IDX60"></A>
+<DT><CODE>non-incremental-forward-search-history (M-n)</CODE>
+<DD><A NAME="IDX61"></A>
+Search forward starting at the current line and moving `down'
+through the the history as necessary using a non-incremental search
+for a string supplied by the user.
+<P>
+
+<A NAME="IDX62"></A>
+<DT><CODE>history-search-forward ()</CODE>
+<DD><A NAME="IDX63"></A>
+Search forward through the history for the string of characters
+between the start of the current line and the point.
+This is a non-incremental search.
+By default, this command is unbound.
+<P>
+
+<A NAME="IDX64"></A>
+<DT><CODE>history-search-backward ()</CODE>
+<DD><A NAME="IDX65"></A>
+Search backward through the history for the string of characters
+between the start of the current line and the point.  This
+is a non-incremental search.  By default, this command is unbound.
+<P>
+
+<A NAME="IDX66"></A>
+<DT><CODE>yank-nth-arg (M-C-y)</CODE>
+<DD><A NAME="IDX67"></A>
+Insert the first argument to the previous command (usually
+the second word on the previous line) at point.
+With an argument <VAR>n</VAR>,
+insert the <VAR>n</VAR>th word from the previous command (the words
+in the previous command begin with word 0).  A negative argument
+inserts the <VAR>n</VAR>th word from the end of the previous command.
+Once the argument <VAR>n</VAR> is computed, the argument is extracted
+as if the <SAMP>`!<VAR>n</VAR>'</SAMP> history expansion had been specified.
+<P>
+
+<A NAME="IDX68"></A>
+<DT><CODE>yank-last-arg (M-. or M-_)</CODE>
+<DD><A NAME="IDX69"></A>
+Insert last argument to the previous command (the last word of the
+previous history entry).  With an
+argument, behave exactly like <CODE>yank-nth-arg</CODE>.
+Successive calls to <CODE>yank-last-arg</CODE> move back through the history
+list, inserting the last argument of each line in turn.
+The history expansion facilities are used to extract the last argument,
+as if the <SAMP>`!$'</SAMP> history expansion had been specified.
+<P>
+
+</DL>
+<P>
+
+<A NAME="Commands For Text"></A>
+<HR SIZE="6">
+<A NAME="SEC16"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC15"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC17"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC17"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC13"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC22"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC52">Index</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> 1.4.3 Commands For Changing Text </H3>
+<!--docid::SEC16::-->
+<P>
+
+<DL COMPACT>
+<A NAME="IDX70"></A>
+<DT><CODE>delete-char (C-d)</CODE>
+<DD><A NAME="IDX71"></A>
+Delete the character at point.  If point is at the
+beginning of the line, there are no characters in the line, and
+the last character typed was not bound to <CODE>delete-char</CODE>, then
+return EOF.
+<P>
+
+<A NAME="IDX72"></A>
+<DT><CODE>backward-delete-char (Rubout)</CODE>
+<DD><A NAME="IDX73"></A>
+Delete the character behind the cursor.  A numeric argument means
+to kill the characters instead of deleting them.
+<P>
+
+<A NAME="IDX74"></A>
+<DT><CODE>forward-backward-delete-char ()</CODE>
+<DD><A NAME="IDX75"></A>
+Delete the character under the cursor, unless the cursor is at the
+end of the line, in which case the character behind the cursor is
+deleted.  By default, this is not bound to a key.
+<P>
+
+<A NAME="IDX76"></A>
+<DT><CODE>quoted-insert (C-q or C-v)</CODE>
+<DD><A NAME="IDX77"></A>
+Add the next character typed to the line verbatim.  This is
+how to insert key sequences like <KBD>C-q</KBD>, for example.
+<P>
+
+<A NAME="IDX78"></A>
+<DT><CODE>tab-insert (M-<KBD>TAB</KBD>)</CODE>
+<DD><A NAME="IDX79"></A>
+Insert a tab character.
+<P>
+
+<A NAME="IDX80"></A>
+<DT><CODE>self-insert (a, b, A, 1, !, <small>...</small>)</CODE>
+<DD><A NAME="IDX81"></A>
+Insert yourself.
+<P>
+
+<A NAME="IDX82"></A>
+<DT><CODE>transpose-chars (C-t)</CODE>
+<DD><A NAME="IDX83"></A>
+Drag the character before the cursor forward over
+the character at the cursor, moving the
+cursor forward as well.  If the insertion point
+is at the end of the line, then this
+transposes the last two characters of the line.
+Negative arguments have no effect.
+<P>
+
+<A NAME="IDX84"></A>
+<DT><CODE>transpose-words (M-t)</CODE>
+<DD><A NAME="IDX85"></A>
+Drag the word before point past the word after point,
+moving point past that word as well.
+If the insertion point is at the end of the line, this transposes
+the last two words on the line.
+<P>
+
+<A NAME="IDX86"></A>
+<DT><CODE>upcase-word (M-u)</CODE>
+<DD><A NAME="IDX87"></A>
+Uppercase the current (or following) word.  With a negative argument,
+uppercase the previous word, but do not move the cursor.
+<P>
+
+<A NAME="IDX88"></A>
+<DT><CODE>downcase-word (M-l)</CODE>
+<DD><A NAME="IDX89"></A>
+Lowercase the current (or following) word.  With a negative argument,
+lowercase the previous word, but do not move the cursor.
+<P>
+
+<A NAME="IDX90"></A>
+<DT><CODE>capitalize-word (M-c)</CODE>
+<DD><A NAME="IDX91"></A>
+Capitalize the current (or following) word.  With a negative argument,
+capitalize the previous word, but do not move the cursor.
+<P>
+
+<A NAME="IDX92"></A>
+<DT><CODE>overwrite-mode ()</CODE>
+<DD><A NAME="IDX93"></A>
+Toggle overwrite mode.  With an explicit positive numeric argument,
+switches to overwrite mode.  With an explicit non-positive numeric
+argument, switches to insert mode.  This command affects only
+<CODE>emacs</CODE> mode; <CODE>vi</CODE> mode does overwrite differently.
+Each call to <CODE>readline()</CODE> starts in insert mode.
+<P>
+
+In overwrite mode, characters bound to <CODE>self-insert</CODE> replace
+the text at point rather than pushing the text to the right.
+Characters bound to <CODE>backward-delete-char</CODE> replace the character
+before point with a space.
+</P><P>
+
+By default, this command is unbound.
+</P><P>
+
+</DL>
+<P>
+
+<A NAME="Commands For Killing"></A>
+<HR SIZE="6">
+<A NAME="SEC17"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC16"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC18"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC18"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC13"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC22"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC52">Index</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> 1.4.4 Killing And Yanking </H3>
+<!--docid::SEC17::-->
+<P>
+
+<DL COMPACT>
+
+<A NAME="IDX94"></A>
+<DT><CODE>kill-line (C-k)</CODE>
+<DD><A NAME="IDX95"></A>
+Kill the text from point to the end of the line.
+<P>
+
+<A NAME="IDX96"></A>
+<DT><CODE>backward-kill-line (C-x Rubout)</CODE>
+<DD><A NAME="IDX97"></A>
+Kill backward to the beginning of the line.
+<P>
+
+<A NAME="IDX98"></A>
+<DT><CODE>unix-line-discard (C-u)</CODE>
+<DD><A NAME="IDX99"></A>
+Kill backward from the cursor to the beginning of the current line.
+<P>
+
+<A NAME="IDX100"></A>
+<DT><CODE>kill-whole-line ()</CODE>
+<DD><A NAME="IDX101"></A>
+Kill all characters on the current line, no matter where point is.
+By default, this is unbound.
+<P>
+
+<A NAME="IDX102"></A>
+<DT><CODE>kill-word (M-d)</CODE>
+<DD><A NAME="IDX103"></A>
+Kill from point to the end of the current word, or if between
+words, to the end of the next word.
+Word boundaries are the same as <CODE>forward-word</CODE>.
+<P>
+
+<A NAME="IDX104"></A>
+<DT><CODE>backward-kill-word (M-<KBD>DEL</KBD>)</CODE>
+<DD><A NAME="IDX105"></A>
+Kill the word behind point.
+Word boundaries are the same as <CODE>backward-word</CODE>.
+<P>
+
+<A NAME="IDX106"></A>
+<DT><CODE>unix-word-rubout (C-w)</CODE>
+<DD><A NAME="IDX107"></A>
+Kill the word behind point, using white space as a word boundary.
+The killed text is saved on the kill-ring.
+<P>
+
+<A NAME="IDX108"></A>
+<DT><CODE>unix-filename-rubout ()</CODE>
+<DD><A NAME="IDX109"></A>
+Kill the word behind point, using white space and the slash character
+as the word boundaries.
+The killed text is saved on the kill-ring.
+<P>
+
+<A NAME="IDX110"></A>
+<DT><CODE>delete-horizontal-space ()</CODE>
+<DD><A NAME="IDX111"></A>
+Delete all spaces and tabs around point.  By default, this is unbound.
+<P>
+
+<A NAME="IDX112"></A>
+<DT><CODE>kill-region ()</CODE>
+<DD><A NAME="IDX113"></A>
+Kill the text in the current region.
+By default, this command is unbound.
+<P>
+
+<A NAME="IDX114"></A>
+<DT><CODE>copy-region-as-kill ()</CODE>
+<DD><A NAME="IDX115"></A>
+Copy the text in the region to the kill buffer, so it can be yanked
+right away.  By default, this command is unbound.
+<P>
+
+<A NAME="IDX116"></A>
+<DT><CODE>copy-backward-word ()</CODE>
+<DD><A NAME="IDX117"></A>
+Copy the word before point to the kill buffer.
+The word boundaries are the same as <CODE>backward-word</CODE>.
+By default, this command is unbound.
+<P>
+
+<A NAME="IDX118"></A>
+<DT><CODE>copy-forward-word ()</CODE>
+<DD><A NAME="IDX119"></A>
+Copy the word following point to the kill buffer.
+The word boundaries are the same as <CODE>forward-word</CODE>.
+By default, this command is unbound.
+<P>
+
+<A NAME="IDX120"></A>
+<DT><CODE>yank (C-y)</CODE>
+<DD><A NAME="IDX121"></A>
+Yank the top of the kill ring into the buffer at point.
+<P>
+
+<A NAME="IDX122"></A>
+<DT><CODE>yank-pop (M-y)</CODE>
+<DD><A NAME="IDX123"></A>
+Rotate the kill-ring, and yank the new top.  You can only do this if
+the prior command is <CODE>yank</CODE> or <CODE>yank-pop</CODE>.
+</DL>
+<P>
+
+<A NAME="Numeric Arguments"></A>
+<HR SIZE="6">
+<A NAME="SEC18"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC17"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC19"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC19"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC13"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC22"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC52">Index</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> 1.4.5 Specifying Numeric Arguments </H3>
+<!--docid::SEC18::-->
+<DL COMPACT>
+
+<A NAME="IDX124"></A>
+<DT><CODE>digit-argument (<KBD>M-0</KBD>, <KBD>M-1</KBD>, <small>...</small> <KBD>M--</KBD>)</CODE>
+<DD><A NAME="IDX125"></A>
+Add this digit to the argument already accumulating, or start a new
+argument.  <KBD>M--</KBD> starts a negative argument.
+<P>
+
+<A NAME="IDX126"></A>
+<DT><CODE>universal-argument ()</CODE>
+<DD><A NAME="IDX127"></A>
+This is another way to specify an argument.
+If this command is followed by one or more digits, optionally with a
+leading minus sign, those digits define the argument.
+If the command is followed by digits, executing <CODE>universal-argument</CODE>
+again ends the numeric argument, but is otherwise ignored.
+As a special case, if this command is immediately followed by a
+character that is neither a digit or minus sign, the argument count
+for the next command is multiplied by four.
+The argument count is initially one, so executing this function the
+first time makes the argument count four, a second time makes the
+argument count sixteen, and so on.
+By default, this is not bound to a key.
+</DL>
+<P>
+
+<A NAME="Commands For Completion"></A>
+<HR SIZE="6">
+<A NAME="SEC19"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC18"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC20"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC20"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC13"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC22"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC52">Index</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> 1.4.6 Letting Readline Type For You </H3>
+<!--docid::SEC19::-->
+<P>
+
+<DL COMPACT>
+<A NAME="IDX128"></A>
+<DT><CODE>complete (<KBD>TAB</KBD>)</CODE>
+<DD><A NAME="IDX129"></A>
+Attempt to perform completion on the text before point.
+The actual completion performed is application-specific.
+The default is filename completion.
+<P>
+
+<A NAME="IDX130"></A>
+<DT><CODE>possible-completions (M-?)</CODE>
+<DD><A NAME="IDX131"></A>
+List the possible completions of the text before point.
+<P>
+
+<A NAME="IDX132"></A>
+<DT><CODE>insert-completions (M-*)</CODE>
+<DD><A NAME="IDX133"></A>
+Insert all completions of the text before point that would have
+been generated by <CODE>possible-completions</CODE>.
+<P>
+
+<A NAME="IDX134"></A>
+<DT><CODE>menu-complete ()</CODE>
+<DD><A NAME="IDX135"></A>
+Similar to <CODE>complete</CODE>, but replaces the word to be completed
+with a single match from the list of possible completions.
+Repeated execution of <CODE>menu-complete</CODE> steps through the list
+of possible completions, inserting each match in turn.
+At the end of the list of completions, the bell is rung
+(subject to the setting of <CODE>bell-style</CODE>)
+and the original text is restored.
+An argument of <VAR>n</VAR> moves <VAR>n</VAR> positions forward in the list
+of matches; a negative argument may be used to move backward
+through the list.
+This command is intended to be bound to <KBD>TAB</KBD>, but is unbound
+by default.
+<P>
+
+<A NAME="IDX136"></A>
+<DT><CODE>delete-char-or-list ()</CODE>
+<DD><A NAME="IDX137"></A>
+Deletes the character under the cursor if not at the beginning or
+end of the line (like <CODE>delete-char</CODE>).
+If at the end of the line, behaves identically to
+<CODE>possible-completions</CODE>.
+This command is unbound by default.
+<P>
+
+</DL>
+<P>
+
+<A NAME="Keyboard Macros"></A>
+<HR SIZE="6">
+<A NAME="SEC20"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC19"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC21"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC21"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC13"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC22"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC52">Index</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> 1.4.7 Keyboard Macros </H3>
+<!--docid::SEC20::-->
+<DL COMPACT>
+
+<A NAME="IDX138"></A>
+<DT><CODE>start-kbd-macro (C-x ()</CODE>
+<DD><A NAME="IDX139"></A>
+Begin saving the characters typed into the current keyboard macro.
+<P>
+
+<A NAME="IDX140"></A>
+<DT><CODE>end-kbd-macro (C-x ))</CODE>
+<DD><A NAME="IDX141"></A>
+Stop saving the characters typed into the current keyboard macro
+and save the definition.
+<P>
+
+<A NAME="IDX142"></A>
+<DT><CODE>call-last-kbd-macro (C-x e)</CODE>
+<DD><A NAME="IDX143"></A>
+Re-execute the last keyboard macro defined, by making the characters
+in the macro appear as if typed at the keyboard.
+<P>
+
+</DL>
+<P>
+
+<A NAME="Miscellaneous Commands"></A>
+<HR SIZE="6">
+<A NAME="SEC21"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC20"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC22"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC22"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC13"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC22"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC52">Index</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> 1.4.8 Some Miscellaneous Commands </H3>
+<!--docid::SEC21::-->
+<DL COMPACT>
+
+<A NAME="IDX144"></A>
+<DT><CODE>re-read-init-file (C-x C-r)</CODE>
+<DD><A NAME="IDX145"></A>
+Read in the contents of the <VAR>inputrc</VAR> file, and incorporate
+any bindings or variable assignments found there.
+<P>
+
+<A NAME="IDX146"></A>
+<DT><CODE>abort (C-g)</CODE>
+<DD><A NAME="IDX147"></A>
+Abort the current editing command and
+ring the terminal's bell (subject to the setting of
+<CODE>bell-style</CODE>).
+<P>
+
+<A NAME="IDX148"></A>
+<DT><CODE>do-uppercase-version (M-a, M-b, M-<VAR>x</VAR>, <small>...</small>)</CODE>
+<DD><A NAME="IDX149"></A>
+If the metafied character <VAR>x</VAR> is lowercase, run the command
+that is bound to the corresponding uppercase character.
+<P>
+
+<A NAME="IDX150"></A>
+<DT><CODE>prefix-meta (<KBD>ESC</KBD>)</CODE>
+<DD><A NAME="IDX151"></A>
+Metafy the next character typed.  This is for keyboards
+without a meta key.  Typing <SAMP>`<KBD>ESC</KBD> f'</SAMP> is equivalent to typing
+<KBD>M-f</KBD>.
+<P>
+
+<A NAME="IDX152"></A>
+<DT><CODE>undo (C-_ or C-x C-u)</CODE>
+<DD><A NAME="IDX153"></A>
+Incremental undo, separately remembered for each line.
+<P>
+
+<A NAME="IDX154"></A>
+<DT><CODE>revert-line (M-r)</CODE>
+<DD><A NAME="IDX155"></A>
+Undo all changes made to this line.  This is like executing the <CODE>undo</CODE>
+command enough times to get back to the beginning.
+<P>
+
+<A NAME="IDX156"></A>
+<DT><CODE>tilde-expand (M-~)</CODE>
+<DD><A NAME="IDX157"></A>
+Perform tilde expansion on the current word.
+<P>
+
+<A NAME="IDX158"></A>
+<DT><CODE>set-mark (C-@)</CODE>
+<DD><A NAME="IDX159"></A>
+Set the mark to the point.  If a
+numeric argument is supplied, the mark is set to that position.
+<P>
+
+<A NAME="IDX160"></A>
+<DT><CODE>exchange-point-and-mark (C-x C-x)</CODE>
+<DD><A NAME="IDX161"></A>
+Swap the point with the mark.  The current cursor position is set to
+the saved position, and the old cursor position is saved as the mark.
+<P>
+
+<A NAME="IDX162"></A>
+<DT><CODE>character-search (C-])</CODE>
+<DD><A NAME="IDX163"></A>
+A character is read and point is moved to the next occurrence of that
+character.  A negative count searches for previous occurrences.
+<P>
+
+<A NAME="IDX164"></A>
+<DT><CODE>character-search-backward (M-C-])</CODE>
+<DD><A NAME="IDX165"></A>
+A character is read and point is moved to the previous occurrence
+of that character.  A negative count searches for subsequent
+occurrences.
+<P>
+
+<A NAME="IDX166"></A>
+<DT><CODE>insert-comment (M-#)</CODE>
+<DD><A NAME="IDX167"></A>
+Without a numeric argument, the value of the <CODE>comment-begin</CODE>
+variable is inserted at the beginning of the current line.
+If a numeric argument is supplied, this command acts as a toggle:  if
+the characters at the beginning of the line do not match the value
+of <CODE>comment-begin</CODE>, the value is inserted, otherwise
+the characters in <CODE>comment-begin</CODE> are deleted from the beginning of
+the line.
+In either case, the line is accepted as if a newline had been typed.
+<P>
+
+<A NAME="IDX168"></A>
+<DT><CODE>dump-functions ()</CODE>
+<DD><A NAME="IDX169"></A>
+Print all of the functions and their key bindings to the
+Readline output stream.  If a numeric argument is supplied,
+the output is formatted in such a way that it can be made part
+of an <VAR>inputrc</VAR> file.  This command is unbound by default.
+<P>
+
+<A NAME="IDX170"></A>
+<DT><CODE>dump-variables ()</CODE>
+<DD><A NAME="IDX171"></A>
+Print all of the settable variables and their values to the
+Readline output stream.  If a numeric argument is supplied,
+the output is formatted in such a way that it can be made part
+of an <VAR>inputrc</VAR> file.  This command is unbound by default.
+<P>
+
+<A NAME="IDX172"></A>
+<DT><CODE>dump-macros ()</CODE>
+<DD><A NAME="IDX173"></A>
+Print all of the Readline key sequences bound to macros and the
+strings they output.  If a numeric argument is supplied,
+the output is formatted in such a way that it can be made part
+of an <VAR>inputrc</VAR> file.  This command is unbound by default.
+<P>
+
+<A NAME="IDX174"></A>
+<DT><CODE>emacs-editing-mode (C-e)</CODE>
+<DD><A NAME="IDX175"></A>
+When in <CODE>vi</CODE> command mode, this causes a switch to <CODE>emacs</CODE>
+editing mode.
+<P>
+
+<A NAME="IDX176"></A>
+<DT><CODE>vi-editing-mode (M-C-j)</CODE>
+<DD><A NAME="IDX177"></A>
+When in <CODE>emacs</CODE> editing mode, this causes a switch to <CODE>vi</CODE>
+editing mode.
+<P>
+
+</DL>
+<P>
+
+<A NAME="Readline vi Mode"></A>
+<HR SIZE="6">
+<A NAME="SEC22"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC21"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC23"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[ &lt;&lt; ]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC1"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC23"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC52">Index</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H2> 1.5 Readline vi Mode </H2>
+<!--docid::SEC22::-->
+<P>
+
+While the Readline library does not have a full set of <CODE>vi</CODE>
+editing functions, it does contain enough to allow simple editing
+of the line.  The Readline <CODE>vi</CODE> mode behaves as specified in
+the POSIX 1003.2 standard.
+</P><P>
+
+In order to switch interactively between <CODE>emacs</CODE> and <CODE>vi</CODE>
+editing modes, use the command <KBD>M-C-j</KBD> (bound to emacs-editing-mode
+when in <CODE>vi</CODE> mode and to vi-editing-mode in <CODE>emacs</CODE> mode).
+The Readline default is <CODE>emacs</CODE> mode.
+</P><P>
+
+When you enter a line in <CODE>vi</CODE> mode, you are already placed in
+`insertion' mode, as if you had typed an <SAMP>`i'</SAMP>.  Pressing <KBD>ESC</KBD>
+switches you into `command' mode, where you can edit the text of the
+line with the standard <CODE>vi</CODE> movement keys, move to previous
+history lines with <SAMP>`k'</SAMP> and subsequent lines with <SAMP>`j'</SAMP>, and
+so forth.
+</P><P>
+
+This document describes the GNU Readline Library, a utility for aiding
+in the consistency of user interface across discrete programs that need
+to provide a command line interface.
+</P><P>
+
+Copyright (C) 1988-2006 Free Software Foundation, Inc.
+</P><P>
+
+Permission is granted to make and distribute verbatim copies of
+this manual provided the copyright notice and this permission notice
+pare preserved on all copies.
+</P><P>
+
+Permission is granted to copy and distribute modified versions of this
+manual under the conditions for verbatim copying, provided that the entire
+resulting derived work is distributed under the terms of a permission
+notice identical to this one.
+</P><P>
+
+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 Foundation.
+</P><P>
+
+<A NAME="Programming with GNU Readline"></A>
+<HR SIZE="6">
+<A NAME="SEC23"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC22"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC24"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[ &lt;&lt; ]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Top"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC49"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC52">Index</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H1> 2. Programming with GNU Readline </H1>
+<!--docid::SEC23::-->
+<P>
+
+This chapter describes the interface between the GNU Readline Library and
+other programs.  If you are a programmer, and you wish to include the
+features found in GNU Readline
+such as completion, line editing, and interactive history manipulation
+in your own programs, this section is for you.
+</P><P>
+
+<BLOCKQUOTE><TABLE BORDER=0 CELLSPACING=0> 
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="readline.html#SEC24">2.1 Basic Behavior</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Using the default behavior of Readline.</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="readline.html#SEC25">2.2 Custom Functions</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Adding your own functions to Readline.</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="readline.html#SEC28">2.3 Readline Variables</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Variables accessible to custom
+                                       functions.</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="readline.html#SEC29">2.4 Readline Convenience Functions</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Functions which Readline supplies to
+                                       aid in writing your own custom
+                                       functions.</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="readline.html#SEC43">2.5 Readline Signal Handling</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">How Readline behaves when it receives signals.</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="readline.html#SEC44">2.6 Custom Completers</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Supplanting or supplementing Readline's
+                       completion functions.</TD></TR>
+</TABLE></BLOCKQUOTE>
+<P>
+
+<A NAME="Basic Behavior"></A>
+<HR SIZE="6">
+<A NAME="SEC24"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC23"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC25"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[ &lt;&lt; ]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC23"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC49"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC52">Index</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H2> 2.1 Basic Behavior </H2>
+<!--docid::SEC24::-->
+<P>
+
+Many programs provide a command line interface, such as <CODE>mail</CODE>,
+<CODE>ftp</CODE>, and <CODE>sh</CODE>.  For such programs, the default behaviour of
+Readline is sufficient.  This section describes how to use Readline in
+the simplest way possible, perhaps to replace calls in your code to
+<CODE>gets()</CODE> or <CODE>fgets()</CODE>.
+</P><P>
+
+<A NAME="IDX178"></A>
+<A NAME="IDX179"></A>
+</P><P>
+
+The function <CODE>readline()</CODE> prints a prompt <VAR>prompt</VAR>
+and then reads and returns a single line of text from the user.
+If <VAR>prompt</VAR> is <CODE>NULL</CODE> or the empty string, no prompt is displayed.
+The line <CODE>readline</CODE> returns is allocated with <CODE>malloc()</CODE>;
+the caller should <CODE>free()</CODE> the line when it has finished with it.
+The declaration for <CODE>readline</CODE> in ANSI C is
+</P><P>
+
+<TABLE><tr><td>&nbsp;</td><td class=example><pre><CODE>char *readline (const char *<VAR>prompt</VAR>);</CODE>
+</pre></td></tr></table></P><P>
+
+So, one might say
+<TABLE><tr><td>&nbsp;</td><td class=example><pre><CODE>char *line = readline ("Enter a line: ");</CODE>
+</pre></td></tr></table>in order to read a line of text from the user.
+The line returned has the final newline removed, so only the
+text remains.
+</P><P>
+
+If <CODE>readline</CODE> encounters an <CODE>EOF</CODE> while reading the line, and the
+line is empty at that point, then <CODE>(char *)NULL</CODE> is returned.
+Otherwise, the line is ended just as if a newline had been typed.
+</P><P>
+
+If you want the user to be able to get at the line later, (with
+<KBD>C-p</KBD> for example), you must call <CODE>add_history()</CODE> to save the
+line away in a <EM>history</EM> list of such lines.
+</P><P>
+
+<TABLE><tr><td>&nbsp;</td><td class=example><pre><CODE>add_history (line)</CODE>;
+</pre></td></tr></table></P><P>
+
+For full details on the GNU History Library, see the associated manual.
+</P><P>
+
+It is preferable to avoid saving empty lines on the history list, since
+users rarely have a burning need to reuse a blank line.  Here is
+a function which usefully replaces the standard <CODE>gets()</CODE> library
+function, and has the advantage of no static buffer to overflow:
+</P><P>
+
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>/* A static variable for holding the line. */
+static char *line_read = (char *)NULL;
+
+/* Read a string, and return a pointer to it.
+   Returns NULL on EOF. */
+char *
+rl_gets ()
+{
+  /* If the buffer has already been allocated,
+     return the memory to the free pool. */
+  if (line_read)
+    {
+      free (line_read);
+      line_read = (char *)NULL;
+    }
+
+  /* Get a line from the user. */
+  line_read = readline ("");
+
+  /* If the line has any text in it,
+     save it on the history. */
+  if (line_read &#38;&#38; *line_read)
+    add_history (line_read);
+
+  return (line_read);
+}
+</pre></td></tr></table></P><P>
+
+This function gives the user the default behaviour of <KBD>TAB</KBD>
+completion: completion on file names.  If you do not want Readline to
+complete on filenames, you can change the binding of the <KBD>TAB</KBD> key
+with <CODE>rl_bind_key()</CODE>.
+</P><P>
+
+<TABLE><tr><td>&nbsp;</td><td class=example><pre><CODE>int rl_bind_key (int <VAR>key</VAR>, rl_command_func_t *<VAR>function</VAR>);</CODE>
+</pre></td></tr></table></P><P>
+
+<CODE>rl_bind_key()</CODE> takes two arguments: <VAR>key</VAR> is the character that
+you want to bind, and <VAR>function</VAR> is the address of the function to
+call when <VAR>key</VAR> is pressed.  Binding <KBD>TAB</KBD> to <CODE>rl_insert()</CODE>
+makes <KBD>TAB</KBD> insert itself.
+<CODE>rl_bind_key()</CODE> returns non-zero if <VAR>key</VAR> is not a valid
+ASCII character code (between 0 and 255).
+</P><P>
+
+Thus, to disable the default <KBD>TAB</KBD> behavior, the following suffices:
+<TABLE><tr><td>&nbsp;</td><td class=example><pre><CODE>rl_bind_key ('\t', rl_insert);</CODE>
+</pre></td></tr></table></P><P>
+
+This code should be executed once at the start of your program; you
+might write a function called <CODE>initialize_readline()</CODE> which
+performs this and other desired initializations, such as installing
+custom completers (see section <A HREF="readline.html#SEC44">2.6 Custom Completers</A>).
+</P><P>
+
+<A NAME="Custom Functions"></A>
+<HR SIZE="6">
+<A NAME="SEC25"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC24"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC26"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC28"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC23"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC28"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC52">Index</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H2> 2.2 Custom Functions </H2>
+<!--docid::SEC25::-->
+<P>
+
+Readline provides many functions for manipulating the text of
+the line, but it isn't possible to anticipate the needs of all
+programs.  This section describes the various functions and variables
+defined within the Readline library which allow a user program to add
+customized functionality to Readline.
+</P><P>
+
+Before declaring any functions that customize Readline's behavior, or
+using any functionality Readline provides in other code, an
+application writer should include the file <CODE>&#60;readline/readline.h&#62;</CODE>
+in any file that uses Readline's features.  Since some of the definitions
+in <CODE>readline.h</CODE> use the <CODE>stdio</CODE> library, the file
+<CODE>&#60;stdio.h&#62;</CODE> should be included before <CODE>readline.h</CODE>.
+</P><P>
+
+<CODE>readline.h</CODE> defines a C preprocessor variable that should
+be treated as an integer, <CODE>RL_READLINE_VERSION</CODE>, which may
+be used to conditionally compile application code depending on
+the installed Readline version.  The value is a hexadecimal
+encoding of the major and minor version numbers of the library,
+of the form 0x<VAR>MMmm</VAR>.  <VAR>MM</VAR> is the two-digit major
+version number; <VAR>mm</VAR> is the two-digit minor version number. 
+For Readline 4.2, for example, the value of
+<CODE>RL_READLINE_VERSION</CODE> would be <CODE>0x0402</CODE>. 
+</P><P>
+
+<BLOCKQUOTE><TABLE BORDER=0 CELLSPACING=0> 
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="readline.html#SEC26">2.2.1 Readline Typedefs</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">C declarations to make code readable.</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="readline.html#SEC27">2.2.2 Writing a New Function</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Variables and calling conventions.</TD></TR>
+</TABLE></BLOCKQUOTE>
+<P>
+
+<A NAME="Readline Typedefs"></A>
+<HR SIZE="6">
+<A NAME="SEC26"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC25"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC27"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC28"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC25"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC28"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC52">Index</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> 2.2.1 Readline Typedefs </H3>
+<!--docid::SEC26::-->
+<P>
+
+For readabilty, we declare a number of new object types, all pointers
+to functions.
+</P><P>
+
+The reason for declaring these new types is to make it easier to write
+code describing pointers to C functions with appropriately prototyped
+arguments and return values.
+</P><P>
+
+For instance, say we want to declare a variable <VAR>func</VAR> as a pointer
+to a function which takes two <CODE>int</CODE> arguments and returns an
+<CODE>int</CODE> (this is the type of all of the Readline bindable functions).
+Instead of the classic C declaration
+</P><P>
+
+<CODE>int (*func)();</CODE>
+</P><P>
+
+or the ANSI-C style declaration
+</P><P>
+
+<CODE>int (*func)(int, int);</CODE>
+</P><P>
+
+we may write
+</P><P>
+
+<CODE>rl_command_func_t *func;</CODE>
+</P><P>
+
+The full list of function pointer types available is
+</P><P>
+
+<DL COMPACT>
+<DT><CODE>typedef int rl_command_func_t (int, int);</CODE>
+<DD><P>
+
+<DT><CODE>typedef char *rl_compentry_func_t (const char *, int);</CODE>
+<DD><P>
+
+<DT><CODE>typedef char **rl_completion_func_t (const char *, int, int);</CODE>
+<DD><P>
+
+<DT><CODE>typedef char *rl_quote_func_t (char *, int, char *);</CODE>
+<DD><P>
+
+<DT><CODE>typedef char *rl_dequote_func_t (char *, int);</CODE>
+<DD><P>
+
+<DT><CODE>typedef int rl_compignore_func_t (char **);</CODE>
+<DD><P>
+
+<DT><CODE>typedef void rl_compdisp_func_t (char **, int, int);</CODE>
+<DD><P>
+
+<DT><CODE>typedef int rl_hook_func_t (void);</CODE>
+<DD><P>
+
+<DT><CODE>typedef int rl_getc_func_t (FILE *);</CODE>
+<DD><P>
+
+<DT><CODE>typedef int rl_linebuf_func_t (char *, int);</CODE>
+<DD><P>
+
+<DT><CODE>typedef int rl_intfunc_t (int);</CODE>
+<DD><DT><CODE>#define rl_ivoidfunc_t rl_hook_func_t</CODE>
+<DD><DT><CODE>typedef int rl_icpfunc_t (char *);</CODE>
+<DD><DT><CODE>typedef int rl_icppfunc_t (char **);</CODE>
+<DD><P>
+
+<DT><CODE>typedef void rl_voidfunc_t (void);</CODE>
+<DD><DT><CODE>typedef void rl_vintfunc_t (int);</CODE>
+<DD><DT><CODE>typedef void rl_vcpfunc_t (char *);</CODE>
+<DD><DT><CODE>typedef void rl_vcppfunc_t (char **);</CODE>
+<DD><P>
+
+</DL>
+<P>
+
+<A NAME="Function Writing"></A>
+<HR SIZE="6">
+<A NAME="SEC27"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC26"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC28"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC28"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC25"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC28"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC52">Index</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> 2.2.2 Writing a New Function </H3>
+<!--docid::SEC27::-->
+<P>
+
+In order to write new functions for Readline, you need to know the
+calling conventions for keyboard-invoked functions, and the names of the
+variables that describe the current state of the line read so far.
+</P><P>
+
+The calling sequence for a command <CODE>foo</CODE> looks like
+</P><P>
+
+<TABLE><tr><td>&nbsp;</td><td class=example><pre><CODE>int foo (int count, int key)</CODE>
+</pre></td></tr></table></P><P>
+
+where <VAR>count</VAR> is the numeric argument (or 1 if defaulted) and
+<VAR>key</VAR> is the key that invoked this function.
+</P><P>
+
+It is completely up to the function as to what should be done with the
+numeric argument.  Some functions use it as a repeat count, some
+as a flag, and others to choose alternate behavior (refreshing the current
+line as opposed to refreshing the screen, for example).  Some choose to
+ignore it.  In general, if a
+function uses the numeric argument as a repeat count, it should be able
+to do something useful with both negative and positive arguments.
+At the very least, it should be aware that it can be passed a
+negative argument.
+</P><P>
+
+A command function should return 0 if its action completes successfully,
+and a non-zero value if some error occurs.
+This is the convention obeyed by all of the builtin Readline bindable
+command functions.
+</P><P>
+
+<A NAME="Readline Variables"></A>
+<HR SIZE="6">
+<A NAME="SEC28"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC27"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC29"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC29"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC23"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC49"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC52">Index</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H2> 2.3 Readline Variables </H2>
+<!--docid::SEC28::-->
+<P>
+
+These variables are available to function writers.
+</P><P>
+
+<A NAME="IDX180"></A>
+<DL>
+<DT><U>Variable:</U> char * <B>rl_line_buffer</B>
+<DD>This is the line gathered so far.  You are welcome to modify the
+contents of the line, but see <A HREF="readline.html#SEC34">2.4.5 Allowing Undoing</A>.  The
+function <CODE>rl_extend_line_buffer</CODE> is available to increase
+the memory allocated to <CODE>rl_line_buffer</CODE>.
+</DL>
+</P><P>
+
+<A NAME="IDX181"></A>
+<DL>
+<DT><U>Variable:</U> int <B>rl_point</B>
+<DD>The offset of the current cursor position in <CODE>rl_line_buffer</CODE>
+(the <EM>point</EM>).
+</DL>
+</P><P>
+
+<A NAME="IDX182"></A>
+<DL>
+<DT><U>Variable:</U> int <B>rl_end</B>
+<DD>The number of characters present in <CODE>rl_line_buffer</CODE>.  When
+<CODE>rl_point</CODE> is at the end of the line, <CODE>rl_point</CODE> and
+<CODE>rl_end</CODE> are equal.
+</DL>
+</P><P>
+
+<A NAME="IDX183"></A>
+<DL>
+<DT><U>Variable:</U> int <B>rl_mark</B>
+<DD>The <VAR>mark</VAR> (saved position) in the current line.  If set, the mark
+and point define a <EM>region</EM>.
+</DL>
+</P><P>
+
+<A NAME="IDX184"></A>
+<DL>
+<DT><U>Variable:</U> int <B>rl_done</B>
+<DD>Setting this to a non-zero value causes Readline to return the current
+line immediately.
+</DL>
+</P><P>
+
+<A NAME="IDX185"></A>
+<DL>
+<DT><U>Variable:</U> int <B>rl_num_chars_to_read</B>
+<DD>Setting this to a positive value before calling <CODE>readline()</CODE> causes
+Readline to return after accepting that many characters, rather
+than reading up to a character bound to <CODE>accept-line</CODE>.
+</DL>
+</P><P>
+
+<A NAME="IDX186"></A>
+<DL>
+<DT><U>Variable:</U> int <B>rl_pending_input</B>
+<DD>Setting this to a value makes it the next keystroke read.  This is a
+way to stuff a single character into the input stream.
+</DL>
+</P><P>
+
+<A NAME="IDX187"></A>
+<DL>
+<DT><U>Variable:</U> int <B>rl_dispatching</B>
+<DD>Set to a non-zero value if a function is being called from a key binding;
+zero otherwise.  Application functions can test this to discover whether
+they were called directly or by Readline's dispatching mechanism.
+</DL>
+</P><P>
+
+<A NAME="IDX188"></A>
+<DL>
+<DT><U>Variable:</U> int <B>rl_erase_empty_line</B>
+<DD>Setting this to a non-zero value causes Readline to completely erase
+the current line, including any prompt, any time a newline is typed as
+the only character on an otherwise-empty line.  The cursor is moved to
+the beginning of the newly-blank line.
+</DL>
+</P><P>
+
+<A NAME="IDX189"></A>
+<DL>
+<DT><U>Variable:</U> char * <B>rl_prompt</B>
+<DD>The prompt Readline uses.  This is set from the argument to
+<CODE>readline()</CODE>, and should not be assigned to directly.
+The <CODE>rl_set_prompt()</CODE> function (see section <A HREF="readline.html#SEC35">2.4.6 Redisplay</A>) may
+be used to modify the prompt string after calling <CODE>readline()</CODE>.
+</DL>
+</P><P>
+
+<A NAME="IDX190"></A>
+<DL>
+<DT><U>Variable:</U> int <B>rl_already_prompted</B>
+<DD>If an application wishes to display the prompt itself, rather than have
+Readline do it the first time <CODE>readline()</CODE> is called, it should set
+this variable to a non-zero value after displaying the prompt.
+The prompt must also be passed as the argument to <CODE>readline()</CODE> so
+the redisplay functions can update the display properly.
+The calling application is responsible for managing the value; Readline
+never sets it.
+</DL>
+</P><P>
+
+<A NAME="IDX191"></A>
+<DL>
+<DT><U>Variable:</U> const char * <B>rl_library_version</B>
+<DD>The version number of this revision of the library.
+</DL>
+</P><P>
+
+<A NAME="IDX192"></A>
+<DL>
+<DT><U>Variable:</U> int <B>rl_readline_version</B>
+<DD>An integer encoding the current version of the library.  The encoding is
+of the form 0x<VAR>MMmm</VAR>, where <VAR>MM</VAR> is the two-digit major version
+number, and <VAR>mm</VAR> is the two-digit minor version number.
+For example, for Readline-4.2, <CODE>rl_readline_version</CODE> would have the
+value 0x0402.
+</DL>
+</P><P>
+
+<A NAME="IDX193"></A>
+<DL>
+<DT><U>Variable:</U> int <B>rl_gnu_readline_p</B>
+<DD>Always set to 1, denoting that this is GNU readline rather than some
+emulation.
+</DL>
+</P><P>
+
+<A NAME="IDX194"></A>
+<DL>
+<DT><U>Variable:</U> const char * <B>rl_terminal_name</B>
+<DD>The terminal type, used for initialization.  If not set by the application,
+Readline sets this to the value of the <CODE>TERM</CODE> environment variable
+the first time it is called.
+</DL>
+</P><P>
+
+<A NAME="IDX195"></A>
+<DL>
+<DT><U>Variable:</U> const char * <B>rl_readline_name</B>
+<DD>This variable is set to a unique name by each application using Readline.
+The value allows conditional parsing of the inputrc file
+(see section <A HREF="readline.html#SEC11">1.3.2 Conditional Init Constructs</A>).
+</DL>
+</P><P>
+
+<A NAME="IDX196"></A>
+<DL>
+<DT><U>Variable:</U> FILE * <B>rl_instream</B>
+<DD>The stdio stream from which Readline reads input.
+If <CODE>NULL</CODE>, Readline defaults to <VAR>stdin</VAR>.
+</DL>
+</P><P>
+
+<A NAME="IDX197"></A>
+<DL>
+<DT><U>Variable:</U> FILE * <B>rl_outstream</B>
+<DD>The stdio stream to which Readline performs output.
+If <CODE>NULL</CODE>, Readline defaults to <VAR>stdout</VAR>.
+</DL>
+</P><P>
+
+<A NAME="IDX198"></A>
+<DL>
+<DT><U>Variable:</U> int <B>rl_prefer_env_winsize</B>
+<DD>If non-zero, Readline gives values found in the <CODE>LINES</CODE> and
+<CODE>COLUMNS</CODE> environment variables greater precedence than values fetched
+from the kernel when computing the screen dimensions.
+</DL>
+</P><P>
+
+<A NAME="IDX199"></A>
+<DL>
+<DT><U>Variable:</U> rl_command_func_t * <B>rl_last_func</B>
+<DD>The address of the last command function Readline executed.  May be used to
+test whether or not a function is being executed twice in succession, for
+example.
+</DL>
+</P><P>
+
+<A NAME="IDX200"></A>
+<DL>
+<DT><U>Variable:</U> rl_hook_func_t * <B>rl_startup_hook</B>
+<DD>If non-zero, this is the address of a function to call just
+before <CODE>readline</CODE> prints the first prompt.
+</DL>
+</P><P>
+
+<A NAME="IDX201"></A>
+<DL>
+<DT><U>Variable:</U> rl_hook_func_t * <B>rl_pre_input_hook</B>
+<DD>If non-zero, this is the address of a function to call after
+the first prompt has been printed and just before <CODE>readline</CODE>
+starts reading input characters.
+</DL>
+</P><P>
+
+<A NAME="IDX202"></A>
+<DL>
+<DT><U>Variable:</U> rl_hook_func_t * <B>rl_event_hook</B>
+<DD>If non-zero, this is the address of a function to call periodically
+when Readline is waiting for terminal input.
+By default, this will be called at most ten times a second if there
+is no keyboard input.
+</DL>
+</P><P>
+
+<A NAME="IDX203"></A>
+<DL>
+<DT><U>Variable:</U> rl_getc_func_t * <B>rl_getc_function</B>
+<DD>If non-zero, Readline will call indirectly through this pointer
+to get a character from the input stream.  By default, it is set to
+<CODE>rl_getc</CODE>, the default Readline character input function
+(see section <A HREF="readline.html#SEC37">2.4.8 Character Input</A>).
+</DL>
+</P><P>
+
+<A NAME="IDX204"></A>
+<DL>
+<DT><U>Variable:</U> rl_voidfunc_t * <B>rl_redisplay_function</B>
+<DD>If non-zero, Readline will call indirectly through this pointer
+to update the display with the current contents of the editing buffer.
+By default, it is set to <CODE>rl_redisplay</CODE>, the default Readline
+redisplay function (see section <A HREF="readline.html#SEC35">2.4.6 Redisplay</A>).
+</DL>
+</P><P>
+
+<A NAME="IDX205"></A>
+<DL>
+<DT><U>Variable:</U> rl_vintfunc_t * <B>rl_prep_term_function</B>
+<DD>If non-zero, Readline will call indirectly through this pointer
+to initialize the terminal.  The function takes a single argument, an
+<CODE>int</CODE> flag that says whether or not to use eight-bit characters.
+By default, this is set to <CODE>rl_prep_terminal</CODE>
+(see section <A HREF="readline.html#SEC38">2.4.9 Terminal Management</A>).
+</DL>
+</P><P>
+
+<A NAME="IDX206"></A>
+<DL>
+<DT><U>Variable:</U> rl_voidfunc_t * <B>rl_deprep_term_function</B>
+<DD>If non-zero, Readline will call indirectly through this pointer
+to reset the terminal.  This function should undo the effects of
+<CODE>rl_prep_term_function</CODE>.
+By default, this is set to <CODE>rl_deprep_terminal</CODE>
+(see section <A HREF="readline.html#SEC38">2.4.9 Terminal Management</A>).
+</DL>
+</P><P>
+
+<A NAME="IDX207"></A>
+<DL>
+<DT><U>Variable:</U> Keymap <B>rl_executing_keymap</B>
+<DD>This variable is set to the keymap (see section <A HREF="readline.html#SEC31">2.4.2 Selecting a Keymap</A>) in which the
+currently executing readline function was found.
+</DL>
+</P><P>
+
+<A NAME="IDX208"></A>
+<DL>
+<DT><U>Variable:</U> Keymap <B>rl_binding_keymap</B>
+<DD>This variable is set to the keymap (see section <A HREF="readline.html#SEC31">2.4.2 Selecting a Keymap</A>) in which the
+last key binding occurred.
+</DL>
+</P><P>
+
+<A NAME="IDX209"></A>
+<DL>
+<DT><U>Variable:</U> char * <B>rl_executing_macro</B>
+<DD>This variable is set to the text of any currently-executing macro.
+</DL>
+</P><P>
+
+<A NAME="IDX210"></A>
+<DL>
+<DT><U>Variable:</U> int <B>rl_readline_state</B>
+<DD>A variable with bit values that encapsulate the current Readline state.
+A bit is set with the <CODE>RL_SETSTATE</CODE> macro, and unset with the
+<CODE>RL_UNSETSTATE</CODE> macro.  Use the <CODE>RL_ISSTATE</CODE> macro to test
+whether a particular state bit is set.  Current state bits include:
+</P><P>
+
+<DL COMPACT>
+<DT><CODE>RL_STATE_NONE</CODE>
+<DD>Readline has not yet been called, nor has it begun to intialize.
+<DT><CODE>RL_STATE_INITIALIZING</CODE>
+<DD>Readline is initializing its internal data structures.
+<DT><CODE>RL_STATE_INITIALIZED</CODE>
+<DD>Readline has completed its initialization.
+<DT><CODE>RL_STATE_TERMPREPPED</CODE>
+<DD>Readline has modified the terminal modes to do its own input and redisplay.
+<DT><CODE>RL_STATE_READCMD</CODE>
+<DD>Readline is reading a command from the keyboard.
+<DT><CODE>RL_STATE_METANEXT</CODE>
+<DD>Readline is reading more input after reading the meta-prefix character.
+<DT><CODE>RL_STATE_DISPATCHING</CODE>
+<DD>Readline is dispatching to a command.
+<DT><CODE>RL_STATE_MOREINPUT</CODE>
+<DD>Readline is reading more input while executing an editing command.
+<DT><CODE>RL_STATE_ISEARCH</CODE>
+<DD>Readline is performing an incremental history search.
+<DT><CODE>RL_STATE_NSEARCH</CODE>
+<DD>Readline is performing a non-incremental history search.
+<DT><CODE>RL_STATE_SEARCH</CODE>
+<DD>Readline is searching backward or forward through the history for a string.
+<DT><CODE>RL_STATE_NUMERICARG</CODE>
+<DD>Readline is reading a numeric argument.
+<DT><CODE>RL_STATE_MACROINPUT</CODE>
+<DD>Readline is currently getting its input from a previously-defined keyboard
+macro.
+<DT><CODE>RL_STATE_MACRODEF</CODE>
+<DD>Readline is currently reading characters defining a keyboard macro.
+<DT><CODE>RL_STATE_OVERWRITE</CODE>
+<DD>Readline is in overwrite mode.
+<DT><CODE>RL_STATE_COMPLETING</CODE>
+<DD>Readline is performing word completion.
+<DT><CODE>RL_STATE_SIGHANDLER</CODE>
+<DD>Readline is currently executing the readline signal handler.
+<DT><CODE>RL_STATE_UNDOING</CODE>
+<DD>Readline is performing an undo.
+<DT><CODE>RL_STATE_DONE</CODE>
+<DD>Readline has read a key sequence bound to <CODE>accept-line</CODE>
+and is about to return the line to the caller.
+</DL>
+<P>
+
+</DL>
+</P><P>
+
+<A NAME="IDX211"></A>
+<DL>
+<DT><U>Variable:</U> int <B>rl_explicit_arg</B>
+<DD>Set to a non-zero value if an explicit numeric argument was specified by
+the user.  Only valid in a bindable command function.
+</DL>
+</P><P>
+
+<A NAME="IDX212"></A>
+<DL>
+<DT><U>Variable:</U> int <B>rl_numeric_arg</B>
+<DD>Set to the value of any numeric argument explicitly specified by the user
+before executing the current Readline function.  Only valid in a bindable
+command function.
+</DL>
+</P><P>
+
+<A NAME="IDX213"></A>
+<DL>
+<DT><U>Variable:</U> int <B>rl_editing_mode</B>
+<DD>Set to a value denoting Readline's current editing mode.  A value of
+<VAR>1</VAR> means Readline is currently in emacs mode; <VAR>0</VAR>
+means that vi mode is active.
+</DL>
+</P><P>
+
+<A NAME="Readline Convenience Functions"></A>
+<HR SIZE="6">
+<A NAME="SEC29"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC28"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC30"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC43"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC23"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC43"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC52">Index</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H2> 2.4 Readline Convenience Functions </H2>
+<!--docid::SEC29::-->
+<P>
+
+<BLOCKQUOTE><TABLE BORDER=0 CELLSPACING=0> 
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="readline.html#SEC30">2.4.1 Naming a Function</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">How to give a function you write a name.</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="readline.html#SEC31">2.4.2 Selecting a Keymap</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Making keymaps.</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="readline.html#SEC32">2.4.3 Binding Keys</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Changing Keymaps.</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="readline.html#SEC33">2.4.4 Associating Function Names and Bindings</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Translate function names to
+                                               key sequences.</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="readline.html#SEC34">2.4.5 Allowing Undoing</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">How to make your functions undoable.</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="readline.html#SEC35">2.4.6 Redisplay</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Functions to control line display.</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="readline.html#SEC36">2.4.7 Modifying Text</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Functions to modify <CODE>rl_line_buffer</CODE>.</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="readline.html#SEC37">2.4.8 Character Input</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Functions to read keyboard input.</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="readline.html#SEC38">2.4.9 Terminal Management</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Functions to manage terminal settings.</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="readline.html#SEC39">2.4.10 Utility Functions</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Generally useful functions and hooks.</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="readline.html#SEC40">2.4.11 Miscellaneous Functions</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Functions that don't fall into any category.</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="readline.html#SEC41">2.4.12 Alternate Interface</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Using Readline in a `callback' fashion.</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="readline.html#SEC42">2.4.13 A Readline Example</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">An example Readline function.</TD></TR>
+</TABLE></BLOCKQUOTE>
+<P>
+
+<A NAME="Function Naming"></A>
+<HR SIZE="6">
+<A NAME="SEC30"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC29"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC31"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC43"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC29"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC43"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC52">Index</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> 2.4.1 Naming a Function </H3>
+<!--docid::SEC30::-->
+<P>
+
+The user can dynamically change the bindings of keys while using
+Readline.  This is done by representing the function with a descriptive
+name.  The user is able to type the descriptive name when referring to
+the function.  Thus, in an init file, one might find
+</P><P>
+
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>Meta-Rubout:  backward-kill-word
+</pre></td></tr></table></P><P>
+
+This binds the keystroke <KBD>Meta-Rubout</KBD> to the function
+<EM>descriptively</EM> named <CODE>backward-kill-word</CODE>.  You, as the
+programmer, should bind the functions you write to descriptive names as
+well.  Readline provides a function for doing that:
+</P><P>
+
+<A NAME="IDX214"></A>
+<DL>
+<DT><U>Function:</U> int <B>rl_add_defun</B> <I>(const char *name, rl_command_func_t *function, int key)</I>
+<DD>Add <VAR>name</VAR> to the list of named functions.  Make <VAR>function</VAR> be
+the function that gets called.  If <VAR>key</VAR> is not -1, then bind it to
+<VAR>function</VAR> using <CODE>rl_bind_key()</CODE>.
+</DL>
+</P><P>
+
+Using this function alone is sufficient for most applications.
+It is the recommended way to add a few functions to the default
+functions that Readline has built in.
+If you need to do something other than adding a function to Readline,
+you may need to use the underlying functions described below.
+</P><P>
+
+<A NAME="Keymaps"></A>
+<HR SIZE="6">
+<A NAME="SEC31"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC30"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC32"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC32"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC29"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC43"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC52">Index</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> 2.4.2 Selecting a Keymap </H3>
+<!--docid::SEC31::-->
+<P>
+
+Key bindings take place on a <EM>keymap</EM>.  The keymap is the
+association between the keys that the user types and the functions that
+get run.  You can make your own keymaps, copy existing keymaps, and tell
+Readline which keymap to use.
+</P><P>
+
+<A NAME="IDX215"></A>
+<DL>
+<DT><U>Function:</U> Keymap <B>rl_make_bare_keymap</B> <I>(void)</I>
+<DD>Returns a new, empty keymap.  The space for the keymap is allocated with
+<CODE>malloc()</CODE>; the caller should free it by calling
+<CODE>rl_discard_keymap()</CODE> when done.
+</DL>
+</P><P>
+
+<A NAME="IDX216"></A>
+<DL>
+<DT><U>Function:</U> Keymap <B>rl_copy_keymap</B> <I>(Keymap map)</I>
+<DD>Return a new keymap which is a copy of <VAR>map</VAR>.
+</DL>
+</P><P>
+
+<A NAME="IDX217"></A>
+<DL>
+<DT><U>Function:</U> Keymap <B>rl_make_keymap</B> <I>(void)</I>
+<DD>Return a new keymap with the printing characters bound to rl_insert,
+the lowercase Meta characters bound to run their equivalents, and
+the Meta digits bound to produce numeric arguments.
+</DL>
+</P><P>
+
+<A NAME="IDX218"></A>
+<DL>
+<DT><U>Function:</U> void <B>rl_discard_keymap</B> <I>(Keymap keymap)</I>
+<DD>Free the storage associated with <VAR>keymap</VAR>.
+</DL>
+</P><P>
+
+Readline has several internal keymaps.  These functions allow you to
+change which keymap is active.
+</P><P>
+
+<A NAME="IDX219"></A>
+<DL>
+<DT><U>Function:</U> Keymap <B>rl_get_keymap</B> <I>(void)</I>
+<DD>Returns the currently active keymap.
+</DL>
+</P><P>
+
+<A NAME="IDX220"></A>
+<DL>
+<DT><U>Function:</U> void <B>rl_set_keymap</B> <I>(Keymap keymap)</I>
+<DD>Makes <VAR>keymap</VAR> the currently active keymap.
+</DL>
+</P><P>
+
+<A NAME="IDX221"></A>
+<DL>
+<DT><U>Function:</U> Keymap <B>rl_get_keymap_by_name</B> <I>(const char *name)</I>
+<DD>Return the keymap matching <VAR>name</VAR>.  <VAR>name</VAR> is one which would
+be supplied in a <CODE>set keymap</CODE> inputrc line (see section <A HREF="readline.html#SEC9">1.3 Readline Init File</A>).
+</DL>
+</P><P>
+
+<A NAME="IDX222"></A>
+<DL>
+<DT><U>Function:</U> char * <B>rl_get_keymap_name</B> <I>(Keymap keymap)</I>
+<DD>Return the name matching <VAR>keymap</VAR>.  <VAR>name</VAR> is one which would
+be supplied in a <CODE>set keymap</CODE> inputrc line (see section <A HREF="readline.html#SEC9">1.3 Readline Init File</A>).
+</DL>
+</P><P>
+
+<A NAME="Binding Keys"></A>
+<HR SIZE="6">
+<A NAME="SEC32"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC31"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC33"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC33"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC29"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC43"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC52">Index</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> 2.4.3 Binding Keys </H3>
+<!--docid::SEC32::-->
+<P>
+
+Key sequences are associate with functions through the keymap.
+Readline has several internal keymaps: <CODE>emacs_standard_keymap</CODE>,
+<CODE>emacs_meta_keymap</CODE>, <CODE>emacs_ctlx_keymap</CODE>,
+<CODE>vi_movement_keymap</CODE>, and <CODE>vi_insertion_keymap</CODE>.
+<CODE>emacs_standard_keymap</CODE> is the default, and the examples in
+this manual assume that.
+</P><P>
+
+Since <CODE>readline()</CODE> installs a set of default key bindings the first
+time it is called, there is always the danger that a custom binding
+installed before the first call to <CODE>readline()</CODE> will be overridden.
+An alternate mechanism is to install custom key bindings in an
+initialization function assigned to the <CODE>rl_startup_hook</CODE> variable
+(see section <A HREF="readline.html#SEC28">2.3 Readline Variables</A>).
+</P><P>
+
+These functions manage key bindings.
+</P><P>
+
+<A NAME="IDX223"></A>
+<DL>
+<DT><U>Function:</U> int <B>rl_bind_key</B> <I>(int key, rl_command_func_t *function)</I>
+<DD>Binds <VAR>key</VAR> to <VAR>function</VAR> in the currently active keymap.
+Returns non-zero in the case of an invalid <VAR>key</VAR>.
+</DL>
+</P><P>
+
+<A NAME="IDX224"></A>
+<DL>
+<DT><U>Function:</U> int <B>rl_bind_key_in_map</B> <I>(int key, rl_command_func_t *function, Keymap map)</I>
+<DD>Bind <VAR>key</VAR> to <VAR>function</VAR> in <VAR>map</VAR>.
+Returns non-zero in the case of an invalid <VAR>key</VAR>.
+</DL>
+</P><P>
+
+<A NAME="IDX225"></A>
+<DL>
+<DT><U>Function:</U> int <B>rl_bind_key_if_unbound</B> <I>(int key, rl_command_func_t *function)</I>
+<DD>Binds <VAR>key</VAR> to <VAR>function</VAR> if it is not already bound in the
+currently active keymap.
+Returns non-zero in the case of an invalid <VAR>key</VAR> or if <VAR>key</VAR> is
+already bound.
+</DL>
+</P><P>
+
+<A NAME="IDX226"></A>
+<DL>
+<DT><U>Function:</U> int <B>rl_bind_key_if_unbound_in_map</B> <I>(int key, rl_command_func_t *function, Keymap map)</I>
+<DD>Binds <VAR>key</VAR> to <VAR>function</VAR> if it is not already bound in <VAR>map</VAR>.
+Returns non-zero in the case of an invalid <VAR>key</VAR> or if <VAR>key</VAR> is
+already bound.
+</DL>
+</P><P>
+
+<A NAME="IDX227"></A>
+<DL>
+<DT><U>Function:</U> int <B>rl_unbind_key</B> <I>(int key)</I>
+<DD>Bind <VAR>key</VAR> to the null function in the currently active keymap.
+Returns non-zero in case of error.
+</DL>
+</P><P>
+
+<A NAME="IDX228"></A>
+<DL>
+<DT><U>Function:</U> int <B>rl_unbind_key_in_map</B> <I>(int key, Keymap map)</I>
+<DD>Bind <VAR>key</VAR> to the null function in <VAR>map</VAR>.
+Returns non-zero in case of error.
+</DL>
+</P><P>
+
+<A NAME="IDX229"></A>
+<DL>
+<DT><U>Function:</U> int <B>rl_unbind_function_in_map</B> <I>(rl_command_func_t *function, Keymap map)</I>
+<DD>Unbind all keys that execute <VAR>function</VAR> in <VAR>map</VAR>.
+</DL>
+</P><P>
+
+<A NAME="IDX230"></A>
+<DL>
+<DT><U>Function:</U> int <B>rl_unbind_command_in_map</B> <I>(const char *command, Keymap map)</I>
+<DD>Unbind all keys that are bound to <VAR>command</VAR> in <VAR>map</VAR>.
+</DL>
+</P><P>
+
+<A NAME="IDX231"></A>
+<DL>
+<DT><U>Function:</U> int <B>rl_bind_keyseq</B> <I>(const char *keyseq, rl_command_func_t *function)</I>
+<DD>Bind the key sequence represented by the string <VAR>keyseq</VAR> to the function
+<VAR>function</VAR>, beginning in the current keymap.
+This makes new keymaps as necessary.
+The return value is non-zero if <VAR>keyseq</VAR> is invalid.
+</DL>
+</P><P>
+
+<A NAME="IDX232"></A>
+<DL>
+<DT><U>Function:</U> int <B>rl_bind_keyseq_in_map</B> <I>(const char *keyseq, rl_command_func_t *function, Keymap map)</I>
+<DD>Bind the key sequence represented by the string <VAR>keyseq</VAR> to the function
+<VAR>function</VAR>.  This makes new keymaps as necessary.
+Initial bindings are performed in <VAR>map</VAR>.
+The return value is non-zero if <VAR>keyseq</VAR> is invalid.
+</DL>
+</P><P>
+
+<A NAME="IDX233"></A>
+<DL>
+<DT><U>Function:</U> int <B>rl_set_key</B> <I>(const char *keyseq, rl_command_func_t *function, Keymap map)</I>
+<DD>Equivalent to <CODE>rl_bind_keyseq_in_map</CODE>.
+</DL>
+</P><P>
+
+<A NAME="IDX234"></A>
+<DL>
+<DT><U>Function:</U> int <B>rl_bind_keyseq_if_unbound</B> <I>(const char *keyseq, rl_command_func_t *function)</I>
+<DD>Binds <VAR>keyseq</VAR> to <VAR>function</VAR> if it is not already bound in the
+currently active keymap.
+Returns non-zero in the case of an invalid <VAR>keyseq</VAR> or if <VAR>keyseq</VAR> is
+already bound.
+</DL>
+</P><P>
+
+<A NAME="IDX235"></A>
+<DL>
+<DT><U>Function:</U> int <B>rl_bind_keyseq_if_unbound_in_map</B> <I>(const char *keyseq, rl_command_func_t *function, Keymap map)</I>
+<DD>Binds <VAR>keyseq</VAR> to <VAR>function</VAR> if it is not already bound in <VAR>map</VAR>.
+Returns non-zero in the case of an invalid <VAR>keyseq</VAR> or if <VAR>keyseq</VAR> is
+already bound.
+</DL>
+</P><P>
+
+<A NAME="IDX236"></A>
+<DL>
+<DT><U>Function:</U> int <B>rl_generic_bind</B> <I>(int type, const char *keyseq, char *data, Keymap map)</I>
+<DD>Bind the key sequence represented by the string <VAR>keyseq</VAR> to the arbitrary
+pointer <VAR>data</VAR>.  <VAR>type</VAR> says what kind of data is pointed to by
+<VAR>data</VAR>; this can be a function (<CODE>ISFUNC</CODE>), a macro
+(<CODE>ISMACR</CODE>), or a keymap (<CODE>ISKMAP</CODE>).  This makes new keymaps as
+necessary.  The initial keymap in which to do bindings is <VAR>map</VAR>.
+</DL>
+</P><P>
+
+<A NAME="IDX237"></A>
+<DL>
+<DT><U>Function:</U> int <B>rl_parse_and_bind</B> <I>(char *line)</I>
+<DD>Parse <VAR>line</VAR> as if it had been read from the <CODE>inputrc</CODE> file and
+perform any key bindings and variable assignments found
+(see section <A HREF="readline.html#SEC9">1.3 Readline Init File</A>).
+</DL>
+</P><P>
+
+<A NAME="IDX238"></A>
+<DL>
+<DT><U>Function:</U> int <B>rl_read_init_file</B> <I>(const char *filename)</I>
+<DD>Read keybindings and variable assignments from <VAR>filename</VAR>
+(see section <A HREF="readline.html#SEC9">1.3 Readline Init File</A>).
+</DL>
+</P><P>
+
+<A NAME="Associating Function Names and Bindings"></A>
+<HR SIZE="6">
+<A NAME="SEC33"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC32"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC34"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC34"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC29"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC43"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC52">Index</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> 2.4.4 Associating Function Names and Bindings </H3>
+<!--docid::SEC33::-->
+<P>
+
+These functions allow you to find out what keys invoke named functions
+and the functions invoked by a particular key sequence.  You may also
+associate a new function name with an arbitrary function.
+</P><P>
+
+<A NAME="IDX239"></A>
+<DL>
+<DT><U>Function:</U> rl_command_func_t * <B>rl_named_function</B> <I>(const char *name)</I>
+<DD>Return the function with name <VAR>name</VAR>.
+</DL>
+</P><P>
+
+<A NAME="IDX240"></A>
+<DL>
+<DT><U>Function:</U> rl_command_func_t * <B>rl_function_of_keyseq</B> <I>(const char *keyseq, Keymap map, int *type)</I>
+<DD>Return the function invoked by <VAR>keyseq</VAR> in keymap <VAR>map</VAR>.
+If <VAR>map</VAR> is <CODE>NULL</CODE>, the current keymap is used.  If <VAR>type</VAR> is
+not <CODE>NULL</CODE>, the type of the object is returned in the <CODE>int</CODE> variable
+it points to (one of <CODE>ISFUNC</CODE>, <CODE>ISKMAP</CODE>, or <CODE>ISMACR</CODE>).
+</DL>
+</P><P>
+
+<A NAME="IDX241"></A>
+<DL>
+<DT><U>Function:</U> char ** <B>rl_invoking_keyseqs</B> <I>(rl_command_func_t *function)</I>
+<DD>Return an array of strings representing the key sequences used to
+invoke <VAR>function</VAR> in the current keymap.
+</DL>
+</P><P>
+
+<A NAME="IDX242"></A>
+<DL>
+<DT><U>Function:</U> char ** <B>rl_invoking_keyseqs_in_map</B> <I>(rl_command_func_t *function, Keymap map)</I>
+<DD>Return an array of strings representing the key sequences used to
+invoke <VAR>function</VAR> in the keymap <VAR>map</VAR>.
+</DL>
+</P><P>
+
+<A NAME="IDX243"></A>
+<DL>
+<DT><U>Function:</U> void <B>rl_function_dumper</B> <I>(int readable)</I>
+<DD>Print the readline function names and the key sequences currently
+bound to them to <CODE>rl_outstream</CODE>.  If <VAR>readable</VAR> is non-zero,
+the list is formatted in such a way that it can be made part of an
+<CODE>inputrc</CODE> file and re-read.
+</DL>
+</P><P>
+
+<A NAME="IDX244"></A>
+<DL>
+<DT><U>Function:</U> void <B>rl_list_funmap_names</B> <I>(void)</I>
+<DD>Print the names of all bindable Readline functions to <CODE>rl_outstream</CODE>.
+</DL>
+</P><P>
+
+<A NAME="IDX245"></A>
+<DL>
+<DT><U>Function:</U> const char ** <B>rl_funmap_names</B> <I>(void)</I>
+<DD>Return a NULL terminated array of known function names.  The array is
+sorted.  The array itself is allocated, but not the strings inside.  You
+should <CODE>free()</CODE> the array when you are done, but not the pointers.
+</DL>
+</P><P>
+
+<A NAME="IDX246"></A>
+<DL>
+<DT><U>Function:</U> int <B>rl_add_funmap_entry</B> <I>(const char *name, rl_command_func_t *function)</I>
+<DD>Add <VAR>name</VAR> to the list of bindable Readline command names, and make
+<VAR>function</VAR> the function to be called when <VAR>name</VAR> is invoked.
+</DL>
+</P><P>
+
+<A NAME="Allowing Undoing"></A>
+<HR SIZE="6">
+<A NAME="SEC34"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC33"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC35"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC35"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC29"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC43"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC52">Index</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> 2.4.5 Allowing Undoing </H3>
+<!--docid::SEC34::-->
+<P>
+
+Supporting the undo command is a painless thing, and makes your
+functions much more useful.  It is certainly easy to try
+something if you know you can undo it.
+</P><P>
+
+If your function simply inserts text once, or deletes text once, and
+uses <CODE>rl_insert_text()</CODE> or <CODE>rl_delete_text()</CODE> to do it, then
+undoing is already done for you automatically.
+</P><P>
+
+If you do multiple insertions or multiple deletions, or any combination
+of these operations, you should group them together into one operation.
+This is done with <CODE>rl_begin_undo_group()</CODE> and
+<CODE>rl_end_undo_group()</CODE>.
+</P><P>
+
+The types of events that can be undone are:
+</P><P>
+
+<TABLE><tr><td>&nbsp;</td><td class=smallexample><FONT SIZE=-1><pre>enum undo_code { UNDO_DELETE, UNDO_INSERT, UNDO_BEGIN, UNDO_END }; 
+</FONT></pre></td></tr></table></P><P>
+
+Notice that <CODE>UNDO_DELETE</CODE> means to insert some text, and
+<CODE>UNDO_INSERT</CODE> means to delete some text.  That is, the undo code
+tells what to undo, not how to undo it.  <CODE>UNDO_BEGIN</CODE> and
+<CODE>UNDO_END</CODE> are tags added by <CODE>rl_begin_undo_group()</CODE> and
+<CODE>rl_end_undo_group()</CODE>.
+</P><P>
+
+<A NAME="IDX247"></A>
+<DL>
+<DT><U>Function:</U> int <B>rl_begin_undo_group</B> <I>(void)</I>
+<DD>Begins saving undo information in a group construct.  The undo
+information usually comes from calls to <CODE>rl_insert_text()</CODE> and
+<CODE>rl_delete_text()</CODE>, but could be the result of calls to
+<CODE>rl_add_undo()</CODE>.
+</DL>
+</P><P>
+
+<A NAME="IDX248"></A>
+<DL>
+<DT><U>Function:</U> int <B>rl_end_undo_group</B> <I>(void)</I>
+<DD>Closes the current undo group started with <CODE>rl_begin_undo_group
+()</CODE>.  There should be one call to <CODE>rl_end_undo_group()</CODE>
+for each call to <CODE>rl_begin_undo_group()</CODE>.
+</DL>
+</P><P>
+
+<A NAME="IDX249"></A>
+<DL>
+<DT><U>Function:</U> void <B>rl_add_undo</B> <I>(enum undo_code what, int start, int end, char *text)</I>
+<DD>Remember how to undo an event (according to <VAR>what</VAR>).  The affected
+text runs from <VAR>start</VAR> to <VAR>end</VAR>, and encompasses <VAR>text</VAR>.
+</DL>
+</P><P>
+
+<A NAME="IDX250"></A>
+<DL>
+<DT><U>Function:</U> void <B>rl_free_undo_list</B> <I>(void)</I>
+<DD>Free the existing undo list.
+</DL>
+</P><P>
+
+<A NAME="IDX251"></A>
+<DL>
+<DT><U>Function:</U> int <B>rl_do_undo</B> <I>(void)</I>
+<DD>Undo the first thing on the undo list.  Returns <CODE>0</CODE> if there was
+nothing to undo, non-zero if something was undone.
+</DL>
+</P><P>
+
+Finally, if you neither insert nor delete text, but directly modify the
+existing text (e.g., change its case), call <CODE>rl_modifying()</CODE>
+once, just before you modify the text.  You must supply the indices of
+the text range that you are going to modify.
+</P><P>
+
+<A NAME="IDX252"></A>
+<DL>
+<DT><U>Function:</U> int <B>rl_modifying</B> <I>(int start, int end)</I>
+<DD>Tell Readline to save the text between <VAR>start</VAR> and <VAR>end</VAR> as a
+single undo unit.  It is assumed that you will subsequently modify
+that text.
+</DL>
+</P><P>
+
+<A NAME="Redisplay"></A>
+<HR SIZE="6">
+<A NAME="SEC35"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC34"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC36"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC36"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC29"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC43"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC52">Index</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> 2.4.6 Redisplay </H3>
+<!--docid::SEC35::-->
+<P>
+
+<A NAME="IDX253"></A>
+<DL>
+<DT><U>Function:</U> void <B>rl_redisplay</B> <I>(void)</I>
+<DD>Change what's displayed on the screen to reflect the current contents
+of <CODE>rl_line_buffer</CODE>.
+</DL>
+</P><P>
+
+<A NAME="IDX254"></A>
+<DL>
+<DT><U>Function:</U> int <B>rl_forced_update_display</B> <I>(void)</I>
+<DD>Force the line to be updated and redisplayed, whether or not
+Readline thinks the screen display is correct.
+</DL>
+</P><P>
+
+<A NAME="IDX255"></A>
+<DL>
+<DT><U>Function:</U> int <B>rl_on_new_line</B> <I>(void)</I>
+<DD>Tell the update functions that we have moved onto a new (empty) line,
+usually after ouputting a newline.
+</DL>
+</P><P>
+
+<A NAME="IDX256"></A>
+<DL>
+<DT><U>Function:</U> int <B>rl_on_new_line_with_prompt</B> <I>(void)</I>
+<DD>Tell the update functions that we have moved onto a new line, with
+<VAR>rl_prompt</VAR> already displayed.
+This could be used by applications that want to output the prompt string
+themselves, but still need Readline to know the prompt string length for
+redisplay.
+It should be used after setting <VAR>rl_already_prompted</VAR>.
+</DL>
+</P><P>
+
+<A NAME="IDX257"></A>
+<DL>
+<DT><U>Function:</U> int <B>rl_reset_line_state</B> <I>(void)</I>
+<DD>Reset the display state to a clean state and redisplay the current line
+starting on a new line.
+</DL>
+</P><P>
+
+<A NAME="IDX258"></A>
+<DL>
+<DT><U>Function:</U> int <B>rl_crlf</B> <I>(void)</I>
+<DD>Move the cursor to the start of the next screen line.
+</DL>
+</P><P>
+
+<A NAME="IDX259"></A>
+<DL>
+<DT><U>Function:</U> int <B>rl_show_char</B> <I>(int c)</I>
+<DD>Display character <VAR>c</VAR> on <CODE>rl_outstream</CODE>.
+If Readline has not been set to display meta characters directly, this
+will convert meta characters to a meta-prefixed key sequence.
+This is intended for use by applications which wish to do their own
+redisplay.
+</DL>
+</P><P>
+
+<A NAME="IDX260"></A>
+<DL>
+<DT><U>Function:</U> int <B>rl_message</B> <I>(const char *, <small>...</small>)</I>
+<DD>The arguments are a format string as would be supplied to <CODE>printf</CODE>,
+possibly containing conversion specifications such as <SAMP>`%d'</SAMP>, and
+any additional arguments necessary to satisfy the conversion specifications.
+The resulting string is displayed in the <EM>echo area</EM>.  The echo area
+is also used to display numeric arguments and search strings.
+You should call <CODE>rl_save_prompt</CODE> to save the prompt information
+before calling this function.
+</DL>
+</P><P>
+
+<A NAME="IDX261"></A>
+<DL>
+<DT><U>Function:</U> int <B>rl_clear_message</B> <I>(void)</I>
+<DD>Clear the message in the echo area.  If the prompt was saved with a call to
+<CODE>rl_save_prompt</CODE> before the last call to <CODE>rl_message</CODE>,
+call <CODE>rl_restore_prompt</CODE> before calling this function.
+</DL>
+</P><P>
+
+<A NAME="IDX262"></A>
+<DL>
+<DT><U>Function:</U> void <B>rl_save_prompt</B> <I>(void)</I>
+<DD>Save the local Readline prompt display state in preparation for
+displaying a new message in the message area with <CODE>rl_message()</CODE>.
+</DL>
+</P><P>
+
+<A NAME="IDX263"></A>
+<DL>
+<DT><U>Function:</U> void <B>rl_restore_prompt</B> <I>(void)</I>
+<DD>Restore the local Readline prompt display state saved by the most
+recent call to <CODE>rl_save_prompt</CODE>.
+if <CODE>rl_save_prompt</CODE> was called to save the prompt before a call
+to <CODE>rl_message</CODE>, this function should be called before the
+corresponding call to <CODE>rl_clear_message</CODE>.
+</DL>
+</P><P>
+
+<A NAME="IDX264"></A>
+<DL>
+<DT><U>Function:</U> int <B>rl_expand_prompt</B> <I>(char *prompt)</I>
+<DD>Expand any special character sequences in <VAR>prompt</VAR> and set up the
+local Readline prompt redisplay variables.
+This function is called by <CODE>readline()</CODE>.  It may also be called to
+expand the primary prompt if the <CODE>rl_on_new_line_with_prompt()</CODE>
+function or <CODE>rl_already_prompted</CODE> variable is used.
+It returns the number of visible characters on the last line of the
+(possibly multi-line) prompt.
+Applications may indicate that the prompt contains characters that take
+up no physical screen space when displayed by bracketing a sequence of
+such characters with the special markers <CODE>RL_PROMPT_START_IGNORE</CODE>
+and <CODE>RL_PROMPT_END_IGNORE</CODE> (declared in <TT>`readline.h'</TT>.  This may
+be used to embed terminal-specific escape sequences in prompts.
+</DL>
+</P><P>
+
+<A NAME="IDX265"></A>
+<DL>
+<DT><U>Function:</U> int <B>rl_set_prompt</B> <I>(const char *prompt)</I>
+<DD>Make Readline use <VAR>prompt</VAR> for subsequent redisplay.  This calls
+<CODE>rl_expand_prompt()</CODE> to expand the prompt and sets <CODE>rl_prompt</CODE>
+to the result.
+</DL>
+</P><P>
+
+<A NAME="Modifying Text"></A>
+<HR SIZE="6">
+<A NAME="SEC36"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC35"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC37"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC37"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC29"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC43"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC52">Index</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> 2.4.7 Modifying Text </H3>
+<!--docid::SEC36::-->
+<P>
+
+<A NAME="IDX266"></A>
+<DL>
+<DT><U>Function:</U> int <B>rl_insert_text</B> <I>(const char *text)</I>
+<DD>Insert <VAR>text</VAR> into the line at the current cursor position.
+Returns the number of characters inserted.
+</DL>
+</P><P>
+
+<A NAME="IDX267"></A>
+<DL>
+<DT><U>Function:</U> int <B>rl_delete_text</B> <I>(int start, int end)</I>
+<DD>Delete the text between <VAR>start</VAR> and <VAR>end</VAR> in the current line.
+Returns the number of characters deleted.
+</DL>
+</P><P>
+
+<A NAME="IDX268"></A>
+<DL>
+<DT><U>Function:</U> char * <B>rl_copy_text</B> <I>(int start, int end)</I>
+<DD>Return a copy of the text between <VAR>start</VAR> and <VAR>end</VAR> in
+the current line.
+</DL>
+</P><P>
+
+<A NAME="IDX269"></A>
+<DL>
+<DT><U>Function:</U> int <B>rl_kill_text</B> <I>(int start, int end)</I>
+<DD>Copy the text between <VAR>start</VAR> and <VAR>end</VAR> in the current line
+to the kill ring, appending or prepending to the last kill if the
+last command was a kill command.  The text is deleted.
+If <VAR>start</VAR> is less than <VAR>end</VAR>,
+the text is appended, otherwise prepended.  If the last command was
+not a kill, a new kill ring slot is used.
+</DL>
+</P><P>
+
+<A NAME="IDX270"></A>
+<DL>
+<DT><U>Function:</U> int <B>rl_push_macro_input</B> <I>(char *macro)</I>
+<DD>Cause <VAR>macro</VAR> to be inserted into the line, as if it had been invoked
+by a key bound to a macro.  Not especially useful; use
+<CODE>rl_insert_text()</CODE> instead.
+</DL>
+</P><P>
+
+<A NAME="Character Input"></A>
+<HR SIZE="6">
+<A NAME="SEC37"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC36"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC38"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC38"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC29"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC43"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC52">Index</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> 2.4.8 Character Input </H3>
+<!--docid::SEC37::-->
+<P>
+
+<A NAME="IDX271"></A>
+<DL>
+<DT><U>Function:</U> int <B>rl_read_key</B> <I>(void)</I>
+<DD>Return the next character available from Readline's current input stream.
+This handles input inserted into
+the input stream via <VAR>rl_pending_input</VAR> (see section <A HREF="readline.html#SEC28">2.3 Readline Variables</A>)
+and <CODE>rl_stuff_char()</CODE>, macros, and characters read from the keyboard.
+While waiting for input, this function will call any function assigned to
+the <CODE>rl_event_hook</CODE> variable.
+</DL>
+</P><P>
+
+<A NAME="IDX272"></A>
+<DL>
+<DT><U>Function:</U> int <B>rl_getc</B> <I>(FILE *stream)</I>
+<DD>Return the next character available from <VAR>stream</VAR>, which is assumed to
+be the keyboard.
+</DL>
+</P><P>
+
+<A NAME="IDX273"></A>
+<DL>
+<DT><U>Function:</U> int <B>rl_stuff_char</B> <I>(int c)</I>
+<DD>Insert <VAR>c</VAR> into the Readline input stream.  It will be "read"
+before Readline attempts to read characters from the terminal with
+<CODE>rl_read_key()</CODE>.  Up to 512 characters may be pushed back.
+<CODE>rl_stuff_char</CODE> returns 1 if the character was successfully inserted;
+0 otherwise.
+</DL>
+</P><P>
+
+<A NAME="IDX274"></A>
+<DL>
+<DT><U>Function:</U> int <B>rl_execute_next</B> <I>(int c)</I>
+<DD>Make <VAR>c</VAR> be the next command to be executed when <CODE>rl_read_key()</CODE>
+is called.  This sets <VAR>rl_pending_input</VAR>.
+</DL>
+</P><P>
+
+<A NAME="IDX275"></A>
+<DL>
+<DT><U>Function:</U> int <B>rl_clear_pending_input</B> <I>(void)</I>
+<DD>Unset <VAR>rl_pending_input</VAR>, effectively negating the effect of any
+previous call to <CODE>rl_execute_next()</CODE>.  This works only if the
+pending input has not already been read with <CODE>rl_read_key()</CODE>.
+</DL>
+</P><P>
+
+<A NAME="IDX276"></A>
+<DL>
+<DT><U>Function:</U> int <B>rl_set_keyboard_input_timeout</B> <I>(int u)</I>
+<DD>While waiting for keyboard input in <CODE>rl_read_key()</CODE>, Readline will
+wait for <VAR>u</VAR> microseconds for input before calling any function
+assigned to <CODE>rl_event_hook</CODE>.  <VAR>u</VAR> must be greater than or equal
+to zero (a zero-length timeout is equivalent to a poll).
+The default waiting period is one-tenth of a second.
+Returns the old timeout value.
+</DL>
+</P><P>
+
+<A NAME="Terminal Management"></A>
+<HR SIZE="6">
+<A NAME="SEC38"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC37"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC39"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC43"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC29"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC43"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC52">Index</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> 2.4.9 Terminal Management </H3>
+<!--docid::SEC38::-->
+<P>
+
+<A NAME="IDX277"></A>
+<DL>
+<DT><U>Function:</U> void <B>rl_prep_terminal</B> <I>(int meta_flag)</I>
+<DD>Modify the terminal settings for Readline's use, so <CODE>readline()</CODE>
+can read a single character at a time from the keyboard.
+The <VAR>meta_flag</VAR> argument should be non-zero if Readline should
+read eight-bit input.
+</DL>
+</P><P>
+
+<A NAME="IDX278"></A>
+<DL>
+<DT><U>Function:</U> void <B>rl_deprep_terminal</B> <I>(void)</I>
+<DD>Undo the effects of <CODE>rl_prep_terminal()</CODE>, leaving the terminal in
+the state in which it was before the most recent call to
+<CODE>rl_prep_terminal()</CODE>.
+</DL>
+</P><P>
+
+<A NAME="IDX279"></A>
+<DL>
+<DT><U>Function:</U> void <B>rl_tty_set_default_bindings</B> <I>(Keymap kmap)</I>
+<DD>Read the operating system's terminal editing characters (as would be
+displayed by <CODE>stty</CODE>) to their Readline equivalents.
+The bindings are performed in <VAR>kmap</VAR>.
+</DL>
+</P><P>
+
+<A NAME="IDX280"></A>
+<DL>
+<DT><U>Function:</U> void <B>rl_tty_unset_default_bindings</B> <I>(Keymap kmap)</I>
+<DD>Reset the bindings manipulated by <CODE>rl_tty_set_default_bindings</CODE> so
+that the terminal editing characters are bound to <CODE>rl_insert</CODE>.
+The bindings are performed in <VAR>kmap</VAR>.
+</DL>
+</P><P>
+
+<A NAME="IDX281"></A>
+<DL>
+<DT><U>Function:</U> int <B>rl_reset_terminal</B> <I>(const char *terminal_name)</I>
+<DD>Reinitialize Readline's idea of the terminal settings using
+<VAR>terminal_name</VAR> as the terminal type (e.g., <CODE>vt100</CODE>).
+If <VAR>terminal_name</VAR> is <CODE>NULL</CODE>, the value of the <CODE>TERM</CODE>
+environment variable is used.
+</DL>
+</P><P>
+
+<A NAME="Utility Functions"></A>
+<HR SIZE="6">
+<A NAME="SEC39"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC38"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC40"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC31"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC29"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC43"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC52">Index</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> 2.4.10 Utility Functions </H3>
+<!--docid::SEC39::-->
+<P>
+
+<A NAME="IDX282"></A>
+<DL>
+<DT><U>Function:</U> void <B>rl_replace_line</B> <I>(const char *text, int clear_undo)</I>
+<DD>Replace the contents of <CODE>rl_line_buffer</CODE> with <VAR>text</VAR>.
+The point and mark are preserved, if possible.
+If <VAR>clear_undo</VAR> is non-zero, the undo list associated with the
+current line is cleared.
+</DL>
+</P><P>
+
+<A NAME="IDX283"></A>
+<DL>
+<DT><U>Function:</U> int <B>rl_extend_line_buffer</B> <I>(int len)</I>
+<DD>Ensure that <CODE>rl_line_buffer</CODE> has enough space to hold <VAR>len</VAR>
+characters, possibly reallocating it if necessary.
+</DL>
+</P><P>
+
+<A NAME="IDX284"></A>
+<DL>
+<DT><U>Function:</U> int <B>rl_initialize</B> <I>(void)</I>
+<DD>Initialize or re-initialize Readline's internal state.
+It's not strictly necessary to call this; <CODE>readline()</CODE> calls it before
+reading any input.
+</DL>
+</P><P>
+
+<A NAME="IDX285"></A>
+<DL>
+<DT><U>Function:</U> int <B>rl_ding</B> <I>(void)</I>
+<DD>Ring the terminal bell, obeying the setting of <CODE>bell-style</CODE>.
+</DL>
+</P><P>
+
+<A NAME="IDX286"></A>
+<DL>
+<DT><U>Function:</U> int <B>rl_alphabetic</B> <I>(int c)</I>
+<DD>Return 1 if <VAR>c</VAR> is an alphabetic character.
+</DL>
+</P><P>
+
+<A NAME="IDX287"></A>
+<DL>
+<DT><U>Function:</U> void <B>rl_display_match_list</B> <I>(char **matches, int len, int max)</I>
+<DD>A convenience function for displaying a list of strings in
+columnar format on Readline's output stream.  <CODE>matches</CODE> is the list
+of strings, in argv format, such as a list of completion matches.
+<CODE>len</CODE> is the number of strings in <CODE>matches</CODE>, and <CODE>max</CODE>
+is the length of the longest string in <CODE>matches</CODE>.  This function uses
+the setting of <CODE>print-completions-horizontally</CODE> to select how the
+matches are displayed (see section <A HREF="readline.html#SEC10">1.3.1 Readline Init File Syntax</A>).
+</DL>
+</P><P>
+
+The following are implemented as macros, defined in <CODE>chardefs.h</CODE>.
+Applications should refrain from using them.
+</P><P>
+
+<A NAME="IDX288"></A>
+<DL>
+<DT><U>Function:</U> int <B>_rl_uppercase_p</B> <I>(int c)</I>
+<DD>Return 1 if <VAR>c</VAR> is an uppercase alphabetic character.
+</DL>
+</P><P>
+
+<A NAME="IDX289"></A>
+<DL>
+<DT><U>Function:</U> int <B>_rl_lowercase_p</B> <I>(int c)</I>
+<DD>Return 1 if <VAR>c</VAR> is a lowercase alphabetic character.
+</DL>
+</P><P>
+
+<A NAME="IDX290"></A>
+<DL>
+<DT><U>Function:</U> int <B>_rl_digit_p</B> <I>(int c)</I>
+<DD>Return 1 if <VAR>c</VAR> is a numeric character.
+</DL>
+</P><P>
+
+<A NAME="IDX291"></A>
+<DL>
+<DT><U>Function:</U> int <B>_rl_to_upper</B> <I>(int c)</I>
+<DD>If <VAR>c</VAR> is a lowercase alphabetic character, return the corresponding
+uppercase character.
+</DL>
+</P><P>
+
+<A NAME="IDX292"></A>
+<DL>
+<DT><U>Function:</U> int <B>_rl_to_lower</B> <I>(int c)</I>
+<DD>If <VAR>c</VAR> is an uppercase alphabetic character, return the corresponding
+lowercase character.
+</DL>
+</P><P>
+
+<A NAME="IDX293"></A>
+<DL>
+<DT><U>Function:</U> int <B>_rl_digit_value</B> <I>(int c)</I>
+<DD>If <VAR>c</VAR> is a number, return the value it represents.
+</DL>
+</P><P>
+
+<A NAME="Miscellaneous Functions"></A>
+<HR SIZE="6">
+<A NAME="SEC40"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC39"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC41"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC31"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC29"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC43"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC52">Index</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> 2.4.11 Miscellaneous Functions </H3>
+<!--docid::SEC40::-->
+<P>
+
+<A NAME="IDX294"></A>
+<DL>
+<DT><U>Function:</U> int <B>rl_macro_bind</B> <I>(const char *keyseq, const char *macro, Keymap map)</I>
+<DD>Bind the key sequence <VAR>keyseq</VAR> to invoke the macro <VAR>macro</VAR>.
+The binding is performed in <VAR>map</VAR>.  When <VAR>keyseq</VAR> is invoked, the
+<VAR>macro</VAR> will be inserted into the line.  This function is deprecated;
+use <CODE>rl_generic_bind()</CODE> instead.
+</DL>
+</P><P>
+
+<A NAME="IDX295"></A>
+<DL>
+<DT><U>Function:</U> void <B>rl_macro_dumper</B> <I>(int readable)</I>
+<DD>Print the key sequences bound to macros and their values, using
+the current keymap, to <CODE>rl_outstream</CODE>.
+If <VAR>readable</VAR> is non-zero, the list is formatted in such a way
+that it can be made part of an <CODE>inputrc</CODE> file and re-read.
+</DL>
+</P><P>
+
+<A NAME="IDX296"></A>
+<DL>
+<DT><U>Function:</U> int <B>rl_variable_bind</B> <I>(const char *variable, const char *value)</I>
+<DD>Make the Readline variable <VAR>variable</VAR> have <VAR>value</VAR>.
+This behaves as if the readline command
+<SAMP>`set <VAR>variable</VAR> <VAR>value</VAR>'</SAMP> had been executed in an <CODE>inputrc</CODE>
+file (see section <A HREF="readline.html#SEC10">1.3.1 Readline Init File Syntax</A>).
+</DL>
+</P><P>
+
+<A NAME="IDX297"></A>
+<DL>
+<DT><U>Function:</U> char * <B>rl_variable_value</B> <I>(const char *variable)</I>
+<DD>Return a string representing the value of the Readline variable <VAR>variable</VAR>.
+For boolean variables, this string is either <SAMP>`on'</SAMP> or <SAMP>`off'</SAMP>.
+</DL>
+</P><P>
+
+<A NAME="IDX298"></A>
+<DL>
+<DT><U>Function:</U> void <B>rl_variable_dumper</B> <I>(int readable)</I>
+<DD>Print the readline variable names and their current values
+to <CODE>rl_outstream</CODE>.
+If <VAR>readable</VAR> is non-zero, the list is formatted in such a way
+that it can be made part of an <CODE>inputrc</CODE> file and re-read.
+</DL>
+</P><P>
+
+<A NAME="IDX299"></A>
+<DL>
+<DT><U>Function:</U> int <B>rl_set_paren_blink_timeout</B> <I>(int u)</I>
+<DD>Set the time interval (in microseconds) that Readline waits when showing
+a balancing character when <CODE>blink-matching-paren</CODE> has been enabled.
+</DL>
+</P><P>
+
+<A NAME="IDX300"></A>
+<DL>
+<DT><U>Function:</U> char * <B>rl_get_termcap</B> <I>(const char *cap)</I>
+<DD>Retrieve the string value of the termcap capability <VAR>cap</VAR>.
+Readline fetches the termcap entry for the current terminal name and
+uses those capabilities to move around the screen line and perform other
+terminal-specific operations, like erasing a line.  Readline does not
+use all of a terminal's capabilities, and this function will return
+values for only those capabilities Readline uses.
+</DL>
+</P><P>
+
+<A NAME="Alternate Interface"></A>
+<HR SIZE="6">
+<A NAME="SEC41"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC40"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC42"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC31"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC29"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC43"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC52">Index</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> 2.4.12 Alternate Interface </H3>
+<!--docid::SEC41::-->
+<P>
+
+An alternate interface is available to plain <CODE>readline()</CODE>.  Some
+applications need to interleave keyboard I/O with file, device, or
+window system I/O, typically by using a main loop to <CODE>select()</CODE>
+on various file descriptors.  To accomodate this need, readline can
+also be invoked as a `callback' function from an event loop.  There
+are functions available to make this easy.
+</P><P>
+
+<A NAME="IDX301"></A>
+<DL>
+<DT><U>Function:</U> void <B>rl_callback_handler_install</B> <I>(const char *prompt, rl_vcpfunc_t *lhandler)</I>
+<DD>Set up the terminal for readline I/O and display the initial
+expanded value of <VAR>prompt</VAR>.  Save the value of <VAR>lhandler</VAR> to
+use as a function to call when a complete line of input has been entered.
+The function takes the text of the line as an argument.
+</DL>
+</P><P>
+
+<A NAME="IDX302"></A>
+<DL>
+<DT><U>Function:</U> void <B>rl_callback_read_char</B> <I>(void)</I>
+<DD>Whenever an application determines that keyboard input is available, it
+should call <CODE>rl_callback_read_char()</CODE>, which will read the next
+character from the current input source.
+If that character completes the line, <CODE>rl_callback_read_char</CODE> will
+invoke the <VAR>lhandler</VAR> function saved by <CODE>rl_callback_handler_install</CODE>
+to process the line.
+Before calling the <VAR>lhandler</VAR> function, the terminal settings are
+reset to the values they had before calling
+<CODE>rl_callback_handler_install</CODE>.
+If the <VAR>lhandler</VAR> function returns,
+the terminal settings are modified for Readline's use again.
+<CODE>EOF</CODE> is  indicated by calling <VAR>lhandler</VAR> with a
+<CODE>NULL</CODE> line.
+</DL>
+</P><P>
+
+<A NAME="IDX303"></A>
+<DL>
+<DT><U>Function:</U> void <B>rl_callback_handler_remove</B> <I>(void)</I>
+<DD>Restore the terminal to its initial state and remove the line handler.
+This may be called from within a callback as well as independently.
+If the <VAR>lhandler</VAR> installed by <CODE>rl_callback_handler_install</CODE>
+does not exit the program, either this function or the function referred
+to by the value of <CODE>rl_deprep_term_function</CODE> should be called before
+the program exits to reset the terminal settings.
+</DL>
+</P><P>
+
+<A NAME="A Readline Example"></A>
+<HR SIZE="6">
+<A NAME="SEC42"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC41"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC43"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC31"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC29"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC43"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC52">Index</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> 2.4.13 A Readline Example </H3>
+<!--docid::SEC42::-->
+<P>
+
+Here is a function which changes lowercase characters to their uppercase
+equivalents, and uppercase characters to lowercase.  If
+this function was bound to <SAMP>`M-c'</SAMP>, then typing <SAMP>`M-c'</SAMP> would
+change the case of the character under point.  Typing <SAMP>`M-1 0 M-c'</SAMP>
+would change the case of the following 10 characters, leaving the cursor on
+the last character changed.
+</P><P>
+
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>/* Invert the case of the COUNT following characters. */
+int
+invert_case_line (count, key)
+     int count, key;
+{
+  register int start, end, i;
+
+  start = rl_point;
+
+  if (rl_point &#62;= rl_end)
+    return (0);
+
+  if (count &#60; 0)
+    {
+      direction = -1;
+      count = -count;
+    }
+  else
+    direction = 1;
+      
+  /* Find the end of the range to modify. */
+  end = start + (count * direction);
+
+  /* Force it to be within range. */
+  if (end &#62; rl_end)
+    end = rl_end;
+  else if (end &#60; 0)
+    end = 0;
+
+  if (start == end)
+    return (0);
+
+  if (start &#62; end)
+    {
+      int temp = start;
+      start = end;
+      end = temp;
+    }
+
+  /* Tell readline that we are modifying the line,
+     so it will save the undo information. */
+  rl_modifying (start, end);
+
+  for (i = start; i != end; i++)
+    {
+      if (_rl_uppercase_p (rl_line_buffer[i]))
+        rl_line_buffer[i] = _rl_to_lower (rl_line_buffer[i]);
+      else if (_rl_lowercase_p (rl_line_buffer[i]))
+        rl_line_buffer[i] = _rl_to_upper (rl_line_buffer[i]);
+    }
+  /* Move point to on top of the last character changed. */
+  rl_point = (direction == 1) ? end - 1 : start;
+  return (0);
+}
+</pre></td></tr></table></P><P>
+
+<A NAME="Readline Signal Handling"></A>
+<HR SIZE="6">
+<A NAME="SEC43"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC42"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC44"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC44"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC23"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC49"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC52">Index</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H2> 2.5 Readline Signal Handling </H2>
+<!--docid::SEC43::-->
+<P>
+
+Signals are asynchronous events sent to a process by the Unix kernel,
+sometimes on behalf of another process.  They are intended to indicate
+exceptional events, like a user pressing the interrupt key on his terminal,
+or a network connection being broken.  There is a class of signals that can
+be sent to the process currently reading input from the keyboard.  Since
+Readline changes the terminal attributes when it is called, it needs to
+perform special processing when such a signal is received in order to
+restore the terminal to a sane state, or provide application writers with
+functions to do so manually. 
+</P><P>
+
+Readline contains an internal signal handler that is installed for a
+number of signals (<CODE>SIGINT</CODE>, <CODE>SIGQUIT</CODE>, <CODE>SIGTERM</CODE>,
+<CODE>SIGALRM</CODE>, <CODE>SIGTSTP</CODE>, <CODE>SIGTTIN</CODE>, and <CODE>SIGTTOU</CODE>).
+When one of these signals is received, the signal handler
+will reset the terminal attributes to those that were in effect before
+<CODE>readline()</CODE> was called, reset the signal handling to what it was
+before <CODE>readline()</CODE> was called, and resend the signal to the calling
+application.
+If and when the calling application's signal handler returns, Readline
+will reinitialize the terminal and continue to accept input.
+When a <CODE>SIGINT</CODE> is received, the Readline signal handler performs
+some additional work, which will cause any partially-entered line to be
+aborted (see the description of <CODE>rl_free_line_state()</CODE> below).
+</P><P>
+
+There is an additional Readline signal handler, for <CODE>SIGWINCH</CODE>, which
+the kernel sends to a process whenever the terminal's size changes (for
+example, if a user resizes an <CODE>xterm</CODE>).  The Readline <CODE>SIGWINCH</CODE>
+handler updates Readline's internal screen size information, and then calls
+any <CODE>SIGWINCH</CODE> signal handler the calling application has installed. 
+Readline calls the application's <CODE>SIGWINCH</CODE> signal handler without
+resetting the terminal to its original state.  If the application's signal
+handler does more than update its idea of the terminal size and return (for
+example, a <CODE>longjmp</CODE> back to a main processing loop), it <EM>must</EM>
+call <CODE>rl_cleanup_after_signal()</CODE> (described below), to restore the
+terminal state. 
+</P><P>
+
+Readline provides two variables that allow application writers to
+control whether or not it will catch certain signals and act on them
+when they are received.  It is important that applications change the
+values of these variables only when calling <CODE>readline()</CODE>, not in
+a signal handler, so Readline's internal signal state is not corrupted.
+</P><P>
+
+<A NAME="IDX304"></A>
+<DL>
+<DT><U>Variable:</U> int <B>rl_catch_signals</B>
+<DD>If this variable is non-zero, Readline will install signal handlers for
+<CODE>SIGINT</CODE>, <CODE>SIGQUIT</CODE>, <CODE>SIGTERM</CODE>, <CODE>SIGALRM</CODE>,
+<CODE>SIGTSTP</CODE>, <CODE>SIGTTIN</CODE>, and <CODE>SIGTTOU</CODE>.
+</P><P>
+
+The default value of <CODE>rl_catch_signals</CODE> is 1.
+</DL>
+</P><P>
+
+<A NAME="IDX305"></A>
+<DL>
+<DT><U>Variable:</U> int <B>rl_catch_sigwinch</B>
+<DD>If this variable is non-zero, Readline will install a signal handler for
+<CODE>SIGWINCH</CODE>.
+</P><P>
+
+The default value of <CODE>rl_catch_sigwinch</CODE> is 1.
+</DL>
+</P><P>
+
+If an application does not wish to have Readline catch any signals, or
+to handle signals other than those Readline catches (<CODE>SIGHUP</CODE>,
+for example), 
+Readline provides convenience functions to do the necessary terminal
+and internal state cleanup upon receipt of a signal.
+</P><P>
+
+<A NAME="IDX306"></A>
+<DL>
+<DT><U>Function:</U> void <B>rl_cleanup_after_signal</B> <I>(void)</I>
+<DD>This function will reset the state of the terminal to what it was before
+<CODE>readline()</CODE> was called, and remove the Readline signal handlers for
+all signals, depending on the values of <CODE>rl_catch_signals</CODE> and
+<CODE>rl_catch_sigwinch</CODE>.
+</DL>
+</P><P>
+
+<A NAME="IDX307"></A>
+<DL>
+<DT><U>Function:</U> void <B>rl_free_line_state</B> <I>(void)</I>
+<DD>This will free any partial state associated with the current input line
+(undo information, any partial history entry, any partially-entered
+keyboard macro, and any partially-entered numeric argument).  This
+should be called before <CODE>rl_cleanup_after_signal()</CODE>.  The
+Readline signal handler for <CODE>SIGINT</CODE> calls this to abort the
+current input line.
+</DL>
+</P><P>
+
+<A NAME="IDX308"></A>
+<DL>
+<DT><U>Function:</U> void <B>rl_reset_after_signal</B> <I>(void)</I>
+<DD>This will reinitialize the terminal and reinstall any Readline signal
+handlers, depending on the values of <CODE>rl_catch_signals</CODE> and
+<CODE>rl_catch_sigwinch</CODE>.
+</DL>
+</P><P>
+
+If an application does not wish Readline to catch <CODE>SIGWINCH</CODE>, it may
+call <CODE>rl_resize_terminal()</CODE> or <CODE>rl_set_screen_size()</CODE> to force
+Readline to update its idea of the terminal size when a <CODE>SIGWINCH</CODE>
+is received.
+</P><P>
+
+<A NAME="IDX309"></A>
+<DL>
+<DT><U>Function:</U> void <B>rl_resize_terminal</B> <I>(void)</I>
+<DD>Update Readline's internal screen size by reading values from the kernel.
+</DL>
+</P><P>
+
+<A NAME="IDX310"></A>
+<DL>
+<DT><U>Function:</U> void <B>rl_set_screen_size</B> <I>(int rows, int cols)</I>
+<DD>Set Readline's idea of the terminal size to <VAR>rows</VAR> rows and
+<VAR>cols</VAR> columns.  If either <VAR>rows</VAR> or <VAR>columns</VAR> is less than
+or equal to 0, Readline's idea of that terminal dimension is unchanged.
+</DL>
+</P><P>
+
+If an application does not want to install a <CODE>SIGWINCH</CODE> handler, but
+is still interested in the screen dimensions, Readline's idea of the screen
+size may be queried.
+</P><P>
+
+<A NAME="IDX311"></A>
+<DL>
+<DT><U>Function:</U> void <B>rl_get_screen_size</B> <I>(int *rows, int *cols)</I>
+<DD>Return Readline's idea of the terminal's size in the
+variables pointed to by the arguments.
+</DL>
+</P><P>
+
+<A NAME="IDX312"></A>
+<DL>
+<DT><U>Function:</U> void <B>rl_reset_screen_size</B> <I>(void)</I>
+<DD>Cause Readline to reobtain the screen size and recalculate its dimensions.
+</DL>
+</P><P>
+
+The following functions install and remove Readline's signal handlers.
+</P><P>
+
+<A NAME="IDX313"></A>
+<DL>
+<DT><U>Function:</U> int <B>rl_set_signals</B> <I>(void)</I>
+<DD>Install Readline's signal handler for <CODE>SIGINT</CODE>, <CODE>SIGQUIT</CODE>,
+<CODE>SIGTERM</CODE>, <CODE>SIGALRM</CODE>, <CODE>SIGTSTP</CODE>, <CODE>SIGTTIN</CODE>,
+<CODE>SIGTTOU</CODE>, and <CODE>SIGWINCH</CODE>, depending on the values of
+<CODE>rl_catch_signals</CODE> and <CODE>rl_catch_sigwinch</CODE>.
+</DL>
+</P><P>
+
+<A NAME="IDX314"></A>
+<DL>
+<DT><U>Function:</U> int <B>rl_clear_signals</B> <I>(void)</I>
+<DD>Remove all of the Readline signal handlers installed by
+<CODE>rl_set_signals()</CODE>.
+</DL>
+</P><P>
+
+<A NAME="Custom Completers"></A>
+<HR SIZE="6">
+<A NAME="SEC44"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC43"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC45"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[ &lt;&lt; ]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC23"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC49"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC52">Index</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H2> 2.6 Custom Completers </H2>
+<!--docid::SEC44::-->
+<P>
+
+Typically, a program that reads commands from the user has a way of
+disambiguating commands and data.  If your program is one of these, then
+it can provide completion for commands, data, or both.
+The following sections describe how your program and Readline
+cooperate to provide this service.
+</P><P>
+
+<BLOCKQUOTE><TABLE BORDER=0 CELLSPACING=0> 
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="readline.html#SEC45">2.6.1 How Completing Works</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">The logic used to do completion.</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="readline.html#SEC46">2.6.2 Completion Functions</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Functions provided by Readline.</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="readline.html#SEC47">2.6.3 Completion Variables</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Variables which control completion.</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="readline.html#SEC48">2.6.4 A Short Completion Example</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">An example of writing completer subroutines.</TD></TR>
+</TABLE></BLOCKQUOTE>
+<P>
+
+<A NAME="How Completing Works"></A>
+<HR SIZE="6">
+<A NAME="SEC45"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC44"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC46"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[ &lt;&lt; ]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC44"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC49"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC52">Index</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> 2.6.1 How Completing Works </H3>
+<!--docid::SEC45::-->
+<P>
+
+In order to complete some text, the full list of possible completions
+must be available.  That is, it is not possible to accurately
+expand a partial word without knowing all of the possible words
+which make sense in that context.  The Readline library provides
+the user interface to completion, and two of the most common
+completion functions:  filename and username.  For completing other types
+of text, you must write your own completion function.  This section
+describes exactly what such functions must do, and provides an example.
+</P><P>
+
+There are three major functions used to perform completion:
+</P><P>
+
+<OL>
+<LI>
+The user-interface function <CODE>rl_complete()</CODE>.  This function is
+called with the same arguments as other bindable Readline functions:
+<VAR>count</VAR> and <VAR>invoking_key</VAR>.
+It isolates the word to be completed and calls
+<CODE>rl_completion_matches()</CODE> to generate a list of possible completions.
+It then either lists the possible completions, inserts the possible
+completions, or actually performs the
+completion, depending on which behavior is desired.
+<P>
+
+<LI>
+The internal function <CODE>rl_completion_matches()</CODE> uses an
+application-supplied <EM>generator</EM> function to generate the list of
+possible matches, and then returns the array of these matches.
+The caller should place the address of its generator function in
+<CODE>rl_completion_entry_function</CODE>.
+<P>
+
+<LI>
+The generator function is called repeatedly from
+<CODE>rl_completion_matches()</CODE>, returning a string each time.  The
+arguments to the generator function are <VAR>text</VAR> and <VAR>state</VAR>.
+<VAR>text</VAR> is the partial word to be completed.  <VAR>state</VAR> is zero the
+first time the function is called, allowing the generator to perform
+any necessary initialization, and a positive non-zero integer for
+each subsequent call.  The generator function returns
+<CODE>(char *)NULL</CODE> to inform <CODE>rl_completion_matches()</CODE> that there are
+no more possibilities left.  Usually the generator function computes the
+list of possible completions when <VAR>state</VAR> is zero, and returns them
+one at a time on subsequent calls.  Each string the generator function
+returns as a match must be allocated with <CODE>malloc()</CODE>; Readline
+frees the strings when it has finished with them.
+Such a generator function is referred to as an
+<EM>application-specific completion function</EM>.
+<P>
+
+</OL>
+<P>
+
+<A NAME="IDX315"></A>
+<DL>
+<DT><U>Function:</U> int <B>rl_complete</B> <I>(int ignore, int invoking_key)</I>
+<DD>Complete the word at or before point.  You have supplied the function
+that does the initial simple matching selection algorithm (see
+<CODE>rl_completion_matches()</CODE>).  The default is to do filename completion.
+</DL>
+</P><P>
+
+<A NAME="IDX316"></A>
+<DL>
+<DT><U>Variable:</U> rl_compentry_func_t * <B>rl_completion_entry_function</B>
+<DD>This is a pointer to the generator function for
+<CODE>rl_completion_matches()</CODE>.
+If the value of <CODE>rl_completion_entry_function</CODE> is
+<CODE>NULL</CODE> then the default filename generator
+function, <CODE>rl_filename_completion_function()</CODE>, is used.
+An <EM>application-specific completion function</EM> is a function whose
+address is assigned to <CODE>rl_completion_entry_function</CODE> and whose
+return values are used to  generate possible completions.
+</DL>
+</P><P>
+
+<A NAME="Completion Functions"></A>
+<HR SIZE="6">
+<A NAME="SEC46"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC45"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC47"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC47"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC44"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC49"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC52">Index</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> 2.6.2 Completion Functions </H3>
+<!--docid::SEC46::-->
+<P>
+
+Here is the complete list of callable completion functions present in
+Readline.
+</P><P>
+
+<A NAME="IDX317"></A>
+<DL>
+<DT><U>Function:</U> int <B>rl_complete_internal</B> <I>(int what_to_do)</I>
+<DD>Complete the word at or before point.  <VAR>what_to_do</VAR> says what to do
+with the completion.  A value of <SAMP>`?'</SAMP> means list the possible
+completions.  <SAMP>`TAB'</SAMP> means do standard completion.  <SAMP>`*'</SAMP> means
+insert all of the possible completions.  <SAMP>`!'</SAMP> means to display
+all of the possible completions, if there is more than one, as well as
+performing partial completion.  <SAMP>`@'</SAMP> is similar to <SAMP>`!'</SAMP>, but
+possible completions are not listed if the possible completions share
+a common prefix.
+</DL>
+</P><P>
+
+<A NAME="IDX318"></A>
+<DL>
+<DT><U>Function:</U> int <B>rl_complete</B> <I>(int ignore, int invoking_key)</I>
+<DD>Complete the word at or before point.  You have supplied the function
+that does the initial simple matching selection algorithm (see
+<CODE>rl_completion_matches()</CODE> and <CODE>rl_completion_entry_function</CODE>).
+The default is to do filename
+completion.  This calls <CODE>rl_complete_internal()</CODE> with an
+argument depending on <VAR>invoking_key</VAR>.
+</DL>
+</P><P>
+
+<A NAME="IDX319"></A>
+<DL>
+<DT><U>Function:</U> int <B>rl_possible_completions</B> <I>(int count, int invoking_key)</I>
+<DD>List the possible completions.  See description of <CODE>rl_complete
+()</CODE>.  This calls <CODE>rl_complete_internal()</CODE> with an argument of
+<SAMP>`?'</SAMP>.
+</DL>
+</P><P>
+
+<A NAME="IDX320"></A>
+<DL>
+<DT><U>Function:</U> int <B>rl_insert_completions</B> <I>(int count, int invoking_key)</I>
+<DD>Insert the list of possible completions into the line, deleting the
+partially-completed word.  See description of <CODE>rl_complete()</CODE>.
+This calls <CODE>rl_complete_internal()</CODE> with an argument of <SAMP>`*'</SAMP>.
+</DL>
+</P><P>
+
+<A NAME="IDX321"></A>
+<DL>
+<DT><U>Function:</U> int <B>rl_completion_mode</B> <I>(rl_command_func_t *cfunc)</I>
+<DD>Returns the apppriate value to pass to <CODE>rl_complete_internal()</CODE>
+depending on whether <VAR>cfunc</VAR> was called twice in succession and
+the values of the <CODE>show-all-if-ambiguous</CODE> and
+<CODE>show-all-if-unmodified</CODE> variables.
+Application-specific completion functions may use this function to present
+the same interface as <CODE>rl_complete()</CODE>.
+</DL>
+</P><P>
+
+<A NAME="IDX322"></A>
+<DL>
+<DT><U>Function:</U> char ** <B>rl_completion_matches</B> <I>(const char *text, rl_compentry_func_t *entry_func)</I>
+<DD>Returns an array of strings which is a list of completions for
+<VAR>text</VAR>.  If there are no completions, returns <CODE>NULL</CODE>.
+The first entry in the returned array is the substitution for <VAR>text</VAR>.
+The remaining entries are the possible completions.  The array is
+terminated with a <CODE>NULL</CODE> pointer.
+</P><P>
+
+<VAR>entry_func</VAR> is a function of two args, and returns a
+<CODE>char *</CODE>.  The first argument is <VAR>text</VAR>.  The second is a
+state argument; it is zero on the first call, and non-zero on subsequent
+calls.  <VAR>entry_func</VAR> returns a <CODE>NULL</CODE>  pointer to the caller
+when there are no more matches.
+</DL>
+</P><P>
+
+<A NAME="IDX323"></A>
+<DL>
+<DT><U>Function:</U> char * <B>rl_filename_completion_function</B> <I>(const char *text, int state)</I>
+<DD>A generator function for filename completion in the general case.
+<VAR>text</VAR> is a partial filename.
+The Bash source is a useful reference for writing application-specific
+completion functions (the Bash completion functions call this and other
+Readline functions).
+</DL>
+</P><P>
+
+<A NAME="IDX324"></A>
+<DL>
+<DT><U>Function:</U> char * <B>rl_username_completion_function</B> <I>(const char *text, int state)</I>
+<DD>A completion generator for usernames.  <VAR>text</VAR> contains a partial
+username preceded by a random character (usually <SAMP>`~'</SAMP>).  As with all
+completion generators, <VAR>state</VAR> is zero on the first call and non-zero
+for subsequent calls.
+</DL>
+</P><P>
+
+<A NAME="Completion Variables"></A>
+<HR SIZE="6">
+<A NAME="SEC47"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC46"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC48"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC48"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC44"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC49"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC52">Index</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> 2.6.3 Completion Variables </H3>
+<!--docid::SEC47::-->
+<P>
+
+<A NAME="IDX325"></A>
+<DL>
+<DT><U>Variable:</U> rl_compentry_func_t * <B>rl_completion_entry_function</B>
+<DD>A pointer to the generator function for <CODE>rl_completion_matches()</CODE>.
+<CODE>NULL</CODE> means to use <CODE>rl_filename_completion_function()</CODE>,
+the default filename completer.
+</DL>
+</P><P>
+
+<A NAME="IDX326"></A>
+<DL>
+<DT><U>Variable:</U> rl_completion_func_t * <B>rl_attempted_completion_function</B>
+<DD>A pointer to an alternative function to create matches.
+The function is called with <VAR>text</VAR>, <VAR>start</VAR>, and <VAR>end</VAR>.
+<VAR>start</VAR> and <VAR>end</VAR> are indices in <CODE>rl_line_buffer</CODE> defining
+the boundaries of <VAR>text</VAR>, which is a character string.
+If this function exists and returns <CODE>NULL</CODE>, or if this variable is
+set to <CODE>NULL</CODE>, then <CODE>rl_complete()</CODE> will call the value of
+<CODE>rl_completion_entry_function</CODE> to generate matches, otherwise the
+array of strings returned will be used.
+If this function sets the <CODE>rl_attempted_completion_over</CODE>
+variable to a non-zero value, Readline will not perform its default
+completion even if this function returns no matches.
+</DL>
+</P><P>
+
+<A NAME="IDX327"></A>
+<DL>
+<DT><U>Variable:</U> rl_quote_func_t * <B>rl_filename_quoting_function</B>
+<DD>A pointer to a function that will quote a filename in an
+application-specific fashion.  This is called if filename completion is being
+attempted and one of the characters in <CODE>rl_filename_quote_characters</CODE>
+appears in a completed filename.  The function is called with
+<VAR>text</VAR>, <VAR>match_type</VAR>, and <VAR>quote_pointer</VAR>.  The <VAR>text</VAR>
+is the filename to be quoted.  The <VAR>match_type</VAR> is either
+<CODE>SINGLE_MATCH</CODE>, if there is only one completion match, or
+<CODE>MULT_MATCH</CODE>.  Some functions use this to decide whether or not to
+insert a closing quote character.  The <VAR>quote_pointer</VAR> is a pointer
+to any opening quote character the user typed.  Some functions choose
+to reset this character.
+</DL>
+</P><P>
+
+<A NAME="IDX328"></A>
+<DL>
+<DT><U>Variable:</U> rl_dequote_func_t * <B>rl_filename_dequoting_function</B>
+<DD>A pointer to a function that will remove application-specific quoting
+characters from a filename before completion is attempted, so those
+characters do not interfere with matching the text against names in
+the filesystem.  It is called with <VAR>text</VAR>, the text of the word
+to be dequoted, and <VAR>quote_char</VAR>, which is the quoting character 
+that delimits the filename (usually <SAMP>`''</SAMP> or <SAMP>`"'</SAMP>).  If
+<VAR>quote_char</VAR> is zero, the filename was not in an embedded string.
+</DL>
+</P><P>
+
+<A NAME="IDX329"></A>
+<DL>
+<DT><U>Variable:</U> rl_linebuf_func_t * <B>rl_char_is_quoted_p</B>
+<DD>A pointer to a function to call that determines whether or not a specific
+character in the line buffer is quoted, according to whatever quoting
+mechanism the program calling Readline uses.  The function is called with
+two arguments: <VAR>text</VAR>, the text of the line, and <VAR>index</VAR>, the
+index of the character in the line.  It is used to decide whether a
+character found in <CODE>rl_completer_word_break_characters</CODE> should be
+used to break words for the completer.
+</DL>
+</P><P>
+
+<A NAME="IDX330"></A>
+<DL>
+<DT><U>Variable:</U> rl_compignore_func_t * <B>rl_ignore_some_completions_function</B>
+<DD>This function, if defined, is called by the completer when real filename
+completion is done, after all the matching names have been generated.
+It is passed a <CODE>NULL</CODE> terminated array of matches.
+The first element (<CODE>matches[0]</CODE>) is the
+maximal substring common to all matches. This function can
+re-arrange the list of matches as required, but each element deleted
+from the array must be freed.
+</DL>
+</P><P>
+
+<A NAME="IDX331"></A>
+<DL>
+<DT><U>Variable:</U> rl_icppfunc_t * <B>rl_directory_completion_hook</B>
+<DD>This function, if defined, is allowed to modify the directory portion
+of filenames Readline completes.  It is called with the address of a
+string (the current directory name) as an argument, and may modify that string.
+If the string is replaced with a new string, the old value should be freed.
+Any modified directory name should have a trailing slash.
+The modified value will be displayed as part of the completion, replacing
+the directory portion of the pathname the user typed.
+It returns an integer that should be non-zero if the function modifies
+its directory argument.
+It could be used to expand symbolic links or shell variables in pathnames.
+At the least, even if no other expansion is performed, this function should
+remove any quote characters from the directory name, because its result will
+be passed directly to <CODE>opendir()</CODE>.
+</DL>
+</P><P>
+
+<A NAME="IDX332"></A>
+<DL>
+<DT><U>Variable:</U> rl_compdisp_func_t * <B>rl_completion_display_matches_hook</B>
+<DD>If non-zero, then this is the address of a function to call when
+completing a word would normally display the list of possible matches.
+This function is called in lieu of Readline displaying the list.
+It takes three arguments:
+(<CODE>char **</CODE><VAR>matches</VAR>, <CODE>int</CODE> <VAR>num_matches</VAR>, <CODE>int</CODE> <VAR>max_length</VAR>)
+where <VAR>matches</VAR> is the array of matching strings,
+<VAR>num_matches</VAR> is the number of strings in that array, and
+<VAR>max_length</VAR> is the length of the longest string in that array.
+Readline provides a convenience function, <CODE>rl_display_match_list</CODE>,
+that takes care of doing the display to Readline's output stream.  That
+function may be called from this hook.
+</DL>
+</P><P>
+
+<A NAME="IDX333"></A>
+<DL>
+<DT><U>Variable:</U> const char * <B>rl_basic_word_break_characters</B>
+<DD>The basic list of characters that signal a break between words for the
+completer routine.  The default value of this variable is the characters
+which break words for completion in Bash:
+<CODE>" \t\n\"\\'`@$>&#60;=;|&#38;{("</CODE>.
+</DL>
+</P><P>
+
+<A NAME="IDX334"></A>
+<DL>
+<DT><U>Variable:</U> const char * <B>rl_basic_quote_characters</B>
+<DD>A list of quote characters which can cause a word break.
+</DL>
+</P><P>
+
+<A NAME="IDX335"></A>
+<DL>
+<DT><U>Variable:</U> const char * <B>rl_completer_word_break_characters</B>
+<DD>The list of characters that signal a break between words for
+<CODE>rl_complete_internal()</CODE>.  The default list is the value of
+<CODE>rl_basic_word_break_characters</CODE>.
+</DL>
+</P><P>
+
+<A NAME="IDX336"></A>
+<DL>
+<DT><U>Variable:</U> rl_cpvfunc_t * <B>rl_completion_word_break_hook</B>
+<DD>If non-zero, this is the address of a function to call when Readline is
+deciding where to separate words for word completion.  It should return
+a character string like <CODE>rl_completer_word_break_characters</CODE> to be
+used to perform the current completion.  The function may choose to set
+<CODE>rl_completer_word_break_characters</CODE> itself.  If the function
+returns <CODE>NULL</CODE>, <CODE>rl_completer_word_break_characters</CODE> is used.
+</DL>
+</P><P>
+
+<A NAME="IDX337"></A>
+<DL>
+<DT><U>Variable:</U> const char * <B>rl_completer_quote_characters</B>
+<DD>A list of characters which can be used to quote a substring of the line.
+Completion occurs on the entire substring, and within the substring
+<CODE>rl_completer_word_break_characters</CODE> are treated as any other character,
+unless they also appear within this list.
+</DL>
+</P><P>
+
+<A NAME="IDX338"></A>
+<DL>
+<DT><U>Variable:</U> const char * <B>rl_filename_quote_characters</B>
+<DD>A list of characters that cause a filename to be quoted by the completer
+when they appear in a completed filename.  The default is the null string.
+</DL>
+</P><P>
+
+<A NAME="IDX339"></A>
+<DL>
+<DT><U>Variable:</U> const char * <B>rl_special_prefixes</B>
+<DD>The list of characters that are word break characters, but should be
+left in <VAR>text</VAR> when it is passed to the completion function.
+Programs can use this to help determine what kind of completing to do.
+For instance, Bash sets this variable to "$@" so that it can complete
+shell variables and hostnames.
+</DL>
+</P><P>
+
+<A NAME="IDX340"></A>
+<DL>
+<DT><U>Variable:</U> int <B>rl_completion_query_items</B>
+<DD>Up to this many items will be displayed in response to a
+possible-completions call.  After that, readline asks the user if she is sure
+she wants to see them all.  The default value is 100.  A negative value 
+indicates that Readline should never ask the user.
+</DL>
+</P><P>
+
+<A NAME="IDX341"></A>
+<DL>
+<DT><U>Variable:</U> int <B>rl_completion_append_character</B>
+<DD>When a single completion alternative matches at the end of the command
+line, this character is appended to the inserted completion text.  The
+default is a space character (<SAMP>` '</SAMP>).  Setting this to the null
+character (<SAMP>`\0'</SAMP>) prevents anything being appended automatically.
+This can be changed in application-specific completion functions to
+provide the "most sensible word separator character" according to
+an application-specific command line syntax specification.
+</DL>
+</P><P>
+
+<A NAME="IDX342"></A>
+<DL>
+<DT><U>Variable:</U> int <B>rl_completion_suppress_append</B>
+<DD>If non-zero, <VAR>rl_completion_append_character</VAR> is not appended to
+matches at the end of the command line, as described above.
+It is set to 0 before any application-specific completion function
+is called, and may only be changed within such a function.
+</DL>
+</P><P>
+
+<A NAME="IDX343"></A>
+<DL>
+<DT><U>Variable:</U> int <B>rl_completion_quote_character</B>
+<DD>When Readline is completing quoted text, as delimited by one of the
+characters in <VAR>rl_completer_quote_characters</VAR>, it sets this variable
+to the quoting character found.
+This is set before any application-specific completion function is called.
+</DL>
+</P><P>
+
+<A NAME="IDX344"></A>
+<DL>
+<DT><U>Variable:</U> int <B>rl_completion_suppress_quote</B>
+<DD>If non-zero, Readline does not append a matching quote character when
+performing completion on a quoted string.
+It is set to 0 before any application-specific completion function
+is called, and may only be changed within such a function.
+</DL>
+</P><P>
+
+<A NAME="IDX345"></A>
+<DL>
+<DT><U>Variable:</U> int <B>rl_completion_found_quote</B>
+<DD>When Readline is completing quoted text, it sets this variable
+to a non-zero value if the word being completed contains or is delimited
+by any quoting characters, including backslashes.
+This is set before any application-specific completion function is called.
+</DL>
+</P><P>
+
+<A NAME="IDX346"></A>
+<DL>
+<DT><U>Variable:</U> int <B>rl_completion_mark_symlink_dirs</B>
+<DD>If non-zero, a slash will be appended to completed filenames that are
+symbolic links to directory names, subject to the value of the
+user-settable <VAR>mark-directories</VAR> variable.
+This variable exists so that application-specific completion functions
+can override the user's global preference (set via the
+<VAR>mark-symlinked-directories</VAR> Readline variable) if appropriate.
+This variable is set to the user's preference before any
+application-specific completion function is called, so unless that
+function modifies the value, the user's preferences are honored.
+</DL>
+</P><P>
+
+<A NAME="IDX347"></A>
+<DL>
+<DT><U>Variable:</U> int <B>rl_ignore_completion_duplicates</B>
+<DD>If non-zero, then duplicates in the matches are removed.
+The default is 1.
+</DL>
+</P><P>
+
+<A NAME="IDX348"></A>
+<DL>
+<DT><U>Variable:</U> int <B>rl_filename_completion_desired</B>
+<DD>Non-zero means that the results of the matches are to be treated as
+filenames.  This is <EM>always</EM> zero when completion is attempted,
+and can only be changed
+within an application-specific completion function.  If it is set to a
+non-zero value by such a function, directory names have a slash appended
+and Readline attempts to quote completed filenames if they contain any
+characters in <CODE>rl_filename_quote_characters</CODE> and
+<CODE>rl_filename_quoting_desired</CODE> is set to a non-zero value.
+</DL>
+</P><P>
+
+<A NAME="IDX349"></A>
+<DL>
+<DT><U>Variable:</U> int <B>rl_filename_quoting_desired</B>
+<DD>Non-zero means that the results of the matches are to be quoted using
+double quotes (or an application-specific quoting mechanism) if the
+completed filename contains any characters in
+<CODE>rl_filename_quote_chars</CODE>.  This is <EM>always</EM> non-zero
+when completion is attempted, and can only be changed within an
+application-specific completion function.
+The quoting is effected via a call to the function pointed to
+by <CODE>rl_filename_quoting_function</CODE>.
+</DL>
+</P><P>
+
+<A NAME="IDX350"></A>
+<DL>
+<DT><U>Variable:</U> int <B>rl_attempted_completion_over</B>
+<DD>If an application-specific completion function assigned to
+<CODE>rl_attempted_completion_function</CODE> sets this variable to a non-zero
+value, Readline will not perform its default filename completion even
+if the application's completion function returns no matches.
+It should be set only by an application's completion function.
+</DL>
+</P><P>
+
+<A NAME="IDX351"></A>
+<DL>
+<DT><U>Variable:</U> int <B>rl_completion_type</B>
+<DD>Set to a character describing the type of completion Readline is currently
+attempting; see the description of <CODE>rl_complete_internal()</CODE>
+(see section <A HREF="readline.html#SEC46">2.6.2 Completion Functions</A>) for the list of characters.
+This is set to the appropriate value before any application-specific
+completion function is called, allowing such functions to present
+the same interface as <CODE>rl_complete()</CODE>.
+</DL>
+</P><P>
+
+<A NAME="IDX352"></A>
+<DL>
+<DT><U>Variable:</U> int <B>rl_inhibit_completion</B>
+<DD>If this variable is non-zero, completion is inhibited.  The completion
+character will be inserted as any other bound to <CODE>self-insert</CODE>.
+</DL>
+</P><P>
+
+<A NAME="A Short Completion Example"></A>
+<HR SIZE="6">
+<A NAME="SEC48"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC47"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC49"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[ &lt;&lt; ]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC44"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC49"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC52">Index</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> 2.6.4 A Short Completion Example </H3>
+<!--docid::SEC48::-->
+<P>
+
+Here is a small application demonstrating the use of the GNU Readline
+library.  It is called <CODE>fileman</CODE>, and the source code resides in
+<TT>`examples/fileman.c'</TT>.  This sample application provides
+completion of command names, line editing features, and access to the
+history list.
+</P><P>
+
+<TABLE><tr><td>&nbsp;</td><td class=smallexample><FONT SIZE=-1><pre>/* fileman.c -- A tiny application which demonstrates how to use the
+   GNU Readline library.  This application interactively allows users
+   to manipulate files and their modes. */
+
+#include &#60;stdio.h&#62;
+#include &#60;sys/types.h&#62;
+#include &#60;sys/file.h&#62;
+#include &#60;sys/stat.h&#62;
+#include &#60;sys/errno.h&#62;
+
+#include &#60;readline/readline.h&#62;
+#include &#60;readline/history.h&#62;
+
+extern char *xmalloc ();
+
+/* The names of functions that actually do the manipulation. */
+int com_list __P((char *));
+int com_view __P((char *));
+int com_rename __P((char *));
+int com_stat __P((char *));
+int com_pwd __P((char *));
+int com_delete __P((char *));
+int com_help __P((char *));
+int com_cd __P((char *));
+int com_quit __P((char *));
+
+/* A structure which contains information on the commands this program
+   can understand. */
+
+typedef struct {
+  char *name;                  /* User printable name of the function. */
+  rl_icpfunc_t *func;          /* Function to call to do the job. */
+  char *doc;                   /* Documentation for this function.  */
+} COMMAND;
+
+COMMAND commands[] = {
+  { "cd", com_cd, "Change to directory DIR" },
+  { "delete", com_delete, "Delete FILE" },
+  { "help", com_help, "Display this text" },
+  { "?", com_help, "Synonym for `help'" },
+  { "list", com_list, "List files in DIR" },
+  { "ls", com_list, "Synonym for `list'" },
+  { "pwd", com_pwd, "Print the current working directory" },
+  { "quit", com_quit, "Quit using Fileman" },
+  { "rename", com_rename, "Rename FILE to NEWNAME" },
+  { "stat", com_stat, "Print out statistics on FILE" },
+  { "view", com_view, "View the contents of FILE" },
+  { (char *)NULL, (rl_icpfunc_t *)NULL, (char *)NULL }
+};
+
+/* Forward declarations. */
+char *stripwhite ();
+COMMAND *find_command ();
+
+/* The name of this program, as taken from argv[0]. */
+char *progname;
+
+/* When non-zero, this means the user is done using this program. */
+int done;
+
+char *
+dupstr (s)
+     int s;
+{
+  char *r;
+
+  r = xmalloc (strlen (s) + 1);
+  strcpy (r, s);
+  return (r);
+}
+
+main (argc, argv)
+     int argc;
+     char **argv;
+{
+  char *line, *s;
+
+  progname = argv[0];
+
+  initialize_readline ();      /* Bind our completer. */
+
+  /* Loop reading and executing lines until the user quits. */
+  for ( ; done == 0; )
+    {
+      line = readline ("FileMan: ");
+
+      if (!line)
+        break;
+
+      /* Remove leading and trailing whitespace from the line.
+         Then, if there is anything left, add it to the history list
+         and execute it. */
+      s = stripwhite (line);
+
+      if (*s)
+        {
+          add_history (s);
+          execute_line (s);
+        }
+
+      free (line);
+    }
+  exit (0);
+}
+
+/* Execute a command line. */
+int
+execute_line (line)
+     char *line;
+{
+  register int i;
+  COMMAND *command;
+  char *word;
+
+  /* Isolate the command word. */
+  i = 0;
+  while (line[i] &#38;&#38; whitespace (line[i]))
+    i++;
+  word = line + i;
+
+  while (line[i] &#38;&#38; !whitespace (line[i]))
+    i++;
+
+  if (line[i])
+    line[i++] = '\0';
+
+  command = find_command (word);
+
+  if (!command)
+    {
+      fprintf (stderr, "%s: No such command for FileMan.\n", word);
+      return (-1);
+    }
+
+  /* Get argument to command, if any. */
+  while (whitespace (line[i]))
+    i++;
+
+  word = line + i;
+
+  /* Call the function. */
+  return ((*(command-&#62;func)) (word));
+}
+
+/* Look up NAME as the name of a command, and return a pointer to that
+   command.  Return a NULL pointer if NAME isn't a command name. */
+COMMAND *
+find_command (name)
+     char *name;
+{
+  register int i;
+
+  for (i = 0; commands[i].name; i++)
+    if (strcmp (name, commands[i].name) == 0)
+      return (&#38;commands[i]);
+
+  return ((COMMAND *)NULL);
+}
+
+/* Strip whitespace from the start and end of STRING.  Return a pointer
+   into STRING. */
+char *
+stripwhite (string)
+     char *string;
+{
+  register char *s, *t;
+
+  for (s = string; whitespace (*s); s++)
+    ;
+    
+  if (*s == 0)
+    return (s);
+
+  t = s + strlen (s) - 1;
+  while (t &#62; s &#38;&#38; whitespace (*t))
+    t--;
+  *++t = '\0';
+
+  return s;
+}
+
+/* **************************************************************** */
+/*                                                                  */
+/*                  Interface to Readline Completion                */
+/*                                                                  */
+/* **************************************************************** */
+
+char *command_generator __P((const char *, int));
+char **fileman_completion __P((const char *, int, int));
+
+/* Tell the GNU Readline library how to complete.  We want to try to
+   complete on command names if this is the first word in the line, or
+   on filenames if not. */
+initialize_readline ()
+{
+  /* Allow conditional parsing of the ~/.inputrc file. */
+  rl_readline_name = "FileMan";
+
+  /* Tell the completer that we want a crack first. */
+  rl_attempted_completion_function = fileman_completion;
+}
+
+/* Attempt to complete on the contents of TEXT.  START and END
+   bound the region of rl_line_buffer that contains the word to
+   complete.  TEXT is the word to complete.  We can use the entire
+   contents of rl_line_buffer in case we want to do some simple
+   parsing.  Returnthe array of matches, or NULL if there aren't any. */
+char **
+fileman_completion (text, start, end)
+     const char *text;
+     int start, end;
+{
+  char **matches;
+
+  matches = (char **)NULL;
+
+  /* If this word is at the start of the line, then it is a command
+     to complete.  Otherwise it is the name of a file in the current
+     directory. */
+  if (start == 0)
+    matches = rl_completion_matches (text, command_generator);
+
+  return (matches);
+}
+
+/* Generator function for command completion.  STATE lets us
+   know whether to start from scratch; without any state
+   (i.e. STATE == 0), then we start at the top of the list. */
+char *
+command_generator (text, state)
+     const char *text;
+     int state;
+{
+  static int list_index, len;
+  char *name;
+
+  /* If this is a new word to complete, initialize now.  This
+     includes saving the length of TEXT for efficiency, and
+     initializing the index variable to 0. */
+  if (!state)
+    {
+      list_index = 0;
+      len = strlen (text);
+    }
+
+  /* Return the next name which partially matches from the
+     command list. */
+  while (name = commands[list_index].name)
+    {
+      list_index++;
+
+      if (strncmp (name, text, len) == 0)
+        return (dupstr(name));
+    }
+
+  /* If no names matched, then return NULL. */
+  return ((char *)NULL);
+}
+
+/* **************************************************************** */
+/*                                                                  */
+/*                       FileMan Commands                           */
+/*                                                                  */
+/* **************************************************************** */
+
+/* String to pass to system ().  This is for the LIST, VIEW and RENAME
+   commands. */
+static char syscom[1024];
+
+/* List the file(s) named in arg. */
+com_list (arg)
+     char *arg;
+{
+  if (!arg)
+    arg = "";
+
+  sprintf (syscom, "ls -FClg %s", arg);
+  return (system (syscom));
+}
+
+com_view (arg)
+     char *arg;
+{
+  if (!valid_argument ("view", arg))
+    return 1;
+
+  sprintf (syscom, "more %s", arg);
+  return (system (syscom));
+}
+
+com_rename (arg)
+     char *arg;
+{
+  too_dangerous ("rename");
+  return (1);
+}
+
+com_stat (arg)
+     char *arg;
+{
+  struct stat finfo;
+
+  if (!valid_argument ("stat", arg))
+    return (1);
+
+  if (stat (arg, &#38;finfo) == -1)
+    {
+      perror (arg);
+      return (1);
+    }
+
+  printf ("Statistics for `%s':\n", arg);
+
+  printf ("%s has %d link%s, and is %d byte%s in length.\n", arg,
+          finfo.st_nlink,
+          (finfo.st_nlink == 1) ? "" : "s",
+          finfo.st_size,
+          (finfo.st_size == 1) ? "" : "s");
+  printf ("Inode Last Change at: %s", ctime (&#38;finfo.st_ctime));
+  printf ("      Last access at: %s", ctime (&#38;finfo.st_atime));
+  printf ("    Last modified at: %s", ctime (&#38;finfo.st_mtime));
+  return (0);
+}
+
+com_delete (arg)
+     char *arg;
+{
+  too_dangerous ("delete");
+  return (1);
+}
+
+/* Print out help for ARG, or for all of the commands if ARG is
+   not present. */
+com_help (arg)
+     char *arg;
+{
+  register int i;
+  int printed = 0;
+
+  for (i = 0; commands[i].name; i++)
+    {
+      if (!*arg || (strcmp (arg, commands[i].name) == 0))
+        {
+          printf ("%s\t\t%s.\n", commands[i].name, commands[i].doc);
+          printed++;
+        }
+    }
+
+  if (!printed)
+    {
+      printf ("No commands match `%s'.  Possibilties are:\n", arg);
+
+      for (i = 0; commands[i].name; i++)
+        {
+          /* Print in six columns. */
+          if (printed == 6)
+            {
+              printed = 0;
+              printf ("\n");
+            }
+
+          printf ("%s\t", commands[i].name);
+          printed++;
+        }
+
+      if (printed)
+        printf ("\n");
+    }
+  return (0);
+}
+
+/* Change to the directory ARG. */
+com_cd (arg)
+     char *arg;
+{
+  if (chdir (arg) == -1)
+    {
+      perror (arg);
+      return 1;
+    }
+
+  com_pwd ("");
+  return (0);
+}
+
+/* Print out the current working directory. */
+com_pwd (ignore)
+     char *ignore;
+{
+  char dir[1024], *s;
+
+  s = getcwd (dir, sizeof(dir) - 1);
+  if (s == 0)
+    {
+      printf ("Error getting pwd: %s\n", dir);
+      return 1;
+    }
+
+  printf ("Current directory is %s\n", dir);
+  return 0;
+}
+
+/* The user wishes to quit using this program.  Just set DONE
+   non-zero. */
+com_quit (arg)
+     char *arg;
+{
+  done = 1;
+  return (0);
+}
+
+/* Function which tells you that you can't do this. */
+too_dangerous (caller)
+     char *caller;
+{
+  fprintf (stderr,
+           "%s: Too dangerous for me to distribute.\n",
+           caller);
+  fprintf (stderr, "Write it yourself.\n");
+}
+
+/* Return non-zero if ARG is a valid argument for CALLER,
+   else print an error message and return zero. */
+int
+valid_argument (caller, arg)
+     char *caller, *arg;
+{
+  if (!arg || !*arg)
+    {
+      fprintf (stderr, "%s: Argument required.\n", caller);
+      return (0);
+    }
+
+  return (1);
+}
+</FONT></pre></td></tr></table></P><P>
+
+<A NAME="Copying This Manual"></A>
+<HR SIZE="6">
+<A NAME="SEC49"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC48"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC50"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC23"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Top"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[ &gt;&gt; ]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC52">Index</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H1> A. Copying This Manual </H1>
+<!--docid::SEC49::-->
+<P>
+
+<BLOCKQUOTE><TABLE BORDER=0 CELLSPACING=0> 
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="readline.html#SEC50">A.1 GNU Free Documentation License</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">License for copying this manual.</TD></TR>
+</TABLE></BLOCKQUOTE>
+<P>
+
+<A NAME="GNU Free Documentation License"></A>
+<HR SIZE="6">
+<A NAME="SEC50"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC49"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC51"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC49"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC49"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[ &gt;&gt; ]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC52">Index</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H2> A.1 GNU Free Documentation License </H2>
+<!--docid::SEC50::-->
+<P>
+
+<A NAME="IDX353"></A>
+<center>
+ Version 1.2, November 2002
+</center>
+</P><P>
+
+<TABLE><tr><td>&nbsp;</td><td class=display><pre style="font-family: serif">Copyright (C) 2000,2001,2002 Free Software Foundation, Inc.
+59 Temple Place, Suite 330, Boston, MA  02111-1307, USA
+
+Everyone is permitted to copy and distribute verbatim copies
+of this license document, but changing it is not allowed.
+</pre></td></tr></table></P><P>
+
+<OL>
+<LI>
+PREAMBLE
+<P>
+
+The purpose of this License is to make a manual, textbook, or other
+functional and useful document <EM>free</EM> in the sense of freedom: to
+assure everyone the effective freedom to copy and redistribute it,
+with or without modifying it, either commercially or noncommercially.
+Secondarily, this License preserves for the author and publisher a way
+to get credit for their work, while not being considered responsible
+for modifications made by others.
+</P><P>
+
+This License is a kind of "copyleft", which means that derivative
+works of the document must themselves be free in the same sense.  It
+complements the GNU General Public License, which is a copyleft
+license designed for free software.
+</P><P>
+
+We have designed this License in order to use it for manuals for free
+software, because free software needs free documentation: a free
+program should come with manuals providing the same freedoms that the
+software does.  But this License is not limited to software manuals;
+it can be used for any textual work, regardless of subject matter or
+whether it is published as a printed book.  We recommend this License
+principally for works whose purpose is instruction or reference.
+</P><P>
+
+<LI>
+APPLICABILITY AND DEFINITIONS
+<P>
+
+This License applies to any manual or other work, in any medium, that
+contains a notice placed by the copyright holder saying it can be
+distributed under the terms of this License.  Such a notice grants a
+world-wide, royalty-free license, unlimited in duration, to use that
+work under the conditions stated herein.  The "Document", below,
+refers to any such manual or work.  Any member of the public is a
+licensee, and is addressed as "you".  You accept the license if you
+copy, modify or distribute the work in a way requiring permission
+under copyright law.
+</P><P>
+
+A "Modified Version" of the Document means any work containing the
+Document or a portion of it, either copied verbatim, or with
+modifications and/or translated into another language.
+</P><P>
+
+A "Secondary Section" is a named appendix or a front-matter section
+of the Document that deals exclusively with the relationship of the
+publishers or authors of the Document to the Document's overall
+subject (or to related matters) and contains nothing that could fall
+directly within that overall subject.  (Thus, if the Document is in
+part a textbook of mathematics, a Secondary Section may not explain
+any mathematics.)  The relationship could be a matter of historical
+connection with the subject or with related matters, or of legal,
+commercial, philosophical, ethical or political position regarding
+them.
+</P><P>
+
+The "Invariant Sections" are certain Secondary Sections whose titles
+are designated, as being those of Invariant Sections, in the notice
+that says that the Document is released under this License.  If a
+section does not fit the above definition of Secondary then it is not
+allowed to be designated as Invariant.  The Document may contain zero
+Invariant Sections.  If the Document does not identify any Invariant
+Sections then there are none.
+</P><P>
+
+The "Cover Texts" are certain short passages of text that are listed,
+as Front-Cover Texts or Back-Cover Texts, in the notice that says that
+the Document is released under this License.  A Front-Cover Text may
+be at most 5 words, and a Back-Cover Text may be at most 25 words.
+</P><P>
+
+A "Transparent" copy of the Document means a machine-readable copy,
+represented in a format whose specification is available to the
+general public, that is suitable for revising the document
+straightforwardly with generic text editors or (for images composed of
+pixels) generic paint programs or (for drawings) some widely available
+drawing editor, and that is suitable for input to text formatters or
+for automatic translation to a variety of formats suitable for input
+to text formatters.  A copy made in an otherwise Transparent file
+format whose markup, or absence of markup, has been arranged to thwart
+or discourage subsequent modification by readers is not Transparent.
+An image format is not Transparent if used for any substantial amount
+of text.  A copy that is not "Transparent" is called "Opaque".
+</P><P>
+
+Examples of suitable formats for Transparent copies include plain
+ASCII without markup, Texinfo input format, LaTeX input
+format, <FONT SIZE="-1">SGML</FONT> or <FONT SIZE="-1">XML</FONT> using a publicly available
+<FONT SIZE="-1">DTD</FONT>, and standard-conforming simple <FONT SIZE="-1">HTML</FONT>,
+PostScript or <FONT SIZE="-1">PDF</FONT> designed for human modification.  Examples
+of transparent image formats include <FONT SIZE="-1">PNG</FONT>, <FONT SIZE="-1">XCF</FONT> and
+<FONT SIZE="-1">JPG</FONT>.  Opaque formats include proprietary formats that can be
+read and edited only by proprietary word processors, <FONT SIZE="-1">SGML</FONT> or
+<FONT SIZE="-1">XML</FONT> for which the <FONT SIZE="-1">DTD</FONT> and/or processing tools are
+not generally available, and the machine-generated <FONT SIZE="-1">HTML</FONT>,
+PostScript or <FONT SIZE="-1">PDF</FONT> produced by some word processors for
+output purposes only.
+</P><P>
+
+The "Title Page" means, for a printed book, the title page itself,
+plus such following pages as are needed to hold, legibly, the material
+this License requires to appear in the title page.  For works in
+formats which do not have any title page as such, "Title Page" means
+the text near the most prominent appearance of the work's title,
+preceding the beginning of the body of the text.
+</P><P>
+
+A section "Entitled XYZ" means a named subunit of the Document whose
+title either is precisely XYZ or contains XYZ in parentheses following
+text that translates XYZ in another language.  (Here XYZ stands for a
+specific section name mentioned below, such as "Acknowledgements",
+"Dedications", "Endorsements", or "History".)  To "Preserve the Title"
+of such a section when you modify the Document means that it remains a
+section "Entitled XYZ" according to this definition.
+</P><P>
+
+The Document may include Warranty Disclaimers next to the notice which
+states that this License applies to the Document.  These Warranty
+Disclaimers are considered to be included by reference in this
+License, but only as regards disclaiming warranties: any other
+implication that these Warranty Disclaimers may have is void and has
+no effect on the meaning of this License.
+</P><P>
+
+<LI>
+VERBATIM COPYING
+<P>
+
+You may copy and distribute the Document in any medium, either
+commercially or noncommercially, provided that this License, the
+copyright notices, and the license notice saying this License applies
+to the Document are reproduced in all copies, and that you add no other
+conditions whatsoever to those of this License.  You may not use
+technical measures to obstruct or control the reading or further
+copying of the copies you make or distribute.  However, you may accept
+compensation in exchange for copies.  If you distribute a large enough
+number of copies you must also follow the conditions in section 3.
+</P><P>
+
+You may also lend copies, under the same conditions stated above, and
+you may publicly display copies.
+</P><P>
+
+<LI>
+COPYING IN QUANTITY
+<P>
+
+If you publish printed copies (or copies in media that commonly have
+printed covers) of the Document, numbering more than 100, and the
+Document's license notice requires Cover Texts, you must enclose the
+copies in covers that carry, clearly and legibly, all these Cover
+Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on
+the back cover.  Both covers must also clearly and legibly identify
+you as the publisher of these copies.  The front cover must present
+the full title with all words of the title equally prominent and
+visible.  You may add other material on the covers in addition.
+Copying with changes limited to the covers, as long as they preserve
+the title of the Document and satisfy these conditions, can be treated
+as verbatim copying in other respects.
+</P><P>
+
+If the required texts for either cover are too voluminous to fit
+legibly, you should put the first ones listed (as many as fit
+reasonably) on the actual cover, and continue the rest onto adjacent
+pages.
+</P><P>
+
+If you publish or distribute Opaque copies of the Document numbering
+more than 100, you must either include a machine-readable Transparent
+copy along with each Opaque copy, or state in or with each Opaque copy
+a computer-network location from which the general network-using
+public has access to download using public-standard network protocols
+a complete Transparent copy of the Document, free of added material.
+If you use the latter option, you must take reasonably prudent steps,
+when you begin distribution of Opaque copies in quantity, to ensure
+that this Transparent copy will remain thus accessible at the stated
+location until at least one year after the last time you distribute an
+Opaque copy (directly or through your agents or retailers) of that
+edition to the public.
+</P><P>
+
+It is requested, but not required, that you contact the authors of the
+Document well before redistributing any large number of copies, to give
+them a chance to provide you with an updated version of the Document.
+</P><P>
+
+<LI>
+MODIFICATIONS
+<P>
+
+You may copy and distribute a Modified Version of the Document under
+the conditions of sections 2 and 3 above, provided that you release
+the Modified Version under precisely this License, with the Modified
+Version filling the role of the Document, thus licensing distribution
+and modification of the Modified Version to whoever possesses a copy
+of it.  In addition, you must do these things in the Modified Version:
+</P><P>
+
+<OL>
+<LI>
+Use in the Title Page (and on the covers, if any) a title distinct
+from that of the Document, and from those of previous versions
+(which should, if there were any, be listed in the History section
+of the Document).  You may use the same title as a previous version
+if the original publisher of that version gives permission.
+<P>
+
+<LI>
+List on the Title Page, as authors, one or more persons or entities
+responsible for authorship of the modifications in the Modified
+Version, together with at least five of the principal authors of the
+Document (all of its principal authors, if it has fewer than five),
+unless they release you from this requirement.
+<P>
+
+<LI>
+State on the Title page the name of the publisher of the
+Modified Version, as the publisher.
+<P>
+
+<LI>
+Preserve all the copyright notices of the Document.
+<P>
+
+<LI>
+Add an appropriate copyright notice for your modifications
+adjacent to the other copyright notices.
+<P>
+
+<LI>
+Include, immediately after the copyright notices, a license notice
+giving the public permission to use the Modified Version under the
+terms of this License, in the form shown in the Addendum below.
+<P>
+
+<LI>
+Preserve in that license notice the full lists of Invariant Sections
+and required Cover Texts given in the Document's license notice.
+<P>
+
+<LI>
+Include an unaltered copy of this License.
+<P>
+
+<LI>
+Preserve the section Entitled "History", Preserve its Title, and add
+to it an item stating at least the title, year, new authors, and
+publisher of the Modified Version as given on the Title Page.  If
+there is no section Entitled "History" in the Document, create one
+stating the title, year, authors, and publisher of the Document as
+given on its Title Page, then add an item describing the Modified
+Version as stated in the previous sentence.
+<P>
+
+<LI>
+Preserve the network location, if any, given in the Document for
+public access to a Transparent copy of the Document, and likewise
+the network locations given in the Document for previous versions
+it was based on.  These may be placed in the "History" section.
+You may omit a network location for a work that was published at
+least four years before the Document itself, or if the original
+publisher of the version it refers to gives permission.
+<P>
+
+<LI>
+For any section Entitled "Acknowledgements" or "Dedications", Preserve
+the Title of the section, and preserve in the section all the
+substance and tone of each of the contributor acknowledgements and/or
+dedications given therein.
+<P>
+
+<LI>
+Preserve all the Invariant Sections of the Document,
+unaltered in their text and in their titles.  Section numbers
+or the equivalent are not considered part of the section titles.
+<P>
+
+<LI>
+Delete any section Entitled "Endorsements".  Such a section
+may not be included in the Modified Version.
+<P>
+
+<LI>
+Do not retitle any existing section to be Entitled "Endorsements" or
+to conflict in title with any Invariant Section.
+<P>
+
+<LI>
+Preserve any Warranty Disclaimers.
+</OL>
+<P>
+
+If the Modified Version includes new front-matter sections or
+appendices that qualify as Secondary Sections and contain no material
+copied from the Document, you may at your option designate some or all
+of these sections as invariant.  To do this, add their titles to the
+list of Invariant Sections in the Modified Version's license notice.
+These titles must be distinct from any other section titles.
+</P><P>
+
+You may add a section Entitled "Endorsements", provided it contains
+nothing but endorsements of your Modified Version by various
+parties--for example, statements of peer review or that the text has
+been approved by an organization as the authoritative definition of a
+standard.
+</P><P>
+
+You may add a passage of up to five words as a Front-Cover Text, and a
+passage of up to 25 words as a Back-Cover Text, to the end of the list
+of Cover Texts in the Modified Version.  Only one passage of
+Front-Cover Text and one of Back-Cover Text may be added by (or
+through arrangements made by) any one entity.  If the Document already
+includes a cover text for the same cover, previously added by you or
+by arrangement made by the same entity you are acting on behalf of,
+you may not add another; but you may replace the old one, on explicit
+permission from the previous publisher that added the old one.
+</P><P>
+
+The author(s) and publisher(s) of the Document do not by this License
+give permission to use their names for publicity for or to assert or
+imply endorsement of any Modified Version.
+</P><P>
+
+<LI>
+COMBINING DOCUMENTS
+<P>
+
+You may combine the Document with other documents released under this
+License, under the terms defined in section 4 above for modified
+versions, provided that you include in the combination all of the
+Invariant Sections of all of the original documents, unmodified, and
+list them all as Invariant Sections of your combined work in its
+license notice, and that you preserve all their Warranty Disclaimers.
+</P><P>
+
+The combined work need only contain one copy of this License, and
+multiple identical Invariant Sections may be replaced with a single
+copy.  If there are multiple Invariant Sections with the same name but
+different contents, make the title of each such section unique by
+adding at the end of it, in parentheses, the name of the original
+author or publisher of that section if known, or else a unique number.
+Make the same adjustment to the section titles in the list of
+Invariant Sections in the license notice of the combined work.
+</P><P>
+
+In the combination, you must combine any sections Entitled "History"
+in the various original documents, forming one section Entitled
+"History"; likewise combine any sections Entitled "Acknowledgements",
+and any sections Entitled "Dedications".  You must delete all
+sections Entitled "Endorsements."
+</P><P>
+
+<LI>
+COLLECTIONS OF DOCUMENTS
+<P>
+
+You may make a collection consisting of the Document and other documents
+released under this License, and replace the individual copies of this
+License in the various documents with a single copy that is included in
+the collection, provided that you follow the rules of this License for
+verbatim copying of each of the documents in all other respects.
+</P><P>
+
+You may extract a single document from such a collection, and distribute
+it individually under this License, provided you insert a copy of this
+License into the extracted document, and follow this License in all
+other respects regarding verbatim copying of that document.
+</P><P>
+
+<LI>
+AGGREGATION WITH INDEPENDENT WORKS
+<P>
+
+A compilation of the Document or its derivatives with other separate
+and independent documents or works, in or on a volume of a storage or
+distribution medium, is called an "aggregate" if the copyright
+resulting from the compilation is not used to limit the legal rights
+of the compilation's users beyond what the individual works permit.
+When the Document is included an aggregate, this License does not
+apply to the other works in the aggregate which are not themselves
+derivative works of the Document.
+</P><P>
+
+If the Cover Text requirement of section 3 is applicable to these
+copies of the Document, then if the Document is less than one half of
+the entire aggregate, the Document's Cover Texts may be placed on
+covers that bracket the Document within the aggregate, or the
+electronic equivalent of covers if the Document is in electronic form.
+Otherwise they must appear on printed covers that bracket the whole
+aggregate.
+</P><P>
+
+<LI>
+TRANSLATION
+<P>
+
+Translation is considered a kind of modification, so you may
+distribute translations of the Document under the terms of section 4.
+Replacing Invariant Sections with translations requires special
+permission from their copyright holders, but you may include
+translations of some or all Invariant Sections in addition to the
+original versions of these Invariant Sections.  You may include a
+translation of this License, and all the license notices in the
+Document, and any Warranty Disclaimers, provided that you also include
+the original English version of this License and the original versions
+of those notices and disclaimers.  In case of a disagreement between
+the translation and the original version of this License or a notice
+or disclaimer, the original version will prevail.
+</P><P>
+
+If a section in the Document is Entitled "Acknowledgements",
+"Dedications", or "History", the requirement (section 4) to Preserve
+its Title (section 1) will typically require changing the actual
+title.
+</P><P>
+
+<LI>
+TERMINATION
+<P>
+
+You may not copy, modify, sublicense, or distribute the Document except
+as expressly provided for under this License.  Any other attempt to
+copy, modify, sublicense or distribute the Document is void, and will
+automatically terminate your rights under this License.  However,
+parties who have received copies, or rights, from you under this
+License will not have their licenses terminated so long as such
+parties remain in full compliance.
+</P><P>
+
+<LI>
+FUTURE REVISIONS OF THIS LICENSE
+<P>
+
+The Free Software Foundation may publish new, revised versions
+of the GNU Free Documentation License from time to time.  Such new
+versions will be similar in spirit to the present version, but may
+differ in detail to address new problems or concerns.  See
+<A HREF="http://www.gnu.org/copyleft/">http://www.gnu.org/copyleft/</A>.
+</P><P>
+
+Each version of the License is given a distinguishing version number.
+If the Document specifies that a particular numbered version of this
+License "or any later version" applies to it, you have the option of
+following the terms and conditions either of that specified version or
+of any later version that has been published (not as a draft) by the
+Free Software Foundation.  If the Document does not specify a version
+number of this License, you may choose any version ever published (not
+as a draft) by the Free Software Foundation.
+</OL>
+<P>
+
+<HR SIZE="6">
+<A NAME="SEC51"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC50"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC52"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC49"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC50"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[ &gt;&gt; ]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC52">Index</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> A.1.1 ADDENDUM: How to use this License for your documents </H3>
+<!--docid::SEC51::-->
+<P>
+
+To use this License in a document you have written, include a copy of
+the License in the document and put the following copyright and
+license notices just after the title page:
+</P><P>
+
+<TABLE><tr><td>&nbsp;</td><td class=smallexample><FONT SIZE=-1><pre>  Copyright (C)  <VAR>year</VAR>  <VAR>your name</VAR>.
+  Permission is granted to copy, distribute and/or modify this document
+  under the terms of the GNU Free Documentation License, Version 1.2
+  or any later version published by the Free Software Foundation;
+  with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.
+  A copy of the license is included in the section entitled ``GNU
+  Free Documentation License''.
+</FONT></pre></td></tr></table></P><P>
+
+If you have Invariant Sections, Front-Cover Texts and Back-Cover Texts,
+replace the "with...Texts." line with this:
+</P><P>
+
+<TABLE><tr><td>&nbsp;</td><td class=smallexample><FONT SIZE=-1><pre>    with the Invariant Sections being <VAR>list their titles</VAR>, with
+    the Front-Cover Texts being <VAR>list</VAR>, and with the Back-Cover Texts
+    being <VAR>list</VAR>.
+</FONT></pre></td></tr></table></P><P>
+
+If you have Invariant Sections without Cover Texts, or some other
+combination of the three, merge those two alternatives to suit the
+situation.
+</P><P>
+
+If your document contains nontrivial examples of program code, we
+recommend releasing these examples in parallel under your choice of
+free software license, such as the GNU General Public License,
+to permit their use in free software.
+</P><P>
+
+<A NAME="Concept Index"></A>
+<HR SIZE="6">
+<A NAME="SEC52"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC51"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC53"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[ &lt;&lt; ]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Top"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[ &gt;&gt; ]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC52">Index</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H1> Concept Index </H1>
+<!--docid::SEC52::-->
+<table><tr><th valign=top>Jump to: &nbsp; </th><td><A HREF="readline.html#cp_A" style="text-decoration:none"><b>A</b></A>
+ &nbsp; 
+<A HREF="readline.html#cp_C" style="text-decoration:none"><b>C</b></A>
+ &nbsp; 
+<A HREF="readline.html#cp_E" style="text-decoration:none"><b>E</b></A>
+ &nbsp; 
+<A HREF="readline.html#cp_F" style="text-decoration:none"><b>F</b></A>
+ &nbsp; 
+<A HREF="readline.html#cp_I" style="text-decoration:none"><b>I</b></A>
+ &nbsp; 
+<A HREF="readline.html#cp_K" style="text-decoration:none"><b>K</b></A>
+ &nbsp; 
+<A HREF="readline.html#cp_N" style="text-decoration:none"><b>N</b></A>
+ &nbsp; 
+<A HREF="readline.html#cp_R" style="text-decoration:none"><b>R</b></A>
+ &nbsp; 
+<A HREF="readline.html#cp_V" style="text-decoration:none"><b>V</b></A>
+ &nbsp; 
+<A HREF="readline.html#cp_Y" style="text-decoration:none"><b>Y</b></A>
+ &nbsp; 
+</td></tr></table><br><P></P>
+<TABLE border=0>
+<TR><TD></TD><TH ALIGN=LEFT>Index Entry</TH><TH ALIGN=LEFT> Section</TH></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="cp_A"></A>A</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#SEC44">application-specific completion functions</A></TD><TD valign=top><A HREF="readline.html#SEC44">2.6 Custom Completers</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="cp_C"></A>C</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#SEC4">command editing</A></TD><TD valign=top><A HREF="readline.html#SEC4">1.2.1 Readline Bare Essentials</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="cp_E"></A>E</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#SEC4">editing command lines</A></TD><TD valign=top><A HREF="readline.html#SEC4">1.2.1 Readline Bare Essentials</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="cp_F"></A>F</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX353">FDL, GNU Free Documentation License</A></TD><TD valign=top><A HREF="readline.html#SEC50">A.1 GNU Free Documentation License</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="cp_I"></A>I</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#SEC9">initialization file, readline</A></TD><TD valign=top><A HREF="readline.html#SEC9">1.3 Readline Init File</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#SEC3">interaction, readline</A></TD><TD valign=top><A HREF="readline.html#SEC3">1.2 Readline Interaction</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="cp_K"></A>K</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX3">kill ring</A></TD><TD valign=top><A HREF="readline.html#SEC6">1.2.3 Readline Killing Commands</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX1">killing text</A></TD><TD valign=top><A HREF="readline.html#SEC6">1.2.3 Readline Killing Commands</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="cp_N"></A>N</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#SEC4">notation, readline</A></TD><TD valign=top><A HREF="readline.html#SEC4">1.2.1 Readline Bare Essentials</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="cp_R"></A>R</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX179">readline, function</A></TD><TD valign=top><A HREF="readline.html#SEC24">2.1 Basic Behavior</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="cp_V"></A>V</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX4">variables, readline</A></TD><TD valign=top><A HREF="readline.html#SEC10">1.3.1 Readline Init File Syntax</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="cp_Y"></A>Y</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX2">yanking text</A></TD><TD valign=top><A HREF="readline.html#SEC6">1.2.3 Readline Killing Commands</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+</TABLE><P></P><table><tr><th valign=top>Jump to: &nbsp; </th><td><A HREF="readline.html#cp_A" style="text-decoration:none"><b>A</b></A>
+ &nbsp; 
+<A HREF="readline.html#cp_C" style="text-decoration:none"><b>C</b></A>
+ &nbsp; 
+<A HREF="readline.html#cp_E" style="text-decoration:none"><b>E</b></A>
+ &nbsp; 
+<A HREF="readline.html#cp_F" style="text-decoration:none"><b>F</b></A>
+ &nbsp; 
+<A HREF="readline.html#cp_I" style="text-decoration:none"><b>I</b></A>
+ &nbsp; 
+<A HREF="readline.html#cp_K" style="text-decoration:none"><b>K</b></A>
+ &nbsp; 
+<A HREF="readline.html#cp_N" style="text-decoration:none"><b>N</b></A>
+ &nbsp; 
+<A HREF="readline.html#cp_R" style="text-decoration:none"><b>R</b></A>
+ &nbsp; 
+<A HREF="readline.html#cp_V" style="text-decoration:none"><b>V</b></A>
+ &nbsp; 
+<A HREF="readline.html#cp_Y" style="text-decoration:none"><b>Y</b></A>
+ &nbsp; 
+</td></tr></table><br><P>
+
+<A NAME="Function and Variable Index"></A>
+<HR SIZE="6">
+<A NAME="SEC53"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC52"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[ &gt; ]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[ &lt;&lt; ]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Top"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[ &gt;&gt; ]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC52">Index</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H1> Function and Variable Index </H1>
+<!--docid::SEC53::-->
+<table><tr><th valign=top>Jump to: &nbsp; </th><td><A HREF="readline.html#fn__" style="text-decoration:none"><b>_</b></A>
+ &nbsp; 
+<BR>
+<A HREF="readline.html#fn_A" style="text-decoration:none"><b>A</b></A>
+ &nbsp; 
+<A HREF="readline.html#fn_B" style="text-decoration:none"><b>B</b></A>
+ &nbsp; 
+<A HREF="readline.html#fn_C" style="text-decoration:none"><b>C</b></A>
+ &nbsp; 
+<A HREF="readline.html#fn_D" style="text-decoration:none"><b>D</b></A>
+ &nbsp; 
+<A HREF="readline.html#fn_E" style="text-decoration:none"><b>E</b></A>
+ &nbsp; 
+<A HREF="readline.html#fn_F" style="text-decoration:none"><b>F</b></A>
+ &nbsp; 
+<A HREF="readline.html#fn_H" style="text-decoration:none"><b>H</b></A>
+ &nbsp; 
+<A HREF="readline.html#fn_I" style="text-decoration:none"><b>I</b></A>
+ &nbsp; 
+<A HREF="readline.html#fn_K" style="text-decoration:none"><b>K</b></A>
+ &nbsp; 
+<A HREF="readline.html#fn_M" style="text-decoration:none"><b>M</b></A>
+ &nbsp; 
+<A HREF="readline.html#fn_N" style="text-decoration:none"><b>N</b></A>
+ &nbsp; 
+<A HREF="readline.html#fn_O" style="text-decoration:none"><b>O</b></A>
+ &nbsp; 
+<A HREF="readline.html#fn_P" style="text-decoration:none"><b>P</b></A>
+ &nbsp; 
+<A HREF="readline.html#fn_Q" style="text-decoration:none"><b>Q</b></A>
+ &nbsp; 
+<A HREF="readline.html#fn_R" style="text-decoration:none"><b>R</b></A>
+ &nbsp; 
+<A HREF="readline.html#fn_S" style="text-decoration:none"><b>S</b></A>
+ &nbsp; 
+<A HREF="readline.html#fn_T" style="text-decoration:none"><b>T</b></A>
+ &nbsp; 
+<A HREF="readline.html#fn_U" style="text-decoration:none"><b>U</b></A>
+ &nbsp; 
+<A HREF="readline.html#fn_V" style="text-decoration:none"><b>V</b></A>
+ &nbsp; 
+<A HREF="readline.html#fn_Y" style="text-decoration:none"><b>Y</b></A>
+ &nbsp; 
+</td></tr></table><br><P></P>
+<TABLE border=0>
+<TR><TD></TD><TH ALIGN=LEFT>Index Entry</TH><TH ALIGN=LEFT> Section</TH></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="fn__"></A>_</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX290"><CODE>_rl_digit_p</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC39">2.4.10 Utility Functions</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX293"><CODE>_rl_digit_value</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC39">2.4.10 Utility Functions</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX289"><CODE>_rl_lowercase_p</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC39">2.4.10 Utility Functions</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX292"><CODE>_rl_to_lower</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC39">2.4.10 Utility Functions</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX291"><CODE>_rl_to_upper</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC39">2.4.10 Utility Functions</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX288"><CODE>_rl_uppercase_p</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC39">2.4.10 Utility Functions</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="fn_A"></A>A</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX146"><CODE>abort (C-g)</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC21">1.4.8 Some Miscellaneous Commands</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX147"><CODE>abort (C-g)</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC21">1.4.8 Some Miscellaneous Commands</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX44"><CODE>accept-line (Newline or Return)</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC15">1.4.2 Commands For Manipulating The History</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX45"><CODE>accept-line (Newline or Return)</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC15">1.4.2 Commands For Manipulating The History</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="fn_B"></A>B</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX34"><CODE>backward-char (C-b)</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC14">1.4.1 Commands For Moving</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX35"><CODE>backward-char (C-b)</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC14">1.4.1 Commands For Moving</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX72"><CODE>backward-delete-char (Rubout)</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC16">1.4.3 Commands For Changing Text</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX73"><CODE>backward-delete-char (Rubout)</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC16">1.4.3 Commands For Changing Text</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX96"><CODE>backward-kill-line (C-x Rubout)</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC17">1.4.4 Killing And Yanking</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX97"><CODE>backward-kill-line (C-x Rubout)</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC17">1.4.4 Killing And Yanking</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX104"><CODE>backward-kill-word (M-<KBD>DEL</KBD>)</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC17">1.4.4 Killing And Yanking</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX105"><CODE>backward-kill-word (M-<KBD>DEL</KBD>)</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC17">1.4.4 Killing And Yanking</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX38"><CODE>backward-word (M-b)</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC14">1.4.1 Commands For Moving</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX39"><CODE>backward-word (M-b)</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC14">1.4.1 Commands For Moving</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX50"><CODE>beginning-of-history (M-&#38;#60;)</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC15">1.4.2 Commands For Manipulating The History</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX51"><CODE>beginning-of-history (M-&#38;#60;)</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC15">1.4.2 Commands For Manipulating The History</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX28"><CODE>beginning-of-line (C-a)</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC14">1.4.1 Commands For Moving</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX29"><CODE>beginning-of-line (C-a)</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC14">1.4.1 Commands For Moving</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX5">bell-style</A></TD><TD valign=top><A HREF="readline.html#SEC10">1.3.1 Readline Init File Syntax</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX6">bind-tty-special-chars</A></TD><TD valign=top><A HREF="readline.html#SEC10">1.3.1 Readline Init File Syntax</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="fn_C"></A>C</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX142"><CODE>call-last-kbd-macro (C-x e)</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC20">1.4.7 Keyboard Macros</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX143"><CODE>call-last-kbd-macro (C-x e)</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC20">1.4.7 Keyboard Macros</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX90"><CODE>capitalize-word (M-c)</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC16">1.4.3 Commands For Changing Text</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX91"><CODE>capitalize-word (M-c)</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC16">1.4.3 Commands For Changing Text</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX162"><CODE>character-search (C-])</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC21">1.4.8 Some Miscellaneous Commands</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX163"><CODE>character-search (C-])</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC21">1.4.8 Some Miscellaneous Commands</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX164"><CODE>character-search-backward (M-C-])</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC21">1.4.8 Some Miscellaneous Commands</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX165"><CODE>character-search-backward (M-C-])</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC21">1.4.8 Some Miscellaneous Commands</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX40"><CODE>clear-screen (C-l)</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC14">1.4.1 Commands For Moving</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX41"><CODE>clear-screen (C-l)</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC14">1.4.1 Commands For Moving</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX7">comment-begin</A></TD><TD valign=top><A HREF="readline.html#SEC10">1.3.1 Readline Init File Syntax</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX128"><CODE>complete (<KBD>TAB</KBD>)</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC19">1.4.6 Letting Readline Type For You</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX129"><CODE>complete (<KBD>TAB</KBD>)</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC19">1.4.6 Letting Readline Type For You</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX8">completion-query-items</A></TD><TD valign=top><A HREF="readline.html#SEC10">1.3.1 Readline Init File Syntax</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX9">convert-meta</A></TD><TD valign=top><A HREF="readline.html#SEC10">1.3.1 Readline Init File Syntax</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX116"><CODE>copy-backward-word ()</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC17">1.4.4 Killing And Yanking</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX117"><CODE>copy-backward-word ()</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC17">1.4.4 Killing And Yanking</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX118"><CODE>copy-forward-word ()</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC17">1.4.4 Killing And Yanking</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX119"><CODE>copy-forward-word ()</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC17">1.4.4 Killing And Yanking</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX114"><CODE>copy-region-as-kill ()</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC17">1.4.4 Killing And Yanking</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX115"><CODE>copy-region-as-kill ()</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC17">1.4.4 Killing And Yanking</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="fn_D"></A>D</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX70"><CODE>delete-char (C-d)</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC16">1.4.3 Commands For Changing Text</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX71"><CODE>delete-char (C-d)</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC16">1.4.3 Commands For Changing Text</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX136"><CODE>delete-char-or-list ()</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC19">1.4.6 Letting Readline Type For You</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX137"><CODE>delete-char-or-list ()</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC19">1.4.6 Letting Readline Type For You</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX110"><CODE>delete-horizontal-space ()</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC17">1.4.4 Killing And Yanking</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX111"><CODE>delete-horizontal-space ()</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC17">1.4.4 Killing And Yanking</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX124"><CODE>digit-argument (<KBD>M-0</KBD>, <KBD>M-1</KBD>, &#60;small&#62;...&#60;/small&#62; <KBD>M--</KBD>)</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC18">1.4.5 Specifying Numeric Arguments</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX125"><CODE>digit-argument (<KBD>M-0</KBD>, <KBD>M-1</KBD>, &#60;small&#62;...&#60;/small&#62; <KBD>M--</KBD>)</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC18">1.4.5 Specifying Numeric Arguments</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX10">disable-completion</A></TD><TD valign=top><A HREF="readline.html#SEC10">1.3.1 Readline Init File Syntax</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX148"><CODE>do-uppercase-version (M-a, M-b, M-<VAR>x</VAR>, &#60;small&#62;...&#60;/small&#62;)</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC21">1.4.8 Some Miscellaneous Commands</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX149"><CODE>do-uppercase-version (M-a, M-b, M-<VAR>x</VAR>, &#60;small&#62;...&#60;/small&#62;)</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC21">1.4.8 Some Miscellaneous Commands</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX88"><CODE>downcase-word (M-l)</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC16">1.4.3 Commands For Changing Text</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX89"><CODE>downcase-word (M-l)</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC16">1.4.3 Commands For Changing Text</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX168"><CODE>dump-functions ()</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC21">1.4.8 Some Miscellaneous Commands</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX169"><CODE>dump-functions ()</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC21">1.4.8 Some Miscellaneous Commands</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX172"><CODE>dump-macros ()</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC21">1.4.8 Some Miscellaneous Commands</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX173"><CODE>dump-macros ()</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC21">1.4.8 Some Miscellaneous Commands</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX170"><CODE>dump-variables ()</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC21">1.4.8 Some Miscellaneous Commands</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX171"><CODE>dump-variables ()</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC21">1.4.8 Some Miscellaneous Commands</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="fn_E"></A>E</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX11">editing-mode</A></TD><TD valign=top><A HREF="readline.html#SEC10">1.3.1 Readline Init File Syntax</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX174"><CODE>emacs-editing-mode (C-e)</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC21">1.4.8 Some Miscellaneous Commands</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX175"><CODE>emacs-editing-mode (C-e)</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC21">1.4.8 Some Miscellaneous Commands</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX12">enable-keypad</A></TD><TD valign=top><A HREF="readline.html#SEC10">1.3.1 Readline Init File Syntax</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX140"><CODE>end-kbd-macro (C-x ))</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC20">1.4.7 Keyboard Macros</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX141"><CODE>end-kbd-macro (C-x ))</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC20">1.4.7 Keyboard Macros</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX52"><CODE>end-of-history (M-&#38;#62;)</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC15">1.4.2 Commands For Manipulating The History</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX53"><CODE>end-of-history (M-&#38;#62;)</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC15">1.4.2 Commands For Manipulating The History</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX30"><CODE>end-of-line (C-e)</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC14">1.4.1 Commands For Moving</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX31"><CODE>end-of-line (C-e)</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC14">1.4.1 Commands For Moving</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX160"><CODE>exchange-point-and-mark (C-x C-x)</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC21">1.4.8 Some Miscellaneous Commands</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX161"><CODE>exchange-point-and-mark (C-x C-x)</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC21">1.4.8 Some Miscellaneous Commands</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX13">expand-tilde</A></TD><TD valign=top><A HREF="readline.html#SEC10">1.3.1 Readline Init File Syntax</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="fn_F"></A>F</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX74"><CODE>forward-backward-delete-char ()</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC16">1.4.3 Commands For Changing Text</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX75"><CODE>forward-backward-delete-char ()</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC16">1.4.3 Commands For Changing Text</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX32"><CODE>forward-char (C-f)</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC14">1.4.1 Commands For Moving</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX33"><CODE>forward-char (C-f)</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC14">1.4.1 Commands For Moving</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX56"><CODE>forward-search-history (C-s)</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC15">1.4.2 Commands For Manipulating The History</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX57"><CODE>forward-search-history (C-s)</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC15">1.4.2 Commands For Manipulating The History</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX36"><CODE>forward-word (M-f)</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC14">1.4.1 Commands For Moving</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX37"><CODE>forward-word (M-f)</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC14">1.4.1 Commands For Moving</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="fn_H"></A>H</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX14">history-preserve-point</A></TD><TD valign=top><A HREF="readline.html#SEC10">1.3.1 Readline Init File Syntax</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX64"><CODE>history-search-backward ()</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC15">1.4.2 Commands For Manipulating The History</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX65"><CODE>history-search-backward ()</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC15">1.4.2 Commands For Manipulating The History</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX62"><CODE>history-search-forward ()</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC15">1.4.2 Commands For Manipulating The History</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX63"><CODE>history-search-forward ()</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC15">1.4.2 Commands For Manipulating The History</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX15">horizontal-scroll-mode</A></TD><TD valign=top><A HREF="readline.html#SEC10">1.3.1 Readline Init File Syntax</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="fn_I"></A>I</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX16">input-meta</A></TD><TD valign=top><A HREF="readline.html#SEC10">1.3.1 Readline Init File Syntax</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX166"><CODE>insert-comment (M-#)</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC21">1.4.8 Some Miscellaneous Commands</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX167"><CODE>insert-comment (M-#)</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC21">1.4.8 Some Miscellaneous Commands</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX132"><CODE>insert-completions (M-*)</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC19">1.4.6 Letting Readline Type For You</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX133"><CODE>insert-completions (M-*)</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC19">1.4.6 Letting Readline Type For You</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX18">isearch-terminators</A></TD><TD valign=top><A HREF="readline.html#SEC10">1.3.1 Readline Init File Syntax</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="fn_K"></A>K</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX19">keymap</A></TD><TD valign=top><A HREF="readline.html#SEC10">1.3.1 Readline Init File Syntax</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX94"><CODE>kill-line (C-k)</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC17">1.4.4 Killing And Yanking</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX95"><CODE>kill-line (C-k)</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC17">1.4.4 Killing And Yanking</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX112"><CODE>kill-region ()</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC17">1.4.4 Killing And Yanking</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX113"><CODE>kill-region ()</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC17">1.4.4 Killing And Yanking</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX100"><CODE>kill-whole-line ()</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC17">1.4.4 Killing And Yanking</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX101"><CODE>kill-whole-line ()</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC17">1.4.4 Killing And Yanking</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX102"><CODE>kill-word (M-d)</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC17">1.4.4 Killing And Yanking</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX103"><CODE>kill-word (M-d)</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC17">1.4.4 Killing And Yanking</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="fn_M"></A>M</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX20">mark-modified-lines</A></TD><TD valign=top><A HREF="readline.html#SEC10">1.3.1 Readline Init File Syntax</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX21">mark-symlinked-directories</A></TD><TD valign=top><A HREF="readline.html#SEC10">1.3.1 Readline Init File Syntax</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX22">match-hidden-files</A></TD><TD valign=top><A HREF="readline.html#SEC10">1.3.1 Readline Init File Syntax</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX134"><CODE>menu-complete ()</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC19">1.4.6 Letting Readline Type For You</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX135"><CODE>menu-complete ()</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC19">1.4.6 Letting Readline Type For You</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX17">meta-flag</A></TD><TD valign=top><A HREF="readline.html#SEC10">1.3.1 Readline Init File Syntax</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="fn_N"></A>N</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX48"><CODE>next-history (C-n)</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC15">1.4.2 Commands For Manipulating The History</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX49"><CODE>next-history (C-n)</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC15">1.4.2 Commands For Manipulating The History</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX60"><CODE>non-incremental-forward-search-history (M-n)</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC15">1.4.2 Commands For Manipulating The History</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX61"><CODE>non-incremental-forward-search-history (M-n)</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC15">1.4.2 Commands For Manipulating The History</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX58"><CODE>non-incremental-reverse-search-history (M-p)</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC15">1.4.2 Commands For Manipulating The History</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX59"><CODE>non-incremental-reverse-search-history (M-p)</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC15">1.4.2 Commands For Manipulating The History</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="fn_O"></A>O</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX23">output-meta</A></TD><TD valign=top><A HREF="readline.html#SEC10">1.3.1 Readline Init File Syntax</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX92"><CODE>overwrite-mode ()</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC16">1.4.3 Commands For Changing Text</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX93"><CODE>overwrite-mode ()</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC16">1.4.3 Commands For Changing Text</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="fn_P"></A>P</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX24">page-completions</A></TD><TD valign=top><A HREF="readline.html#SEC10">1.3.1 Readline Init File Syntax</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX130"><CODE>possible-completions (M-?)</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC19">1.4.6 Letting Readline Type For You</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX131"><CODE>possible-completions (M-?)</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC19">1.4.6 Letting Readline Type For You</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX150"><CODE>prefix-meta (<KBD>ESC</KBD>)</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC21">1.4.8 Some Miscellaneous Commands</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX151"><CODE>prefix-meta (<KBD>ESC</KBD>)</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC21">1.4.8 Some Miscellaneous Commands</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX46"><CODE>previous-history (C-p)</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC15">1.4.2 Commands For Manipulating The History</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX47"><CODE>previous-history (C-p)</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC15">1.4.2 Commands For Manipulating The History</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="fn_Q"></A>Q</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX76"><CODE>quoted-insert (C-q or C-v)</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC16">1.4.3 Commands For Changing Text</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX77"><CODE>quoted-insert (C-q or C-v)</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC16">1.4.3 Commands For Changing Text</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="fn_R"></A>R</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX144"><CODE>re-read-init-file (C-x C-r)</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC21">1.4.8 Some Miscellaneous Commands</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX145"><CODE>re-read-init-file (C-x C-r)</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC21">1.4.8 Some Miscellaneous Commands</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX178"><CODE>readline</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC24">2.1 Basic Behavior</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX42"><CODE>redraw-current-line ()</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC14">1.4.1 Commands For Moving</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX43"><CODE>redraw-current-line ()</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC14">1.4.1 Commands For Moving</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX54"><CODE>reverse-search-history (C-r)</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC15">1.4.2 Commands For Manipulating The History</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX55"><CODE>reverse-search-history (C-r)</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC15">1.4.2 Commands For Manipulating The History</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX154"><CODE>revert-line (M-r)</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC21">1.4.8 Some Miscellaneous Commands</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX155"><CODE>revert-line (M-r)</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC21">1.4.8 Some Miscellaneous Commands</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX214"><CODE>rl_add_defun</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC30">2.4.1 Naming a Function</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX246"><CODE>rl_add_funmap_entry</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC33">2.4.4 Associating Function Names and Bindings</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX249"><CODE>rl_add_undo</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC34">2.4.5 Allowing Undoing</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX286"><CODE>rl_alphabetic</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC39">2.4.10 Utility Functions</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX190">rl_already_prompted</A></TD><TD valign=top><A HREF="readline.html#SEC28">2.3 Readline Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX326">rl_attempted_completion_function</A></TD><TD valign=top><A HREF="readline.html#SEC47">2.6.3 Completion Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX350">rl_attempted_completion_over</A></TD><TD valign=top><A HREF="readline.html#SEC47">2.6.3 Completion Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX334">rl_basic_quote_characters</A></TD><TD valign=top><A HREF="readline.html#SEC47">2.6.3 Completion Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX333">rl_basic_word_break_characters</A></TD><TD valign=top><A HREF="readline.html#SEC47">2.6.3 Completion Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX247"><CODE>rl_begin_undo_group</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC34">2.4.5 Allowing Undoing</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX223"><CODE>rl_bind_key</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC32">2.4.3 Binding Keys</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX225"><CODE>rl_bind_key_if_unbound</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC32">2.4.3 Binding Keys</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX226"><CODE>rl_bind_key_if_unbound_in_map</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC32">2.4.3 Binding Keys</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX224"><CODE>rl_bind_key_in_map</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC32">2.4.3 Binding Keys</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX231"><CODE>rl_bind_keyseq</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC32">2.4.3 Binding Keys</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX234"><CODE>rl_bind_keyseq_if_unbound</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC32">2.4.3 Binding Keys</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX235"><CODE>rl_bind_keyseq_if_unbound_in_map</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC32">2.4.3 Binding Keys</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX232"><CODE>rl_bind_keyseq_in_map</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC32">2.4.3 Binding Keys</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX208">rl_binding_keymap</A></TD><TD valign=top><A HREF="readline.html#SEC28">2.3 Readline Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX301"><CODE>rl_callback_handler_install</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC41">2.4.12 Alternate Interface</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX303"><CODE>rl_callback_handler_remove</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC41">2.4.12 Alternate Interface</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX302"><CODE>rl_callback_read_char</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC41">2.4.12 Alternate Interface</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX304">rl_catch_signals</A></TD><TD valign=top><A HREF="readline.html#SEC43">2.5 Readline Signal Handling</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX305">rl_catch_sigwinch</A></TD><TD valign=top><A HREF="readline.html#SEC43">2.5 Readline Signal Handling</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX329">rl_char_is_quoted_p</A></TD><TD valign=top><A HREF="readline.html#SEC47">2.6.3 Completion Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX306"><CODE>rl_cleanup_after_signal</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC43">2.5 Readline Signal Handling</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX261"><CODE>rl_clear_message</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC35">2.4.6 Redisplay</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX275"><CODE>rl_clear_pending_input</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC37">2.4.8 Character Input</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX314"><CODE>rl_clear_signals</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC43">2.5 Readline Signal Handling</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX315"><CODE>rl_complete</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC45">2.6.1 How Completing Works</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX318"><CODE>rl_complete</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC46">2.6.2 Completion Functions</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX317"><CODE>rl_complete_internal</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC46">2.6.2 Completion Functions</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX337">rl_completer_quote_characters</A></TD><TD valign=top><A HREF="readline.html#SEC47">2.6.3 Completion Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX335">rl_completer_word_break_characters</A></TD><TD valign=top><A HREF="readline.html#SEC47">2.6.3 Completion Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX341">rl_completion_append_character</A></TD><TD valign=top><A HREF="readline.html#SEC47">2.6.3 Completion Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX332">rl_completion_display_matches_hook</A></TD><TD valign=top><A HREF="readline.html#SEC47">2.6.3 Completion Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX316">rl_completion_entry_function</A></TD><TD valign=top><A HREF="readline.html#SEC45">2.6.1 How Completing Works</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX325">rl_completion_entry_function</A></TD><TD valign=top><A HREF="readline.html#SEC47">2.6.3 Completion Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX345">rl_completion_found_quote</A></TD><TD valign=top><A HREF="readline.html#SEC47">2.6.3 Completion Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX346">rl_completion_mark_symlink_dirs</A></TD><TD valign=top><A HREF="readline.html#SEC47">2.6.3 Completion Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX322"><CODE>rl_completion_matches</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC46">2.6.2 Completion Functions</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX321"><CODE>rl_completion_mode</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC46">2.6.2 Completion Functions</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX340">rl_completion_query_items</A></TD><TD valign=top><A HREF="readline.html#SEC47">2.6.3 Completion Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX343">rl_completion_quote_character</A></TD><TD valign=top><A HREF="readline.html#SEC47">2.6.3 Completion Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX342">rl_completion_suppress_append</A></TD><TD valign=top><A HREF="readline.html#SEC47">2.6.3 Completion Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX344">rl_completion_suppress_quote</A></TD><TD valign=top><A HREF="readline.html#SEC47">2.6.3 Completion Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX351">rl_completion_type</A></TD><TD valign=top><A HREF="readline.html#SEC47">2.6.3 Completion Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX336">rl_completion_word_break_hook</A></TD><TD valign=top><A HREF="readline.html#SEC47">2.6.3 Completion Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX216"><CODE>rl_copy_keymap</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC31">2.4.2 Selecting a Keymap</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX268"><CODE>rl_copy_text</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC36">2.4.7 Modifying Text</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX258"><CODE>rl_crlf</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC35">2.4.6 Redisplay</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX267"><CODE>rl_delete_text</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC36">2.4.7 Modifying Text</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX206">rl_deprep_term_function</A></TD><TD valign=top><A HREF="readline.html#SEC28">2.3 Readline Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX278"><CODE>rl_deprep_terminal</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC38">2.4.9 Terminal Management</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX285"><CODE>rl_ding</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC39">2.4.10 Utility Functions</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX331">rl_directory_completion_hook</A></TD><TD valign=top><A HREF="readline.html#SEC47">2.6.3 Completion Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX218"><CODE>rl_discard_keymap</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC31">2.4.2 Selecting a Keymap</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX187">rl_dispatching</A></TD><TD valign=top><A HREF="readline.html#SEC28">2.3 Readline Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX287"><CODE>rl_display_match_list</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC39">2.4.10 Utility Functions</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX251"><CODE>rl_do_undo</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC34">2.4.5 Allowing Undoing</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX184">rl_done</A></TD><TD valign=top><A HREF="readline.html#SEC28">2.3 Readline Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX213">rl_editing_mode</A></TD><TD valign=top><A HREF="readline.html#SEC28">2.3 Readline Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX182">rl_end</A></TD><TD valign=top><A HREF="readline.html#SEC28">2.3 Readline Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX248"><CODE>rl_end_undo_group</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC34">2.4.5 Allowing Undoing</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX188">rl_erase_empty_line</A></TD><TD valign=top><A HREF="readline.html#SEC28">2.3 Readline Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX202">rl_event_hook</A></TD><TD valign=top><A HREF="readline.html#SEC28">2.3 Readline Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX274"><CODE>rl_execute_next</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC37">2.4.8 Character Input</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX207">rl_executing_keymap</A></TD><TD valign=top><A HREF="readline.html#SEC28">2.3 Readline Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX209">rl_executing_macro</A></TD><TD valign=top><A HREF="readline.html#SEC28">2.3 Readline Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX264"><CODE>rl_expand_prompt</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC35">2.4.6 Redisplay</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX211">rl_explicit_arg</A></TD><TD valign=top><A HREF="readline.html#SEC28">2.3 Readline Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX283"><CODE>rl_extend_line_buffer</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC39">2.4.10 Utility Functions</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX348">rl_filename_completion_desired</A></TD><TD valign=top><A HREF="readline.html#SEC47">2.6.3 Completion Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX323"><CODE>rl_filename_completion_function</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC46">2.6.2 Completion Functions</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX328">rl_filename_dequoting_function</A></TD><TD valign=top><A HREF="readline.html#SEC47">2.6.3 Completion Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX338">rl_filename_quote_characters</A></TD><TD valign=top><A HREF="readline.html#SEC47">2.6.3 Completion Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX349">rl_filename_quoting_desired</A></TD><TD valign=top><A HREF="readline.html#SEC47">2.6.3 Completion Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX327">rl_filename_quoting_function</A></TD><TD valign=top><A HREF="readline.html#SEC47">2.6.3 Completion Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX254"><CODE>rl_forced_update_display</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC35">2.4.6 Redisplay</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX307"><CODE>rl_free_line_state</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC43">2.5 Readline Signal Handling</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX250"><CODE>rl_free_undo_list</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC34">2.4.5 Allowing Undoing</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX243"><CODE>rl_function_dumper</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC33">2.4.4 Associating Function Names and Bindings</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX240"><CODE>rl_function_of_keyseq</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC33">2.4.4 Associating Function Names and Bindings</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX245"><CODE>rl_funmap_names</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC33">2.4.4 Associating Function Names and Bindings</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX236"><CODE>rl_generic_bind</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC32">2.4.3 Binding Keys</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX219"><CODE>rl_get_keymap</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC31">2.4.2 Selecting a Keymap</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX221"><CODE>rl_get_keymap_by_name</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC31">2.4.2 Selecting a Keymap</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX222"><CODE>rl_get_keymap_name</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC31">2.4.2 Selecting a Keymap</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX311"><CODE>rl_get_screen_size</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC43">2.5 Readline Signal Handling</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX300"><CODE>rl_get_termcap</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC40">2.4.11 Miscellaneous Functions</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX272"><CODE>rl_getc</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC37">2.4.8 Character Input</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX203">rl_getc_function</A></TD><TD valign=top><A HREF="readline.html#SEC28">2.3 Readline Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX193">rl_gnu_readline_p</A></TD><TD valign=top><A HREF="readline.html#SEC28">2.3 Readline Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX347">rl_ignore_completion_duplicates</A></TD><TD valign=top><A HREF="readline.html#SEC47">2.6.3 Completion Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX330">rl_ignore_some_completions_function</A></TD><TD valign=top><A HREF="readline.html#SEC47">2.6.3 Completion Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX352">rl_inhibit_completion</A></TD><TD valign=top><A HREF="readline.html#SEC47">2.6.3 Completion Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX284"><CODE>rl_initialize</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC39">2.4.10 Utility Functions</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX320"><CODE>rl_insert_completions</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC46">2.6.2 Completion Functions</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX266"><CODE>rl_insert_text</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC36">2.4.7 Modifying Text</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX196">rl_instream</A></TD><TD valign=top><A HREF="readline.html#SEC28">2.3 Readline Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX241"><CODE>rl_invoking_keyseqs</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC33">2.4.4 Associating Function Names and Bindings</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX242"><CODE>rl_invoking_keyseqs_in_map</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC33">2.4.4 Associating Function Names and Bindings</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX269"><CODE>rl_kill_text</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC36">2.4.7 Modifying Text</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX199">rl_last_func</A></TD><TD valign=top><A HREF="readline.html#SEC28">2.3 Readline Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX191">rl_library_version</A></TD><TD valign=top><A HREF="readline.html#SEC28">2.3 Readline Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX180">rl_line_buffer</A></TD><TD valign=top><A HREF="readline.html#SEC28">2.3 Readline Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX244"><CODE>rl_list_funmap_names</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC33">2.4.4 Associating Function Names and Bindings</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX294"><CODE>rl_macro_bind</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC40">2.4.11 Miscellaneous Functions</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX295"><CODE>rl_macro_dumper</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC40">2.4.11 Miscellaneous Functions</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX215"><CODE>rl_make_bare_keymap</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC31">2.4.2 Selecting a Keymap</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX217"><CODE>rl_make_keymap</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC31">2.4.2 Selecting a Keymap</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX183">rl_mark</A></TD><TD valign=top><A HREF="readline.html#SEC28">2.3 Readline Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX260"><CODE>rl_message</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC35">2.4.6 Redisplay</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX252"><CODE>rl_modifying</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC34">2.4.5 Allowing Undoing</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX239"><CODE>rl_named_function</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC33">2.4.4 Associating Function Names and Bindings</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX185">rl_num_chars_to_read</A></TD><TD valign=top><A HREF="readline.html#SEC28">2.3 Readline Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX212">rl_numeric_arg</A></TD><TD valign=top><A HREF="readline.html#SEC28">2.3 Readline Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX255"><CODE>rl_on_new_line</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC35">2.4.6 Redisplay</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX256"><CODE>rl_on_new_line_with_prompt</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC35">2.4.6 Redisplay</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX197">rl_outstream</A></TD><TD valign=top><A HREF="readline.html#SEC28">2.3 Readline Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX237"><CODE>rl_parse_and_bind</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC32">2.4.3 Binding Keys</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX186">rl_pending_input</A></TD><TD valign=top><A HREF="readline.html#SEC28">2.3 Readline Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX181">rl_point</A></TD><TD valign=top><A HREF="readline.html#SEC28">2.3 Readline Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX319"><CODE>rl_possible_completions</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC46">2.6.2 Completion Functions</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX201">rl_pre_input_hook</A></TD><TD valign=top><A HREF="readline.html#SEC28">2.3 Readline Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX198">rl_prefer_env_winsize</A></TD><TD valign=top><A HREF="readline.html#SEC28">2.3 Readline Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX205">rl_prep_term_function</A></TD><TD valign=top><A HREF="readline.html#SEC28">2.3 Readline Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX277"><CODE>rl_prep_terminal</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC38">2.4.9 Terminal Management</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX189">rl_prompt</A></TD><TD valign=top><A HREF="readline.html#SEC28">2.3 Readline Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX270"><CODE>rl_push_macro_input</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC36">2.4.7 Modifying Text</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX238"><CODE>rl_read_init_file</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC32">2.4.3 Binding Keys</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX271"><CODE>rl_read_key</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC37">2.4.8 Character Input</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX195">rl_readline_name</A></TD><TD valign=top><A HREF="readline.html#SEC28">2.3 Readline Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX210">rl_readline_state</A></TD><TD valign=top><A HREF="readline.html#SEC28">2.3 Readline Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX192">rl_readline_version</A></TD><TD valign=top><A HREF="readline.html#SEC28">2.3 Readline Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX253"><CODE>rl_redisplay</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC35">2.4.6 Redisplay</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX204">rl_redisplay_function</A></TD><TD valign=top><A HREF="readline.html#SEC28">2.3 Readline Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX282"><CODE>rl_replace_line</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC39">2.4.10 Utility Functions</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX308"><CODE>rl_reset_after_signal</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC43">2.5 Readline Signal Handling</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX257"><CODE>rl_reset_line_state</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC35">2.4.6 Redisplay</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX312"><CODE>rl_reset_screen_size</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC43">2.5 Readline Signal Handling</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX281"><CODE>rl_reset_terminal</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC38">2.4.9 Terminal Management</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX309"><CODE>rl_resize_terminal</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC43">2.5 Readline Signal Handling</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX263"><CODE>rl_restore_prompt</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC35">2.4.6 Redisplay</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX262"><CODE>rl_save_prompt</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC35">2.4.6 Redisplay</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX233"><CODE>rl_set_key</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC32">2.4.3 Binding Keys</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX276"><CODE>rl_set_keyboard_input_timeout</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC37">2.4.8 Character Input</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX220"><CODE>rl_set_keymap</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC31">2.4.2 Selecting a Keymap</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX299"><CODE>rl_set_paren_blink_timeout</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC40">2.4.11 Miscellaneous Functions</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX265"><CODE>rl_set_prompt</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC35">2.4.6 Redisplay</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX310"><CODE>rl_set_screen_size</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC43">2.5 Readline Signal Handling</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX313"><CODE>rl_set_signals</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC43">2.5 Readline Signal Handling</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX259"><CODE>rl_show_char</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC35">2.4.6 Redisplay</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX339">rl_special_prefixes</A></TD><TD valign=top><A HREF="readline.html#SEC47">2.6.3 Completion Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX200">rl_startup_hook</A></TD><TD valign=top><A HREF="readline.html#SEC28">2.3 Readline Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX273"><CODE>rl_stuff_char</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC37">2.4.8 Character Input</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX194">rl_terminal_name</A></TD><TD valign=top><A HREF="readline.html#SEC28">2.3 Readline Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX279"><CODE>rl_tty_set_default_bindings</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC38">2.4.9 Terminal Management</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX280"><CODE>rl_tty_unset_default_bindings</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC38">2.4.9 Terminal Management</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX230"><CODE>rl_unbind_command_in_map</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC32">2.4.3 Binding Keys</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX229"><CODE>rl_unbind_function_in_map</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC32">2.4.3 Binding Keys</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX227"><CODE>rl_unbind_key</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC32">2.4.3 Binding Keys</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX228"><CODE>rl_unbind_key_in_map</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC32">2.4.3 Binding Keys</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX324"><CODE>rl_username_completion_function</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC46">2.6.2 Completion Functions</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX296"><CODE>rl_variable_bind</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC40">2.4.11 Miscellaneous Functions</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX298"><CODE>rl_variable_dumper</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC40">2.4.11 Miscellaneous Functions</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX297"><CODE>rl_variable_value</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC40">2.4.11 Miscellaneous Functions</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="fn_S"></A>S</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX80"><CODE>self-insert (a, b, A, 1, !, &#60;small&#62;...&#60;/small&#62;)</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC16">1.4.3 Commands For Changing Text</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX81"><CODE>self-insert (a, b, A, 1, !, &#60;small&#62;...&#60;/small&#62;)</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC16">1.4.3 Commands For Changing Text</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX158"><CODE>set-mark (C-@)</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC21">1.4.8 Some Miscellaneous Commands</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX159"><CODE>set-mark (C-@)</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC21">1.4.8 Some Miscellaneous Commands</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX25">show-all-if-ambiguous</A></TD><TD valign=top><A HREF="readline.html#SEC10">1.3.1 Readline Init File Syntax</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX26">show-all-if-unmodified</A></TD><TD valign=top><A HREF="readline.html#SEC10">1.3.1 Readline Init File Syntax</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX138"><CODE>start-kbd-macro (C-x ()</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC20">1.4.7 Keyboard Macros</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX139"><CODE>start-kbd-macro (C-x ()</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC20">1.4.7 Keyboard Macros</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="fn_T"></A>T</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX78"><CODE>tab-insert (M-<KBD>TAB</KBD>)</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC16">1.4.3 Commands For Changing Text</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX79"><CODE>tab-insert (M-<KBD>TAB</KBD>)</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC16">1.4.3 Commands For Changing Text</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX156"><CODE>tilde-expand (M-~)</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC21">1.4.8 Some Miscellaneous Commands</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX157"><CODE>tilde-expand (M-~)</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC21">1.4.8 Some Miscellaneous Commands</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX82"><CODE>transpose-chars (C-t)</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC16">1.4.3 Commands For Changing Text</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX83"><CODE>transpose-chars (C-t)</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC16">1.4.3 Commands For Changing Text</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX84"><CODE>transpose-words (M-t)</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC16">1.4.3 Commands For Changing Text</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX85"><CODE>transpose-words (M-t)</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC16">1.4.3 Commands For Changing Text</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="fn_U"></A>U</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX152"><CODE>undo (C-_ or C-x C-u)</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC21">1.4.8 Some Miscellaneous Commands</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX153"><CODE>undo (C-_ or C-x C-u)</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC21">1.4.8 Some Miscellaneous Commands</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX126"><CODE>universal-argument ()</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC18">1.4.5 Specifying Numeric Arguments</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX127"><CODE>universal-argument ()</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC18">1.4.5 Specifying Numeric Arguments</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX108"><CODE>unix-filename-rubout ()</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC17">1.4.4 Killing And Yanking</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX109"><CODE>unix-filename-rubout ()</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC17">1.4.4 Killing And Yanking</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX98"><CODE>unix-line-discard (C-u)</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC17">1.4.4 Killing And Yanking</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX99"><CODE>unix-line-discard (C-u)</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC17">1.4.4 Killing And Yanking</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX106"><CODE>unix-word-rubout (C-w)</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC17">1.4.4 Killing And Yanking</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX107"><CODE>unix-word-rubout (C-w)</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC17">1.4.4 Killing And Yanking</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX86"><CODE>upcase-word (M-u)</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC16">1.4.3 Commands For Changing Text</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX87"><CODE>upcase-word (M-u)</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC16">1.4.3 Commands For Changing Text</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="fn_V"></A>V</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX176"><CODE>vi-editing-mode (M-C-j)</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC21">1.4.8 Some Miscellaneous Commands</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX177"><CODE>vi-editing-mode (M-C-j)</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC21">1.4.8 Some Miscellaneous Commands</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX27">visible-stats</A></TD><TD valign=top><A HREF="readline.html#SEC10">1.3.1 Readline Init File Syntax</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="fn_Y"></A>Y</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX120"><CODE>yank (C-y)</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC17">1.4.4 Killing And Yanking</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX121"><CODE>yank (C-y)</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC17">1.4.4 Killing And Yanking</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX68"><CODE>yank-last-arg (M-. or M-_)</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC15">1.4.2 Commands For Manipulating The History</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX69"><CODE>yank-last-arg (M-. or M-_)</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC15">1.4.2 Commands For Manipulating The History</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX66"><CODE>yank-nth-arg (M-C-y)</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC15">1.4.2 Commands For Manipulating The History</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX67"><CODE>yank-nth-arg (M-C-y)</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC15">1.4.2 Commands For Manipulating The History</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX122"><CODE>yank-pop (M-y)</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC17">1.4.4 Killing And Yanking</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX123"><CODE>yank-pop (M-y)</CODE></A></TD><TD valign=top><A HREF="readline.html#SEC17">1.4.4 Killing And Yanking</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+</TABLE><P></P><table><tr><th valign=top>Jump to: &nbsp; </th><td><A HREF="readline.html#fn__" style="text-decoration:none"><b>_</b></A>
+ &nbsp; 
+<BR>
+<A HREF="readline.html#fn_A" style="text-decoration:none"><b>A</b></A>
+ &nbsp; 
+<A HREF="readline.html#fn_B" style="text-decoration:none"><b>B</b></A>
+ &nbsp; 
+<A HREF="readline.html#fn_C" style="text-decoration:none"><b>C</b></A>
+ &nbsp; 
+<A HREF="readline.html#fn_D" style="text-decoration:none"><b>D</b></A>
+ &nbsp; 
+<A HREF="readline.html#fn_E" style="text-decoration:none"><b>E</b></A>
+ &nbsp; 
+<A HREF="readline.html#fn_F" style="text-decoration:none"><b>F</b></A>
+ &nbsp; 
+<A HREF="readline.html#fn_H" style="text-decoration:none"><b>H</b></A>
+ &nbsp; 
+<A HREF="readline.html#fn_I" style="text-decoration:none"><b>I</b></A>
+ &nbsp; 
+<A HREF="readline.html#fn_K" style="text-decoration:none"><b>K</b></A>
+ &nbsp; 
+<A HREF="readline.html#fn_M" style="text-decoration:none"><b>M</b></A>
+ &nbsp; 
+<A HREF="readline.html#fn_N" style="text-decoration:none"><b>N</b></A>
+ &nbsp; 
+<A HREF="readline.html#fn_O" style="text-decoration:none"><b>O</b></A>
+ &nbsp; 
+<A HREF="readline.html#fn_P" style="text-decoration:none"><b>P</b></A>
+ &nbsp; 
+<A HREF="readline.html#fn_Q" style="text-decoration:none"><b>Q</b></A>
+ &nbsp; 
+<A HREF="readline.html#fn_R" style="text-decoration:none"><b>R</b></A>
+ &nbsp; 
+<A HREF="readline.html#fn_S" style="text-decoration:none"><b>S</b></A>
+ &nbsp; 
+<A HREF="readline.html#fn_T" style="text-decoration:none"><b>T</b></A>
+ &nbsp; 
+<A HREF="readline.html#fn_U" style="text-decoration:none"><b>U</b></A>
+ &nbsp; 
+<A HREF="readline.html#fn_V" style="text-decoration:none"><b>V</b></A>
+ &nbsp; 
+<A HREF="readline.html#fn_Y" style="text-decoration:none"><b>Y</b></A>
+ &nbsp; 
+</td></tr></table><br><P>
+
+<HR SIZE="6">
+<A NAME="SEC_Contents"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC52">Index</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H1>Table of Contents</H1>
+<UL>
+<A NAME="TOC1" HREF="readline.html#SEC1">1. Command Line Editing</A>
+<BR>
+<UL>
+<A NAME="TOC2" HREF="readline.html#SEC2">1.1 Introduction to Line Editing</A>
+<BR>
+<A NAME="TOC3" HREF="readline.html#SEC3">1.2 Readline Interaction</A>
+<BR>
+<UL>
+<A NAME="TOC4" HREF="readline.html#SEC4">1.2.1 Readline Bare Essentials</A>
+<BR>
+<A NAME="TOC5" HREF="readline.html#SEC5">1.2.2 Readline Movement Commands</A>
+<BR>
+<A NAME="TOC6" HREF="readline.html#SEC6">1.2.3 Readline Killing Commands</A>
+<BR>
+<A NAME="TOC7" HREF="readline.html#SEC7">1.2.4 Readline Arguments</A>
+<BR>
+<A NAME="TOC8" HREF="readline.html#SEC8">1.2.5 Searching for Commands in the History</A>
+<BR>
+</UL>
+<A NAME="TOC9" HREF="readline.html#SEC9">1.3 Readline Init File</A>
+<BR>
+<UL>
+<A NAME="TOC10" HREF="readline.html#SEC10">1.3.1 Readline Init File Syntax</A>
+<BR>
+<A NAME="TOC11" HREF="readline.html#SEC11">1.3.2 Conditional Init Constructs</A>
+<BR>
+<A NAME="TOC12" HREF="readline.html#SEC12">1.3.3 Sample Init File</A>
+<BR>
+</UL>
+<A NAME="TOC13" HREF="readline.html#SEC13">1.4 Bindable Readline Commands</A>
+<BR>
+<UL>
+<A NAME="TOC14" HREF="readline.html#SEC14">1.4.1 Commands For Moving</A>
+<BR>
+<A NAME="TOC15" HREF="readline.html#SEC15">1.4.2 Commands For Manipulating The History</A>
+<BR>
+<A NAME="TOC16" HREF="readline.html#SEC16">1.4.3 Commands For Changing Text</A>
+<BR>
+<A NAME="TOC17" HREF="readline.html#SEC17">1.4.4 Killing And Yanking</A>
+<BR>
+<A NAME="TOC18" HREF="readline.html#SEC18">1.4.5 Specifying Numeric Arguments</A>
+<BR>
+<A NAME="TOC19" HREF="readline.html#SEC19">1.4.6 Letting Readline Type For You</A>
+<BR>
+<A NAME="TOC20" HREF="readline.html#SEC20">1.4.7 Keyboard Macros</A>
+<BR>
+<A NAME="TOC21" HREF="readline.html#SEC21">1.4.8 Some Miscellaneous Commands</A>
+<BR>
+</UL>
+<A NAME="TOC22" HREF="readline.html#SEC22">1.5 Readline vi Mode</A>
+<BR>
+</UL>
+<A NAME="TOC23" HREF="readline.html#SEC23">2. Programming with GNU Readline</A>
+<BR>
+<UL>
+<A NAME="TOC24" HREF="readline.html#SEC24">2.1 Basic Behavior</A>
+<BR>
+<A NAME="TOC25" HREF="readline.html#SEC25">2.2 Custom Functions</A>
+<BR>
+<UL>
+<A NAME="TOC26" HREF="readline.html#SEC26">2.2.1 Readline Typedefs</A>
+<BR>
+<A NAME="TOC27" HREF="readline.html#SEC27">2.2.2 Writing a New Function</A>
+<BR>
+</UL>
+<A NAME="TOC28" HREF="readline.html#SEC28">2.3 Readline Variables</A>
+<BR>
+<A NAME="TOC29" HREF="readline.html#SEC29">2.4 Readline Convenience Functions</A>
+<BR>
+<UL>
+<A NAME="TOC30" HREF="readline.html#SEC30">2.4.1 Naming a Function</A>
+<BR>
+<A NAME="TOC31" HREF="readline.html#SEC31">2.4.2 Selecting a Keymap</A>
+<BR>
+<A NAME="TOC32" HREF="readline.html#SEC32">2.4.3 Binding Keys</A>
+<BR>
+<A NAME="TOC33" HREF="readline.html#SEC33">2.4.4 Associating Function Names and Bindings</A>
+<BR>
+<A NAME="TOC34" HREF="readline.html#SEC34">2.4.5 Allowing Undoing</A>
+<BR>
+<A NAME="TOC35" HREF="readline.html#SEC35">2.4.6 Redisplay</A>
+<BR>
+<A NAME="TOC36" HREF="readline.html#SEC36">2.4.7 Modifying Text</A>
+<BR>
+<A NAME="TOC37" HREF="readline.html#SEC37">2.4.8 Character Input</A>
+<BR>
+<A NAME="TOC38" HREF="readline.html#SEC38">2.4.9 Terminal Management</A>
+<BR>
+<A NAME="TOC39" HREF="readline.html#SEC39">2.4.10 Utility Functions</A>
+<BR>
+<A NAME="TOC40" HREF="readline.html#SEC40">2.4.11 Miscellaneous Functions</A>
+<BR>
+<A NAME="TOC41" HREF="readline.html#SEC41">2.4.12 Alternate Interface</A>
+<BR>
+<A NAME="TOC42" HREF="readline.html#SEC42">2.4.13 A Readline Example</A>
+<BR>
+</UL>
+<A NAME="TOC43" HREF="readline.html#SEC43">2.5 Readline Signal Handling</A>
+<BR>
+<A NAME="TOC44" HREF="readline.html#SEC44">2.6 Custom Completers</A>
+<BR>
+<UL>
+<A NAME="TOC45" HREF="readline.html#SEC45">2.6.1 How Completing Works</A>
+<BR>
+<A NAME="TOC46" HREF="readline.html#SEC46">2.6.2 Completion Functions</A>
+<BR>
+<A NAME="TOC47" HREF="readline.html#SEC47">2.6.3 Completion Variables</A>
+<BR>
+<A NAME="TOC48" HREF="readline.html#SEC48">2.6.4 A Short Completion Example</A>
+<BR>
+</UL>
+</UL>
+<A NAME="TOC49" HREF="readline.html#SEC49">A. Copying This Manual</A>
+<BR>
+<UL>
+<A NAME="TOC50" HREF="readline.html#SEC50">A.1 GNU Free Documentation License</A>
+<BR>
+<UL>
+<A NAME="TOC51" HREF="readline.html#SEC51">A.1.1 ADDENDUM: How to use this License for your documents</A>
+<BR>
+</UL>
+</UL>
+<A NAME="TOC52" HREF="readline.html#SEC52">Concept Index</A>
+<BR>
+<A NAME="TOC53" HREF="readline.html#SEC53">Function and Variable Index</A>
+<BR>
+</UL>
+<HR SIZE=1>
+<A NAME="SEC_OVERVIEW"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC52">Index</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H1>Short Table of Contents</H1>
+<BLOCKQUOTE>
+<A NAME="TOC1" HREF="readline.html#SEC1">1. Command Line Editing</A>
+<BR>
+<A NAME="TOC23" HREF="readline.html#SEC23">2. Programming with GNU Readline</A>
+<BR>
+<A NAME="TOC49" HREF="readline.html#SEC49">A. Copying This Manual</A>
+<BR>
+<A NAME="TOC52" HREF="readline.html#SEC52">Concept Index</A>
+<BR>
+<A NAME="TOC53" HREF="readline.html#SEC53">Function and Variable Index</A>
+<BR>
+
+</BLOCKQUOTE>
+<HR SIZE=1>
+<A NAME="SEC_About"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC52">Index</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H1>About this document</H1>
+This document was generated by <I>Chet Ramey</I> on <I>July, 6  2006</I>
+using <A HREF="http://www.mathematik.uni-kl.de/~obachman/Texi2html
+"><I>texi2html</I></A>
+<P></P>  
+The buttons in the navigation panels have the following meaning:
+<P></P>
+<table border = "1">
+<TR>
+<TH> Button </TH>
+<TH> Name </TH>
+<TH> Go to </TH>
+<TH> From 1.2.3 go to</TH>
+</TR>
+<TR>
+<TD ALIGN="CENTER">
+ [ &lt; ] </TD>
+<TD ALIGN="CENTER">
+Back
+</TD>
+<TD>
+previous section in reading order
+</TD>
+<TD>
+1.2.2
+</TD>
+</TR>
+<TR>
+<TD ALIGN="CENTER">
+ [ &gt; ] </TD>
+<TD ALIGN="CENTER">
+Forward
+</TD>
+<TD>
+next section in reading order
+</TD>
+<TD>
+1.2.4
+</TD>
+</TR>
+<TR>
+<TD ALIGN="CENTER">
+ [ &lt;&lt; ] </TD>
+<TD ALIGN="CENTER">
+FastBack
+</TD>
+<TD>
+previous or up-and-previous section 
+</TD>
+<TD>
+1.1
+</TD>
+</TR>
+<TR>
+<TD ALIGN="CENTER">
+ [ Up ] </TD>
+<TD ALIGN="CENTER">
+Up
+</TD>
+<TD>
+up section
+</TD>
+<TD>
+1.2
+</TD>
+</TR>
+<TR>
+<TD ALIGN="CENTER">
+ [ &gt;&gt; ] </TD>
+<TD ALIGN="CENTER">
+FastForward
+</TD>
+<TD>
+next or up-and-next section
+</TD>
+<TD>
+1.3
+</TD>
+</TR>
+<TR>
+<TD ALIGN="CENTER">
+ [Top] </TD>
+<TD ALIGN="CENTER">
+Top
+</TD>
+<TD>
+cover (top) of document
+</TD>
+<TD>
+ &nbsp; 
+</TD>
+</TR>
+<TR>
+<TD ALIGN="CENTER">
+ [Contents] </TD>
+<TD ALIGN="CENTER">
+Contents
+</TD>
+<TD>
+table of contents
+</TD>
+<TD>
+ &nbsp; 
+</TD>
+</TR>
+<TR>
+<TD ALIGN="CENTER">
+ [Index] </TD>
+<TD ALIGN="CENTER">
+Index
+</TD>
+<TD>
+concept index
+</TD>
+<TD>
+ &nbsp; 
+</TD>
+</TR>
+<TR>
+<TD ALIGN="CENTER">
+ [ ? ] </TD>
+<TD ALIGN="CENTER">
+About
+</TD>
+<TD>
+this page
+</TD>
+<TD>
+ &nbsp; 
+</TD>
+</TR>
+</TABLE>
+<P></P>
+where the <STRONG> Example </STRONG> assumes that the current position 
+is at <STRONG> Subsubsection One-Two-Three </STRONG> of a document of 
+the following structure:
+<UL>
+<LI> 1. Section One  </LI>
+<UL>
+<LI>1.1 Subsection One-One</LI>
+<UL>
+<LI> ... </LI>
+</UL>
+<LI>1.2 Subsection One-Two</LI>
+<UL>
+<LI>1.2.1 Subsubsection One-Two-One
+</LI><LI>1.2.2 Subsubsection One-Two-Two
+</LI><LI>1.2.3 Subsubsection One-Two-Three &nbsp; &nbsp; <STRONG>
+&lt;== Current Position </STRONG>
+</LI><LI>1.2.4 Subsubsection One-Two-Four
+</LI></UL>
+<LI>1.3 Subsection One-Three</LI>
+<UL>
+<LI> ... </LI>
+</UL>
+<LI>1.4 Subsection One-Four</LI>
+</UL>
+</UL>
+
+<HR SIZE=1>
+<BR>  
+<FONT SIZE="-1">
+This document was generated
+by <I>Chet Ramey</I> on <I>July, 6  2006</I>
+using <A HREF="http://www.mathematik.uni-kl.de/~obachman/Texi2html
+"><I>texi2html</I></A>
+
+</BODY>
+</HTML>
diff --git a/doc/readline.info b/doc/readline.info
new file mode 100644 (file)
index 0000000..dc6ee90
--- /dev/null
@@ -0,0 +1,4403 @@
+This is readline.info, produced by makeinfo version 4.7 from
+/Users/chet/src/bash/readline-src/doc/rlman.texi.
+
+   This manual describes the GNU Readline Library (version 5.2, 26
+April 2006), a library which aids in the consistency of user interface
+across discrete programs which provide a command line interface.
+
+   Copyright (C) 1988-2006 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.
+
+     Permission is granted to copy, distribute and/or modify this
+     document under the terms of the GNU Free Documentation License,
+     Version 1.2 or any later version published by the Free Software
+     Foundation; with no Invariant Sections, with the Front-Cover texts
+     being "A GNU Manual," and with the Back-Cover Texts as in (a)
+     below.  A copy of the license is included in the section entitled
+     "GNU Free Documentation License."
+
+     (a) The FSF's Back-Cover Text is: "You have freedom to copy and
+     modify this GNU Manual, like GNU software.  Copies published by
+     the Free Software Foundation raise funds for GNU development."
+
+INFO-DIR-SECTION Libraries
+START-INFO-DIR-ENTRY
+* Readline: (readline).       The GNU readline library API.
+END-INFO-DIR-ENTRY
+
+\1f
+File: readline.info,  Node: Top,  Next: Command Line Editing,  Up: (dir)
+
+GNU Readline Library
+********************
+
+This document describes the GNU Readline Library, a utility which aids
+in the consistency of user interface across discrete programs which
+provide a command line interface.
+
+* Menu:
+
+* Command Line Editing::          GNU Readline User's Manual.
+* Programming with GNU Readline::  GNU Readline Programmer's Manual.
+* Copying This Manual::                   Copying this manual.
+* Concept Index::                 Index of concepts described in this manual.
+* Function and Variable Index::           Index of externally visible functions
+                                  and variables.
+
+\1f
+File: readline.info,  Node: Command Line Editing,  Next: Programming with GNU Readline,  Prev: Top,  Up: Top
+
+1 Command Line Editing
+**********************
+
+This chapter describes the basic features of the GNU command line
+editing interface.
+
+* Menu:
+
+* Introduction and Notation::  Notation used in this text.
+* Readline Interaction::       The minimum set of commands for editing a line.
+* Readline Init File::         Customizing Readline from a user's view.
+* Bindable Readline Commands:: A description of most of the Readline commands
+                               available for binding
+* Readline vi Mode::           A short description of how to make Readline
+                               behave like the vi editor.
+
+\1f
+File: readline.info,  Node: Introduction and Notation,  Next: Readline Interaction,  Up: Command Line Editing
+
+1.1 Introduction to Line Editing
+================================
+
+The following paragraphs describe the notation used to represent
+keystrokes.
+
+   The text `C-k' is read as `Control-K' and describes the character
+produced when the <k> key is pressed while the Control key is depressed.
+
+   The text `M-k' is read as `Meta-K' and describes the character
+produced when the Meta key (if you have one) is depressed, and the <k>
+key is pressed.  The Meta key is labeled <ALT> on many keyboards.  On
+keyboards with two keys labeled <ALT> (usually to either side of the
+space bar), the <ALT> on the left side is generally set to work as a
+Meta key.  The <ALT> key on the right may also be configured to work as
+a Meta key or may be configured as some other modifier, such as a
+Compose key for typing accented characters.
+
+   If you do not have a Meta or <ALT> key, or another key working as a
+Meta key, the identical keystroke can be generated by typing <ESC>
+_first_, and then typing <k>.  Either process is known as "metafying"
+the <k> key.
+
+   The text `M-C-k' is read as `Meta-Control-k' and describes the
+character produced by "metafying" `C-k'.
+
+   In addition, several keys have their own names.  Specifically,
+<DEL>, <ESC>, <LFD>, <SPC>, <RET>, and <TAB> all stand for themselves
+when seen in this text, or in an init file (*note Readline Init File::).
+If your keyboard lacks a <LFD> key, typing <C-j> will produce the
+desired character.  The <RET> key may be labeled <Return> or <Enter> on
+some keyboards.
+
+\1f
+File: readline.info,  Node: Readline Interaction,  Next: Readline Init File,  Prev: Introduction and Notation,  Up: Command Line Editing
+
+1.2 Readline Interaction
+========================
+
+Often during an interactive session you type in a long line of text,
+only to notice that the first word on the line is misspelled.  The
+Readline library gives you a set of commands for manipulating the text
+as you type it in, allowing you to just fix your typo, and not forcing
+you to retype the majority of the line.  Using these editing commands,
+you move the cursor to the place that needs correction, and delete or
+insert the text of the corrections.  Then, when you are satisfied with
+the line, you simply press <RET>.  You do not have to be at the end of
+the line to press <RET>; the entire line is accepted regardless of the
+location of the cursor within the line.
+
+* Menu:
+
+* Readline Bare Essentials::   The least you need to know about Readline.
+* Readline Movement Commands:: Moving about the input line.
+* Readline Killing Commands::  How to delete text, and how to get it back!
+* Readline Arguments::         Giving numeric arguments to commands.
+* Searching::                  Searching through previous lines.
+
+\1f
+File: readline.info,  Node: Readline Bare Essentials,  Next: Readline Movement Commands,  Up: Readline Interaction
+
+1.2.1 Readline Bare Essentials
+------------------------------
+
+In order to enter characters into the line, simply type them.  The typed
+character appears where the cursor was, and then the cursor moves one
+space to the right.  If you mistype a character, you can use your erase
+character to back up and delete the mistyped character.
+
+   Sometimes you may mistype a character, and not notice the error
+until you have typed several other characters.  In that case, you can
+type `C-b' to move the cursor to the left, and then correct your
+mistake.  Afterwards, you can move the cursor to the right with `C-f'.
+
+   When you add text in the middle of a line, you will notice that
+characters to the right of the cursor are `pushed over' to make room
+for the text that you have inserted.  Likewise, when you delete text
+behind the cursor, characters to the right of the cursor are `pulled
+back' to fill in the blank space created by the removal of the text.  A
+list of the bare essentials for editing the text of an input line
+follows.
+
+`C-b'
+     Move back one character.
+
+`C-f'
+     Move forward one character.
+
+<DEL> or <Backspace>
+     Delete the character to the left of the cursor.
+
+`C-d'
+     Delete the character underneath the cursor.
+
+Printing characters
+     Insert the character into the line at the cursor.
+
+`C-_' or `C-x C-u'
+     Undo the last editing command.  You can undo all the way back to an
+     empty line.
+
+(Depending on your configuration, the <Backspace> key be set to delete
+the character to the left of the cursor and the <DEL> key set to delete
+the character underneath the cursor, like `C-d', rather than the
+character to the left of the cursor.)
+
+\1f
+File: readline.info,  Node: Readline Movement Commands,  Next: Readline Killing Commands,  Prev: Readline Bare Essentials,  Up: Readline Interaction
+
+1.2.2 Readline Movement Commands
+--------------------------------
+
+The above table describes the most basic keystrokes that you need in
+order to do editing of the input line.  For your convenience, many
+other commands have been added in addition to `C-b', `C-f', `C-d', and
+<DEL>.  Here are some commands for moving more rapidly about the line.
+
+`C-a'
+     Move to the start of the line.
+
+`C-e'
+     Move to the end of the line.
+
+`M-f'
+     Move forward a word, where a word is composed of letters and
+     digits.
+
+`M-b'
+     Move backward a word.
+
+`C-l'
+     Clear the screen, reprinting the current line at the top.
+
+   Notice how `C-f' moves forward a character, while `M-f' moves
+forward a word.  It is a loose convention that control keystrokes
+operate on characters while meta keystrokes operate on words.
+
+\1f
+File: readline.info,  Node: Readline Killing Commands,  Next: Readline Arguments,  Prev: Readline Movement Commands,  Up: Readline Interaction
+
+1.2.3 Readline Killing Commands
+-------------------------------
+
+"Killing" text means to delete the text from the line, but to save it
+away for later use, usually by "yanking" (re-inserting) it back into
+the line.  (`Cut' and `paste' are more recent jargon for `kill' and
+`yank'.)
+
+   If the description for a command says that it `kills' text, then you
+can be sure that you can get the text back in a different (or the same)
+place later.
+
+   When you use a kill command, the text is saved in a "kill-ring".
+Any number of consecutive kills save all of the killed text together, so
+that when you yank it back, you get it all.  The kill ring is not line
+specific; the text that you killed on a previously typed line is
+available to be yanked back later, when you are typing another line.  
+
+   Here is the list of commands for killing text.
+
+`C-k'
+     Kill the text from the current cursor position to the end of the
+     line.
+
+`M-d'
+     Kill from the cursor to the end of the current word, or, if between
+     words, to the end of the next word.  Word boundaries are the same
+     as those used by `M-f'.
+
+`M-<DEL>'
+     Kill from the cursor the start of the current word, or, if between
+     words, to the start of the previous word.  Word boundaries are the
+     same as those used by `M-b'.
+
+`C-w'
+     Kill from the cursor to the previous whitespace.  This is
+     different than `M-<DEL>' because the word boundaries differ.
+
+
+   Here is how to "yank" the text back into the line.  Yanking means to
+copy the most-recently-killed text from the kill buffer.
+
+`C-y'
+     Yank the most recently killed text back into the buffer at the
+     cursor.
+
+`M-y'
+     Rotate the kill-ring, and yank the new top.  You can only do this
+     if the prior command is `C-y' or `M-y'.
+
+\1f
+File: readline.info,  Node: Readline Arguments,  Next: Searching,  Prev: Readline Killing Commands,  Up: Readline Interaction
+
+1.2.4 Readline Arguments
+------------------------
+
+You can pass numeric arguments to Readline commands.  Sometimes the
+argument acts as a repeat count, other times it is the sign of the
+argument that is significant.  If you pass a negative argument to a
+command which normally acts in a forward direction, that command will
+act in a backward direction.  For example, to kill text back to the
+start of the line, you might type `M-- C-k'.
+
+   The general way to pass numeric arguments to a command is to type
+meta digits before the command.  If the first `digit' typed is a minus
+sign (`-'), then the sign of the argument will be negative.  Once you
+have typed one meta digit to get the argument started, you can type the
+remainder of the digits, and then the command.  For example, to give
+the `C-d' command an argument of 10, you could type `M-1 0 C-d', which
+will delete the next ten characters on the input line.
+
+\1f
+File: readline.info,  Node: Searching,  Prev: Readline Arguments,  Up: Readline Interaction
+
+1.2.5 Searching for Commands in the History
+-------------------------------------------
+
+Readline provides commands for searching through the command history
+for lines containing a specified string.  There are two search modes:
+"incremental" and "non-incremental".
+
+   Incremental searches begin before the user has finished typing the
+search string.  As each character of the search string is typed,
+Readline displays the next entry from the history matching the string
+typed so far.  An incremental search requires only as many characters
+as needed to find the desired history entry.  To search backward in the
+history for a particular string, type `C-r'.  Typing `C-s' searches
+forward through the history.  The characters present in the value of
+the `isearch-terminators' variable are used to terminate an incremental
+search.  If that variable has not been assigned a value, the <ESC> and
+`C-J' characters will terminate an incremental search.  `C-g' will
+abort an incremental search and restore the original line.  When the
+search is terminated, the history entry containing the search string
+becomes the current line.
+
+   To find other matching entries in the history list, type `C-r' or
+`C-s' as appropriate.  This will search backward or forward in the
+history for the next entry matching the search string typed so far.
+Any other key sequence bound to a Readline command will terminate the
+search and execute that command.  For instance, a <RET> will terminate
+the search and accept the line, thereby executing the command from the
+history list.  A movement command will terminate the search, make the
+last line found the current line, and begin editing.
+
+   Readline remembers the last incremental search string.  If two
+`C-r's are typed without any intervening characters defining a new
+search string, any remembered search string is used.
+
+   Non-incremental searches read the entire search string before
+starting to search for matching history lines.  The search string may be
+typed by the user or be part of the contents of the current line.
+
+\1f
+File: readline.info,  Node: Readline Init File,  Next: Bindable Readline Commands,  Prev: Readline Interaction,  Up: Command Line Editing
+
+1.3 Readline Init File
+======================
+
+Although the Readline library comes with a set of Emacs-like
+keybindings installed by default, it is possible to use a different set
+of keybindings.  Any user can customize programs that use Readline by
+putting commands in an "inputrc" file, conventionally in his home
+directory.  The name of this file is taken from the value of the
+environment variable `INPUTRC'.  If that variable is unset, the default
+is `~/.inputrc'.  If that file does not exist or cannot be read, the
+ultimate default is `/etc/inputrc'.
+
+   When a program which uses the Readline library starts up, the init
+file is read, and the key bindings are set.
+
+   In addition, the `C-x C-r' command re-reads this init file, thus
+incorporating any changes that you might have made to it.
+
+* Menu:
+
+* Readline Init File Syntax::  Syntax for the commands in the inputrc file.
+
+* Conditional Init Constructs::        Conditional key bindings in the inputrc file.
+
+* Sample Init File::           An example inputrc file.
+
+\1f
+File: readline.info,  Node: Readline Init File Syntax,  Next: Conditional Init Constructs,  Up: Readline Init File
+
+1.3.1 Readline Init File Syntax
+-------------------------------
+
+There are only a few basic constructs allowed in the Readline init
+file.  Blank lines are ignored.  Lines beginning with a `#' are
+comments.  Lines beginning with a `$' indicate conditional constructs
+(*note Conditional Init Constructs::).  Other lines denote variable
+settings and key bindings.
+
+Variable Settings
+     You can modify the run-time behavior of Readline by altering the
+     values of variables in Readline using the `set' command within the
+     init file.  The syntax is simple:
+
+          set VARIABLE VALUE
+
+     Here, for example, is how to change from the default Emacs-like
+     key binding to use `vi' line editing commands:
+
+          set editing-mode vi
+
+     Variable names and values, where appropriate, are recognized
+     without regard to case.  Unrecognized variable names are ignored.
+
+     Boolean variables (those that can be set to on or off) are set to
+     on if the value is null or empty, ON (case-insensitive), or 1.
+     Any other value results in the variable being set to off.
+
+     A great deal of run-time behavior is changeable with the following
+     variables.
+
+    `bell-style'
+          Controls what happens when Readline wants to ring the
+          terminal bell.  If set to `none', Readline never rings the
+          bell.  If set to `visible', Readline uses a visible bell if
+          one is available.  If set to `audible' (the default),
+          Readline attempts to ring the terminal's bell.
+
+    `bind-tty-special-chars'
+          If set to `on', Readline attempts to bind the control
+          characters treated specially by the kernel's terminal driver
+          to their Readline equivalents.
+
+    `comment-begin'
+          The string to insert at the beginning of the line when the
+          `insert-comment' command is executed.  The default value is
+          `"#"'.
+
+    `completion-ignore-case'
+          If set to `on', Readline performs filename matching and
+          completion in a case-insensitive fashion.  The default value
+          is `off'.
+
+    `completion-query-items'
+          The number of possible completions that determines when the
+          user is asked whether the list of possibilities should be
+          displayed.  If the number of possible completions is greater
+          than this value, Readline will ask the user whether or not he
+          wishes to view them; otherwise, they are simply listed.  This
+          variable must be set to an integer value greater than or
+          equal to 0.  A negative value means Readline should never ask.
+          The default limit is `100'.
+
+    `convert-meta'
+          If set to `on', Readline will convert characters with the
+          eighth bit set to an ASCII key sequence by stripping the
+          eighth bit and prefixing an <ESC> character, converting them
+          to a meta-prefixed key sequence.  The default value is `on'.
+
+    `disable-completion'
+          If set to `On', Readline will inhibit word completion.
+          Completion  characters will be inserted into the line as if
+          they had been mapped to `self-insert'.  The default is `off'.
+
+    `editing-mode'
+          The `editing-mode' variable controls which default set of key
+          bindings is used.  By default, Readline starts up in Emacs
+          editing mode, where the keystrokes are most similar to Emacs.
+          This variable can be set to either `emacs' or `vi'.
+
+    `enable-keypad'
+          When set to `on', Readline will try to enable the application
+          keypad when it is called.  Some systems need this to enable
+          the arrow keys.  The default is `off'.
+
+    `expand-tilde'
+          If set to `on', tilde expansion is performed when Readline
+          attempts word completion.  The default is `off'.
+
+    `history-preserve-point'
+          If set to `on', the history code attempts to place point at
+          the same location on each history line retrieved with
+          `previous-history' or `next-history'.  The default is `off'.
+
+    `horizontal-scroll-mode'
+          This variable can be set to either `on' or `off'.  Setting it
+          to `on' means that the text of the lines being edited will
+          scroll horizontally on a single screen line when they are
+          longer than the width of the screen, instead of wrapping onto
+          a new screen line.  By default, this variable is set to `off'.
+
+    `input-meta'
+          If set to `on', Readline will enable eight-bit input (it will
+          not clear the eighth bit in the characters it reads),
+          regardless of what the terminal claims it can support.  The
+          default value is `off'.  The name `meta-flag' is a synonym
+          for this variable.
+
+    `isearch-terminators'
+          The string of characters that should terminate an incremental
+          search without subsequently executing the character as a
+          command (*note Searching::).  If this variable has not been
+          given a value, the characters <ESC> and `C-J' will terminate
+          an incremental search.
+
+    `keymap'
+          Sets Readline's idea of the current keymap for key binding
+          commands.  Acceptable `keymap' names are `emacs',
+          `emacs-standard', `emacs-meta', `emacs-ctlx', `vi', `vi-move',
+          `vi-command', and `vi-insert'.  `vi' is equivalent to
+          `vi-command'; `emacs' is equivalent to `emacs-standard'.  The
+          default value is `emacs'.  The value of the `editing-mode'
+          variable also affects the default keymap.
+
+    `mark-directories'
+          If set to `on', completed directory names have a slash
+          appended.  The default is `on'.
+
+    `mark-modified-lines'
+          This variable, when set to `on', causes Readline to display an
+          asterisk (`*') at the start of history lines which have been
+          modified.  This variable is `off' by default.
+
+    `mark-symlinked-directories'
+          If set to `on', completed names which are symbolic links to
+          directories have a slash appended (subject to the value of
+          `mark-directories').  The default is `off'.
+
+    `match-hidden-files'
+          This variable, when set to `on', causes Readline to match
+          files whose names begin with a `.' (hidden files) when
+          performing filename completion, unless the leading `.' is
+          supplied by the user in the filename to be completed.  This
+          variable is `on' by default.
+
+    `output-meta'
+          If set to `on', Readline will display characters with the
+          eighth bit set directly rather than as a meta-prefixed escape
+          sequence.  The default is `off'.
+
+    `page-completions'
+          If set to `on', Readline uses an internal `more'-like pager
+          to display a screenful of possible completions at a time.
+          This variable is `on' by default.
+
+    `print-completions-horizontally'
+          If set to `on', Readline will display completions with matches
+          sorted horizontally in alphabetical order, rather than down
+          the screen.  The default is `off'.
+
+    `show-all-if-ambiguous'
+          This alters the default behavior of the completion functions.
+          If set to `on', words which have more than one possible
+          completion cause the matches to be listed immediately instead
+          of ringing the bell.  The default value is `off'.
+
+    `show-all-if-unmodified'
+          This alters the default behavior of the completion functions
+          in a fashion similar to SHOW-ALL-IF-AMBIGUOUS.  If set to
+          `on', words which have more than one possible completion
+          without any possible partial completion (the possible
+          completions don't share a common prefix) cause the matches to
+          be listed immediately instead of ringing the bell.  The
+          default value is `off'.
+
+    `visible-stats'
+          If set to `on', a character denoting a file's type is
+          appended to the filename when listing possible completions.
+          The default is `off'.
+
+
+Key Bindings
+     The syntax for controlling key bindings in the init file is
+     simple.  First you need to find the name of the command that you
+     want to change.  The following sections contain tables of the
+     command name, the default keybinding, if any, and a short
+     description of what the command does.
+
+     Once you know the name of the command, simply place on a line in
+     the init file the name of the key you wish to bind the command to,
+     a colon, and then the name of the command.  There can be no space
+     between the key name and the colon - that will be interpreted as
+     part of the key name.  The name of the key can be expressed in
+     different ways, depending on what you find most comfortable.
+
+     In addition to command names, readline allows keys to be bound to
+     a string that is inserted when the key is pressed (a MACRO).
+
+    KEYNAME: FUNCTION-NAME or MACRO
+          KEYNAME is the name of a key spelled out in English.  For
+          example:
+               Control-u: universal-argument
+               Meta-Rubout: backward-kill-word
+               Control-o: "> output"
+
+          In the above example, `C-u' is bound to the function
+          `universal-argument', `M-DEL' is bound to the function
+          `backward-kill-word', and `C-o' is bound to run the macro
+          expressed on the right hand side (that is, to insert the text
+          `> output' into the line).
+
+          A number of symbolic character names are recognized while
+          processing this key binding syntax: DEL, ESC, ESCAPE, LFD,
+          NEWLINE, RET, RETURN, RUBOUT, SPACE, SPC, and TAB.
+
+    "KEYSEQ": FUNCTION-NAME or MACRO
+          KEYSEQ differs from KEYNAME above in that strings denoting an
+          entire key sequence can be specified, by placing the key
+          sequence in double quotes.  Some GNU Emacs style key escapes
+          can be used, as in the following example, but the special
+          character names are not recognized.
+
+               "\C-u": universal-argument
+               "\C-x\C-r": re-read-init-file
+               "\e[11~": "Function Key 1"
+
+          In the above example, `C-u' is again bound to the function
+          `universal-argument' (just as it was in the first example),
+          `C-x C-r' is bound to the function `re-read-init-file', and
+          `<ESC> <[> <1> <1> <~>' is bound to insert the text `Function
+          Key 1'.
+
+
+     The following GNU Emacs style escape sequences are available when
+     specifying key sequences:
+
+    `\C-'
+          control prefix
+
+    `\M-'
+          meta prefix
+
+    `\e'
+          an escape character
+
+    `\\'
+          backslash
+
+    `\"'
+          <">, a double quotation mark
+
+    `\''
+          <'>, a single quote or apostrophe
+
+     In addition to the GNU Emacs style escape sequences, a second set
+     of backslash escapes is available:
+
+    `\a'
+          alert (bell)
+
+    `\b'
+          backspace
+
+    `\d'
+          delete
+
+    `\f'
+          form feed
+
+    `\n'
+          newline
+
+    `\r'
+          carriage return
+
+    `\t'
+          horizontal tab
+
+    `\v'
+          vertical tab
+
+    `\NNN'
+          the eight-bit character whose value is the octal value NNN
+          (one to three digits)
+
+    `\xHH'
+          the eight-bit character whose value is the hexadecimal value
+          HH (one or two hex digits)
+
+     When entering the text of a macro, single or double quotes must be
+     used to indicate a macro definition.  Unquoted text is assumed to
+     be a function name.  In the macro body, the backslash escapes
+     described above are expanded.  Backslash will quote any other
+     character in the macro text, including `"' and `''.  For example,
+     the following binding will make `C-x \' insert a single `\' into
+     the line:
+          "\C-x\\": "\\"
+
+
+\1f
+File: readline.info,  Node: Conditional Init Constructs,  Next: Sample Init File,  Prev: Readline Init File Syntax,  Up: Readline Init File
+
+1.3.2 Conditional Init Constructs
+---------------------------------
+
+Readline implements a facility similar in spirit to the conditional
+compilation features of the C preprocessor which allows key bindings
+and variable settings to be performed as the result of tests.  There
+are four parser directives used.
+
+`$if'
+     The `$if' construct allows bindings to be made based on the
+     editing mode, the terminal being used, or the application using
+     Readline.  The text of the test extends to the end of the line; no
+     characters are required to isolate it.
+
+    `mode'
+          The `mode=' form of the `$if' directive is used to test
+          whether Readline is in `emacs' or `vi' mode.  This may be
+          used in conjunction with the `set keymap' command, for
+          instance, to set bindings in the `emacs-standard' and
+          `emacs-ctlx' keymaps only if Readline is starting out in
+          `emacs' mode.
+
+    `term'
+          The `term=' form may be used to include terminal-specific key
+          bindings, perhaps to bind the key sequences output by the
+          terminal's function keys.  The word on the right side of the
+          `=' is tested against both the full name of the terminal and
+          the portion of the terminal name before the first `-'.  This
+          allows `sun' to match both `sun' and `sun-cmd', for instance.
+
+    `application'
+          The APPLICATION construct is used to include
+          application-specific settings.  Each program using the
+          Readline library sets the APPLICATION NAME, and you can test
+          for a particular value.  This could be used to bind key
+          sequences to functions useful for a specific program.  For
+          instance, the following command adds a key sequence that
+          quotes the current or previous word in Bash:
+               $if Bash
+               # Quote the current or previous word
+               "\C-xq": "\eb\"\ef\""
+               $endif
+
+`$endif'
+     This command, as seen in the previous example, terminates an `$if'
+     command.
+
+`$else'
+     Commands in this branch of the `$if' directive are executed if the
+     test fails.
+
+`$include'
+     This directive takes a single filename as an argument and reads
+     commands and bindings from that file.  For example, the following
+     directive reads from `/etc/inputrc':
+          $include /etc/inputrc
+
+\1f
+File: readline.info,  Node: Sample Init File,  Prev: Conditional Init Constructs,  Up: Readline Init File
+
+1.3.3 Sample Init File
+----------------------
+
+Here is an example of an INPUTRC file.  This illustrates key binding,
+variable assignment, and conditional syntax.
+
+
+     # This file controls the behaviour of line input editing for
+     # programs that use the GNU Readline library.  Existing
+     # programs include FTP, Bash, and GDB.
+     #
+     # You can re-read the inputrc file with C-x C-r.
+     # Lines beginning with '#' are comments.
+     #
+     # First, include any systemwide bindings and variable
+     # assignments from /etc/Inputrc
+     $include /etc/Inputrc
+
+     #
+     # Set various bindings for emacs mode.
+
+     set editing-mode emacs
+
+     $if mode=emacs
+
+     Meta-Control-h:   backward-kill-word      Text after the function name is ignored
+
+     #
+     # Arrow keys in keypad mode
+     #
+     #"\M-OD":        backward-char
+     #"\M-OC":        forward-char
+     #"\M-OA":        previous-history
+     #"\M-OB":        next-history
+     #
+     # Arrow keys in ANSI mode
+     #
+     "\M-[D":        backward-char
+     "\M-[C":        forward-char
+     "\M-[A":        previous-history
+     "\M-[B":        next-history
+     #
+     # Arrow keys in 8 bit keypad mode
+     #
+     #"\M-\C-OD":       backward-char
+     #"\M-\C-OC":       forward-char
+     #"\M-\C-OA":       previous-history
+     #"\M-\C-OB":       next-history
+     #
+     # Arrow keys in 8 bit ANSI mode
+     #
+     #"\M-\C-[D":       backward-char
+     #"\M-\C-[C":       forward-char
+     #"\M-\C-[A":       previous-history
+     #"\M-\C-[B":       next-history
+
+     C-q: quoted-insert
+
+     $endif
+
+     # An old-style binding.  This happens to be the default.
+     TAB: complete
+
+     # Macros that are convenient for shell interaction
+     $if Bash
+     # edit the path
+     "\C-xp": "PATH=${PATH}\e\C-e\C-a\ef\C-f"
+     # prepare to type a quoted word --
+     # insert open and close double quotes
+     # and move to just after the open quote
+     "\C-x\"": "\"\"\C-b"
+     # insert a backslash (testing backslash escapes
+     # in sequences and macros)
+     "\C-x\\": "\\"
+     # Quote the current or previous word
+     "\C-xq": "\eb\"\ef\""
+     # Add a binding to refresh the line, which is unbound
+     "\C-xr": redraw-current-line
+     # Edit variable on current line.
+     "\M-\C-v": "\C-a\C-k$\C-y\M-\C-e\C-a\C-y="
+     $endif
+
+     # use a visible bell if one is available
+     set bell-style visible
+
+     # don't strip characters to 7 bits when reading
+     set input-meta on
+
+     # allow iso-latin1 characters to be inserted rather
+     # than converted to prefix-meta sequences
+     set convert-meta off
+
+     # display characters with the eighth bit set directly
+     # rather than as meta-prefixed characters
+     set output-meta on
+
+     # if there are more than 150 possible completions for
+     # a word, ask the user if he wants to see all of them
+     set completion-query-items 150
+
+     # For FTP
+     $if Ftp
+     "\C-xg": "get \M-?"
+     "\C-xt": "put \M-?"
+     "\M-.": yank-last-arg
+     $endif
+
+\1f
+File: readline.info,  Node: Bindable Readline Commands,  Next: Readline vi Mode,  Prev: Readline Init File,  Up: Command Line Editing
+
+1.4 Bindable Readline Commands
+==============================
+
+* Menu:
+
+* Commands For Moving::                Moving about the line.
+* Commands For History::       Getting at previous lines.
+* Commands For Text::          Commands for changing text.
+* Commands For Killing::       Commands for killing and yanking.
+* Numeric Arguments::          Specifying numeric arguments, repeat counts.
+* Commands For Completion::    Getting Readline to do the typing for you.
+* Keyboard Macros::            Saving and re-executing typed characters
+* Miscellaneous Commands::     Other miscellaneous commands.
+
+   This section describes Readline commands that may be bound to key
+sequences.  Command names without an accompanying key sequence are
+unbound by default.
+
+   In the following descriptions, "point" refers to the current cursor
+position, and "mark" refers to a cursor position saved by the
+`set-mark' command.  The text between the point and mark is referred to
+as the "region".
+
+\1f
+File: readline.info,  Node: Commands For Moving,  Next: Commands For History,  Up: Bindable Readline Commands
+
+1.4.1 Commands For Moving
+-------------------------
+
+`beginning-of-line (C-a)'
+     Move to the start of the current line.
+
+`end-of-line (C-e)'
+     Move to the end of the line.
+
+`forward-char (C-f)'
+     Move forward a character.
+
+`backward-char (C-b)'
+     Move back a character.
+
+`forward-word (M-f)'
+     Move forward to the end of the next word.  Words are composed of
+     letters and digits.
+
+`backward-word (M-b)'
+     Move back to the start of the current or previous word.  Words are
+     composed of letters and digits.
+
+`clear-screen (C-l)'
+     Clear the screen and redraw the current line, leaving the current
+     line at the top of the screen.
+
+`redraw-current-line ()'
+     Refresh the current line.  By default, this is unbound.
+
+
+\1f
+File: readline.info,  Node: Commands For History,  Next: Commands For Text,  Prev: Commands For Moving,  Up: Bindable Readline Commands
+
+1.4.2 Commands For Manipulating The History
+-------------------------------------------
+
+`accept-line (Newline or Return)'
+     Accept the line regardless of where the cursor is.  If this line is
+     non-empty, it may be added to the history list for future recall
+     with `add_history()'.  If this line is a modified history line,
+     the history line is restored to its original state.
+
+`previous-history (C-p)'
+     Move `back' through the history list, fetching the previous
+     command.
+
+`next-history (C-n)'
+     Move `forward' through the history list, fetching the next command.
+
+`beginning-of-history (M-<)'
+     Move to the first line in the history.
+
+`end-of-history (M->)'
+     Move to the end of the input history, i.e., the line currently
+     being entered.
+
+`reverse-search-history (C-r)'
+     Search backward starting at the current line and moving `up'
+     through the history as necessary.  This is an incremental search.
+
+`forward-search-history (C-s)'
+     Search forward starting at the current line and moving `down'
+     through the the history as necessary.  This is an incremental
+     search.
+
+`non-incremental-reverse-search-history (M-p)'
+     Search backward starting at the current line and moving `up'
+     through the history as necessary using a non-incremental search
+     for a string supplied by the user.
+
+`non-incremental-forward-search-history (M-n)'
+     Search forward starting at the current line and moving `down'
+     through the the history as necessary using a non-incremental search
+     for a string supplied by the user.
+
+`history-search-forward ()'
+     Search forward through the history for the string of characters
+     between the start of the current line and the point.  This is a
+     non-incremental search.  By default, this command is unbound.
+
+`history-search-backward ()'
+     Search backward through the history for the string of characters
+     between the start of the current line and the point.  This is a
+     non-incremental search.  By default, this command is unbound.
+
+`yank-nth-arg (M-C-y)'
+     Insert the first argument to the previous command (usually the
+     second word on the previous line) at point.  With an argument N,
+     insert the Nth word from the previous command (the words in the
+     previous command begin with word 0).  A negative argument inserts
+     the Nth word from the end of the previous command.  Once the
+     argument N is computed, the argument is extracted as if the `!N'
+     history expansion had been specified.
+
+`yank-last-arg (M-. or M-_)'
+     Insert last argument to the previous command (the last word of the
+     previous history entry).  With an argument, behave exactly like
+     `yank-nth-arg'.  Successive calls to `yank-last-arg' move back
+     through the history list, inserting the last argument of each line
+     in turn.  The history expansion facilities are used to extract the
+     last argument, as if the `!$' history expansion had been specified.
+
+
+\1f
+File: readline.info,  Node: Commands For Text,  Next: Commands For Killing,  Prev: Commands For History,  Up: Bindable Readline Commands
+
+1.4.3 Commands For Changing Text
+--------------------------------
+
+`delete-char (C-d)'
+     Delete the character at point.  If point is at the beginning of
+     the line, there are no characters in the line, and the last
+     character typed was not bound to `delete-char', then return EOF.
+
+`backward-delete-char (Rubout)'
+     Delete the character behind the cursor.  A numeric argument means
+     to kill the characters instead of deleting them.
+
+`forward-backward-delete-char ()'
+     Delete the character under the cursor, unless the cursor is at the
+     end of the line, in which case the character behind the cursor is
+     deleted.  By default, this is not bound to a key.
+
+`quoted-insert (C-q or C-v)'
+     Add the next character typed to the line verbatim.  This is how to
+     insert key sequences like `C-q', for example.
+
+`tab-insert (M-<TAB>)'
+     Insert a tab character.
+
+`self-insert (a, b, A, 1, !, ...)'
+     Insert yourself.
+
+`transpose-chars (C-t)'
+     Drag the character before the cursor forward over the character at
+     the cursor, moving the cursor forward as well.  If the insertion
+     point is at the end of the line, then this transposes the last two
+     characters of the line.  Negative arguments have no effect.
+
+`transpose-words (M-t)'
+     Drag the word before point past the word after point, moving point
+     past that word as well.  If the insertion point is at the end of
+     the line, this transposes the last two words on the line.
+
+`upcase-word (M-u)'
+     Uppercase the current (or following) word.  With a negative
+     argument, uppercase the previous word, but do not move the cursor.
+
+`downcase-word (M-l)'
+     Lowercase the current (or following) word.  With a negative
+     argument, lowercase the previous word, but do not move the cursor.
+
+`capitalize-word (M-c)'
+     Capitalize the current (or following) word.  With a negative
+     argument, capitalize the previous word, but do not move the cursor.
+
+`overwrite-mode ()'
+     Toggle overwrite mode.  With an explicit positive numeric argument,
+     switches to overwrite mode.  With an explicit non-positive numeric
+     argument, switches to insert mode.  This command affects only
+     `emacs' mode; `vi' mode does overwrite differently.  Each call to
+     `readline()' starts in insert mode.
+
+     In overwrite mode, characters bound to `self-insert' replace the
+     text at point rather than pushing the text to the right.
+     Characters bound to `backward-delete-char' replace the character
+     before point with a space.
+
+     By default, this command is unbound.
+
+
+\1f
+File: readline.info,  Node: Commands For Killing,  Next: Numeric Arguments,  Prev: Commands For Text,  Up: Bindable Readline Commands
+
+1.4.4 Killing And Yanking
+-------------------------
+
+`kill-line (C-k)'
+     Kill the text from point to the end of the line.
+
+`backward-kill-line (C-x Rubout)'
+     Kill backward to the beginning of the line.
+
+`unix-line-discard (C-u)'
+     Kill backward from the cursor to the beginning of the current line.
+
+`kill-whole-line ()'
+     Kill all characters on the current line, no matter where point is.
+     By default, this is unbound.
+
+`kill-word (M-d)'
+     Kill from point to the end of the current word, or if between
+     words, to the end of the next word.  Word boundaries are the same
+     as `forward-word'.
+
+`backward-kill-word (M-<DEL>)'
+     Kill the word behind point.  Word boundaries are the same as
+     `backward-word'.
+
+`unix-word-rubout (C-w)'
+     Kill the word behind point, using white space as a word boundary.
+     The killed text is saved on the kill-ring.
+
+`unix-filename-rubout ()'
+     Kill the word behind point, using white space and the slash
+     character as the word boundaries.  The killed text is saved on the
+     kill-ring.
+
+`delete-horizontal-space ()'
+     Delete all spaces and tabs around point.  By default, this is
+     unbound.
+
+`kill-region ()'
+     Kill the text in the current region.  By default, this command is
+     unbound.
+
+`copy-region-as-kill ()'
+     Copy the text in the region to the kill buffer, so it can be yanked
+     right away.  By default, this command is unbound.
+
+`copy-backward-word ()'
+     Copy the word before point to the kill buffer.  The word
+     boundaries are the same as `backward-word'.  By default, this
+     command is unbound.
+
+`copy-forward-word ()'
+     Copy the word following point to the kill buffer.  The word
+     boundaries are the same as `forward-word'.  By default, this
+     command is unbound.
+
+`yank (C-y)'
+     Yank the top of the kill ring into the buffer at point.
+
+`yank-pop (M-y)'
+     Rotate the kill-ring, and yank the new top.  You can only do this
+     if the prior command is `yank' or `yank-pop'.
+
+\1f
+File: readline.info,  Node: Numeric Arguments,  Next: Commands For Completion,  Prev: Commands For Killing,  Up: Bindable Readline Commands
+
+1.4.5 Specifying Numeric Arguments
+----------------------------------
+
+`digit-argument (M-0, M-1, ... M--)'
+     Add this digit to the argument already accumulating, or start a new
+     argument.  `M--' starts a negative argument.
+
+`universal-argument ()'
+     This is another way to specify an argument.  If this command is
+     followed by one or more digits, optionally with a leading minus
+     sign, those digits define the argument.  If the command is
+     followed by digits, executing `universal-argument' again ends the
+     numeric argument, but is otherwise ignored.  As a special case, if
+     this command is immediately followed by a character that is
+     neither a digit or minus sign, the argument count for the next
+     command is multiplied by four.  The argument count is initially
+     one, so executing this function the first time makes the argument
+     count four, a second time makes the argument count sixteen, and so
+     on.  By default, this is not bound to a key.
+
+\1f
+File: readline.info,  Node: Commands For Completion,  Next: Keyboard Macros,  Prev: Numeric Arguments,  Up: Bindable Readline Commands
+
+1.4.6 Letting Readline Type For You
+-----------------------------------
+
+`complete (<TAB>)'
+     Attempt to perform completion on the text before point.  The
+     actual completion performed is application-specific.  The default
+     is filename completion.
+
+`possible-completions (M-?)'
+     List the possible completions of the text before point.
+
+`insert-completions (M-*)'
+     Insert all completions of the text before point that would have
+     been generated by `possible-completions'.
+
+`menu-complete ()'
+     Similar to `complete', but replaces the word to be completed with
+     a single match from the list of possible completions.  Repeated
+     execution of `menu-complete' steps through the list of possible
+     completions, inserting each match in turn.  At the end of the list
+     of completions, the bell is rung (subject to the setting of
+     `bell-style') and the original text is restored.  An argument of N
+     moves N positions forward in the list of matches; a negative
+     argument may be used to move backward through the list.  This
+     command is intended to be bound to <TAB>, but is unbound by
+     default.
+
+`delete-char-or-list ()'
+     Deletes the character under the cursor if not at the beginning or
+     end of the line (like `delete-char').  If at the end of the line,
+     behaves identically to `possible-completions'.  This command is
+     unbound by default.
+
+
+\1f
+File: readline.info,  Node: Keyboard Macros,  Next: Miscellaneous Commands,  Prev: Commands For Completion,  Up: Bindable Readline Commands
+
+1.4.7 Keyboard Macros
+---------------------
+
+`start-kbd-macro (C-x ()'
+     Begin saving the characters typed into the current keyboard macro.
+
+`end-kbd-macro (C-x ))'
+     Stop saving the characters typed into the current keyboard macro
+     and save the definition.
+
+`call-last-kbd-macro (C-x e)'
+     Re-execute the last keyboard macro defined, by making the
+     characters in the macro appear as if typed at the keyboard.
+
+
+\1f
+File: readline.info,  Node: Miscellaneous Commands,  Prev: Keyboard Macros,  Up: Bindable Readline Commands
+
+1.4.8 Some Miscellaneous Commands
+---------------------------------
+
+`re-read-init-file (C-x C-r)'
+     Read in the contents of the INPUTRC file, and incorporate any
+     bindings or variable assignments found there.
+
+`abort (C-g)'
+     Abort the current editing command and ring the terminal's bell
+     (subject to the setting of `bell-style').
+
+`do-uppercase-version (M-a, M-b, M-X, ...)'
+     If the metafied character X is lowercase, run the command that is
+     bound to the corresponding uppercase character.
+
+`prefix-meta (<ESC>)'
+     Metafy the next character typed.  This is for keyboards without a
+     meta key.  Typing `<ESC> f' is equivalent to typing `M-f'.
+
+`undo (C-_ or C-x C-u)'
+     Incremental undo, separately remembered for each line.
+
+`revert-line (M-r)'
+     Undo all changes made to this line.  This is like executing the
+     `undo' command enough times to get back to the beginning.
+
+`tilde-expand (M-~)'
+     Perform tilde expansion on the current word.
+
+`set-mark (C-@)'
+     Set the mark to the point.  If a numeric argument is supplied, the
+     mark is set to that position.
+
+`exchange-point-and-mark (C-x C-x)'
+     Swap the point with the mark.  The current cursor position is set
+     to the saved position, and the old cursor position is saved as the
+     mark.
+
+`character-search (C-])'
+     A character is read and point is moved to the next occurrence of
+     that character.  A negative count searches for previous
+     occurrences.
+
+`character-search-backward (M-C-])'
+     A character is read and point is moved to the previous occurrence
+     of that character.  A negative count searches for subsequent
+     occurrences.
+
+`insert-comment (M-#)'
+     Without a numeric argument, the value of the `comment-begin'
+     variable is inserted at the beginning of the current line.  If a
+     numeric argument is supplied, this command acts as a toggle:  if
+     the characters at the beginning of the line do not match the value
+     of `comment-begin', the value is inserted, otherwise the
+     characters in `comment-begin' are deleted from the beginning of
+     the line.  In either case, the line is accepted as if a newline
+     had been typed.
+
+`dump-functions ()'
+     Print all of the functions and their key bindings to the Readline
+     output stream.  If a numeric argument is supplied, the output is
+     formatted in such a way that it can be made part of an INPUTRC
+     file.  This command is unbound by default.
+
+`dump-variables ()'
+     Print all of the settable variables and their values to the
+     Readline output stream.  If a numeric argument is supplied, the
+     output is formatted in such a way that it can be made part of an
+     INPUTRC file.  This command is unbound by default.
+
+`dump-macros ()'
+     Print all of the Readline key sequences bound to macros and the
+     strings they output.  If a numeric argument is supplied, the
+     output is formatted in such a way that it can be made part of an
+     INPUTRC file.  This command is unbound by default.
+
+`emacs-editing-mode (C-e)'
+     When in `vi' command mode, this causes a switch to `emacs' editing
+     mode.
+
+`vi-editing-mode (M-C-j)'
+     When in `emacs' editing mode, this causes a switch to `vi' editing
+     mode.
+
+
+\1f
+File: readline.info,  Node: Readline vi Mode,  Prev: Bindable Readline Commands,  Up: Command Line Editing
+
+1.5 Readline vi Mode
+====================
+
+While the Readline library does not have a full set of `vi' editing
+functions, it does contain enough to allow simple editing of the line.
+The Readline `vi' mode behaves as specified in the POSIX 1003.2
+standard.
+
+   In order to switch interactively between `emacs' and `vi' editing
+modes, use the command `M-C-j' (bound to emacs-editing-mode when in
+`vi' mode and to vi-editing-mode in `emacs' mode).  The Readline
+default is `emacs' mode.
+
+   When you enter a line in `vi' mode, you are already placed in
+`insertion' mode, as if you had typed an `i'.  Pressing <ESC> switches
+you into `command' mode, where you can edit the text of the line with
+the standard `vi' movement keys, move to previous history lines with
+`k' and subsequent lines with `j', and so forth.
+
+   This document describes the GNU Readline Library, a utility for
+aiding in the consistency of user interface across discrete programs
+that need to provide a command line interface.
+
+   Copyright (C) 1988-2006 Free Software Foundation, Inc.
+
+   Permission is granted to make and distribute verbatim copies of this
+manual provided the copyright notice and this permission notice pare
+preserved on all copies.
+
+   Permission is granted to copy and distribute modified versions of
+this manual under the conditions for verbatim copying, 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 Foundation.
+
+\1f
+File: readline.info,  Node: Programming with GNU Readline,  Next: Copying This Manual,  Prev: Command Line Editing,  Up: Top
+
+2 Programming with GNU Readline
+*******************************
+
+This chapter describes the interface between the GNU Readline Library
+and other programs.  If you are a programmer, and you wish to include
+the features found in GNU Readline such as completion, line editing,
+and interactive history manipulation in your own programs, this section
+is for you.
+
+* Menu:
+
+* Basic Behavior::     Using the default behavior of Readline.
+* Custom Functions::   Adding your own functions to Readline.
+* Readline Variables::                 Variables accessible to custom
+                                       functions.
+* Readline Convenience Functions::     Functions which Readline supplies to
+                                       aid in writing your own custom
+                                       functions.
+* Readline Signal Handling::   How Readline behaves when it receives signals.
+* Custom Completers::  Supplanting or supplementing Readline's
+                       completion functions.
+
+\1f
+File: readline.info,  Node: Basic Behavior,  Next: Custom Functions,  Up: Programming with GNU Readline
+
+2.1 Basic Behavior
+==================
+
+Many programs provide a command line interface, such as `mail', `ftp',
+and `sh'.  For such programs, the default behaviour of Readline is
+sufficient.  This section describes how to use Readline in the simplest
+way possible, perhaps to replace calls in your code to `gets()' or
+`fgets()'.
+
+   The function `readline()' prints a prompt PROMPT and then reads and
+returns a single line of text from the user.  If PROMPT is `NULL' or
+the empty string, no prompt is displayed.  The line `readline' returns
+is allocated with `malloc()'; the caller should `free()' the line when
+it has finished with it.  The declaration for `readline' in ANSI C is
+
+     `char *readline (const char *PROMPT);'
+
+So, one might say
+     `char *line = readline ("Enter a line: ");'
+   in order to read a line of text from the user.  The line returned
+has the final newline removed, so only the text remains.
+
+   If `readline' encounters an `EOF' while reading the line, and the
+line is empty at that point, then `(char *)NULL' is returned.
+Otherwise, the line is ended just as if a newline had been typed.
+
+   If you want the user to be able to get at the line later, (with
+<C-p> for example), you must call `add_history()' to save the line away
+in a "history" list of such lines.
+
+     `add_history (line)';
+
+For full details on the GNU History Library, see the associated manual.
+
+   It is preferable to avoid saving empty lines on the history list,
+since users rarely have a burning need to reuse a blank line.  Here is
+a function which usefully replaces the standard `gets()' library
+function, and has the advantage of no static buffer to overflow:
+
+     /* A static variable for holding the line. */
+     static char *line_read = (char *)NULL;
+
+     /* Read a string, and return a pointer to it.
+        Returns NULL on EOF. */
+     char *
+     rl_gets ()
+     {
+       /* If the buffer has already been allocated,
+          return the memory to the free pool. */
+       if (line_read)
+         {
+           free (line_read);
+           line_read = (char *)NULL;
+         }
+
+       /* Get a line from the user. */
+       line_read = readline ("");
+
+       /* If the line has any text in it,
+          save it on the history. */
+       if (line_read && *line_read)
+         add_history (line_read);
+
+       return (line_read);
+     }
+
+   This function gives the user the default behaviour of <TAB>
+completion: completion on file names.  If you do not want Readline to
+complete on filenames, you can change the binding of the <TAB> key with
+`rl_bind_key()'.
+
+     `int rl_bind_key (int KEY, rl_command_func_t *FUNCTION);'
+
+   `rl_bind_key()' takes two arguments: KEY is the character that you
+want to bind, and FUNCTION is the address of the function to call when
+KEY is pressed.  Binding <TAB> to `rl_insert()' makes <TAB> insert
+itself.  `rl_bind_key()' returns non-zero if KEY is not a valid ASCII
+character code (between 0 and 255).
+
+   Thus, to disable the default <TAB> behavior, the following suffices:
+     `rl_bind_key ('\t', rl_insert);'
+
+   This code should be executed once at the start of your program; you
+might write a function called `initialize_readline()' which performs
+this and other desired initializations, such as installing custom
+completers (*note Custom Completers::).
+
+\1f
+File: readline.info,  Node: Custom Functions,  Next: Readline Variables,  Prev: Basic Behavior,  Up: Programming with GNU Readline
+
+2.2 Custom Functions
+====================
+
+Readline provides many functions for manipulating the text of the line,
+but it isn't possible to anticipate the needs of all programs.  This
+section describes the various functions and variables defined within
+the Readline library which allow a user program to add customized
+functionality to Readline.
+
+   Before declaring any functions that customize Readline's behavior, or
+using any functionality Readline provides in other code, an application
+writer should include the file `<readline/readline.h>' in any file that
+uses Readline's features.  Since some of the definitions in
+`readline.h' use the `stdio' library, the file `<stdio.h>' should be
+included before `readline.h'.
+
+   `readline.h' defines a C preprocessor variable that should be
+treated as an integer, `RL_READLINE_VERSION', which may be used to
+conditionally compile application code depending on the installed
+Readline version.  The value is a hexadecimal encoding of the major and
+minor version numbers of the library, of the form 0xMMMM.  MM is the
+two-digit major version number; MM is the two-digit minor version
+number.  For Readline 4.2, for example, the value of
+`RL_READLINE_VERSION' would be `0x0402'.
+
+* Menu:
+
+* Readline Typedefs::  C declarations to make code readable.
+* Function Writing::   Variables and calling conventions.
+
+\1f
+File: readline.info,  Node: Readline Typedefs,  Next: Function Writing,  Up: Custom Functions
+
+2.2.1 Readline Typedefs
+-----------------------
+
+For readabilty, we declare a number of new object types, all pointers
+to functions.
+
+   The reason for declaring these new types is to make it easier to
+write code describing pointers to C functions with appropriately
+prototyped arguments and return values.
+
+   For instance, say we want to declare a variable FUNC as a pointer to
+a function which takes two `int' arguments and returns an `int' (this
+is the type of all of the Readline bindable functions).  Instead of the
+classic C declaration
+
+   `int (*func)();'
+
+or the ANSI-C style declaration
+
+   `int (*func)(int, int);'
+
+we may write
+
+   `rl_command_func_t *func;'
+
+   The full list of function pointer types available is
+
+`typedef int rl_command_func_t (int, int);'
+
+`typedef char *rl_compentry_func_t (const char *, int);'
+
+`typedef char **rl_completion_func_t (const char *, int, int);'
+
+`typedef char *rl_quote_func_t (char *, int, char *);'
+
+`typedef char *rl_dequote_func_t (char *, int);'
+
+`typedef int rl_compignore_func_t (char **);'
+
+`typedef void rl_compdisp_func_t (char **, int, int);'
+
+`typedef int rl_hook_func_t (void);'
+
+`typedef int rl_getc_func_t (FILE *);'
+
+`typedef int rl_linebuf_func_t (char *, int);'
+
+`typedef int rl_intfunc_t (int);'
+
+`#define rl_ivoidfunc_t rl_hook_func_t'
+
+`typedef int rl_icpfunc_t (char *);'
+
+`typedef int rl_icppfunc_t (char **);'
+
+`typedef void rl_voidfunc_t (void);'
+
+`typedef void rl_vintfunc_t (int);'
+
+`typedef void rl_vcpfunc_t (char *);'
+
+`typedef void rl_vcppfunc_t (char **);'
+
+\1f
+File: readline.info,  Node: Function Writing,  Prev: Readline Typedefs,  Up: Custom Functions
+
+2.2.2 Writing a New Function
+----------------------------
+
+In order to write new functions for Readline, you need to know the
+calling conventions for keyboard-invoked functions, and the names of the
+variables that describe the current state of the line read so far.
+
+   The calling sequence for a command `foo' looks like
+
+     `int foo (int count, int key)'
+
+where COUNT is the numeric argument (or 1 if defaulted) and KEY is the
+key that invoked this function.
+
+   It is completely up to the function as to what should be done with
+the numeric argument.  Some functions use it as a repeat count, some as
+a flag, and others to choose alternate behavior (refreshing the current
+line as opposed to refreshing the screen, for example).  Some choose to
+ignore it.  In general, if a function uses the numeric argument as a
+repeat count, it should be able to do something useful with both
+negative and positive arguments.  At the very least, it should be aware
+that it can be passed a negative argument.
+
+   A command function should return 0 if its action completes
+successfully, and a non-zero value if some error occurs.  This is the
+convention obeyed by all of the builtin Readline bindable command
+functions.
+
+\1f
+File: readline.info,  Node: Readline Variables,  Next: Readline Convenience Functions,  Prev: Custom Functions,  Up: Programming with GNU Readline
+
+2.3 Readline Variables
+======================
+
+These variables are available to function writers.
+
+ -- Variable: char * rl_line_buffer
+     This is the line gathered so far.  You are welcome to modify the
+     contents of the line, but see *Note Allowing Undoing::.  The
+     function `rl_extend_line_buffer' is available to increase the
+     memory allocated to `rl_line_buffer'.
+
+ -- Variable: int rl_point
+     The offset of the current cursor position in `rl_line_buffer' (the
+     _point_).
+
+ -- Variable: int rl_end
+     The number of characters present in `rl_line_buffer'.  When
+     `rl_point' is at the end of the line, `rl_point' and `rl_end' are
+     equal.
+
+ -- Variable: int rl_mark
+     The MARK (saved position) in the current line.  If set, the mark
+     and point define a _region_.
+
+ -- Variable: int rl_done
+     Setting this to a non-zero value causes Readline to return the
+     current line immediately.
+
+ -- Variable: int rl_num_chars_to_read
+     Setting this to a positive value before calling `readline()' causes
+     Readline to return after accepting that many characters, rather
+     than reading up to a character bound to `accept-line'.
+
+ -- Variable: int rl_pending_input
+     Setting this to a value makes it the next keystroke read.  This is
+     a way to stuff a single character into the input stream.
+
+ -- Variable: int rl_dispatching
+     Set to a non-zero value if a function is being called from a key
+     binding; zero otherwise.  Application functions can test this to
+     discover whether they were called directly or by Readline's
+     dispatching mechanism.
+
+ -- Variable: int rl_erase_empty_line
+     Setting this to a non-zero value causes Readline to completely
+     erase the current line, including any prompt, any time a newline
+     is typed as the only character on an otherwise-empty line.  The
+     cursor is moved to the beginning of the newly-blank line.
+
+ -- Variable: char * rl_prompt
+     The prompt Readline uses.  This is set from the argument to
+     `readline()', and should not be assigned to directly.  The
+     `rl_set_prompt()' function (*note Redisplay::) may be used to
+     modify the prompt string after calling `readline()'.
+
+ -- Variable: int rl_already_prompted
+     If an application wishes to display the prompt itself, rather than
+     have Readline do it the first time `readline()' is called, it
+     should set this variable to a non-zero value after displaying the
+     prompt.  The prompt must also be passed as the argument to
+     `readline()' so the redisplay functions can update the display
+     properly.  The calling application is responsible for managing the
+     value; Readline never sets it.
+
+ -- Variable: const char * rl_library_version
+     The version number of this revision of the library.
+
+ -- Variable: int rl_readline_version
+     An integer encoding the current version of the library.  The
+     encoding is of the form 0xMMMM, where MM is the two-digit major
+     version number, and MM is the two-digit minor version number.  For
+     example, for Readline-4.2, `rl_readline_version' would have the
+     value 0x0402.
+
+ -- Variable: int rl_gnu_readline_p
+     Always set to 1, denoting that this is GNU readline rather than
+     some emulation.
+
+ -- Variable: const char * rl_terminal_name
+     The terminal type, used for initialization.  If not set by the
+     application, Readline sets this to the value of the `TERM'
+     environment variable the first time it is called.
+
+ -- Variable: const char * rl_readline_name
+     This variable is set to a unique name by each application using
+     Readline.  The value allows conditional parsing of the inputrc file
+     (*note Conditional Init Constructs::).
+
+ -- Variable: FILE * rl_instream
+     The stdio stream from which Readline reads input.  If `NULL',
+     Readline defaults to STDIN.
+
+ -- Variable: FILE * rl_outstream
+     The stdio stream to which Readline performs output.  If `NULL',
+     Readline defaults to STDOUT.
+
+ -- Variable: int rl_prefer_env_winsize
+     If non-zero, Readline gives values found in the `LINES' and
+     `COLUMNS' environment variables greater precedence than values
+     fetched from the kernel when computing the screen dimensions.
+
+ -- Variable: rl_command_func_t * rl_last_func
+     The address of the last command function Readline executed.  May
+     be used to test whether or not a function is being executed twice
+     in succession, for example.
+
+ -- Variable: rl_hook_func_t * rl_startup_hook
+     If non-zero, this is the address of a function to call just before
+     `readline' prints the first prompt.
+
+ -- Variable: rl_hook_func_t * rl_pre_input_hook
+     If non-zero, this is the address of a function to call after the
+     first prompt has been printed and just before `readline' starts
+     reading input characters.
+
+ -- Variable: rl_hook_func_t * rl_event_hook
+     If non-zero, this is the address of a function to call periodically
+     when Readline is waiting for terminal input.  By default, this
+     will be called at most ten times a second if there is no keyboard
+     input.
+
+ -- Variable: rl_getc_func_t * rl_getc_function
+     If non-zero, Readline will call indirectly through this pointer to
+     get a character from the input stream.  By default, it is set to
+     `rl_getc', the default Readline character input function (*note
+     Character Input::).
+
+ -- Variable: rl_voidfunc_t * rl_redisplay_function
+     If non-zero, Readline will call indirectly through this pointer to
+     update the display with the current contents of the editing buffer.
+     By default, it is set to `rl_redisplay', the default Readline
+     redisplay function (*note Redisplay::).
+
+ -- Variable: rl_vintfunc_t * rl_prep_term_function
+     If non-zero, Readline will call indirectly through this pointer to
+     initialize the terminal.  The function takes a single argument, an
+     `int' flag that says whether or not to use eight-bit characters.
+     By default, this is set to `rl_prep_terminal' (*note Terminal
+     Management::).
+
+ -- Variable: rl_voidfunc_t * rl_deprep_term_function
+     If non-zero, Readline will call indirectly through this pointer to
+     reset the terminal.  This function should undo the effects of
+     `rl_prep_term_function'.  By default, this is set to
+     `rl_deprep_terminal' (*note Terminal Management::).
+
+ -- Variable: Keymap rl_executing_keymap
+     This variable is set to the keymap (*note Keymaps::) in which the
+     currently executing readline function was found.
+
+ -- Variable: Keymap rl_binding_keymap
+     This variable is set to the keymap (*note Keymaps::) in which the
+     last key binding occurred.
+
+ -- Variable: char * rl_executing_macro
+     This variable is set to the text of any currently-executing macro.
+
+ -- Variable: int rl_readline_state
+     A variable with bit values that encapsulate the current Readline
+     state.  A bit is set with the `RL_SETSTATE' macro, and unset with
+     the `RL_UNSETSTATE' macro.  Use the `RL_ISSTATE' macro to test
+     whether a particular state bit is set.  Current state bits include:
+
+    `RL_STATE_NONE'
+          Readline has not yet been called, nor has it begun to
+          intialize.
+
+    `RL_STATE_INITIALIZING'
+          Readline is initializing its internal data structures.
+
+    `RL_STATE_INITIALIZED'
+          Readline has completed its initialization.
+
+    `RL_STATE_TERMPREPPED'
+          Readline has modified the terminal modes to do its own input
+          and redisplay.
+
+    `RL_STATE_READCMD'
+          Readline is reading a command from the keyboard.
+
+    `RL_STATE_METANEXT'
+          Readline is reading more input after reading the meta-prefix
+          character.
+
+    `RL_STATE_DISPATCHING'
+          Readline is dispatching to a command.
+
+    `RL_STATE_MOREINPUT'
+          Readline is reading more input while executing an editing
+          command.
+
+    `RL_STATE_ISEARCH'
+          Readline is performing an incremental history search.
+
+    `RL_STATE_NSEARCH'
+          Readline is performing a non-incremental history search.
+
+    `RL_STATE_SEARCH'
+          Readline is searching backward or forward through the history
+          for a string.
+
+    `RL_STATE_NUMERICARG'
+          Readline is reading a numeric argument.
+
+    `RL_STATE_MACROINPUT'
+          Readline is currently getting its input from a
+          previously-defined keyboard macro.
+
+    `RL_STATE_MACRODEF'
+          Readline is currently reading characters defining a keyboard
+          macro.
+
+    `RL_STATE_OVERWRITE'
+          Readline is in overwrite mode.
+
+    `RL_STATE_COMPLETING'
+          Readline is performing word completion.
+
+    `RL_STATE_SIGHANDLER'
+          Readline is currently executing the readline signal handler.
+
+    `RL_STATE_UNDOING'
+          Readline is performing an undo.
+
+    `RL_STATE_DONE'
+          Readline has read a key sequence bound to `accept-line' and
+          is about to return the line to the caller.
+
+
+ -- Variable: int rl_explicit_arg
+     Set to a non-zero value if an explicit numeric argument was
+     specified by the user.  Only valid in a bindable command function.
+
+ -- Variable: int rl_numeric_arg
+     Set to the value of any numeric argument explicitly specified by
+     the user before executing the current Readline function.  Only
+     valid in a bindable command function.
+
+ -- Variable: int rl_editing_mode
+     Set to a value denoting Readline's current editing mode.  A value
+     of 1 means Readline is currently in emacs mode; 0 means that vi
+     mode is active.
+
+\1f
+File: readline.info,  Node: Readline Convenience Functions,  Next: Readline Signal Handling,  Prev: Readline Variables,  Up: Programming with GNU Readline
+
+2.4 Readline Convenience Functions
+==================================
+
+* Menu:
+
+* Function Naming::    How to give a function you write a name.
+* Keymaps::            Making keymaps.
+* Binding Keys::       Changing Keymaps.
+* Associating Function Names and Bindings::    Translate function names to
+                                               key sequences.
+* Allowing Undoing::   How to make your functions undoable.
+* Redisplay::          Functions to control line display.
+* Modifying Text::     Functions to modify `rl_line_buffer'.
+* Character Input::    Functions to read keyboard input.
+* Terminal Management::        Functions to manage terminal settings.
+* Utility Functions::  Generally useful functions and hooks.
+* Miscellaneous Functions::    Functions that don't fall into any category.
+* Alternate Interface::        Using Readline in a `callback' fashion.
+* A Readline Example::         An example Readline function.
+
+\1f
+File: readline.info,  Node: Function Naming,  Next: Keymaps,  Up: Readline Convenience Functions
+
+2.4.1 Naming a Function
+-----------------------
+
+The user can dynamically change the bindings of keys while using
+Readline.  This is done by representing the function with a descriptive
+name.  The user is able to type the descriptive name when referring to
+the function.  Thus, in an init file, one might find
+
+     Meta-Rubout:      backward-kill-word
+
+   This binds the keystroke <Meta-Rubout> to the function
+_descriptively_ named `backward-kill-word'.  You, as the programmer,
+should bind the functions you write to descriptive names as well.
+Readline provides a function for doing that:
+
+ -- Function: int rl_add_defun (const char *name, rl_command_func_t
+          *function, int key)
+     Add NAME to the list of named functions.  Make FUNCTION be the
+     function that gets called.  If KEY is not -1, then bind it to
+     FUNCTION using `rl_bind_key()'.
+
+   Using this function alone is sufficient for most applications.  It
+is the recommended way to add a few functions to the default functions
+that Readline has built in.  If you need to do something other than
+adding a function to Readline, you may need to use the underlying
+functions described below.
+
+\1f
+File: readline.info,  Node: Keymaps,  Next: Binding Keys,  Prev: Function Naming,  Up: Readline Convenience Functions
+
+2.4.2 Selecting a Keymap
+------------------------
+
+Key bindings take place on a "keymap".  The keymap is the association
+between the keys that the user types and the functions that get run.
+You can make your own keymaps, copy existing keymaps, and tell Readline
+which keymap to use.
+
+ -- Function: Keymap rl_make_bare_keymap (void)
+     Returns a new, empty keymap.  The space for the keymap is
+     allocated with `malloc()'; the caller should free it by calling
+     `rl_discard_keymap()' when done.
+
+ -- Function: Keymap rl_copy_keymap (Keymap map)
+     Return a new keymap which is a copy of MAP.
+
+ -- Function: Keymap rl_make_keymap (void)
+     Return a new keymap with the printing characters bound to
+     rl_insert, the lowercase Meta characters bound to run their
+     equivalents, and the Meta digits bound to produce numeric
+     arguments.
+
+ -- Function: void rl_discard_keymap (Keymap keymap)
+     Free the storage associated with KEYMAP.
+
+   Readline has several internal keymaps.  These functions allow you to
+change which keymap is active.
+
+ -- Function: Keymap rl_get_keymap (void)
+     Returns the currently active keymap.
+
+ -- Function: void rl_set_keymap (Keymap keymap)
+     Makes KEYMAP the currently active keymap.
+
+ -- Function: Keymap rl_get_keymap_by_name (const char *name)
+     Return the keymap matching NAME.  NAME is one which would be
+     supplied in a `set keymap' inputrc line (*note Readline Init
+     File::).
+
+ -- Function: char * rl_get_keymap_name (Keymap keymap)
+     Return the name matching KEYMAP.  NAME is one which would be
+     supplied in a `set keymap' inputrc line (*note Readline Init
+     File::).
+
+\1f
+File: readline.info,  Node: Binding Keys,  Next: Associating Function Names and Bindings,  Prev: Keymaps,  Up: Readline Convenience Functions
+
+2.4.3 Binding Keys
+------------------
+
+Key sequences are associate with functions through the keymap.
+Readline has several internal keymaps: `emacs_standard_keymap',
+`emacs_meta_keymap', `emacs_ctlx_keymap', `vi_movement_keymap', and
+`vi_insertion_keymap'.  `emacs_standard_keymap' is the default, and the
+examples in this manual assume that.
+
+   Since `readline()' installs a set of default key bindings the first
+time it is called, there is always the danger that a custom binding
+installed before the first call to `readline()' will be overridden.  An
+alternate mechanism is to install custom key bindings in an
+initialization function assigned to the `rl_startup_hook' variable
+(*note Readline Variables::).
+
+   These functions manage key bindings.
+
+ -- Function: int rl_bind_key (int key, rl_command_func_t *function)
+     Binds KEY to FUNCTION in the currently active keymap.  Returns
+     non-zero in the case of an invalid KEY.
+
+ -- Function: int rl_bind_key_in_map (int key, rl_command_func_t
+          *function, Keymap map)
+     Bind KEY to FUNCTION in MAP.  Returns non-zero in the case of an
+     invalid KEY.
+
+ -- Function: int rl_bind_key_if_unbound (int key, rl_command_func_t
+          *function)
+     Binds KEY to FUNCTION if it is not already bound in the currently
+     active keymap.  Returns non-zero in the case of an invalid KEY or
+     if KEY is already bound.
+
+ -- Function: int rl_bind_key_if_unbound_in_map (int key,
+          rl_command_func_t *function, Keymap map)
+     Binds KEY to FUNCTION if it is not already bound in MAP.  Returns
+     non-zero in the case of an invalid KEY or if KEY is already bound.
+
+ -- Function: int rl_unbind_key (int key)
+     Bind KEY to the null function in the currently active keymap.
+     Returns non-zero in case of error.
+
+ -- Function: int rl_unbind_key_in_map (int key, Keymap map)
+     Bind KEY to the null function in MAP.  Returns non-zero in case of
+     error.
+
+ -- Function: int rl_unbind_function_in_map (rl_command_func_t
+          *function, Keymap map)
+     Unbind all keys that execute FUNCTION in MAP.
+
+ -- Function: int rl_unbind_command_in_map (const char *command, Keymap
+          map)
+     Unbind all keys that are bound to COMMAND in MAP.
+
+ -- Function: int rl_bind_keyseq (const char *keyseq, rl_command_func_t
+          *function)
+     Bind the key sequence represented by the string KEYSEQ to the
+     function FUNCTION, beginning in the current keymap.  This makes
+     new keymaps as necessary.  The return value is non-zero if KEYSEQ
+     is invalid.
+
+ -- Function: int rl_bind_keyseq_in_map (const char *keyseq,
+          rl_command_func_t *function, Keymap map)
+     Bind the key sequence represented by the string KEYSEQ to the
+     function FUNCTION.  This makes new keymaps as necessary.  Initial
+     bindings are performed in MAP.  The return value is non-zero if
+     KEYSEQ is invalid.
+
+ -- Function: int rl_set_key (const char *keyseq, rl_command_func_t
+          *function, Keymap map)
+     Equivalent to `rl_bind_keyseq_in_map'.
+
+ -- Function: int rl_bind_keyseq_if_unbound (const char *keyseq,
+          rl_command_func_t *function)
+     Binds KEYSEQ to FUNCTION if it is not already bound in the
+     currently active keymap.  Returns non-zero in the case of an
+     invalid KEYSEQ or if KEYSEQ is already bound.
+
+ -- Function: int rl_bind_keyseq_if_unbound_in_map (const char *keyseq,
+          rl_command_func_t *function, Keymap map)
+     Binds KEYSEQ to FUNCTION if it is not already bound in MAP.
+     Returns non-zero in the case of an invalid KEYSEQ or if KEYSEQ is
+     already bound.
+
+ -- Function: int rl_generic_bind (int type, const char *keyseq, char
+          *data, Keymap map)
+     Bind the key sequence represented by the string KEYSEQ to the
+     arbitrary pointer DATA.  TYPE says what kind of data is pointed to
+     by DATA; this can be a function (`ISFUNC'), a macro (`ISMACR'), or
+     a keymap (`ISKMAP').  This makes new keymaps as necessary.  The
+     initial keymap in which to do bindings is MAP.
+
+ -- Function: int rl_parse_and_bind (char *line)
+     Parse LINE as if it had been read from the `inputrc' file and
+     perform any key bindings and variable assignments found (*note
+     Readline Init File::).
+
+ -- Function: int rl_read_init_file (const char *filename)
+     Read keybindings and variable assignments from FILENAME (*note
+     Readline Init File::).
+
+\1f
+File: readline.info,  Node: Associating Function Names and Bindings,  Next: Allowing Undoing,  Prev: Binding Keys,  Up: Readline Convenience Functions
+
+2.4.4 Associating Function Names and Bindings
+---------------------------------------------
+
+These functions allow you to find out what keys invoke named functions
+and the functions invoked by a particular key sequence.  You may also
+associate a new function name with an arbitrary function.
+
+ -- Function: rl_command_func_t * rl_named_function (const char *name)
+     Return the function with name NAME.
+
+ -- Function: rl_command_func_t * rl_function_of_keyseq (const char
+          *keyseq, Keymap map, int *type)
+     Return the function invoked by KEYSEQ in keymap MAP.  If MAP is
+     `NULL', the current keymap is used.  If TYPE is not `NULL', the
+     type of the object is returned in the `int' variable it points to
+     (one of `ISFUNC', `ISKMAP', or `ISMACR').
+
+ -- Function: char ** rl_invoking_keyseqs (rl_command_func_t *function)
+     Return an array of strings representing the key sequences used to
+     invoke FUNCTION in the current keymap.
+
+ -- Function: char ** rl_invoking_keyseqs_in_map (rl_command_func_t
+          *function, Keymap map)
+     Return an array of strings representing the key sequences used to
+     invoke FUNCTION in the keymap MAP.
+
+ -- Function: void rl_function_dumper (int readable)
+     Print the readline function names and the key sequences currently
+     bound to them to `rl_outstream'.  If READABLE is non-zero, the
+     list is formatted in such a way that it can be made part of an
+     `inputrc' file and re-read.
+
+ -- Function: void rl_list_funmap_names (void)
+     Print the names of all bindable Readline functions to
+     `rl_outstream'.
+
+ -- Function: const char ** rl_funmap_names (void)
+     Return a NULL terminated array of known function names.  The array
+     is sorted.  The array itself is allocated, but not the strings
+     inside.  You should `free()' the array when you are done, but not
+     the pointers.
+
+ -- Function: int rl_add_funmap_entry (const char *name,
+          rl_command_func_t *function)
+     Add NAME to the list of bindable Readline command names, and make
+     FUNCTION the function to be called when NAME is invoked.
+
+\1f
+File: readline.info,  Node: Allowing Undoing,  Next: Redisplay,  Prev: Associating Function Names and Bindings,  Up: Readline Convenience Functions
+
+2.4.5 Allowing Undoing
+----------------------
+
+Supporting the undo command is a painless thing, and makes your
+functions much more useful.  It is certainly easy to try something if
+you know you can undo it.
+
+   If your function simply inserts text once, or deletes text once, and
+uses `rl_insert_text()' or `rl_delete_text()' to do it, then undoing is
+already done for you automatically.
+
+   If you do multiple insertions or multiple deletions, or any
+combination of these operations, you should group them together into
+one operation.  This is done with `rl_begin_undo_group()' and
+`rl_end_undo_group()'.
+
+   The types of events that can be undone are:
+
+     enum undo_code { UNDO_DELETE, UNDO_INSERT, UNDO_BEGIN, UNDO_END };
+
+   Notice that `UNDO_DELETE' means to insert some text, and
+`UNDO_INSERT' means to delete some text.  That is, the undo code tells
+what to undo, not how to undo it.  `UNDO_BEGIN' and `UNDO_END' are tags
+added by `rl_begin_undo_group()' and `rl_end_undo_group()'.
+
+ -- Function: int rl_begin_undo_group (void)
+     Begins saving undo information in a group construct.  The undo
+     information usually comes from calls to `rl_insert_text()' and
+     `rl_delete_text()', but could be the result of calls to
+     `rl_add_undo()'.
+
+ -- Function: int rl_end_undo_group (void)
+     Closes the current undo group started with `rl_begin_undo_group
+     ()'.  There should be one call to `rl_end_undo_group()' for each
+     call to `rl_begin_undo_group()'.
+
+ -- Function: void rl_add_undo (enum undo_code what, int start, int
+          end, char *text)
+     Remember how to undo an event (according to WHAT).  The affected
+     text runs from START to END, and encompasses TEXT.
+
+ -- Function: void rl_free_undo_list (void)
+     Free the existing undo list.
+
+ -- Function: int rl_do_undo (void)
+     Undo the first thing on the undo list.  Returns `0' if there was
+     nothing to undo, non-zero if something was undone.
+
+   Finally, if you neither insert nor delete text, but directly modify
+the existing text (e.g., change its case), call `rl_modifying()' once,
+just before you modify the text.  You must supply the indices of the
+text range that you are going to modify.
+
+ -- Function: int rl_modifying (int start, int end)
+     Tell Readline to save the text between START and END as a single
+     undo unit.  It is assumed that you will subsequently modify that
+     text.
+
+\1f
+File: readline.info,  Node: Redisplay,  Next: Modifying Text,  Prev: Allowing Undoing,  Up: Readline Convenience Functions
+
+2.4.6 Redisplay
+---------------
+
+ -- Function: void rl_redisplay (void)
+     Change what's displayed on the screen to reflect the current
+     contents of `rl_line_buffer'.
+
+ -- Function: int rl_forced_update_display (void)
+     Force the line to be updated and redisplayed, whether or not
+     Readline thinks the screen display is correct.
+
+ -- Function: int rl_on_new_line (void)
+     Tell the update functions that we have moved onto a new (empty)
+     line, usually after ouputting a newline.
+
+ -- Function: int rl_on_new_line_with_prompt (void)
+     Tell the update functions that we have moved onto a new line, with
+     RL_PROMPT already displayed.  This could be used by applications
+     that want to output the prompt string themselves, but still need
+     Readline to know the prompt string length for redisplay.  It
+     should be used after setting RL_ALREADY_PROMPTED.
+
+ -- Function: int rl_reset_line_state (void)
+     Reset the display state to a clean state and redisplay the current
+     line starting on a new line.
+
+ -- Function: int rl_crlf (void)
+     Move the cursor to the start of the next screen line.
+
+ -- Function: int rl_show_char (int c)
+     Display character C on `rl_outstream'.  If Readline has not been
+     set to display meta characters directly, this will convert meta
+     characters to a meta-prefixed key sequence.  This is intended for
+     use by applications which wish to do their own redisplay.
+
+ -- Function: int rl_message (const char *, ...)
+     The arguments are a format string as would be supplied to `printf',
+     possibly containing conversion specifications such as `%d', and
+     any additional arguments necessary to satisfy the conversion
+     specifications.  The resulting string is displayed in the "echo
+     area".  The echo area is also used to display numeric arguments
+     and search strings.  You should call `rl_save_prompt' to save the
+     prompt information before calling this function.
+
+ -- Function: int rl_clear_message (void)
+     Clear the message in the echo area.  If the prompt was saved with
+     a call to `rl_save_prompt' before the last call to `rl_message',
+     call `rl_restore_prompt' before calling this function.
+
+ -- Function: void rl_save_prompt (void)
+     Save the local Readline prompt display state in preparation for
+     displaying a new message in the message area with `rl_message()'.
+
+ -- Function: void rl_restore_prompt (void)
+     Restore the local Readline prompt display state saved by the most
+     recent call to `rl_save_prompt'.  if `rl_save_prompt' was called
+     to save the prompt before a call to `rl_message', this function
+     should be called before the corresponding call to
+     `rl_clear_message'.
+
+ -- Function: int rl_expand_prompt (char *prompt)
+     Expand any special character sequences in PROMPT and set up the
+     local Readline prompt redisplay variables.  This function is
+     called by `readline()'.  It may also be called to expand the
+     primary prompt if the `rl_on_new_line_with_prompt()' function or
+     `rl_already_prompted' variable is used.  It returns the number of
+     visible characters on the last line of the (possibly multi-line)
+     prompt.  Applications may indicate that the prompt contains
+     characters that take up no physical screen space when displayed by
+     bracketing a sequence of such characters with the special markers
+     `RL_PROMPT_START_IGNORE' and `RL_PROMPT_END_IGNORE' (declared in
+     `readline.h'.  This may be used to embed terminal-specific escape
+     sequences in prompts.
+
+ -- Function: int rl_set_prompt (const char *prompt)
+     Make Readline use PROMPT for subsequent redisplay.  This calls
+     `rl_expand_prompt()' to expand the prompt and sets `rl_prompt' to
+     the result.
+
+\1f
+File: readline.info,  Node: Modifying Text,  Next: Character Input,  Prev: Redisplay,  Up: Readline Convenience Functions
+
+2.4.7 Modifying Text
+--------------------
+
+ -- Function: int rl_insert_text (const char *text)
+     Insert TEXT into the line at the current cursor position.  Returns
+     the number of characters inserted.
+
+ -- Function: int rl_delete_text (int start, int end)
+     Delete the text between START and END in the current line.
+     Returns the number of characters deleted.
+
+ -- Function: char * rl_copy_text (int start, int end)
+     Return a copy of the text between START and END in the current
+     line.
+
+ -- Function: int rl_kill_text (int start, int end)
+     Copy the text between START and END in the current line to the
+     kill ring, appending or prepending to the last kill if the last
+     command was a kill command.  The text is deleted.  If START is
+     less than END, the text is appended, otherwise prepended.  If the
+     last command was not a kill, a new kill ring slot is used.
+
+ -- Function: int rl_push_macro_input (char *macro)
+     Cause MACRO to be inserted into the line, as if it had been invoked
+     by a key bound to a macro.  Not especially useful; use
+     `rl_insert_text()' instead.
+
+\1f
+File: readline.info,  Node: Character Input,  Next: Terminal Management,  Prev: Modifying Text,  Up: Readline Convenience Functions
+
+2.4.8 Character Input
+---------------------
+
+ -- Function: int rl_read_key (void)
+     Return the next character available from Readline's current input
+     stream.  This handles input inserted into the input stream via
+     RL_PENDING_INPUT (*note Readline Variables::) and
+     `rl_stuff_char()', macros, and characters read from the keyboard.
+     While waiting for input, this function will call any function
+     assigned to the `rl_event_hook' variable.
+
+ -- Function: int rl_getc (FILE *stream)
+     Return the next character available from STREAM, which is assumed
+     to be the keyboard.
+
+ -- Function: int rl_stuff_char (int c)
+     Insert C into the Readline input stream.  It will be "read" before
+     Readline attempts to read characters from the terminal with
+     `rl_read_key()'.  Up to 512 characters may be pushed back.
+     `rl_stuff_char' returns 1 if the character was successfully
+     inserted; 0 otherwise.
+
+ -- Function: int rl_execute_next (int c)
+     Make C be the next command to be executed when `rl_read_key()' is
+     called.  This sets RL_PENDING_INPUT.
+
+ -- Function: int rl_clear_pending_input (void)
+     Unset RL_PENDING_INPUT, effectively negating the effect of any
+     previous call to `rl_execute_next()'.  This works only if the
+     pending input has not already been read with `rl_read_key()'.
+
+ -- Function: int rl_set_keyboard_input_timeout (int u)
+     While waiting for keyboard input in `rl_read_key()', Readline will
+     wait for U microseconds for input before calling any function
+     assigned to `rl_event_hook'.  U must be greater than or equal to
+     zero (a zero-length timeout is equivalent to a poll).  The default
+     waiting period is one-tenth of a second.  Returns the old timeout
+     value.
+
+\1f
+File: readline.info,  Node: Terminal Management,  Next: Utility Functions,  Prev: Character Input,  Up: Readline Convenience Functions
+
+2.4.9 Terminal Management
+-------------------------
+
+ -- Function: void rl_prep_terminal (int meta_flag)
+     Modify the terminal settings for Readline's use, so `readline()'
+     can read a single character at a time from the keyboard.  The
+     META_FLAG argument should be non-zero if Readline should read
+     eight-bit input.
+
+ -- Function: void rl_deprep_terminal (void)
+     Undo the effects of `rl_prep_terminal()', leaving the terminal in
+     the state in which it was before the most recent call to
+     `rl_prep_terminal()'.
+
+ -- Function: void rl_tty_set_default_bindings (Keymap kmap)
+     Read the operating system's terminal editing characters (as would
+     be displayed by `stty') to their Readline equivalents.  The
+     bindings are performed in KMAP.
+
+ -- Function: void rl_tty_unset_default_bindings (Keymap kmap)
+     Reset the bindings manipulated by `rl_tty_set_default_bindings' so
+     that the terminal editing characters are bound to `rl_insert'.
+     The bindings are performed in KMAP.
+
+ -- Function: int rl_reset_terminal (const char *terminal_name)
+     Reinitialize Readline's idea of the terminal settings using
+     TERMINAL_NAME as the terminal type (e.g., `vt100').  If
+     TERMINAL_NAME is `NULL', the value of the `TERM' environment
+     variable is used.
+
+\1f
+File: readline.info,  Node: Utility Functions,  Next: Miscellaneous Functions,  Prev: Terminal Management,  Up: Readline Convenience Functions
+
+2.4.10 Utility Functions
+------------------------
+
+ -- Function: void rl_replace_line (const char *text, int clear_undo)
+     Replace the contents of `rl_line_buffer' with TEXT.  The point and
+     mark are preserved, if possible.  If CLEAR_UNDO is non-zero, the
+     undo list associated with the current line is cleared.
+
+ -- Function: int rl_extend_line_buffer (int len)
+     Ensure that `rl_line_buffer' has enough space to hold LEN
+     characters, possibly reallocating it if necessary.
+
+ -- Function: int rl_initialize (void)
+     Initialize or re-initialize Readline's internal state.  It's not
+     strictly necessary to call this; `readline()' calls it before
+     reading any input.
+
+ -- Function: int rl_ding (void)
+     Ring the terminal bell, obeying the setting of `bell-style'.
+
+ -- Function: int rl_alphabetic (int c)
+     Return 1 if C is an alphabetic character.
+
+ -- Function: void rl_display_match_list (char **matches, int len, int
+          max)
+     A convenience function for displaying a list of strings in
+     columnar format on Readline's output stream.  `matches' is the list
+     of strings, in argv format, such as a list of completion matches.
+     `len' is the number of strings in `matches', and `max' is the
+     length of the longest string in `matches'.  This function uses the
+     setting of `print-completions-horizontally' to select how the
+     matches are displayed (*note Readline Init File Syntax::).
+
+   The following are implemented as macros, defined in `chardefs.h'.
+Applications should refrain from using them.
+
+ -- Function: int _rl_uppercase_p (int c)
+     Return 1 if C is an uppercase alphabetic character.
+
+ -- Function: int _rl_lowercase_p (int c)
+     Return 1 if C is a lowercase alphabetic character.
+
+ -- Function: int _rl_digit_p (int c)
+     Return 1 if C is a numeric character.
+
+ -- Function: int _rl_to_upper (int c)
+     If C is a lowercase alphabetic character, return the corresponding
+     uppercase character.
+
+ -- Function: int _rl_to_lower (int c)
+     If C is an uppercase alphabetic character, return the corresponding
+     lowercase character.
+
+ -- Function: int _rl_digit_value (int c)
+     If C is a number, return the value it represents.
+
+\1f
+File: readline.info,  Node: Miscellaneous Functions,  Next: Alternate Interface,  Prev: Utility Functions,  Up: Readline Convenience Functions
+
+2.4.11 Miscellaneous Functions
+------------------------------
+
+ -- Function: int rl_macro_bind (const char *keyseq, const char *macro,
+          Keymap map)
+     Bind the key sequence KEYSEQ to invoke the macro MACRO.  The
+     binding is performed in MAP.  When KEYSEQ is invoked, the MACRO
+     will be inserted into the line.  This function is deprecated; use
+     `rl_generic_bind()' instead.
+
+ -- Function: void rl_macro_dumper (int readable)
+     Print the key sequences bound to macros and their values, using
+     the current keymap, to `rl_outstream'.  If READABLE is non-zero,
+     the list is formatted in such a way that it can be made part of an
+     `inputrc' file and re-read.
+
+ -- Function: int rl_variable_bind (const char *variable, const char
+          *value)
+     Make the Readline variable VARIABLE have VALUE.  This behaves as
+     if the readline command `set VARIABLE VALUE' had been executed in
+     an `inputrc' file (*note Readline Init File Syntax::).
+
+ -- Function: char * rl_variable_value (const char *variable)
+     Return a string representing the value of the Readline variable
+     VARIABLE.  For boolean variables, this string is either `on' or
+     `off'.
+
+ -- Function: void rl_variable_dumper (int readable)
+     Print the readline variable names and their current values to
+     `rl_outstream'.  If READABLE is non-zero, the list is formatted in
+     such a way that it can be made part of an `inputrc' file and
+     re-read.
+
+ -- Function: int rl_set_paren_blink_timeout (int u)
+     Set the time interval (in microseconds) that Readline waits when
+     showing a balancing character when `blink-matching-paren' has been
+     enabled.
+
+ -- Function: char * rl_get_termcap (const char *cap)
+     Retrieve the string value of the termcap capability CAP.  Readline
+     fetches the termcap entry for the current terminal name and uses
+     those capabilities to move around the screen line and perform other
+     terminal-specific operations, like erasing a line.  Readline does
+     not use all of a terminal's capabilities, and this function will
+     return values for only those capabilities Readline uses.
+
+\1f
+File: readline.info,  Node: Alternate Interface,  Next: A Readline Example,  Prev: Miscellaneous Functions,  Up: Readline Convenience Functions
+
+2.4.12 Alternate Interface
+--------------------------
+
+An alternate interface is available to plain `readline()'.  Some
+applications need to interleave keyboard I/O with file, device, or
+window system I/O, typically by using a main loop to `select()' on
+various file descriptors.  To accomodate this need, readline can also
+be invoked as a `callback' function from an event loop.  There are
+functions available to make this easy.
+
+ -- Function: void rl_callback_handler_install (const char *prompt,
+          rl_vcpfunc_t *lhandler)
+     Set up the terminal for readline I/O and display the initial
+     expanded value of PROMPT.  Save the value of LHANDLER to use as a
+     function to call when a complete line of input has been entered.
+     The function takes the text of the line as an argument.
+
+ -- Function: void rl_callback_read_char (void)
+     Whenever an application determines that keyboard input is
+     available, it should call `rl_callback_read_char()', which will
+     read the next character from the current input source.  If that
+     character completes the line, `rl_callback_read_char' will invoke
+     the LHANDLER function saved by `rl_callback_handler_install' to
+     process the line.  Before calling the LHANDLER function, the
+     terminal settings are reset to the values they had before calling
+     `rl_callback_handler_install'.  If the LHANDLER function returns,
+     the terminal settings are modified for Readline's use again.
+     `EOF' is  indicated by calling LHANDLER with a `NULL' line.
+
+ -- Function: void rl_callback_handler_remove (void)
+     Restore the terminal to its initial state and remove the line
+     handler.  This may be called from within a callback as well as
+     independently.  If the LHANDLER installed by
+     `rl_callback_handler_install' does not exit the program, either
+     this function or the function referred to by the value of
+     `rl_deprep_term_function' should be called before the program
+     exits to reset the terminal settings.
+
+\1f
+File: readline.info,  Node: A Readline Example,  Prev: Alternate Interface,  Up: Readline Convenience Functions
+
+2.4.13 A Readline Example
+-------------------------
+
+Here is a function which changes lowercase characters to their uppercase
+equivalents, and uppercase characters to lowercase.  If this function
+was bound to `M-c', then typing `M-c' would change the case of the
+character under point.  Typing `M-1 0 M-c' would change the case of the
+following 10 characters, leaving the cursor on the last character
+changed.
+
+     /* Invert the case of the COUNT following characters. */
+     int
+     invert_case_line (count, key)
+          int count, key;
+     {
+       register int start, end, i;
+
+       start = rl_point;
+
+       if (rl_point >= rl_end)
+         return (0);
+
+       if (count < 0)
+         {
+           direction = -1;
+           count = -count;
+         }
+       else
+         direction = 1;
+
+       /* Find the end of the range to modify. */
+       end = start + (count * direction);
+
+       /* Force it to be within range. */
+       if (end > rl_end)
+         end = rl_end;
+       else if (end < 0)
+         end = 0;
+
+       if (start == end)
+         return (0);
+
+       if (start > end)
+         {
+           int temp = start;
+           start = end;
+           end = temp;
+         }
+
+       /* Tell readline that we are modifying the line,
+          so it will save the undo information. */
+       rl_modifying (start, end);
+
+       for (i = start; i != end; i++)
+         {
+           if (_rl_uppercase_p (rl_line_buffer[i]))
+             rl_line_buffer[i] = _rl_to_lower (rl_line_buffer[i]);
+           else if (_rl_lowercase_p (rl_line_buffer[i]))
+             rl_line_buffer[i] = _rl_to_upper (rl_line_buffer[i]);
+         }
+       /* Move point to on top of the last character changed. */
+       rl_point = (direction == 1) ? end - 1 : start;
+       return (0);
+     }
+
+\1f
+File: readline.info,  Node: Readline Signal Handling,  Next: Custom Completers,  Prev: Readline Convenience Functions,  Up: Programming with GNU Readline
+
+2.5 Readline Signal Handling
+============================
+
+Signals are asynchronous events sent to a process by the Unix kernel,
+sometimes on behalf of another process.  They are intended to indicate
+exceptional events, like a user pressing the interrupt key on his
+terminal, or a network connection being broken.  There is a class of
+signals that can be sent to the process currently reading input from
+the keyboard.  Since Readline changes the terminal attributes when it
+is called, it needs to perform special processing when such a signal is
+received in order to restore the terminal to a sane state, or provide
+application writers with functions to do so manually.
+
+   Readline contains an internal signal handler that is installed for a
+number of signals (`SIGINT', `SIGQUIT', `SIGTERM', `SIGALRM',
+`SIGTSTP', `SIGTTIN', and `SIGTTOU').  When one of these signals is
+received, the signal handler will reset the terminal attributes to
+those that were in effect before `readline()' was called, reset the
+signal handling to what it was before `readline()' was called, and
+resend the signal to the calling application.  If and when the calling
+application's signal handler returns, Readline will reinitialize the
+terminal and continue to accept input.  When a `SIGINT' is received,
+the Readline signal handler performs some additional work, which will
+cause any partially-entered line to be aborted (see the description of
+`rl_free_line_state()' below).
+
+   There is an additional Readline signal handler, for `SIGWINCH', which
+the kernel sends to a process whenever the terminal's size changes (for
+example, if a user resizes an `xterm').  The Readline `SIGWINCH'
+handler updates Readline's internal screen size information, and then
+calls any `SIGWINCH' signal handler the calling application has
+installed.  Readline calls the application's `SIGWINCH' signal handler
+without resetting the terminal to its original state.  If the
+application's signal handler does more than update its idea of the
+terminal size and return (for example, a `longjmp' back to a main
+processing loop), it _must_ call `rl_cleanup_after_signal()' (described
+below), to restore the terminal state.
+
+   Readline provides two variables that allow application writers to
+control whether or not it will catch certain signals and act on them
+when they are received.  It is important that applications change the
+values of these variables only when calling `readline()', not in a
+signal handler, so Readline's internal signal state is not corrupted.
+
+ -- Variable: int rl_catch_signals
+     If this variable is non-zero, Readline will install signal
+     handlers for `SIGINT', `SIGQUIT', `SIGTERM', `SIGALRM', `SIGTSTP',
+     `SIGTTIN', and `SIGTTOU'.
+
+     The default value of `rl_catch_signals' is 1.
+
+ -- Variable: int rl_catch_sigwinch
+     If this variable is non-zero, Readline will install a signal
+     handler for `SIGWINCH'.
+
+     The default value of `rl_catch_sigwinch' is 1.
+
+   If an application does not wish to have Readline catch any signals,
+or to handle signals other than those Readline catches (`SIGHUP', for
+example), Readline provides convenience functions to do the necessary
+terminal and internal state cleanup upon receipt of a signal.
+
+ -- Function: void rl_cleanup_after_signal (void)
+     This function will reset the state of the terminal to what it was
+     before `readline()' was called, and remove the Readline signal
+     handlers for all signals, depending on the values of
+     `rl_catch_signals' and `rl_catch_sigwinch'.
+
+ -- Function: void rl_free_line_state (void)
+     This will free any partial state associated with the current input
+     line (undo information, any partial history entry, any
+     partially-entered keyboard macro, and any partially-entered
+     numeric argument).  This should be called before
+     `rl_cleanup_after_signal()'.  The Readline signal handler for
+     `SIGINT' calls this to abort the current input line.
+
+ -- Function: void rl_reset_after_signal (void)
+     This will reinitialize the terminal and reinstall any Readline
+     signal handlers, depending on the values of `rl_catch_signals' and
+     `rl_catch_sigwinch'.
+
+   If an application does not wish Readline to catch `SIGWINCH', it may
+call `rl_resize_terminal()' or `rl_set_screen_size()' to force Readline
+to update its idea of the terminal size when a `SIGWINCH' is received.
+
+ -- Function: void rl_resize_terminal (void)
+     Update Readline's internal screen size by reading values from the
+     kernel.
+
+ -- Function: void rl_set_screen_size (int rows, int cols)
+     Set Readline's idea of the terminal size to ROWS rows and COLS
+     columns.  If either ROWS or COLUMNS is less than or equal to 0,
+     Readline's idea of that terminal dimension is unchanged.
+
+   If an application does not want to install a `SIGWINCH' handler, but
+is still interested in the screen dimensions, Readline's idea of the
+screen size may be queried.
+
+ -- Function: void rl_get_screen_size (int *rows, int *cols)
+     Return Readline's idea of the terminal's size in the variables
+     pointed to by the arguments.
+
+ -- Function: void rl_reset_screen_size (void)
+     Cause Readline to reobtain the screen size and recalculate its
+     dimensions.
+
+   The following functions install and remove Readline's signal
+handlers.
+
+ -- Function: int rl_set_signals (void)
+     Install Readline's signal handler for `SIGINT', `SIGQUIT',
+     `SIGTERM', `SIGALRM', `SIGTSTP', `SIGTTIN', `SIGTTOU', and
+     `SIGWINCH', depending on the values of `rl_catch_signals' and
+     `rl_catch_sigwinch'.
+
+ -- Function: int rl_clear_signals (void)
+     Remove all of the Readline signal handlers installed by
+     `rl_set_signals()'.
+
+\1f
+File: readline.info,  Node: Custom Completers,  Prev: Readline Signal Handling,  Up: Programming with GNU Readline
+
+2.6 Custom Completers
+=====================
+
+Typically, a program that reads commands from the user has a way of
+disambiguating commands and data.  If your program is one of these, then
+it can provide completion for commands, data, or both.  The following
+sections describe how your program and Readline cooperate to provide
+this service.
+
+* Menu:
+
+* How Completing Works::       The logic used to do completion.
+* Completion Functions::       Functions provided by Readline.
+* Completion Variables::       Variables which control completion.
+* A Short Completion Example:: An example of writing completer subroutines.
+
+\1f
+File: readline.info,  Node: How Completing Works,  Next: Completion Functions,  Up: Custom Completers
+
+2.6.1 How Completing Works
+--------------------------
+
+In order to complete some text, the full list of possible completions
+must be available.  That is, it is not possible to accurately expand a
+partial word without knowing all of the possible words which make sense
+in that context.  The Readline library provides the user interface to
+completion, and two of the most common completion functions:  filename
+and username.  For completing other types of text, you must write your
+own completion function.  This section describes exactly what such
+functions must do, and provides an example.
+
+   There are three major functions used to perform completion:
+
+  1. The user-interface function `rl_complete()'.  This function is
+     called with the same arguments as other bindable Readline
+     functions: COUNT and INVOKING_KEY.  It isolates the word to be
+     completed and calls `rl_completion_matches()' to generate a list
+     of possible completions.  It then either lists the possible
+     completions, inserts the possible completions, or actually
+     performs the completion, depending on which behavior is desired.
+
+  2. The internal function `rl_completion_matches()' uses an
+     application-supplied "generator" function to generate the list of
+     possible matches, and then returns the array of these matches.
+     The caller should place the address of its generator function in
+     `rl_completion_entry_function'.
+
+  3. The generator function is called repeatedly from
+     `rl_completion_matches()', returning a string each time.  The
+     arguments to the generator function are TEXT and STATE.  TEXT is
+     the partial word to be completed.  STATE is zero the first time
+     the function is called, allowing the generator to perform any
+     necessary initialization, and a positive non-zero integer for each
+     subsequent call.  The generator function returns `(char *)NULL' to
+     inform `rl_completion_matches()' that there are no more
+     possibilities left.  Usually the generator function computes the
+     list of possible completions when STATE is zero, and returns them
+     one at a time on subsequent calls.  Each string the generator
+     function returns as a match must be allocated with `malloc()';
+     Readline frees the strings when it has finished with them.  Such a
+     generator function is referred to as an "application-specific
+     completion function".
+
+
+ -- Function: int rl_complete (int ignore, int invoking_key)
+     Complete the word at or before point.  You have supplied the
+     function that does the initial simple matching selection algorithm
+     (see `rl_completion_matches()').  The default is to do filename
+     completion.
+
+ -- Variable: rl_compentry_func_t * rl_completion_entry_function
+     This is a pointer to the generator function for
+     `rl_completion_matches()'.  If the value of
+     `rl_completion_entry_function' is `NULL' then the default filename
+     generator function, `rl_filename_completion_function()', is used.
+     An "application-specific completion function" is a function whose
+     address is assigned to `rl_completion_entry_function' and whose
+     return values are used to  generate possible completions.
+
+\1f
+File: readline.info,  Node: Completion Functions,  Next: Completion Variables,  Prev: How Completing Works,  Up: Custom Completers
+
+2.6.2 Completion Functions
+--------------------------
+
+Here is the complete list of callable completion functions present in
+Readline.
+
+ -- Function: int rl_complete_internal (int what_to_do)
+     Complete the word at or before point.  WHAT_TO_DO says what to do
+     with the completion.  A value of `?' means list the possible
+     completions.  `TAB' means do standard completion.  `*' means
+     insert all of the possible completions.  `!' means to display all
+     of the possible completions, if there is more than one, as well as
+     performing partial completion.  `@' is similar to `!', but
+     possible completions are not listed if the possible completions
+     share a common prefix.
+
+ -- Function: int rl_complete (int ignore, int invoking_key)
+     Complete the word at or before point.  You have supplied the
+     function that does the initial simple matching selection algorithm
+     (see `rl_completion_matches()' and `rl_completion_entry_function').
+     The default is to do filename completion.  This calls
+     `rl_complete_internal()' with an argument depending on
+     INVOKING_KEY.
+
+ -- Function: int rl_possible_completions (int count, int invoking_key)
+     List the possible completions.  See description of `rl_complete
+     ()'.  This calls `rl_complete_internal()' with an argument of `?'.
+
+ -- Function: int rl_insert_completions (int count, int invoking_key)
+     Insert the list of possible completions into the line, deleting the
+     partially-completed word.  See description of `rl_complete()'.
+     This calls `rl_complete_internal()' with an argument of `*'.
+
+ -- Function: int rl_completion_mode (rl_command_func_t *cfunc)
+     Returns the apppriate value to pass to `rl_complete_internal()'
+     depending on whether CFUNC was called twice in succession and the
+     values of the `show-all-if-ambiguous' and `show-all-if-unmodified'
+     variables.  Application-specific completion functions may use this
+     function to present the same interface as `rl_complete()'.
+
+ -- Function: char ** rl_completion_matches (const char *text,
+          rl_compentry_func_t *entry_func)
+     Returns an array of strings which is a list of completions for
+     TEXT.  If there are no completions, returns `NULL'.  The first
+     entry in the returned array is the substitution for TEXT.  The
+     remaining entries are the possible completions.  The array is
+     terminated with a `NULL' pointer.
+
+     ENTRY_FUNC is a function of two args, and returns a `char *'.  The
+     first argument is TEXT.  The second is a state argument; it is
+     zero on the first call, and non-zero on subsequent calls.
+     ENTRY_FUNC returns a `NULL'  pointer to the caller when there are
+     no more matches.
+
+ -- Function: char * rl_filename_completion_function (const char *text,
+          int state)
+     A generator function for filename completion in the general case.
+     TEXT is a partial filename.  The Bash source is a useful reference
+     for writing application-specific completion functions (the Bash
+     completion functions call this and other Readline functions).
+
+ -- Function: char * rl_username_completion_function (const char *text,
+          int state)
+     A completion generator for usernames.  TEXT contains a partial
+     username preceded by a random character (usually `~').  As with all
+     completion generators, STATE is zero on the first call and non-zero
+     for subsequent calls.
+
+\1f
+File: readline.info,  Node: Completion Variables,  Next: A Short Completion Example,  Prev: Completion Functions,  Up: Custom Completers
+
+2.6.3 Completion Variables
+--------------------------
+
+ -- Variable: rl_compentry_func_t * rl_completion_entry_function
+     A pointer to the generator function for `rl_completion_matches()'.
+     `NULL' means to use `rl_filename_completion_function()', the
+     default filename completer.
+
+ -- Variable: rl_completion_func_t * rl_attempted_completion_function
+     A pointer to an alternative function to create matches.  The
+     function is called with TEXT, START, and END.  START and END are
+     indices in `rl_line_buffer' defining the boundaries of TEXT, which
+     is a character string.  If this function exists and returns
+     `NULL', or if this variable is set to `NULL', then `rl_complete()'
+     will call the value of `rl_completion_entry_function' to generate
+     matches, otherwise the array of strings returned will be used.  If
+     this function sets the `rl_attempted_completion_over' variable to
+     a non-zero value, Readline will not perform its default completion
+     even if this function returns no matches.
+
+ -- Variable: rl_quote_func_t * rl_filename_quoting_function
+     A pointer to a function that will quote a filename in an
+     application-specific fashion.  This is called if filename
+     completion is being attempted and one of the characters in
+     `rl_filename_quote_characters' appears in a completed filename.
+     The function is called with TEXT, MATCH_TYPE, and QUOTE_POINTER.
+     The TEXT is the filename to be quoted.  The MATCH_TYPE is either
+     `SINGLE_MATCH', if there is only one completion match, or
+     `MULT_MATCH'.  Some functions use this to decide whether or not to
+     insert a closing quote character.  The QUOTE_POINTER is a pointer
+     to any opening quote character the user typed.  Some functions
+     choose to reset this character.
+
+ -- Variable: rl_dequote_func_t * rl_filename_dequoting_function
+     A pointer to a function that will remove application-specific
+     quoting characters from a filename before completion is attempted,
+     so those characters do not interfere with matching the text
+     against names in the filesystem.  It is called with TEXT, the text
+     of the word to be dequoted, and QUOTE_CHAR, which is the quoting
+     character that delimits the filename (usually `'' or `"').  If
+     QUOTE_CHAR is zero, the filename was not in an embedded string.
+
+ -- Variable: rl_linebuf_func_t * rl_char_is_quoted_p
+     A pointer to a function to call that determines whether or not a
+     specific character in the line buffer is quoted, according to
+     whatever quoting mechanism the program calling Readline uses.  The
+     function is called with two arguments: TEXT, the text of the line,
+     and INDEX, the index of the character in the line.  It is used to
+     decide whether a character found in
+     `rl_completer_word_break_characters' should be used to break words
+     for the completer.
+
+ -- Variable: rl_compignore_func_t * rl_ignore_some_completions_function
+     This function, if defined, is called by the completer when real
+     filename completion is done, after all the matching names have
+     been generated.  It is passed a `NULL' terminated array of matches.
+     The first element (`matches[0]') is the maximal substring common
+     to all matches. This function can re-arrange the list of matches
+     as required, but each element deleted from the array must be freed.
+
+ -- Variable: rl_icppfunc_t * rl_directory_completion_hook
+     This function, if defined, is allowed to modify the directory
+     portion of filenames Readline completes.  It is called with the
+     address of a string (the current directory name) as an argument,
+     and may modify that string.  If the string is replaced with a new
+     string, the old value should be freed.  Any modified directory
+     name should have a trailing slash.  The modified value will be
+     displayed as part of the completion, replacing the directory
+     portion of the pathname the user typed.  It returns an integer
+     that should be non-zero if the function modifies its directory
+     argument.  It could be used to expand symbolic links or shell
+     variables in pathnames.  At the least, even if no other expansion
+     is performed, this function should remove any quote characters
+     from the directory name, because its result will be passed
+     directly to `opendir()'.
+
+ -- Variable: rl_compdisp_func_t * rl_completion_display_matches_hook
+     If non-zero, then this is the address of a function to call when
+     completing a word would normally display the list of possible
+     matches.  This function is called in lieu of Readline displaying
+     the list.  It takes three arguments: (`char **'MATCHES, `int'
+     NUM_MATCHES, `int' MAX_LENGTH) where MATCHES is the array of
+     matching strings, NUM_MATCHES is the number of strings in that
+     array, and MAX_LENGTH is the length of the longest string in that
+     array.  Readline provides a convenience function,
+     `rl_display_match_list', that takes care of doing the display to
+     Readline's output stream.  That function may be called from this
+     hook.
+
+ -- Variable: const char * rl_basic_word_break_characters
+     The basic list of characters that signal a break between words for
+     the completer routine.  The default value of this variable is the
+     characters which break words for completion in Bash: `"
+     \t\n\"\\'`@$><=;|&{("'.
+
+ -- Variable: const char * rl_basic_quote_characters
+     A list of quote characters which can cause a word break.
+
+ -- Variable: const char * rl_completer_word_break_characters
+     The list of characters that signal a break between words for
+     `rl_complete_internal()'.  The default list is the value of
+     `rl_basic_word_break_characters'.
+
+ -- Variable: rl_cpvfunc_t * rl_completion_word_break_hook
+     If non-zero, this is the address of a function to call when
+     Readline is deciding where to separate words for word completion.
+     It should return a character string like
+     `rl_completer_word_break_characters' to be used to perform the
+     current completion.  The function may choose to set
+     `rl_completer_word_break_characters' itself.  If the function
+     returns `NULL', `rl_completer_word_break_characters' is used.
+
+ -- Variable: const char * rl_completer_quote_characters
+     A list of characters which can be used to quote a substring of the
+     line.  Completion occurs on the entire substring, and within the
+     substring `rl_completer_word_break_characters' are treated as any
+     other character, unless they also appear within this list.
+
+ -- Variable: const char * rl_filename_quote_characters
+     A list of characters that cause a filename to be quoted by the
+     completer when they appear in a completed filename.  The default
+     is the null string.
+
+ -- Variable: const char * rl_special_prefixes
+     The list of characters that are word break characters, but should
+     be left in TEXT when it is passed to the completion function.
+     Programs can use this to help determine what kind of completing to
+     do.  For instance, Bash sets this variable to "$@" so that it can
+     complete shell variables and hostnames.
+
+ -- Variable: int rl_completion_query_items
+     Up to this many items will be displayed in response to a
+     possible-completions call.  After that, readline asks the user if
+     she is sure she wants to see them all.  The default value is 100.
+     A negative value indicates that Readline should never ask the user.
+
+ -- Variable: int rl_completion_append_character
+     When a single completion alternative matches at the end of the
+     command line, this character is appended to the inserted
+     completion text.  The default is a space character (` ').  Setting
+     this to the null character (`\0') prevents anything being appended
+     automatically.  This can be changed in application-specific
+     completion functions to provide the "most sensible word separator
+     character" according to an application-specific command line
+     syntax specification.
+
+ -- Variable: int rl_completion_suppress_append
+     If non-zero, RL_COMPLETION_APPEND_CHARACTER is not appended to
+     matches at the end of the command line, as described above.  It is
+     set to 0 before any application-specific completion function is
+     called, and may only be changed within such a function.
+
+ -- Variable: int rl_completion_quote_character
+     When Readline is completing quoted text, as delimited by one of the
+     characters in RL_COMPLETER_QUOTE_CHARACTERS, it sets this variable
+     to the quoting character found.  This is set before any
+     application-specific completion function is called.
+
+ -- Variable: int rl_completion_suppress_quote
+     If non-zero, Readline does not append a matching quote character
+     when performing completion on a quoted string.  It is set to 0
+     before any application-specific completion function is called, and
+     may only be changed within such a function.
+
+ -- Variable: int rl_completion_found_quote
+     When Readline is completing quoted text, it sets this variable to
+     a non-zero value if the word being completed contains or is
+     delimited by any quoting characters, including backslashes.  This
+     is set before any application-specific completion function is
+     called.
+
+ -- Variable: int rl_completion_mark_symlink_dirs
+     If non-zero, a slash will be appended to completed filenames that
+     are symbolic links to directory names, subject to the value of the
+     user-settable MARK-DIRECTORIES variable.  This variable exists so
+     that application-specific completion functions can override the
+     user's global preference (set via the MARK-SYMLINKED-DIRECTORIES
+     Readline variable) if appropriate.  This variable is set to the
+     user's preference before any application-specific completion
+     function is called, so unless that function modifies the value,
+     the user's preferences are honored.
+
+ -- Variable: int rl_ignore_completion_duplicates
+     If non-zero, then duplicates in the matches are removed.  The
+     default is 1.
+
+ -- Variable: int rl_filename_completion_desired
+     Non-zero means that the results of the matches are to be treated as
+     filenames.  This is _always_ zero when completion is attempted,
+     and can only be changed within an application-specific completion
+     function.  If it is set to a non-zero value by such a function,
+     directory names have a slash appended and Readline attempts to
+     quote completed filenames if they contain any characters in
+     `rl_filename_quote_characters' and `rl_filename_quoting_desired'
+     is set to a non-zero value.
+
+ -- Variable: int rl_filename_quoting_desired
+     Non-zero means that the results of the matches are to be quoted
+     using double quotes (or an application-specific quoting mechanism)
+     if the completed filename contains any characters in
+     `rl_filename_quote_chars'.  This is _always_ non-zero when
+     completion is attempted, and can only be changed within an
+     application-specific completion function.  The quoting is effected
+     via a call to the function pointed to by
+     `rl_filename_quoting_function'.
+
+ -- Variable: int rl_attempted_completion_over
+     If an application-specific completion function assigned to
+     `rl_attempted_completion_function' sets this variable to a non-zero
+     value, Readline will not perform its default filename completion
+     even if the application's completion function returns no matches.
+     It should be set only by an application's completion function.
+
+ -- Variable: int rl_completion_type
+     Set to a character describing the type of completion Readline is
+     currently attempting; see the description of
+     `rl_complete_internal()' (*note Completion Functions::) for the
+     list of characters.  This is set to the appropriate value before
+     any application-specific completion function is called, allowing
+     such functions to present the same interface as `rl_complete()'.
+
+ -- Variable: int rl_inhibit_completion
+     If this variable is non-zero, completion is inhibited.  The
+     completion character will be inserted as any other bound to
+     `self-insert'.
+
+\1f
+File: readline.info,  Node: A Short Completion Example,  Prev: Completion Variables,  Up: Custom Completers
+
+2.6.4 A Short Completion Example
+--------------------------------
+
+Here is a small application demonstrating the use of the GNU Readline
+library.  It is called `fileman', and the source code resides in
+`examples/fileman.c'.  This sample application provides completion of
+command names, line editing features, and access to the history list.
+
+     /* fileman.c -- A tiny application which demonstrates how to use the
+        GNU Readline library.  This application interactively allows users
+        to manipulate files and their modes. */
+
+     #include <stdio.h>
+     #include <sys/types.h>
+     #include <sys/file.h>
+     #include <sys/stat.h>
+     #include <sys/errno.h>
+
+     #include <readline/readline.h>
+     #include <readline/history.h>
+
+     extern char *xmalloc ();
+
+     /* The names of functions that actually do the manipulation. */
+     int com_list __P((char *));
+     int com_view __P((char *));
+     int com_rename __P((char *));
+     int com_stat __P((char *));
+     int com_pwd __P((char *));
+     int com_delete __P((char *));
+     int com_help __P((char *));
+     int com_cd __P((char *));
+     int com_quit __P((char *));
+
+     /* A structure which contains information on the commands this program
+        can understand. */
+
+     typedef struct {
+       char *name;                     /* User printable name of the function. */
+       rl_icpfunc_t *func;             /* Function to call to do the job. */
+       char *doc;                      /* Documentation for this function.  */
+     } COMMAND;
+
+     COMMAND commands[] = {
+       { "cd", com_cd, "Change to directory DIR" },
+       { "delete", com_delete, "Delete FILE" },
+       { "help", com_help, "Display this text" },
+       { "?", com_help, "Synonym for `help'" },
+       { "list", com_list, "List files in DIR" },
+       { "ls", com_list, "Synonym for `list'" },
+       { "pwd", com_pwd, "Print the current working directory" },
+       { "quit", com_quit, "Quit using Fileman" },
+       { "rename", com_rename, "Rename FILE to NEWNAME" },
+       { "stat", com_stat, "Print out statistics on FILE" },
+       { "view", com_view, "View the contents of FILE" },
+       { (char *)NULL, (rl_icpfunc_t *)NULL, (char *)NULL }
+     };
+
+     /* Forward declarations. */
+     char *stripwhite ();
+     COMMAND *find_command ();
+
+     /* The name of this program, as taken from argv[0]. */
+     char *progname;
+
+     /* When non-zero, this means the user is done using this program. */
+     int done;
+
+     char *
+     dupstr (s)
+          int s;
+     {
+       char *r;
+
+       r = xmalloc (strlen (s) + 1);
+       strcpy (r, s);
+       return (r);
+     }
+
+     main (argc, argv)
+          int argc;
+          char **argv;
+     {
+       char *line, *s;
+
+       progname = argv[0];
+
+       initialize_readline (); /* Bind our completer. */
+
+       /* Loop reading and executing lines until the user quits. */
+       for ( ; done == 0; )
+         {
+           line = readline ("FileMan: ");
+
+           if (!line)
+             break;
+
+           /* Remove leading and trailing whitespace from the line.
+              Then, if there is anything left, add it to the history list
+              and execute it. */
+           s = stripwhite (line);
+
+           if (*s)
+             {
+               add_history (s);
+               execute_line (s);
+             }
+
+           free (line);
+         }
+       exit (0);
+     }
+
+     /* Execute a command line. */
+     int
+     execute_line (line)
+          char *line;
+     {
+       register int i;
+       COMMAND *command;
+       char *word;
+
+       /* Isolate the command word. */
+       i = 0;
+       while (line[i] && whitespace (line[i]))
+         i++;
+       word = line + i;
+
+       while (line[i] && !whitespace (line[i]))
+         i++;
+
+       if (line[i])
+         line[i++] = '\0';
+
+       command = find_command (word);
+
+       if (!command)
+         {
+           fprintf (stderr, "%s: No such command for FileMan.\n", word);
+           return (-1);
+         }
+
+       /* Get argument to command, if any. */
+       while (whitespace (line[i]))
+         i++;
+
+       word = line + i;
+
+       /* Call the function. */
+       return ((*(command->func)) (word));
+     }
+
+     /* Look up NAME as the name of a command, and return a pointer to that
+        command.  Return a NULL pointer if NAME isn't a command name. */
+     COMMAND *
+     find_command (name)
+          char *name;
+     {
+       register int i;
+
+       for (i = 0; commands[i].name; i++)
+         if (strcmp (name, commands[i].name) == 0)
+           return (&commands[i]);
+
+       return ((COMMAND *)NULL);
+     }
+
+     /* Strip whitespace from the start and end of STRING.  Return a pointer
+        into STRING. */
+     char *
+     stripwhite (string)
+          char *string;
+     {
+       register char *s, *t;
+
+       for (s = string; whitespace (*s); s++)
+         ;
+
+       if (*s == 0)
+         return (s);
+
+       t = s + strlen (s) - 1;
+       while (t > s && whitespace (*t))
+         t--;
+       *++t = '\0';
+
+       return s;
+     }
+
+     /* **************************************************************** */
+     /*                                                                  */
+     /*                  Interface to Readline Completion                */
+     /*                                                                  */
+     /* **************************************************************** */
+
+     char *command_generator __P((const char *, int));
+     char **fileman_completion __P((const char *, int, int));
+
+     /* Tell the GNU Readline library how to complete.  We want to try to
+        complete on command names if this is the first word in the line, or
+        on filenames if not. */
+     initialize_readline ()
+     {
+       /* Allow conditional parsing of the ~/.inputrc file. */
+       rl_readline_name = "FileMan";
+
+       /* Tell the completer that we want a crack first. */
+       rl_attempted_completion_function = fileman_completion;
+     }
+
+     /* Attempt to complete on the contents of TEXT.  START and END
+        bound the region of rl_line_buffer that contains the word to
+        complete.  TEXT is the word to complete.  We can use the entire
+        contents of rl_line_buffer in case we want to do some simple
+        parsing.  Returnthe array of matches, or NULL if there aren't any. */
+     char **
+     fileman_completion (text, start, end)
+          const char *text;
+          int start, end;
+     {
+       char **matches;
+
+       matches = (char **)NULL;
+
+       /* If this word is at the start of the line, then it is a command
+          to complete.  Otherwise it is the name of a file in the current
+          directory. */
+       if (start == 0)
+         matches = rl_completion_matches (text, command_generator);
+
+       return (matches);
+     }
+
+     /* Generator function for command completion.  STATE lets us
+        know whether to start from scratch; without any state
+        (i.e. STATE == 0), then we start at the top of the list. */
+     char *
+     command_generator (text, state)
+          const char *text;
+          int state;
+     {
+       static int list_index, len;
+       char *name;
+
+       /* If this is a new word to complete, initialize now.  This
+          includes saving the length of TEXT for efficiency, and
+          initializing the index variable to 0. */
+       if (!state)
+         {
+           list_index = 0;
+           len = strlen (text);
+         }
+
+       /* Return the next name which partially matches from the
+          command list. */
+       while (name = commands[list_index].name)
+         {
+           list_index++;
+
+           if (strncmp (name, text, len) == 0)
+             return (dupstr(name));
+         }
+
+       /* If no names matched, then return NULL. */
+       return ((char *)NULL);
+     }
+
+     /* **************************************************************** */
+     /*                                                                  */
+     /*                       FileMan Commands                           */
+     /*                                                                  */
+     /* **************************************************************** */
+
+     /* String to pass to system ().  This is for the LIST, VIEW and RENAME
+        commands. */
+     static char syscom[1024];
+
+     /* List the file(s) named in arg. */
+     com_list (arg)
+          char *arg;
+     {
+       if (!arg)
+         arg = "";
+
+       sprintf (syscom, "ls -FClg %s", arg);
+       return (system (syscom));
+     }
+
+     com_view (arg)
+          char *arg;
+     {
+       if (!valid_argument ("view", arg))
+         return 1;
+
+       sprintf (syscom, "more %s", arg);
+       return (system (syscom));
+     }
+
+     com_rename (arg)
+          char *arg;
+     {
+       too_dangerous ("rename");
+       return (1);
+     }
+
+     com_stat (arg)
+          char *arg;
+     {
+       struct stat finfo;
+
+       if (!valid_argument ("stat", arg))
+         return (1);
+
+       if (stat (arg, &finfo) == -1)
+         {
+           perror (arg);
+           return (1);
+         }
+
+       printf ("Statistics for `%s':\n", arg);
+
+       printf ("%s has %d link%s, and is %d byte%s in length.\n", arg,
+               finfo.st_nlink,
+               (finfo.st_nlink == 1) ? "" : "s",
+               finfo.st_size,
+               (finfo.st_size == 1) ? "" : "s");
+       printf ("Inode Last Change at: %s", ctime (&finfo.st_ctime));
+       printf ("      Last access at: %s", ctime (&finfo.st_atime));
+       printf ("    Last modified at: %s", ctime (&finfo.st_mtime));
+       return (0);
+     }
+
+     com_delete (arg)
+          char *arg;
+     {
+       too_dangerous ("delete");
+       return (1);
+     }
+
+     /* Print out help for ARG, or for all of the commands if ARG is
+        not present. */
+     com_help (arg)
+          char *arg;
+     {
+       register int i;
+       int printed = 0;
+
+       for (i = 0; commands[i].name; i++)
+         {
+           if (!*arg || (strcmp (arg, commands[i].name) == 0))
+             {
+               printf ("%s\t\t%s.\n", commands[i].name, commands[i].doc);
+               printed++;
+             }
+         }
+
+       if (!printed)
+         {
+           printf ("No commands match `%s'.  Possibilties are:\n", arg);
+
+           for (i = 0; commands[i].name; i++)
+             {
+               /* Print in six columns. */
+               if (printed == 6)
+                 {
+                   printed = 0;
+                   printf ("\n");
+                 }
+
+               printf ("%s\t", commands[i].name);
+               printed++;
+             }
+
+           if (printed)
+             printf ("\n");
+         }
+       return (0);
+     }
+
+     /* Change to the directory ARG. */
+     com_cd (arg)
+          char *arg;
+     {
+       if (chdir (arg) == -1)
+         {
+           perror (arg);
+           return 1;
+         }
+
+       com_pwd ("");
+       return (0);
+     }
+
+     /* Print out the current working directory. */
+     com_pwd (ignore)
+          char *ignore;
+     {
+       char dir[1024], *s;
+
+       s = getcwd (dir, sizeof(dir) - 1);
+       if (s == 0)
+         {
+           printf ("Error getting pwd: %s\n", dir);
+           return 1;
+         }
+
+       printf ("Current directory is %s\n", dir);
+       return 0;
+     }
+
+     /* The user wishes to quit using this program.  Just set DONE
+        non-zero. */
+     com_quit (arg)
+          char *arg;
+     {
+       done = 1;
+       return (0);
+     }
+
+     /* Function which tells you that you can't do this. */
+     too_dangerous (caller)
+          char *caller;
+     {
+       fprintf (stderr,
+                "%s: Too dangerous for me to distribute.\n",
+                caller);
+       fprintf (stderr, "Write it yourself.\n");
+     }
+
+     /* Return non-zero if ARG is a valid argument for CALLER,
+        else print an error message and return zero. */
+     int
+     valid_argument (caller, arg)
+          char *caller, *arg;
+     {
+       if (!arg || !*arg)
+         {
+           fprintf (stderr, "%s: Argument required.\n", caller);
+           return (0);
+         }
+
+       return (1);
+     }
+
+\1f
+File: readline.info,  Node: Copying This Manual,  Next: Concept Index,  Prev: Programming with GNU Readline,  Up: Top
+
+Appendix A Copying This Manual
+******************************
+
+* Menu:
+
+* GNU Free Documentation License::     License for copying this manual.
+
+\1f
+File: readline.info,  Node: GNU Free Documentation License,  Up: Copying This Manual
+
+A.1 GNU Free Documentation License
+==================================
+
+                      Version 1.2, November 2002
+
+     Copyright (C) 2000,2001,2002 Free Software Foundation, Inc.
+     59 Temple Place, Suite 330, Boston, MA  02111-1307, USA
+
+     Everyone is permitted to copy and distribute verbatim copies
+     of this license document, but changing it is not allowed.
+
+  0. PREAMBLE
+
+     The purpose of this License is to make a manual, textbook, or other
+     functional and useful document "free" in the sense of freedom: to
+     assure everyone the effective freedom to copy and redistribute it,
+     with or without modifying it, either commercially or
+     noncommercially.  Secondarily, this License preserves for the
+     author and publisher a way to get credit for their work, while not
+     being considered responsible for modifications made by others.
+
+     This License is a kind of "copyleft", which means that derivative
+     works of the document must themselves be free in the same sense.
+     It complements the GNU General Public License, which is a copyleft
+     license designed for free software.
+
+     We have designed this License in order to use it for manuals for
+     free software, because free software needs free documentation: a
+     free program should come with manuals providing the same freedoms
+     that the software does.  But this License is not limited to
+     software manuals; it can be used for any textual work, regardless
+     of subject matter or whether it is published as a printed book.
+     We recommend this License principally for works whose purpose is
+     instruction or reference.
+
+  1. APPLICABILITY AND DEFINITIONS
+
+     This License applies to any manual or other work, in any medium,
+     that contains a notice placed by the copyright holder saying it
+     can be distributed under the terms of this License.  Such a notice
+     grants a world-wide, royalty-free license, unlimited in duration,
+     to use that work under the conditions stated herein.  The
+     "Document", below, refers to any such manual or work.  Any member
+     of the public is a licensee, and is addressed as "you".  You
+     accept the license if you copy, modify or distribute the work in a
+     way requiring permission under copyright law.
+
+     A "Modified Version" of the Document means any work containing the
+     Document or a portion of it, either copied verbatim, or with
+     modifications and/or translated into another language.
+
+     A "Secondary Section" is a named appendix or a front-matter section
+     of the Document that deals exclusively with the relationship of the
+     publishers or authors of the Document to the Document's overall
+     subject (or to related matters) and contains nothing that could
+     fall directly within that overall subject.  (Thus, if the Document
+     is in part a textbook of mathematics, a Secondary Section may not
+     explain any mathematics.)  The relationship could be a matter of
+     historical connection with the subject or with related matters, or
+     of legal, commercial, philosophical, ethical or political position
+     regarding them.
+
+     The "Invariant Sections" are certain Secondary Sections whose
+     titles are designated, as being those of Invariant Sections, in
+     the notice that says that the Document is released under this
+     License.  If a section does not fit the above definition of
+     Secondary then it is not allowed to be designated as Invariant.
+     The Document may contain zero Invariant Sections.  If the Document
+     does not identify any Invariant Sections then there are none.
+
+     The "Cover Texts" are certain short passages of text that are
+     listed, as Front-Cover Texts or Back-Cover Texts, in the notice
+     that says that the Document is released under this License.  A
+     Front-Cover Text may be at most 5 words, and a Back-Cover Text may
+     be at most 25 words.
+
+     A "Transparent" copy of the Document means a machine-readable copy,
+     represented in a format whose specification is available to the
+     general public, that is suitable for revising the document
+     straightforwardly with generic text editors or (for images
+     composed of pixels) generic paint programs or (for drawings) some
+     widely available drawing editor, and that is suitable for input to
+     text formatters or for automatic translation to a variety of
+     formats suitable for input to text formatters.  A copy made in an
+     otherwise Transparent file format whose markup, or absence of
+     markup, has been arranged to thwart or discourage subsequent
+     modification by readers is not Transparent.  An image format is
+     not Transparent if used for any substantial amount of text.  A
+     copy that is not "Transparent" is called "Opaque".
+
+     Examples of suitable formats for Transparent copies include plain
+     ASCII without markup, Texinfo input format, LaTeX input format,
+     SGML or XML using a publicly available DTD, and
+     standard-conforming simple HTML, PostScript or PDF designed for
+     human modification.  Examples of transparent image formats include
+     PNG, XCF and JPG.  Opaque formats include proprietary formats that
+     can be read and edited only by proprietary word processors, SGML or
+     XML for which the DTD and/or processing tools are not generally
+     available, and the machine-generated HTML, PostScript or PDF
+     produced by some word processors for output purposes only.
+
+     The "Title Page" means, for a printed book, the title page itself,
+     plus such following pages as are needed to hold, legibly, the
+     material this License requires to appear in the title page.  For
+     works in formats which do not have any title page as such, "Title
+     Page" means the text near the most prominent appearance of the
+     work's title, preceding the beginning of the body of the text.
+
+     A section "Entitled XYZ" means a named subunit of the Document
+     whose title either is precisely XYZ or contains XYZ in parentheses
+     following text that translates XYZ in another language.  (Here XYZ
+     stands for a specific section name mentioned below, such as
+     "Acknowledgements", "Dedications", "Endorsements", or "History".)
+     To "Preserve the Title" of such a section when you modify the
+     Document means that it remains a section "Entitled XYZ" according
+     to this definition.
+
+     The Document may include Warranty Disclaimers next to the notice
+     which states that this License applies to the Document.  These
+     Warranty Disclaimers are considered to be included by reference in
+     this License, but only as regards disclaiming warranties: any other
+     implication that these Warranty Disclaimers may have is void and
+     has no effect on the meaning of this License.
+
+  2. VERBATIM COPYING
+
+     You may copy and distribute the Document in any medium, either
+     commercially or noncommercially, provided that this License, the
+     copyright notices, and the license notice saying this License
+     applies to the Document are reproduced in all copies, and that you
+     add no other conditions whatsoever to those of this License.  You
+     may not use technical measures to obstruct or control the reading
+     or further copying of the copies you make or distribute.  However,
+     you may accept compensation in exchange for copies.  If you
+     distribute a large enough number of copies you must also follow
+     the conditions in section 3.
+
+     You may also lend copies, under the same conditions stated above,
+     and you may publicly display copies.
+
+  3. COPYING IN QUANTITY
+
+     If you publish printed copies (or copies in media that commonly
+     have printed covers) of the Document, numbering more than 100, and
+     the Document's license notice requires Cover Texts, you must
+     enclose the copies in covers that carry, clearly and legibly, all
+     these Cover Texts: Front-Cover Texts on the front cover, and
+     Back-Cover Texts on the back cover.  Both covers must also clearly
+     and legibly identify you as the publisher of these copies.  The
+     front cover must present the full title with all words of the
+     title equally prominent and visible.  You may add other material
+     on the covers in addition.  Copying with changes limited to the
+     covers, as long as they preserve the title of the Document and
+     satisfy these conditions, can be treated as verbatim copying in
+     other respects.
+
+     If the required texts for either cover are too voluminous to fit
+     legibly, you should put the first ones listed (as many as fit
+     reasonably) on the actual cover, and continue the rest onto
+     adjacent pages.
+
+     If you publish or distribute Opaque copies of the Document
+     numbering more than 100, you must either include a
+     machine-readable Transparent copy along with each Opaque copy, or
+     state in or with each Opaque copy a computer-network location from
+     which the general network-using public has access to download
+     using public-standard network protocols a complete Transparent
+     copy of the Document, free of added material.  If you use the
+     latter option, you must take reasonably prudent steps, when you
+     begin distribution of Opaque copies in quantity, to ensure that
+     this Transparent copy will remain thus accessible at the stated
+     location until at least one year after the last time you
+     distribute an Opaque copy (directly or through your agents or
+     retailers) of that edition to the public.
+
+     It is requested, but not required, that you contact the authors of
+     the Document well before redistributing any large number of
+     copies, to give them a chance to provide you with an updated
+     version of the Document.
+
+  4. MODIFICATIONS
+
+     You may copy and distribute a Modified Version of the Document
+     under the conditions of sections 2 and 3 above, provided that you
+     release the Modified Version under precisely this License, with
+     the Modified Version filling the role of the Document, thus
+     licensing distribution and modification of the Modified Version to
+     whoever possesses a copy of it.  In addition, you must do these
+     things in the Modified Version:
+
+       A. Use in the Title Page (and on the covers, if any) a title
+          distinct from that of the Document, and from those of
+          previous versions (which should, if there were any, be listed
+          in the History section of the Document).  You may use the
+          same title as a previous version if the original publisher of
+          that version gives permission.
+
+       B. List on the Title Page, as authors, one or more persons or
+          entities responsible for authorship of the modifications in
+          the Modified Version, together with at least five of the
+          principal authors of the Document (all of its principal
+          authors, if it has fewer than five), unless they release you
+          from this requirement.
+
+       C. State on the Title page the name of the publisher of the
+          Modified Version, as the publisher.
+
+       D. Preserve all the copyright notices of the Document.
+
+       E. Add an appropriate copyright notice for your modifications
+          adjacent to the other copyright notices.
+
+       F. Include, immediately after the copyright notices, a license
+          notice giving the public permission to use the Modified
+          Version under the terms of this License, in the form shown in
+          the Addendum below.
+
+       G. Preserve in that license notice the full lists of Invariant
+          Sections and required Cover Texts given in the Document's
+          license notice.
+
+       H. Include an unaltered copy of this License.
+
+       I. Preserve the section Entitled "History", Preserve its Title,
+          and add to it an item stating at least the title, year, new
+          authors, and publisher of the Modified Version as given on
+          the Title Page.  If there is no section Entitled "History" in
+          the Document, create one stating the title, year, authors,
+          and publisher of the Document as given on its Title Page,
+          then add an item describing the Modified Version as stated in
+          the previous sentence.
+
+       J. Preserve the network location, if any, given in the Document
+          for public access to a Transparent copy of the Document, and
+          likewise the network locations given in the Document for
+          previous versions it was based on.  These may be placed in
+          the "History" section.  You may omit a network location for a
+          work that was published at least four years before the
+          Document itself, or if the original publisher of the version
+          it refers to gives permission.
+
+       K. For any section Entitled "Acknowledgements" or "Dedications",
+          Preserve the Title of the section, and preserve in the
+          section all the substance and tone of each of the contributor
+          acknowledgements and/or dedications given therein.
+
+       L. Preserve all the Invariant Sections of the Document,
+          unaltered in their text and in their titles.  Section numbers
+          or the equivalent are not considered part of the section
+          titles.
+
+       M. Delete any section Entitled "Endorsements".  Such a section
+          may not be included in the Modified Version.
+
+       N. Do not retitle any existing section to be Entitled
+          "Endorsements" or to conflict in title with any Invariant
+          Section.
+
+       O. Preserve any Warranty Disclaimers.
+
+     If the Modified Version includes new front-matter sections or
+     appendices that qualify as Secondary Sections and contain no
+     material copied from the Document, you may at your option
+     designate some or all of these sections as invariant.  To do this,
+     add their titles to the list of Invariant Sections in the Modified
+     Version's license notice.  These titles must be distinct from any
+     other section titles.
+
+     You may add a section Entitled "Endorsements", provided it contains
+     nothing but endorsements of your Modified Version by various
+     parties--for example, statements of peer review or that the text
+     has been approved by an organization as the authoritative
+     definition of a standard.
+
+     You may add a passage of up to five words as a Front-Cover Text,
+     and a passage of up to 25 words as a Back-Cover Text, to the end
+     of the list of Cover Texts in the Modified Version.  Only one
+     passage of Front-Cover Text and one of Back-Cover Text may be
+     added by (or through arrangements made by) any one entity.  If the
+     Document already includes a cover text for the same cover,
+     previously added by you or by arrangement made by the same entity
+     you are acting on behalf of, you may not add another; but you may
+     replace the old one, on explicit permission from the previous
+     publisher that added the old one.
+
+     The author(s) and publisher(s) of the Document do not by this
+     License give permission to use their names for publicity for or to
+     assert or imply endorsement of any Modified Version.
+
+  5. COMBINING DOCUMENTS
+
+     You may combine the Document with other documents released under
+     this License, under the terms defined in section 4 above for
+     modified versions, provided that you include in the combination
+     all of the Invariant Sections of all of the original documents,
+     unmodified, and list them all as Invariant Sections of your
+     combined work in its license notice, and that you preserve all
+     their Warranty Disclaimers.
+
+     The combined work need only contain one copy of this License, and
+     multiple identical Invariant Sections may be replaced with a single
+     copy.  If there are multiple Invariant Sections with the same name
+     but different contents, make the title of each such section unique
+     by adding at the end of it, in parentheses, the name of the
+     original author or publisher of that section if known, or else a
+     unique number.  Make the same adjustment to the section titles in
+     the list of Invariant Sections in the license notice of the
+     combined work.
+
+     In the combination, you must combine any sections Entitled
+     "History" in the various original documents, forming one section
+     Entitled "History"; likewise combine any sections Entitled
+     "Acknowledgements", and any sections Entitled "Dedications".  You
+     must delete all sections Entitled "Endorsements."
+
+  6. COLLECTIONS OF DOCUMENTS
+
+     You may make a collection consisting of the Document and other
+     documents released under this License, and replace the individual
+     copies of this License in the various documents with a single copy
+     that is included in the collection, provided that you follow the
+     rules of this License for verbatim copying of each of the
+     documents in all other respects.
+
+     You may extract a single document from such a collection, and
+     distribute it individually under this License, provided you insert
+     a copy of this License into the extracted document, and follow
+     this License in all other respects regarding verbatim copying of
+     that document.
+
+  7. AGGREGATION WITH INDEPENDENT WORKS
+
+     A compilation of the Document or its derivatives with other
+     separate and independent documents or works, in or on a volume of
+     a storage or distribution medium, is called an "aggregate" if the
+     copyright resulting from the compilation is not used to limit the
+     legal rights of the compilation's users beyond what the individual
+     works permit.  When the Document is included an aggregate, this
+     License does not apply to the other works in the aggregate which
+     are not themselves derivative works of the Document.
+
+     If the Cover Text requirement of section 3 is applicable to these
+     copies of the Document, then if the Document is less than one half
+     of the entire aggregate, the Document's Cover Texts may be placed
+     on covers that bracket the Document within the aggregate, or the
+     electronic equivalent of covers if the Document is in electronic
+     form.  Otherwise they must appear on printed covers that bracket
+     the whole aggregate.
+
+  8. TRANSLATION
+
+     Translation is considered a kind of modification, so you may
+     distribute translations of the Document under the terms of section
+     4.  Replacing Invariant Sections with translations requires special
+     permission from their copyright holders, but you may include
+     translations of some or all Invariant Sections in addition to the
+     original versions of these Invariant Sections.  You may include a
+     translation of this License, and all the license notices in the
+     Document, and any Warranty Disclaimers, provided that you also
+     include the original English version of this License and the
+     original versions of those notices and disclaimers.  In case of a
+     disagreement between the translation and the original version of
+     this License or a notice or disclaimer, the original version will
+     prevail.
+
+     If a section in the Document is Entitled "Acknowledgements",
+     "Dedications", or "History", the requirement (section 4) to
+     Preserve its Title (section 1) will typically require changing the
+     actual title.
+
+  9. TERMINATION
+
+     You may not copy, modify, sublicense, or distribute the Document
+     except as expressly provided for under this License.  Any other
+     attempt to copy, modify, sublicense or distribute the Document is
+     void, and will automatically terminate your rights under this
+     License.  However, parties who have received copies, or rights,
+     from you under this License will not have their licenses
+     terminated so long as such parties remain in full compliance.
+
+ 10. FUTURE REVISIONS OF THIS LICENSE
+
+     The Free Software Foundation may publish new, revised versions of
+     the GNU Free Documentation License from time to time.  Such new
+     versions will be similar in spirit to the present version, but may
+     differ in detail to address new problems or concerns.  See
+     `http://www.gnu.org/copyleft/'.
+
+     Each version of the License is given a distinguishing version
+     number.  If the Document specifies that a particular numbered
+     version of this License "or any later version" applies to it, you
+     have the option of following the terms and conditions either of
+     that specified version or of any later version that has been
+     published (not as a draft) by the Free Software Foundation.  If
+     the Document does not specify a version number of this License,
+     you may choose any version ever published (not as a draft) by the
+     Free Software Foundation.
+
+A.1.1 ADDENDUM: How to use this License for your documents
+----------------------------------------------------------
+
+To use this License in a document you have written, include a copy of
+the License in the document and put the following copyright and license
+notices just after the title page:
+
+       Copyright (C)  YEAR  YOUR NAME.
+       Permission is granted to copy, distribute and/or modify this document
+       under the terms of the GNU Free Documentation License, Version 1.2
+       or any later version published by the Free Software Foundation;
+       with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.
+       A copy of the license is included in the section entitled ``GNU
+       Free Documentation License''.
+
+   If you have Invariant Sections, Front-Cover Texts and Back-Cover
+Texts, replace the "with...Texts." line with this:
+
+         with the Invariant Sections being LIST THEIR TITLES, with
+         the Front-Cover Texts being LIST, and with the Back-Cover Texts
+         being LIST.
+
+   If you have Invariant Sections without Cover Texts, or some other
+combination of the three, merge those two alternatives to suit the
+situation.
+
+   If your document contains nontrivial examples of program code, we
+recommend releasing these examples in parallel under your choice of
+free software license, such as the GNU General Public License, to
+permit their use in free software.
+
+\1f
+File: readline.info,  Node: Concept Index,  Next: Function and Variable Index,  Prev: Copying This Manual,  Up: Top
+
+Concept Index
+*************
+
+\0\b[index\0\b]
+* Menu:
+
+* application-specific completion functions: Custom Completers.
+                                                               (line  6)
+* command editing:                       Readline Bare Essentials.
+                                                               (line  6)
+* editing command lines:                 Readline Bare Essentials.
+                                                               (line  6)
+* FDL, GNU Free Documentation License:   GNU Free Documentation License.
+                                                               (line  6)
+* initialization file, readline:         Readline Init File.   (line  6)
+* interaction, readline:                 Readline Interaction. (line  6)
+* kill ring:                             Readline Killing Commands.
+                                                               (line 19)
+* killing text:                          Readline Killing Commands.
+                                                               (line  6)
+* notation, readline:                    Readline Bare Essentials.
+                                                               (line  6)
+* readline, function:                    Basic Behavior.       (line 12)
+* variables, readline:                   Readline Init File Syntax.
+                                                               (line 34)
+* yanking text:                          Readline Killing Commands.
+                                                               (line  6)
+
+\1f
+File: readline.info,  Node: Function and Variable Index,  Prev: Concept Index,  Up: Top
+
+Function and Variable Index
+***************************
+
+\0\b[index\0\b]
+* Menu:
+
+* _rl_digit_p:                           Utility Functions.   (line  46)
+* _rl_digit_value:                       Utility Functions.   (line  57)
+* _rl_lowercase_p:                       Utility Functions.   (line  43)
+* _rl_to_lower:                          Utility Functions.   (line  53)
+* _rl_to_upper:                          Utility Functions.   (line  49)
+* _rl_uppercase_p:                       Utility Functions.   (line  40)
+* abort (C-g):                           Miscellaneous Commands.
+                                                              (line  10)
+* accept-line (Newline or Return):       Commands For History.
+                                                              (line   6)
+* backward-char (C-b):                   Commands For Moving. (line  15)
+* backward-delete-char (Rubout):         Commands For Text.   (line  11)
+* backward-kill-line (C-x Rubout):       Commands For Killing.
+                                                              (line   9)
+* backward-kill-word (M-<DEL>):          Commands For Killing.
+                                                              (line  24)
+* backward-word (M-b):                   Commands For Moving. (line  22)
+* beginning-of-history (M-<):            Commands For History.
+                                                              (line  19)
+* beginning-of-line (C-a):               Commands For Moving. (line   6)
+* bell-style:                            Readline Init File Syntax.
+                                                              (line  35)
+* bind-tty-special-chars:                Readline Init File Syntax.
+                                                              (line  42)
+* call-last-kbd-macro (C-x e):           Keyboard Macros.     (line  13)
+* capitalize-word (M-c):                 Commands For Text.   (line  49)
+* character-search (C-]):                Miscellaneous Commands.
+                                                              (line  41)
+* character-search-backward (M-C-]):     Miscellaneous Commands.
+                                                              (line  46)
+* clear-screen (C-l):                    Commands For Moving. (line  26)
+* comment-begin:                         Readline Init File Syntax.
+                                                              (line  47)
+* complete (<TAB>):                      Commands For Completion.
+                                                              (line   6)
+* completion-query-items:                Readline Init File Syntax.
+                                                              (line  57)
+* convert-meta:                          Readline Init File Syntax.
+                                                              (line  67)
+* copy-backward-word ():                 Commands For Killing.
+                                                              (line  49)
+* copy-forward-word ():                  Commands For Killing.
+                                                              (line  54)
+* copy-region-as-kill ():                Commands For Killing.
+                                                              (line  45)
+* delete-char (C-d):                     Commands For Text.   (line   6)
+* delete-char-or-list ():                Commands For Completion.
+                                                              (line  30)
+* delete-horizontal-space ():            Commands For Killing.
+                                                              (line  37)
+* digit-argument (M-0, M-1, ... M--):    Numeric Arguments.   (line   6)
+* disable-completion:                    Readline Init File Syntax.
+                                                              (line  73)
+* do-uppercase-version (M-a, M-b, M-X, ...): Miscellaneous Commands.
+                                                              (line  14)
+* downcase-word (M-l):                   Commands For Text.   (line  45)
+* dump-functions ():                     Miscellaneous Commands.
+                                                              (line  61)
+* dump-macros ():                        Miscellaneous Commands.
+                                                              (line  73)
+* dump-variables ():                     Miscellaneous Commands.
+                                                              (line  67)
+* editing-mode:                          Readline Init File Syntax.
+                                                              (line  78)
+* enable-keypad:                         Readline Init File Syntax.
+                                                              (line  84)
+* end-kbd-macro (C-x )):                 Keyboard Macros.     (line   9)
+* end-of-history (M->):                  Commands For History.
+                                                              (line  22)
+* end-of-line (C-e):                     Commands For Moving. (line   9)
+* exchange-point-and-mark (C-x C-x):     Miscellaneous Commands.
+                                                              (line  36)
+* expand-tilde:                          Readline Init File Syntax.
+                                                              (line  89)
+* forward-backward-delete-char ():       Commands For Text.   (line  15)
+* forward-char (C-f):                    Commands For Moving. (line  12)
+* forward-search-history (C-s):          Commands For History.
+                                                              (line  30)
+* forward-word (M-f):                    Commands For Moving. (line  18)
+* history-preserve-point:                Readline Init File Syntax.
+                                                              (line  93)
+* history-search-backward ():            Commands For History.
+                                                              (line  50)
+* history-search-forward ():             Commands For History.
+                                                              (line  45)
+* horizontal-scroll-mode:                Readline Init File Syntax.
+                                                              (line  98)
+* input-meta:                            Readline Init File Syntax.
+                                                              (line 105)
+* insert-comment (M-#):                  Miscellaneous Commands.
+                                                              (line  51)
+* insert-completions (M-*):              Commands For Completion.
+                                                              (line  14)
+* isearch-terminators:                   Readline Init File Syntax.
+                                                              (line 112)
+* keymap:                                Readline Init File Syntax.
+                                                              (line 119)
+* kill-line (C-k):                       Commands For Killing.
+                                                              (line   6)
+* kill-region ():                        Commands For Killing.
+                                                              (line  41)
+* kill-whole-line ():                    Commands For Killing.
+                                                              (line  15)
+* kill-word (M-d):                       Commands For Killing.
+                                                              (line  19)
+* mark-modified-lines:                   Readline Init File Syntax.
+                                                              (line 132)
+* mark-symlinked-directories:            Readline Init File Syntax.
+                                                              (line 137)
+* match-hidden-files:                    Readline Init File Syntax.
+                                                              (line 142)
+* menu-complete ():                      Commands For Completion.
+                                                              (line  18)
+* meta-flag:                             Readline Init File Syntax.
+                                                              (line 105)
+* next-history (C-n):                    Commands For History.
+                                                              (line  16)
+* non-incremental-forward-search-history (M-n): Commands For History.
+                                                              (line  40)
+* non-incremental-reverse-search-history (M-p): Commands For History.
+                                                              (line  35)
+* output-meta:                           Readline Init File Syntax.
+                                                              (line 149)
+* overwrite-mode ():                     Commands For Text.   (line  53)
+* page-completions:                      Readline Init File Syntax.
+                                                              (line 154)
+* possible-completions (M-?):            Commands For Completion.
+                                                              (line  11)
+* prefix-meta (<ESC>):                   Miscellaneous Commands.
+                                                              (line  18)
+* previous-history (C-p):                Commands For History.
+                                                              (line  12)
+* quoted-insert (C-q or C-v):            Commands For Text.   (line  20)
+* re-read-init-file (C-x C-r):           Miscellaneous Commands.
+                                                              (line   6)
+* readline:                              Basic Behavior.      (line  12)
+* redraw-current-line ():                Commands For Moving. (line  30)
+* reverse-search-history (C-r):          Commands For History.
+                                                              (line  26)
+* revert-line (M-r):                     Miscellaneous Commands.
+                                                              (line  25)
+* rl_add_defun:                          Function Naming.     (line  20)
+* rl_add_funmap_entry:                   Associating Function Names and Bindings.
+                                                              (line  47)
+* rl_add_undo:                           Allowing Undoing.    (line  41)
+* rl_alphabetic:                         Utility Functions.   (line  24)
+* rl_already_prompted:                   Readline Variables.  (line  59)
+* rl_attempted_completion_function:      Completion Variables.
+                                                              (line  12)
+* rl_attempted_completion_over:          Completion Variables.
+                                                              (line 210)
+* rl_basic_quote_characters:             Completion Variables.
+                                                              (line  99)
+* rl_basic_word_break_characters:        Completion Variables.
+                                                              (line  93)
+* rl_begin_undo_group:                   Allowing Undoing.    (line  29)
+* rl_bind_key:                           Binding Keys.        (line  22)
+* rl_bind_key_if_unbound:                Binding Keys.        (line  32)
+* rl_bind_key_if_unbound_in_map:         Binding Keys.        (line  38)
+* rl_bind_key_in_map:                    Binding Keys.        (line  27)
+* rl_bind_keyseq:                        Binding Keys.        (line  59)
+* rl_bind_keyseq_if_unbound:             Binding Keys.        (line  77)
+* rl_bind_keyseq_if_unbound_in_map:      Binding Keys.        (line  83)
+* rl_bind_keyseq_in_map:                 Binding Keys.        (line  66)
+* rl_binding_keymap:                     Readline Variables.  (line 154)
+* rl_callback_handler_install:           Alternate Interface. (line  15)
+* rl_callback_handler_remove:            Alternate Interface. (line  33)
+* rl_callback_read_char:                 Alternate Interface. (line  21)
+* rl_catch_signals:                      Readline Signal Handling.
+                                                              (line  48)
+* rl_catch_sigwinch:                     Readline Signal Handling.
+                                                              (line  55)
+* rl_char_is_quoted_p:                   Completion Variables.
+                                                              (line  46)
+* rl_cleanup_after_signal:               Readline Signal Handling.
+                                                              (line  66)
+* rl_clear_message:                      Redisplay.           (line  48)
+* rl_clear_pending_input:                Character Input.     (line  30)
+* rl_clear_signals:                      Readline Signal Handling.
+                                                              (line 119)
+* rl_complete <1>:                       Completion Functions.
+                                                              (line  20)
+* rl_complete:                           How Completing Works.
+                                                              (line  49)
+* rl_complete_internal:                  Completion Functions.
+                                                              (line  10)
+* rl_completer_quote_characters:         Completion Variables.
+                                                              (line 116)
+* rl_completer_word_break_characters:    Completion Variables.
+                                                              (line 102)
+* rl_completion_append_character:        Completion Variables.
+                                                              (line 140)
+* rl_completion_display_matches_hook:    Completion Variables.
+                                                              (line  80)
+* rl_completion_entry_function <1>:      Completion Variables.
+                                                              (line   7)
+* rl_completion_entry_function:          How Completing Works.
+                                                              (line  55)
+* rl_completion_found_quote:             Completion Variables.
+                                                              (line 168)
+* rl_completion_mark_symlink_dirs:       Completion Variables.
+                                                              (line 175)
+* rl_completion_matches:                 Completion Functions.
+                                                              (line  45)
+* rl_completion_mode:                    Completion Functions.
+                                                              (line  37)
+* rl_completion_query_items:             Completion Variables.
+                                                              (line 134)
+* rl_completion_quote_character:         Completion Variables.
+                                                              (line 156)
+* rl_completion_suppress_append:         Completion Variables.
+                                                              (line 150)
+* rl_completion_suppress_quote:          Completion Variables.
+                                                              (line 162)
+* rl_completion_type:                    Completion Variables.
+                                                              (line 217)
+* rl_completion_word_break_hook:         Completion Variables.
+                                                              (line 107)
+* rl_copy_keymap:                        Keymaps.             (line  17)
+* rl_copy_text:                          Modifying Text.      (line  15)
+* rl_crlf:                               Redisplay.           (line  30)
+* rl_delete_text:                        Modifying Text.      (line  11)
+* rl_deprep_term_function:               Readline Variables.  (line 144)
+* rl_deprep_terminal:                    Terminal Management. (line  13)
+* rl_ding:                               Utility Functions.   (line  21)
+* rl_directory_completion_hook:          Completion Variables.
+                                                              (line  64)
+* rl_discard_keymap:                     Keymaps.             (line  26)
+* rl_dispatching:                        Readline Variables.  (line  41)
+* rl_display_match_list:                 Utility Functions.   (line  28)
+* rl_do_undo:                            Allowing Undoing.    (line  48)
+* rl_done:                               Readline Variables.  (line  28)
+* rl_editing_mode:                       Readline Variables.  (line 242)
+* rl_end:                                Readline Variables.  (line  19)
+* rl_end_undo_group:                     Allowing Undoing.    (line  35)
+* rl_erase_empty_line:                   Readline Variables.  (line  47)
+* rl_event_hook:                         Readline Variables.  (line 119)
+* rl_execute_next:                       Character Input.     (line  26)
+* rl_executing_keymap:                   Readline Variables.  (line 150)
+* rl_executing_macro:                    Readline Variables.  (line 158)
+* rl_expand_prompt:                      Redisplay.           (line  64)
+* rl_explicit_arg:                       Readline Variables.  (line 233)
+* rl_extend_line_buffer:                 Utility Functions.   (line  12)
+* rl_filename_completion_desired:        Completion Variables.
+                                                              (line 190)
+* rl_filename_completion_function:       Completion Functions.
+                                                              (line  59)
+* rl_filename_dequoting_function:        Completion Variables.
+                                                              (line  37)
+* rl_filename_quote_characters:          Completion Variables.
+                                                              (line 122)
+* rl_filename_quoting_desired:           Completion Variables.
+                                                              (line 200)
+* rl_filename_quoting_function:          Completion Variables.
+                                                              (line  24)
+* rl_forced_update_display:              Redisplay.           (line  11)
+* rl_free_line_state:                    Readline Signal Handling.
+                                                              (line  72)
+* rl_free_undo_list:                     Allowing Undoing.    (line  45)
+* rl_function_dumper:                    Associating Function Names and Bindings.
+                                                              (line  30)
+* rl_function_of_keyseq:                 Associating Function Names and Bindings.
+                                                              (line  15)
+* rl_funmap_names:                       Associating Function Names and Bindings.
+                                                              (line  40)
+* rl_generic_bind:                       Binding Keys.        (line  89)
+* rl_get_keymap:                         Keymaps.             (line  32)
+* rl_get_keymap_by_name:                 Keymaps.             (line  38)
+* rl_get_keymap_name:                    Keymaps.             (line  43)
+* rl_get_screen_size:                    Readline Signal Handling.
+                                                              (line 102)
+* rl_get_termcap:                        Miscellaneous Functions.
+                                                              (line  42)
+* rl_getc:                               Character Input.     (line  15)
+* rl_getc_function:                      Readline Variables.  (line 125)
+* rl_gnu_readline_p:                     Readline Variables.  (line  78)
+* rl_ignore_completion_duplicates:       Completion Variables.
+                                                              (line 186)
+* rl_ignore_some_completions_function:   Completion Variables.
+                                                              (line  56)
+* rl_inhibit_completion:                 Completion Variables.
+                                                              (line 225)
+* rl_initialize:                         Utility Functions.   (line  16)
+* rl_insert_completions:                 Completion Functions.
+                                                              (line  32)
+* rl_insert_text:                        Modifying Text.      (line   7)
+* rl_instream:                           Readline Variables.  (line  92)
+* rl_invoking_keyseqs:                   Associating Function Names and Bindings.
+                                                              (line  21)
+* rl_invoking_keyseqs_in_map:            Associating Function Names and Bindings.
+                                                              (line  26)
+* rl_kill_text:                          Modifying Text.      (line  19)
+* rl_last_func:                          Readline Variables.  (line 105)
+* rl_library_version:                    Readline Variables.  (line  68)
+* rl_line_buffer:                        Readline Variables.  (line   9)
+* rl_list_funmap_names:                  Associating Function Names and Bindings.
+                                                              (line  36)
+* rl_macro_bind:                         Miscellaneous Functions.
+                                                              (line   8)
+* rl_macro_dumper:                       Miscellaneous Functions.
+                                                              (line  14)
+* rl_make_bare_keymap:                   Keymaps.             (line  12)
+* rl_make_keymap:                        Keymaps.             (line  20)
+* rl_mark:                               Readline Variables.  (line  24)
+* rl_message:                            Redisplay.           (line  39)
+* rl_modifying:                          Allowing Undoing.    (line  57)
+* rl_named_function:                     Associating Function Names and Bindings.
+                                                              (line  11)
+* rl_num_chars_to_read:                  Readline Variables.  (line  32)
+* rl_numeric_arg:                        Readline Variables.  (line 237)
+* rl_on_new_line:                        Redisplay.           (line  15)
+* rl_on_new_line_with_prompt:            Redisplay.           (line  19)
+* rl_outstream:                          Readline Variables.  (line  96)
+* rl_parse_and_bind:                     Binding Keys.        (line  96)
+* rl_pending_input:                      Readline Variables.  (line  37)
+* rl_point:                              Readline Variables.  (line  15)
+* rl_possible_completions:               Completion Functions.
+                                                              (line  28)
+* rl_pre_input_hook:                     Readline Variables.  (line 114)
+* rl_prefer_env_winsize:                 Readline Variables.  (line 100)
+* rl_prep_term_function:                 Readline Variables.  (line 137)
+* rl_prep_terminal:                      Terminal Management. (line   7)
+* rl_prompt:                             Readline Variables.  (line  53)
+* rl_push_macro_input:                   Modifying Text.      (line  26)
+* rl_read_init_file:                     Binding Keys.        (line 101)
+* rl_read_key:                           Character Input.     (line   7)
+* rl_readline_name:                      Readline Variables.  (line  87)
+* rl_readline_state:                     Readline Variables.  (line 161)
+* rl_readline_version:                   Readline Variables.  (line  71)
+* rl_redisplay:                          Redisplay.           (line   7)
+* rl_redisplay_function:                 Readline Variables.  (line 131)
+* rl_replace_line:                       Utility Functions.   (line   7)
+* rl_reset_after_signal:                 Readline Signal Handling.
+                                                              (line  80)
+* rl_reset_line_state:                   Redisplay.           (line  26)
+* rl_reset_screen_size:                  Readline Signal Handling.
+                                                              (line 106)
+* rl_reset_terminal:                     Terminal Management. (line  28)
+* rl_resize_terminal:                    Readline Signal Handling.
+                                                              (line  89)
+* rl_restore_prompt:                     Redisplay.           (line  57)
+* rl_save_prompt:                        Redisplay.           (line  53)
+* rl_set_key:                            Binding Keys.        (line  73)
+* rl_set_keyboard_input_timeout:         Character Input.     (line  35)
+* rl_set_keymap:                         Keymaps.             (line  35)
+* rl_set_paren_blink_timeout:            Miscellaneous Functions.
+                                                              (line  37)
+* rl_set_prompt:                         Redisplay.           (line  78)
+* rl_set_screen_size:                    Readline Signal Handling.
+                                                              (line  93)
+* rl_set_signals:                        Readline Signal Handling.
+                                                              (line 113)
+* rl_show_char:                          Redisplay.           (line  33)
+* rl_special_prefixes:                   Completion Variables.
+                                                              (line 127)
+* rl_startup_hook:                       Readline Variables.  (line 110)
+* rl_stuff_char:                         Character Input.     (line  19)
+* rl_terminal_name:                      Readline Variables.  (line  82)
+* rl_tty_set_default_bindings:           Terminal Management. (line  18)
+* rl_tty_unset_default_bindings:         Terminal Management. (line  23)
+* rl_unbind_command_in_map:              Binding Keys.        (line  55)
+* rl_unbind_function_in_map:             Binding Keys.        (line  51)
+* rl_unbind_key:                         Binding Keys.        (line  42)
+* rl_unbind_key_in_map:                  Binding Keys.        (line  46)
+* rl_username_completion_function:       Completion Functions.
+                                                              (line  66)
+* rl_variable_bind:                      Miscellaneous Functions.
+                                                              (line  21)
+* rl_variable_dumper:                    Miscellaneous Functions.
+                                                              (line  31)
+* rl_variable_value:                     Miscellaneous Functions.
+                                                              (line  26)
+* self-insert (a, b, A, 1, !, ...):      Commands For Text.   (line  27)
+* set-mark (C-@):                        Miscellaneous Commands.
+                                                              (line  32)
+* show-all-if-ambiguous:                 Readline Init File Syntax.
+                                                              (line 164)
+* show-all-if-unmodified:                Readline Init File Syntax.
+                                                              (line 170)
+* start-kbd-macro (C-x ():               Keyboard Macros.     (line   6)
+* transpose-chars (C-t):                 Commands For Text.   (line  30)
+* transpose-words (M-t):                 Commands For Text.   (line  36)
+* undo (C-_ or C-x C-u):                 Miscellaneous Commands.
+                                                              (line  22)
+* universal-argument ():                 Numeric Arguments.   (line  10)
+* unix-filename-rubout ():               Commands For Killing.
+                                                              (line  32)
+* unix-line-discard (C-u):               Commands For Killing.
+                                                              (line  12)
+* unix-word-rubout (C-w):                Commands For Killing.
+                                                              (line  28)
+* upcase-word (M-u):                     Commands For Text.   (line  41)
+* visible-stats:                         Readline Init File Syntax.
+                                                              (line 179)
+* yank (C-y):                            Commands For Killing.
+                                                              (line  59)
+* yank-last-arg (M-. or M-_):            Commands For History.
+                                                              (line  64)
+* yank-nth-arg (M-C-y):                  Commands For History.
+                                                              (line  55)
+* yank-pop (M-y):                        Commands For Killing.
+                                                              (line  62)
+
+
+\1f
+Tag Table:
+Node: Top\7f1330
+Node: Command Line Editing\7f1968
+Node: Introduction and Notation\7f2620
+Node: Readline Interaction\7f4243
+Node: Readline Bare Essentials\7f5435
+Node: Readline Movement Commands\7f7225
+Node: Readline Killing Commands\7f8191
+Node: Readline Arguments\7f10112
+Node: Searching\7f11157
+Node: Readline Init File\7f13309
+Node: Readline Init File Syntax\7f14463
+Node: Conditional Init Constructs\7f26513
+Node: Sample Init File\7f29047
+Node: Bindable Readline Commands\7f32165
+Node: Commands For Moving\7f33223
+Node: Commands For History\7f34085
+Node: Commands For Text\7f37210
+Node: Commands For Killing\7f39937
+Node: Numeric Arguments\7f42080
+Node: Commands For Completion\7f43220
+Node: Keyboard Macros\7f44765
+Node: Miscellaneous Commands\7f45337
+Node: Readline vi Mode\7f48699
+Node: Programming with GNU Readline\7f50523
+Node: Basic Behavior\7f51498
+Node: Custom Functions\7f54915
+Node: Readline Typedefs\7f56399
+Node: Function Writing\7f58038
+Node: Readline Variables\7f59345
+Node: Readline Convenience Functions\7f69047
+Node: Function Naming\7f70037
+Node: Keymaps\7f71299
+Node: Binding Keys\7f73071
+Node: Associating Function Names and Bindings\7f77618
+Node: Allowing Undoing\7f79880
+Node: Redisplay\7f82430
+Node: Modifying Text\7f86330
+Node: Character Input\7f87576
+Node: Terminal Management\7f89474
+Node: Utility Functions\7f90910
+Node: Miscellaneous Functions\7f93275
+Node: Alternate Interface\7f95572
+Node: A Readline Example\7f97731
+Node: Readline Signal Handling\7f99634
+Node: Custom Completers\7f105502
+Node: How Completing Works\7f106222
+Node: Completion Functions\7f109536
+Node: Completion Variables\7f113108
+Node: A Short Completion Example\7f125502
+Node: Copying This Manual\7f137675
+Node: GNU Free Documentation License\7f137937
+Node: Concept Index\7f160344
+Node: Function and Variable Index\7f162000
+\1f
+End Tag Table
diff --git a/doc/readline.pdf b/doc/readline.pdf
new file mode 100644 (file)
index 0000000..7fc2dfe
Binary files /dev/null and b/doc/readline.pdf differ
diff --git a/doc/readline.ps b/doc/readline.ps
new file mode 100644 (file)
index 0000000..21b7f99
--- /dev/null
@@ -0,0 +1,9203 @@
+%!PS-Adobe-2.0
+%%Creator: dvips(k) 5.92b Copyright 2002 Radical Eye Software
+%%Title: readline.dvi
+%%Pages: 74
+%%PageOrder: Ascend
+%%BoundingBox: 0 0 612 792
+%%DocumentFonts: CMBX12 CMR10 CMTT10 CMSY10 CMBXTI10 CMTI10 CMCSC10
+%%+ CMSLTT10 CMSY9 CMR8 CMSL10 CMBX10 CMSS10 CMTT9 CMR9 CMTI9
+%%EndComments
+%DVIPSWebPage: (www.radicaleye.com)
+%DVIPSCommandLine: dvips -D 600 -t letter -o readline.ps readline.dvi
+%DVIPSParameters: dpi=600, compressed
+%DVIPSSource:  TeX output 2006.07.06:0935
+%%BeginProcSet: texc.pro
+%!
+/TeXDict 300 dict def TeXDict begin/N{def}def/B{bind def}N/S{exch}N/X{S
+N}B/A{dup}B/TR{translate}N/isls false N/vsize 11 72 mul N/hsize 8.5 72
+mul N/landplus90{false}def/@rigin{isls{[0 landplus90{1 -1}{-1 1}ifelse 0
+0 0]concat}if 72 Resolution div 72 VResolution div neg scale isls{
+landplus90{VResolution 72 div vsize mul 0 exch}{Resolution -72 div hsize
+mul 0}ifelse TR}if Resolution VResolution vsize -72 div 1 add mul TR[
+matrix currentmatrix{A A round sub abs 0.00001 lt{round}if}forall round
+exch round exch]setmatrix}N/@landscape{/isls true N}B/@manualfeed{
+statusdict/manualfeed true put}B/@copies{/#copies X}B/FMat[1 0 0 -1 0 0]
+N/FBB[0 0 0 0]N/nn 0 N/IEn 0 N/ctr 0 N/df-tail{/nn 8 dict N nn begin
+/FontType 3 N/FontMatrix fntrx N/FontBBox FBB N string/base X array
+/BitMaps X/BuildChar{CharBuilder}N/Encoding IEn N end A{/foo setfont}2
+array copy cvx N load 0 nn put/ctr 0 N[}B/sf 0 N/df{/sf 1 N/fntrx FMat N
+df-tail}B/dfs{div/sf X/fntrx[sf 0 0 sf neg 0 0]N df-tail}B/E{pop nn A
+definefont setfont}B/Cw{Cd A length 5 sub get}B/Ch{Cd A length 4 sub get
+}B/Cx{128 Cd A length 3 sub get sub}B/Cy{Cd A length 2 sub get 127 sub}
+B/Cdx{Cd A length 1 sub get}B/Ci{Cd A type/stringtype ne{ctr get/ctr ctr
+1 add N}if}B/id 0 N/rw 0 N/rc 0 N/gp 0 N/cp 0 N/G 0 N/CharBuilder{save 3
+1 roll S A/base get 2 index get S/BitMaps get S get/Cd X pop/ctr 0 N Cdx
+0 Cx Cy Ch sub Cx Cw add Cy setcachedevice Cw Ch true[1 0 0 -1 -.1 Cx
+sub Cy .1 sub]/id Ci N/rw Cw 7 add 8 idiv string N/rc 0 N/gp 0 N/cp 0 N{
+rc 0 ne{rc 1 sub/rc X rw}{G}ifelse}imagemask restore}B/G{{id gp get/gp
+gp 1 add N A 18 mod S 18 idiv pl S get exec}loop}B/adv{cp add/cp X}B
+/chg{rw cp id gp 4 index getinterval putinterval A gp add/gp X adv}B/nd{
+/cp 0 N rw exit}B/lsh{rw cp 2 copy get A 0 eq{pop 1}{A 255 eq{pop 254}{
+A A add 255 and S 1 and or}ifelse}ifelse put 1 adv}B/rsh{rw cp 2 copy
+get A 0 eq{pop 128}{A 255 eq{pop 127}{A 2 idiv S 128 and or}ifelse}
+ifelse put 1 adv}B/clr{rw cp 2 index string putinterval adv}B/set{rw cp
+fillstr 0 4 index getinterval putinterval adv}B/fillstr 18 string 0 1 17
+{2 copy 255 put pop}for N/pl[{adv 1 chg}{adv 1 chg nd}{1 add chg}{1 add
+chg nd}{adv lsh}{adv lsh nd}{adv rsh}{adv rsh nd}{1 add adv}{/rc X nd}{
+1 add set}{1 add clr}{adv 2 chg}{adv 2 chg nd}{pop nd}]A{bind pop}
+forall N/D{/cc X A type/stringtype ne{]}if nn/base get cc ctr put nn
+/BitMaps get S ctr S sf 1 ne{A A length 1 sub A 2 index S get sf div put
+}if put/ctr ctr 1 add N}B/I{cc 1 add D}B/bop{userdict/bop-hook known{
+bop-hook}if/SI save N @rigin 0 0 moveto/V matrix currentmatrix A 1 get A
+mul exch 0 get A mul add .99 lt{/QV}{/RV}ifelse load def pop pop}N/eop{
+SI restore userdict/eop-hook known{eop-hook}if showpage}N/@start{
+userdict/start-hook known{start-hook}if pop/VResolution X/Resolution X
+1000 div/DVImag X/IEn 256 array N 2 string 0 1 255{IEn S A 360 add 36 4
+index cvrs cvn put}for pop 65781.76 div/vsize X 65781.76 div/hsize X}N
+/p{show}N/RMat[1 0 0 -1 0 0]N/BDot 260 string N/Rx 0 N/Ry 0 N/V{}B/RV/v{
+/Ry X/Rx X V}B statusdict begin/product where{pop false[(Display)(NeXT)
+(LaserWriter 16/600)]{A length product length le{A length product exch 0
+exch getinterval eq{pop true exit}if}{pop}ifelse}forall}{false}ifelse
+end{{gsave TR -.1 .1 TR 1 1 scale Rx Ry false RMat{BDot}imagemask
+grestore}}{{gsave TR -.1 .1 TR Rx Ry scale 1 1 false RMat{BDot}
+imagemask grestore}}ifelse B/QV{gsave newpath transform round exch round
+exch itransform moveto Rx 0 rlineto 0 Ry neg rlineto Rx neg 0 rlineto
+fill grestore}B/a{moveto}B/delta 0 N/tail{A/delta X 0 rmoveto}B/M{S p
+delta add tail}B/b{S p tail}B/c{-4 M}B/d{-3 M}B/e{-2 M}B/f{-1 M}B/g{0 M}
+B/h{1 M}B/i{2 M}B/j{3 M}B/k{4 M}B/w{0 rmoveto}B/l{p -4 w}B/m{p -3 w}B/n{
+p -2 w}B/o{p -1 w}B/q{p 1 w}B/r{p 2 w}B/s{p 3 w}B/t{p 4 w}B/x{0 S
+rmoveto}B/y{3 2 roll p a}B/bos{/SS save N}B/eos{SS restore}B end
+
+%%EndProcSet
+%%BeginProcSet: f7b6d320.enc
+% Thomas Esser, Dec 2002. public domain
+%
+% Encoding for:
+%     cmb10 cmbx10 cmbx12 cmbx5 cmbx6 cmbx7 cmbx8 cmbx9 cmbxsl10
+%     cmdunh10 cmr10 cmr12 cmr17cmr6 cmr7 cmr8 cmr9 cmsl10 cmsl12 cmsl8
+%     cmsl9 cmss10cmss12 cmss17 cmss8 cmss9 cmssbx10 cmssdc10 cmssi10
+%     cmssi12 cmssi17 cmssi8cmssi9 cmssq8 cmssqi8 cmvtt10
+%
+/TeXf7b6d320Encoding [
+/Gamma /Delta /Theta /Lambda /Xi /Pi /Sigma /Upsilon /Phi /Psi /Omega
+/ff /fi /fl /ffi /ffl /dotlessi /dotlessj /grave /acute /caron /breve
+/macron /ring /cedilla /germandbls /ae /oe /oslash /AE /OE /Oslash
+/suppress /exclam /quotedblright /numbersign /dollar /percent /ampersand
+/quoteright /parenleft /parenright /asterisk /plus /comma /hyphen
+/period /slash /zero /one /two /three /four /five /six /seven /eight
+/nine /colon /semicolon /exclamdown /equal /questiondown /question /at
+/A /B /C /D /E /F /G /H /I /J /K /L /M /N /O /P /Q /R /S /T /U /V /W /X
+/Y /Z /bracketleft /quotedblleft /bracketright /circumflex /dotaccent
+/quoteleft /a /b /c /d /e /f /g /h /i /j /k /l /m /n /o /p /q /r /s /t /u
+/v /w /x /y /z /endash /emdash /hungarumlaut /tilde /dieresis /suppress
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /space
+/Gamma /Delta /Theta /Lambda /Xi /Pi /Sigma /Upsilon /Phi /Psi /.notdef
+/.notdef /Omega /ff /fi /fl /ffi /ffl /dotlessi /dotlessj /grave /acute
+/caron /breve /macron /ring /cedilla /germandbls /ae /oe /oslash /AE
+/OE /Oslash /suppress /dieresis /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+] def
+
+%%EndProcSet
+%%BeginProcSet: 09fbbfac.enc
+% Thomas Esser, Dec 2002. public domain
+%
+% Encoding for:
+%     cmsltt10 cmtt10 cmtt12 cmtt8 cmtt9
+/TeX09fbbfacEncoding [
+/Gamma /Delta /Theta /Lambda /Xi /Pi /Sigma /Upsilon /Phi /Psi
+/Omega /arrowup /arrowdown /quotesingle /exclamdown /questiondown
+/dotlessi /dotlessj /grave /acute /caron /breve /macron /ring /cedilla
+/germandbls /ae /oe /oslash /AE /OE /Oslash /visiblespace /exclam
+/quotedbl /numbersign /dollar /percent /ampersand /quoteright /parenleft
+/parenright /asterisk /plus /comma /hyphen /period /slash /zero /one
+/two /three /four /five /six /seven /eight /nine /colon /semicolon /less
+/equal /greater /question /at /A /B /C /D /E /F /G /H /I /J /K /L /M /N
+/O /P /Q /R /S /T /U /V /W /X /Y /Z /bracketleft /backslash /bracketright
+/asciicircum /underscore /quoteleft /a /b /c /d /e /f /g /h /i /j /k /l
+/m /n /o /p /q /r /s /t /u /v /w /x /y /z /braceleft /bar /braceright
+/asciitilde /dieresis /visiblespace /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /space /Gamma /Delta /Theta /Lambda /Xi /Pi
+/Sigma /Upsilon /Phi /Psi /.notdef /.notdef /Omega /arrowup /arrowdown
+/quotesingle /exclamdown /questiondown /dotlessi /dotlessj /grave /acute
+/caron /breve /macron /ring /cedilla /germandbls /ae /oe /oslash /AE
+/OE /Oslash /visiblespace /dieresis /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+] def
+
+%%EndProcSet
+%%BeginProcSet: bbad153f.enc
+% Thomas Esser, Dec 2002. public domain
+%
+% Encoding for:
+%     cmsy10 cmsy5 cmsy6 cmsy7 cmsy8 cmsy9
+%
+/TeXbbad153fEncoding [
+/minus /periodcentered /multiply /asteriskmath /divide /diamondmath
+/plusminus /minusplus /circleplus /circleminus /circlemultiply
+/circledivide /circledot /circlecopyrt /openbullet /bullet
+/equivasymptotic /equivalence /reflexsubset /reflexsuperset /lessequal
+/greaterequal /precedesequal /followsequal /similar /approxequal
+/propersubset /propersuperset /lessmuch /greatermuch /precedes /follows
+/arrowleft /arrowright /arrowup /arrowdown /arrowboth /arrownortheast
+/arrowsoutheast /similarequal /arrowdblleft /arrowdblright /arrowdblup
+/arrowdbldown /arrowdblboth /arrownorthwest /arrowsouthwest /proportional
+/prime /infinity /element /owner /triangle /triangleinv /negationslash
+/mapsto /universal /existential /logicalnot /emptyset /Rfractur /Ifractur
+/latticetop /perpendicular /aleph /A /B /C /D /E /F /G /H /I /J /K
+/L /M /N /O /P /Q /R /S /T /U /V /W /X /Y /Z /union /intersection
+/unionmulti /logicaland /logicalor /turnstileleft /turnstileright
+/floorleft /floorright /ceilingleft /ceilingright /braceleft /braceright
+/angbracketleft /angbracketright /bar /bardbl /arrowbothv /arrowdblbothv
+/backslash /wreathproduct /radical /coproduct /nabla /integral
+/unionsq /intersectionsq /subsetsqequal /supersetsqequal /section
+/dagger /daggerdbl /paragraph /club /diamond /heart /spade /arrowleft
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/minus /periodcentered /multiply /asteriskmath /divide /diamondmath
+/plusminus /minusplus /circleplus /circleminus /.notdef /.notdef
+/circlemultiply /circledivide /circledot /circlecopyrt /openbullet
+/bullet /equivasymptotic /equivalence /reflexsubset /reflexsuperset
+/lessequal /greaterequal /precedesequal /followsequal /similar
+/approxequal /propersubset /propersuperset /lessmuch /greatermuch
+/precedes /follows /arrowleft /spade /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+] def
+
+%%EndProcSet
+%%BeginProcSet: 74afc74c.enc
+% Thomas Esser, Dec 2002. public domain
+%
+% Encoding for:
+%     cmbxti10 cmff10 cmfi10 cmfib8 cmti10 cmti12 cmti7 cmti8cmti9 cmu10
+%
+/TeX74afc74cEncoding [
+/Gamma /Delta /Theta /Lambda /Xi /Pi /Sigma /Upsilon /Phi /Psi /Omega
+/ff /fi /fl /ffi /ffl /dotlessi /dotlessj /grave /acute /caron /breve
+/macron /ring /cedilla /germandbls /ae /oe /oslash /AE /OE /Oslash
+/suppress /exclam /quotedblright /numbersign /sterling /percent
+/ampersand /quoteright /parenleft /parenright /asterisk /plus /comma
+/hyphen /period /slash /zero /one /two /three /four /five /six /seven
+/eight /nine /colon /semicolon /exclamdown /equal /questiondown /question
+/at /A /B /C /D /E /F /G /H /I /J /K /L /M /N /O /P /Q /R /S /T /U /V /W
+/X /Y /Z /bracketleft /quotedblleft /bracketright /circumflex /dotaccent
+/quoteleft /a /b /c /d /e /f /g /h /i /j /k /l /m /n /o /p /q /r /s /t /u
+/v /w /x /y /z /endash /emdash /hungarumlaut /tilde /dieresis /suppress
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /space
+/Gamma /Delta /Theta /Lambda /Xi /Pi /Sigma /Upsilon /Phi /Psi /.notdef
+/.notdef /Omega /ff /fi /fl /ffi /ffl /dotlessi /dotlessj /grave /acute
+/caron /breve /macron /ring /cedilla /germandbls /ae /oe /oslash /AE
+/OE /Oslash /suppress /dieresis /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+] def
+
+%%EndProcSet
+%%BeginProcSet: 0ef0afca.enc
+% Thomas Esser, Dec 2002. public domain
+%
+% Encoding for:
+%     cmr5
+%
+/TeX0ef0afcaEncoding [
+/Gamma /Delta /Theta /Lambda /Xi /Pi /Sigma /Upsilon /Phi /Psi /Omega
+/arrowup /arrowdown /quotesingle /exclamdown /questiondown /dotlessi
+/dotlessj /grave /acute /caron /breve /macron /ring /cedilla /germandbls
+/ae /oe /oslash /AE /OE /Oslash /suppress /exclam /quotedblright
+/numbersign /dollar /percent /ampersand /quoteright /parenleft
+/parenright /asterisk /plus /comma /hyphen /period /slash /zero /one
+/two /three /four /five /six /seven /eight /nine /colon /semicolon
+/less /equal /greater /question /at /A /B /C /D /E /F /G /H /I /J /K
+/L /M /N /O /P /Q /R /S /T /U /V /W /X /Y /Z /bracketleft /quotedblleft
+/bracketright /circumflex /dotaccent /quoteleft /a /b /c /d /e /f /g /h
+/i /j /k /l /m /n /o /p /q /r /s /t /u /v /w /x /y /z /endash /emdash
+/hungarumlaut /tilde /dieresis /suppress /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /space /Gamma /Delta /Theta /Lambda
+/Xi /Pi /Sigma /Upsilon /Phi /Psi /.notdef /.notdef /Omega /arrowup
+/arrowdown /quotesingle /exclamdown /questiondown /dotlessi /dotlessj
+/grave /acute /caron /breve /macron /ring /cedilla /germandbls /ae /oe
+/oslash /AE /OE /Oslash /suppress /dieresis /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+] def
+
+%%EndProcSet
+%%BeginProcSet: texps.pro
+%!
+TeXDict begin/rf{findfont dup length 1 add dict begin{1 index/FID ne 2
+index/UniqueID ne and{def}{pop pop}ifelse}forall[1 index 0 6 -1 roll
+exec 0 exch 5 -1 roll VResolution Resolution div mul neg 0 0]FontType 0
+ne{/Metrics exch def dict begin Encoding{exch dup type/integertype ne{
+pop pop 1 sub dup 0 le{pop}{[}ifelse}{FontMatrix 0 get div Metrics 0 get
+div def}ifelse}forall Metrics/Metrics currentdict end def}{{1 index type
+/nametype eq{exit}if exch pop}loop}ifelse[2 index currentdict end
+definefont 3 -1 roll makefont/setfont cvx]cvx def}def/ObliqueSlant{dup
+sin S cos div neg}B/SlantFont{4 index mul add}def/ExtendFont{3 -1 roll
+mul exch}def/ReEncodeFont{CharStrings rcheck{/Encoding false def dup[
+exch{dup CharStrings exch known not{pop/.notdef/Encoding true def}if}
+forall Encoding{]exch pop}{cleartomark}ifelse}if/Encoding exch def}def
+end
+
+%%EndProcSet
+%%BeginFont: CMTI9
+%!PS-AdobeFont-1.1: CMTI9 1.0
+%%CreationDate: 1991 Aug 18 21:08:07
+% Copyright (C) 1997 American Mathematical Society. All Rights Reserved.
+11 dict begin
+/FontInfo 7 dict dup begin
+/version (1.0) readonly def
+/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def
+/FullName (CMTI9) readonly def
+/FamilyName (Computer Modern) readonly def
+/Weight (Medium) readonly def
+/ItalicAngle -14.04 def
+/isFixedPitch false def
+end readonly def
+/FontName /CMTI9 def
+/PaintType 0 def
+/FontType 1 def
+/FontMatrix [0.001 0 0 0.001 0 0] readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 0 /.notdef put
+readonly def
+/FontBBox{-35 -250 1148 750}readonly def
+/UniqueID 5000827 def
+currentdict end
+currentfile eexec
+D9D66F633B846A97B686A97E45A3D0AA0529731C99A784CCBE85B4993B2EEBDE
+3B12D472B7CF54651EF21185116A69AB1096ED4BAD2F646635E019B6417CC77B
+532F85D811C70D1429A19A5307EF63EB5C5E02C89FC6C20F6D9D89E7D91FE470
+B72BEFDA23F5DF76BE05AF4CE93137A219ED8A04A9D7D6FDF37E6B7FCDE0D90B
+986423E5960A5D9FBB4C956556E8DF90CBFAEC476FA36FD9A5C8175C9AF513FE
+D919C2DDD26BDC0D99398B9F4D03D5993DFC0930297866E1CD0A319B6B1FD958
+9E3948FFB3DF7BFF10C9BDA4EFE5F68A8CB1526990D1357AE6D2F7C2D2EF8496
+4E47B39E6712EB8908A3265E5FAB40567E866C244814449F1E993AAB422C3F1D
+DFA8C7118584F2E5197FD4BFA3A8AE9E953C6CD4672C0FF51E41C3A919749C1A
+F06650DF4C5E17492164BDBCDF22609A74BFA7F69960A64B9F949FFC2A807458
+8579366C4F41BDE1FDFBCC4845FA19BBB6963D65EE8532549274BAEBDFF24FA6
+03235D1BE37C06B1938AF369DA75BF38DDBC87A1FF445EAA16E1895ABE9506B9
+211955753E447865D33CEF007391D2666A046277A30A49804FFCED3FEA5EB2C3
+E52EE14A9F75241EA10C91974CDA6236EB840FD44D6DDE4D9B3266C3B99BD38B
+D835BCA8CB819C073480FB972CC028D218F6A1D344CE1B63F4FBF2C826F412E1
+6E0B05A26125865A14FD7B7030B478BB8BC6BC395335C3BA940E1C348267F4F9
+0AF97BBEE253511940F1048E175D3569F7D05A28851B6F50765FEB6C9654FEDC
+1BF52F535DB5BB90C1BD5D2EBF75E0AEBE82B20507F3C28A03746781018D4EB2
+298E4F2C27ACF73FA73EBE43F014BB575AAD516C0407B29E1653375135ECB74D
+C91372F06FA8EF37C31AF3FA48AE65318EAA6C34830A5377ABB2DFA5DA53A574
+433484BA1466709A4B186761655C8E482833B697673E847C691079E7F1DCB8D6
+1AD91101D757B83E2090337D525AEECB028FB3C9F6A6E6AD2F322CFDC5A833E6
+1CE4EDBF41FD34FD61630581D222F854A76C2EA9FD72796A7C9CC1F6C2FCCD16
+E95CA05826A4ECFADA6A5FB83C41A7131E52BA6585DD6DD78515D8F7327DFC6F
+9404F89293D6ACB433CD0802C43F0E74C6C4766A23A6AE3788FE6CAE82E1A104
+BAEC8BEFDEFE4F292F625E60362F3886F602CE4121BF0AAD93526314BCBB5971
+40091A7BBF7EFB3BA355B88C897D9C70C841DE41309348751EDFFA8675215988
+49CB1599834A01EC6CD4FD813AFF97A614F56975775D5F48E9C1A9CE532FAEB1
+4EBE20C3FA87CFE03664C428BFC5C894668E507950005BD8C2BCA8998C1FB92C
+4E6B791BA05B79F332EB8AF5B0F851B8B7EE372EC0861B09C007CDF43F82D0B7
+35446F682A0DA7F4112CDABE4F922EACFCB7B8C88BF550B60957E7
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+%%EndFont 
+%%BeginFont: CMR9
+%!PS-AdobeFont-1.1: CMR9 1.0
+%%CreationDate: 1991 Aug 20 16:39:59
+% Copyright (C) 1997 American Mathematical Society. All Rights Reserved.
+11 dict begin
+/FontInfo 7 dict dup begin
+/version (1.0) readonly def
+/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def
+/FullName (CMR9) readonly def
+/FamilyName (Computer Modern) readonly def
+/Weight (Medium) readonly def
+/ItalicAngle 0 def
+/isFixedPitch false def
+end readonly def
+/FontName /CMR9 def
+/PaintType 0 def
+/FontType 1 def
+/FontMatrix [0.001 0 0 0.001 0 0] readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 0 /.notdef put
+readonly def
+/FontBBox{-39 -250 1036 750}readonly def
+/UniqueID 5000792 def
+currentdict end
+currentfile eexec
+D9D66F633B846A97B686A97E45A3D0AA052A014267B7904EB3C0D3BD0B83D891
+016CA6CA4B712ADEB258FAAB9A130EE605E61F77FC1B738ABC7C51CD46EF8171
+9098D5FEE67660E69A7AB91B58F29A4D79E57022F783EB0FBBB6D4F4EC35014F
+D2DECBA99459A4C59DF0C6EBA150284454E707DC2100C15B76B4C19B84363758
+469A6C558785B226332152109871A9883487DD7710949204DDCF837E6A8708B8
+2BDBF16FBC7512FAA308A093FE5CF7158F1163BC1F3352E22A1452E73FECA8A4
+87100FB1FFC4C8AF409B2067537220E605DA0852CA49839E1386AF9D7A1A455F
+D1F017CE45884D76EF2CB9BC5821FD25365DDEA6E45F332B5F68A44AD8A530F0
+92A36FADB679CF58BAFDD3E51DFDD314B91A605515D729EE20C42505FD4E0835
+3C9D365B14C003BC6DD352F0228A8C161F172D2551CD1C67CD0B1B21DED53203
+046FAFF9B1129167921DD82C5964F9DDDFE0D2686875BD075FC81831A941F20E
+C5CD90040A092E559F6D1D3B0E9BB71733595AE0EA6093F986377A96060BF12A
+A1B525CD9FA741FE051DD54A32BECD55A868DD63119A4370F8322CCBEC889BC2
+A723CB4015FC4AA90AE873EA14DE13382CA9CF0D8DFB65F0ABEDFD9A64BB3F4D
+731E2E1C9A1789228FF44116230A70C339C9819676022AB31B5C9C589AE9094B
+09882051AD4637C1710D93E8DD117B4E7B478493B91EA6306FDB3FA6D738AAB1
+49FBB21A00AC2A999C21445DE3177F21D8B6AAB33869C882613EA6B5EC56476B
+5634181ECBF03BFEDB57F079EACE3B334F6F384BDF9D70AEBD592C8ECF21378B
+54A8B5DBF7CB9282E16AA517E14843909339B5E7C55B038BF3BB493F3B884A1C
+C25F9E8FB912CBE23199AD9D2C3E573727701BA301526C66C3617B9514D6F11F
+11930B1D97C17816C85B1BFD9B973A191B33CC3B391815AD14F1CBE935942AEC
+D4004E6BEF379066FD72209DC88D2E634E79BCC2B98C766CBD92C561F2703F8A
+109E6C6CEC7B866F2FC7ADF646BF492E520319F3B949AB5D84AE990B33344A40
+3971F58DFDF8D8D67FA0B8F2A0D884F8C09A5A721319B911DBA0A35903877343
+C37BC36C5EB32353272D1E6ED5FCA611BE319A7E1E842CB7576E7A68B5ED51FA
+3D560A408651E1DE4CA7F7045304BC92695FA64EE9BB26323501BB6812BF93C8
+F0943DD7F7D4DB11B67124C1A036F602A89C92C88CA0C6B5E553EDAD776E2D30
+68CCA6087BF5B8E5F21FD98B28FF98C95B0269FA22C704D7AD62051E5B3AEE88
+A37BDACE549C39E26DF689B18D5D6B08EE00039E6A48535F0366731962C9965B
+59039E77B86CC86818E5149EE38E2532C27F381B35B7C11E45C9378361BB1DC1
+41771CD882B3F4442C80CD77CA970DA90ABCDA4FF1980EE556BED6EAF9EE8BCE
+B8A168C27DC2993EDCA0D042022B51D8C68C574193E360460F7DC428B07C3A9B
+31046F24519B1173F30F150061FEA0D1BFC5502D8394890B2EF2383FA09E6DFF
+53760DA7C0D8EE63C40886C7E55DADE15C0CDA90210C3FFB39A7BD9810725834
+9FF3E45BCDFCFCD060E5526DF778651F49263C611F70578B48152B33DE625ADA
+4E780838570951F01C9D166B366184B08AFF8577B6A2C1F9D54E07C5A2255648
+AC7E77FDC6D159F0422B6C807CE0EAD467D5ED91DE842D61FE03CC71293CA0D2
+07ADE222595841CA7955413CFFA7BC47A5C122E9F0A4BF1784DD2DE1C169FD9C
+995EEB1942688408159BC3ADEBF8E728FF1541E2B862353F25F6029DC08DECF9
+5915E3645EF2013E904EABF2398F6B7A0410FE03FBADC640E1043096A5C336B9
+D9BD079CB64FA9DE6AD8BE4234BFFFE770950A98B8F67B981E417202728004F5
+4DC7C1307CC9E1AF850FCD51884F2F0DE870BAE1C30F38B82199C3180409E82A
+000766C4ABFB5464844A2A205D46D0BAE1421784573338DAB60F5AE269237534
+200CDC077033251E2E14C5DD686DC4BED29F59F5D8EBA72591FBE4E0FB08651A
+68E96F86F1925D1982AB3FAF93B0E7F92555D921BCBBBE77DCDF4737BB4411ED
+F008A3A9E100FAA52FB1411CE2EEA0533035F8E6893404D6E49E3A30D96586D8
+1EBFE00C6073159B5DE5A09006715C6793AA8BA02D080F715B7F70387C68F170
+659DF4948CFE584D5D1BE11BD52DF02DB8D1B3BDFD51DF5F90ED9A3C3A999162
+4AF2B558C0FBF0E48484C92A148387C4CEC15C98A46FE60BDF47A6CB56DB99FA
+6941FE3BA90ECEB0612632F61449C8587D59A0F80562CD7F8C48315726DC1C4F
+947C42A8B20A04CCBA4F71EC263835C5038FCBBBDCA8CD9AF8E4E2EBB96A85F5
+39FB6BEB32F29444C09E106EE00DEE0E03B1740F67AE3053CD368C1146DA8B95
+AF0C21846667715A741A4A1657DD22C0DDD0C9FA357F84B053A6764411809EE0
+DBBD92068ACAECC1DA8DD66AD093CD5D3D941FD3B51A13928DBDC96D17F5DD79
+B35ADBA0F19C73670E58B4DA47583CC9A4856AF60A5A3549CD4767D0426FB29B
+AB660386F02D3DBFE7FDD706865B24BE3D3CE3774F18F6BC700DC99954D7C48D
+F30113EAE546A4F02F125CF85A18CE69E4D6AE9E08E74B79EA5B68FC57FBF09E
+130606094463B6CDABE7AA6E55926A474CBDF28185EE7556A08D17C45AC94160
+593DA873D9FD8F69DA68D18727692D6C87EC78A293C4CCBD661A02ECBF062580
+369B2BEA56A4E32991AB626BDEA29FF772F1796B48D8F9658692EB4044D7EF01
+3B3CA41AAF927C364309CF415212BAD1D852B0560A8D49874C92AB2541C1E361
+0930E31424A348F680F94DCED38995BFB3302DD64225F0B04A09A74E1595D221
+9C25913BD7AEE76B967B9BCB2F62E1BC3F1D15786A2D3B9F3C5009FD8F4879D8
+16FBBB351AF894788C5436514C27D473988F3A80F761B28B18B655E0A76B6BF5
+0D8F284FF6E4AE7B0C26127712F7A4F7B9D28E0B6B403495B2E02FABAA27574F
+35DDA985CC000C1873408355645C9E3B2130DFCEC06B7287DAB0F83AAB471866
+F67634A6178C48A8332D5EA87F4F6DFB6EFFEFF053F023E8A44A977FE9C16EDE
+7E06BC9F7F12F883D9492CED03CD0F85C77AB7EB6A39CAA09C4CD7157A9C9CE9
+4A48F8F9761431E5DCA288D85670FA1F3F59A2CDF9467F33F27B25BA742743C8
+18227D3066DB560186D30DB1BB398FD8016CA5E4549B01138F944DD5EA705B61
+8947DD70A317946556F95B0B6BF64D2BA5AECBF81E1FD101EA5B7307B84EE594
+5AD4059C8D14314C0A52C942CFDBB67D7A6981BC7F5320D3D2B55F2BACD54FFC
+A2F79ED842F9E22FFAF5783EE632AB0A5D05D7683F7966F8439B8E1C8F4DF635
+B8102574E225F4F2D3B0D2EC0B92B50E331B8438C893A6460C3F45F266172131
+387721EC837F4ED8F9F4CB5B2C6F2DE89C15C05BC3E55F18A64396D056C924E2
+7B35A95E1A48A381855261EC272264BE5EBC5700B46F0E2227AE590AD57764AE
+3074D065CBBF8FD89C1520D266B48B52C3984A694E20199A4B079E8FF2339887
+AADCFEC5330F10B9237BC4EF612244237BD557FDE58BBA4512DB23EB2BC94187
+B3D5F590BF44968021903307889F418AE545BF73B83E8878A0407BCD379609DA
+C5751E074BD9BE46FD33EA4370D2D5DAE7CAC02FAD9F8E1BB58DAD635B0BD7EA
+469EDC189ACB5C3EE67A67BF806C51E12BC92E91EF1E117DE66C4F2A9E745A47
+15DE7F1A0AEA10A45F08E2F4399360B11F3A09E0C32BD0F14EF530A8833CD569
+BCC9A5145BF38CB29E3919C2AD9731230782E159E94C02A76184D669FD17DD68
+2F13EA14EF325E6C9AF57EA2ECD3A3B1C4DE70785BF2B2817D758BB234411F03
+9E1C46B18935A56BEC5D55B9080602AA84F98A55B6D4CF66E83276723EDB1B2E
+0A9C9B7C8459CEB0EF240714B5B78514495F4425496A5D1DE74B09EB9D31940C
+072D6D249912B917DDB1FD4B673B8D27BC85048E0E589CD2A17E02FDC7B4FBCB
+2ECB335B34B4663CFABDCB5417CA7C1142069C25794D568B95CE29B9DCC0D7B5
+47962BCB535C8962F5B66BC5007E61A82A8703D676FD69700929419EADC10223
+AF300492F5346B61A661D1B338265B3126D0D00D5EA5AC91B54B758783DDDA41
+1DE8822D851D080FD850DFFA0FD4B28F93458CE4CDA524F4CFFA22DDD6029209
+4AE4C566016DE6CB73B534B0D3628C0198C2978B5014B09A108C982149CE0E38
+4BB5A9C7BCC5C6CF9257D513A9233C0ED64ABD62D8368FC0B202AE38162A2F39
+0749272663ECA2F1286EBA49CF88C72CBD0C5CB2664CBC73272398731D15D9F9
+79C51314BCB00FD04AD65CBED3DEF2F96CC9297DCBB4235215CC53DBF02375E9
+01642EACB34930D35D47C46F98875E0C5F62F21A1342CA798B2AAAAA78254B5E
+EF248251CFD2D7E9FC299CFF0B1C81EA0CDCA106E2D6A22A40B4ADEC2005D713
+59796BA1E6FBBC55549B9641AD6A6AF977C5234B66789E946E138754F15C9A05
+E67D7340D73F76CCB5E0D01A685DFE166A0B58358D8D05A407DF0949E4D6FE32
+626917EB3964A325A58D1A01F8D7D74D9565619A30A4A7A95E5961B2ADB54387
+EA160D1C553A6F3756DDDF415A431F910A2CCC54B7FEF17CEC4A39BF7282EE76
+BB2C35CAB9F60D363491DA097D1B3A3FD7F7674008531402BD57CCACC26B2D07
+12A3287F903FB55C48664A34439B797F3560EF5F183FE1DE33A5057CA47E46EC
+4EF5B6683E44384E6BB33044940C1025A3CB3F59A46EAF7D0D5FF66C58E89F7B
+2249E95E830E94DC0159C989EC66973C359685EE3A02B9194A72C7697BC27978
+8D7B82DF6C448623BFE4AD8BD93761C3D6A71A0F6F66A9EE023E0506FB2FEDBA
+93FC073CD19D5DFD9C28505B3B8E2FE756E00ADD8467208C079860AE460543C5
+B6CEBBC10B2EA1EEA6CD13D20EDC5A118F2FEF56BC81958A9D9D0F7A08FAF926
+DF045A757B33FD3DD093A8A7C82B914CA39EBE87EFBFC5B35EBDE845E4D2DAD9
+7764AB8DC8A0AB77E32423F91B3D0D2C154EE2D17979CB8DFDBD0A4549FF2EE2
+AD37CA8F41961CFE90BF5D669F3EF1C26C6162F40551656064A3D8A3478D4786
+8C9149980F294EECA58A9DC23DD5566F7A06ED7618DA2BEF3D99FA4018AF4D6F
+02F6454A0B2337DEB89D66EBC066974CD398FFFBA7FCAD1B1BB37C9143F0A89C
+2290C92F34AE64C339B42EF3A5BC48AB770802140935B90EDF77935084C77178
+873A74B11496374F55069B3FF469922027491DA738BBB50207DD3DCC8CA80DB0
+A041848DF3F61B8447F15CE1BCF0BA3AEF785A04F17C1A22569DD20D034B9652
+1DCDA9392C5DA7FF0FA312707DEF8C538C29138419C731CDB68FD01FEB4FFF67
+D41916D7681A563E0B7BBA324BAD2F047B55D3255F717E723F7A2CCF89A1B93A
+76485E4582EC2A39BDA79D3C17136C476392A82B6897095DF62D2B6E65A14D06
+6E327CBF4E8F7EC1DED6F49B6493D12DE0DF759D89CDC50456BBBB55DAAC9502
+D0AE4E15F8A68E5C2411CA6BCE4DFBDD4DCD7BE60A25A730BEBFF444998C2EAD
+2C14E3316D659B834A7622B921E03F8D0AC2C5E02952236BD5A28F4EADD73366
+93A99F61313BA119FE9E8E87EA9DD997583716DA37273D2BF5866BF0FB44215D
+9E20DFE03CDD8BFC61DA4877FAFF071EBF9FF5CF19634D92DBE5EB8E061A2A07
+35CC7BADDDF2D738277C873DEC6C97A854D0ABCDCF12F48636D0C6F449C7048D
+F038E827D54D6FB7DA94532766B94D071C9B9FF7D80D175A79B09DFF3CE41D1E
+C9402D32EB5FD5B9BE32F2324EF8D66DFEC2EF9E56DF9DE385A72805E10501C3
+0C1797E5DEE38708A785985B6A61FFE99613CBC9980118F9ECA7582B9874A811
+7430ECF39E2A774A49D3325E9384F731145F7EDD0BA3D5963EDF1A2928B5308F
+3A50D72491484092BA99E7D6F027F0ECE1D5833FB248FEB06957230F6810C645
+7A6F82329E05094506AAA6F9E09B61EE2CC95E4D99F8D8B12B8223424E9E4B36
+92499001521A9D431F098FF63D240498BE1CD95DF52046B07EA88C445DFA35AC
+6CFD5E6DBD0A44BCC4182DACF62053CDE03D0E64526EA34262C707F1A990A844
+11BE3C7F02CBEE9C7EAAA212EED4493B801119642A6670C18C45184B91B10096
+F803E99CD1209D13B866D8A45AD999228C94DE5DEEF6CECAE154CAE4A82286D2
+02A8324F3866DB698B6B085D05028AD4047E59D1962EE218679ECA70206A5976
+5802E739BADD1477330196B75A631B12DE16C0E634E9CD759F080DB975F692E3
+E18E725A093A1C102FA0F73A23DB1AE8E17400FA081CA88AD54F975E2507C948
+CC6DF149C1F2646FD3F62529488CE78DEE4ADA155081BD819C40F624571BB649
+C598E2B3C607DCC5383A0774BB590CFB57CC2432605155425FCB5F02B12A20BD
+579059B80C1168E3D9BDC4FE6D20970D34F2A2DDA7542A4BD8815EE0656558E7
+9D025BFFE6FF6D50D92ABB7A82C445DAAB13896B28BCD32EEC08BE55D720383D
+A6CA9BDCEB39BA0615182941ACD0D52AE4E19700ACDF2B983C22C8A4D5568C91
+493FBCB4C1F582249C930F1D0515E4208E5AF759D4317FA39CB2634359BC2858
+49A98B8C573AFA8012A16C3E5109D54D040BDDB1C79B6C475D1AB95CBF022A55
+7CB102976B27DD210BE99F279E7BC2A584CD5D732A80283980E4C18045E687D4
+5D79EFD9E2A270DAA5A777E2D53839D5B04540B756B75E5D06B134C0238CD6C8
+B875F9A335FB8574A6E39285D7924BD4123FD0C8765C82918C0D625507999B3C
+5F2C978939F47C0EEA7C3ED837F4CF3891BC790C0A1A3013B65009F9EB00BDE0
+0A8B3F884FCEFCAD6745661453AB92DE8442E27C899E2C7DAAAED3F79DFE6B5B
+1F1244706112F58A7A4154D56E0841C43DE496F1B8494599B662F8DB03278E9D
+B90787BBBA4E934688F9972F238557C0D11084D6F17D28CE8B0539EF36A6E33E
+CA747C64AB2DEBBF2CC8B7086E4FF69409C95EF5C021C6489317E08B8547DC5D
+FBA45224379595FC263B57587B823E95665340917E609DB8805E20089CC20C0E
+57A9A531A0068466DCA2AEA41C332F04B10347B8C6CE48233325BF4B18485401
+BBA4AAFA33067623A8843F134F90D0A9651C22B5CC5FD75EEC8660FE154CC875
+BFF9E625EE2C62A6B0FFB8E99447B360525604A85DE4629A8600E557AFC51643
+20DD4AEA48DC4D3B36D0AF148934CF3A9D5E1CE0A672FD6A5DE6F8EE04D2C489
+22366F26A3CE9A703545D6C4D14917390AA6A733ECF53D7AFC3B8AFDF03318EA
+2AFA4C61D291B6A479137424E87E3A0F9981BE8B84D12E5601C8740B381D5E88
+362D1626547D1AE501BB748ABE3F591CB5257548A86185B26D1414E4192AA685
+C9077129CFFFE1D7A6329F103973F2928AB6A509BCF32B014685BE251B887838
+C7C0DB8F85361F70C15F679C53553AD07BC0ADB6E866249D01EBDC3E500696F3
+9DA6F9CC8C6A3535BBDD9096658610183E989BE704C259F6111616DC7471ADE6
+A8DE73CC340110B8DE6E947CC2C70E4CF0245ECE1DA20C7A695330C50BC4F12D
+F51E93B41181B635B352B15AB50CD8E1633B25ACC11C73F29A6075E30CF56773
+AC7F8880AF88B689CD292A056E0821E151E1272577F4E061D164A801B1B26182
+EBE31DF3DF1F35F264F605503D15432D96C157EC79039EC44FDFD8757F1A1081
+6D59D889E6A59C3B6B3EF288AA62D3610F0E6B3015BF08DA40FBB420ED893423
+7BA21152A9CDB5B4A7787117EAEA1109A4548130028B4FFFD949A997B8754FF4
+8C79A7131404AFAE704F68321CC16CAEC9B8CDB127FA5EE2D8CABD362FF694E0
+0E8FE576FA89B96BCAD48DA4CA725259E57FF50A24F21679FE78EE889DB92FB8
+53F8A6539A3EC8E5AD34915A2067152E920482F632B587A764985D686EAD3C84
+2FBAEA7EEDAC2306ABC5D3D8088A844FD63830F47CBBD5D179CA520C5DC0D914
+D82B6313951EB6B3407A0B16932F4B61A08A164339CB0E7218E4A7F08775A064
+A85A094CE278F11FEE05522815FACC0B0C9491D156EF42B860687CBAA26E4A28
+DAD0F6199B6E3D78D9839D1595E6B7A1E9A7BD974B67FC1204F1DAAFB808539B
+FEC6C90363B38F09DD6364089D10B5EDE390CD75E166935A3BFE8356739F8583
+E7D7F4B518046901C79108DB453DE9B3312FA7E5053D7C3E4A12F13C97936E0A
+31E74CD9423C6FD3AA00F76275E5822B468B3A1002BA1B8161B8E3B55A70FA32
+E3F8B718C6197E73BA6B72C685FB75CB08B87080E01DD2FE3ECDC633ECE9A298
+C5443AC2D696A38D6197D3139968B5B9DB9367A206D5F2014A083F4A3D0BDAC5
+CF792C21860C2C49F61409A402207B76468CFFD4FE307F3CD373856BA3269659
+E2717B9BF57D01CE7A7BF106A6C0120CCCD6CDC146ADF30255D8F83CF0EB3E55
+A8FCE82C4F1B3804C11F11CE8AAD6565DD3A3691038CEE7D385ED7ADED41B8D5
+5BCBB023C9905E680C02458805ACB6EFECED0293C395EF459C4B5ECFC70CCC8E
+255C4291B2305C2F126B3C41C872B3AC13D4D7612C296E03E74B3D77E9A1AB66
+B7C709A3E18706B12EEC36FD43B3C4E2F4EE283165DCEB76BE610FA8403CB66E
+7910745FAE425081087386BC8353D404EEE725F30B919D73A668661519809A4C
+96BC9405B483F654BD808A9DE59B0E3D307A6AEDF526921D91750B362A839075
+1B97996FDE08958BCDF18867378D79174B5495FCD470B0CE120B5E470DFEF904
+7E99B32980C4146E139F2D43659AE8DC719F2F2838C0906C63AA1ACBE2784B88
+D62EE014036B38794D7A6BBCC1E008202127FA2D430476047EC1C34C5CC62AE2
+EC1FAD16644EF9F644E67F1B815B96039DA2EAD10966628931439F988BA78056
+EE85DC6B23DF10105AF267D5ED6B1CE01C18953517D7E63C45EA975F5E93E920
+F0D2F349995A1A366BFD10C3E517CC64F2BACA8EBDCDB1726AADB7A9958E7071
+5C6CE126D46640B75F76C689722542A321E9FCF1C6E01310974A7FA548B51561
+A31C2E4C6EADB194B5D1E8A64A27F87D927FA88C30EE61A130B758AA70809F91
+3EE5607CECA9C18C7028C1D7EA76A24B08F74DC74F1F034930543C9C4CB0D143
+31CD68E25E79C827E06785EA6361F3EB251A01AA10D647464BC5CF41DD687E1E
+3AEECB699952181B3EAFABF4476CEE11DD889A1DC8818EF2128EF02BA6D6B96C
+048F4156520BF728C1DC65382B7A8FD21EF8EFABA3B3D7DE9BE803F3859A9B18
+044AE0656070354FD86A5F78B34355D5489F5464EEAEB5E0B50B8D17EC91EC14
+769E10D34CD03EC7B29F761F19C2B6655BC143225801C1F6BC995AE74AA1C556
+15C1450A62B563F57AFD3ED65AC496DBA8CD0A30E59AE4377AF9FC2306A2080B
+B1B92872829FFFE0CF0AAACEC1B760838D5FD49CC7B9BFA3AC8CC10DB0EFC5D5
+31C08E4CC612D0F37503A7DF62CE3FB45B4F23C9D1B03982107A0538B20B94EB
+904E76F26E8960F8B24064524389E74C386E578F1AF6F3405017D6FBC98C5110
+F8DDB1B726CBBA948AFD4F87FA0925C503056F98256BABCA04E9F1E0F90649E6
+214EA30A6CB1559CDE88A84306B22F52BEDE2413D2491877EF1E47AA604CDCEB
+DAFF33F0B3FF52EC0934976D5829C30D6058536A93F5FE29C53DB2904F2AA136
+4C0518399B141E03A0B7F8838D565304923E9BB312CBA6C2619030924B9761A9
+DEF51F7C550A2ED90EBA6ECC8472217F153CA2E69BF81AF19261EEECD2A0B447
+F1DC94AD3601C9322BB8897D1FBFAA76B3DDEF1D6E8F68C2ADA463D69D4C761A
+35B9E5676FECF5E529F5DD60865A3EC2390A4C082798AE9A9354FFD151F878D4
+F6B5AEE6E45B16B0BDE901BB81409F10275817216520DACBF84E54D4DA35B793
+4A1079C8A9BACA6F2E640BE1E1153933C65B01DF45DEE34A92E9AC18485FA4BE
+D8F7BF61A441EFE5F5F13464C9484815556B9D52793BC6EB16A31962F6D6FE06
+DF6DFA08FBBEC4839744B571E56AE1A634F3C8BC689511A893517CF43C7A9E87
+4130D4DEC596F730B04DD4D257D14717C3468292F9E62B3CE1A3513F3CCE0F97
+C9885B4229076698FB42B2CCC355AFA7EDEF5FE24720C8B750913D68814A95FA
+2120BFCD00ABE9E498C58FF83E9B6E94503EA7002B6E338E6074702D34218A73
+0FD51AC967780742BA4B2E36489D4AC576965033E63B5E493BF2BE70F81CADC6
+A9356A1BA0F12E58EF6D3A3FBEBB2E898695DB307776177E21E5E12CE7150147
+C5F2E409235242E1025221140C78E14B2CD175E9E616A9E11E7BE338047339B3
+D4400AE08445B5E6A34820335D2FE6DEAE7C623CC009B97B16A085B966F28DA8
+8E99778255A7EC3529A26687B4FE1CA5E512197226FCFB7DF99C858D6224F397
+DE145D192AC4AE4C19872694B93FFCB7B30655874E83359164AA20F02A9915BB
+CAAE90F6E7CDDF4B55F3A60E07AB74768B7FDA07620347FA20ECF2DF8EFF0CDC
+740917E2D59DE57AB4A232EAD2E06FF02D76AEC4C03AA32EDE68D932CB51A4FD
+FAF54B642EE76532E8B86A207FBC5242CA6A864EDC59ADF9EB68AB0BAFD24E69
+A4B6E938230DD511767B6869CFFCE2865F959289644BB41B1085EBB6A58FF136
+2433DF2FE92BCEF0343F69108B79D4C56685D1D6C84D368B1E813FFF270E096F
+EDA2C4697EAEFF19D60465C772D22CD7BB09115E97B45148FF7103DE3C8A59AA
+AEE6861565C4907E4752FB2807F0CCC3B14AFF6775D1032F76637ADAC909CC36
+5326560E6DE148BF49A9EF962264BA50A8F1CA39319103F9210B713C053B6DB5
+22A3EF2C24F43D48B32978058F3E0F1A50B7D6C31CCD706F47D89FB64608376A
+658E7B87A48050A704EE7F0F46DFA63B199CCD944061FEDA27F84605EB35C2C0
+7A5322B5CFFA97947A289954BC6D3F61B7BC0EAD85BC1884A6F6C6508FD95F41
+1D5AC1A2137257A3EB7363C865E56233AB388945703311DDD089A03430FC19CB
+1EC1B524EB43268FBA8D09F1DA43A50EDCCFDFFCD7F4DE041A5ADF3721FCDE42
+5C689D5A2436DB58ED2D435D30131B51E8777E077EFC3D314DE0CDB0D2EAFCAE
+5F2267C3BB6B956B970AA2C61EC8D3A9BCF8BA945AB72A2B4B5D0286BA6219A2
+A20081C4452393BA84F86A4A19090AE698E966CC947E38923FDF36EB1C706DEA
+8EB03F86BCD6AAF3222CF13A469E0B93CDE689E8FFB281BE13FC939505427BE8
+F4460097759315CCD22942316D0AB980F0CF7210DFDAFA2BA852E6310B8B50F1
+257DA8E14865403DD9E6340B6ED9079F3EADF2BEF806D21BF244FF2EB5AB07A3
+4FC766A91FECF2B5876D98C8EA190805F437AFB18130FADA96BBEF8F6DD04D91
+39DA9F3615FE1A6AB647FF0928916E1EFCE815C27FBDF580DA71C7B83FE2A492
+B7944A2021DDBC9ED14233D4C84C9F99082250B65DC8A23EB0900BAEB2C5709B
+20C5BB49FF65599A63B6DEE0AFB9155416C7C6209BD69EDD65A5E235DF900DD8
+668F6498A80D79AA1B2E4E9F72024A7EF00B927A127E9E342BC214149BA9ADB9
+9CEBC0F7CA76B3E2BAB01CC685F6BAB33F412C732E5AAB9D000EEE5C7EE74B78
+04D30BA757F5951F7D39233897C80F29A057
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+%%EndFont 
+%%BeginFont: CMSLTT10
+%!PS-AdobeFont-1.1: CMSLTT10 1.0
+%%CreationDate: 1991 Aug 20 16:41:43
+% Copyright (C) 1997 American Mathematical Society. All Rights Reserved.
+11 dict begin
+/FontInfo 7 dict dup begin
+/version (1.0) readonly def
+/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def
+/FullName (CMSLTT10) readonly def
+/FamilyName (Computer Modern) readonly def
+/Weight (Medium) readonly def
+/ItalicAngle -9.46 def
+/isFixedPitch true def
+end readonly def
+/FontName /CMSLTT10 def
+/PaintType 0 def
+/FontType 1 def
+/FontMatrix [0.001 0 0 0.001 0 0] readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 0 /.notdef put
+readonly def
+/FontBBox{-20 -233 617 696}readonly def
+/UniqueID 5000800 def
+currentdict end
+currentfile eexec
+D9D66F633B846A97B686A97E45A3D0AA0528A405DF15F03DB1C3DA8B850431F8
+0E5F73DAC973450D1ED0530313057E971FC7E7CA88E61DA6DB9A5CD61F0F76CB
+4DE9105D0627B8DDF51A655098229920CF429CDAFC3F7788C95E7AB30E84F840
+8CED52E98DB4CFF161D2E62B0D28CB8B0AC82E7A8D2C007953BAFB3056D66079
+8064956E257D31C13509FB81A250D9E875C77A4E91CC49E9FB3C0718B2F691D4
+B4A64F351F4DD68133DED7629B0D96E5124584A16FD2AC7A3EB244A934FF059F
+ED7297B0505F3C2994AD66A3CA5D2728B034DE94B64A8AFAF341601BD4DB5858
+C9950A8BB9C598B8960609F48116ABA8C007190AF0ED335EB5BF61BA6871FA5F
+EAB5A26AEB5C7C352EB80799CEB983F19EEFA801093F62086AADD0B80BB6580F
+2CF61B1390FA56DFA1A0B61C58DEF96BA767A8A37EA44730783C600706606C60
+4EE74EA99B7C0F8E2525C8847F3D31907C3C483EFA98F6C416B6B2C343DE6370
+52FAE423008D086A76A1FFB327CC7FD84B1C66B203A4F41582F4599A82F8362D
+38108452EACCC937FFC4F3ABBFE3628DF51367DA6BA3F6826FC6522D6AC5E8EA
+00BAD300FFB6DEDAB93237704202BACD030AA824B1E97C0AFE17FCE8C75F4FA0
+B8A74329A6CF1788C7EB34DA7307411E9AD7ED8D6582884456E06E033B4FFE7D
+CD4DD8B06AD01340CCCFBC382C18CA451E4C886B01D082FF8CC5793F4727C3DF
+B52B4F1A242F31D1EB79D1E39A1D4FD13D6C5E2A42AD4B4D1CC4EE7BA0E5F80F
+802E5AB57EA15F4DE44D82AC408AA86D4BF58EF967FBC6497BBC7F017C0598AE
+32CF865DFFF0FC7FF9E6DCE9B5F2F4C7491AC674F46E8E7660452CE0A77C1EE8
+00DE382ABED85350033F8ECB97398E4E0A75D4877A107F6A909D0C76D14F9A96
+8A6CFDE3FD9D79B6FD82693A9F354BD2ECF30C6D99F7AC522F8D6C93EA214F7B
+3D0ED77F042ACDE9414264C0698E86398562E2C640DEBBA0734AB4C3ACE3907D
+CC79E6B2C6C3C3F9B01526E8CD98237D4A9B403FF8CE3132222FA60C196A19BC
+A2393AE6935C0F8B67FC1D1A12AA74695EFC77DAFA2804E0EBCAE77E4B5CE103
+A0164B7AF6593E58028A8A8A5AF4F5EC5F7376330432566F458AA2661A6AD0AC
+B713047E21FAA80F81C5DE30E1358773FC039A6263DACBF89878169A5B6EE0A5
+BE02F5DE8802912F04D373F16B2E4627D54705ECCDF1A43DE29C3BA73077BCF3
+148E0FE06A4DB51F925170861C43F58168AE85CD478CED8E811821DB638BCFEC
+A9FBD9312B6958E3A3DBCEBBE2CF78B52D963A8CD0013428CF3BB3C8BE792496
+D4C6933B070E5492C789A97B7E3864801AF824C4417BC42BB5E0AB897E139CE9
+86D59B189E90F7B5FAE69B67D5A4C797C7335E3A3CC84C92DC98B165077E48DB
+34F90A551B4CF387D06A08A637635E2C758227956B880C27E6A6048D5A75F22E
+ECCE6D87EFD432983D76E5266950DAA186B89EE41798EC19030105A364B88351
+4CB78AB2AF4BF4E379AC857261D1648BE32B080DC760B01EC9270FFD779E9074
+041A04A3FC130DF2B7B8289BE512DFFE93A62B77529E490C9017808F1B1E9FDC
+21E7CC5BE564C03AE602FECC60B2BFD0CD3ABB895B4AC3E3620DA7260603B6DC
+A918321A58B20114133FEB1AA7845E8ACD966FDA6A0D76232FA4D0E3ACB16725
+070D6A1AD1C12C4FD19CD64037D8A12A750ADE1E589B38C70A1E4CB163E20BA2
+0FFC466D1452D5561C23677E706A588DDE184EEE001A78D5C833DBD34E2F5828
+E89006EAA304848F2D932C5F52E7F546E18CDD77AEE1D3FCC1A1CF5DE08A4FC0
+0AEFB3FBC66C2053B559BCD562A11FB06722BBED6581D9394EB3F36A0CA220E8
+5D09B80CF21A02E44AB75FCECEFE41E2D1A44435936AA7812B4453F4E31AD6D6
+F6160A2EC199F5AA36D64EE247B072BC58E5F9C7D95390E45BC894D7037D861F
+791D339387CDD95EF7283EC409B669E10E949B7C659CA1CC582EEEF4F38CE080
+B2432908B82EAD945FCC67B5D7579A1BB2D5EB3F05F7D32BE415F1BB43566F03
+B9C2B3CB2A3F518F30353F81BB517B90C2278B8ED8BC671370D9ED56D36E00CE
+F2C5B1F7DB19BD3140BB2D7EC7D5E3DDA246B660510F93290F5FBF491F4DFF6B
+F5428976D5A0D7013CAE6528B070667BF297C45716593781324820C6F8B4AA7D
+134BFD082129C91A8E10D8EE59B8C6B55956AF59172F07602EF541470894E46A
+A540FE3595DC7B250636D25A5BAFE9107ADBEEB453D4A09C62638674B8F841F0
+C3CB1E3656C7FE9518E318DD13C37B1E7BB57A10695F92C61800A82D9F365BCA
+4C0D1C810E3196CE403E16F71E310E3E658D7CC5FE8515322456B252C4C5E56D
+807A2E058291BA6EAAD224D49773528EF813556F539CCC84432CA61338C81E99
+88AA24401042751288CB72B695DB05D16AF6FB10924E2D5D9E4397A7107F5EB7
+DBE7DA4EB66C2A9C67A021E6CB0DC31C58A76BC8876379DEA4B6BFED86225990
+99101A9F14EF5B0EF55BD4A54B570D5037C627BE1EB66B20B7FDB7D38A3BCD90
+FB5803DE8B3CB8ACD1D004D26D277469A1359C9B7ECCAF475348DF4B5094F8B7
+9C0B573D161B0C4439694FC196C475B40B051F1E8A64DAC8E7A2C18411E6D7C9
+7E950F1EA4AF91CAFC554A22A840C1873E68DEAB9120D7D9BA8F702F174CBFC9
+04DD6A0567753E97CE5E7795960B4EAFAF76037E54ACC8B9D91A06020E0C0AAD
+DE9D2B3408948697A3D7C8F05D27072F470EDCFEDCC1DC099910622E84C0462B
+31392B98F29CF0FB1923D480A5AF8616EAB11DE1B2497F7BF6AB449AFF5C6BE6
+AD22AD624BF84A8D59187D26F7CEC076451AD78DF28AEEDF41DEBCD54AB2E747
+3303A61D1A86CA6DE7CC12F2C8B97F77FEAB8D275060A746726F20E9E5068FFC
+34CAF97F3F4C41FCCD5F71D333C4EE913986E4157E37A4CCF8B1953E1CB23C52
+36A9BE44AE0349BBA1114920DDA315BD99455E3FF4399A645A7ADB43184BB615
+3A24D5138C09632124085CEB005DE1E00CBFC15C5A041ACBF1B7FEA933E687E6
+77FA85BB40D82E80C96186C9CF295674025F58FA1E43BBADDCE1C60AC4F0E017
+611762CD7CBDAF43659078BF62DDD7D249BC9C5FCDEB06D708AE56DE87490681
+E5191DB36D26A1237A2A150DB03ABCFB0EE1A887ABB92B42FDF25D02A0CD2371
+0A2B5844810A74AEB45836EC19EDD6090B5BC95C258FFDE3E6FD616B942C65F6
+3C35D8123E06D064F4E3CB3B98E38B882836DDBF3752AB1EEF2B731508791E22
+0A67A82EB13058865C6842F61EB43FCB26F0D4AB2B8FC8753B1C6CBD134D8C3B
+030386CF236891C74F756F357BDEC0DE483026CA64FFF573C1AA438FC35C43AC
+C7501D0E052B43545B562D80192C53F8C5261954BF4429C353AF469B67B6BFAD
+37E10BD6430500C6BF756AE206600555417853DD51CEFBEFD0D30A6DB02A008C
+1605208250E41485EE0CDE7F0D710D4B846FFC34D31469FB141A04BE8CE53C27
+0DA139C0418F6A331CE817609E80742AC8BF3A20FF11B514B3237E43F1764987
+E6B4C0C7BAF99915F62DAE4C22F59D3CA0CDC6E754D33DFAF9D34028BC2B0EB9
+8CB5556000D1CE986F60C84D0B6E3F4F55ADF2E417358F1B14B542D8A96EFC53
+C3F3F91DAE932AD3DA9C849BA0791C01EEEA3B967A78329083338D1A0B278D8C
+CEAD5B6F8017451F34CB458091405E1415E9621A577D6F61A76E1FC781385CCC
+0A317E9E794CD972272E988DCF793570C9D4076DAE9BE50EF63A11B7EFD03E3F
+96FEA00E65F069CDD157728A1C98AC0A9377197D4BCC157308D09F149AB70838
+C66313272D00504E80FD0839B3A3F126CFAC3B820991F94C497B27B38D058B4A
+116E628F7B978C1F253872706B40A7E475F3078992B01336DCB013ACE31F5D1F
+2029B4F8A2321A9DEDDD10F2E14A38818637E8C559580529B999E84E07CD0666
+3323D757D75C9DF6A125E3F631D9F6AF5D0C0D2B7C454840282D19BA23764BCF
+5842369A69D847DF013B765C2893F80E68A9D9D59A634CFD9E85B90B6F7F09A7
+5D609AC8C9E8820F2F84B72122B081825C116CFDFC3E5D6078A715F35E06811A
+4BA7E74DA0B2A24CFC50D6DE7FD0DE5764B53B7A7B33368283615F118E709D65
+EDDCFD8816372B5148590E0AC8C17FEA93205F4AEC06DAD89BBCC28B48F6C702
+119BD3C79D038C3F2B80D60DC61E0C60D872614813DD54B63E8B08623507E92F
+962E535C61A2EA234A63C607FABAC496CF03CF226C6C8052753030A0EF740E7F
+466BA4A34B072D58F3E560AFB843C5232997976F3C3D4ABCDCA237E43B05AB73
+5BD65C6559DAC970E7F34D4C170F7E34BEB204CD651370588CE4F2F17A0E7131
+6364A265194B7C313257DD83467B21D84E9EDEF5CEBD45EBFFBD912EFD373FB1
+5409ABB0D4B06FBE08577459A14636A374943DC6D4CEA0AB33DD1154FE79BABE
+7F5D1D92EA7ED7E6D261C3B2569E83B5E9CCB1717B79959876F16FB720ADCA50
+05A33A47F1668E05A7ADF6E52B38D9D5016923EB55ECDAA72A7D9504635C0352
+76F899CB8DFB42BB5DF808A6499E52C230D5FB8E9E3924C2474D417826D282F4
+8B61112FC39B574AF8DCAF572E89720F539528E20DABDD87EE0ADF78664E94AD
+00B3867BEED6C9488036959AAD14CB301B29F19165776DF911A01A6A53414751
+68E4E401C9B3C2B04C9A3066EA0C3553E8F4BFC3F05C73FDF55EAC3213E82E00
+C50DDF2165E51677CD949D27B09DBB30376FA05D2FF3856253F2BAA7907F2EA8
+95FA61D8A042C8179BF834DDE7F67CF386A0D79FBAE5E859887942C6C482785C
+E1FBF3F97C666D82FE260D6A8FBD72CA43D731BD4B4301C48249B1E7C31C1765
+D6F7F9C8B59E47D72D7DDED87351E0F007938BFD73C2324BE5BFBC746AF529EF
+3259DBC9D83B5025185FD75E0D040203398D1739115F6096AB8DC8A0AB539C17
+755D5927081BAD8FAA7AC021FD028A5C823E373795C2A892DC5750C575D60792
+5BAFC4DD83596D8A182293D630985459BAB559314F27EFDB7E186DBE0E7081EC
+A8BBF0F30EE9A8B53DE47C9F2057139937D8B7787BB3107C40002264E6E3C0C3
+E77CF0B68F27E7A0A5CD8AE9A2CBDF98ED4A12E9D1C0DDA8287738A12A607F88
+15B1A64BCFA685C23075619E196EAA4B38517BE37CBC6464369245FAF3D32F90
+A6F8A450B66FA94FC6639D580A1AE8582EB307ABE2396C1093EDBC229BFDD87F
+9C5F49F51DB41D671BF836DB70047938A36CF124A5869255D06F3AC0E3435DFA
+FB5DADA29C76216637F0E5EF0696BE5833CE0AAD72FE1F8BA860277E70278C6B
+32386C1BA505A7BB808BEFE2D75E6D159D58B85F093BDECE344765F388DB0F08
+6D072C265A32944C0A965C10E7BA869881D547A636AF586E1B69F05E9610C411
+EA313749E4584A9C386E789D0BF4EEBEACB2A01CD195A5C6876758C8B2C21E4A
+6C68DF63313CE32C033CEE9327B9FCEBA1CB91D302D1E5068DD6189EA38B2C62
+1CBAFAB46F8BF3034A0255FBB0904B4B1B4FB0CC2DF2D412B28E8BDE816F1329
+55635B7E6F7123DAE06E6608CE8EBD46345279E47EF1853B027CE583D1194EF6
+19599F6ECADE298B64CB9FD733CA7DA837DEABC198E750603A02F61874204942
+4D0991E030498B4083C8F81B8B9BD549F6FD0E4C378880FD9968590C13748553
+7E0A624AD408E0D2DBBF2B0566B337CB51BC414598BDCB19F9D84416DEC43110
+A8A899E01D48648D26D92C2F8B784A23BA3436F6403AE29EBCCB05F8F3172FB4
+0408E457400C113233CF054A2EAB612B7F6BD7A92486E69BD12280C5A7251E20
+E103668F48886BF4761830DB9BBA52325F8C3100B923EDEAD4B3CE7494912E58
+4720BFD6B649D64E3015A42FA5A6284A5A4DC3838B58337C8B35CE7D47C39913
+EA706C468E46DDAAF4A5A749FCB5889FD59F90FFDCDB44E5839EA3E49575799B
+75A13CB1A17923751326D75A2ED1D2CDAC394084314FF697D408A86D08EB8494
+B526EFAB125865D892431DE80C0EF53E6FFBDDE9F130575976037A35C7853DD6
+5126F779A344E96E6381813950594C1233337459217666A989B5F1718A6BE0AC
+19A3B476950B5C9360073C3F2D3D0EEA52CE85743BC348C38AB89B51AA00B899
+217E5008EDE0576E826365DEDDAE40E4A4A69138029D0E59727CCCD3905056DA
+DC8FA349C60224B63516186143F07EFE361921C05D9492A6E24234C026A34BD3
+B64D03901979BADECD929276848B4479B51006B8D1171F7C5D0F8DA027043C86
+D44AF5AE35E350F4B11DCD92DDFFC8326E99E764978F965706AC58DC6C0D2F36
+994CCD448AC3CBCC42268B94E16FA9C1387FDC6F45CDE9F58FFA74F27A4A98FA
+EA3F2A17E1D2012AA78F906B88EE01694736BC4D184EEF4FB8140E5FAF64150D
+E50E8E06F7B9BE125A0FCF24648366CA7A7BBF0E11E6A2DB5825637368DAC5D2
+766A0E15B3BF3CA0838518512DD4697373BB8A95BBB46B39A4659B318EF66F23
+5D068815099898174E95229A7141FD1EAF4D765037BB86FE633EF02BC2A1405A
+A01AA2D5CD89628A1B0CD2C5AF088441E52BA7E1BC6A7F09E3A47F6F3B97AAA4
+A41D3EF15211B21CFFC872A40C1182A4CAD0FA5F08CED4BA7D87E5068535349B
+8056D253E7A3E5494F07DB46B403E02AC3A43BCD45634DBA2C47C14B1A2E4E0D
+22A0092E68F1E320BD63941F4BE8B912B62C2B8D681B29288330F4CAEA024FF4
+3A1809AAA6263656C45146D5A01E2E13A5AFFAF2607891988FB0170595E23A3F
+B9714047F54033BA60BE76EDCDBA5C595795440712E64F106452B470D5A9CFC8
+A2C604BB415890FF7AA3126C3CE1D30C3E58ECE4AA04307DAB193702DDAD0686
+788A8B9F8F6F0D2119DB3D4E339C052B314202834F478B8914FB9302037FD84B
+B25674DA46B5C9D2A4885BEA519831D2DC406C3C3753251F2BBAC75E1170750F
+C54426090DB373AD6EA90AD73C6E80CBBD01F0C56F98C09FF2A162930651AB45
+E8A4CBFC8B1BC29522AF269C5E182130F5DF6822270359151948EFB4C33A2687
+5954407A1EE96F245ADF9E93F972ABC5E1B1457A030F047CFCEC02A3D8228011
+ECC2CB0E0C7AE4B01AA342C6596BD0F85A45E7BE4455D41FC15539D07F710636
+537A8BE0EC50B6A1FDD90B599A08B7824FC65559E3B6FED676A41542BD58A09A
+42388D7661D3422CB86F13CF6239BB56EA0B1DAA5542ADD316EE76B01F98E0EF
+29A828461020DF0FF643E546EE04CB0032C06AAE533C20720F888295ACFD52D0
+5AD152CD7D0922F911F613354344622BF800B0FA2AF3324E898B39F953818950
+B7587AFDF91F16EF57E46E46F07E14E89326737DFD1CDC0E11E9DB2FEBCD147B
+8257B4C2D23DF86AC129BA1655FE6AC212F2080BE6FBC1BFF9BEA8D8E121040E
+2AF9500B926072BA9BB474A8CB55E727A9FFFB2C835CB3E7981B904E9EFAF4DE
+9F8CA5D338E31FD2535E5CA9A59002123CF08C621D185C102077AB80AF6244E6
+49D22C2ADD353C3F906DE952CEE101A9D08F1D9853EF8EE282506A53FDE5F64F
+2FF433CA6E60819B7945A4DBF21534E35039853600CEF1A9FB53B99F074F909B
+5164499BB87652A71C6A55FABB3238C1C04AC3D27393D3214D84A6A37B714E7F
+B28256E05FEEA5F7E86CA04CE4BCC5479F40FD797CB5BB6C0C817808C0834EEC
+63F1D78F0FE712D1EC6F001B395D21656834D6220D77393DE89CDEDDABCF3D59
+7B1703B8884ED56CECE93AC713239D5D814093C2DF4025884D36535994CE1DEC
+CB64B51AF63B434F7A18A6FB644F49089EB3161B46F6EEC430B73DE10EAB0ED2
+70736D0B6F3DCA3B96EB036C21E0E9441CC7B4BAD4D1B3B34027D0475C482A4C
+6AD17670E16B1D87078AB94D2C04F99CBB4C88E5F29327884BD673BDD841E8EE
+B3A2E544B7882F589F9912D86828E0C39519932FDE205EDA6CC03904B253BC90
+2AD98C29F109D815BE900AB44C7BA1D6349313E03F9A9549FDB06A6C65DD2798
+EA07440AACD59AE91FBF7EF10E82EF3FB80E10CC515A992811CA5BCAE7A80EDE
+30BDE900F0F49D8F47911274AC3FD41A5D83092FCC98B057BEF66030F9BF5773
+664AA821536B3D033C144CA1DB7CD7EE37965958093253061277A197449A80E8
+AED1C47D8BB3BF0560E24432F6A9FFCA3C468AB309C54F920C30FECF049BC75C
+EA7415390EC30468A96C615F7529B5E2D96BA2313D48033C73162275AE4F3831
+8EB29A2FF205037EA4B6DDD1AE017ABF2DA3E4C6B8215FA1052120D7F2DA8BBF
+81928CD22F10AC0B1DE254CF5443DE81F68EE6C19995ABB4F8716998C9AF78EF
+DC1BE13139C6C9C595CC526974B1E0E4F6B4D552C6FB637D91D850E104939287
+888ADD077B7C05818AF7C70015292F2E968D4214BC5DD87767EDA36249E8C4CF
+145E0C8CA3DAE43DB6EDA10ACCDE03608EBB63C2B39D6DC07DE2E5879A052DD7
+84E826A3E22E0B1155272196F4E7CC825259DF70FF0599D91599A8D61DCC4F02
+BA6A6BF9228EA07B8828CE3D5EE43340CA2497B058552A3ACCF499DFF3A8B9B9
+0448CBE07E0BB7389B3ABB578566E781A89AE8A2908823D2B5127EA0282E0E2B
+E9BFDFFC7D529613F3E0D063EFE3D71F71A099F2AAD50BF776A2F0E544E13B7D
+82E0BE0296556A3F76BA81751352E2D82DD0CCB4F577D7838E34B452B5C79B58
+A09592C169459BEBA283D98756960CE37A239769BCA22660A20418B1A298B0D8
+7755FE810321506D35FCE70E901966FE77816823E4D4B9C6503C90D6F31C6379
+2A4852AA61DC63F3593D66508A9EFB8F1432448F2FD45647271731E2886C4C74
+9EF477B9AE5363897243C931D34E3CE5BF7902F27B93FA5CCFF5D853A28A08BA
+B17E3DDAA648F373F4EDDAE1DF25C80BEA3989C2A8D71A4B4B4E8A3C55904E56
+83C98EBB5EC3015647E59A24457B390E3311AC62A67DEBD25C7809F8B11DDF44
+77C7AC9A7080A2F138B214FFDD090D187DB668ADCDA7C2A5ADE94A4692C596B0
+42F4E7A90567544BAF65B302BBFDB55B442B624CF128876330CC2FB394E51EFB
+8B0C596BDD60C03F16A6CDD89434110D7ED758F1519F1E8CF0989AB652939204
+17F40D3D7016399612610B56788C6D9257A54C9BF8C7943A6DB9B6990C0BF988
+FF38C97892288C509B71BB8DD20A69B8EB0BDBE05F8450F657B7D2173670E42C
+AD48F174E44AD17C66B96DFBB9871AFC5E
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+%%EndFont 
+%%BeginFont: CMTT9
+%!PS-AdobeFont-1.1: CMTT9 1.0
+%%CreationDate: 1991 Aug 20 16:46:24
+% Copyright (C) 1997 American Mathematical Society. All Rights Reserved.
+11 dict begin
+/FontInfo 7 dict dup begin
+/version (1.0) readonly def
+/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def
+/FullName (CMTT9) readonly def
+/FamilyName (Computer Modern) readonly def
+/Weight (Medium) readonly def
+/ItalicAngle 0 def
+/isFixedPitch true def
+end readonly def
+/FontName /CMTT9 def
+/PaintType 0 def
+/FontType 1 def
+/FontMatrix [0.001 0 0 0.001 0 0] readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 0 /.notdef put
+readonly def
+/FontBBox{-6 -233 542 698}readonly def
+/UniqueID 5000831 def
+currentdict end
+currentfile eexec
+D9D66F633B846A97B686A97E45A3D0AA052A014267B7904EB3C0D3BD0B83D891
+016CA6CA4B712ADEB258FAAB9A130EE605E61F77FC1B738ABC7C51CD46EF8171
+9098D5FEE67660E69A7AB91B58F29A4D79E57022F783EB0FBBB6D4F4EC35014F
+D2DECBA99459A4C59DF0C6EBA150284454E707DC2100C15B76B4C19B84363758
+469A6C558785B226332152109871A9883487DD7710949204DDCF837E6A8708B8
+2BDBF16FBC7512FAA308A093FE5F00F963068B8232429ED8B7CF6A3D879A2D1E
+2931CE5F5D18C658602059F07BE66E6EFC9239D7AB2FB8A4CBD41675B8ECF279
+650C29E53B14AC0E392A664848C1844B1CECBB2D5CFB72D0916B675C9A9A1E35
+F12696A6F628473C604A95376468E06E295AD6F76CEB939D94113532050B9D5A
+D2F41A9EFB9424D986612313B89EFE9C8A71313340B248F6853B1EDBF02B7F9E
+F447220FE131D7D54CFB8AA1281DBAEA73E665BACB1F164552CC0CEDB63BD4B1
+4A9AE8AC6FA02242DBE8DA46B64B6BFC11762F0784F216FC8B9120D688D1705A
+438B14F5E5DEAF2A98408B3B64620DE3732A4DAE6D08D5D97E34C75DAE19EABD
+BA0796165C1151BCBFB1DF8D29A63A8300DBDB9E3323CB82D0337598B83F4F2B
+A97CF5196D4D1CEC1EDB8966E548C0D9C194C932319610FB43EA1B86322FE641
+AB48770FF13BD475A7267E142388563D1A400419C585B22A9886074687BEDF74
+D905BE8EE440BA2ABF28EAB673399B7F129B9729DD5564C681954621903B84BB
+CAF89AC5ADB2932472DF29ADA2BDBDB4D05F65F28F5F4C529613D61858E0074A
+082A852710A62A147C966F2B85B51B0BE85F11D2057C66FDD61F6C5755367980
+9F4DE680601D4DA41B46F8D2148450000413C27AA39B586B74B977B25F0FD3C0
+4BA1EBFAFDBEC531EA1210365091671CE3C86A6D4BC591C37DCC02570042575A
+9D24252D6E01A8603753934D7EA5CAC1BE4E5AD2BA047DE8F3983B23A8A1511F
+B08D373B69E5076CE4300137B8805EBCC0AAB89BBB312A77835795E3C069322D
+42C893A30AD739E2BDD299679B158F7493764F2321E3965141B5ED1C6F4765ED
+F46D391A646B30C90002B1C461AEE79E5F094CACCA656CEA3DB921CC5205F328
+A2C69F817061D6C60B121EEE844CA5008F23DF072BF0D7F18704E61B72CF4BB3
+FFAA5C94360FBCB0C8A3E787A0764DD210BEB9C0700BF67F9E4547D3EFE2E963
+DB3361C6D12EEA4AB0B264E58F58AD2989F9E61809E05BAABF95DB92856B00C3
+A42F4FEEF820B494CF7DBD0478B0C7558A44A07760D2D720CF981D2310E0CAE4
+A4694A6C61BA763C2FA97C9014810E12947B67505849A2ADCF58FE617FEDC5B2
+0409F8A623AEF4FAA974B36323087ADBB35E2FC3DC103C122A89F4397C9D4910
+1447EC4264D16A1D3B2EEDD45601CDAE58118609C4031754CE96BCC7ECAE551D
+A67B1945A6169B2D7EB8027D7AFD32724CCF5A9BD588501CAE4B4B06D66DCCDD
+09F1C8E2DC6989C5AF32754AFB4DBCE1BB3E6973F0D609C07764840FF511C703
+DEA92E109270FE3FF2470B46E3C7FA05D38B35FD41A8D9A406B2135EB770BC5F
+D3AE856816EDD07DF8CD38A95851EFE7C4D7DE4C6E7C3127B72BACC21508001E
+F01E65262E70CDB7D3F106B92421A85AC2B4D02F17C85382A5C0242A86C462C8
+8FE99A7773916237432B06173A14390F3C1277B32B01D1417F8C40729721C440
+FCF27DDC902ECB3E6EAC143BC090FDCFE2D09338E796BB47084BD1F9ECE2A03F
+9458F758AACB5DC6AB233A94046C3485CD959DB2FB3C735DD859756DE42CBFB9
+4ADDB636423227DC9E327A8BC04E18A4E213F97A21439B51D6F7AD53E00E3360
+9B684F7ABACDEDA3D9E13FA7A3CA427C9FF355BEECC32185CDB3FD66CA655476
+C5AEC04807CEE384B7760B32FC462B63F3903CCB61D3405A838B953D818207FA
+DFD28E2676F0E81DDE81B090544EFCE14C9E910F0B75FE4A2DD7DEC0852F3483
+7FA5E3B9150AE4E923A8BCC4C14728FABEB25F4FF40941D890BE324A253C94F3
+2362E13EA623D1B0A557CA60085F643EB540F5D5538252A2BB2EBDE74D69C5DE
+30413980FED6E36E5FD496CAA48A2EB59559C2B67A5031B1359F976C3A93C581
+323A87C330AB5D57D921451AFC3D9B6DEFF626362F693D35FCC01FCDB08D8362
+4400494D5A3E3BDD9CC92CB10B87B7A5B653CE676D5A7C33787EB4918AFB865E
+0B60907E80F0CF61831922B8D60DFC8C54546DB77BB47260DEBD7180AE0094B4
+C9676DB9B615A221B78ECFD153E82A95B3862372E52A002B3B87883A976DD790
+DE770F0187BDAFDDEA94E1F09304B9610B046368FD282A565C01841539BBAB6E
+0CAA657336E109E6D0E9EBAC95688B451BFC5CF96EA249E161835C7C0B448BDA
+1F56601E64DE2850E584D9ED4405701CA6A831161F3729D9AA40F20F1E46AD71
+78C1C062FC247423763F2FBFE168B3BE3403068A8DF45174476E1BE943D0E0E4
+6346F28667ABEE6E7C085AE26CF9920421A1119478DD0AA168D5DB5EEFA8D8AB
+0DB297C9C3F662E80B1BD052B3A14EDFBEAD038BBDFB46D444E9B437A1B20DC6
+478CD5EF4AAAB3C6E18C79DDACF6FC5B48A7CC07B65BCF1E7A4D8FF2766D20C7
+D11B24BDC0BFD004A445ABDD0873F5F70EED988B95C13175A09D7D264C5A118C
+799C5524D3C3A21984DB6A6593CB362889DE14832FDEB8DFEE26417AFCD51BAE
+0646AE739B89EB61A2C3D0957D7F9F3B029D4C07C9574116258EAE7FD7AF8A22
+AE2D8BD599EEC80454E4D76B20D702202CC1A6569536FFB7ABD239A8D704F358
+B6A15BE9C151C253F3CCC0C275CD1C65BB8E3C7C9AF78137DF3E929B52D2044C
+5CB99AC03B97B2DDC7B279B8FFB90EA8DAF1E0FDF693173D68F6C845CFD7D3CF
+4F6195206FA48B4DDCA81582E3AFE75DB2D5F61D4532F76439E475A322814E8E
+73124685A72D2533E2F0B02A8C3FCC7B08E5F253D359518ABFC41C101FACE56F
+235BA6264C1B93AECC3501E604653D531A5BB2FD7110CCAF1368103FBE7A0E2A
+CE8284CC24A97E1F298ACCC818C1D57F44326B1B9D1017C5BA5DB2A4DCB6C6CC
+E5070F89288B3238BCF1B22AB8D0D022F31F01B265CE4BACEE26B4BF194E2599
+EE4813F6EC743D99B505C48A3B56847D119E3320ADCA946EE2790A75FCC322CE
+3C10E8E811F6F415BD9CA530B6BF20362A8F1B03E10A777AE13C4BC21992109B
+E3AC5E1F6FE18C45541D659ACB30E4FB7A7CE95904B13E34F8B0870E0C46B36D
+D21F8EF260B5F42631AF6F16C84E4644DFD43214EAB4B5B3E49E42C7FF0BB76D
+D960A98A33E19F39229C388548BF8B29D5E7FFC8C825E990B05F5E73DAF598B4
+A6F432E2E561BF5A70343C281B94769147F1F6396572CAC91A966D4274036969
+5A798D31F3DC902D560F69DE5875FBF23F7171599082703470B136DF18542B2F
+17FC7E05A0CED7A639BEA8CCEF18C01984296F6223A636D0A7AD31582DBFCB9E
+8D7928ACD8909D5C5A6F4435440E9793FA44B8558180DC0FAC1E614AE57A43A0
+631B67111A83EE2D371C7A27FCEB6EB240437AE367EA86FB51809BDDA01C48AD
+0069523E1402C621BDD5ADEDF65BCD9C81C692D0CE84DF447CC13321B0BAD067
+F647819FD5C54249F1236F65FEA5ABE6E6EA95223C86DE8637F15838D0476E44
+403B1C6BE53C695DABC1E53FD9975AE1F182072E8E9416FBD6671B72078FC9FE
+CC873A9A5A1D6C6A58555198DB3F152458E0323884462E298BC2082C9B9A19F4
+D83471FC5FE12370DFA92C4CB302E0021E6C923AF1223F78BB8AC15B7E0B4865
+4A4308A91DDDA35B5DB146A639A8DC7993BC4FD4628595E171CCC9E86D5D9C9F
+F262ECFF915D9EBBA8DC7B37AC7EA84DF32D20A5DDC38DB8A404FC46125DA0D8
+DF381968E20E4D83F82A2085295F54578935B7406D89537AA2D49AF226F5E56C
+B68A4F3C8E8EED257D9D5382EBF22E804D30F3E432E35003C2F6DE3B38005A25
+C16D3EE8FE9E3D0D30246BC4A290CB412118012385847B8B9EAA0B25FAB1DEC5
+032F10432905831FD2A6C675BBDAE898013DA7ADB3424F53463BA9152900478E
+4D30C60DAF7261FFE84018CB6E46EC1154F5366A01C6B23111F3B0C92748C465
+A1E4A87F178D08CCE973CE992358CD3C370F08E41866D256245D9892F8C4206A
+11776DD7962EF1CA9F23375AF9E145DF48A8E946A131EEBBE01A09C343A42E68
+CD699FB2D1FF131A53CD39098CE4745D21542C5284150599AFD586664F489B7B
+FD09DD26AB4ECD2A586A6EE003775825B03EB48535BF9F269CDDE3176257BE33
+A4D3DD9BE7D21C172983DEB9D49D3F2175FF4CF022D6AB7BE74A0FFB786C99CC
+4B156ECA89E9BDD49681BEDBA7B709E615AFF02A94B52B9BD0ABFAD881F452E3
+14CF98CA52CBFEE585B7C5950EF4F4BA4829D05506A6C190A29366A9CA0F786D
+ECD0C1D9681C84CAC80A5858F07B1F5BEB89187C5C056167313F4273F3A6AF47
+3475D6F9E3AF5C6A48FB4830513C53FFEBB0DC53F16567278CA466E3375D8F9B
+D33B64E709AF02290E0B629E007D4DEEAEB14EA838CD46B42F110A63E948215C
+EF76761CA3F76B6515BE32482064FC461A4E6099BDE1A9821C017A9807F44427
+1AE4E24E2B2D8DF884103D2E40463AD81522AA0D202AC683621815EAEA993CDF
+5F3C4471A19F146CD16EE86E7B5248105CF1719AA4D7D496441D5B1DE1203F42
+E4D1BEEB9663F08AD606C74916BCE777102390D97A5A680B2DC89D326C29E2C3
+3BA742CDF846320658EE4350D8956732DC921B59FF8E7CC4C1E2546D11942E7E
+1CA20D18E0644B892FD4928A77849EB2A45F4D57A741B419291B01105091876F
+EFA08FBE2CEDA2E383AEE05AEF4F63637B4F668FFDBF8CB49B2914C80175F990
+FA464D5056AF8DC50BE186ADAB1B6244205FFC6288312C1DC9D275F44056FA54
+5D63CA10F36B9DA225E5E5EC5BB4C56C8AC48BC535BF44649775F39DC70551D5
+D62543FC74567B00AF661ABED55F60DF4601F7E40BB9AC934F3BC5F46BEC1D05
+0E60A9333721D6766E648E946F2DDF2C84C0769A0FB2CD2AD139C660FA5D3309
+4B8A7F8C89DC470BDB2FD061D5EBA36892F8ABCBF942F0DA98A1214123A33FB1
+826D9BCC7D5B2D72C13F368ECBE4BAE5AEB777DF1E3AD4838E4FA4FEC98C53A4
+36759792EB80CE02A481D2E78548D846A73DA829639315335D942D1824A0C14E
+A3F341C7E154C0EB722EA580CF73A48344E426CDD9C8AB51C816ECCD838AF19B
+3FE18ECC4E4AE623E2D6365375A2B4CA0C1924C329C373F9EE9154B8957E973D
+C8ED76D593CEB747D14DDFD9848E3631E7DF58B63F5647CB784BA4E4D7031EF2
+ED633AF706D80D40CEFFA5F6837616DDED368C028AED8B82F1709AEBF49F83C9
+F17C6228C01450286FB2D09CDBD882D72CC6641CB3DFD423086474372B578F1A
+1A5D2A1D73EA4961AB0CA2390103EEF0F9182E68960883F7A42F21D2EAC47A83
+C23A7D1AFB395C6AAEF8861941B88E0ACA7708B45FFA73BEFAC20C4C996CE158
+F821B92317D7EB6F29BC5CD86B0C09E652333A8C61C06F8EC5E60150E674DE7B
+CBE2C53B383AD206392643666EA00B75692C021F8CCB06EE0F8E1EFE89406475
+B37D1918F9498CE5EA508350C16445CF4847AD0F7EAD1631AAFE4732D97340B1
+5BB068422F616235D83567E8B1672FF6BD5FBC937EB1B39F7EA0F75B58CF8650
+9077BEE8727B29BC997F848EF21FECD0F73976EE4AAE581FEB3A3F5039468734
+D3FD210B21D9395C5AC963CC3BF48F35077B0EA231A919793A83B7BF9E13C872
+D58E1D7F69FA55D59A62E599B691ADFD157D8FB98687354EE065F80AEE53F663
+0B36E1FFD265F531DA875C8B442317BCAD850C509E4B33BCCD6B0D8B36716AF6
+1098440B0083321FB21617FFECD31252B1A842E80D7A6A13B00D140AB62C1FAB
+9BC468B1E1C7A8E8D33A0A51514E8694D9CD40EF862840ADD47817F6E5A420CC
+7A62E2240372BF0DB84BBDCBEEDEFBC5F13492CF658C32EB8A245736B5BE2AF5
+64EC905BE5E43DFD2520BCF4DF21E78A502F9F295102135E01336ECE3748F34F
+D62D3FA75A736F9075CBB5EFFAF8A4D96DE93DB5D22CD50CA13EBB8B109413A4
+7D5B058CD0F1E0AFCFA7664E654AFD23A9F5B589A39A55AA589FBB269D6C7094
+66A76A0617ABC3EE2155D97FC21E008F4FA1FF93B56545DEA5EB462F18B4FA3A
+46862000BD435D3711E3D0D1592A73658CA8BB639F292ABDD5A38482CC2C0E63
+968274E3240E5DD94BD3C4B2547887ADF772EB3E538ACE571C4EA19264C8F603
+44229163C8FC78469A796693A4BCF7AC1A1597ADBFBC3EE9B73590B4AB18B78B
+D733D42F645F35C55C8A7EEDBC41C86A589A6FED3FF61DA21AE2988C88C82E8D
+AFF1D9114A5275F1CAAC537F2B09591AE0EE05789A2258074E78B972E0272D38
+8E63DE54E11C6CB7CA0451989F4B39E383497EA4858CB2250F274A4AB89FCB63
+E20919132A6F8C3385C82D140130CAFE944E1E6E7FC08890C516B5321860455E
+06B0AF4AC14B67EC95C07AF8607E8636A55B25ABF7F9330A190B120BABDAC4C9
+FA44887F6A09540950259D08ECA47FE6BC792313EF78277117ED0AC4D9F29314
+E9C39B20514466DD88525776CFD1DB11C6B8EDC8FDB46BCDD7AC4F3DC3BC4246
+D694B47BB61477DFABC6CE6F5A61DC68C45F726E2D17C650923CF862B4B6244E
+C36E5D17EC6AE3478A9BEC5DFC98E850D243FD0D44CA73027B21F775DB379834
+16D5AE9C43B87BFF505A0C3FD8FF7231ECA743CA3B463E16B1A18C9C5BE63B72
+9ABF9F5E28826846D8C0539162AEB4E04AEC7B22B8BF7F4A81C82BF0BC74E983
+76664B6E8F4066B8FD8D96FC4901520CD1DD892E44D79DE780E96D38E413EC77
+2EA5D2227554F78CFDCC64CF1B6D907F93EF16302D14B916C214B5176B72059E
+0AD09E12E334BB8B4174B93F2799D5A2A33B1B202CA9D4F6F2B3C49A40148B5C
+4E054C063B91023C509622543D9AE85FBC9C18168C698342113D3F5D920D2512
+890E80CAD0144C5C1B7E9866CE577EAB4274563845F9C16376E6282802CFD6FB
+8D128FCD5B81BAFC426CA8A4AB7B1ED86244817E9E66E76957A6E7105830779D
+8EF9A574B0A1160E82FF22FD6DE32C9521195E2673F22394FC10A0A41B6CF38B
+83F761C37F8A5FB7972D601A8D2ADD31A36684BE1FD41A663AEB67FA7D55F7E1
+0C11138DAEF5D5DE5B561E7E68494795A4377312217F0BD449FDAEBE87F5FF19
+C182E77051F0BFA855D9486A8A46E3A6322D431EA26D09DD97B64304A840A108
+75ED6E2DB1D04C4FE95410F45D4B6766D693F628AC6A19781215F95FCDB64DD5
+940A2EB7F3BE84DB52D3FB5C6EC0DA30B4DDDAAB73DF3BD3AB6577B3D21A9A49
+5B35DC87C9B6F9EA1C6C2DBE16614007C497A4A8D4293D0671BBBAFAA839324B
+40A88E025CB18FCD88B251393B7876674E5E135C9CBC465AA6F44E4328DDD673
+E89803C096F8D813488C2452BCB4693D421D264EE7ABA533EDD174F5945FED02
+05EA31AECC3AD98D9D35ACA0FD81B2799B838F6620FD591923755616F798A7F3
+250948FF574078E3D88D35C86E9372B828FA0FCE47ABA6A9732CF18BB6DD98B6
+39AA9E419E3A48A1F320AA6D74E525100009F6CAEA90883F7D512A11BF2AB33D
+E31E7CF1A0D4517C97EC7F4CF9311F838C66D2437FB18E03BE19B4389D44CEDA
+6C97E750C2946BD80E8F3ADDF19DA48CC2256D31146DFB59FF4B8F884188F97F
+D1A34D31294203E9B477330CAAF6FFA6FE4A2590915584E6E45E8EF755723F7C
+11A295C9083AB20C939025C458343CE0A8E4E7FFB215EBBEFF97C71534218106
+77751F5F614129CE3AFABB866B628A6CD1DA21F395488F21EEC48D83CC2CE36B
+19374DCD1AC2FEA1844464D92529E151BE34A76AF6B50A1980964F5054E73DA3
+E22A42E1A3E1D7B501BEFBAA3B7491116E59C48C3AFB430EDF3CD9C06F734685
+9CD5188059D00823971FD6C273F8654BF353E70D56887E069CC3725062D44ABD
+30AC225AD125A3E02C6CAE530B9066F5ECC76249A234EA522CF891FF78BDF1C2
+B6C8A66664EF80D4DDAC6045FB44C89C0E16446621ED80F1B53B63286B4AAB67
+F8109A8A09195FCA632DC938A867670459D01DB7C1ED84D1EB8688A9077C1DC8
+1D92BDDCF3FBBD5DF12DE34665C640E7E2B7B2DA898A5D3CA1E98ED040E5F17A
+4F992482CB4EB2C173385EEA9613F047DCF6034DC3C6C65D5AE82E9AA428E4F9
+3BBAA247231880588D76ABAEF8895D9456B7BC8F5B03B2D37E9DE65A8D5A3AD7
+B19B0B964524378BB946DC1113882806E12FC96D247A6F776C1C836F349FD4D6
+29AFCEAA590BC6910866D509204480BDD0818E463E3CFD53251143956E9D4DD3
+FB361665C331E5FBABC6876CC4197994A19C598A66A1BC41669B7F6187FFB106
+4B4088A7E423A8A70DC81A148542434B72A56019E418660F569CEBED93C3C5E3
+B6D788656E48F02B27437894A9BEC382C43AE7B9ACCA33DA0E4358F923D3E863
+ECD6FC09E9BAD5BBFE3FEB3A64917DE451464A7AE5C6FB0A108744843F331548
+6E4D33725779D194D3905C669C6CE70801500F023031A085588ED8A4EA5AC9C9
+289C9C7F22790BAD61DF885B4B132A5BB4D820975791A4BA3BDDD439B897450B
+62ED045EB02CE7EAEC5EFCDC31A4DB48EA6ED6516AED0A23AB27847FB4FBE15B
+946060424CB44D9237BD397ECC0C3A4F8FC1EAE9052DC0DEF632FE56FFDEBC19
+9499627D77D093FE7C18590C33B27A26AEA5838861C8AD534EA82966EAA01CAA
+5DB88CCA7DB8325BD9D234971804A05B74CA8818E862EBD057DBFEAF90296CC3
+4876DD8D3576668C734A0C04A38EBDE4A8F5DE04123045F3949657CB5AE8043A
+FE2E7A46431F4F08F13118B70B70D36A929D2E108C4E7B584F47FBAB50485F01
+C716D06C086C5182709AA8E984DC2DC7B7032F716F562643F6448984117DCBE4
+19BE51DC5078C1E2BBC43EFBFA56C1EAD71DDC895C756B874F95B4E6D82BE3F1
+4AC455A739CD2FC0F11A592F9F7419E20C6B58AFE6D16FBB95194C9D915E23B6
+D1E37C6E717EB9C7E44ED92AC69DAA582A35DA8F1CC266213A610619638053E7
+1CDDF6E8205BA5EA84245B45AACFCA8DA38CA355F78F61C220E9821ADC9EE003
+E757FC78B10C7ED702D78917733C749248CACC1B60420701BE065FFB4F5110E0
+50C2E3583B88B1C41EAE3319BD6E9EA41E035310EBCD536259E39689688EA149
+1A4A5A65E18D475D39B1BADD3B7289E4EB8DDBF082ECFAC24CB27B385973D3D8
+6F80905DEA69CC08D01DB08E29AFDB91DA9356EDBA69362A5765906706503E52
+1F030DEE34E260AA0BE5D6A4B18BB69908B1D456717ED65D29A10B7E36287422
+97D646F9A4B13BDFA496092CE208D85317D9E285D5761DF1AA9CDE93E14FEE34
+F52294FC32A68F4FF57A50FE285AE15BEAF0D8275ECC0DB00FBC705B4E6D8F13
+7192ABADF1E56CB5B4B5DCB0E82DA1F5289C968B278817BFFF257A5A1D0D2ACF
+71348D5647E23C3FC09759B15A84251DDC5E622F6D6D38BFCB8806441122C042
+DC532ED271873D092FC984594B2F13C7D2453C11577E7F0B668C74D02B48E80B
+71711478BBC2B36A93D6F1B9E9537F791864A693270657FFD2AB8DFCCE310F44
+993CAA10EA460046B552B1F934380F52B156C360788CA777E16980421391BC6E
+6807109FB94B60B02AB191ECF4D0C00086CCE6FD1066FEDA24DCBA42EA0F7324
+35077035C65BDC176CDCE2A3A5E0FC1AA45C98E9AED10E55EA9C4425FCDD68BB
+26382544C02F19DE0DE10B70A36D7EF259EC5830FD4285B8453C96E4EDDFE93E
+89DE0CA5F74398BD15A4B4E1F36940C8653DF7EA9CA04289BFE238CE13CDC3F0
+C708E1362A554F34DA43F02DBE134D2A4ED655353B36EA9382C446BFAC3966DF
+DF3EFA9C83EA4CD8009FF847CF6BB9CD484699230ABE8C2E9FF0CC0E28C651EE
+D4B8309215A896DDEF82858849B4BAF4511B2B0868E66DEDD013A5B6428A3BC0
+852E125699CEBCAEE540D33ECA9FE54A2E45A6DA8B3D088A93246E10F6726B36
+39F5DC7A5818C8D47CE987926EFFE187A58829AF8BF2A1873D3EC05A4C9EA19D
+ADE89CF0140B4EFB141F4F793333D78CCCEA192F187ACE04E66F4359CC428A12
+294DB70D66015DD7BA3AA1E239B428DFA3703129FE3072C15EA05F0D81886B8A
+650DE67F53AA71FA37DE5A2E8065B83BAD90B748DCD23D5C8E64429506D06486
+A1326D0D38F2E7709E9D6242D3402C492FBD6F3FD5F987855E4252C81578FF25
+09AB6D307C2EF28BF3CD2CB894E436F0F48C78FF4996AF5CF1796DAAB45ACA44
+6401F15583FD1364D93E16086BE6F5F028012BF40AFD272834A6B6B817C21A11
+D945AA63B5F1753A1E915BF2737A898F8675039980C0FEB6F49F275BAEE20F0E
+50C6D0A277A812FC9EFC3D2B8D95ABA8ACC9EED925425C1294999F903AB97C41
+B8D24B3759C48E10EADFB6A10B094C6C75BA7EC8F5A419F655571469C7C35F16
+E305C4ABD27D224F8DE8EE9C29BA4DDF3570425B3C4E9C15A5597F4D90577ABC
+0657FCECD379A87B2B5446BF37F5066FCC6445641205CAF2F118185035EBD7F3
+44790473C963AA8A09AE4E6057A9A0437EC413AA7ADD36BDC90588D45FE5A546
+8E01FCBA3341C1B043BBB927E46BD88915465C0A58B4EE7C89FA3681B4B4A5C0
+C846B87A1E622A45526AD3F0619AD099A75489061CCD9EC64D7F956BCBFF7E39
+4DACFC71137A7CC0A09B7BBB27D005C43AD315A5568B242BF14DD548CA242BFF
+1FE379CC277163CA222A7523A98D72F15C1B9A876AEE07761C4C595F1B9C750A
+47A837045A1CFEB63A19347CDFD03F7CFA6B4BAA5D6AEBEBF83A92F8498C1719
+C8A15C07DBDF3792E4B70B0DB2A36ACEC01201213487273FFC821D1CB1958DB9
+B5DA188355A37A06700D1B9662E80EF3EF6471983F07A84800F42AA43B51B92D
+887E907978A16BB76923B1B0F3108A2410DE6F7EFD0F34A1AC2ACEE7965BD2AA
+87890BFAB6634360C9D0FD27FF6A2FE990E9BBBD34B4B1465E9EA21A29F3AEA3
+DEC607A12017D1BC2B59AB8139C6F3C922594986EE82579BB7B74390A5524311
+E63ECFB0AEDBC8438CFA1795B3FEFEA2B061D796986F569A88B1D30B27370A91
+E616828F3C2002D8F26931484AD2FF04CE81637024140B5E64675D0EC1B6EB09
+0236AF5A255CC3DD41A6426CC71327C591E2E9C9EE3464A6078F4DA9ED524DBA
+52F5544DEA75B09CB97FB4154140AD8AF5CD1BC131EF53EB202F7721E4ADC979
+7F24B9D83301D2434130966A200A15E9F2E337CBF6C170110B9E1B0FAAC3A909
+52FEE43343283A3EFD692FE99B23F088662A65ECF3E38D67B17260857D66DC32
+24A26A3028BF295E9EEBE65EE2058D2EE46D16C39D659513B5ABE0B00AA2570D
+8C29C093D39397E43AC6D86F490B5526923251E907A30D33BD6F4649ECE13403
+AE9BC0FCFA0B48A661C2C9F5E269FD8872D41D7F840E1E1D29FD4C66B0FB9AA9
+7E71BF685BFFEFBA73B13CD84B89AA9EA3D8D7B9BBF7584CC128F87E26685C2D
+0206A5ADFEE43330A9286606F91150EB6443AC9366AF006B18062651E79486DA
+58E95BF80D1B0525290B38F35C7ED3B7E994814179FB694F527685FD5BBD04F7
+E7E149A353BA45E747E41A92FA077B1F370467F58BB16715C3A78719AF2F8596
+2120CACCA3A7478CCFC04AA738DBFF309A8F8F683834C509B8F0445E1112AD86
+654CABEB535237DB2BC801EBB214B0429D7B012539ACE55E4ECB9E5F97B5F756
+9CF667DB28FCDC6172CA2381F3B9D0C3A2B816CC176B2F0CCBBC63C9452CF3A9
+D99C6BC979A31DB822A10817A26FAC0A8E1D71A5A9245D699CFAB24FA4CDCC7E
+1FB0549529443CD80D6A4E3C9713E6E3E96D3A5120811486119D527AAFBF80C5
+E60D57FBA90B4CA86A0337B6CA89E143AAF1E0E2B35C58C663CEB81B526C6753
+A343E79460CC93E4BF709C9DC8D07FD218F6D902B11E79DBD80B2A0DC92F311B
+23491952C02EA4A4688B182C8ED18D73FC50CB51BF5F4E13668986D5A4F94361
+8643E4498831182B650428F35ECB122CA005BC25AC37DF254E1E8F4AEE756521
+CCF1A92CD8B3BEE176F72013A30CCF4B7B7A8CCAF662E14DC0E62C2F6AC92C76
+4104D14F1AC7FDEB969546A7360A4BDE4438E9A57346E6E265B02462F2035245
+8ECF4AAD5D20860DFF51A9A07986AC5D3CD850934BAB714BAEABFE55EABED01F
+20969CFBCB7289D0B9D76D68EF71E174235A90CC7578853F2D7D5E0B1582E03C
+C74B2A4883E6AA654E8511B7024A1FD3E2B61799DA126217CEB011B10D7D6C11
+C0BF15E5430CC7BA7E058F9F26D2A3754857194D0F3FDC1264BBCF71F79033A9
+BCBB748DEDD84685588A49B4EA41532F820A7571B59182883CC198A147846B69
+233D15CF4B549D6B245E756C03A2BFD615632BB3F297769074FCB60FF604D94E
+D12BF8D1397365FD98162B6DC729AE87E48E3A659469DE489DF41D10D930AE4D
+A95176660078C6E92B0484D99317D6DBFD9F57D2F8790C5F21AABCEE1CA32E82
+ED8528B4BE7C0B36C0166457D1EC4AD11AADCE9A2B93DF7A556300835D24FDD9
+8718017761E688143019C3CA12B824AE432AC3020CC8F33EB19818756D89E6AE
+AFCA1B297DDAD4A44C1144B47C75F2B8AC9673EA32840E44CBA38720938B0FE7
+FAE2393813BC451C619A5EAC30941EFF26D350A2DD8D8C2F20EF2561347F63D7
+0063663174E0BFA9442C1E305D867AB3B04DCEEE4EB0222D969D0113630A389B
+9E0ED0ABE1AB941EE468750A73A450C13A7A9180F85FF8EFB4C07D484CA86239
+48CF8DCB3BBF34A736143C76A68FD61BA00EE0EE26E279009AABCB6B89E17672
+46A6B430CA41905E6AB1C07176817FAD154CB2C387FBFAEE4857365713DBFDC8
+601DE7A087E882C4770ACBBBAE753050A505644EA683D5F9845F9E605A79D273
+54B5A5281B044AAEF8567A8053F64C323264F1FCA120243185D1B1B3A1389BEE
+93DE4CA64E87C3E189A9DC27A97E9176C615A2103F2E16005516D514E9FF62B5
+B7D7F40780C575CB9B62F1D21EC27A50093AF2E33959B5D14620AA6A53B44546
+88430FB77A162661E674F15CE03BDF685ED240D017EC4B2FE604B5F77F814FDC
+B784FFE08C20D600DA9C9EAC301134FEDF75548738361D5AA341929627D78623
+DBA90D28ADACEFF3DCEDBFADB6921AC74C557232406DFA4DFDF77ECDC8E32EB8
+F2842D69A8F62DDE785E523B7CFDC2B67C5F4973D18DE0CED95C83D697C8D301
+C4B17FDF27B025E2905916A7EC29D04D24377DADEA733B9072390CD408F9DD82
+188B0D0AC65837974D412F019ECD23B06CB9B5BE1CCC1D02E52B746E8866EF81
+5E413ED9E7802ED4F83D9514E14532DE66EA4781A1AB639B592BC45E01F1BD8D
+57B04F846203C7DB307B0EABE05DB7A9D46E7A7AE8F479F67FF2FF720807073F
+778A72912A4494CC5DF99A9354FC15D35762A4D618290E07BE3DD15FEF57B648
+469DEB6F68EE4CCEE383E6DBCAE383DF36BEDA983D64F96F8331D4F18C676ADB
+B90AF8FFE65DC9DD7256295F3DC86B1224747D7F512F2E70EDBBD508A7B95572
+57DCFD87E9D11E6C75A128CE6E43256492EC706F918353AE151BD0A98F9F61E0
+8963C0BD35BDB5B779B4159F9F416204A49AA7AB3EB0792B68F76F5202A5570E
+BDB37BE0217E02049F2EB32D78ECBA388777DB0908BAAC9387319323C5D770E8
+42E3A440CBF61DA204042C81DF09A19A3AE2B3FE0B054676BDBE060981EA43DB
+70D1B4DAB2EEA7F57E0B5B258441FED8648DC76C9D45BC73F4468F6D74C2202F
+6E7BA622714CD42C1BA0C432DCC12CF88BEF7E13EA2072D1A6DE289D0DA7A172
+E71B41BA1517A212490B523C9810F00028C26E725764E74C5045BFE8C771609D
+39EF662CC1AC93B7C27C07B6C74765F5430E42D0951B7152212C7D19636FA1E1
+724374962937E1F8F1EB6AB3C22C4BE4FF078D0E806E447BF596539AA83FD3C3
+8FBC143B7AB753A53304BA99A9EDD252114C36F74F7EBA6DB5BA5F9401434594
+90723FEDD4F4CE5AD2197D15A58C9BEEFD53B15970E9B0D38BEB2F1D86D102AF
+CB6ED6816B63BCC679D41A5BD2BDEA370CCF1B2BADE7DA131C3F522ABB4BB784
+7D2C2ECDFCD4599DDB3F56871964C78F9B728EBA981405AED5AC5835120F9E05
+968ACB81BA482F9B14F03C34797EA2FC95FC3ABE7CB4B2867C8FA151795501C1
+E5CC6EA09203A13FE15AE52290D6E51DE9269CABFAC52C982436A414382B23B7
+298DA8D8F18982EB73C808CF6A3BB764F2E65508D43E9ADC418F695C07652A90
+DC54CCB966A9AD8885495372F44E1BB7E740053956899977DDF4306A2D66101F
+478FA66E945836E370007C76F78E64236DD8548BA0ABAAF765A67FDC2092EA14
+5FDA81245F71638D5E1FDA2FE161D1474C05B68EBC0D1D2D20E137E1027CF5A1
+2D28431548113EB174E39EBE8E91D3FB8C8ACAA44666DFA4D7AEE87C62C0DA41
+8B3D20ECDBE478992F46AC25E5195E66EE024953A384D2E135DC1FE1C0F156C0
+E7E51AA892B318A669E05AF68C0A04B1AA7841D18D0BDFE0A6FC282AF79559EE
+26EFD68F54CE17E94E3AD936F6C2C47B9797A1955D57C6D2B4C07A24B93FE872
+D39E9ACA167D94F74797AE767A37844805C2106101E645B09299E55E046AF5E1
+26803DC77C0030286873FF9E0924643A4EC5FB2197E3414FE7CE9C3F777EDE32
+A971478BFD4EED1C5BA64EF8D4EB9D541DBFC5F5FFD6183D61E2041AE97F075D
+2722E47431623EF660AD98FA0A51F4FFB491A7B061FDC49CB62361FC844C4E5C
+3C711DF6B0FF7F37398D3EBF085130293AC2AB4CE499778D3F9F573978A59183
+9E8744A4E56A5F822975E23CBEB1173C8D4E65BEC16D3541012447F8E11CEE01
+E0D99080B548038BB1DAB748ACE65167A7AB80836BD9E975C8D54E61629F0C4F
+2B5C9EC44D1E33E9AFCF18FCED32ED2FF05D57C3F0CD832977AF853295EF07FB
+FAC4B11B6A7FCFEBB17C816692BAD1B899362DEEA7A5C7B9EAE1289699722F4B
+937CE946C4807296AE5B6D26ADB3FFD22413FD9D5E48A891ABA9ED30FD0466C0
+01A1A70C7B473E9150EF916EFE10BF4972277F306BC2B157F37A7CA77D87B27B
+304955FD53499C87E6A7B939FC9D0E8FB4713A44ECC6B2E083E22F892ED72D2B
+8DF64599B06E036B9F3DB5437DDA50A2D53053CEF00E318AAC885C2BB9D50247
+CB4B2FE10662B95EE6AD6ABDD1B7CB7D6BC0AF21A9BD579EA0170EAF4966B7B0
+DAD62B5E7882611312C700357137244823CADB13C2C2109E7EA098DC2CA660F7
+AEF31FE02BD0CAF977379894B584BBFBD0C6E714D2A22649DE18C7548F0569B1
+D61886611074BBBCB25B1FEFA1E1C34F9A4CC41144C0B510B2EF5CF5B168E6E3
+B86FB914735F0D41D2FBDF3F3B387049B1817FD377B33A8B1AE656EFD1583E82
+C37785168CDA9EA75BDA2FFCE1BF88B207BDA78084A23AD5341E6D44B089B861
+CD6E5C88A480B9C9E93472A427A56088B88EAA89F9CA62B06C7969645B33D5D1
+C8C9014B937EC94B868195ACA03C8D47087D0723255042110AE4B5A51CCD1BAE
+6166F2BC6A4CBEAF394D2CAD9F1C242E8434771B60A2BD54BAEF279F2CF2D9A2
+3AE9AF71A584D7C786A3C573BCF54AAB14486FA0468D5CA19BEC7DE00C243FFD
+A7BEEABF47DED42EDFE7F293B020F7128CC1482F783D64032491BC28E92C0F3C
+0F0AB8F42DBBAF6D412C186F54D6A1011845005792BF720DEB620DF80E848116
+AF3C58F48747A7B92D45A1C289CDE3A525359384DA67244F274D82C7F8F64C49
+A1C7A4864C8B8517BF079DDB9EC0E7294AE45CA1075A61FDA6751DBA228C8854
+9D7BBFEA52DB4096BCEEE12ECFC31601C13143C2CD677F94F04E7ACACC1BEB40
+431C7CB59DE746BD666B48B79667C52D0EBF40187EA22FE15088EF2025258A3C
+7EDDB192A6C3FD9E34A25D9A8A1D13195791E21174427C4EFEAF9C0EE0FCD62F
+57BFCFD98A47B34718123A2CF05430A3BDEB5A9577CA324FDC72965DE1EEB9E7
+789A1450A4B7B4E5DCF160382CE2F4AA85E2C93FCA029BFDC13C70B82415A2D8
+78FB15918C3A44DDAA1F6818CCE233347F200D9BEFA17C6852E36E4A1DEE578E
+B7F01E275B15A1A477E1D7C694978B429A04FDA0D4FD32E05BE3D14CEE297C61
+829FFF8BD07DBF1377DC44D74436DFC31E4F0DBCC98BFC31A5D59E59ACCEFB98
+5F76B9FAE4BCA4A528B9751B359BBD690BC2B3FE4F879047F3CD9027E779E36E
+7975A8C59A90834C7EEECB722CCC73B5468C33C8640C17DB4341E72767F55BB9
+E4C6DDCB93AFEBE6D920D880D0AF0383198299072CF0BBC75D0B9FBF97F06984
+4DD67EDA185DDE710ACC9004E817C3578BD4661B9A28FAEA62DA16C170F61D6F
+B981FDBD84D7AC9603C5B6F3DAE2E492314BF215AFA4FF74A4A4EBC515A751B3
+54FCE4A1235CEFF1830BC0DD6730A8E7824D32A93FDB21C5EA75EE7FDBC39FB9
+4F0F03157AD8B0A84F67CE9EEE8147253B8E7C507AA1FEA7A7DEBFD5175A5CB9
+59BB43D51DBA989B897324779F984B41668309D3E859A2963E8CB6F00BEE09FE
+CED145CCA0B2F9E7CAD30E93E1E350C16D8257D9B33C721EA1631738B003DF3B
+2AAD97FDDA30F830ECA5F24C815B91BD7B90DBEDB6C158BA9A5A4F25C4AD2379
+086DDFCDB21BC644707DE9C059861E523FFB0DA223A9C28D984B6235BFADFBB9
+D5CD42CD84DEA69E0A93203A1ECAE1207CE30B3CF0B75BB080E342EAE41378AD
+C6CF8E6F351580E579679DB5A69D8EC5FA4A5EA592BF80D5FA8194A3C23354D7
+C978A4146E615B4B21437EEEEB3F6F817A5B32725B1F4BC9D4053DBF01871D98
+1409D7958ADD446C43674F438CD5B7A1F42926BAA6F53DE5BD3BEE5CA9DC19C7
+425095C2CC000BDFB3995FB32027C2DE24FBE747C491245EECB2052DD0E1CCAE
+AA6D2BDE412A6F814C6705FF8F94CA882CA79387A6DE480ABDEDDD7C44986AA4
+53EE1F4459F68A9769266808894DF12A97BEC1910B07D86463484A623C191772
+2F7CEC29E5595826FEE8C2325AEEC37A27BC979D6F3041D906EE350F42F06B40
+04FF44204C240FED34AF6575BCE2F86E856D9BB770A07419F31E5AE0F941809E
+346078DBD00AC5796AF81590875147543F814AECC14AACC7975BDE011EAB58D2
+F59246A3628A1002779B6F617851F4DE2EDF54D26D2545C89B397C0FB6EC16DC
+0A53BF1456DAEDF2B283581158716B706998D53E08FDA70EC0E45A131DF00EC7
+AE989628DDA4A123BCF8D833D08DDB97E095DDBDF315E7508B742EF900CAA415
+06DF3448532C694AB04B8B8A3526840978A2D3D378BA68953982BA6D8A1F5F58
+F42C420C8F4374318372E9F88CF2D41E79B2BF8D94ACEC628173BFDCE733B27B
+E9A744AD5B2A606C0494110303F9C6AF32C130356503898839A8B897BB939CD5
+03D5E598EE6DF839BAAE13B3F18B093202B185A42787D90DAE9759248D1FF9AB
+9E0A91BE943EB76270F87D708E50D6BDA6453C9E050B739B2079CEBBE51883EA
+8C2AF740BDF3DEF20835F97737556D15845B7575FE12018D5C334E8DC2936AB2
+89684BE76A66D0B7CB4A4BF4550A7642292725B3B00F44A25BDCD695C73F2E5D
+0BBC6B82A5AC3E429A967D9ABAC3BC81316CDADA5B14CC415A1F202D9983B4E4
+171482E30429793A6E83BC656F518AFC7359C249
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+%%EndFont 
+%%BeginFont: CMSS10
+%!PS-AdobeFont-1.1: CMSS10 1.0
+%%CreationDate: 1991 Aug 20 17:33:34
+% Copyright (C) 1997 American Mathematical Society. All Rights Reserved.
+11 dict begin
+/FontInfo 7 dict dup begin
+/version (1.0) readonly def
+/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def
+/FullName (CMSS10) readonly def
+/FamilyName (Computer Modern) readonly def
+/Weight (Medium) readonly def
+/ItalicAngle 0 def
+/isFixedPitch false def
+end readonly def
+/FontName /CMSS10 def
+/PaintType 0 def
+/FontType 1 def
+/FontMatrix [0.001 0 0 0.001 0 0] readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 0 /.notdef put
+readonly def
+/FontBBox{-61 -250 999 759}readonly def
+/UniqueID 5000803 def
+currentdict end
+currentfile eexec
+D9D66F633B846A97B686A97E45A3D0AA052A014267B7904EB3C0D3BD0B83D891
+016CA6CA4B712ADEB258FAAB9A130EE605E61F77FC1B738ABC7C51CD46EF8171
+9098D5FEE67660E69A7AB91B58F29A4D79E57022F783EB0FBBB6D4F4EC35014F
+D2DECBA99459A4C59DF0C6EBA150284454E707DC2100C15B76B4C19B84363758
+469A6C558785B226332152109871A9883487DD7710949204DDCF837E6A8708B8
+2BDBF16FBC7512FAA308A093FE5CF7158F1163BDCEEA888D07B439DBD4E8B4C9
+D198C03874B5E6F8FBF4922065A92BC3E66D05DE53971CB1424510E892442858
+D69CE1F76E4DA76C87C763A4B2FE36321E54B1328C9155B8ED6361855A151723
+3386AEA3D042B8D89C8C0E9A33E5DF3B466F7BB8C2C8A4ED4CDAFF55FC6D3EE6
+0AF2CEBFC1AC3A6E6692F8BB81F82D86BAE85016AD62FCB05467082C2E5AD348
+44D1439C2B59F65590E57CA0DE481A7A34E79931B1513C4C30156170409A4BB8
+46D412D1DAF88AD30722F12DBCA1CCC6B4BCC28D06B0D29149DDEC520C8FBA13
+6B82E2E1790F00B216282FF122EF0D47B70A1B29514DDF7C0435ED238C14BDF5
+6DA243117FBEF7398F97EB95597707ED63C6797EBA1B46EA19ABB1DABDA171B3
+16CD500F5D64CBFBE4F9CBC3E66A34427D3C4D0C432710289381F9BFD91B4FF4
+1E3A896C3EEA2F3105C218877D6C0C6B763760FA364D00065E1CAE9DCB5676ED
+286A9ED0D1C946DCA6A2A670EE0936FB4706CC62E234CFEED34AA615C48D2872
+A087F30990C85E64BA68F3D5C117123467DB411C9F2D6F6858CC70C1E352C477
+713097321B4C4FD4C5CDE305415F998E7245908EEDE6E056A736EA77BD8C639C
+3A79FFD0B74B3D28F0494A115F2841CF8A8827AB5608F96FD8998A5F40FB3DFE
+3AA0C7696DE4E1D18DC0D6E84B943175FC38FFC42A9C0CBB13A908978C98BFE5
+034F88480F32B9DEB2FD228FF6CB0B89B045AB02020C82E3F5716DC640613185
+9F597CE262729BC52132F43922B9E28BB71A30AC8709634561B22D13C4FAFE0A
+12C4451969226B220038AD8DDA990A4E2CAD53DBEAB698898BBD3046234EB4EA
+901287E71CB41296C431383AB85F18882F65BE36923F6C0FD6FADAC5B42FDB68
+64C06E047434FA7A659EF7F3D1AA8E547939FBF9C2ED7AC829F03CA59AFFBFA5
+A7AD2E0FC7BBE619961AE1785D09444B333993199FFED007382B54DDAEBE21E0
+1E75E0AB6D309DBE53BC7BB9F95D342F51798574D70B95021FA40163A86BE6C9
+342536A5730837C522D5314B1289D9B7E4EDD108BE7F35A20AB2A16608F6F007
+6DDD702A5A9BA1325CE2C1CD020DF677872135CF04F4E4F1E9AA6B494E2BC22F
+107C331A7E80718B030A1103804D144802E3B03EF7CB083BCCDEAC7B43F1B4F5
+C1BF6016741B741CF7E12B4BF95221A72CC9F4657264771AA69C73DA1DA29102
+65D01A0E61F3024E672AFCCBE13CD0B7F54AE1418B72E357A0BABB4D03073B1D
+F4EB54F899AD4A41A9F94DC200880A0DB99D67235A2451B25F710C29A882865B
+A922E56E9FC16756014FA5CBDB1C32750BD6835A70EB715CEA19A8872041905E
+8C660BACDCA26C8247D6B3C10FA5DC240E433E479AC6AFCF57CF96697FF46BE6
+44748E
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+%%EndFont 
+%%BeginFont: CMBX10
+%!PS-AdobeFont-1.1: CMBX10 1.00B
+%%CreationDate: 1992 Feb 19 19:54:06
+% Copyright (C) 1997 American Mathematical Society. All Rights Reserved.
+11 dict begin
+/FontInfo 7 dict dup begin
+/version (1.00B) readonly def
+/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def
+/FullName (CMBX10) readonly def
+/FamilyName (Computer Modern) readonly def
+/Weight (Bold) readonly def
+/ItalicAngle 0 def
+/isFixedPitch false def
+end readonly def
+/FontName /CMBX10 def
+/PaintType 0 def
+/FontType 1 def
+/FontMatrix [0.001 0 0 0.001 0 0] readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 0 /.notdef put
+readonly def
+/FontBBox{-301 -250 1164 946}readonly def
+/UniqueID 5000768 def
+currentdict end
+currentfile eexec
+D9D66F633B846A97B686A97E45A3D0AA052A014267B7904EB3C0D3BD0B83D891
+016CA6CA4B712ADEB258FAAB9A130EE605E61F77FC1B738ABC7C51CD46EF8171
+9098D5FEE67660E69A7AB91B58F29A4D79E57022F783EB0FBBB6D4F4EC35014F
+D2DECBA99459A4C59DF0C6EBA150284454E707DC2100C15B76B4C19B84363758
+469A6C558785B226332152109871A9883487DD7710949204DDCF837E6A8708B8
+2BDBF16FBC7512FAA308A093FE5F00F963068B8B731A88D7740B0DDAED1B3F82
+7DB9DFB4372D3935C286E39EE7AC9FB6A9B5CE4D2FAE1BC0E55AE02BFC464378
+77B9F65C23E3BAB41EFAE344DDC9AB1B3CCBC0618290D83DC756F9D5BEFECB18
+2DB0E39997F264D408BD076F65A50E7E94C9C88D849AB2E92005CFA316ACCD91
+FF524AAD7262B10351C50EBAD08FB4CD55D2E369F6E836C82C591606E1E5C73F
+DE3FA3CAD272C67C6CBF43B66FE4B8677DAFEEA19288428D07FEB1F4001BAA68
+7AAD6DDBE432714E799CFA49D8A1A128F32E8B280524BC8041F1E64ECE4053C4
+9F0AEC699A75B827002E9F95826DB3F643338F858011008E338A899020962176
+CF66A62E3AEF046D91C88C87DEB03CE6CCDF4FB651990F0E86D17409F121773D
+6877DF0085DFB269A3C07AA6660419BD0F0EF3C53DA2318BA1860AB34E28BAC6
+E82DDB1C43E5203AC9DF9277098F2E42C0F7BD03C6D90B629DE97730245B8E8E
+8903B9225098079C55A37E4E59AE2A9E36B6349FA2C09BB1F5F4433E4EEFC75E
+3F9830EB085E7E6FBE2666AC5A398C2DF228062ACF9FCA5656390A15837C4A99
+EC3740D873CFEF2E248B44CA134693A782594DD0692B4DBF1F16C4CDECA692C4
+0E44FDBEF704101118BC53575BF22731E7F7717934AD715AC33B5D3679B784C9
+4046E6CD3C0AD80ED1F65626B14E33CFDA6EB2825DC444FA6209615BC08173FF
+1805BDFCCA4B11F50D6BD483FD8639F9E8D0245B463D65A0F12C26C8A8EE2910
+757696C3F13144D8EA5649816AAD61A949C3A723ABB585990593F20A35CD6B7E
+0FA0AD8551CEE41F61924DC36A464A10A1B14C33FAFB04862E30C66C1BC55665
+6D07D93B8C0D596E109EE2B1AAB479F7FAA35279ADB468A624BE26D527BFF5ED
+E067598E1B8B78188FA4BCFB0B51692D07B0BEBB930C6F0997B437E2C51B876B
+61A563A2673932C2045833FAA35DB22ADE12102335D5DC734AE3AC5EEE6658D7
+92EB62131E1DFBA441F53EFF9021D9D4C491F26BE8F54C61165CAD778CE8695C
+EEAF70E3B20C64D4C2B34A084B5770BAB2A974E898F62BFE90F132A37E2DCA4F
+43E13DB13C94DFA8ECE2B7374827AE168634FA007F8981ADA046CED3448BF453
+FCD9A4F194FA648F9FC0971734BB69CB75348A88CC361FF06E984C86AF0EA429
+DAA5808CCE3583664AEFE0C59EDA04A147FB51227A5AB0C13942323E9B3733DD
+3EE7DF7F774DE5D0D0980DA8C0192983F1E3EF18481EAF1EFEDA0068BCBDB28A
+7FC7D9191EFFC574588DEC1E180341DC959F8EF56ED5B19F50AA82A4653649B7
+CDCA11A1FF27AFA7FF189A7E8A7C0E94AEEC901DDEB541604DEC0FE90FA0685A
+FDEADECE61CE2731FDDF7FCF2AEF7CC2B1EE7095F483C2597F66694FBD2AD81B
+F68FF2E378BD8357CD1B60A1CEDA2DE760A98868ACB45CCC8CC2370FE267830F
+B795058E0FB0EB3C625259C36BF9AD2EFB5C64A45797E18797CE1A2C0304CDE9
+9D88E11E878A721610EC57958C7E80A5E78226017A263288DEF5D335199E8F28
+787DF769550AD33E15342FC5E4751F8865AA66E78B8CD2388EC3618A619AD302
+5760E9F293085CB54BBBDD47C5ADC3F479E39A795541ED8CC921D1B41C9FB1CE
+57B1340BB4BFAD1329EE4EF2DE599944404B7DF94C759037CBE96073FD77DAC9
+B140B4580EF178A84D0746276D6E667E26671117EE04102304F2F599A423A687
+53CD9E2B061D02D54EF56439E33AD985A84C1CA8F6666CF7746E0DB19A79F249
+AE1F7714AE5E1D6723C5D3AF86E6ADC9F2BEA6A62C3C03A67414A99FCCCFEB42
+4EE4BE9FC8A530F06879F46889624F7D704EFCB951C1DA1613D55D61D33F6213
+F12610A6F071E79918AC289EA5A3AA9049229902B646FE14E8D19DBE673E1D7C
+76577E34ABE80ECF2F5D6E13CE0926F0C9B11F5E5D17EC5986042BA2AB6B1EE9
+B54CF450D616DA46373918953438A7BF83A5707CCCF26590A7EAD89B5D357947
+0B6F8BABCE6FC66BF2AF462C2CB99B5A68F1A2C237143FF92C2646B149EFE040
+41F97A52C48474684B9EDD0F3D0F3838AFFB70E7F7FF8CB8BDA06483F8DD04F8
+914B752F4C116BF243D31CBF9ACF04DA93BDE4B87D181C42111A2C90181E0A11
+9E87434F46801D6CFEB350467A78A899A70DC8E12CB2FCB376647F5A155A83C3
+77B72A0E058550E0F60C273A6320B331A6EA21B51F5B00B6A5271C331235A8D6
+FB9BAF99E4565B1461937DFF6818CCB8A8483BB54E58726C1DE836B9C4706491
+422F243DAFE6BE7369B09D87BC5CE3BC8085344D4C845A45AA9D915695F9BB8D
+9B06CA358A3A330694E6D269BE179704DCEDE985C2D886B7B063AA7F521FC8B9
+E79876B9FC0EB9BA8441E3317316AFA050E3668411CE8134224945A30F2EA5B9
+A5DD581A67B9ED8497F91589B3D31D477D0D4E3F711003FD2269CD368D89C556
+E938F1DE5372BCDFEE4DC10FB320741A1E1BBA627868AB665DC58BF3F3EB6C65
+C492BB9DF8A66AB2DF79A69A13D0BFF6A0CF5BDF7DD67C3135550C57DCDC9FCE
+8A2E4802BAEECBE8163D730616D7BD27380BA8F120DCACFA1FCD39AC538D0B74
+6A89102775A36A07A485371C6003849984EC9510E44FB64C7C48DD1D4EFCB466
+EAC4C05214A22D562AC26A4A12F285F5722AA8912988552EEF2AD37373AD005F
+90CF5C1BB6F1F0EADF0DEBCD98578321BE27914957E36B33903866F84DB9E29A
+0A2ACF23DDA2837A661EA5D79E573866546E6727D034374F2012CF2F9802C313
+3493D65D673A7C7F11B3CBBA5E228A1A1B7C0DFCECBEFA50F12823627F574B0C
+52D3BFB446BA34DD9DBDAA8E8F2A340CE08BA4CB7B026962955A24D14C6D3689
+4764599FBD400348B160C47A2B7854905E65F68F77CC767919CC54B3ED08B176
+FD613F32A5FF09F38B5DE50ABCCE670B52FA2D52D89D5FF6FAEB9488C13B3D9C
+47810A096C17CAC697CE51E8ADFB9ADAC0E4D7957E460A9681A9D9AA97448E89
+0DBAB82F55CF1F841AA057F40A8584A7C319A58803172D300C2D8689194E2C70
+FCE23E8A2BA569B30164898CDCDB8DC912C7A5E272C0390A1CC4B904A5C6D20C
+19E4D238EFED56C9066E377FD2823B005C800760EF772BB40341192EC4518E3A
+89E066BF7FA4BFE89F3194AA5D93458A05EE292473C072AB013F278909253677
+9EA061C1445F06277AB3ACAB37B71324F92F7516C6B900CE94D7ED439983B767
+AFD51B9DE8945067D8700CE394CCBB3C4600CA5EB01E26ED3FAE907B02CC6890
+4075216C6D9A53295FF319A282610EF6DF4A499E36D57E47527814BB30907191
+48F365D70E0BF52E3E0439E7D7893EA04C652B2481166A2ABC7B3268C2EDCA09
+DF7B1CD038358A34BE568262612A301690D560AC74D1F7A78F7614F490ACD793
+DF3617DBD88EAB3A7C026B3264CE901BF7EAD61073BA340DF216968C873B9B0D
+51ABF6B3424A934E3693D3001AEBED738F678C2BC9AB3FC6100316342022B997
+942F51249B6B5AC9A6F444377FA13BD0B0A9696D292EA1D41E4653A01238D6AD
+3F7AD5EFC20EFB36F3C197078FEC2B21072FA53F13A1EE408F11D5D828CC277F
+22049560E3338525019063FC4E5263F9338A0E4622B43F3050B13BC20C42F594
+7B8FAD088B950246563570C1B668425EEE484234FFF966E6F378C444EAD0969C
+BF579FAD5E0FD14B5DBF6394A2CAC132530DFCD8CE5E9EF92E44F05C1127711C
+B11D2DB2A7B96138BE44C15B641FD23E0075DB095DF7C7F1097FE15FDD319620
+C3F26688ABD69B47C7A09D6CE33FAB572315585109B9E7D0B89ECDD142442813
+522021A39E9060CA6EA7344637BA301C3BA10FE6A68127BF92D1BB8033909EBB
+5B908B6B06B826B5D5D885B7FE00CB023FDCB2A5D8921C4EEB33FFFC80F5FDA0
+4FC64F3F703892754538F101A171E51013FA71A7EC889F168DD2919C62E351D1
+60E1988EB9BD3731160CAF24718F655794D0713259A331D2559520ED7E807F4F
+7E1A89EBB1879EB4F82C68457B9F0DC6EDB701B2C66C60BE28B0F2D01B82DE96
+A7DDECC89E2A898ADBE47865102414A43E9629B5999B445AF01A2FC5675366DA
+7779581EC7A07B3550F7247C33A82CD5E3F06B69FF8D2CD4F1C49963ED55D935
+27DBCDA1E5010726030FF73D6C8127613C569D94E8D5AB09D7F362A845A5F191
+B7017CB62BFA6B9D179444F62C48A6A03E8FD80CEAE3E74B58AEFBC2B4467D63
+DB6A20083E260425FA8B18D10CEB6562E7AC0BE0238C26B274A709A2240D7F30
+03425C37E5D49B94B5A8F6EA8E69204BC861AF0FF7A33318D2DA78EE1C9C09D9
+A06DB0DD4F54C5E964D7197973F8988559FBB567B5B976A64A40B04B096C1E67
+CF3CA13989F0D05CB84BF89AB8B4ED727DDD60341DB653E77B7525774E799D53
+CC5E118246E2ED1429B48CF00861E0ED228CD9C08B71EA150CD8533FAC568DE4
+2C730F137F63EF879826F5D287C23D3DDA685D763C0360328FECDE0E29066ED3
+6905199F9B25FACA384242B9B92F29403B41BA0572B7C560D8FB637ED23C4A27
+70EB855315112FEB9456156E29B2EBBD941B9916EC6279E8B95775AB0A041CAF
+229F53023EB05EB3BA05B1047764F740E22137CA261419605ED11BCC1D1177BD
+0C169FD5FA3B9559FE63899101E19F1A537C8969A55D1D11C7362B199410572E
+D7676047A5892CD4BDCDD96209E826B350959DA0FF5AC0B5AEE8E14974E60091
+E84202D0517BFAFFD838448E3BBDA0F7728D686340E931F538344FF2D0DB6545
+2AA66994D3C40662EA07DDC898B5879CD01A9504C91BB40F28123895F5B13163
+DC7FBD61534F3572E90F018068D14486C98506A9BEDD87C9C5D0A363B4ED4C3F
+58F45A89E81BA4D5A412767A8DABA48EB7CA6A7EEFC8A28349C6E3E0745E9E21
+09E1961B1798FF0C50BD0CCC0D519D1D4C11143F129C4C410E26FAE00E27765A
+5E3A0A6E3E79D141E49D36BD6B889BCDEA0906C941F19E2A09526C86759FFE86
+B42C664A8E4AB46077A8DFBEA0FC04820FF43C4C781D84A6AEB63B9AE50F29DD
+E6C03CA2162CC138A77992F6925961E7C6BE9C00BB8736BA7A961BD6AC40A1DE
+CB78C06D3AB1205DCEF285032B21F2635C5B78F002563F43B6A3E7EB03891D23
+93C48511DB6F7BF9A7318E3A15A4E57973C5697379C6B5DF55513FACE2EDEAC0
+24BAA5F924F93243A90C5A4FCF9B95DA1395EAA3864F9F1046D87149F53669B1
+553E6302E796726D95633493BE6521290F19041957F7AAE38C5CA40D2D9F4322
+A079EC97F2E11BF3D82D96C9AA2EAC4BDAD0F7D1AB7D63CC39CCE38EC3A68496
+249FFFF330576AED4C0747BFBFA159C3DABFF480AECACE538884ADCA8415D6F2
+E43409B5D32A22D5997D236F6508AB0766846E617E9D4DB90C4B477D368AD8B6
+F0E4D1A984D7BC69B4FE9A14F4A30884CDBE7038DF8DAE42028FD7DBC0F4ECFA
+906E57F7DC4F0E6CE19C87423A750530F641316A9A2B5488E05BF37BEDF189E9
+2453BDD129DE584606F3E7570D82229DE9DB2C44C35C775C564465221CF19C5A
+016BF94A9B738471EBD72D35434C75597A8ACE4402C43009A47C2FF7FB795502
+73DF6E685676105743A6FED0A43656E871C09FF1D6F35C50D4F03BCE04A8D3E7
+7D9754C186AA7C655FD6DCBA4206A4BB44F6ED39CA244A25DA66AC9460000BCA
+2AA5AF0DB1895D6B3093DB4503F4AA4F04FAB3F368D7178D606D13707B1C4837
+B84813F681CDA82CEA6D126D4E569445C174488F1FE51F0F65A8F243B9817AA8
+8780DCA7993832A6D42F2658FAFFD693CD149BD956193087C7F8E5522F5E0D5B
+0E64C00BE5CD1CE7E9013BF8DEA49773D7D5F5ACB75A0BF9839808B9A2C501F4
+0977BF56640764D855A272EF5204FCECBD1CEEC156FE04AE86AA644C1C460A9E
+6DFCB417DDB7EC6759088B53D33890C88AAB82A5CE870AD347E9716F2E48856E
+EF214ED9D2407246C69FE73EE9FCD682E8ED508454FBC00D68F1523560AA5357
+5B391524C09F29A95BDFB9EF4E824D08084707638B72CBD82B7116B211EF2472
+67BD7BABBC31F2D77B070962BB730FA666F8E0EE4C7BCAA4B5FF8E3033A5D36B
+85AA043508E3C008574AF27603BA3CB5E9DD137462D025DD12E43CD90E12EC37
+F8597E07DD541B080410A052A499F6923C4E839515EE3A22D1A3CF78F5A0B0B4
+A92BA9C07BC55A80F6F207511AECE4F1179D2C3EAAB292A61FA53EA8E5D07FB3
+31A3AE227303D0E9B2BAEFD0C13525A83998996B2535C60E216A24DB9DAB7EDD
+A8C15CBFA67AB439D66BB6F9ED168088982E19723EF291B07A805B41BEC5D47D
+E9A26F6DD217EB8C7D241C60860950460FF5231D8A6062BA56EB670EA4C72FB7
+E2126C4C928C617FBAA138D9FA5F854E3BEEAA46431395EEF6C778538B2A2B15
+332653EAEE473DC3DD584C4921312354059620D28AAEC8A2BC3371560E0E1646
+F45FEF7E3B9A36F6289257A84EA4C21DFF2B77EE7A87ED896654BEB9997B5B57
+96909E8D6CFCD68E915350AEAF992EC493720194C7427EB9981CDB1C1167D0DF
+980D7D0103ABE4DA122C9AC7EE5C9D21B3BA6F07D533D027DDB27B2E94CF78F2
+334D8A32B056B265348CB93605E6420F5A034C068A44DA2FBCE8CD4A9072A763
+BEC1EC0361AA7DED64EFE9DE89F1B756CD2EAF4212B8E13007317BE98D76844D
+17F3D97E097D15F78DCD4C019A5240EE4D7441F189080008BD44F8B25B8305E6
+3C88EA20DD76FC84F1764758199EFBAA5266E94E4E57CB948E92B71ECA0A0A08
+5434C117BBEF6CB1F49869D7B8AC2306E9F8595C16342B56C44C7DCA580A4337
+14FF312150DCB985799C3F63BEA42DE542DF70B511C69BC4AACDA78E382E2940
+FEF26C86A3966A7396EE6E6FEA3F562BC5FCA00500CB13EA2E18A641A292D726
+85065BE32C6904E890325F1928F10AA1756733048E0D602DD235C1E4EED92EDB
+EE67DE5C7C0C8E3C7922B13FCC2D2F7AB3AD0F56AACC6AE4C02676DC22D22796
+B516DBB64F057EF1FDC41688F382C851526AA4A2DD70A3ED78057B2BF52E2C6E
+29E6E96C7147EFFA374A2494278F83B6CE9B1C05CE8336E0AECF2008AA87F360
+AA3757C833E7FCED0326DC1FB497E06C5358EF2402A51A20B3D627B572F1895E
+6AB9056AD0E31CB3C0F2C7C9749B316F4B3A83C345027069538F7F5E4EE52CD1
+562A513CE29D4759FCB9975AAC77FF01BE1E01E7F7647066000286A0460DD391
+64A56FA9D33E7DBDF17C4EFF5679C6E4BEF46B082936A109E4F2D7138BB33DFD
+A9DAB21CCE25671F080B7A0CE6B062FFAE40752839907C2642A470F0A598247C
+B42C6AB354F7ADBA87BFF9FDCCF2C270913DFDDC1EA456CF2CF1D62B3D4AB16B
+B02E4B2BA43C971383630F5E9CA0D85689970ABA81E8305B625ECCFF4FE4D4F7
+815C5CE45FA8F803FE4D2DD336808CE966BF96317D4C0FC700095F3F94F3EA3E
+54932AB5A4E57410B67FBA060AB911BB3239393A077ACDE5CCA16B582351AAE5
+3789DB7FC83A8C6FF2F2224821260E99A8BF848CEFA564FBDCD0C1FB549F474F
+CF9FDB885A093F5D4F613BE7B2F624E490206CF14B9BCC062FB0BC2549CAA7AE
+F85E0A5D1E691ED8A39508429160A94C61B3F69D31A637A1A8D4E1B3F76D202C
+FFF3E48DCC6E910E93CB3BA5CB7FD50DAE366A38210EC81B064D911CE3D774B2
+1B34BCBAE1DF62B691BB23FEC5713581963D9216FDC154BB7FA69DA43B670A4C
+A07CE43720FDAD1C5A2A70C1FACF13A9A4D45774EAD64F05FC65D320600E6F2C
+314FC1EC7ECD2F06FFB6C40354FF8626B3725E6065859C0CAEEB1B66A549F2D0
+22ADCF868F01ADB7637A8F017F7C47314C4376EB5302AC8E8AACE80198ACC40A
+3E16667DDA6ECDB5C1A6A12C8F3BCA5055169CE8C97EEE88040D0170F990E079
+FAA40AAF22AB403C56880B3D96F479A279CAC23B85F06FB0C66F9A3939EB6207
+283B792C0D8E6C26D5DD776D22ECB84A13CC6A154E6F8DF5D0D6A1963F296ABD
+93368F196BCD9EB6E6220B75045353EDE59520C62D5B559B125494C6D01E53C2
+ABD344CEEA46FF3BDC54693E6B031DF6F995EAF42899873D2BF37EFB19C5E764
+ADE116F77D9C81BB107ABB3392C28575C763CDF9E247504DFCA8E50F91C94811
+2F28E5B3F2241902226A556013CB1EFF74495C6639DCEA60A89946450979572A
+FCEC6C00226F1EBAFD7EB469A66074DF0DF24A420A7C2347A818EC2671DA5238
+5B4B5656AE50B5260326A868E15EE7C21F44807FE05300BA7B8201FAE5BAD485
+7DA3EF7D1ACF5ADB5963FFB43F9936F1FA4E92D05705AFEA26D074014A039F6B
+F06E017F4D51E8E99005FF4EDCB58F60BF0A6C9BC4E93B8912BA0AB4390A3458
+BB81CA7FAD0DD5131EAB9E807B840EF026020676407603D085E8F89D932AB04A
+4200FA0D7B11EBBB84D4E6D80913CE3A600BC11BB7F69547B356B511B0EBE0CC
+B36B9030C97B9CEC7A58BA6FF38290DFA6412BECB8A810FA1E34C1D024A3A530
+E584D95A9BB13E55945B7D9334DEDB96CEF3BD13D6C57D2BE38352EA19D4C609
+F798DC6E38ED7B1B43CEF5DFBBC1BD6AAE7C48B47F2542AD54C6D6C3FEF007FE
+66E43BE6375661AE84EBEC54AB20D37869CF9E1DB9A49C12B6D943F462BF7808
+DE6FE0DFD0E5374E68C17E00718E8B1C2E8EAC22D9974F98F485745C5534146E
+B6E1F782813D33C856383A1D65
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+%%EndFont 
+%%BeginFont: CMTT10
+%!PS-AdobeFont-1.1: CMTT10 1.00B
+%%CreationDate: 1992 Apr 26 10:42:42
+% Copyright (C) 1997 American Mathematical Society. All Rights Reserved.
+11 dict begin
+/FontInfo 7 dict dup begin
+/version (1.00B) readonly def
+/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def
+/FullName (CMTT10) readonly def
+/FamilyName (Computer Modern) readonly def
+/Weight (Medium) readonly def
+/ItalicAngle 0 def
+/isFixedPitch true def
+end readonly def
+/FontName /CMTT10 def
+/PaintType 0 def
+/FontType 1 def
+/FontMatrix [0.001 0 0 0.001 0 0] readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 0 /.notdef put
+readonly def
+/FontBBox{-4 -235 731 800}readonly def
+/UniqueID 5000832 def
+currentdict end
+currentfile eexec
+D9D66F633B846A97B686A97E45A3D0AA052A014267B7904EB3C0D3BD0B83D891
+016CA6CA4B712ADEB258FAAB9A130EE605E61F77FC1B738ABC7C51CD46EF8171
+9098D5FEE67660E69A7AB91B58F29A4D79E57022F783EB0FBBB6D4F4EC35014F
+D2DECBA99459A4C59DF0C6EBA150284454E707DC2100C15B76B4C19B84363758
+469A6C558785B226332152109871A9883487DD7710949204DDCF837E6A8708B8
+2BDBF16FBC7512FAA308A093FE5F00F963068B8232429ED8B7CF6A3D879A2D19
+38DD5C4467F9DD8C5D1A2000B3A6BF2F25629BAEC199AE8BD4BA6ED9BBF7DABF
+D0E153BAB1C17900D4FCE209622ACD19E7C74C2807D0397357ED07AB460D5204
+EB3A45B7AC4D106B7303AD8348853032A745F417943F9B4FED652B835AA49727
+A8B4117AFF1D4BCE831EB510B6851796D0BE6982B76620CB3CE0C22CACDD4593
+F244C14EEC0E5A7C4AC42392F81C01BC4257FE12AF33F4BFEA9108FF11CF9714
+4DD6EC70A2C4C1E4F328A1EB25E43525FB1E16C07E28CC359DF61F426B7D41EA
+6A0C84DD63275395A503AAE908E1C82D389FD12A21E86999799E7F24A994472E
+A10EAE77096709BE0D11AAD24A30D96E15A51D720AFB3B10D2E0AC8DC1A1204B
+E8725E00D7E3A96F9978BC19377034D93D080C4391E579C34FF9FC2379CB119F
+1E5BBEA91AE20F343C6420BE1E2BD0636B04FCCC0BEE0DC2D56D66F06DB22438
+452822CBEAF03EE9EAA8398F276EC0D92A7FB978C17805DB2F4A7DFBA56FD6AF
+8670EB364F01DE8FCAFBAF657D68C3A03112915736CEABAA8BA5C0AC25288369
+5D49BD891FABEFE8699A0AE3ED85B48ACB22229E15623399C93DE7D935734ADA
+DA7A1462C111D44AD53EA35B57E5D0B5FC0B481820E43222DB8EFCD5D30E15F9
+BA304FA879392EE0BCC0E1A61E74B3A1FC3A3D170218D7244580C7AA0DC65D19
+741FA5FE6F8CBF60250ACC27454BBF0897CA4B909C83A56672958752ED4B5E79
+E18660764F155E86F09EFA9F7685F2F5027EC85A775287B30E2069DE4E4D5712
+E7D033481A53A2702BA7542C71062173039030CF28D8B9C63B5596A9B42B33E7
+D922944A38713383D3648A4AF160A3B0C8F3379BA4372BE2E7EA49AABA75AEEE
+C5DDE1D8BF68483C3D21271280ABB91D54CC819680322EAB72E1250A760BC8DA
+726405EFE420635B5B7F0B48752C06083E92BDE06401C42A2C528C8A60381227
+CEBEF0C9440DC034DAD9C19FB27A350233112B0A339366B7373CE058456E0E1F
+139936F6CC9B50441C2F5994977426AD7DC8C717E737F8C201EA55AD94908336
+FFE9568C0E6EF3202D8CD7B7A6CC203EC601F9A7E2A4395ABA3406503DECAC56
+B03219CEBD0E465EA0F635F26D984F5942E4FB186AB874F3E74CC2F2E378BD83
+57CD1B63C9DE9963587B7457D56024D95645ADE0D95DEA748A6ECC6809C2A7E8
+6A568F83BFB184B31349A771DD72ED3FFE8D16E3138EC49EC6D7524E611331C6
+DB2E16059C9A12512C7208E3B30F04273E20BAF41EF8C96BA4B17F31572BDD15
+3FB7D15CE31684D721083208D7698A31D07160927C9A7CF8B7EBE81A83C0BD46
+9CA06245FDA37F0F2DF7948A20D121660A73E079F4ABDD8F90367BDBBA323957
+062438FF3B28A3880380CDC76A055096D30FABA4AECAF238ABC2513F089A6C4D
+67EA0050A34F5DBE5FE32D9E75E67F4C87AD8115DBFC00124DB4D3F4CB62CA02
+59BFE46E90DE9ED306D6CDC51005C233BD39F41B264E2892AD23E8F93C8C61A0
+B5C5CC1021411DAB515039DCAC06E1FAEFA259E6AB07135CBB345E90E2BD64AE
+37B9A46934BEB383D3AB1787A2656FCCEA6467ECC2582807E7DED181C53829A7
+1818C3FB17567D81D1A833E0559798D06163781D7895C31B1D81CC439AD51CA0
+5E33E96253064B684F3261EF86AA8452B32E9C5907153BBD692BF8BD4AC45E3D
+7161488C716CEFAA695877B03781F64840D49C9C1BCE9D5E759BF1812712F2EE
+054A34F2153AD6C953E795B6F40AFAB115C5FCDD1864A85C1AEF5DAF40337068
+08730BA7AC580213881F8AF1F76FC830EC76BE4CE6E090A1F91618595AB6D1FB
+A885D04A4E73C9C7A923D813275810DD2B2A3AB4FAE4BDA24FC170A4BCF46E05
+572529A19B09E5ADEAADD071EAC20C5DA884C7D414F5AC5206E87E53989B7378
+BADCEEC6FCDD4B4EA03EA994FDF6A80A2E232B1A007B7554471FC1DA24901896
+9CA84283A02FA1D9176026BC1529147F19D07521A4997B70258FFC03821EED0C
+D44BC9C2E67C3CD9971954C58BF1775D61115B75E26AFCC3B7CE6E5ECB8CCDFB
+640DE440334737D63F539385F83BBF603B631AB2F750DBAE707F5D008591A05E
+9D532C165FA35B580D690138463047F77F10FD4FDC8F724367545C0F5B6AF978
+B6AFA49624EC2AEBCB2D19E9652CC74B66289E42A8FC4A694F13626C3CA05926
+C1369F80FF1114F0EB03CFA40C37B2327992DD0CC598F10BD9D1483080CF33C1
+02DE0CA7BC38424C3438B4CDBEE66793A2480A15BF47F2FC621E66CC563F5052
+491ECDD9C38BE1966161403BC22BA41CB3FF9E90A70A99205ECC558C928F2FE6
+5EA5203977100FD3ABE953E7E5BA57AE0700E33A0ECB6FC6953C9029B25D61C5
+F57323AEA10B43D5A46C6F248F021E096E02AD7EB00923B0229336369EC82FE1
+F1C198456B9982956549CC441B859501FAA0CE507A8B131F10BC99B060B8113C
+2DB536DE8485DF33F1BDF4FCD571098CC6FC6B2A828D8478991B354B2309E31D
+0DAE3E8FAA0189B3C1E8208FC4C31FBF64689BF81BE39FFC2E680246BCFE4448
+8FFF4C7522CC12B622EE7982E0F52863B97965AC2CB74444618C691975D758E5
+53878C44180D2BCAC4CDFF06D1F109FF858198CD225C7F9BCE564D861394730B
+9A47876CDAA300EBAA793BDD2881D6D0A66D3727C871D97F199FAF1CA45425BF
+5B4A161F8C1408A20FFAEAD31141B18ADE6D229F57CE29E92DF9FD553274CDE4
+28E94100A930CD8F41F9BF6285743EC5DFC9BADB196021E045BA231B0DFFC8E7
+3EB7B7BC8F641CF337FE57D17BCD02C4980FF1A649EE62D2445C28033355500F
+B460C58BF63DE130BA82909404613348149F01DA396AF06195B4F42D402F22A3
+708DAB87F85EA515B743CB94D464F1C980F0BEC03EC7E34911F288459B59B672
+9474C93CB8A8A016ED52201F4E43830FF8ECFD652924BDA223DA5E2B2D6C057E
+C8E558872D762C0EA343657A627FEB5F492114D38ECA96B14AACAA7EDD85B562
+EA087D768A96507C1E814574B08442C49EA2AF4DD67C322C3D8DD4686632067F
+01E7E62E8486C163A39C28F7070318FE91167D148265BBAE808916900F0B45FC
+C106F3CB047BE800BF442A75BCFEB94E7DC7E317845097A30F1D2686439BE077
+741A968F3D4C5927030192D52CF2536D4F7489323EAB74EFADEAE1FE3F887925
+8E106352FA0ED99EBC97D693D287AD29E57FD1AA6A9EC121041636311364FCDF
+045E969FFB7761D0EDED38DB4477DA4CEB05758B314CA631E704AEA1827B3A3B
+8CF8B4785147426AC7F85D15760C964305EC631B21F6280E31DED8549F100B89
+918D6A48BCA74FE4EF45A6E4F9B694C2324B1E700256B84B7DDA3C18EF854626
+DC54291003BB1108B99C1E730C8E562830E12A561F1C292B1EBF809EBC2558DB
+71F8949C9B435513BF01AB86D7A7989287D028AC882A98B56EEBC95582D054D8
+21BBD6D4AE1483616321E1C148699B82B3343C2D63BAC0BD2910E0EE97ABE442
+0EE6003D124D45E4CE75C995BF7A75AABC96B9617EDD5ED91C69FA3928F93325
+D7E354E81F8F63E25AFBA8044D95FE560D74DF51FD00F8803E5C257D380A3CE9
+6F2824EE3C538B1CCD59B4BE7DA742200FCFAD187722EECDF8FFCB59C8306AA0
+FEE3C0689093FFF1FD393D24F1B1A6F0A5CC523AB1DC5A34C768B6FDE57F756A
+DEEFB6ACC7DC990C0EA07872B9364D2D024B2D56DFB4103242184E0DFA8E2A24
+A6C5F4DDFB1A3F86A508DC15AE85B1C5A8416175B5F1FF33B4CB70FFA6701D5D
+D3EE3294391DB669C03DAC462C501555E031AA6E7F221DAA99999E87B2C345CB
+2350D7F62242635E55D926FECAF4CFD3B55266BC86722AB631771BFDE91AB7D1
+B55C8651BDCA3BBE77D49E26E8A7B56478068613FB132521C4C800CA93A93CC2
+601D4869ABF79EAEC353363F6A8E7005831B925323D7370B1EDA9CB91626E452
+35E961B3DCEFFA27D8D0092DD911951D4EC48F9BCBF4F19E6DFF6831B5755BF3
+A593FA1314455C1923E8A8DEABC87A93CB4CD22E1CACA7C4A4F6172F7DA6B6A6
+D07E45DA2FCF16C67D730EC221E3E3217CB907756C5783DB363E775598FF8342
+70EB36BD2307E359A7A10DB2FDA8BA18264B7C7159FD6B1C568DCBC67FE75AB1
+A1751BDB4246A135AF6646044E7EA3BE868DC2B2643395129034B14DF42F4B77
+D513EDA2E438DBAEB147CA6F41256048DC034680E91CC5B6B800FA42F0857911
+82790F473119BF368D5A49257D66C665563406265A47661D560329BC4CAEC9E0
+775695224BDD347A896E0A41163D548B8DD7018DF368E3E6FE364DDAAC020B88
+20A6C218CF0D40B300B166B3125D81BCF6C04F43EC7F1C1E3522C7D119473F03
+266547389DAAB843F9AD52D94F12BD620763FD8C13B0C43B29E40373CC86E9A7
+D83F222E5B2448BFB419B3BA7ED209B30485C78F7E0C6C48212B8418B14FC2BD
+F4C928C7699F67D6CCA3DA7462D3744280578250E7E6728781DFF9CE34B5403B
+07030E9C4B2E69D4309823DE0CE13EE758834416F9DD6F90B8DDECA1C7603DBF
+62058D4E768DC18AB628815C30F59CADA4D5BDE8B40F1A59C3CAE107D1696823
+C3AE4393AD8BD1C5AE24AEB00D2D2CE88762D31AB2B1A1D462037F2F1B3B48DB
+57298490CF0C4EF23C342152265F86E3A0BA147E3700DC3E889475548A24C577
+D11399C971DC4CB8C122066D20B1FD862CCC440C6D9F9C0D91267CEBC252C67B
+A6C7E545DDE69BBA4F5407ED30A8EE165E05E78FFD7632AB5641D76A41C6AF36
+1497E6A3A7D86C4C0D3B4916F044CEBEFF2EB0514F4CF9FB967CA2C1E3676A96
+D30B2CADFF05C328B68914FB584EA5F41A66AE4BCC94D9A0E3006F82A9B90EF1
+00D1519240D0A1E0810B0B061841A49143FD0EC4B14BE095EFF5BF06F2BF4226
+0635EE011E3F05E80838EF86B6F1F183F578873813A6AEA87428BED4A3AAC9E3
+5DD0FE857FC76936B979D12973A5823E75E0A8731AD914B666D8DAE2C8199E56
+0E236D47F36549AEAC1A74951D43A453ADD5154A937EC9CDCAF9D3728406596B
+6EA7C1AE4CB09854B52523D6788BAB7AB1CE4389A811E4E8451E3695AC9D336D
+B51E9E493E65628FBFD51D6DA8227AD05BF2C4A15076A51A3B83D9975018BBF2
+B3CB2EBC72B9E577C740CC64854635C7637DA157F697EE3EE1FB4E5657CA602A
+842AC29523B20BFCB1850C5B329DFC307A17498FF4C0D1050E4A0B72B1B7063D
+9E651B9C33C732DEEA4B858E8CBD2B7F507A42323F0F625AB5322DC866E06197
+C3F761F22576CD6C228FF69E54BB1D9B054C6B8BE3C60430A69C2609A32EDEB1
+BC2B1AD00BE0D32E32A66D19E590BC8FE6245782387EAB2E2C55660A3DDF63C2
+A18EEBDA448A6CA3E3AFE4E562A7AA0DA87C31DBC83F208E7D8382E64082A4C3
+EEFD83068DE6DA96F90E3553BD664314FAC4A6BCCA6E520A5D0D9BB4511389B4
+E3E3ACA3F51D47B62F11D8B80A7C75299196F525F9582F33B295CCFCEED4A27A
+601CD8052C9BAE30A11BCFF10E426498D23A0E0584C0D171DFA3D52696A1B866
+10413FA62745A826988BFFF1D543271A4DF7AE242A7BCFE154FECCB63247E5B0
+12F45E0DABE15654E160747A4882CEDF036AF7F3A69F11904B8D4E7FB7CD5801
+3A407C9281685669EDECCF91BA3B25AB55AC8E7AD12C9D26839DC9F698C1A854
+2CF430F2B625D3E629D865A013369573A36B89D6A76133E667F952923C387660
+E2B8BB1B09CD385A33CE8DE5208A7A9B404B845DCF9B1872AFB734DCB5E72BF6
+655FBE94E54E6994C4D5FA652D7CAFB00DFFC85475DFD7D8CA078581985DB551
+531482FBBED61652E862F84CAC42C4D786F274DEA28CB8058EE64CB3DBA19940
+8E9ADF1306E971AC8ED60F42268548D16339DCCF0FCB2A52D70241D531469CDD
+F306E350EEBC4610B237B93E9D4385D1414B30812C41FB899A5D16ADF8DC4081
+1F207C8CAAE4D39B99E9386C5AAADBDE232E8B751811C971126DF8229D802153
+5DB62D286DADFC847D98AAB73B159F61F6F1BBA9D4E18C71D982436294178EDB
+9D3E2C3394F824B1A67B381224AC2B126DC07F9D1FB1FEB55E4E1698130584E6
+EC789847090AC359A465C33889FD6770BE79EAB44A489BE86DC210C61167CACF
+328BCC50EDED458A10EC0C0EC907A808B902B92ACABE442C8D17503980929F06
+0EF04CEB2828302E9EAEA75B43A142A791508D1C3576B0F0584AF2064BDE04D5
+4B2A98DD648974BB712F4D4FA0C3E3F247355709CA187F2E22808847E5BFC0C5
+A2D2F6B53340A943379D26BF95AD0E771FDEE47E88299FBA70EEEA09B5CAE91F
+3920F5E3DF158B31E60971DAED8211FE21CB82609B581A20DD60D738C186A8F2
+AD2F826A9031831BD1B510A11BE5C61D683922957A8D909773AE1EC6CA3E615C
+21AC4ACDC6FABCC1DE0007D16F137B2698D92C312D5913D35BB703A678425D42
+E4E4923C3D6B844682219916B33163CE6D87EFD43ECCEF7BEDD597401FA75A70
+A3D902BF4D8716FF47E5D7B1587ADF4EE2F8718BD6EE9A3FA58460E875AD7E78
+45C2F49981B3E4DDAF2A0E5463BD845A2B7F65A4A7F58B78194AE04F58FE53E1
+6F8029DBFF18E1B52BDA098793EF741C1E4A705A158E47FEF0B7F7DEFB9C9C3B
+1A0B82DF66E71AD34E0F0A0AEF314E6040902ABA0822A44B2040156EC942A78B
+60E26257686A1C15873986DE3BCFED2A5AED392F9470991040D5147951C84D34
+715E767FC6D1BD855C6FFFFC9B8E0F21303AC01D15E21024CD2936D8BB054E54
+11303C2A225999ACE40F838B36DBC92791AD97112408409FDE74D7CE35B206FF
+29C9FB23F71D5D65B2E8961A006B04B81836430E0FF3986EF0DFAAF222DEE50D
+D39EF1CD8AEDCC1E7BCDE93D0BEADBDA95781F67E5AD523DCD2404B89ADB12C2
+54519D2627D577B7BCCB6E9D8A2DC4AB0C9F2FF27EFC6BF14F0E187860719120
+A9F604B57AB0473B695038883A6138727F1E093C1DC8848EE2B6B7AB3375E2C2
+4F9666D60D376AF5EC01F409FD3EEE13B0C67A31DC55A2C3C0C9E7B6AD07FFBB
+1D91E809AA64890EEDBF695D161FC4F51EB72514E575DBDEFEA70867508B1E19
+8DA5D6FA85F0B1E544D4A3A2F430CCCD13077D9E46DF94AED300DC90F196AEFA
+212E5D45C17285E2D13A44E524243A668A23A6C97BC7B6F68321CD4837618CA0
+3D1FBF8EC7C61EE2569A16357D23011C2273B7224C03BB5D1D1767D04B11AED4
+9B0F2157E84576AB864EFF097A6171529E0E6ADB1F42139C91C4CEFA543C06BF
+C5D1B3DDA23822234BF0E898D46CBD9A316101E411389856CA6504AB7C1DF7A3
+8602E41303C4E967EEB54D56BEAF159BE060557C9DD0116D88D6B2430DFAF48C
+DE6868A6D74A2DE94052E1B44F0CAA0B88469B0E4E778250EA1F121ADD0D0899
+7C88B17A3E719643F9E1E18F781DDA306190BC8725156AA13DE6B589C55B4218
+6E03A3E33B7C31156859DA3070035BBD6B7FC2FBE3DCB9E946895B633754FD2E
+CB0919F53655C852FC66C25C83511FE4D11BBA1948EC094FE024234B43FA4161
+D6D7B6917C423D80FEEFD12B32C50F45C46643DBEB2756BB3639ADDB4A628FBF
+A08381FDA81E9004DE04644BAC33AC06CC46DEA3B61785F3F7AB20EB09AD90BF
+5C522512C09AF7B9B64D2FCB88D297C9113302D601778F4A40502208BDFB6237
+0A58517F03F4EB24ACAEBACFED72DB99C6F09B1A9B52C072A5B4573A0A327A90
+98A10BAB75124A00B8CE0AEEF29A6EB6423B02BE542D9CF5C1C2583AB23B949E
+E7F60F643EE1DE8F9EF5A4EE1851970565CC391B1849BFD1CD5CC99E949E3C69
+986292D09396DB57FE068AF5E1FB61A7C2B8C6044EDDF17F8C5B2DB9ADAD93FE
+38618487018274733019813027AB1C43D778F02EB94B09FCA7F3E21C566CCF63
+3172A02827FA8056D59E26C74EEFB7B651EDE7C74EF43D205941A58DE5F5ABC1
+0DAB2E0AD8617CA26CA9902DF93AFD42C4DF308D8DECEADB384A913358B0F279
+766F18E6F9C94EAF754C74F2180C61417899EE7C01B52E5EE873AA1EFFCC0DD2
+B58D93E68C4AA4111E7964E82FF7D18A67A14FD181AEE2E12C400E6BE3DAD5F1
+33B0DFD95227F3BAB381813D9E76BE7266A13A7B0DF06BEF237B40B5DC81B5D7
+C601FDFD07965FBA6A51D65DEA26CC0652F149BA86BD366AB2A510CD5DE9B163
+7601EB4273B0703D5ADA2126FA5472CD4FCEE99AF2A7AFB79810433DC93D025A
+9CDA1E3D431FA18BBEAB333A510083A1F76A718723D43635826B51868CC0C85E
+F16A2A7AF39FA6693A605A65DF42851C444F61CA38E073412AC89E7324997AD0
+2B709EFE96F05B0FC60C4A3C804AF6D2A6C0EEF850728CA7DD5419DF8BF1C324
+4DF2DB944A683FECDA2B29AB564FE6F659037FC499F1D6FB7A6374C5C336C8C7
+4591354CB1E6AF135261AA3222FA156E6128F3EADD591030F59B3D1F0619B506
+498CC2EFA72C35E88EF37DCBC6CEDF837C522E88A5652F947C5407D8FBAF2448
+EAA1F4C03A8A0C173946415FC06B4604F77952C5913E4263B741CD9B1512912B
+0CF9D89F82133719BF9D48C7127BDFAB0B2801134127C23F84F8AC313E23F91E
+2D357B97A35985B1815E50B645B60A837D530E8AC939EFFD5B336659BECA5F2D
+F45CAAAF2BFC57BECAA1A80156CBB1D82FE32639981412B4798501A1404F8458
+0FB53F483971A364D4E4390EA18575885E29ED8C391827AFAD7126C1A7A43E9E
+2998941601EA863F89ED0CD76DE298D594D167DD4C11C161D54C804E8AFD78A6
+6C5A1AFC0C939DFF1659C4853CEED6F1BBD689465EAFAA059AA41CF4226C7691
+71854745CE754500AEF5C77F1DBA47C84C62DDB4F8FBD127C29483189EE00F67
+19F601A4C0A61BE1ED927F76A8EB787D7EE62E292CD2AFB1D4396A5338AA16A5
+463B0C8CBE73FE4BBCD4517A4385A77971457C554FBD6DEBF75F696DEEA34C2F
+92C01471638D82ECAAF13DFB18896EB5E3D52A5F10E22CEE6542F7DA10E58D89
+CEE3ABADE7721C75B83CDF45EBDCDD258154628DFDF883410DDF7792EF5BF4F2
+27F56501B7910D6D39AD509A4F3163D783E941AAE24579B3AEC898F21DDA9016
+FEB7D49022E004AB49558C877C3133754BE99A3C81177D6517B0668189B55581
+49AA091B3D6E3F1933236F546F4652D464447C44309510BABA869E219EE32BD2
+3E40A733C45A71C79B2116A36A71BD75EFFEA12614AF6E4F8B3329D407D951FC
+2EAE537C9EE872EEED792D89FB56C5F0840F804DD18C1256434E58FDB0F15735
+B6EB98363E14CE4EFA0AD8A863018B924F4B4A709D2F7ECFD2C2BECCD2775390
+8EF8029AE33676EFFC5E283CC3376051EBF50EAAC53EA76BE589043E6862FC68
+D7367F06955C799FC4FD98FA4318C8B8A3874B84CF03AA2FDF381AE8D0FB2231
+FBCC5A144BE7D4F9A1449F9C2409E712F3DD107DDB167695843FABFE8EC31DD4
+A660AD9E7B05BDC4122034776412FDE112C1858F79994E3D5000513EA9F8BB94
+7E58D1BDBF9CB797585E16D6BED350A5AF0C999E409D20487DFD21D881699C93
+461F925B7930FC6867372B0D6F7BDA3BB19D8455194961D9A888F27B7ED3B1BB
+32AC650E3510EB4A563BACB079210D3B787D153EA12400590A01871C5F7A29B3
+036105A1513ED6DBECE39E7A46C9B47968C083A01C1DA428D5966811F5AB756F
+96548832B6EFEDA43C534F4CE9A2F3760750C4341C7A4407D69C90ED68932F02
+49DFA7393011EBB581997FE9FB9AA12A43C15DB1C0211D5A4CE3C1FF8E28FA0D
+4A5FE81501EF0ED2E1E2E014B613A56DF164E427AC960FF73391B054FCEB8AE3
+94545520941B8257E08286037A7AB7633E6AC7E37645455A7173A51FB9EA9115
+888A5FD0D419CB90A7D0D6F64B57B76FD74179F8A1A162F0B9D543BF53BDFEBA
+3B4ABB7BF27FC1030C6D1A188C595BE9D59F9CA8F3C43678762F6B01408471DA
+D7AE01D940A59B7A50D9C0143C0744CB90FADC94A7710450BE6437062D48E8F1
+A34326E9C68CDE3B7E6185E793C0AF505DF186BECEB66667EE0CA04B006ACF8A
+0CA407EA918AA7FDCC40D851DC56A2701E646695DBE56EA4193200D98126307F
+3FA547ABB75EEF2B33EDEF1371D7C068BB1297CD9536BA228C52F85F2372F3F0
+3C80234C9F6871D0B76687312516EFD1731F9748A14DA6978C86219CA674B267
+DFCAD0FD7BCEF477E0EDA4EFC48161C43D557C732052C5E62AED8C0B00D54A11
+FA51CA87415563603D7CAA21E29C84501DA0777B154F5DE943701E02B811366D
+05F520C9E4D53865A3060A9739CB6F6B997BD52A705BEA845DE404392F4DDCB0
+783DD19069033E1D3E095C4804202214A7E2D19A134D1307E5A121BFB04715B3
+5B989751F514B6EE5763D3A8FC64BA558C71E26834144E088FFAD3B183600D60
+A5FCEAD02C1418593B8F1E0DE6FBF324BDF262024F7117CA742260942588093D
+C08185A90F23B185B5F95767424C537DFDEAD50CC7FE3B8AE3F5108873C9C7B5
+8CA586AEF7B7F6DDE202FC22740954A10F6AE3E8266CEC7002B9F2DDBCF64CCB
+33EA716C6E1B7C0FDC9A8B697393C7FBFABA175FAE04618259614B035EE13E7B
+471ECB2ADDC4AFD3ED49FADEE0CC434375A0EDF967011361466A900CBED0E761
+5C9E3D79CC8C844D423ECAF271FFA00B43D3887B9C8860593930D17DB4C20D2A
+1E23B070B3C902FC1BC1A88D98B4EC513F38CDF7311717790E1B90B411DCFEC7
+6F238FFC87D1DE418640779C6618854E8DE423A48AD87791633A000DF0BDD49E
+F664C20CB025F17ABFC8F606754AF229638C6C0D211C0AD3AA8AC3C9DD5D624E
+103854DDA2A834C347E6F242947BF06EB5DBF0D3066E24B8F7880238F72D0F0A
+88A4B5A4DB11FEDDBA112D89C755B3759B187F4E12DB3D90CAFEFD91DA9A160A
+39A7749BD2E7DF4946457260C6D895347D074CEC06CD3E442DF682B32A9C4753
+CBE4E0F6BDCF150945268A7FE5C0BED753FD298381B34EA0829B2B94DC38007B
+B72D0FCFCA0CDF5846190A24036EDEC853AC17BC40FB9BA2F62E96581607C1A2
+B68D50F3F186D48887A5E8204DF84D7EDE2E619B66D2D2AFF968F453D8E585AF
+2B2FA4FAD81094530172426CDF5CA0F876502287DD1080047E31D18D67704D31
+07F0BA091DD050E4660FD5DE4912AB5D2A530035ADDA20AE61DCB7B30981309C
+3B6BB005EF8729AB0452697BEDDA5DE5AD7D54A1D1454DF0134203E618D02A10
+ED115131B03939E01F741A8502B88BAB4D82C670C76E7F4E8592D5D6A74D81D4
+9E8F3EB18622BE1165050D90C8681283D2476D6404E0B7197429D0F81F1C846E
+0FF2EBDBBFCC289D692608F4D82DFEE8AB1D2644195AB3E433C264E991F6E1B2
+E2B21DDBEB4E46E03537B4C3595050E65CB525E082D690240E19768AF062F89A
+2970A5C9CAEE6955937196192FCE3D42106B20AC488463B28F5B028B809529B7
+0B164044789AB45CE8FB40D70127B1F3867A1ED544CF8C8CF2E24BB6E1A514C3
+E25E327E51972FBF7E0813FEE52010E48944682FA348A67306E0166BB3069925
+C670F6954E85615EA2758DACE93EE89A43FD0BF53DC7E3BC68966B475C00AD65
+73A9778723FBC930452393FDE06823A5933CD35703C9A327AC36644105AF9277
+A0CA9A3DFC4BD348D001680125321712BA71B16C38A5128985927FB23869EECC
+893DD2688367980E7F98E8BD83110464E38EA770B88303AA1DD3F2D1D65A41A6
+EC6BCB3290B82486031D3DCBECD1E6A2C428225F56B6DD66668DEA84CE146CFB
+9958AFAF934A5FDCCCCE7B99CC8002C27DE55D867F1B9158121D04D763D9A3BC
+D0D8D87AECBEDBC250A2ECFC6F42E58A8BF069DDE94A4A162A6F76A6790EDABA
+E564B286BF200D33D9FE6774DA9BD91A1AC4E0906CC8EED350A232FB35C084C9
+3C521EACF914383169C274A83F4EB79F5A0D10E63CB8338366E3273FF831B05C
+B37840C7BCCD97B54A954C2542B5DFA9688F2735D993F7ED2F369B6BC37F8B78
+519AB0BA4C936C16C41724AB96F5941D4C6CB6431509CEE02073115C00FCD01F
+6F4B76C2F997BF2B9F09C53613766A94E1B466F9D434B73B35173DDA365EEB4F
+5B48E85C9CC0A50767FB61D7FD3C6CFE2DE088FF06E1A5DFDCA921A09D73013E
+8E9087559F081324576ABB53AEE66FBC9D248EA4DC6ED1BB821235C6A1777319
+FDE6FCDEDC54763C3F822E500D0D557E934631AF88E10BCCC06179708E2B3A99
+0172B0AB69E47849BA8067EA14C184F01CD5400964BC603DF20DDBC055936BBD
+E6527DAC9B198DCA9C418AD21FDA370D2141D70CBC8D15276C21273F9E1B93FE
+812BBEE4B0D72ADB4B593DCE83865CA3F5ECD20EE28225B729A6800E8FACAA6D
+3C64CE11492B491D15C068B37DA58360F9A7F9B9B65A508848E12B83F7DB7FD6
+772033A989B34E46955D2F4C0630494302CD9AD4247DCAE3EB91F67D9544E88D
+8FE84ECACA113ABA1D8555FFE1ABD0F431FF157C8595F4397FCCCB80D5B2B17A
+0C601D43026FB9ED0E9E9C46CB870672C1324D7283BD28E9693842269669F57B
+2EA2D0DC1A8757CF6C583A3235311BCD01539AC00ACE6ADA5EDB20306C469ED9
+73A7DC687570AA2837D3877AD51E17E0A649078E73895ED7A5550E1650A34B33
+72C2EF569CDB2242AB91129175F578BA0134635A03C04F684F7982CDA57C9E90
+4B333E4962ACA9E2686FBBCC0FC2606A514E683AD8351D9795326091339DBC1C
+D5B547E449096CA2A71D13DE28B967257F1F0731E1A4ADBFBD6DF74D6DFFA5BC
+08C4C2AE615ECD20D52BD8EF537DA2E0FEE314F1D60928A87EFC7A42C4B167FD
+537F9256E03CD8D2EEB07AC438E55C33FDBE2FE4438F6F8B29ED01D23BE33F0C
+465B0FBD1B55041D16BD5ECB92204B4F614024190EF4B87C6D03EAC1EB863005
+D3AFE487D1686A4A356252745101FDFF3F85C162AFF34B2063E6B2DB7749653A
+D3EADDE7C1FDA2F246CB3154737E277509925ED8DD86210C94B64BC7B8C4A037
+9F4C147CCFF8C2C1C431E1E8E5EFD8D49AD10E416A2DA4F45092FD499E4025BD
+93588050EE9907A530BE3FF8BD9A4BE19526AB3CCA10F70E702E90C72BEAFC15
+C66774473AF87569AF99B516CD67F2F6D26DC6DB5508AF6286AE547BC63F95C9
+DA6190EC85F3D8605DD1A7A42C7C7B60DD3BFB8E84FE0F584D8A986BF0EDFD3B
+33B6C953C8E69DA03A5D0C5DCFC66D800388B2E4473F68F52CA474FB8F1E4D1C
+F7F5119CFEDE6F45B2C6BA1E0B82DEC953A26F1104EA8C6EED38B065B02EE952
+4D7CD7FAC772D6AF3862D8FDCF7BEEC514795BF37C14D4A502EA7E10699E2B99
+0EC296F769EA6C20078265D25617B1225C7D7EEDA1A10062216EB83EBAAA8CCC
+A1C750FAAF6F44246436DB8C2CA7C3010ECF6FE9A66BA6AF6400618D170DD44F
+E231343E2368632C89C738DF38F618DD9774B75EE2B146690EE6726E6462613F
+2A6F47522F1843F126BE21A8FF4FA0D9E6AB154ECF0FFA138E036C57D49ED1DF
+517D36CA6171E5C4A26027787F2DE873B6438C55B7CFA023CBB5360B60C84496
+130968C3DFD4F16608D310458725E904300D304B660F5D6962592C7073B2C9E0
+513F8F6D25AFFD7E743A710302CD5F12AECB08ABC02E650371A5B23C18FE024C
+9827FD131A14E622E7E3F1C2DD0531CC6B91AC9E259E78463314ACA0BC7DD2E9
+B2EC250B3BD48075040FABBC5C87F5EE51B5CBE1E167DC4E151E902403A59F12
+C4E4BD1A31E95E430EB6C214EAB8F6825EDB0ECF123AE0B980C4361A2EFD55C4
+74925A2592AE2195B0267E828F7ECF7B9F674D0D3D4D2A9FE7E03AFE8214C82E
+B97F69E4ABD689257F3987F84B31AFE10133A6A86610D497EDEB680145F0D62B
+647998A8DA295A5EDB43000C63EB9106BD35C280BBDB84D478EB316E506BE0B7
+1823AE8E409652AC05D96ABB02E8815640B33BFF08793D23A2797847C7793573
+BE9A0AE34ABCBB712BA86BC2B3D614D77CDE77DAD8D41A59C29FE2138BE18717
+60F23F275BEAEA736E1237232B4F5C9171E49C5214F841ACE919411FD651D4EE
+D0E49C79E175E2AC19B0690D7F7091665EA3DA20DE5A559D1481EC058B5521F5
+D26A8B10966B6EA55E7B23CF0333D7EE20919C9168A50EF7AF4D4E57D9E5C698
+3A0626D67575BE6CBF0618C12A169F9CA62F3273C4E790DECF8590274D7D7C20
+BED651E2C65107CFE57AA16DB17F45F7F178F8B63EA3E9969FB3D6A376A416A4
+14F809F02F8B9A5331A6A1279B19C9D4CA9D9987B8FC1AD3CEF0797F53B70F25
+CBC85BFFD3AD3F1D460DBBB2CC644109668790DD2B5AB7301F37F19FD1AD0A52
+C6920EA73858AB10EF369E5ACCB35A61051ACB6586B3B5435FB7A8CE51C16EE6
+A9DE7CFB1B7C6695DEB484A8D4A723E83B573B0399AB442A1E57793F9D6AC73D
+B8DEC23105D56BEA2424E91B9DA5CAB114BDC3636F0CB34C60BF1B0DBC9174A6
+A8EEB5F832D3B44BB7593250A6ED065309DEDFD9A1B3E57E10CD1C651877151D
+B086E2D82959C3BB999C11110C2D61CB8278AC65B013F6A48D501417AC494D51
+E75F579246F4449D4D7B83612A4E80F65845B8766E95EA5129F49BD80CDD2E96
+60CE7A6EB6DFF8E9E94A77A0126892D661AD2FA3D587B7260ABF3A8449A43E9D
+1582D0D12DE3E35F3AF68BC48935487A6C8AFF614012FFE86E48DA54DD62B510
+BBCD311AAF2472B2882B0E1A8E4A0B37DCFF968A7F293B529EAEBDFF5861E56B
+FA1009DF759867512F68CFD8F01A7122CE07AD3F409F809E3B6A6FC0C5244229
+9199342EDB58E0D35B6519443411794978DB0BBD28E736491B0F04EBE14B2C1C
+3BF6EC7CBF1411BA50AAB52088B88997355417A7049F389C770F1D33DCB3CED6
+0ACEB141033F237611D473191C1C54467391EF4BEB3A64241583A603F3C79B7C
+2F0B75DCE77C4C88A1AC382503FE2F6421A3CC5824DC16AD7537BCBA4DB1EC4B
+F336F77352683BE1546356CCC9702F24DCE6D1F84AC55DC7BF562B6605A36115
+6F9D6ABA30A043C99C1A0194879AE635B4AEE1C0F0D515018F45F9EC58DD76A6
+EA0DD8EE108EE353D8CB3AE7A6E4C2391E24F4607A688E283ACF52199E20902D
+F8EB7960666C8552BFD487F6BB348DC50189B03F0F959743183B92DABDE7A8BA
+E1DE007CDA5802D6B2F00553B927D9B787630441C04593344EE7BD12DD085A64
+8FB62FB4836C5AA2B1AC7400A00C038E55DE2FB9AD92FEF7EBCD8F11378450E2
+83673F87DE599C80786B0E0BA22356CF30E9D2E16E5D27FABD579D71D399AB7D
+4485299038F6813CF8C5063CE55172E3989562DB517522BEA73A4FCBEECF85D8
+AE4A4F9CF3324EDCA9EC981DA2264FFF7284A15E3A30DDB7E347072193D0BA4A
+08A127B89F591E2702A7D4D6F95556140AA417CF5CC62D69F9457E0215AE019B
+1A8970E87074B208719B4DCEF7679D12D771DE2A01E723391D59DF7BD0A7326F
+B5695926DC92E40C177389E289200909E425D1CD28D1A19E1B1E4E41682A82C2
+7FDABF1AE57DEAFE7C395886E06524AD96E214725129A3ADF8D515FF3CF78CFA
+EF84B53620D5FFD99B1EA3F28DBABCA650B046C320A028426C44D2AE3953A9D9
+46EFD717B838F2E3FD8FAEAB40F2128F46410F1431440F60326A1198889CCDF9
+C2F9DD3D119A9132541FF09116A8C30C6E8CFFD9AA3EE31E00288566F07DC598
+D7234FDFA8F8B068E1062998F8EB6B4751CF1D4FACF98CED6581FFB46990A524
+B382A1D65C66D131BDC936A1A1834E3CE36525D63BED86416B7B7F1D24564D25
+A60990FDD9E9FB1C1BBE5FFF5DAD9D8525AAD7B823B00EECC9373D671FBA7B8A
+5166B2B4B72A93373FA9063DE4B22D7A6D1859EEB440634DB57990ACEA84D507
+69409DBF24C5A96ECEC2DFE715643FDB87703A4B42EB6D3ED5D5FC117199E324
+FA36C00AE07A6A772F6DDB48BC19F6255FA3583BF967ACD54991A78A5E3BD803
+C442C3E8438813F8E4D040FF5F287FE9D9D450F5420AFD1BDB7006A1C2965562
+D8B8BB8A8DB9E8016E69C25B6FEB864CBAC9B1635F78E57A0167E4FBC3269286
+A829BABF548377EDD4A7A7809219941BCF62160DE5EB11A6C3F73F22EEEFAD6D
+79349CA6E83DE5F014989BA7801172B7DCE74B1CBA05563434352D8CCA8DE220
+3FE92EEE6DBE5D0F15E1E4A4ADEF7BEF05DD0F5A066373B47C98CDA85509F685
+BB0A9EE13E239C34BAFA19DF1253BA3E03FBC1FC85D5387878EF5EE62B77D254
+5D7468FB55B9D5EFE11BE32F7E7FE83A8D60B15480674FEC54CE1DB50D05C58A
+3C3DBA96784AFE89468FE881C7D5E569A6387EB96A2E6C0293FCCB29FD5E3022
+6C4DABDB07C4D2B211A6C7AEB61E6151FBA636EF6403BA6C7B8BB793C5F4F7D9
+62AD6160B6705BB536C7C4C6B6049ECAC5DD72814370EF535444C611CAA0DF1C
+CE66A641A30EE8B3B8703410E55970FF5DD77E5B3932355EC6269102D7D9CEE7
+D3E78B00DB3C002CCC5A5447A3568669EBA5133D5682AFBF5589AF5E5833F539
+D767B8BADE673D65B88C8297428CB077E68FECDD2387C58D7C3EB9E545CED26E
+A1D7370F2F4DADFBD9722031A72FA1D3E8F564378D08D5D9B05DC16D1E2C187B
+C5D20ADA34B3FAB982743B3070977EA4A9CEC000C46CB79BD3E84F30D1A2D334
+6B0771A66033FCA6813F22300E643E33B130939236AA4019AF8641D0D5974AF1
+88D18EC8B25EE465FAEF3E7690391E33FA8EBF2B43A7622894356303D6E7CEB6
+FC2FF5050E1A2D21D61AE6D1F5641EC7689846BA4B7EA87A20D309EFE78C9DE8
+A10251FFB6A4E0269F7A37F566A826B1FA2C55A243769546A2BB9D4CDCF4A543
+029BFC4425E79307F1A3EBF4D5B8EA261CC4C0320E2449A381E9D8E4BA7C7F6D
+340FBC8B3C50B0E59A61E9782DCCD9BBD23D3FA9C54230C5E1CE3D0A235F33EE
+7D8EF251D33EB218D57BCA368487B0B6F7D5792CEF0B885F71DAED5BBB17BEFD
+17DEB3C15BE0F452534DD61094C298FA9B5CFA0E96D091A2589D0F69C85F8BDA
+59936C67A80AF924CBA0765706672940476C91C76FAEEFE48467FF8198468BF9
+238E2926377C2CC141CFA2B4FEAC7117FF081EF0FD3B2B48028D57EA49B448E7
+902D0690096EE6C83231FD32653432A231943718F6BB9DB10C534730BC8CF192
+02973DBD125618EF21BA17142C8DA4099A6B530F36F9C782436927BB03B9A761
+77D0ABCD53BF2398562C623260043B3E7D041B5C2A244DAAF6B57245C6A977CF
+C5A34693D558DFEB02ACC7C08393E21AE88C22E3C228A2FC4B000A14664F586A
+FAF41B2DE959CC3F58FFEBDBCB3D8CECC85660F8F6628643AC63EBE17C02A6D5
+BB3965D42559D47EEF9A98A3DDD12193A445D678E53E55A8FC95A96F3FE1F0BB
+825A0A4F158F54097880ED2DABBBF7B6DB3FAAFD59E981FAE49B79406B813E91
+DAA2AB3195A5A0CD655516A92157BD59164840B4F4A7D266B9474BA220A48599
+1C2B1DDD7BDFBD99327D677E45698F80353D43A9BADF034824473765F0EA2F10
+44B98499FC974CB913C4B64E1269E6B5BC912B34D0B89FA37879A63B93A91256
+553416F94A8B00EE325F328631787E37C9DF3AA9D7C2041DC58425FAA5DA0CCA
+BE2971E437FE146D557ABD238F8CA06C5E2966815CB4B7E1DA75A5AB83617E0A
+AA0DD4F5BFB79225F7D083B6380EF342D6AFCE6B18FBB40EEBC845D20632385E
+8063551716EDF22F257487DF1904618ADE7487F6708FAB208A911399351F71A1
+FBBE41602512D92CBA6CEE36043093FAAD2688BB0409D71B6B09C61982EDFFC7
+1BAA404D3ED854ECBFED7E9D4FCA1DF74F5BF05A1417E973C308CB805B4336A9
+2ECEB6CC76908C93D627C557B3BD77018F96DEF4145A9DDCDDE08E47F80626C2
+489C7042DF12A37C574FEE56DB542AED908C22600F22D467B8F50F4C4809015E
+EBE96D4A6288A07BEF0D73690D7FCB45995F0701D0DF507675F59FDA3DD997ED
+C349ADDB576A6F2FE117CD42978CF975246390610DF22AB9BEE4BC8124FDF869
+0D33C973FB6242981DD07E21EA24F0C4656EF450BE15FAF83BC9B5A5C38C2D68
+99412B858E80CE9ED73E513C8A169F9490C94FD74C837D338A2F627E481F09F0
+89B319F6076A70A0AF1ED9E4E8C6C9C0C697374BE102466C5870E7564C692899
+9A0FAC9A82C038FBFEBB2912E8E335FFED0AA2788856144EC2E147714075988B
+FBE652847CC46ACA47F77EA672BA21D6B1815071B85ADF862DB0F26928761F55
+92B610D5524839CACFB89A0C1C3A50063710BF3F85E48748352ED45907122625
+3D1270F4548E6893D1B25F6D0C1384DC91F6400B0AEC3BF07F634716844689E4
+EBF65C1BE2A5B31B111BEC0AD90E4D571F67C0F28A57878D2B93AA616FD1E969
+1DCDA4FD3004CEFB0536057B412318E69D9E589B852E41AB1D79C88A214631EF
+6F407003F1E303C6492BA95F475F139E9A508134E39FFA501C01F5979A062085
+E07149AAC966E190DF1C10D6C197F7D90F388AE154B401102B7155B48B5E812B
+BB035E4BF85504F0F6D73F12F1871B986DB5037FF1A07BFA91010C69F7DE4D04
+5568FD6DC581C20485C58DC87296AE14D94DD4EFCB90FC49D59B3A24FD5134AE
+228F9D6B522B9D698D82B01A2598991D427324AD1418811A30039325134A3991
+1900B9F104CCE14A6FE8060192A9BD2272390DA86710FA38968F84A0EEB722BA
+647850892C21E446C52CB44D65CE6ABAF963EF7E4373FC84B8C1C024E21D3EA3
+B9EBDD9A7C55A6F759807BFD086C78CF5B522449B1610F3BD0590C97B17B26B5
+4EED5D1395D9BFE60ED37EF4B00CB48BA1A904C4137433067EB2AEAF35030874
+D0C061F2C83B8A4283ADB386201192832E4C3C5A47031D6AF00CC267F7DE8449
+73CE55232992AE3E71131A18B348EA7D0118857000CECC69B80BAC3EF6508999
+27CBFCC211314D256E112BBAFE8BE0063F85764E2FCBA821CAFB9DEE8EEF9B21
+7B7F361B8F817576F09B9A8A33CDDDE20CD30E5D07BF072553CD55FE164112FA
+CEE7AF710FB84812E334ACBF603E21A3A1B78AB470B232041D75E041DDAAAF26
+3F3D9267E9DD307AF620E16B50064D8F5C8F1E917C8608405DE1EB8B1AD1FE90
+6EFB0F29A9540F9A0FFDF4810CE7CEF183A6AE3DDF193ED3C6DF3DFCCF989C64
+37248688B532CF9B91750A86768DB6741E2DB3312FED357B174AA9318DD6A78D
+25456E6D80B32495FAE60E5AFE0AC1A05D1D8FDAD6288CC6CBD3EF14B3B87058
+454841B2B5D37DE3ED4E5F0FC4E684836EDD69BDBEAF3C4AC483666715FF6075
+98313AF84619C2C9AEDDD0D20EF2CF95C56F5A910C628DC242FF71BEF79732C4
+93B3897BE143B1C74942F124F194EC904BF92B677FAFCB0A85C3900A75B1F0D5
+CEC1F977AC17C7EC394718CDD08AB218211A5C702FD4246E5737959F527847C4
+C1730B0AAC3E28DF726DEF7BA051EAF425E442493C7A616AC70E9658C95D417B
+29E655827D9630AF834C87EE85419F4AD1D6F618493D3C610F1409A8FFE3E5C8
+43642A161300E6C90151CD21EE11DA13C7925B7D5B44C59AF3565D89C7D9594A
+66C411A848E067424A23B13EC03FCB090A15791CE346376241809E3851388F9E
+BB90C488DB50AA60ABAC64CB67DAE8F374F2C90CFD3D8B2F2CCD41740EAE2349
+2167952F63D005C9F1F09E6DAA22077F7998CA1209633A1F719F2EED5FB3122A
+52F67D1CF0FDF42324A6C86EECDD300EBFD9494430BE5B462D70349BB64C2508
+F0D7FCA414462DD4F3CDD0C531F385179B316B7B043404DC4067D450F81366F3
+9D3BFDA706859CEB1DEE3E62C453344BB48D69D093B7B15B71FBC503E2414316
+ECEBD9F7E25C20F06F22469902954AF3B2A128F76C0B7CB6357A5D8402EDAB0C
+F5D5288D07CB484B69BB687608F51611ED3AC3780D11AC3AFA9E804EF56D8089
+64ED8A5F0589267D8330F17580BA3E35517EC2C692A66965BC089777DAA7C8E8
+9D419BC85C6DEAD167196761928B28C212B4B88A83096ECB68B84EBE98D97C85
+293B8CB1021DD541EAC2DAE1087D6464A74CDC165479940C9425D636619B1BE7
+967F7259D1A536B2D83EDB38E473311E1FD0C02A31EF851F3AD001482AEC0D9F
+D507F00DA975A2EC33F5DED8D6DD551257E20930EA0497E40C692CD76EFD6012
+2FBA02244EE7D0C540D98DB6B33AC5472AD9E653C1EA35FB2CA5A7309061E28A
+096617B9F6A34A017A42D2A13C7AEE8D875A94CFDAEA73E1EC32B2F4F0
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+%%EndFont 
+%%BeginFont: CMBX12
+%!PS-AdobeFont-1.1: CMBX12 1.0
+%%CreationDate: 1991 Aug 20 16:34:54
+% Copyright (C) 1997 American Mathematical Society. All Rights Reserved.
+11 dict begin
+/FontInfo 7 dict dup begin
+/version (1.0) readonly def
+/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def
+/FullName (CMBX12) readonly def
+/FamilyName (Computer Modern) readonly def
+/Weight (Bold) readonly def
+/ItalicAngle 0 def
+/isFixedPitch false def
+end readonly def
+/FontName /CMBX12 def
+/PaintType 0 def
+/FontType 1 def
+/FontMatrix [0.001 0 0 0.001 0 0] readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 0 /.notdef put
+readonly def
+/FontBBox{-53 -251 1139 750}readonly def
+/UniqueID 5000769 def
+currentdict end
+currentfile eexec
+D9D66F633B846A97B686A97E45A3D0AA052A014267B7904EB3C0D3BD0B83D891
+016CA6CA4B712ADEB258FAAB9A130EE605E61F77FC1B738ABC7C51CD46EF8171
+9098D5FEE67660E69A7AB91B58F29A4D79E57022F783EB0FBBB6D4F4EC35014F
+D2DECBA99459A4C59DF0C6EBA150284454E707DC2100C15B76B4C19B84363758
+469A6C558785B226332152109871A9883487DD7710949204DDCF837E6A8708B8
+2BDBF16FBC7512FAA308A093FE5F0364CD5660F74BEE96790DE35AFA90CCF712
+B1805DA88AE375A04D99598EADFC625BDC1F9C315B6CF28C9BD427F32C745C99
+AEBE70DAAED49EA45AF94F081934AA47894A370D698ABABDA4215500B190AF26
+7FCFB7DDA2BC68605A4EF61ECCA3D61C684B47FFB5887A3BEDE0B4D30E8EBABF
+20980C23312618EB0EAF289B2924FF4A334B85D98FD68545FDADB47F991E7390
+B10EE86A46A5AF8866C010225024D5E5862D49DEB5D8ECCB95D94283C50A363D
+68A49071445610F03CE3600945118A6BC0B3AA4593104E727261C68C4A47F809
+D77E4CF27B3681F6B6F3AC498E45361BF9E01FAF5527F5E3CC790D3084674B3E
+26296F3E03321B5C555D2458578A89E72D3166A3C5D740B3ABB127CF420C316D
+F957873DA04CF0DB25A73574A4DE2E4F2D5D4E8E0B430654CF7F341A1BDB3E26
+77C194764EAD58C585F49EF10843FE020F9FDFD9008D660DE50B9BD7A2A87299
+BC319E66D781101BB956E30643A19B93C8967E1AE4719F300BFE5866F0D6DA5E
+C55E171A24D3B707EFA325D47F473764E99BC8B1108D815CF2ACADFA6C4663E8
+30855D673CE98AB78F5F829F7FA226AB57F07B3E7D4E7CE30ED3B7EB0D3035C5
+148DA8D9FA34483414FDA8E3DC9E6C479E3EEE9A11A0547FC9085FA4631AD19C
+E936E0598E3197207FA7BB6E55CFD5EF72AEC12D9A9675241C7A71316B2E148D
+E2A1732B3627109EA446CB320EBBE2E78281CDF0890E2E72B6711335857F1E23
+337C75E729701E93D5BEC0630CDC7F4E957233EC09F917E5CA703C7E93841598
+0E73843FC6619DE017C8473A6D1B2BE5142DEBA285B98FA1CC5E64D2ADB981E6
+472971848451A245DDF6AA3B8225E9AC8E4630B0FF32D679EC27ACAD85C6394E
+A6F71023B660EE883D8B676837E9EBA4E42BA8F365433A900F1DC3A9F0E88A26
+30F19E1BCE69BC499D860F9B17E6A78469F652E469E22DF3BBBCC803F7483463
+96F1C811AF62FC36891457BD3A5B988F62177864939C23E86BEB50B9FD0D186A
+1C14795945646D82AA97F66F6050F81D9279AC6CBB908C7E1F96E082B31DC1CE
+66777F3D7C18637E94FFFD28171E19E178CF932B38A8C1681877DCA0CC4BBA17
+250D9C00BCA8F753A4D3CCF503528B0CA11871F2F0E1F400FA9AA5894128D07F
+CC739AA7B0A8A3B872647E1BCC9F015E007F208CECB08EE15C91ADF0F06094CF
+A1A6ECDF5BAB53B67395C422F009C511570CE39F739F4C5187386037AEC9BAF3
+434368015408A4317115A1A8D296CF477E67C0A49614602F4B9C9007B2C78024
+E33584D32B6A1D226044CA57336FAA01585F3BA39D9616780FD6C124B63F19E2
+F20EBCFD23222358D8229B701B2703280E0B86E4771AE2C5017A3BF22A545246
+8D6BC985C2220034A34E0CA85BACDA735A9ADB3D3981E04B9AAB9E11A959AFF7
+0AC9B7C54AB816E2CF48178CCAC839D1216AF26D93547F242069F877ABA93E19
+45B75BC79A45D12E23B40D1D28074AB7D20597B517E0AC38860D1D0048661999
+4A424F6983DA23E0E6DC06D6F7EFFA87C88EAD1AAE2BC85574596B913279BCAE
+B535042306ADE5EE2AEB1FA1B833D56EE907B1FD6838369000023CA728DB364F
+6C2012E4C2614E0C662F88E2FD02B32499CAF6918DC050BAD957D7B727927B10
+24F98C9B780E6FBED86B63795719FF60F0EB582D4A5E9CDA6FE05D7FFB0625E1
+FB94151065C607914FFC72D372399283A48B6AA96421974F5AFC60E28BD25D48
+B28BCF78428B21EB03A00C878246EF8BA2A2EE7DB6AFCA47EC9A02EDBC55D2B7
+929A0B178491A4C483699AF945ACB840525647C9E7F55E11BDB76E2A6E3C2828
+FFBB5DB375F4E15293B494868FF31B07860BEADFF66311130A0BD51D976287DC
+201EB34FD81BA3274938CE0A3C68324BC9FB70C00910D7C34D507B529EAFC6CD
+24CA11385CBAC30928F4E088960C773020720312A7CCD60EA5F822E12855BEE3
+7A734C12C8956A373AA7658C809E4FDC280E3936D422FC50ACE01A66C73A4636
+BFBA5F940E08F3CA382B540FC795D6ED2D57190BFAB1430CE08F39020B29BF2E
+B1399B2D3292AA99F892520F88C5A0FF9B479ED45721EB772BC18D4DA9CB02EA
+54BDDECF4249FBA0184EEE9990EA902613B5F6D55D5B010D19188B0B36DAEB75
+922A7AE22ED53A34AC47FAD7E72374D47F349943FBDA4731D2E1CF30BC103F4F
+575A03E46F37EBAFE903C74D81D8D3F241516021862D9E203CFC1280572E0C50
+359D4E87B2976C7F35334F4744FC78E15DD7979F29308148494C2A42A2FEE1CE
+FBF756BA8683B7AB065FB07F666896832A5C83A2B85EE546FCAC2DD870FFDDCD
+19890A5FD9D88FBA6AE267FC8F1664270F3BA6B990BE056AC79E55762990CBCB
+D8D60EF5A747623D719C6A76414BDBBE4549D31C15EE2DD02D452ADDD22E64F8
+CD13525C274456A216AA919EB8B6CC3692D9128A76B03566CA33C1B0C5E3158A
+0722E8236156F1B51302BD02C97D4C00DC60B298E2731485F3EAEEB50A4D7135
+72DB3DE87ACFCE1E40C8602A6C2E00D6F3C7CD712D214A53BB8EA0B445BBCF1A
+412AFDA97AD44DA2DFD293420DE95B0B88584B2CC79AEA82685006BE5C6C783F
+9957D4B1F77E2932741E056F3FA78033BCB92FDBA00B2E498FBF1000DE6D9DAE
+299CD854743A82032DD62F04F4BFA9C5CD84D22F2CF7013C2CB6AC249D67AB12
+3396C3B333A5CBE9A97E4F07BE0DB2C71AE4EF79DF3DE952D7E473C5AB2EE898
+4968FF37D409DADF2432B774B5A0BA55AADA100D27C96102BCEDF0440CFABE41
+19D49D6BA5A8A887EE02068CB1788FA378CB0BCA436847E0925C2F883A980158
+694D66927C117212493015BCAE200249B7758DC98D849B7AEB32C78B2F1577D1
+1D91912C0522AF14F75DA48A197229C2BE08B6F8F52A839AB507C8CA524FCF24
+C91DCE6C53D784D15E691CDA18EB40BE0A7C3B24BCB99F36F7E8F77C45EF87A1
+A0932AB194A0D5E8DE4C567C6E86EB3E734F89EC1E4C485D81B90D505FDEE463
+B4EB9DCE53CDCDC19F4F99033DB2ABF9698FD153FB68576A25FD188B98CE1BB5
+B7FD420849C0835A54391C28A169F57EFB53AB29B0E9DBE776E37C04A6D6BD91
+20FCD689532059A98B4477107E868A123B273128F7E747C0F0724811DF029AA5
+22C2082D557EB8CE9DF349450C4446B4B1DEA70CC1B146AFECA06A1859D212F2
+BDAF41ED546BD1057F6F6AFF46FEE60FE8380E8899F71735D2C8D7EB9653B027
+68321432B37050229B6815A8C4A1EBFE19A76109EE29800B88E6C528054A17B7
+395CF482AE62445478D6F41C0E7B8F78313DF1DBED339E389875A8E883867921
+1AB53CA0A3980594830B13200073F966F005D1B1402877CA4A46485318A1B863
+24464445E264EBDD3567E9273FF01016EC1CDC142FD9DBF980F099509F330305
+3B138C51170BCE3D59072ABA6C241048612434271419A80DFDD1BA156A8AD54B
+39E45FE64F1B558A712D93C46D729A1F8B364CBECA67A618FA1337247C08D0CB
+9B0A418C729668147DEA47BBDE342C2E0E29A83631077DF34C861EDC9E80EFEA
+75BE3040125BCC60D4FB69CDB78C25ADA72F2D104CAB8D3FBAAB5E8931A7B8FB
+6EB41252542F302C11D3DCBA66345EFD816D9623BE2019AC332577E1CE8E6A8B
+3DA487BC54B82EA9876961A4968E772603F37936C5ECB4C14625DC3E36E4BE99
+E692EFD3AD7B0814DA32B13D6C64FCE750F80E5985E708E54C7A545429496894
+6451BB8608F12DEFBD585ED62A2452377DD91AE560D14E54C9A449FABBD16F26
+AAD76026066CD8F5677BC18FE9F9BF89344D90B454B7A7FF20A3EF058816ECAC
+D49486263BB4AC87ABBDF43D8BE4A09F0DEF416C95AD8DA91E187A5528390F9F
+FE96D0CEC53022F1DD7C565ADCCBAD63B1105CF11DAEA2D2A9D827171CDE1B90
+0A71D9C2C782B74884C9605DAF063F99759079E3A821196781C756614E400149
+A6199699F5F2AA97859FC36699F86504D58BA77D14810424C2A3FD79247F3DE2
+1EE6CE0011250433EC504A3146827949468227E75687BB81EE40F4EDC2803F71
+CCE3BB5F60FB0E121253C3385543B6AF741BFD67158D2F38227A29C3ABA429A3
+33BC564E8867C1FBB058ED6EEC8FD0D835AAF442103348751C7AD941D1B16566
+761ED69AFCEB4B213CC9A75A1C01260B545654EFDE7042C8E7ABD0508F43D4E8
+B50E6E799A5CC8507E814EBA958EC2DD9655CBD18B018F284658C4C8299532AA
+48EA747019D9DB74DAF848CB76192C0125C7A51695E8DCB73C4BAD826A83FC9D
+AB177685DDF5CE3A7DCA21B02FBC6DD7B52B6C086B0C06AA24919A38845FB295
+1EA169C8D17210C14E712CD90099334C9EF449FCE214CF640FF39CA1DA2120FF
+CF5A9F387B3E0C7EE4904DBA33444A668316DCAC18B85C98826F5FCA5CAB12A5
+9F75424521CAF417B326F8975E6574E5C9E55EE2772FE20AEC65C4CB692A2425
+9A29F75EDF9B31C2503C6A7E79A17B957EB19D4E5E666C83AEA92A8DBDB033EF
+1628486E2BFCAC1C9E32676488BA13B3001F6AA2EA03747A3EA5D220A5F33B29
+4AC5AD623B0C9A4D0C4C6D41F89E3FC325747170BCB0803A7D988627CDACDEEB
+0D9DFE8AC357C07F6B60E90C5DA3ACF868F145237D1710895C4859A319FEE038
+D7FCC9D56620607F5392D1998C6BB1B2ED2BF4F9B5BB6F80AB0CC5A535D52BE3
+A996A70D581CE43C365EEE168ADAD963D0B2892F56FDECFA8664737A5CC0595D
+3D135410CE5CB4B094746D5CD8C3355C4BF77F9D5375334A119833995EBF757F
+EAEC6ECAD4A62B90917006A1AE4632D758D437DB443D6D7661434C9A8813BB1A
+80C5389D2210F4BFA057DA7900FDF6B60212B5747E586FB865E2FF4260B2E3D8
+0C78E003F3FD527925BCA22DFB87EC7DB2188309D8DF6C6424048D99C0CD7F18
+478740413A816B92D6A38AF0025FC79B4A8D35E2B3FF5BED4523B21E9CE49350
+AB42D25A5B42B1A49D5A468C38635E91AA1B6C835C18D5B2506533B4E77EC0D1
+CEEE1D66569498F6482BEAC3FD818EA2B3191A3A67212EB41D8C725F52937F99
+06D33486272E82A3C9B5A5457D0219A3CFFCA0F18D246AE6506915E055F2E1BE
+8678389745B28EDC2DB006A0AA5A4C6483B24DDC0F3A38EED7CF30FA00B81CD5
+56757EA8C44164F2BDE071226598D6246C8A0CF972AF52331D0D2A192C98A320
+01435C77CA0B61256EE98D373A3A8F2B41622A6BCD5AEFEB9004B90F8A9558C5
+D4EF6B36912E854014AB35841B99F6E1AC11F09F536134DE90865F721DF86DA0
+D13B6BA2146D75696B2C2DE21F4ABAC37B3C0CA96BDBAE8334E2FA6E38F75866
+FF7ED0F64D5896CC294032AB86E5C328A6B06C2225A617F39CCE8B69AFD5B041
+9B1F9FF00401D7F0C9189B79B0C2B700945EEEBCAA38A9E202CD5B68469542DE
+E9EA782D7C494CC6B411D614867B498B2C2729D65D6087C3D17956227B02345A
+FD3E8653A3D4A9CE1FBC46C7E8690C803B4556A80F05674CE27069D24563DA46
+7D2C4219D242453D06650A9522A3184246937CBF4EA2A188C6B2A71E29E0CFB2
+934B93550B451AE9847F96AE18647C09C927C4AC12846180DBABF3F145FE073E
+45C129D663E21A1F1F1F6755F6FECD1C1F7061939722D403BC2F2E856BBC25DA
+F069F39A441C837FDDD2563B3A370EF73F0835D34DA86CE65162917E84C76201
+0A5F2854830822FAA545FC0A0F77E62A79545FDCAE728FCCDF2B720C0AF9A9C1
+2FB5878E9831D42FC9A56D41904B1551DB2E7410EE055948CDB8B9625C6DC618
+F8282896C1C258608234A372CF031E5660949250072025B7EC4E535899EA8BD8
+D1CE98A870C159964CEBC0ECEA5DEBBAC1CAF86A398D9C84A076ED630991501C
+141AE2DED1688C1F1389ADC40B025407BAE7EF3AA847EEBC61DF58A6C3FC8F2A
+D9FC820DCF1DB3CD2FD32A46BE1B98D87F3D291C8229DD9169E370BB10706B0A
+606D45D65E3F9A4D5CA23DBF23972668A0D0FAD4D485AFF44AE284B91EA6BB13
+108B9E0AA5C0CE5EE80D9A6D10114ADAF14AC05569B7CA7F7A8444D75D504700
+89E7DE515BB66E320816BB61DF65D9B6DBCDF5BFEB475EB6BC93661D39BFABF2
+B542CB9E5F38AB3271CAEC60AFDE8FF533DAD806B61C17A985FA5CD8E537D941
+020D2CF7CAD6389AD73578558B49795CA5D2831FDEA1BB0BC181AC848EDD5FBF
+E9A052FCD5BCFB883C704D80D9CA06C7D147645742EC0A601F66A5D198A7B6D1
+7851CF5D65E96E4D801D87FD271D079A59AA5E96E345053FA3CF427A80D78A5A
+D5007F12ACEAA2F21E612AC2ADD7B35941EAEC728CE7BF64809270D09D469BC0
+422C3760D1D6FFAA75B0F36A1961278A5E63406E4AAED935320C68A3E5515C5C
+226488F98CAC3B04F016A03E343A9835EE8E373A6B49C685F1B02798436BB098
+DF854825EA14526B337630DFC27914F374DE9A915D77369DDD88FEAC626B0183
+EECE378BD9B0FF448EAA2B656A20102641B181433CAEB6D6A0A30A8346E710B6
+B9E2C6103103CD25CBC8195C02DDB8A6E4216F24FEC5E0F8092D9B74F7945F58
+C8BBEDE1F6993592E723AD0F343B2B118098F64D52BC5726B253BCC4EE3526C2
+49D22E2AE02CC44F11C2DF0F3AB0AE48BA03795C1ED3D5E10B1158690D402C43
+FF3DB585DBF3EB9EAA8083DE62B198E2D81D9CCF4CFD13D5F5DCCC1A07F6D94A
+E3E11DB551CC1124229C84F311EAD1EA54B30918A44CE0CB565C29C099ABCED3
+25EE19B9B1775C25E2BCC0D580275F4E526571B074CD8531C66A6302FED3EFE6
+C516427341082633AF21777A02140C90779B33CA0D31FB4D8A79474454AF949E
+855C5E1D1D9510B2759A9DF9626A2DA26B6DCF05E68ABB11B5321D9299F3D8C3
+91588707B63CDFD33FE34BECACA899612072830172F1481702541322416E3F55
+BFD2BBFDD9A4322E27576748EA043E4092603BC4B79019674A29378AE9A35A82
+42405650D62A13DBDE6BDD55A831685DE31F9C20AB76AE2337E1E7CC6B0FB44C
+FC396190083575E186BACB52932AA11624D830A58AFBB2670E39242F8609BA50
+BCB062991C4A193C09466F4FF2AC09F1E7C094F502E664F129500F2B93ACC2CE
+B916D080C6DE142E496526F0C9A5804688896D31895D0C0ABB7A0AE4918D3481
+5360C8CD618960A8F014B0AD55575C50B901C5A57AEF996230642A5C8DA0944A
+76ECDEC0730E6EFC7FADD09D9095FB540F377D460D159CCFD7059B0A34F738DF
+012B7CD8BA63A47263423A9A70C14BF72386746772CA8954C5BD1F1FC4C77115
+FD47E72638FFA322F399D7123BA9DB28022589735875F058DC05521309DE8B01
+27387F330C5489B1752B789561FAB8C92ADF7778068BC27E25C245539AD11B15
+017A7AFD7BFAD63D0DC400B369194B8D9E4D298D548FC1968A0063A7EB8FE1EF
+71AE77F99B78F6529CF9415E886C565EC305BEADEC0AB65DEABAC40DCD5E2430
+36315F52C005A9802DC49944A423F1828513EB381F24B0FEFFB99FB53FB86A4D
+DBFD7B5994FE736820AEB30AB5832ED56048A846A1388D3BA69C68180E017170
+CD6EDF246A127BD8D8D24664171024ED9E1A99279DB6B5FC91E4248EDB7EF45D
+5A9A851EDED58F11D586EA07F9D32D80BFF6112B4395916FBB5DC06BA0896492
+D9C770F973522E6CB5CCC92A08CA1F9067F7ED0A35CE4103EF73C3BEEE22F2EF
+B3445433295AFC30D464929C0607FCD7495F9A6C0F5727CD8844BC3EAE436046
+B8D484DE4B8BCE607904DBE5D01924A86E18F73C5D530BBDFE7DEEA30ECF1C80
+D10614F7713CEA36DCA8AB9DD488C57E4D0E846B48433DE35205B57506175570
+F8A0740F6B654B7C3B744C5D030827DD29952CD579BAC27E25AD67D946F707F1
+EC44D9AA1FA6F99BBC9F473FE5191C7A918951F66AB09A9AE6980DBE3CB1742A
+9D95175D440778A3F9CB5B5C9A0AFDA59EFB9EFA6883C836D562E2629C9202A1
+0C12FB0B7CD4313B89FC47202D9A9131BAA40082CBD9F3B0757853D79FBB63DC
+4230097FD151C9620F5238C8A3900D3F4D0A4E9DFACBE9CEAA5042A8DA1C9838
+554C754D1F947DA0F13861F71919A886935409EABDE5BDF80AB586AD80FDFAC3
+259A58CA5B2164FE4E8BB441C76DFAE412F9D8F6A0791D654C8846415B8F50EE
+2B51DDE94C594C35B200F6394727F6AACAB7BCA7089728C4D43D08D92085E899
+4D49B867A20D4D988269E5BE9075B8598815B98A33F71EF1DC57A16F1F8A6A21
+5EFCFCB8D5D6EA63BD71AA812A06B65178BA861B49D228B0562CB643CC272FD5
+5B75D91C52B23F5119AE56700D9316162537A4B11004DD2B36CD5BEEF7CF5007
+1321A5A8FE603B12EB3AA6874E2ACB44FF89228BED8B457E1E671DB262FB3999
+F21754172CD06E250734DD0B037D39BC7F95B59F706D96B3438FBD36F8096AE1
+CEF0C6B206FD1FC09A267F05C2FCAD9D48B7ED79C5274ABB901EBC710C56CB51
+29314F4FBEEA48BF0C63582C5071627BE63F1A8997D45DDF0777F983629FDF43
+1C88D91790B1ADD40007131D9EBFD2775CCC7DB5F43E6549E6DEA92FD93A6E62
+5F19742A969B6DF6835E58FDBA0ACA7561DDA911B8872C5F7649CC798CAE3BAB
+D34BE5B8FBC192CD49DBDF869865C89CD13D5E1DEEB078CA83B54115E398B027
+F02F20A2FA1598CE55D6261D71F91B8250C8C2F2774E21C623AB8558E6BE220F
+5CF0D43E6F48ABB5E7AE213266ECAB04810CE30BF85EE98D8145427EC8CFF5E9
+86E1BF142EB41D8C7276DE545605BF8104806355303409CAF619EAF139DF67A0
+7F768B867066C95F429DFDF448465B94979CAB16A0DA2B116A4F42968EEFAC43
+C89E9A4B2C9C4EAFFDD84FA4C3A997D042389392AD291133A42152ECEB35D361
+7FEDF25957674492074C77EE5DFBF544DEBCC883C292390C9DDF991B0287D8F6
+D3D070EC59023AEC64BEEF14F870339B83AE10DFFC49AE74AEB45ECAE8AC2E34
+243D7520D4845D89FFA6B594D8AB95DAEA65868E4C6FA56616233269F4DD0A94
+FBCDE3B1BE6D7A98F62E6E58208CF6B524B9B826757A5E443A07FDDB057C550F
+D3992B9E464E6EE833CC53086F03F990C82B36E9A1810B24560DB09814C855DC
+2CDCE238364E42B9382BEE77D9C29BC8606E9A514C0EA0C83884764F6E034E20
+9BC152C2F10F0C867CA4CC98D0D0769FC254D8DBA38215F6CC85F3767104126B
+2CE70A4D40C8F8CE5895FACAF369FD9BCD27441EAB29EA0427FB06F42F8DD689
+11533849A08759376E87AC341AEE5FB95CB3152B2BDFE9CB046E012AA3389B15
+EAFBADF9C8869E53B009964B02239BB7B9DB3AE01D0F5B33DF315520A733745F
+904BB8B003624B3B8511D67BECD37DED77F0237C0D51B72A7F7F92EEE9A04BFA
+9EFC02EF4699C2EC0F4699CA60381C4F2A39351AEE2772AFEDACC90D92333F89
+54D65F161351FB24368068A78C527BCF188204033CB08065A892828F43C05A2C
+2648F9A979733190786A03D47A727FDFE8EDBA3F49255BC3795E373CE2A933B5
+2A72E2F670977F4986156487B4974BDB948E452E2DB429D3D2FB8266F7B36626
+1CC210760CFEC9D23C9621ABE14FC18AD7C9FDAD031D56CE72EB7982B653B8F0
+D991F9B5A0946AD308355EDFBB2A3F62FC8B57B4FF2F66FB35647381E545972B
+8099A7DB9CED093055CE1A414062458D701ACA675362598AD0ED73944EA9DAFD
+6E3043B91DC39077C7758439BE71CABC2C16B59303B49FA4C02B5A5844A01367
+0B8068FA9B4CB58C5F24FF462AF013F8EEED386DC5E5C0CE30E5908E722E40FF
+860C02C080E14282980C09C5307B63806D01E6A61A37D39DC2446470D7D90E45
+2E3CBF1847BF4BF8D7845AEE4AF1CE34978577FAE2A71D501F97C85BE49C1583
+A07B590256324105AC3601D061149ECFD87E1FA726089A2C19D1A4B2B273FC8B
+0FBA9E23F63E1766E5FB216877FFEAB2473D023BD1F793F6D7561850BA060C43
+7342682C622E0203BE175097AC69CF9324A87BABCE6FDB4AF08E27C3D8E7D65F
+DB19F68B3335B3EC2F5E8EE1462C52AACCB0A9898205855ED815A42830675F9D
+457479A33BA6A034F3BBAF66799EAD3A152624C3F50279264C8CF38A66DF5FD9
+97F9EAB52B7A280667B42983D65DFE44144BA34FB1BEEC5FE1B7E3D201038C47
+88A5DAE0E719C8E4B3D2988BF536F2C94962BCACB12A8A28CA12487B709585CE
+A36F7C289BDAFC52E9374B05989D2B409ADAD6F18149BEC1DDD16C8FF5B18BB5
+4AEBD7FBF9C62174979665D2BA7914ECBE3D0DFDE3FC2AA6FF7F88A37240A353
+D3EBD858B0D1FF939F40449BA58D592B85F2C6217279FB62B484C2C4EB0B6B5A
+D35FD070653A16443D51D291C4A9200AAB185A28EED382C91E307A3B4AA1AF26
+EF0E6837730BA40038B336863431D30525DF8AAFB6FDC92C0E98E5528956D4CB
+330DE95CB79542670A8C89A813C356255A263FDDDBBC543AC5D7B2CFD1AE25F0
+D6A01465EACF69BA84AEDB6F0154AA25AEBD7927D636CEF416494AC8E5340424
+4CD0AC43C5C03598CB6BD8049B34B2641060DBB0E3FCB5AC60BE229F355D94C4
+225FEA17641AA23AEE655FF569F90E24C8CF27082E4E7AAD634F281612F87705
+A15B7C05BE8330AA970EB82B01DB4AF18B3117BFB53860B40B370A98EE513E4F
+2E6108BA508172CEB8BCD22CE4FE5188D2C7DE76862A3F78747DDEE3A617336C
+BB7D3EE52D46ECB52DC057E82B6704A2F1A0C3115AE8E7D2D8B31517DE586AD7
+DB72A4BEDF2D22F883F70DF03593CAC92EBABC5AFCCDE1A78509E024C6AAF558
+C45C7F1A4AAA246778F967ADAAC21699B3C2F7F53CCD424642892C3173F61703
+BCA47E653C62458309689785EF8EE2922E80634449F0D5F7A8D70FF8561E30DD
+CC464AA3F3760E7ACD1988BB44770F258EC07172DFEFC95AFE45B7143F61BA47
+EFE05472C43A1240E4ECA51664614FB9E46C08CB00B3BEB9A1979E7CCD6E198B
+40D5D6FF8435ED0234FDBC6786B0EED8646EB3F49B68D2F4E238A3A5FB509FFD
+0C18D7370C768192A66770F77F254F3D6CE99865EE852437775E2ECF6A070D06
+629D8CD6349D0E40738DFE2B2322F8E9B53A40B6FF442230071FE3C8F1CB165B
+5AC61446AF6DDCBAF235AF8C3E5897B295F5C898871FC7676EE5536F23D948CD
+730F67D658DCE8BA321DE88BFC5B2D5AFB76D04CB7BDF3142E1CDBE22218DB9D
+A2187DB6C2BA28F8B1E56E4FBDA64A73CC93FD301DE2ED8661D61D21A54B258D
+664D91305B62BC03F9FBAD1C9B09643DBEB374950E8BDECD2840E3B48A2B0045
+85FF594BB6AFCFB94BC4F82AA8B81073E9A991AFE6A39709606967EA58F6B498
+12B336A139F1C8398B10C43468E4D54F8DF36F74B9A34271759CF249F6987E16
+9A119CB6BA19300AA1602D2A1A68E7859E0BED5ADE943681014B83E4098A9724
+E7BFD908CF6E90A25EFD148CAC2017C71D84D8EF214FF9417B0FC8E475513D3A
+39530CD26C08004CFFDCDA05A7858684F5AEC1CCC131ADD910A51A93A4F1E288
+8486BFA3CB3ED0015D8527731C53D273F5C51DF3768C1FA7C004537457D0EC86
+45F2484A76FE59C55523C21EA566D7E75A6A825001173F6A34AED8537C0D312D
+9E5AF5BBB8C19BEA4071BE9B14E75EED39BEB37A6E78CCC9C58FC9BD74E93A16
+BA479DAD22BF879F7F76D7CE0A39478190787C410D4E7BAB6CA813CC2AEE1A7F
+E1F35431FF07AD1A5DAFAA1853385E96022553EC5B1B625118FCB6C1B30051CA
+E231DE09B98D9D99E821F50D435BE18DF0621F60D9D5D37A55CECE00EEC5711E
+3DA7A696E412EC22B7B0A48B56FB2FCC5CAB6BCCA80F73AB9E77536E03AEBB21
+AA2E7F5FB2687E7A726B1F24FE9ABD388C2DBFFB8C7645ECA1C3192007EDD223
+6B79D161F94F838C53E1D994A9D89409D998427A4CCA56580F5CEFCD3163F90E
+F4DFFFDDAD963264CFD034C40C11B5A425C1A51D2DE781E03EB2648A409819AC
+1D6C73F4EA08031B6ADCE61F80323FEAF3C049ED4F7A6008F4EC04193CF051AD
+96F15C6A47771B4CB267DF45255EFF5D7BEA21C4B8F06598E0FC2F3E7CBC2B1E
+2DDA078D01D9B55D8A20AF61666493B74A369F7B64C2D7B7E3109B033026EC7E
+C2A01BE7C8EA7AAD1F533008F6CCDD3AA0898238BE055BAE80E15D3ED7778C1C
+0AD9E39ECC67FD9B9910011F980EF3618F8E91ECED76263D0A13B1917A86AE3D
+D800879EE7D742328B0B1448AF3540732D52C9D6530CE36032586D5EE643BF51
+17492A3BF5CB62C9EEA019F77026B13581541A06A1098D6F0E330196E0B929E3
+D923C0B43C28D0BDACB639F7D0474B84A43A3CB8A2C61FFF0C07479EF58825F1
+133487DE8B2A382B58538855165F466A3F066BF3BB90F3E49B8F92D69A02D0B1
+F79BF014DF7946D0E492E936837C9102240302E26726943BE70C0BC64BB08D4A
+9C0ABF2E1444980CD359553D67B178B52797BD03F64C69BBC4737C654DC2FFA5
+29F64C35D7CDF2EE29DA97A7BA4D32E475702767290E984BF9EE85EBCFDBDA24
+C984826C7564AD82249AD05DD17BCDDFDE646E822492CB3E6648C414F9DB4A20
+A76F6DA8EFA046A0A50A2834671B66852CEEBBBB57F1C162F6C5BCE7A3962A2B
+D08D49B3D8A66882132B494FD028BF40161BD24B07F3E851B372D8883BA6B955
+51F5A535D8D44E9F5141420798770F368079954549B505F94541B3988BB1716E
+C4336D6FF12EC282597DA8DA87EB66BFE134885A7A1E27DCAC28B228A50CB41B
+5AEA034FACBE35433B0764F451A51DDCAA3480A07910501080A94EDE59D95CFA
+94C8EF5FA0E86E751A1DB653D6C9022B94CEF77EE80455FE513F17F07E3B6366
+B14032684004763E72298DCDF3A57222D64DEE2E49D8FBFA309FA6F4B78F7414
+CB30A2C8F4168B9DC02C4D489CA1305DB50D1F2F02AD88680285C85DE712D2AC
+673C235672CD6B428766575C7032971930AE264A768D40474C275E1CA9D8E690
+E592C565FFA7EA1CBC7F7FA586ED8E2987217F871642F677A588DF3C10F2A855
+78B74CEEA437FC6328DA6E1FF942CE6FA971381FA6440490C0DB60644E1E4237
+E2431B475D7AD678E6A72AD0A3ED0EB7E026ADD2666D99EBD4F05C2E1C25FD19
+86641C1AE15DFA7489AB7B26393A8F77F1410507520ECECECEE8CF5D6CA41F7B
+85EEC1DFBE32CF43514CE691289A06286A46AC0FD23A23F7CB60293685ABCA88
+2996BBDE3D98F57EEF708B22007F920EEF74A55BEA404F6B7DCEE10DDBC99241
+E003FFCE303F78C5EBE1E4A60F33C1FE91877806F225712D2095141E1E43BF0A
+23B42A2C3BA99F1F3C46127211F4B9D8BEC8563B24D3EA2F1D3C37C59EED8E60
+EBC4A7466E963667BCBA206DDC700B1F99D5BB54B1ADB843797DEADA6DFF0D58
+43E1EBEBAFEB9706857712EDD1F21D0DD1102A95950223A36BD84BA78E7085C4
+ABC2B9852D1BDF205905948B35F85A553FA3719B0E6D5CE2D2167EA238ED03E6
+C83B2909079CF9D0AC89E8ADF899FFEF1A951158C8257C256AD7F00819F29F37
+A3C4D48A6C7D1FD0D212107F462406BE4C74C7D241CA0BA93FE225A31190505B
+B47F435974F65228B39D69A2CD94D2E64EC17A0AE11FBD7F88BA89868CAB6B45
+06C9F7C0788A6758594796186EF6561723D9E3D540A0E4C3F4681285E3E53BB6
+0DA52F4A2BDD414D1748586BCC68BB408775EA9A38B02C1D30A12E6EF56D702A
+4B2A443854D9F13DAD905587E879497455F80FAF60D5E03F0951A5F57D6B0B87
+FE19E867C3EA3CB445527EFAA4110770828CCF0E013C102C2B1DB02AB939D46A
+8EB43B028A10E6C7EC3E616FB498DBD170333013A4008635B23F7CCDCD8A0879
+34D2FF449D6F2B90C31AAD0EF5F5AFB312E0FD496FBF5177999EBA15A448E6BB
+A45F5460FA0E
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+%%EndFont 
+%%BeginFont: CMSL10
+%!PS-AdobeFont-1.1: CMSL10 1.0
+%%CreationDate: 1991 Aug 20 16:40:20
+% Copyright (C) 1997 American Mathematical Society. All Rights Reserved.
+11 dict begin
+/FontInfo 7 dict dup begin
+/version (1.0) readonly def
+/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def
+/FullName (CMSL10) readonly def
+/FamilyName (Computer Modern) readonly def
+/Weight (Medium) readonly def
+/ItalicAngle -9.46 def
+/isFixedPitch false def
+end readonly def
+/FontName /CMSL10 def
+/PaintType 0 def
+/FontType 1 def
+/FontMatrix [0.001 0 0 0.001 0 0] readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 0 /.notdef put
+readonly def
+/FontBBox{-62 -250 1123 750}readonly def
+/UniqueID 5000798 def
+currentdict end
+currentfile eexec
+D9D66F633B846A97B686A97E45A3D0AA0529731C99A784CCBE85B4993B2EEBDE
+3B12D472B7CF54651EF21185116A69AB1096ED4BAD2F646635E019B6417CC77B
+532F85D811C70D1429A19A5307EF63EB5C5E02C89FC6C20F6D9D89E7D91FE470
+B72BEFDA23F5DF76BE05AF4CE93137A219ED8A04A9D7D6FDF37E6B7FCDE0D90B
+986423E5960A5D9FBB4C956556E8DF90CBFAEC476FA36FD9A5C8175C9AF513FE
+D919C2DDD26BDC0D99398B9F4D03D5993DFC0930297866E1CD0A319B6B1FD958
+9429B9D40924DC059325D9D4CC0344F3F997A99E6CC0676735EBCD685AAC9142
+08DAFEC78BB41AFC2F1C219910BDF41D6279284EF600B69776CA15BC8A34347C
+30783C52AFA60FBE3E353E2AE354CF87B558776A22C776C7A0B5AB5CE1F941EF
+C2D9CAC37294BF407A671F10E4743BF842143F4F7DFEE643BA3BBD8BB9E3F24A
+BCCF7F0ADF8BA500620C81033EAE8C4EF2C1DEF13AC575F1B3BBB66F093D3B78
+5412B82B67FFA087AF57182B2230F9F2137180CA58A7D9B2C822FF04BE6CD01D
+43B2CA7058C7B953F6D9B5D6E91ECBAA5CDE1159B0E59C83DBAD96D6C8C8BAB1
+374EF652D10C0F3EE7104472C98DD3572AAF2D45A70BF7061447E21EE3C3BF23
+DF39C2D1B35B42CD5297BEBE6BC94F7C9DC6E61EC67E4F677256FED9064BD3E4
+B51A71B1D27CA4E5AA9E1D8080E6DAB5310711EEF87C40859FA935B19524AE83
+63B163FA8397BDFF443227FEDF7DB27DC35D89FB1C5E435DA0619A5C88AFC73B
+89A2DF5E767C5B536BC7167A840A0C32BD57A14DE69A7D0D819AC36FF32F908A
+5070F32983BB007437E3500799DF5E0AD3710A4C0000F0098D5BE99F2EB9C1C2
+C444FD9552D0DCA098A94B3BF176F511CEE13DB7EFFAED7C47B5ADCF8D4700F5
+7A5FD1B49560969BF5C44F3749370663A04776F749DDD7B50674D93254426C4B
+EFE264BEE7810EC93784B7C01A7F29EFD92547E13A2C7851A2E709FBD5B87850
+4A44F08F56A542DBE072D2FBC58D9E6468E1AB858DC35240E30D31C7AC13D6C5
+7D2BB634BEE96FA0E10F842B11A789F72A333DD6DDCB1BC23227EBC406E50B40
+30AF0C48E6359AB0C46898CDAF1118E46BFF8B00F54EACBC2AC262AB898C42B9
+2E080C10DE923C18A4E8722C0BA2247E4445AF50CF2457D0F320AB16DAF58530
+09C469922A41201DE813145520288C427C8CFFEAE4037F0999B1ADCC872FA414
+E5F41DF44AD1A79F10F62019BCD84663280343E7CA50FF4106019AE0A0351B36
+F889814914B4CAA436A5E2A1524D45CC0BE6DFAF1606662B5442CBF6E056E49C
+97525F06D93E23035257668B6CA0ED863E09AB10D930BAE8EEF482B9ADA477DD
+91138C17918C0130A8417BEE30145CFBFD9749668656EDF546845A471FA50E0C
+018D46A2AFD5E2C587F1BD1A439215AC8FCF61501657A2966E51C4D986672B00
+2081D80293F414AA902D91D0D1ABF7FA6DA81770E4C38F16D3D19579829A347E
+1745955A03D18CB37409B28BE6579F9CF04151A2F044E99C0F2805291EDFDBA4
+02D67D6FBFCF4B3D3958D5BFD0AC0D01604F65FCD631BE5C49CCF9D6A78C12A4
+EB03F11923C1DF636433A112EA558D5F0681D4F784BE1585E560757BEE67008B
+85C74A8F34EC016879E9B5748F14FE6076C7D27F58F4AA7EECA1F8148333A791
+E9C84F617004AB64B40C4C196C3B4F730B4FDB5533094F003C35BC2A33F194A6
+BF513D20AC55C18219440DB02290114BADF3D5074D0C336CE12D73AC9EDDD509
+33245C5731DEF7CC5C770EF5A820CB5B8993D3AB0B34033AAC8FEE06BF009382
+ADD7C9CA9E74922330E0DB6DB9359F475C377556A05611599606AC46157BE365
+B27382B2984406759B4E29A4DB0135E2C97A8FBE1B6230CA84E5B960FBD61BFD
+EBB60B3D1DF58541F85F6C7265BA68BFD713417F32E8BE62ABB274948A454446
+D2A3C71DEEF2D0BB4C54542635972F892FEF2DE187DCCF429CC745D43C01AC24
+9C652B4048DAC3FF784191CD37CA564127D4B91000A71326769C2AA9C84FCF1A
+5B512FA171E048C2346A98C7B81BAA590E425A3211B1EBA63EB2AD0F68C23D30
+264E24F0F89F752D5915A744965B9EA532E567E213045EE926074C5137853B0C
+68B7F1A32BB6EA8C2AC6E1DEB03504D05AC453EE739631061C02DCF90AD01721
+0A4923535DA2B9991E4E9571954681126089D40ABF277433B6AD7F6A6087DC92
+31845CE60B70377105B48FA6EE8EF3D02550D160609ABA9A228401622315C48E
+F4FFD3E24375A0D7C88D4454F55CE3970FAAE909780B2BE960DCBC3E42364958
+11BB1801659B6DDE9ADD83D7ADAF66A9580061F149BDA437FF7B5C98CF726A11
+438BEA6B7948C4CA968031328B69EEA5C30ED6DEB86DD36E9E5334B93A9F2381
+B141A64F2027360C9E7671C401AA25605405E507AA416ADD07BAE01489574482
+5529FC37F50197A1632CA085121AC3EDA547AAF667F0874078332B8AF7EB2716
+A92E76A5025448C81F69B9B7AFC56E794ABE5EFCF703A54DF577DD7C17BF6E56
+0540A84D67E32CBFB06AFAD3124998578CA11EA13E707EEDF5EE34689C0515A4
+5E63C0183DBB9D947DA2F78319408285D795350E89547BA0D1751E7ACDCF4255
+32F143E7FF199CE6A2C9153039C2E15CE19AB3475963239AC3D64D1FBDF5CBD8
+99B2CC4B8A08ACA3E711A795BE8C24F857EA747BDFEDCC87D32703BF163A32B3
+8127B04BDBCAE3764AE5C3697722E08490888FE9BBF5621EE0244865AC8FBD5E
+B0B8FF2E97B66DD2A0591FF6CE09443F38EE65E999AF40849582C7D4A5AFF878
+0B32337FDFFEA19314BC17CF387C87641E34F285FE041B5618057748CB522878
+34B9636548B37CDB08B35EF77DB2E9A24D7685D00ECF05EA9182F83E770CDD6F
+81953086B0A0C31606D991EC755B051E7C89B5CA9AE6C8F659EBC3E5CEF4B846
+3118F1C39F01BA1BA876E9B8CEAC46DD210BDF9264CCA38BC9AC2E651AD62FDD
+5291C7D1B0D958B83C5F6897F22A9976665CD74CB3EB44AC4B8CF4D909812744
+441F3290786784D33716E27992DA6D18A58AE0789F981DC76C456ED7752F00B8
+8E81CF58D8549837EE24BEE7E62BE7913295D7883E5B527EAC1683B84C1507D2
+0A7F8E00792B2AA7D6B3AFF3FB91CF441608219367A1562294338BCFF0CA5BF8
+652991D88CB4F748F8EDFD039EC8E4940D689FF18A4C3923BE1DFEC77D51BB81
+7A12D76CAB3B0076CC7EA994803AC928E3BDE512F981854001CF52B5FD992263
+87FF68324685FF589145E0FD33BC3C81746B08D631DB60B190AE501007F7D08C
+27AA346C653F56060D06B1E41E2E59EFEBF8295EB1B172C9FED55E95601043B4
+D8F1C5FBEC42D757E163422790D6A67589FA5D2790A996A2272F2CBAF69028D5
+A13E016E7C3D285E6EF9637A18F01FD879B0E4301648A6E3759C88C68A5BD582
+A4E6DB3D1CF5EF74955464229F39B8D6255DA47D8BAAFE09C928BECD13290F4C
+12606756DA9576F853A92CF7C0B71E81C4FC15E4B78D002FEB3A56EFA9FD8F18
+DFB507358FCFC543677B715B2F59E975423A5CFAD6B00B50A3259A60C68E46D9
+9AA5611C7D839F2C889AC1B75695F0B1DDAD1F10938F6483C58F5D0F2F25EBD4
+F17179D8C2C88121B76E21E4A5EBF14F34FB6792936F0A169FD5167D2B4717B4
+10DBFC9536FCF8C1C00F855C29BDD7513AB75BCBAA11A4E6D8F7975AE469355C
+C7AFB3CBF5BDDCB66CCF2AC56FCC7518E6941E25C0D4F3830D586CF9257BC21F
+A97AFF2FDD093833C88477F917985EDAB4D870B1F30C6074D296E2AE21AB091C
+AB1B5B144AED3153179EBBC9F87B9FBC016FBE8739F660E170BAA6CC2E14CD68
+12F2AE2FF8B41EDCA917909179FCDE3445D6F2AEB81C3214AE4F124C1472D109
+7DA7635E42FAD17CDDAC67DE0D11887711663BA505BAD344292600297050C8D0
+E2CAA1114D1A3204FBB919F584234F06EEE68C41440141BEC1A76F14F18EC517
+98029E371381D3F418699FB8FC659304689303DDB4D2EB0E164F38F07EAED0F1
+0BB4B9157A1A5EF36849BA070D084AF36DC748658D1569C6A6B99F375E47B9B5
+ACA4B0B399F51E0AE785D3C38E0AD77973A017AC6ED39C6B551582BA5D64DDCF
+1EE6B050D81C98E93DB2AB9DD84737B35385BACDA96D31955BC1DFF0B6ABECB9
+EE60B19D1728CFE958267E753B7A15913AF8262EC9B6A04B24ACF6D8848E0A51
+9EFACCFE94F12E18CD095C0E99EAAA07D39F47362E3146FDE419183C80B29A18
+6E15FADCD59636C0DA9A512DFB4445CF6763A523C7BADAE1A510A156E042BABC
+4D597DE5C5E3B6461133D37DF277711BCA0815CEA40908C1D7D7AD94D2673B56
+F1C38E8BBCC4EF64B0CB462BBB42449F5E26BE1F6D4E52B671366F4F15A77AFC
+4A1B0A74692D7E57E0E3CFD92CC71E11FE8B30AE22B90D0896741435464EE507
+A7282603445853CE351B73E062DC2E9B716D30E12B88B6EAF58D288B0AADE133
+5AAF21C0635559EB6D4B83144309DCA8DF53E77A22712ADCF3B1F8440ED4050F
+9D9D3F3CB866908C13E04F8D2FCCB19841B3D83C297F60FD9337D008E3120100
+6C29094E50AF3BD19961ECBF94C19BC86224FBEBD5BA9E8304B77CB805E78A6B
+0EE1DD22A2D5FB997F1BEAAB082779F1AA73DF79CF1C2F4C4D34D7F9170D1BBF
+6E8DA3C439B113BBBD29A7144C059ED6BF224347B8B4C9D19CEB246D2CEA8767
+2C68E0039C4B1F299E67439A8391BAB4FA60AA54E696A12A60A8CA11D9B3072E
+5BAE7E3038309DA1AA8AB6D313DB941D19C992DE658E8170722913AFAFA8ECC2
+BF797ECC8C89095CEB5B3F17601D03BD302F42EBCAA8C905B197954BC16C48D3
+877B8B6C47EB2EA5BB5979E1E0A6FB688FB4288D3817F3CEDEDC9C5B7852D678
+EB51EE6E1AAC12D68B34274A66367C79DD0791C932A1A990727716914E4C5BF1
+F479E48F4817FA22F5112EE7458997C048F3BF4DEB83E7AA5B266BEAD42DEE0C
+69C7389F5D48D33F89190257858B6099BF6F661AB55D0D6EB0F78B5D09FE2E58
+423001AB0758D10900842768CCA64752A5E93CF44B25F66A2035562D32A203F1
+2DBD00DAC39EE36A2480BB8721B9519E8EE4C7C1B1EF71B9BD792ABB1D38F8AD
+76BFDDBAC0C67C913957593690AB0109DE432A70A94A3694A4E56896B340FE31
+39D3FD9B732812C32272C1F0DE4957D8EEC942765E6DD04AB4E3117636CA51BA
+CAC9EDDD496DB8483E2914677C71F1CE56BDEBB4B9C64A22079F1F4A279954FC
+C3BF659E7B7593B44CB1610DDF98B58C2C322D45F11B8017537F5311724864C0
+BDB38F650BFCFC7580D131CC4AEF3B44E05D965A5F3A3E6DD667F53E17FD12A7
+080F9A79838B742E937E998E6EB9F78F170C69B587EC8E57B675D89A5699A118
+97A619EC4712CEA771730F1409F3EA8100F6BEE39AC52BE3ABB67679293ACECB
+2CD0EFFEF072E84FCF1CF9EBFA2B0BC7993DBDA1496A7BFD394772C10034EC86
+F2E7E963985EE6E7BE7DA1C608A50E296F5B44E0CA16379C8BF999D13DD6714F
+280EC9237DA2C80607C309EB4B15908F37C38B73F0A2A1B65715CD92148B3334
+7C434A3F70CCB68E9731F2C61A8C67FE218B9FBE3BA7AB4403B9EF8425A88370
+8EF6C06BA166BB224026E6ACAF5507749CB930E28B9ACB86EC107B684A8106B3
+9816DA5F6E8FAF47F4A79AAE76BE5BA3C8111A4D2C5050132BBE8202ACC668A6
+5DD3C384E179AC0200F447279B2D976EE80B34604D918533FCDCDF98E4FE04E4
+2B6722F4FC69E698B563FD2FFEBD607A1EA761090BA03E43DD3E19B973BA4177
+6C5AE3C1111844BCAEAE18DD6B62421BE44D81383B1F125DCBC73DC2EAE3CC3B
+60EA9DB613E0379BE7B688E41F7D59A25208EFF664B1C12A9E8B2FD83F2CEE2D
+78C043C9A2A50C7FF3CE6F0CFF328CF8D9CACF7571B044C172F7E0A4F8878D22
+129C415A86B4E794567C986107C16AFFB71C1AA057C21B9C8053563B16354923
+E38F161F94E7714F0D6422DC96CD82957F9147FA1CFCC46B1A117EAE4FB8E977
+C50A169B9D4BDD7A18CABC936650BCC545A0C69A2CD1E6DF42A9A746DEE0DAEE
+DABC0CFFFBC629AC2F60475CA1A38252E5112A1DDBFF6711EE22B95411546FD4
+27038ED19037B7C75AECF4C99D6D46DCB39FEC6641B448FE0DD860A651BD6892
+88AAE0E352129532ABA41BE35A15F0FDFA5D6DD84DCA1DBB5F169ECA1A8B298B
+D104C5B6D29406F4E48EE6BAAE6E7EBB3CC5FC4FDC1686AE7B4D9BFCBA8ADAE6
+F8F26CBC4E3D4BA7BC49BE8EA170B13AB7B852EA39EBC0B0B493444AB280FDDC
+6609BA785D947B73D1D181F2F9A67D7E55C710984B460338898418A49E01332C
+B94CB65168EE1882905198252DE2A31A207060F3BD07AADAA6F1C683EE047B5A
+401AA853075356E23AA43601F865C6CAE951D3F868C7476641B1019ADF891693
+C96314832AADB7FE2FA03DF3A52F9104D93D448756DC0E6C7DD5285F6DF83E78
+2A8F83FB2F3AF613CE92194229383BD7A42070AA0686888FEFAA8D4BED413839
+F282D58BA75D6E7945F1EBA89D172B319E76B31C8996465F68253574C7160893
+75F8A278DF5E68D6290D59DE2A187D080A5D6A94295623397C2F84D2BDD41CEF
+72E265F5FE15F71EB77A2E2FEFE6DD163CB9EB741DA7A0B60908CA367EDF2232
+03F986AD7518685A49E9498A34DA63A3C10E8AE6ABD90455E50F380D6BE95920
+6E675770B1E852452EAE7514734031848921A99CB473E4B6F327331F603A5730
+0E07AA58BA6FC7D90D271BEBCDAD6E656F42AC02D7CEB58E30F5C9219028A86D
+69FC173C5623E21736C1D5DD1945EEBDA39D47DD9493FD1ED41380653826B1A3
+6384EA7E12FE828CB36B2D9551E38F876C426F75AFFC3B7A626A4985AB9D3DB1
+72A3A3F1AEF5CEB8B7B70A04F85C9C4CBA278C1FFC109483614235D3279FDF24
+484F326677A9C5986A96DAE4520C5B5DD75CD23FD0461821B3025E796C1AC2D0
+158061A3AE9358775608D288CF449198D3A5A7459649802CDE6BA6EF043D7450
+36B505F12CC431582530830ED84EC4931049510DCC1BB8755203124AC851F0C3
+1F3559793848CB25D4C091D2F559EF43E26511C726CC235752CCEB98C156EAFC
+D215D0E22CAF31F5822FF47C544BD876DA4DBC24E21A9C9BCD3DA0FFCB6A9071
+2002461BEC157A229EE6D7AC28CB29D09475D6F9D6405F7668E2708B84C7D857
+3A541A70C269EF06F10DB00C30B19FC267772000C2CFC555729781A4FE0AB522
+C09A34977D1946A3453A4B10F74B82357D98A3727372E5803AEF73A1D7E90F80
+37DDBA78233AA1397AC9438EB1A962B91107200CE8A4E2BEDCDB669743518F07
+69786E45C1D79821AE1F71B3C00F969A16C728C17B29C0EC9603BE4EC5376A6A
+7415580B2C402E3ABAC2B4473A86DA78BA69BB46BDD0590DE573E72882C5A922
+C0646DAFF0D552B412A6B7E7E3F1C59C19ECB875DC43F0AF2F8336CF71D968AC
+F1894E0EC009666D8B37D5588F9B9F241788391D3E9B3B53653CD7BCD1B25EF9
+562E71B73B59F6E2A546A77188576EE40849921C0C41B38EEB1278E91EB13AF4
+6E06BBE37727227F2ABD70A16EC68B17E6B3E08A415A2A1C219CCC73F75B7669
+29D14DC63D4319A2076C3E94595A6FD9AEBB0296A0C1A72AA0DE3C1EDD6DFF63
+ADD96B91CDCC7B69BB01472785F89D2C6F9E8CB1D27761034A711A28B5C2B482
+A446C59BFDBCB1A9BAD0A62A46570C62DA58D0DEF4587E602C4024B12399A9FD
+C49869727A655C0DCE803A432177D329CC54F034DB84C20337D6101CA3E5ACAC
+060802E3D45AE4DFD6534171783BBA3101286226096C72C6E75F33C905A1D172
+B0BC3734A52E8D22AEEFCE5DB2E7FE19C4B8229961252EB56E43C27A20694B21
+B75D96F8DAEE6D1F48830D02D10BFB50A69C2EA2E585F74D3E086B84D7DB9E65
+3ABEABE4865EAE572A499F1DEEF7940131A4F821977BF9376160E1F3ED4C6F55
+4DEC96C755D368032A9B485D6097B519AD4FF7989295952A32D7DE660E37EA1D
+F15D1F75CC7BB1D837428F5B47B212EEB46932F48AA9340DAE0F404836F4307C
+BED6A19D55049C9C54045FDBCEC701F950BEF2626805001A68FACFB7ADC54A7A
+9AA2E2990C5968CAE23828B06A60423869652D43AA74FC0B1E0C1ED6C4C1C378
+29B3F369277C25B1981E85D41F5677E2AB7B9EE3FD31D2EB8965B65AEB9941BF
+FBE3A2CED1A90F0436AA4E8C19B32E837ACFC84B330EBC035FB5ACF7ECB6BBA2
+626559DA2C279AE0AD43A2818E21626DF050BE4A54C683825CD6C3BFDBBA5FBD
+B1709ADB8E0CB64FD47EAC22E1D3205B01CCC98824DAAF7337479E122C954426
+0E67A997027A4B8A37A1CCCEEC8DE06239FAE6A20E19D2731972479D04DC3F7B
+8415492D81ED2B04F8A7921F83A8D3F6904A68508276AE029F31B33FA1608FF8
+80080AFD5B2EB2F974B1EA8FD301F05026E9A5E28768ADF6C5A7DA8755E06894
+D85B5BDF75A11EA31FF53F0678A7741D8D88CF6223EDDD0019A8C638B6A138E9
+FFD17C7972AAD5AA6CC8E271E84D376E034F507334A94E0A0CC9A43D12819199
+738AEC2DB68E39122ACDE7D0530DD9EE6C686D04446D2D2D4F0D1EDB6B594C1E
+C07CEF409AFAB79974167CD3561A2535896CF2C0741950533F9C35D552A1D59F
+EDDC95A01F85E095A877AEA3025A86EC10C69B802E72DB5B7339EC4341808FC9
+17374DBD2A349B8B72C3CC588148153B18B7D644A7DE5975CC8A574484760C14
+C9F5C750CB6F8887BEFCEC11A01F713B7CBBEE8ADB3C5D7687E9105DE79ACEE0
+1B6641022CDD064CA528865136AD083665D8C417E15615D9AC29A2B52C4810D2
+DE294CADD0E3217FB84F954E6E34DD1C1365D76356FB2559041A436186B2F58F
+96D8F9BE6D4BB4333CA83EDEFA0543FA66D9176D81E4F7CCDF05571553945908
+7759C20348647D1EF3E09F9F8429ED2F17CCB5380C256BE7BE8817E6469983BB
+316E21FB9564DE76ED933F93238DC5F2CB140ED9E0906395FAFF35A679518835
+6ED2E65D0CB939E8DE46720B094CF86990035B0B9351EC536709DD2477233388
+957DB0FF735CCFC04DAF42D90D0785280F62B8EC6E77C26591A84A36729E689B
+E9853B88C2DA53F64E677786BBB8301B19EA6707FEA8456C38C53061AB09E946
+32D6F69ED6DA83934A37B7BCE7D9497266D5DA31A11417DCD3750730A74BBF76
+C0C2729F29F68F30C66E4B1F09AE42FF9533AFB8F27B811F2B03EF1C57B7DA66
+E0029CD236D04FFE12BD00C1BD6ABC65DBA778A8BFDD127862104AD6D53471CA
+CDBCE38687A2CA30E2589BDFB1D9776CB442FDEAB5909744390A228E3ABD73A2
+EB3187DE932D603A7CB623367371657D8B6979B80F041F6C69E86D73DD326347
+0172FA5DB875F9D0D42594202655C2818EDCA461E1713E900C966750C53A69BE
+7E5DE484DF282CE88450F099755D1D9739618E2D938CF8711187F13556AAEA68
+821AA9523A9CAECC22BE4C9BAE30E8F5B8A4ADC8CCA3F414256E7666B6E61097
+E0F8FCDFCEE0D0F424D5548D511FFB969C9C4DA9996D80D6349A4F4993EF5E07
+18C2A79986D491BDB738475CF07D5F6D7B51DE07A2F2C70BB8D36374CFDA6D48
+4503CA707EA969F7A2D87A94EA93EC2FD6C498411BA19DD0EC4862BE8CB218FD
+EB4D11BE9E77E945E3CD9BCB19C6F9B59B40E9FB2B951E364B679A5572EDA20A
+093A5BBBCBE69385728332D8012E78E421DEA8C9C96445F064ED7DCAAC0273FF
+3B3AF3335BC27D53E54DF0E2F543C7BBA500C37DB2AD5C23B8A73A7EE535152E
+B582C384C29BB4842F6D4F3C0F7CAB5B44FC1C30C8E722BF3DD43EC687ED616B
+C52DEF4FFED93DE0AF5A51F260CC451E27B0B44729FCFDBF62BFC5D67A925989
+C71A829CE46D4EB0577C5847A82D5E80546882FBA3BC4C72CCF9B524785DE77C
+E53FF9456B9740D6117173C7F767C573CAFB795138D2D05242E8CD787CAEBC6D
+7C79EA7A0CD65346E3C3B4FD1E0FEAD67E96FFF40D3B6B1BE13846A960B29D81
+68E81CE13FD515B2617FD48CF641D05BB0B4F5A8D6D50FE8F52AE36826AD9189
+88810C78E5D300171434E05A35763CC0281EA5E4A5F4FD8DB3FE850931106924
+0F3A2B9407D947A446BA9E86FF76CE619D7D8255F0DC9D37E3580C82554631EA
+4F03CF84182BB9CFDC9EB4FB3FF8AAD60CF25DD359DE5BD564E5CF4579BF9350
+EA9F3B44475587F66B25BCCCC4D8AFE311681741A5B63DF4FF263BCFBE410F61
+48217A3D7FC2D8B38973513ADD62BB64AAD19EB5FAC08D653563101EF9DB6046
+16BD7F61C2A20F298398C7B356CABC47968715A16D8CA13DE2B4628550AD4495
+8F8C53AF17E0C8731F390560F434FC273419C0D7935A76E2F85F696D0392818C
+BFA2C3F921DAFA78A19872746448C3C55A55FCA36EEE706BC23D73F1CD303917
+A3F63B2FDF1A425FBE6789C101FF15E5C66101CD3FB2AB1035A0E725C6455DF2
+2A6329BE6D62C791E2C0AFF8056BCF5B59CAF1EBDC4164D6D8CC47BB0F420209
+C42DCCF18750C49862FF5040610180B050E0B81617FA8DAB55D6E18694AC78F9
+A2C5205AEC3690869E8DBBFA1D41CDF4BF8D5617654B65BC738E6866D2BA1C23
+0C9F6534A9248CB12D7141697497C0B089BA16084A7F99B85E17C3E335C139E6
+8A864C3C453E867688169D44F34B3825C9FDA2072EABE45C87372370FBA0F82E
+CF5B0B96356F869DBAF1081EEC193B1C4A54E733CCC9A43B9BC7062FE32026ED
+B1CDBC0CD142FC882078F094B041EC305CB74F6A182467DE0BBB4ABBD43CC7F6
+4220752F87DD5C06526C9E1680E96433159948522269C6BD5C165F6CA5E66FF4
+9D757FF55A21B3424B4604BB49C6AD1841CABA884FAB2AC8D52873A653112926
+C0ABAFA7990F49C6D5087C8BCC04261F5AD4F6319DEDB33E321FD2399D60B9CC
+D52D3F3CFAB819B6B047C3CDDB40BC669DCE76E4A6560ABDFF5777C5D7044215
+C2EAEC926A92569335D7C5EADB9FCB82D4FA7DEA1B2EFEC6D7EF13C5209E84D6
+FC93ABE556ECFF7CD07ECF447B6F6D82F3A7F7CE3F6E75503181B3495EB0B933
+79ACD4BABAA3972F7BB81F9A786E63313216FF668717AB5C38A650F50271A727
+D8CA027486E7713170181865474F409D80390E1BBF784A6C6240ACD188801FB9
+261255640CE90142D6A78EDA30A84A1A146C7B63A74A180B05618E2EF7765EC4
+9B5619DEDCE41FD00EF3FF273C9BBDA8AF00B06F7954959F249DB4640A96F0DC
+1F6FFD14ADC2F99C0AABE152434C8BD7E45F611616D2530E862618CBB5935C37
+9431A180BF14D95970763B42C91D4E353D86B5314855A5E351BCEF14D606BF16
+585356D57949CC4D06E5AD54BA5B3AC1FB36366FD0B1F8598878F81EC83502F7
+960585DA213E2D670C0685D1EF6795F1065942C522E3EF6957FDD67C5FF19800
+E518F1A3971FECA7BD3B40FBA06065C23691FDF1E96A2A11E1DA179D2C620AE5
+4C18031290D83A1A4D6CAAF6783B3258640721417448CAC44996893836627D32
+45E07DC94090545C2BCA857E598A443299FA12238BB29AF9E68E447940CB36BD
+2EE6CD73555D6601A450DB06AF4ABEA52A9960E04C82EE91CD4CEB085276378B
+E90812B2C70EE66EDB3D031DAAC5B6DDD55FEFA329D48E68CA5B18EC48EA881E
+9098BA42FB6BFA8B58C58337093ADC794D637391AF5FF01FC3EA50B8542F5271
+6AAEE5D496AF7F4D6F3EBD19AA36B073A274CDBAD246B5A79839A84385C414A2
+635DAC09804A3ADF10862C64236C6ABD31C91318E77AAABFF4857F3679CCB17D
+3B19E2D3F5A92688F6AD9AAA1166ED1C7FE822D183EB127BF6BAD2A3B3F0E556
+37B05E50210C87E79A8B68C6971B59E54779FA2A9135A85794F4081E0A14DE7C
+D2EE771131008C83C0E198022C292174AB4068EE0D53A16F23DF10D5D08FBBAF
+FF0BA3B5D70857D093416B0C05589AA68903968815A89EA5E89A7E4371EEA504
+22989AD5D2125658D9204D32CBABBA477524207265A53D8F172BA36695998C11
+986AABF5C41DAC03B03731C604BE7D4CBBB613A4CB5E66AA396EF0C77550DE32
+F9294F8D3DBA42BF147548B26D4EBEA1495406D92406C42763E4BFA6B5F7EB88
+F11868BAE28274A320F3CCC40238FD6EDC619AAF39EC637FC6DBE6661558A21A
+408886ABF7A86DB4826348D379F0A21C0E2124E711C737ACDA7C202F849CDBA5
+BBE320D26FCD322DE78598411C74026F0DD96EAB567F33CAF36A4472E7790649
+E9CA91886576771E55CC04D95791DA23214D8E95CD4DA4DAE995EB68B2E5D034
+323DBF719F4585A56D4F333D08B31539328EA1642EC4C2BD27DFE9FA9488BF7E
+88A0F280DD5780E5803D4BB55D9A7A8399CFABF8E1ABD2991F11D377BC452BB0
+A6478AB422A185B7D6E9F6CF0B322790C715B1F446A40F808461C05A51F9DE6A
+16D774893F62EEF0520E5227C0B768CFFE087543F953F599E7F639740F79484D
+005B12CDA1CF99A65516557A4D71F41EC659DD04756791D9CDF612DF9516F004
+356226DC862CFDC092F52A9B5E1D76C6BBEC54CC22E16F2CA092E2D8DB78D8C0
+45B2889B8A9AAF70F0449D1213029F05D372F408245058AC07A069519ABC26F6
+44D49FD50538BEFC61825FEE73639D70A52DB8DF5B7B1857BD0F007C1DABB4B5
+A4FEF2C9DDC3E17B0B1639A1C875929833F0FC63FF9A260C7FDD22B02204AB07
+D86F76A7B6FA25E8629DB7A263F095CD01628C1A94B3C5FA0BDE529D2A98D613
+F8244214772D57A330E26973F647FC4B9C9902197BEE1F7181DDF8E15B4F20CD
+983FDA9B61ACF472E1EC8CC4C83A3338B606E52B3455C2F3D54D570CC2A6A73E
+B0954AB9F361B9197BA06365F56BE621925EBFE2A1BBB8E03EBABC1877C1124D
+9F343FFAC47268A0CFC72A587196849D0B9E53D9B79294D204E0EA5FF1BE3CC0
+FE02E764A46CC88C3B33ADCF3983C89554700D7BCCC61F09DBCD40E94B14FBCF
+6E8A91D11965E46F20C9441001A59390BA2EAC235BD4FE2B995923F698A9D7F8
+4AB20160A0E72300EBF9FBE6E9F7E3A25B71F7A183DCBA3C650CF60D2DFDA3DE
+D57D903571AA1E4DB9986EDFEF125CADA779262CC0A33D6BDA3D084983F46C1E
+4A564A4D8B9029E86566781E23FFB6E9D6CA3CCC6A2DD8A4A5688A329913C629
+8BC0187CB8F95D282BFF33298A45CDCA38D62E1378CDF207C4103163D91EA06E
+90345EF0702F549A7BEF14EAFB33D49776DEECDF22246E10CBF5180F2BED012E
+4248DA7EF02E34970B83D080318401D77D55399B0CA69E1909A5FECE5A3FD9C5
+B66CED7B7C03AE0CD76BF8CB24239D38F7C92C28BC86B36A238D7230EF49A3BD
+4D051190DCF146636C52B9F1E5C8FAA62A63786C0F049208C6F8D8172C2BBEB7
+D85DB7C4436FFEA1778AB042AED56FA8D6CDB7E93AA6AF825847669DCD9157BB
+0E51F1F3E72576DA81513E0B1A5EE7D80F774FB8B8C8E2320826B99E51509CDC
+8299E44E44BA054A8B9302BCFEB0199508E653FFAA593BFEF9E6B7050834D022
+19E0960E02B27DD84C00BF33BA87562A0697C2AF0F6C32BCB6A58009C649B927
+50971B89D8AB2687187B2324513B38310DEDFF2FC9FFCD46F98AAFAED2D122ED
+C270FDE6D837364EFFBD17473D2B8A686F74FC3A0F6A7861219B145E241FD58A
+0CAA17805D78E7AEAA897A2C1EDCC6876D292AE7B0DB6D5C2BACE74687C0BE87
+A01455686C3E509BCA6889E422ECAEB607D1D70D8606C9E9FFE7C1C49118BB3A
+D5BDAE4B89495D828843ABA49C0CE749A940D9DF789E49165ED24145C8DF8006
+F8FA32A8FCBF088A1A22A8D789206FE8C17732C02F303A109745CE8017E13D74
+4E48D9DA75BCFDF129DEBF32301D52592CD5EE5A7CA2AF84B590B8B3EA1C01EC
+63AE4B00BF74B5B13F0DE0EA6B49F6849B70909630B76A1A0CA692743CC0647B
+6467F3F2324D8F4A510B034C59BD0E3ACAF3E3FD30A609876897CDD3921AA6D9
+1F4527E5A58BF2862CF6716FFAFCD9BACB8C20D78E39DC001E6387E834E8709D
+786A786928D8302D205EA0BEC32A4B95ECAA5BD29A91A77980E0024A754C462C
+4831130591AE41466E6CDCE10118B8D87237EFB50746A6A23076EF4BEF2574B0
+447FC6803F5BD80B029A1A94431CE2ADB6CED67A977252E4FC3C03ECAFAD92FF
+5689FD644F4D483906BAA88566FFBD737745CBF3E5FD3E33B449DADFF1BFAB15
+26E9CA01E757DD2CE79C440E565500215E9AEB1C9FCB2FC5A15E2F73F2787F17
+7B86FF22DDDAC458649D2477AF3FBF261E7EDB19EDE0F8120EF24D3E12351692
+220540BD44BF731F1590D2F00A9333F29AFE7DDF9D85549BB643E1EACA09FFCE
+D6F66F7C646C3DF14F5121B34E41DBBA6533705497A448C4115DF01E7DF753EF
+61D9B8618796AA26E0A8E783A6DF
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+%%EndFont 
+%%BeginFont: CMR8
+%!PS-AdobeFont-1.1: CMR8 1.0
+%%CreationDate: 1991 Aug 20 16:39:40
+% Copyright (C) 1997 American Mathematical Society. All Rights Reserved.
+11 dict begin
+/FontInfo 7 dict dup begin
+/version (1.0) readonly def
+/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def
+/FullName (CMR8) readonly def
+/FamilyName (Computer Modern) readonly def
+/Weight (Medium) readonly def
+/ItalicAngle 0 def
+/isFixedPitch false def
+end readonly def
+/FontName /CMR8 def
+/PaintType 0 def
+/FontType 1 def
+/FontMatrix [0.001 0 0 0.001 0 0] readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 0 /.notdef put
+readonly def
+/FontBBox{-36 -250 1070 750}readonly def
+/UniqueID 5000791 def
+currentdict end
+currentfile eexec
+D9D66F633B846A97B686A97E45A3D0AA052A014267B7904EB3C0D3BD0B83D891
+016CA6CA4B712ADEB258FAAB9A130EE605E61F77FC1B738ABC7C51CD46EF8171
+9098D5FEE67660E69A7AB91B58F29A4D79E57022F783EB0FBBB6D4F4EC35014F
+D2DECBA99459A4C59DF0C6EBA150284454E707DC2100C15B76B4C19B84363758
+469A6C558785B226332152109871A9883487DD7710949204DDCF837E6A8708B8
+2BDBF16FBC7512FAA308A093FE5CF4E9D2405B169CD5365D6ECED5D768D66D6C
+68618B8C482B341F8CA38E9BB9BAFCFAAD9C2F3FD033B62690986ED43D9C9361
+3645B82392D5CAE11A7CB49D7E2E82DCD485CBA1772CE422BB1D7283AD675B65
+48A7EA0069A883EC1DAA3E1F9ECE7586D6CF0A128CD557C7E5D7AA3EA97EBAD3
+9619D1BFCF4A6D64768741EDEA0A5B0EFBBF347CDCBE2E03D756967A16B613DB
+0FC45FA2A3312E0C46A5FD0466AB097C58FFEEC40601B8395E52775D0AFCD7DB
+8AB317333110531E5C44A4CB4B5ACD571A1A60960B15E450948A5EEA14DD330F
+EA209265DB8E1A1FC80DCD3860323FD26C113B041A88C88A21655878680A4466
+FA10403D24BB97152A49B842C180E4D258C9D48F21D057782D90623116830BA3
+9902B3C5F2F2DD01433B0D7099C07DBDE268D0FFED5169BCD03D48B2F058AD62
+D8678C626DC7A3F352152C99BA963EF95F8AD11DB8B0D351210A17E4C2C55AD8
+9EB64172935D3C20A398F3EEEEC31551966A7438EF3FEE422C6D4E05337620D5
+ACC7B52BED984BFAAD36EF9D20748B05D07BE4414A63975125D272FAD83F76E6
+10FFF8363014BE526D580873C5A42B70FA911EC7B86905F13AFE55EB0273F582
+83158793B8CC296B8DE1DCCF1250FD57CB0E035C7EDA3B0092ED940D37A05493
+2EC54E09B984FCA4AB7D2EA182BCF1263AA244B07EC0EA912A2BCC6CA6105B29
+044005DDBEAF88E0F05541BBD233977A447B469F013D8535A9D7023CC0FB7B49
+A95CD2B6F18935C37F49E9A73E97A8602C5C26EE13D7A04A188336FCAB4CDEE0
+23DE9D803FD6E8D846B3F729BD36137E834E016242CD2F7BF048959DD45AD413
+19B985D05E5D422F3D0968375EA6A90FBEBF8B42B15F15280469D69629C08A42
+1C298CC027CC288B9C984239ABB96B6A891C1360D08F9ECC22202861E4CE9B39
+8BF7664E30EC188FBDBBF995890F9AC6C923684A02F6C7DB89154D09C81BC7EA
+9A2B34C9806216117E5533541980DD76B8046BB7221CD2EFCC188EC32B66085F
+E42A6892DB535EC02828116588FBD74EA4E0E3BFD88684FA6C7CB71555AEF77E
+0D78142204F285CCF060D964A7967A6A2154B3D08DFE2B2322FDA86ED5D45470
+EE9B589449C6DF08697D3BAA6280D74E342FC602E5FD61DF2D74FEEF1DCF80C0
+0497F3F1208A9E574D216C3B48093AE15D11F9847624B5CF4857D570D6C0A907
+14D4843707484EA5D3BAE8D0672F6B3A9C8C1ED6BF4DAF2A81F5C7FC263CCC8E
+9FCC30FC885750FD23B170C4A001EE0D0FB35BDFEE911AE9F70A8C66DB17C60A
+4AC74DC48522B655F231C01E4C61E959B0A0CBFBF001FB0B42E4DBE9B1A6BF9B
+4D20B0DDD45F462FF4719E893B5F61078860087D3DFBBEF960E1A6F722385F99
+64460E5CCD0EE6CF95744E2131500B2C691795BD499027BCEBA9731B15086FD3
+774A3BADBDBE26012CF3F4001565ABBB2C4642B339BE77343AC8511D720B6272
+2B606999427A671063AE9D97DCC822FFC39E654E077129B2CD9B295061BC7AB3
+25223A9DAF1D6835627FD62317CF9BCAF55B04105D22963838F3B4D6ADDA95CE
+E5E49A6BD2E7AFB72E564607E122C179D823DAD649C5919671E2B53A8CC683C0
+CEC0E9003F04E200FC25DF5CA616B0B19CF230F6BCC671BE60943E3D440D2291
+0D15111AAAB83B4CA5C842369690C29408DD421B5EA29E17974FE032235AC25E
+2019D3A4A5D3F45884F5C44C08C35C205DA1C032208EB9476C6AED686ECAEA46
+D63646B2E652FF872928055BD6A5310D185A6934C286AAEFFE58E650F4CB967E
+D6E859A734B62C19D3CAA63D31C71EA216D3EE53C3E8E952ECE9DE4042C95BB7
+EDDDC9353F5DF524A30563E952A31F5D040DAEF1150F87E400A4AF38DEEDED55
+8B0F4C717E44D6C4B9D6A517CEC4F8A3525ADCD321F12F81CD82D27E496AC1A3
+78C42B954025DD0B1B28DE9AC66BD9AF171D66B33FE1492D087FAA0921DB8CC1
+D5C0972020BCD8B667FC0A249AECCB8CAD6741DCDD06F0364613EB26DC2B95AB
+14CD7503667EAD92084C99037F59BE39F98AC2D02F88F341C7CDD72EB1FF7D68
+4754AD07D2385D3415E04DEE3ACD5DAA941585A1215BA426BD5E53A62D60DFBA
+937C45B0F9CB1E5E42429B1747DAFFA43E4A5234F34B7BF0D10442D16DBF1D0B
+7595356E73BE3C85C11BFF63E26DCD1B4343419C1308E2312527E3992FC6515F
+0143C7A98099668D8AA66A432D5FA26806268C4D6873EE7C3B90E0A368168C33
+3FDF8D483AE0151E7C9061CEE544699BEE1EF5E8BB9EF897745FAA7CB2BD3803
+BB46F0E6F01ACE744482EE4D86662DAC3043C5716D0E2A77DDA3117C70F7225F
+CE2EC1CA00663F019A14CCE473D47820ADFC620C3E2F9AE0BE50E909934B25A5
+8BCFF6D057F22D43AFAF475750EFC99FBBB5C1620C73FD26F4145F8542B89CED
+1AF6E4D044F4D1F58E8B7F3D655112975D8D996F252383E4B93A851DE80F6CEA
+9251942309E3591CA732E1A9CD8AC2ADD5BAC4B0BEF318BE73C15E2F07C03592
+3252891CD1D3FFA120BE2A496FB417D683E0F22DC0EF8F0F7303DE3DEBD6811A
+EAACD37AF708C641A75FF6984AB0E9FCDBBC3F0A45DB5A146EDB1F99BE208871
+BF643DE15F237F192F8D990612F716F2FC81EA3ACAD89639158030322AAE35ED
+EDF89F0A8F41A927D5F536ECE5EE39FE6F19E9F9966EB5814C24134D70F44F6F
+A79582D296E362DE55CA27C92AC8376DAD8BC0EDB5FE9C60B0577C60297A7F57
+9C940CF66E5E80BA5F802D584F3227C1C7D5DB243360F94AF4D7C6AE6BAE5FF0
+47EABA66F54F49EDC0A2D35C8BF5310930515EA95569A00C76EA23BBDF958EDE
+A1BB8F10693AE3D778B473A350DAFA4BEFB26CD56F99EA0B60958C43BCF78576
+048503553CB41899066F60F6722EEF4FB78C72DED9883C2207B0D72EBCA8360E
+EFCDA95AF624DEBD55AC802A0A9EC0AB78C7D6773ABA1638D12E20712EC4CBCF
+28981E3F95BEED6FCA15DF4CF24C8EEFB0AC314466E97060B7E5D4C23F261EF3
+29AF6D53C08814D9FB15F50921A37BE6A3D663A33BA80B6DC2181C4D654D048C
+BDF2538423B70EF21C07CEE7C6F53A65E20F861657BD5C9347CE43CAF97FA1D2
+2E3AA12CE29225C0E52F5E75AF09F292F1027DBAE29AA7B40C330F4EB52A4216
+06A01645A9564C875A701A4D323D7A4E52131981A044FD52B4EC7156DFBD021E
+DFBE9AAC28C4B6E7AAE4E000437ECE23B404A5DF1E2EDA2A256AC8893B82BBE0
+6FAD760865E409D03B865B878013CD3C74683D66724E6A76078579ED805C69A9
+131C90EF1959BBC9C833807D10A3990015F75C7338676B4EE320B6EE7082327A
+2F8638A6AF9D40D28E56633D9601D24325DD1CFC96033012D45B545565CB67F2
+79BA7F6B638CC7416BBBB078D7298E544D015154D56F15195525D351156DE994
+93D242FDF8DABC24E050F995839991BE0214BCE0D796CE1456C82E28F546C17E
+F7031B8068036045ABDCCE01807E44B171B50385DB3F4A5FC967312B7A1899D4
+B0DBD1B2D935C7FED91DD3BC8955C0CC6D1C9FA894554AF16A7FADA0E30EC20B
+E5FDE32C0E94322C2E0CAE694CA62A555929C8CD57E344F04554320D8E8ABD1B
+7E1AC9A4CDAC38168C4BCEED9D9BA29C321C22F7A4C17504FD6026DF513B4B0E
+12F0B1234C555FB7EC19D704E11F3C8FF22A59A83E3D37FE4C74E37B709B4CF8
+8A054BBF6C915590B87BC824DD8D52C5DD074B605991C4C8E276ED8300EB974A
+486D59C7DC277514C57A8A835715B4893D4B7820134B5259DF699728E20E85EA
+90A2C5E0ACF963D4C337904C48ED851BFE2CE7C71DE737C48EE172E57DE7BCF8
+4A7542EAD0BC76D813382AB254B9898F0929045F841FBCBD085248F04437F368
+9998D93E1CB93B96694520EB0E46B0C1DC8A272615A4EE1A5C89B116F0E0D596
+F3B729A2760B790663539756611F27BAC5D0A5B007411C48DEACD10C3B85E6C6
+079172F9F7A81097BC12D1ADA805F06A7812952456687747B3621D7979C46F14
+CAE2EEBF488DCDBA8C10E171A2312373D166053A4864A0BFCCB958AB52526514
+0638C3C42603FF8613051E851B5177B67E19EFCAE16875079B1CE8B07CCB055F
+FDA70BC4906562A76BD4DA1A8A7D57187F6477ABAF8AFBC49FB0DEB3F62213C8
+41F5A469F84152D20B72A1C48D8072E87E3841C2B832F28A7EA88E4727457DCB
+A9DE91010E83ECF4788A7B2BA0C10223AF216AB589924FDD22068C390B04DCF2
+E8809127CD20C4A41EC45F92FCD7F319FEC50C84B0317FAA44CB7F1245268CF3
+6BB8067AF4862D842F743E282382A55A82C113513A5576490C5059AF431A2857
+301CD331301A2F92D6E8BAD6EB47DF90BD21E561AAB2ACED9DBD9BA22C3CF522
+B6E10919F2CF1FC8CA02D44935C29CF8D3A7330A91512982E219D56CD71AB196
+38262D63B4676AE3A30C416BFF50EBE68302337FA27EF74227D64FAFB424EE9E
+DABFDB7150D5C336F58A2FE9AEF4538519377833A857B11C8AD51D1A093B1AE9
+E091980F3850A8EAB2633CD9090293C798200316B85E292AED878AD7C28CF0AA
+5F970619E2C0413B2B719ED01DA74902D163F0C13DF48C01146A4277E42AF371
+C3496F5570EC1EBF769F1F97FA142BD660707028BB3A5F1EFCB20DF215D5D538
+CC6770438F7B86D94AD64D38BB3F62099C04B8FC6F864665C4B03A178A3DD738
+45A58A082E7B6DCE7CC82FAFEC2DABF443F9C0A792A426AA5EF425517B47F11A
+C6E9B98B1D468A3F6FAD221BBB69E808A900A0098784A890D32D88F3219B528A
+18686B5DDBE6A683967C4CA31A83214E9CEF6DB42C2FC3E18C4CE373ECEF038B
+04F26953932B5401F05B91A0C636AA111063BE72DAA2A60AC9E7BB4D8C3572CD
+FF032CD4F6BAEEF136C02E7F997F6CB513CA2492190043E4D4C3507FB8408175
+0FB47C08DDC70E86D3BCF7F9DEB15DCA6583151074DF927BACB9707DD0819085
+940A0BCED41BC18BC7A62251203E2E1C010AB0F5B44A842356AF7CF9BEB013E6
+A10362D47360DB5067849C835AC20754F9C9F0B7FA13D6A8FBD171BBED1D13F0
+F030767F7614D4C9A0039BA0650A93773F703253CC3DFBC75A72EA0FAA56340F
+07D631063F347E3E8734A7E1F2D6BB3D5B91F9590C7DA355AD9F2B8D4513E7D4
+528410A1EC6A5C65EEF78659FD9E511B85DE680CF4EF104ECA236C3127C73013
+E2E31BC6B91F60ED27BA6B9F38700C402B0D758E8E2A54999D4D472E10EB4943
+F8EE5549DA1565F9C2265B3D49D2B14763824A16AA8718B664BF15B96E88D20C
+CDF7FD4852D70B71AD0369B3D89203EF7DAB69370B703CD30962B22C8D6E929C
+2A2F395C5A455D1701EF0D05076F2C40788B9DD7457F68A4A13AEAD807F544B7
+3A844D376D61FD49AF09E502B6F5D15419E31FD03355D261E55F36E989D6C030
+C06AB11E764F4A7B55A49E26D7A4D922F7FC1F7283774CB8663FB4EB97D3F50A
+A7624F4B2A8D5813EA1E1560BCBE1363515D1E9F4E45300D62F129F4854014ED
+754EAAF06528E0AAA25D31A1A5AD55F0C3DFB2F5DBAAC0E52DAFC207D6F4A006
+7FDB452F3FEF90ACEDF137D8C53E272FBF846DD677802BA13FCE850732B0966B
+92FFCC679CE181B5D5DAFE0FB943922020DED0AF242380359A673E0DB7FF8ACD
+B0F1C1EFB5A26FF5793999E43A8CFD9BAD2B733D5F08A311A99AAF7BE445B94A
+0927E34D4DC4480030F5C83BA2EE9D90D4DDF2EE0466F46B3FD776DE0A402653
+84CAEF6C8325325D7E99337C461CD248B1ABE857A9C296F6D972C6524AFBA089
+0E3BF41644D39860425A7B08FF8AF01A4BB7F33402A79452D5B48E5DADB3F87C
+C7B41F8A650AD7FFAA2B16342947BB0224D225CF5EE8BD44B2FAF79A7BE0A654
+9FA6D04EEB57B287D46F202FDE071F01A32C6A561FB819E98AF25530EB1EC4E4
+CB3560B348023F4CF9DB99106DF0FD87CDA9C8D1CA702CBE54F1C4E6D97206CE
+A03B809D519566C03AA8B03AEC9D598307EF18230B707ADA01E53CFE7D3DB5C7
+568316F1A8DDFA54271B1F9CC0C1DBA583A0AD4073AACA046CB46634A60CC862
+7688D6DBAED47297898DEA914C5AE1D8A71CEA4899ACBF700FBAB0E08AC24EA3
+DC41F3917C021D37AECC1E7A7BE39B87000C8B1B6405706427F27984C0227AA2
+F0BB1D0579F196D83C548BB1A2BC0E5B4C49C27DD41FA124093491691C878C68
+EF2F8C915BD3C99F96048AAAB7D91B29D71382414836DED075E235107AE38268
+D1B393E06B5609245F356C9B01E10EF0B55C46E5A1C0E2AEC7B2389BC1CC113C
+7A9C88507D98BE861B808EA46023BA73C93EEB1B8EAFF966B0EF2EE668096B61
+61BF2B0812D072649B8DA55CE03CB0EF48BFFF6FDEADECAF2FDA4CE65D8A474A
+B0644973021205DE39FE838BC7B2C792BE051ECF3C0C4B3FCD3DE7AF823E28AD
+9EA226B22167652C0683A4208704F451EE311FD79AAB849E08C32345C0BEE452
+31721906A7DC9E67C02A2880E6B69205D8C777E26BA188E08CFF8E08078F3020
+9A40EAF73E97A572E69BCB6BE5C1C99FA8BFD598365B59CECC3AA6CA03B1C3EF
+FBCFAAC56444DBA3B1FB8FE554E8246885DCE707C7955D155E4C43E74133E5BF
+4B44B12CE27C79527A570C3C372770D95336AA8230B7ACD6012677735010FD38
+BDE62AD2F00157DC69292283122923222F3C984E81165B872F299215510397F7
+2854D3FD3DE0E96E7085C72DB587F72AF43B99A12B1A038DD95955A5312E091F
+73DB034DBF4A879777F775B0DAA41B5D938C1D775D32593B7F0A03A29CD4A67C
+8AACFCD20E38FC2B7E8058E99EC7219E951184E8E505A3179E9DF64F6C4D676C
+5826C834DA3DCA57A30DCB0ABA997A072D700D8B143EB4D9458CD6A772CCDD66
+9AB2A29BF7E0936C694C27646F2C2D32F046A3C9E09A2923E06DADE28236AEDA
+4A310B56EF1E538A53B3D1FC282A40F30EE9DF5A280AEAF2CD366B7F03608E36
+C83BC963F528E05695063EF1DD3018A0A98E7D48613D79ACD285C5BFFCAEB04E
+4B428CA13FCD0485B2FBF3ED199C4D90350326EDEB23E9E357624DD406ED79AF
+75E4DAADDE9879FB03EC6EB56CA348D6CA73917FD53150F0EAED95738B082426
+B54466762248286104013D4861050837450ABE706B43EA7E74A87C16E3CDB4A8
+925D3185DB0136DBC3493F3E1E89B90B54FE1822F3C6757FB5A11A
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+%%EndFont 
+%%BeginFont: CMSY9
+%!PS-AdobeFont-1.1: CMSY9 1.0
+%%CreationDate: 1991 Aug 15 07:22:27
+% Copyright (C) 1997 American Mathematical Society. All Rights Reserved.
+11 dict begin
+/FontInfo 7 dict dup begin
+/version (1.0) readonly def
+/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def
+/FullName (CMSY9) readonly def
+/FamilyName (Computer Modern) readonly def
+/Weight (Medium) readonly def
+/ItalicAngle -14.035 def
+/isFixedPitch false def
+end readonly def
+/FontName /CMSY9 def
+/PaintType 0 def
+/FontType 1 def
+/FontMatrix [0.001 0 0 0.001 0 0] readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 0 /.notdef put
+readonly def
+/FontBBox{-30 -958 1146 777}readonly def
+/UniqueID 5000819 def
+currentdict end
+currentfile eexec
+D9D66F633B846A97B686A97E45A3D0AA052F09F9C8ADE9D907C058B87E9B6964
+7D53359E51216774A4EAA1E2B58EC3176BD1184A633B951372B4198D4E8C5EF4
+A213ACB58AA0A658908035BF2ED8531779838A960DFE2B27EA49C37156989C85
+E21B3ABF72E39A89232CD9F4237FC80C9E64E8425AA3BEF7DED60B122A52922A
+221A37D9A807DD01161779DDE7D31FF2B87F97C73D63EECDDA4C49501773468A
+27D1663E0B62F461F6E40A5D6676D0037D33F24E2FAC2B0009AD3C8350CDF8CC
+65BCA87979C36D14CB552E9A985E48BE4E88ECA16DF418749AF04FDD2B0E1380
+D281BB2476BB45FF30946B247DFD7F57305FA87E50CA338121C71CDFDF927A9C
+77FF14CB4A1D6D80356FB1171ED38C37702350497B44E42CE31DB2F493807DAA
+15B887C671199A54C4C1294BC520F5538C15556BC43C9F62342B121C6DCD6C5F
+491DA47FF360201EE21C08A781ED0589A6DF91B99FE118B9B29E4F068672E52F
+1A06C514D91C4C937D4E642503392B1CD1BF5AF0BCA28EBD840AD76CC39AD7AA
+CF2C05711374F7849708E1106F88737C9AA60612D384CA8C173FF1031EBF6EA4
+176136DE1B9F29E40E82680A2CFFDC24DA05853307F1D1F6537D061EBCBCC5AE
+E6316380ECD8E63ACBEA9FD1FC28949366850AAABCBC9552CAB2CA3BB934C8A2
+14C9DFADE24D9214858B1D42B2171DB18A475AF78868C2549F19555AAB07F586
+58B28541C74E14F28B68DA42A9D46C031CBD74FC09BFEAA3AC1DDC68B7B71B81
+6003C9C6AC8EDDDC046D247A2B8AFA63A3B1BA1F12AE0B4DD07327F0138BF470
+4630E4B5DA55C194F454EE2E872E0ABE6B879DF2E87CF81F75D79F458F7D3F81
+FDB76C15EEC4125D18685E1D8591C54C0B0D069E2ED73434617B9D30E64457E6
+1542E4630E848948FF2747D5C31B9C314AE108931003DB9F76644DB43D245499
+2D28E8452E50B1945E13A5DE2A8B93523D3671D1C7ED07EAB6FFB559E5A1F828
+B22D2FAF349B40C3B31FE806595F67C5E75260514F456FA0013668D948619514
+0EFFC35C1AA131AF8578A254AE62CA75A6631489C78CCE633A3B302BFACB
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+%%EndFont 
+%%BeginFont: CMCSC10
+%!PS-AdobeFont-1.1: CMCSC10 1.0
+%%CreationDate: 1991 Aug 18 17:46:49
+% Copyright (C) 1997 American Mathematical Society. All Rights Reserved.
+11 dict begin
+/FontInfo 7 dict dup begin
+/version (1.0) readonly def
+/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def
+/FullName (CMCSC10) readonly def
+/FamilyName (Computer Modern) readonly def
+/Weight (Medium) readonly def
+/ItalicAngle 0 def
+/isFixedPitch false def
+end readonly def
+/FontName /CMCSC10 def
+/PaintType 0 def
+/FontType 1 def
+/FontMatrix [0.001 0 0 0.001 0 0] readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 0 /.notdef put
+readonly def
+/FontBBox{14 -250 1077 750}readonly def
+/UniqueID 5000772 def
+currentdict end
+currentfile eexec
+D9D66F633B846A97B686A97E45A3D0AA0529731C99A784CCBE85B4993B2EEBDE
+3B12D472B7CF54651EF21185116A69AB1096ED4BAD2F646635E019B6417CC77B
+532F85D811C70D1429A19A5307EF63EB5C5E02C89FC6C20F6D9D89E7D91FE470
+B72BEFDA23F5DF76BE05AF4CE93137A219ED8A04A9D7D6FDF37E6B7FCDE0D90B
+986423E5960A5D9FBB4C956556E8DF90CBFAEC476FA36FD9A5C8175C9AF513FE
+D919C2DDD26BDC0D99398B9F4D03D5993DFC0930297866E1CD0A30EB76029337
+900ECFB1390CA5C0C3A04528044F266BA17BE487C79B94FAC6D6484684C5BFEA
+87BCCC77D40AD11552035E95E3007126418ED49B68468B38A14E88E68A267B98
+076F1C9769A5AFBC285E5B158EAC9F926F1D6C0B8F1D57D9C31D25AE27123518
+9D2CD92E5689E0213089BD268DA5E47525CB8EABAA4B78A15AEA34705889AB3A
+FFB8953B5B3482E52BFA0940630ADF8C0AC2177D907324299EE980E850F203CD
+B627962F43D5A678C44243CDE97853BDC6AB45FD5C09AD274DAF89929F583CC9
+CCC24BDFC68B92111055ABA5F26D2DC67C70906F71C2957701D65AE746A60C30
+40E6CB24B97FCDAD0487AE38A201FBF0E41BABD2181981A71940F1E707F91E5D
+C8CA50CB16D8702D188E56D014D92F76CE0B52ABDB9110E32438D2BBF3E6A40B
+7B005F10BB437812CAC6ED2996F7606DC962C4FDE207FF322782C343DF44CEC5
+FF06A55C630C20E9AE1B0D1C5673753C43BA0767D65D1B451CC6380D8BB3C4DC
+81E8FD8AA79BE993218686F29D3CD925566DD587F541A0DA1B1CC3BCEA2E6C7D
+5E1016F6917A871F1BBAD96AF9E867735017119A381FCF33EB2D3E1E7093FD90
+CDB0CED4818CFD9E201A03430CEC713620BE0D3254158931FB657C6877C1B3D2
+24030F377820DA58F4B95CFE645109F3F1B80DB5FACFD7D05AE2909EEFCF95AD
+9CB286C8B6C075CA2267C101B736139863186C193E31085E7C9FD88EF8BBECE3
+933542C85309013325B4BBFE9A5B606780C8580ABDA2F5D0064EBFC23939B307
+08568C3B7F5F053BF367DEBA349FABB9F760C44D100BDEEFBB01F27BFC61FCD9
+3BA0C4AE0FF4F03CDB67A59BF0FA3EF565B71B6B46567F47386A37B73DC3EA3C
+83D600659CBE5CFDC9B84CE11D659D83352F5B6E9FF599E0E25244709CF94999
+F4490F79C766FA55136CD85D8BF793202FDD810A61844BCB7ADC5736C338B72E
+F6B6EACF402E22501162C7B985CABBE5CD653BD4BC882F3CDA306B8D82F8C256
+D66F86BB8D800556AD53683E35812ED61470F11E8444F0A97CA096FA37EE63A3
+BBABA37D240549D95D6FAA5EDE9867EE2CFED7EF929B833EADEFB9E4E9DB19D9
+2A013D3884F1A17AEB95D189CED0F4C80FFAE18F71733697202DDC4ACE91E6B4
+600332FB49F953444AA7005E65DA787EE3953EA2B0B928726553C7EC1309C5FD
+7B0B7AAC5BD4E2535866540043F5F6815D7171AC447EF63D8B79471B41F50C94
+7F405419204A80C33463AB00205F51545C7C6C723505DF68238D2591C25B7627
+7FC0F4A215B2F8F225A11763A97BC2AC25E060ACC4D3D6D3DE9065A8A2197F78
+EC0CDC9AB6036F8E6E83D0D099E78029C5A755C00A5F24B5F6EC435558707430
+C6C966526F7ABB1CD635BAF4BFD9904282239A224EDAD8330344A1796FB18580
+965F34F885F28CAFBD5519411FC833A319F8265B8E9A97AE064B1364B9A5A3A3
+C59E19620A53F82B108D9C48FD240A5252D2ACDBF4498973E31C9FF3AD4D943D
+01A6F9DEDC0060E9AA8EC38DFBEEB5A63DA4A6FC9981F3ED71818C4F3BBCDD6B
+4652824691C369D1052801AE761EC8CAB9EF46C6F820F88874B1ABB8FB907C14
+03C8990FD8106C3DC14882C3F651BB89B9E479B7ACBB958E39CE4279F8173F2C
+50369D3EC79B5679E8D3BC42B40C896B2A73180E94302FFE0AA5A6D6066CEC3C
+116115189CB0FE5B0700E898D624CC772E932B4ECEC87AB7DF9B71471ED7CBAC
+B8BA84825E9B2F69040D31CCDD677BEA51C6B718E2D1B86F718E3E4F05F1FA1B
+5B1426412EC3539F5499D3F31C78CA1F8C72F2E7674286A9F9B20871A0C76CE8
+E89CA4111EF6628FEA6FBE7D20853111EBC40167181B8B5D97391502C960AD15
+596D6B0D81F3B3E92A2386D378BC5B236BC35941963E587A08EC126F7EEEA860
+89CB644FAC8E77EACED049D7EE276760AAAD684E68D0126C7D22F180A132F942
+5F68A03E7EF07C70B50DC802FAA05BCF9E2EF3FF8B3D3F7C5963C4DFBEB9D11D
+899AB25979042DE940F02561249269A038B76EBC29ECCFA0D44C055319F4792C
+2B7B4CC47AEC4C83A349F0F3B281BF62B62DA0FB0D8F24A8CE1F73024815A802
+E08B9BFD14ABD611C7A9F764C5F91AAB5BAF2A2E46FC269495B2366129E3DB47
+D09E707549900C0D1578FE601E8EB803CA6BB80CC5A488F9B7F1D923DB5D06E3
+BF1E03DBADA701639A21B9CDB67BA8BF62D308DB4C460DAF18D4622AC03912B2
+4D904D416FB927600B42F271DE15F7286E52E53DAD4F2CEFC545845E1B7AFF3D
+8B25FDBB6E7215769E4225DD284F6D37C785FDB0C7DF182B54C443100EC58DFE
+18164FE653B9E5977148A6BF77BD089EEB8286024A719DB721F5D9EFC46E1DB5
+DDEA3CD883169686F0534B35EC91BB2BA6971F9FF44E8691A9D8C8E8C0262A6B
+F20B1497174C8A8FF6B3AF1323C59CBA4E3489BD8527FEA652B404AB552DBAAB
+F5FBC44D7BCDE495895A50516C6E9A10BB8691DBAB29506D703167134D567F83
+951418F611CE7323659EE60EACC8000F6BB0F7440C65BE980D82752CC3823169
+D2C934514CAB71FCD8C8FCE139BA03DB6BC7B9557E7B0BDC14681FF3370ED2EB
+A1B9C315C03528AA381ECD389EB53833074668FDA5DA2282E7E4433FF7B94457
+C3AA2874BFF73FB21A55441D3DD11489B5E0A4E8946D3F273EDF5A845587A422
+1915696A0D1B7C8CBCE3D3031A69DB3101AE7F547628BFF38D8E383DA16B52F0
+3D42676AB459769F2BD50C8F3CE7A6DC0430AC385636087783E98E6A4582291A
+F34E3F6120E5E2282C765E97F8A99EB922BE98FEFEB86587C63E9B10399F00AF
+CDABAFAD8A1EE367149C4618582BC85DE5D57FE6B7E8254E8B9ABFB9F4AB8635
+74A449F2AEC35A84ADF4ECA4940AA2AF136DA60EB8797EA726763974376893CE
+8F799E1F75FC012D4A41BD5A9A766CF23BE98CA3D31DDEC59F26E9E6531A3BD6
+3F4DEC954168D0CE948329C0DFC1F212F781C31F84484EBE4ABEA55923C9FBDE
+34BE6DC02B1A9E0EA6AC9F0D0710B0E88AB7E6D87534522D98EB39B41DF9D960
+CEA4A65D6311C0AAA6E189399222ED5B2F1728C7218E45E49923445FCD858633
+C8019929170C50BDF8411822AB2759A3CB38908E1CD5598DD89F68DF0B905204
+030F15C16AD938DB3389026234AF4B069B9EDED52215AA2B21AC72D505F1EB58
+88EA6D61E815EBD83D1BA7A6DED6F45A8F6AE0039AD41C88C4049299C1BEBDFB
+A464C2F55EC061926DB93DFCFE19A33F9EDA3971FF1681FC001AD37407FAACC4
+56CBA2C45031ABFB1E96E5AE1F7E4645FB6AD13702453FB79AAE8EF6B5D6CA9D
+1B3A37D4E80E9ACE57BF6249E3D1DF36945D9493FBF83AF7BB9F038AE96D364D
+73C2120587CC6AE260329F0786BEE3F282ACF41FD7DE5BF8E7DCFC3DB19E09B3
+85CDFFC5D9608B27F6ABAB2A0CD25FAE183D06E7E55C002B3A9200632DD9D964
+E8109EAC946C4C272006CDBD6CD8C2EDB0BCCEB7C5C25C9B6C7D881794533508
+2029A936DA935A17802F2EB438B5425CEFB51CEC94A7AB7A1558F0B132F57DB5
+ABE34B5ED234DB394D5764816730714AE3AFED28FF069789CD75B70CB7ED1C7B
+1D9F547BF6223C89F97C62D1DB03221A7984620DAF68EBEB934E2C1EF4E99038
+0BC9DBB60B893F8078480F5BAB81A981F849FBB8B6E9E64589D4BC777A493B08
+570577F541BCA84CB0AAFAD4DEFECE229C7E507EE332EF7C2335E6DC0EB71F79
+38EF17EDE68309834527EF9EF92C61922E5621184D850A97437332FB6CD40123
+C56153CAD67A63654221BDD5F3D04EB25D370A3CEF597D5EC664831DE2DF99F8
+CF42B7E665850C30610E9347AF7A8B2D2F6754E2C8807CA049253949E63C0C9C
+68FCE32046493B2E9E1622AC65F30AD17CBF3984F2DAE2B6D115D08A23B0B2E8
+C0568E23543E93C7480C9D73A7062B12F70F0A556FD197B92ACA0FD60D157236
+FAD51D36A8B8D1E81C768A88B2E9676E453F89231DE805877EF9A71B1AE80699
+1CD0C463EC1596B32B985DBFA9725AB31D23C40012B48BCA5D992961C1FED5EB
+BEFBCA7952AE46892A1DBB8C25DAD22CAE4159CC9B9CFD26BC91EA9E4A8E50B3
+6B04B3C75398E4B3038BA8DF88C51404E52EA5E9BD6E87F35F37296BFBE0BEE1
+07289BAC29B72510F6DE0219B636008F9D506249FED3D58B33CB47F9754089D8
+477B55E61B0FBFC7164B40B2FEA4E45F9966FD7BDD758B24BDE96D7E8FC5EED8
+9FB91D03A510EC8D2063C914E227497A4252C00554D745D35C7E2E59D4A03B9D
+66E72D62597C1FFB8F9A5889C1766E6701788E8383A0F9287CCD75E72EFF20BC
+702B606314BAF95676FB696302D25F1B1BF9417046A37D53858D2B8A5A3FFEE8
+FBC245D6F93DFA01460F98147E2D159D09C62E76B67E51383976C7CE861D4041
+075394791016B1EFB6429B4FB930792939820AC1C553F2B3E6691E09F0632689
+F59A1A8838AD3F8F758C0B79D5DE4BEE864633264BAF10EEE0E6D501A5EE9EEC
+3750CD6C91FB9F7E679A0B02885E8437764797BCC0613905B9CDEA87918D9E31
+EC63F4F1464DEDE470C527174B079979085BC03430CCAC7A92F7DF83DA2DECE2
+D770949B3F3FC1012C1EE7531E8637533507AFB20869F1323EB98406D8631E5D
+EDDDEF57DAE60EDB26BF66DAB185616D4245D0FA92A314F3995E8C7261443165
+A81E250357D84A0642395D09A017E324A381048D8A9AC7D42F7D1DC471252E26
+DCFC25EAABE8C12E59045C0BC2F790C8C71A7BB6C0FAF914940BB78310C38A52
+74A6A3D3B19382171B8E7AF8A9CAE10512E942D928A52F10D4134FB66C60A915
+FB663A6BE31AB27F6F7AF2F121FB6BF1AB79C76EEA3BBDCA392F4EE64DF93EC4
+AF5D2528E66ECA77E134EC3D4368E0AD8055D782D5BCE2E43F5830F34AD1D64B
+9797DF1416046326290DCEDF3EA07175381A8C1D268B5A6E7C7C864AF59EE9A7
+1E1042EE5F23D303DB1B0A940D7C40950B4F7C60A78AE637
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+%%EndFont 
+%%BeginFont: CMTI10
+%!PS-AdobeFont-1.1: CMTI10 1.00B
+%%CreationDate: 1992 Feb 19 19:56:16
+% Copyright (C) 1997 American Mathematical Society. All Rights Reserved.
+11 dict begin
+/FontInfo 7 dict dup begin
+/version (1.00B) readonly def
+/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def
+/FullName (CMTI10) readonly def
+/FamilyName (Computer Modern) readonly def
+/Weight (Medium) readonly def
+/ItalicAngle -14.04 def
+/isFixedPitch false def
+end readonly def
+/FontName /CMTI10 def
+/PaintType 0 def
+/FontType 1 def
+/FontMatrix [0.001 0 0 0.001 0 0] readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 0 /.notdef put
+readonly def
+/FontBBox{-163 -250 1146 969}readonly def
+/UniqueID 5000828 def
+currentdict end
+currentfile eexec
+D9D66F633B846A97B686A97E45A3D0AA0529731C99A784CCBE85B4993B2EEBDE
+3B12D472B7CF54651EF21185116A69AB1096ED4BAD2F646635E019B6417CC77B
+532F85D811C70D1429A19A5307EF63EB5C5E02C89FC6C20F6D9D89E7D91FE470
+B72BEFDA23F5DF76BE05AF4CE93137A219ED8A04A9D7D6FDF37E6B7FCDE0D90B
+986423E5960A5D9FBB4C956556E8DF90CBFAEC476FA36FD9A5C8175C9AF513FE
+D919C2DDD26BDC0D99398B9F4D03D5993DFC0930297866E1CD0A319B6B1FD958
+9E3948FFB0B4E70F212EC976D65099D84E0D37A7A771C3101D6AD26A0513378F
+21EC3643079EECE0C9AB54B4772E5DCA82D0D4ACC7F42FB493AA04A3BF4A1BD6
+06ECE186315DBE9CFDCB1A0303E8D3E83027CD3AFA8F0BD466A8E8CA0E7164CF
+55B332FAD43482748DD4A1CB3F40CB1F5E67192B8216A0D8FE30F9F05BF016F5
+B5CC130A4B0796EE065495422FBA55BEE9BFD99D04464D987AC4D237C208FA86
+0B112E55CE7B3782A34BC22E3DE31755D9AFF19E490C8E43B85E17ECE87FA8B9
+1485831624D24F37C39BF9972D74E6EC4784727AC00B9C4A3AD3DA1C22BD6961
+7E0ADAF55422F22ACA5E4DCD4DF9FCD187A566B7FB661D0530454D0DD6C6C50A
+7A3875C6CBF8EC7769F32A1F3F7FC1C072BADEC97794D4E90E0035282A170402
+356E5A9CD9ABD80AC4342A5283E458A7269252F4541CBB6452B39ED54D336D0B
+19928E9CD1AB26AD83EB209E2EC75011A2643813053B5DBB0246097C4821B5F2
+C92554E9140BE35B2DBFCD98809A8EC9FC910FDE9E0D86457C70ACB056EBF90F
+244DC0A5BBD455E15D6E3180311D52CF50B0BF7D0A7F64F3A1821E0AEDBC2E7B
+AEB549FE1D51088C153799C6E089B5D5D65E1C4E2D2B430CDF1FFA23CCB25D95
+5C4DD885310A706B320AB25C8D742C6F29953254FA54DAAEE60ED477877D19BC
+D28E9AB576B0EA088171FD000B60D73B3C57F754BC07EBC9BF751B7D2B32459D
+993861B7C4B0D98C422A11BECEF76F4EFC0ECAEE89723E6CED53E3678D733363
+2DF068AEF0FE7DFB57393BDAA439A6A4C396F86032A98009EAE1247B7DE83B3B
+E46DF2898598FF5E6CA6953127432A967E4FD41CDD60D6E413059A58FA556EF3
+309178B57C16A763CFC9BEEC276944BDEA255789EF4E1ECDE1EA43EEDB955513
+F42EDDCF39AE522A1DC2D80B2772B05DA60F3DC15A815A6BAFEDC399C7956E75
+3851CB3588E22936FBFB63A58300298B11C45D82385C083D07AF133BB1BC941A
+FDD9F34D5E0B8087EF2A58C54D8AB7580EE3ED58AEB83B72CB9028F472ADBF11
+05A77651F118824F6CD00209EFB60C1D32D46A78E8C8DCB8B0E742828E3B7D17
+DF5200D68189C91FB8489CDEE8BC223C4281DDCA5F7DA80BD5C2D66A14695EA1
+5F05E03500579ADD440ED2C57F535807560C6FE3873143D792734FEAB93AE8DD
+633BA6FC5683083402BF086D23594AAC84A4868AFAA32AFBDF86142B350F8F62
+E2531321E4CCF34293024EF8AB617BAB11A3A5EDA03CAC5AC431C893607DF8E5
+C3DC8646027A7554625A16FD184A70DB5FE6DCEA366B64430A147144CC9839F5
+72829FFA42BC3A8406D680E44A0305C9C9E265E91AE82EDF30F73730DCD4AA21
+5A7A9D68297D84B0011DDDA6A44D8E6F0B5113AFAE9D3B0F66D6FB848160FF13
+4021ADD1556977B9AC95BF81148C1FE76F3992BC8B1DABC2C8F5FBBD4A3921BB
+70DDF314D78E41F0ED56721F313A208FF0503D85F125955AD86513FD8DCDC093
+9FA3C29076FA27B5C745162F14AFE7E8586038E3DB7E2BE20D81A3DF1BE04DB2
+BC54AAC9283F6D91107F0E64310C6E281FEB21EE5B594A052259C87C55A599C1
+ACD69F7EE902CE74E92C41A1C46D069F47532112FC183FA19CBCC7E726719014
+5DB5BAB855671B4853DE6F2402868324BD032B1A6C768FECFE1770B655338EB0
+60BE11C22C06C24BAA99A3F2274BE68D21A7328CC3190D0037F516B6AF555E84
+6E973C988B9604E6F1F09B5C6D762D019DDCBD6010D9F0AF6285ABE25EB7B9F9
+BFF99D72C7A4400DF9791643B5DDA95030C3625AB14F3EA5477363BB98D4CD2F
+A9033B18073769D640E8BBC4CE9C830E032540EE63E4F00DB9D720EBF2482FB1
+2B83D8DF7AE56BD45876E16D74E46768074AF8E48D4E329CFC2449AC998F5291
+ED88EA4F583887DCED258F32B20209A076708F97905C16B5009455247F4124B9
+4C717E4C13664409955254865BA2D380B7D7805A89079A2A5A60CA94602D99EE
+68BB219D9FDF7DE70901B9DA726A0CB9B76598190724AA6BAE22B1E47AA017C8
+D9280D582C9C3576065FA51C5D825992759A4E23D380895489A88FB3093C67BD
+4171D5ACC2492A288E5BBD0A38E6E8A7B8613B72429B5C9CC1FFE1D05C177704
+127B117860272AF357401701EE98E124E8E86450F3240919DC2D63914813A64C
+9EB4A6530331BFC2CDFBFBD92B5A13A185EF3E8B41C550FCA5266B0F57A0E1E9
+676AFFE6548CC834650D7596F3D694F2083654768C0F69B3D048CC64A17A8CA6
+468B4E0481CD050535296F04A44FCF6EDED22097D4D78AC1508A2B31C2388FAA
+638388975A4F0749A8D61D30365A497C52E49CFEF11CAFD5C9B4AF1749F481DD
+641485F4F8BCD527F04950007D981AE733F8091A1A4349906157E5FCC84DE8F0
+0D9BBE078944626EA7B8E5BB292ABE2912102ABA9768BA41E91EFA5873A5DC4A
+195D0AE57489432F1ADFA11E3C42017A5D0EA195E26943E0B78ADA4CC3888624
+387144527691845D8B804F657A14927F8C731D0F3CEF347F78C38E40E788DF28
+5921B5F6519BE9DC9F3813AB306DDEF740A70FE033B50130F5A46FD10A23A2FF
+06AAF650C9B0EC7958B6F82ACA9B130934635DABF279800484AE82621413810A
+21C45CAE15F4B6A802C5E187726C88E0E3520051D1FFE35AE531C02F71B0EFB0
+80E22C4E7EB9AF3A54E26391AA116CF9F6BD60E0FF108F8B6CA6DB74F7BB9F9C
+D672DED73EE5D93CD420E76A8849E2A2AB9A3EFBD689920D3454B1232A7484DE
+F2F8F90F70FFF349319F280502F28F12D5F322394F12266C1E79EFF3B5605249
+AEA0AEE1168FD180F839477295B04BA68B9C9E260D80927253EDF559236958AA
+394BDE3DF606E47C09BEB68F5E505EB2315DE891E3546EAFD782C89FA9F9A56D
+B11B8DD000E4403E698EC7A793DB2966584764B633A7ACFFE4BF62A9926431DC
+37808DFDBD97AAE9DF6B5A861FB12ACCA59E84544DF07BAD599277C7266D986B
+9BCEF6C380D0DDB4B16A79CC89456285267EBD523ED2971DE50F792693C1E219
+F2C57EDA81ABF3E9CC13CF1197F2ACF4BF9597AFD7CFEBD109CC0C86BE812EF6
+F0A5E412AA025EED7BF7F2C1BA835A13ECCA474A9FEB853807B274270300D814
+3330FB0A6C17F723F1272677F8F5B28372B9314190A48A0B00E8CE45DD657E65
+1348AC068D0211C67D85F3346F9D5D7FAB2A08D7A02295163B6B041661EA5A4C
+723DBCDFC8A471FD38C42DD2E32DB7721E3FAAD0BEAFB85853C1EF8B7702F2A5
+DBED75AF8040BFF1E9FF3643259E4E7F85A38F45DFC09B7C333AA44B2EEC1FFD
+993DA1E2860BED8EE41FA34543DFC0D760E0A47B1114A24EE3346C93A4CEF52D
+8AC99E6132A330AE340BEA2EA1840BA152A7172B14298BEB318A6FC2192DAE5D
+137C1323E6D1EBF0B2CC749F20CA3AC3504927279D9EE3EF97127619C3439EA7
+C28124FCF96F9BEF4A6AC960C44EE8FE0677366FC295A5EABE370A09AC5434AA
+3AAFDB8614B6C3187C73C9F94B61B369CD702AAC783367E7A67AFE50E621EC92
+4277CBC084FDD8865D6048BFA990B70C3BAAC6F449FE8D006DCFCD7EC2755AC9
+810F4E57B64649D7D1F8BF21D766F565AC2A7D111EAD60ADA3141CFBEAC8E139
+9E48EC7249564215A73679095E5FF1DCCF1AC0C8CEE4E2257C384F3E5EFAF857
+D9B3A043112D3E3383AB95F1AF132D156EC89442208E1D8F53183CF882DF3683
+44D1238E24003ECB746D91921DF2FA33B0AE84111BE54D62BE98CC8F419DC91D
+E7E8A6D6A371FD75BA160466606D8EA13FFC16FCED59E2CBAAE033A090B96901
+1D76C0C860D204B826C180E5887E52041206F6DF91C36DF6F23402216D108EC9
+C2438EB3023763B57F1AA0E4214535EC4977255390066A19A61E0C3F3E39409D
+19160103095DD99C872A8B1B339AF0FE551BA667DA429CF64B381502BEB19D83
+7E0B607F196058C874617AD90B5BDC7916AD706F696AC13530D111D70AB31409
+720193C901F656EAD781FAC3FEDEA7D10E0F90F6136C005CA83A41A6D5AA1B5B
+CA25144E3ACD36538E895CB56237887472C20D0CCE418DF3781F60DDF9CA7E94
+051F4FD7BC30867D7CC37118569E9DBD6AEED65CE04894EB8A1ADC2562660DD6
+AB91A2144509B93A933ED84F16441DCB7A4C44E6A000BE4E10C843DA3055C813
+57C20B8D61983E75F72B9ED5319EE95AD2D37E58953007DCA7EE86CCFFE5BECE
+6BC9F03CA47CEFE9FD5BE5E09A07216F5ACD8263398F99E708817BFF27194CF0
+5788F2E709CBA7F753F74C081D3068BB095F2B40635CE6404AC6EBDAFAACD18D
+04008B8154C38824D05B81F2A3F7C99516F792F49C73F0454394160B15C4FCE4
+4D4D769DC2559C00BE224FF52A9EAA550DB6F5F7375B900F1839AB3116693AFB
+669228F9B311F6DA24BE0804B5C6B2851B5ADB6C57319C4C1CC70E23C5CAD6A7
+B9019A21D8B50801B8977B766CD5D4E1FD37B19852919DB201FDCE07ACBBCB67
+1A3D34E40165D3B87659394297BD0A6604E11B1A71BF99A07B751888D74210DF
+5857EC4F22700FB057205F284BF1FAAEA21251A4713C6562685587C82EDC5FF5
+040AB083801A8974D2A008B59DD1368C13CE00FFBCF73B7A422BEF6EF8C08490
+B4070D2A1FFF460E4E05025CA6973FF082E76C4FEEA123A1D0A47E3D4197EF4A
+9786369446F3875B450CCC5389D6C3CDB1D0A64C8D5A5C316A3341DABDBF496C
+694AE97ECC77C2EC57040E83CD0916680B490F0DF9443DBD20BB97E543BBBF15
+E20049C76969CE56B0AEA28A28B6BFC3EF7E6BFC58C69339C927F8657ECFB631
+D39D741B012AA425937FEBEAF3147AAF1F18E3225666D94EA18166622E672315
+3031DD98EBCF94F9FE1D28406D8D8CBB9F9CEE173A6F2C6A8E621902C620E72B
+C9CAF734A167C583F78AAC792363F9CE7CC3CCB5A90C32F2BB9880C287429B9A
+CB7C05744777D339E86300998615E1F991B89FA0F415EDEB76FEDB476E9996FE
+C5B301CC1F8C6E3FB20E6B4A03656B2E7AD6641C7179BFEA39889CA6CD4AFE6B
+D9BB48122EB88B31F3909549418E20EF018933076D5EB11AFAD2A4E2203307EC
+6202BB544423459D37A26EA5D064F5A3A76ADDA50DDA60B08F3E8DE5A9D17458
+A3CF5483D7F57BDA0B0E65438198E65950954967F7CAE8D70AB7BECA62C8A2FF
+35B231E353C9CEAEE9C76C4E382EE03C995EF55147F14A3817FAFF2D9C3F9A7B
+6EE48F363490CB95BE2CC4B1C66D835E3D68B387065C94C47DD21BE5FA7DD775
+6561E53D66499C5683FEA050EC57023C14EBD08EC05AF1517B14E47BE183B0B4
+BDF1229CDFED63810B491297AFF65229276254FCAADDF10868A8970C98AD09B2
+F29CC206ECCF6ACA77FAA20D4A02D95EAE67756C47BE4D0CC7B1A964207BDD75
+D48D69A70CEDAF026C4C9CEFA17C336C0985C9ECAC63D81A8E24C77A42C57431
+02F35AB78EE59E8491426953A30C5223CA04D5C52920D644D1DDE8D746239C21
+42D573AEF2375CD6F22D48D3FEC491A4359863656792714C623E9AEDD1CF4584
+930843BA171732C13ACCD13D22807BDA661AA9B8B25F2899B383A2264E9F7B16
+62BA3567E1BC3F1D5B37E0D8BBCA4CE31CC8F87258C2F1B10A6163B32C73F8DD
+022F8E082DA54D08C46BE91C89D95AF1AEAC554507F308B49B6CB17E3C472E61
+1F3445E4242ADE93D2D4368E6EC47E64AD6DDE289085F01BB780F7CD23156E2F
+86DCD31E221E0A97FE5F830C709E009331BE8D511DBAB64F4D71B70547B1277A
+EB4448EF937DF037275AB452C8B848D6D31E4104E9598178C687723C5EB0025E
+BC9016713ACEDC80CC4E3BF841909B5420B6E732E0E6707A456170B5C668580E
+1D6A9B532E4A244DD5565ADE7B544848EBC1F8F13C672DDEE527EE0F00C8E650
+DB861DF41BD70681F442545C87760F353AB4468C6815DD1EFD2FB5567F12E31E
+95A01C57BFED8D670D2A9B53EE6927CFE92A1103FB8A5EB5FA04E2C2A9DC3468
+79A6B737311176ECF128451A66B242FF5882A2CD23FAA473CD842C26477068AB
+FF9043D9EFE91C5D91C8303940DD82F4E01AE190FBB748EE2D59C34C82C40CA4
+645066616AA0511997D56E18D7E7203F1552C22C70F56C6552978DC5591B4C87
+E9D47E13A2FE5543EC9904CF25428A678A1F2F9171D0E634A0820EC24E01D572
+5E7E6D843DBAC7D9D0C4F1FE488BD3C62649B78A982E710CC8C6467DC2D01C41
+735BA8C8BFFEBFFB3A2519871C707A562B3383252771761D6E5C13C3031B472C
+4B2E865DEE5CD50703F5DB61A65297FBF37A2C329FA25AE71EEA0413336B0453
+6D16F3E666782286C0C7438518B2179EF25DF50DED1EEF3B364B024222A5F14E
+C19B407EBB9B0397F4B59A9B38F1CEFFED5D8A0FC4276CCA60BC6A9F4196B652
+CE8384234FE1E73A36918B4BBEF3269B7C8ABF0A9BA590EB11D01AD682D024A8
+F82CB2196CF0744696ED36026AB7447CC97BF78CFFE5513D6CFFC8E96DF063C2
+25CFDFB56B2B1536E207E10B5022971C8F4E2021D52825A46508A976B9043DDA
+71549CA80EBAAEBFA2AE50DC2546F6BC6DB05621277C63C00EE01FBA9078E5E5
+56D1A24793DE06730F6D74AE52AE1579FE36D28F898044CDDB38604104AF78CF
+D009354108A86ED86C7DD3F5E04B0ECFF924FB32A7215A647BD7598317364F71
+30FF1513397C0C9B900906FE036C842DFF64E2C52A2CC5197388800926B1C623
+7E4C2DFCAD0DEAD54954F1835552EF47F832A6DE20DA96783C8E0FE255A48B1C
+4D9D3082E5131445C25215FAEB4C2CFEA4AC5B2FCCAC95506E88864B039EA9BA
+850F7C3669458DD3578890B4E14A18E527A837137EB9A1A66582EEC3F37C43C9
+96D691E9A587268F33EE2DB0AFD29C4DE675572C74F8A9A81457983C0D75F4A2
+B78D143E8417B478BC232B35967A0A4D055482F891B6EA70ECBE902360B29E95
+CD75F60BFDBD86AA37564DAFB5D65F4EB331302782D9
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+%%EndFont 
+%%BeginFont: CMBXTI10
+%!PS-AdobeFont-1.1: CMBXTI10 1.0
+%%CreationDate: 1991 Aug 18 17:46:30
+% Copyright (C) 1997 American Mathematical Society. All Rights Reserved.
+11 dict begin
+/FontInfo 7 dict dup begin
+/version (1.0) readonly def
+/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def
+/FullName (CMBXTI10) readonly def
+/FamilyName (Computer Modern) readonly def
+/Weight (Bold) readonly def
+/ItalicAngle -14.04 def
+/isFixedPitch false def
+end readonly def
+/FontName /CMBXTI10 def
+/PaintType 0 def
+/FontType 1 def
+/FontMatrix [0.001 0 0 0.001 0 0] readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 0 /.notdef put
+readonly def
+/FontBBox{-29 -250 1274 754}readonly def
+/UniqueID 5000771 def
+currentdict end
+currentfile eexec
+D9D66F633B846A97B686A97E45A3D0AA0529731C99A784CCBE85B4993B2EEBDE
+3B12D472B7CF54651EF21185116A69AB1096ED4BAD2F646635E019B6417CC77B
+532F85D811C70D1429A19A5307EF63EB5C5E02C89FC6C20F6D9D89E7D91FE470
+B72BEFDA23F5DF76BE05AF4CE93137A219ED8A04A9D7D6FDF37E6B7FCDE0D90B
+986423E5960A5D9FBB4C956556E8DF90CBFAEC476FA36FD9A5C8175C9AF513FE
+D919C2DDD26BDC0D99398B9F4D004B836D34E88C20EEB527CE1124209388A2DF
+E27A8DF298A2693A9D529916AA0B2176E6ED237F69D84A8FEEB36861D1847207
+BE2BD61C6A412FFFEDFF13AFEC32AC7735BCCE5965F5966418A62ECB99112AB3
+3BC938EC590FF6922659125EB67E260BF02885E49BA6019E696D33F0B53606A2
+F515E0C45F323311613A94B838491BAB9FE230C5CC79D22925E3D882799F2707
+C32975A494F0F9513E4D8332E7E54470D9721FBD345CDBB48286F2F19CC6D66E
+BB631DD6476A509167A49CA525A72CA50E82C1D08C2B372DB54C5949C753B632
+2009B761EB90492ACD3CBE6A35CE1B66F3BC4D8DC36827CE4261A703328451D1
+879438479917C1647772999171DCCF1491A1C9086E0C6393506768F8757BD81D
+141C46EB9BF507EEC29962A0072B6C5D8C8588F3D68886CD2606DD3BD2FECCEF
+63245494E93EEA12AAFB06110E54ADC444C7E7619627A48A464394E5DE06EB46
+4C76A2FF010318BBE48B3776C826A265C66515717F7F2E943C60EBAB23D96B5B
+FD514A1C4E79BB3D3D2DEB936F90CD3FABF7B09FF7F564AB5CF4AF6A40E869FD
+395885A88F4A138B3CA6943A2D430BBE43D91F7F17621CAF52FB7161DA3B2003
+82244FB6EE792DCA1722C03392C296C029A2DCC5BAAB3EA03F8DEB039DC83AE1
+763AAB84776A2CCFFAE9EAF0BFDAE417E8BE682D237FFEDAF224AC09C9665019
+165CE32F5349E857177D94AD6396570932E1657ADE4D3FF57A3419946CCD210E
+57E5A1D91CF708395942527D127606350924D71BC21C6F969288B1C8CA3404ED
+E6219985F7301A20621368F74747EAD38990A4C9F2B62913B8FDB93657409FF5
+178DAA7C97C35EAFA47778CE03E863303582D8A9900EF4F8DA879DED54BACD7A
+4A50C18AA2ED906FC4DC073B1E6CA1E3855AD5B7698EF4A96B77DBE19A12382A
+CFA8717DE230CB6182F2250885B8E90AC42A66484A7B527061B223A6D1CC72D4
+890359E7E04690BFFA99FAB5CC9999F0873A9DBE49E33F79E483FAD72313DF9A
+7B7D926461988C23CCE9F71AB7BB63BDB2B10B3F78176380AFFC154825C9BDCE
+82303FBFC3B59E070438984C28D12E8655BBBF049125BF56DD2B0DE8C0450E55
+82832DA59EBEB001AAD86F2317460DD7ED264611B9043614221ECF
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+%%EndFont 
+%%BeginFont: CMSY10
+%!PS-AdobeFont-1.1: CMSY10 1.0
+%%CreationDate: 1991 Aug 15 07:20:57
+% Copyright (C) 1997 American Mathematical Society. All Rights Reserved.
+11 dict begin
+/FontInfo 7 dict dup begin
+/version (1.0) readonly def
+/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def
+/FullName (CMSY10) readonly def
+/FamilyName (Computer Modern) readonly def
+/Weight (Medium) readonly def
+/ItalicAngle -14.035 def
+/isFixedPitch false def
+end readonly def
+/FontName /CMSY10 def
+/PaintType 0 def
+/FontType 1 def
+/FontMatrix [0.001 0 0 0.001 0 0] readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 0 /.notdef put
+readonly def
+/FontBBox{-29 -960 1116 775}readonly def
+/UniqueID 5000820 def
+currentdict end
+currentfile eexec
+D9D66F633B846A97B686A97E45A3D0AA052F09F9C8ADE9D907C058B87E9B6964
+7D53359E51216774A4EAA1E2B58EC3176BD1184A633B951372B4198D4E8C5EF4
+A213ACB58AA0A658908035BF2ED8531779838A960DFE2B27EA49C37156989C85
+E21B3ABF72E39A89232CD9F4237FC80C9E64E8425AA3BEF7DED60B122A52922A
+221A37D9A807DD01161779DDE7D31FF2B87F97C73D63EECDDA4C49501773468A
+27D1663E0B62F461F6E40A5D6676D1D12B51E641C1D4E8E2771864FC104F8CBF
+5B78EC1D88228725F1C453A678F58A7E1B7BD7CA700717D288EB8DA1F57C4F09
+0ABF1D42C5DDD0C384C7E22F8F8047BE1D4C1CC8E33368FB1AC82B4E96146730
+DE3302B2E6B819CB6AE455B1AF3187FFE8071AA57EF8A6616B9CB7941D44EC7A
+71A7BB3DF755178D7D2E4BB69859EFA4BBC30BD6BB1531133FD4D9438FF99F09
+4ECC068A324D75B5F696B8688EEB2F17E5ED34CCD6D047A4E3806D000C199D7C
+515DB70A8D4F6146FE068DC1E5DE8BC5703711DA090312BA3FC00A08C453C609
+C627A8BFEF75B4DEFAF34B44B356A516B765AFCDD3F5475B1F928731D09D2170
+B97E40F12CCEDF4F6BB3756C4734F6E98D74B7E942A954B1BAAB83D4AD727FF6
+DF6DC50B2223BCB5568A73A112E4860AD490554E64E780073FF3399CB4688D33
+9E8829667CD6EAEF25E0C7D2D44F2BBFA40E999325F9561514844221B50BC8FC
+4C7AD68CA7220D69125C2AF06849A3E068D18733276F0C0A6A2936D3C2C87CDE
+59CD1AF148C44F85784A5DAD569F5FF53C061056C067CE29AEF1E3BD1FD8B0B8
+71A0A638CDAC6AEEDBD5337D4683C084BB60B1859E600F59CB4E19C5FC5C6327
+EC544A68134496A9BD0B87D83AF6FDA3CB62FBF0B54FACE1F0E6A2D84B467AFF
+0F62DB
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+%%EndFont 
+%%BeginFont: CMR10
+%!PS-AdobeFont-1.1: CMR10 1.00B
+%%CreationDate: 1992 Feb 19 19:54:52
+% Copyright (C) 1997 American Mathematical Society. All Rights Reserved.
+11 dict begin
+/FontInfo 7 dict dup begin
+/version (1.00B) readonly def
+/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def
+/FullName (CMR10) readonly def
+/FamilyName (Computer Modern) readonly def
+/Weight (Medium) readonly def
+/ItalicAngle 0 def
+/isFixedPitch false def
+end readonly def
+/FontName /CMR10 def
+/PaintType 0 def
+/FontType 1 def
+/FontMatrix [0.001 0 0 0.001 0 0] readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 0 /.notdef put
+readonly def
+/FontBBox{-251 -250 1009 969}readonly def
+/UniqueID 5000793 def
+currentdict end
+currentfile eexec
+D9D66F633B846A97B686A97E45A3D0AA052A014267B7904EB3C0D3BD0B83D891
+016CA6CA4B712ADEB258FAAB9A130EE605E61F77FC1B738ABC7C51CD46EF8171
+9098D5FEE67660E69A7AB91B58F29A4D79E57022F783EB0FBBB6D4F4EC35014F
+D2DECBA99459A4C59DF0C6EBA150284454E707DC2100C15B76B4C19B84363758
+469A6C558785B226332152109871A9883487DD7710949204DDCF837E6A8708B8
+2BDBF16FBC7512FAA308A093FE5CF7158F1163BC1F3352E22A1452E73FECA8A4
+87100FB1FFC4C8AF409B2067537220E605DA0852CA49839E1386AF9D7A1A455F
+D1F017CE45884D76EF2CB9BC5821FD25365DDEA6E45F332B5F68A44AD8A530F0
+92A36FAC8D27F9087AFEEA2096F839A2BC4B937F24E080EF7C0F9374A18D565C
+295A05210DB96A23175AC59A9BD0147A310EF49C551A417E0A22703F94FF7B75
+409A5D417DA6730A69E310FA6A4229FC7E4F620B0FC4C63C50E99E179EB51E4C
+4BC45217722F1E8E40F1E1428E792EAFE05C5A50D38C52114DFCD24D54027CBF
+2512DD116F0463DE4052A7AD53B641A27E81E481947884CE35661B49153FA19E
+0A2A860C7B61558671303DE6AE06A80E4E450E17067676E6BBB42A9A24ACBC3E
+B0CA7B7A3BFEA84FED39CCFB6D545BB2BCC49E5E16976407AB9D94556CD4F008
+24EF579B6800B6DC3AAF840B3FC6822872368E3B4274DD06CA36AF8F6346C11B
+43C772CC242F3B212C4BD7018D71A1A74C9A94ED0093A5FB6557F4E0751047AF
+D72098ECA301B8AE68110F983796E581F106144951DF5B750432A230FDA3B575
+5A38B5E7972AABC12306A01A99FCF8189D71B8DBF49550BAEA9CF1B97CBFC7CC
+96498ECC938B1A1710B670657DE923A659DB8757147B140A48067328E7E3F9C3
+7D1888B284904301450CE0BC15EEEA00E48CCD6388F3FC3BEFD8D9C400015B65
+0F2F536D035626B1FF0A69D732C7A1836D635C30C06BED4327737029E5BA5830
+B9E88A4024C3326AD2F34F47B54739B48825AD6699F7D117EA4C4AEC4440BF6D
+AA0099DEFD326235965C63647921828BF269ECC87A2B1C8CAD6C78B6E561B007
+97BE2BC7CA32B4534075F6491BE959D1F635463E71679E527F4F456F774B2AF8
+FEF3D8C63B2F8B99FE0F73BA44B3CF15A613471EA3C7A1CD783D3EB41F4ACEE5
+20759B6A4C4466E2D80EF7C7866BAD06E5DF0434D2C607FC82C9EBD4D8902EE4
+0A7617C3AEACCB7CCE00319D0677AA6DB7E0250B51908F966977BD8C8D07FDBD
+F4D058444E7D7D91788DEA997CBE0545902E67194B7BA3CD0BF454FCA60B9A20
+3E6BB526D2D5B5321EE18DD2A0B15E53BCB8E3E01067B30ED2DD2CB9B06D3122
+A737435305D42DE9C6B614926BFD44DF10D14402EBEDFF0B144B1C9BD22D7379
+5262FEEAFE31C8A721C2D46AA00C10681BA9970D09F1EA4FA77428025D4059BA
+2988AC2E3D7246BAAAFB89745F0E38580546045527C8779A254DB08DCC6FB9B9
+0E172209FBE3857AF495A7F2B34BC893D942C145C2204CFCD6A5C69FEFC25B60
+E412CB2BEAE7F7FAD03AF46344F6A7D483BBB1E896BF16B0F4C363799DF23CE2
+E8127996DE841B6F9D8A9E56BD799B6A938582988AF87151BB8D3AEA85C49857
+DD862B5E10D9F33D57795D656FB616BC9B8397B3612131A2B0F472656700958F
+739A548F7C3A348698AF9F6F9821D7A9FD4131781ACBF7EAB885A3AC254DBF94
+02FA697941A0F97F048861788BEACC20DE829764413CA58F9D045A6B38BCD6E6
+E4827247EDF1171F64E3B041A69B244308DC07F66643FCD7D5FD37F36EC4CB5F
+957D4ADAF91850A3B1A765E0E580EDC77556593D1B2E1C22685268469298688A
+45C474C9D0472D019CE1E83F25182D084AD85A49C502E8D679C227DA8E32045F
+8055D1622C478F8FDA342685F858DE3F53F1CEA0D70BF3FE09037D981E9E7FFB
+BC3F896535D0DCF53F4C85A1DA5D0B632484D1F25460E3EB38E251D2AA17817E
+F3B25A2A49C0AEDE0B89E277F52CBF744EF0243C409FD71FB0C574640CF11599
+117A4F42F27D8D282D34485AD116F7E753A8DEBFDF7C552A1179C02B7A37782B
+743D0DF85C15A333BE9EE82C13DBC9CB007DEB5900954AD9309902E08B3D5BB4
+E8414211B971CE8B9F05A61C15F400D9297745F606C6419E8A8A9ADCBDC39243
+617EFABFDCF9F836D14411BD72EE19D0BDE89234BF7D52E7A68ECC952FB74FE3
+33E1A87DA39AEEE9E90406E2B1CF3799C63E9BA858D54F38918B814C0DF0B696
+839C820C26FB473ACC5C08E2056457A74123A398806EECDB427BB183F5458105
+2B66D7E1FC3529025D3243A045625E9DD9417FA089B3C7C394D2B65C0367FF73
+79F17ADEC6B5D27A5D3D3E244A0839E38267ACF07B2D994C2B4E7F30A416EEE2
+D1688F167D1641A72A795B1F4DA3350F75AD6D546AA118B5F8A5085F5794E6E5
+28256CD31D250D8328C9620B8ACAB03E4A33DB4595E959F4D0FB1C8CE85A710E
+22F1940067C036A7DCED7EA48F1EB81AC4735FB26A249A32AC2E3E7636B32D31
+7D76FBEBA106D6C67C94A3BD4256B786B71C6EF8D191CA90CAD8D2EEAD42C6DD
+8BB4BEA7DAD4ECB6E002F3B71C2955A5A401E34D55F755BED68178C270109BAB
+FA0AD848347EB977325530B27180661A59447D7DB55A62D65309DE24B6638986
+1D3A539BD37E74C2C00DFED3336B5C6B28D915AB7188FFBCE3ADB3CB903944DF
+1BA5923A1C053D4682BB8616F44E81E18DB2B58298F4B1A6289CA993DF3E7C73
+B00DEA3A9B747FEEBC4A11E5B9B8B05CA2709B8AA935A42159D3DE399544F5AF
+AC1CC00F6CB94AB69856078C9A2EB2046BB9055CDD6A0622112F7D3710143F1C
+20CD8DAB4109CD47BC00EBCB88314081C1D6C43132412F261CE0262FA28DB7A3
+C7D8534BCBE1A60488EA230DC558B73C72AE87539A9D7E28C2BE05FC05F58DDD
+87117C0B5235B1486088B8368C80ECE70DC07A0493C32B571F6D6E5F3C7556B8
+79DD18A0C09C644C1B0A57E09CBF8247A97FBDA9442DF87C99CB00F959FE4925
+8FE8B3EA62A6C99396CEECAFDB091CBFAA0EA6F25BE1F34B1B8EF507D2347A7B
+866CE28452F7ADBB56F4696567032BD289B3439D6CB90A602223E00B43CD2585
+4D598BE43C0161BEAD813870FCA3E377A588C3D24667846301D1BEB056315636
+1304E2CB595B5297018C0ECD1BA4F8F1EA81B4FF88126295CD676D96756FB9FA
+C97CD2A8574EAEBB0A869C527E0828940C613B9D45894E4667172D841C94410B
+FCC5083CF850AEB2EF92BDBA8DBA361AE95B267FB5F90D5EF8B16B2A83568D5F
+50BD20AC88DE25DDFDAAB7B2F7662DB99E20989C7D12DE04057FCD2DEEC770D6
+535680D13ACB557EE7AF8DEBABC3088908943E6E3655C3C00ED022B276FFA5FA
+E6E4ABB96A214908EA899EC925E67E86413840A67B3FF86957586B5E06909036
+B9987C5BA21E46DE7919B382CFC4740ECC794A6577BE33CCB94E2E4BB3F28BBF
+AAC6E68DD9B01A59A7F3B964F53F41CB9BE94CD44027868F079324B44C595200
+0E375B069FC085DAD5B678ACBBFCCE8916C4266B572D89C0A7B6A26F1D329EA7
+63CDD44F37932CDC9C89C724AD52BF91CA68209471F26C10AA18CBCD1288460F
+9EA9BA85084A5F34451044B81559DBA03F03292638C28A704C553CB25312C568
+A06C9F5A764BA025FD48883244E88F1A31ACAE83432C2B837D034CC960EDE3C4
+2234FFFB8132473C8A750A41770EC46F9B2CA7FDD937A2C8CBF5DDD6162EEE0B
+36C53BDC0D2D7F6D38DC2F502755B0D25B0BD1858A9B16BA69549B5CA4673F0C
+32C5F1BA97E1C124374037E0B8EE94706B3B2AEB9CEBFF69E4F107BABED996B2
+EA92B4D94AA267E626953550633A74099022786C172A323DF9D903A0DF6CE486
+38AB2B0CA07D5EEF34BDE2DB5F539BEDB569F60005A3317EA6B1560C22606B8E
+AED6F84526090E626FBF48846E49714EA80C90FF66F82F36F3151B580DAFFFA2
+668B4952CAA66C6F10A341118E0D58B8CE34367BDAEA79645E27059FF2A43D2A
+435ED248345B6305316D1DAC5F75787D8E72D0D8C3145C0A1E45B201382EB716
+D06C5E8BA78B6F32B13F80E7EB6909D2B7ECD1420BA2B2A88C0C3154F3091065
+16A79C898C1682A98FC2A11A2B8D4536D74E6E228E5474090D42CBFE3BAA8029
+4564F468EE59B2E2BF8B2429634898F21C31812394AE3EC0CA8CFD5D5E818F4F
+344FF40488F06A48E9879E42F131DE378A8A733C6016BBDCA24B10B385BA73D3
+DF4770685FC7B9720D196A9FFF978C10977D37D98F11A3255486C8F8C3F67225
+4AA8884C88A3194EC1AFD2DA57258E30B057490A10AEA001017F06C83255C0AB
+13AE04B86FEEECC7F04A593282501423D319CC3FFAC3691DE723F71A6138EDBA
+F1373C651464A05906A2F370B0862F5E5CAA5C9570B7D5F9DB24FFE4A6C6B98C
+539FFD61F24487B2AF446467B1A3CA16E9BB2384972372C90DD930B8DAEC0FEA
+7C2692F029EA687E29EADEA6AE95F030A8DC599C8727F5CC41FFF86EC7E2D04E
+E1498E0AB0D2719E08956A68FE7E92EBC6945771DDC13689CB68D39EAF73CB2B
+DC8BAECFD1F721BC66D89342D650699C3364A2D0B35F58E4CDF2209512224472
+8920B0079AA5355990733CBCB8A372E1EA02B9DA4107F619968075F33BD123CB
+870D0DF6B22E6DB70F1328532A05BD7A624CB7488034E94F3622F97636CB1330
+FE3336665F27AF77FBCF01A786143F0AA892E1B2CDDAEF2E0F33E56F179CBC8A
+72973C643CF217828D892C818CECE72D0E89329C6A9159BF17D10BD3BB4A1154
+997ABD8127118AA79BD792292B6B9689D989258CA9F57A75C4C9CEADC338DF07
+13081B667C8D86DEEE5BDCC47FF96E2AA5B37C365585747EB3B664F08CC7ADAD
+B42D1B54096C60AD15596D7DC585316A36598A349E89242274B5171A1DE841CC
+30A5BE43B0ADB71C3DDA25650BFF704B452831FB06A7DB0D60D24436BFE23CC5
+AA68BFEE0897140B248E4A9BE7AAE37B98A54CC1D3F81164943B66250D55E554
+55A688BB9E3077FF8D11D1BE1C3FF99DA01EB206AC5AB1D394854DF5CD417084
+82BF6D1DAF88698A69DC196FA9A3285AAFFC3441CB4297A48DFC86B29490F2F4
+B514AE8F3D4C0EF920791371BBDD1B6369C38A90A2D2AC06B25781630847D6D0
+87B469CAC111778CEF26FA3233A85044965F3862C83F63CA2565B9644EC15B77
+BD2BA08CD8AC3DF1E5CC53CCE496172A18627384CD54595E3BE1E7D1B9751C86
+D6AD3EDCC725EA4B09BF3B92ED658356A3424F1B0D07B6E11B8E1D4823F5B0C8
+F3EA4BFA3DF77AED89D464D29BB2326ED2DEB73E327AC8B2C99B73DB70ACEB0B
+D0FD854CEFBC72FB9C906B4DB9EA35BA8018C623987C834B63E8C800A30BD551
+011F6E05EE76C26ED2F335E32BD4C866A57BA7AE89ACEB1066E795F122E1BBCD
+5768F2DEC922EFF8B1778F4FFB7BF1B6253F632F8D98648B81018D2FD4876974
+8C818E01ABFB557C8553B98A512241000B9DF64C1F5784343314B7B3CA04E506
+BBC612628AEE13DA23B3242AAC3B05244D3711121D5C9AFA8EBABD2074DD3658
+0F46D501A2CB11A370EA7E38E3682A31F5C47836E9CECAFB1BEC80DE889E99BD
+8F4DB78DBA5AC5D764EA99237738FEAAF199DDA7236D22B07D22A8F6ED023E44
+1828588397D723FB557CD35C7C5C87BB64E4A7F88B03FAF135ED0F185F7AFA4A
+F498B226D6D843EFECFD9029122B15065A4D04B509A8B633E46AD3D15D4F9EB1
+AA41E4694AC4DE0613B027E35C32935B5F0A9C21F5F60B9DFB5FAD619A35AF19
+20C0A1B2490E8E3BDACF27F37680BB32489D21F91603D4BC5FE69862A1A05F10
+4C11FE5744676C4794CC0B7F1AC1DC9861A247234FB986A0A4BC5F8F6A3183FE
+3A6FF5ED1D32A711906031CFF6802B5455CF208787AE3A35B1D437C64E5A3283
+A1B87F31D6B6AC634579FC3145035BC5F0B454CD9280BA3509B890D45AC7EC54
+F8FCDA7E5F8AB9F8201621417E17FFD8CB7BF55A6D9B21F95C403AC0112A94D4
+B7BAD823A1E9A5FEA956B08ABF303A917B69C8BAD87E685DEBA72E62AB132F46
+521CBA0C7A96A833AFDB396E0FEB85D3EC605A4EF6026C0A6CCADA56A26A8FDE
+18C61D26C93DC6E15F1B5E789567E833E79CB85580CB50A68AC93D9C2454861B
+487A833774E205A73A2932D0043759D5978921BB5B499BBEC5AC6F505EDE86C2
+8B8DAB630F36128B53BDA72CD82A3810E94C6947C9FB148574FD25E8629CBEF1
+2AAA7DD33D1A83C0235AF9F8FA00822AEF0A6E9DC7FA79B3872CAC39957D746E
+3F05C8EA69F0BBD0D96DA2ACA93E73FDECCA8B35D6CD52C464C1A51EDFAA83A0
+54C236F0064B7268C7DF4BC1F97606D48D6C8739AA2CE28CFF1B4986B4CE8A60
+D8DA6C67A6887CCC3A0A2790FF5FA00120D15C26E8D938D524F355FF8212A689
+D34269669DF03F1BACCFE834425972EEAB399EE578407F9550B93D65E63E3707
+CDA159B5AF4B68ED52D389CC6915CF7B0C737514EAB05C947AF32D67CC36D782
+C9F73B32CDF11D2CE33E8C3DAC12AD070D0CE9EB3C209D0830C0665DB9F61C35
+FF976057485A32A5A41E7205BCED4E2B9D2011AE3FA90ADFF6E3C58144293A55
+E25C6A98BA2113DAFB861F0C3544A15F5CC20496FBC58F1FA2088BC67334006E
+2AE3755CF0791FE82E8620A5BF3B487F37DBA3ABE1709DF21745CA7D7CDC0AF4
+F33FCF3672EF5ACB540CD7931FD18F815422B2A193C9AE34E626020F9AC0C36D
+4D5AC1137C75F10B42E2499DE914703C682806C9E1D158217C68329CE401234B
+462F92A35F20858F5FAFAE3062C57ECEB930B762880A982A8DCB7D010383A156
+547310C8BDEEDF6313650A2FD71856131E24F1299C8033CF49DA9BFD013F64D7
+2B571F6C2E0A84FE62F060298C654E068F0B8BA453D5F94BC89D3B5053721731
+AF5CCFED84B7F6CEC60FA31F84644CEFA02DC2323CADB246E64DE08D9BE4FAEA
+59D1652DFE1A09C41479C3CDB577942334F8C57545BD883E0AD172CEFE546C21
+5B9F63E32980B1E57B0EDD66674C9D919F6E323DA0A0CB8788F031BD533615B1
+D27320ABD6A1147E3200322DB2D8700B3F1F8B19E3C5B67842E84469D997B702
+0D8DE8894F5422DF2B9244C20186597587D3852F34ECB21E5244EA9C8596F0D8
+6E4D7353C7F6ABCAC499D7E34CA7E7789A54D712AE69DE15F767F045E637DDDB
+CAEFE413AF652D849D58D52DE084956D177AB7E3A9146B8A56BA23CB3F734298
+88C66B7C2B084EF219FA08BC87443FD9D86BBA351427631D368F514C7DAD7329
+DDCDCE8311971D746FE79322097E7F676740389F17B11587086942024918CCBE
+80A60A78D96F3CBB59CB81BF5D8028475316D96E12248867A3F23A859F8AB547
+B1F06C1ACFED4AB83378932A253B8FF8AD5F44BB4EC7A7F025BBAA179C81DBA2
+049053EDA32AC126C4F222B5FBB1119C7BE3F4BE0E9A3161CBC5F4842E6BD743
+11903130004FF705BDDC0EE6C1D97396904B295596A226FECFD665AE0A6F7EE3
+FD51F370008D1697035CCE907243038E0B0487A6DD63F1ECDABCE1A71193FFBC
+6DFBF1726156A4E9710C0D272A7A351F8FA0C2785BCFD0BDCF1B4250675B512F
+997677E512B29D85313FAB6F7FD26B402E1C4B2E270E264422D1375B93EA138C
+171557C70A07C8B330E0C0602949C60B9D921B33E906ED3858966A640367C505
+2E3D254C1C0C63B3F831C9D2AF2B2FA6FE8B663F94B72A7FFD63712A2C4422B6
+6E3524B5AA8D2EB9C7733BBF2662B64B3428EBFE956CBD500DC71A4F4CDE8896
+2EAA65771273D823E8687E2FED6A26D7DB98DDBFB57670278897D2AD553D6AAF
+6F1117C4F894AAD44F53348A763289BFEB2E9DF66DB921E402279FE17634E0DA
+576F0323E1F849DBB1E7E56D0303DD2C81EBBC192B5F8C13A5F5028D64DF153D
+C7E4C2A59A3E369D44F346BBD79A4AE4930E3249C1FD5CC8B4FC6C753ECA9326
+797F25BEE6BC66E125AFD247A2CC2F61A47F03DB682F67382B2E83312D1D239F
+39D8BD6C3256FDD8D424046A289D17984ADAE316FA39B743B12419DCC3C8582C
+EF6BE8C6E7A091F1EF76C6090C15A7742C5F66F66A69DE863256574491B422DA
+93F4B0B13E69B03D1A92840D80B39C96A535C2AEAFB579B9051CCC67E32103F6
+21EADDFEF9CEE1980D3F86DB452B61200C9805EDBD219E812F22AD612B436E28
+D86956797AE0FBBE0A0DEDE4340B51D2CEB5127FF7C14C85AC55C55A1A9412B0
+1471CDF9FE7D52A5A069669A9C500FABD920863628E541893B2692B9D40CF391
+69C797742BEB239A6FF37CBEECF5ACC960011BE1CD35241BF35431F902EE41FB
+5E89FD3C7FD3E7CE970CEF9A3BA9DB4F10945568813D4566F5939A7CF94CF2B0
+97E9D335CAAB09BBDED1D462EA787E5FD11A63B17D75882E379B490C5B2B4440
+FCCE6CD6EC2F4C21D5443E6269734EAF0A61520285791FAB0B421D5CEB2CB165
+286278D3F21045ABFCA81CD9E50A733CE516E1F4C494FF072C50FFCE2D746CD0
+0D28F9EB6CB77425D0F4188760F61C46101F21215BB89FE5FB9684F2E9BADF1D
+8078D29B3160EF63A74A19E17202270928654B95413DA00FF89548F30C8A2146
+8082CFAF97B44733C420572188F01731535A0F5609CE44AB565563B15212E835
+10E5EBA20E3B1635B8E08D85E8D282D51AF0C5D8B4526EB0D43325370644445E
+087E067A1EBE6E9C5A69D8F2D32E2960FA2B26B582A4D2D9AA1CC49408E88CCC
+19C63FEC3256F43F55CE38B3F2D7902A4978918AA2D9D23EE839BF2A901F0649
+856041B1F62612DD6FBBFBD1D3645ECEBCA6587080C6DE11DA4CC9F8E08758B4
+37D559BA464A49A3AEA6373DAD44C615496C71C41080F4357FF2ED23608BB448
+FF983C196501096A58EC0C0FFC9BFE36C735118DFA981C69365EC6E543BABAEF
+0515AAA6E8E34711747D586A6CAAE1D3D0F2EE85DAE124D93A6EDB408D9FC825
+7943607554B3CBF71A9843A76A69D7533865BE78F7BA15316360CEC333F0326E
+EDF8B884A60A0E02401A2A1E3C18C89580C030AAB8B94438214A96EFBA9554F8
+2AAAA5C653E94FE70BC18F998BCD6713AE8A087E37097C36E06C1E929278F668
+4E6B169E30196E373D89CDB6BDA65989AC54ABA2678ECC7EDE24AD6263BB0301
+012E31B2361D62F8E08528558CBE40A37939F09069F82095379C56C31EF2984E
+78BBA233E706B9575A245E527CCD6EC11075A3FD2623B49E2A68EEB68030AE43
+1D7AE54192A39C52BBA92FAEC3899FF0ED859B0051537F998743B6C5F2DC99AD
+FDBC65E51D3E82B70CEC3EF1C3645ADF893C3C5F3D25D51CE54CEAA463F8BF8D
+EDC3CDD0422C12FB34C87305CD11F0005B4AEA3E9AAA000546E4383C7B8629A2
+3372E0E857C5A9F564E6FBCE49407740873A109A2B8FC581171B6965DD349786
+E547781395D8F3E42E99BC556A41773DB2BA8AA0918081E4983B9F8B43A15544
+8D15BCF336E93F8CFCE6E79940A52F9B7067C2C8688F20F842B2D0BC02DB70A5
+3074D0CA85BBD01D6D91B2722CC15C866448C91ADAF9EB2D2A52F08B39808E43
+2A492AEFD45480EBB07C4182CD6DAA9C26A561B83E381594A1AA0364C4464AA6
+20621994D2B64D09B7F460C2D6A7C264D89E4415A9E54A53CC8331A3D358BD14
+4894EBA4DD7AE1B836E2C9246DBB0800805683A11DBE420BA989837D86A1A600
+8B669C7A7283BB9313F045A08602B7F98F78A059CB086B5991F761CADE8AEB86
+5039C35C2FD564C0D8CF404A5F32D7C532716169EEB6D08C8CE5BB357E4CDCB1
+5FCEC35440433719FC19DEA55B1662309EC85EB47B323CE2EBA56D17E0A88175
+B2FD7B59B37F7D48FACD52A7DA80BC296E62D60D6C5F251554138DDC4975E308
+2F9673033F0A255FE037F16CE58A3EF652D3DDE2AE7FD39AA20E88FB0A7B4598
+02E993D6550EE854A5D9ABB3B15BE396E3FC2DEE919D354166BC1A2519E0F2C0
+228998A7243FFDAE507841771E4A88B610F1D390F7898CCAE418C8CC15A4B3A0
+9B74E01AC32BCBAA020C99B6856952158F866E0AC66F171C3A3265E713094F71
+BED491A2ABFA737A0EC17DB262A73EBAB9F8F9E96DC7C5764B92D15F5C967CB3
+C846C147DF1568A68BE099D8E38B5A9FEDFC66CE2AD3BBAAFD72AA51D6C08A32
+AD54AE75530267728A9EA3244E8C8CF67C5A28F67068CB4CF90FB76F280930F1
+893C952DC2A7ADE38C692BD19FFF63383308FC2873CF241C1C3D1ECEF6B98CC7
+287D9F5F0C61033CAFA9739D9941AC833A194E67CD1B9CA1FB4A02F0A53A814B
+565CFDD9CDA06303ADB599D6CE17A7F6A81C13040FB7D6E98AEC4BE9F88F3B29
+FFA880E8CF8CB6F4FA009C4354337A43DD077D40C993A9AF66D2B524CEE5FC0A
+BDF03740A45C0CAD814E869D435C61A964D0644E93C6F228B205ECDE4EE59D67
+C35647FAE9617877DB23272A9D777262A1DDCBB7CDCFD2D6136FF69C000F9B29
+DA30B2A654C27C564F113FFB52CE2F6618EA1C8102FF9D93B0AA2C936CAED8CB
+1A9F2FA71930351D74240F88DE47423EAD67D66C20C8DE2ED00C94642C25630D
+4A60B8DA5362D00F3399C6796EE25BB88325E11045FB6E00B72706257BDDA2E2
+76C77F6E0030906D646D759447343EE6CDCF9A61CF30C1392BE54A0F5951AA69
+461E856C4A2921C859E03E13AAA1D6F563D5F62A66065F36ADA9A08A697F53E0
+249DB7965E9312F46A18F6016684708F397989B1C291F63C491B48A8B1A51E8A
+2C1DB13DB081B75784ECFFA1735A0DA6D443D7BBBF38B16874B57891E3C28A04
+C21978532D806CAD99C9CB00777FC2B9582CA68D285D0488B5724B9EF603D4A5
+4DC01291C0AAE941219EB99398C6051357DF7138324625A4C244A3B127BA85E3
+08C8272EC75E848D984E38F151E9C0D46D1BAE4648F7391B59BA76038391F306
+3E8E72B0B557913A38CD6042D2ECFA192A5124B9F58C887726C72C5518D3CD90
+B24196C04E0D05A6B590E067B17103BB36AC830CA181BAA072B137A344B7570C
+7EAA3272A774A58E049F71DC9DF45CD22B1452A26BE34A5179221A01FC5536DF
+BBB94E93BA9EC169BE596336768AA8C9A72C258B8A8CE7C511DD923193D886E7
+F6C33E5FD68032A5A4459955FFE76A8D5726AFDECF42818BE43F03D2B4B8958A
+38D94568751E5468A1322EBF924C7B587D732486DF8E309CB7FE20F64C6A371D
+D62BF5A33B49DD267AE4C3F638A76BE6DF49B693D40D8AE1E9F0C0B0606C84E2
+A6868B4F700A6DA1ECD097C96704B17DB76621FF4876149E6B2FFA89D38D8F3C
+1026401F2CB949DE9313115E6626B26082B1AD94D0C1F8E7B907B3676FFEC9E2
+E31FAC5504207CA741486734336521C2F9BC91AF257472E4762966AC19A6E89A
+87644A22CBC9FECECD919E513209FF439E2E7F24AA80B4D3C940021C23D7A921
+1B6E544E43FA00C4540C73EB0F3B8F352BAAE6CAA924C1F09C6EF7DCBF4BB88D
+0BFEC67C79B6334A4A0E6099A460B57FBB845831ABD0E83BF0F92491ADDE5526
+E036C58BDF78FE25C55B9580F6D02F2C2F7D77399DB7CB4B8B8E037538D2BA64
+BE2BE4697B87366CFAB5A92932465689775FBD9F87AED9B53303DBC13C0C13CD
+B549FF2D8C8C6C9082CCBB9B6DABFEBE53A85297555389E5A08E47F27F62EA1F
+11915A06C9A1E82C37E4AC72B009B0CBEF25FE046FF9FF20D50DFFA97AD9856B
+B51EEFB3DE0472EAB91CB0B51ECF29EA2025422B31C811C3E449416B8916C2B8
+63E9E4A80F9EC738B81A2A32BF196875BF8F52010B1DEEA25BC2719EFFEEA0D3
+A3AB794058EE49333468A3CF5D13336431ED14CEFB1A2D067AB3D2DE942D9DC9
+C0B5CFCBE9D9A4B53D9B2B19E28F5416F5DE29E73156516683F169BEC75C5344
+D953C9640552267E6CE554C418773F06BC8CD88084C60F8D7F37523922B4D49B
+ADCC93A64D0C92973527A810F6B0239E5525A6BC6AEFABBC8FDF0B7E1B368A52
+3620DEEC31E00D6CD5F02E1625A571A6129DC18333B395D4680CF6F69CC6D359
+4C444307FB45B09509E36E0905C7B2CED23D9B48FF65F31EDFBD2073F718FC34
+99FB4A68B4225D12A42FBB14D7A3FE9D2CE7DC8925E6BBCC4EB53632EA3432D7
+BBB17498259DC19AF7E6CA3F124A7B39BE4C9768FB49748F5CCAA3D1940E0A49
+136B3F49025B2C3D09AC6598844D9D113297A68027AFBB1D8341FEC07FF6CE10
+28358FDBA753264E7865B5B311532DC8D16E6E1747E53D96E996B9F27D9CFE93
+460158DDB6708485029D6F31729805DA1F445C629D5A7048F06D8BBBC6BB69D6
+FB7BE6BF7FC02EC0B33462CF5C756F35AA56886688B05F6A417B8BCA35886256
+8EE314686DB5BD49E631AC220C299A8C5D6ABB974C45643CBC589EB2D0DF48D7
+F59EEF1FEC4CCBEBA797DF168D1D08EC7467E7C35F421BB6BEA0E9C4846A84C1
+70FEBABA787CC46391393A0B99EF0CFC33730140696B0DE9C57E90231310FAD9
+D67462F55A56D9666EC08AC424E940CAEAD58503911C4D80FD59CDD5182ED504
+656628B1851818197DEACC842E943D5A2B75B5934E8AED3E67529FB51E625A14
+4D91B077A53FD8C69C930C677497A36A6A578A639EFBDE481EBCB80536C9CB96
+0A2E54A15F6940F4FECC203A440AB47439C9FDA12A9D78B74325ADF44010BF40
+6A5FB9C012E07A557A60326983A0802424CEA244DDBF66CDDF918B30618F348A
+8C5086F7A7BB1A86C7B4826323802701A584D17C6E19AB720CD13D02E8EBCE16
+4A87BEA7C6B76D05D49CDBE8549640FFE6124D2852A00A46768FEFDD2DD5B60C
+3AA80C3839A86B4EFB035B65E1236F6DA58BBE2A9445311E8714C82310E6A0D2
+E926A3D18AC3E7A8F8A61AAE5ADE10E43116C105653E3A03E895BB2F7477A0AA
+F1E481B4F1B3BC9DB099E60681EF3B0476D6E84DF5ADDA588E8320B4899D2D40
+F8CEA36C2039AE832C87644E2A3EC19AC8FECDD575364238524BF5F76ACB02EF
+094278DAC561F700ACE728478FBB8E0C192795AF982216E2A4A3488D6A4BF06B
+AFB8F4EE78DA4FD96437A45C1E1F49E83D6E85390F8FF9B8E487AFA6184FA430
+2A3E13C59C88E3FC8ED9102D485FCCA463197A32821988D1C0A7A86620655DC3
+DFEEDD33B3A1F55CD5599A58D0F4A390B69137D947897DC448A8255A2521EFCE
+2CA896955E05BEA3480166F9FF82F1B145DCB56B6872449335275533C38336F5
+4C49F40D0FB04222D14E0AC8057580118B1EB1DD43A8BF334763BBA198D851AD
+47F4499A2922816D2F0AC1956B4410E617201C82FDD7761C1A0C8AD025FCB1DA
+9A0722266E22C438C10275CC2BFFDBE726084F9CBAD1CA9ECFA072EB5A317EA5
+2A8E39F8794209B978DDF404FAFD22831F3F53356401FFB85334D339426CCFFE
+0F869606955F20FA055EE560B4744730EEA18CBBDC134644F124B714FD43653B
+C0879B820871B8809020301A71D37A44252491555D9B6278A9070C088C0A80D2
+BC753160E83AF282F3DC077CDF610A18A1A83D4920EB6E2A2B73E40BA112F78C
+A18A26ACD11A5D4E12C67A631D4928EFB809640F64571E5605AD4BFD3D00FFCF
+FFE4FF9FFF1A63002175D401D4BBD218F40B4C56766A4FBB93741F9D2B746F78
+B062CF36E60973FD3D52810750C06C73CC376F5291442A4EEF4B2842B6317CB7
+E1AE735793AA5CD2F927E4DAD0470D0A6612E8C0557245213B0DC87DF4B9CD12
+60A6FB3955E007041838B667417524FED98D5EE035C212C8377A6E2393D86DCA
+BD5092520A83CBFB978D2EEC4847BE9D4365714A5F36B343F87F1DBB1E2759ED
+78EAA5491A4EEFB8FE1FBD10112294959C42FA664442335E521CA7D7E7BDA468
+AE36FFEDA896738CDB3054025485FA28A071C96A003DF5A940261ECCE471616C
+A5B0223E7F435A096B90FF8ED7D88FADF050BC4C4C1FA51D4D389BC36E9D5D70
+9C38800E0CA38D1A045586E46563D855E4E6A8482BDEC35617411F8E046FB838
+1F745325CEF7AF2EF0D7F912A34BA6CE8676944A3B12212CE7AD55539FD9179C
+D8BE8CA39C9EEC948BCCCF2ECCC8F10DD4C8E99A5922BD9A56191C4900063DCC
+C3BED41EF16BD2BC1891D87E5DD05AF7C25D7E92B1BB87D53817643B621BB21B
+EA839B295433042A7E0CE294C031A4C460F05D16B46430445717EAC72766909F
+9008EF1F3F8404DD56B1B1F90A06D99859A1C45F7510B9E7C6929BF9E54053BF
+95B4911454183A5F2734C2CC7622ECFD0664B77640C416A1DA10F13BA0238C25
+DF6752C9B793F8FFA012C6E8E2AC81DDD9E402F42DC4CD6F290BFF4B9C633E1E
+52397F385B895FA3DC7471F3EB97244EFEAFB11BA92C994CFB511D7532304836
+151A4087F1CEE38AB690E1DE2354FA2A7059F42982D0CFD01BE3A320FB078F2D
+7947E9A5C973DFE340D0A742170386831314BDE9D67134451FDE80E093C53F37
+F0FD8CEF42FA08555757888839D9DAF23A735243EBB372A5C3230B1CC2F3B5C1
+C8C19CB3C3E9B1A42D0B314E778F7B3F24C8D61375FA725B40F561C6619D025E
+899BAFD602833506BBC5B6EC86A932F46338E7E26EDA743CC51D8E4B3944D186
+7EFEF666F9AE87E395FB9DDE9A936AB87B90771BE94B784B7584D71827874DEE
+03B55096CDD953D93FC0FCD7E878A11EB46A10CCCE040A90B375995C5FCBBB27
+5D0745BF763C61DCBF193651A3E36A4112F823B5607F418AC8C41B51221F9E6F
+0E9DC72ABCAC248BD8D83949A24D33DFEAA363508C263FF9B222347DA08B99F0
+2173065BB9240A61135E38D461736B04BE918BA150DC90043306056B657D6CA7
+FC27151322B0F132D91C0BD0B9483A6A26D84882095E20127541BC1D93B72AE0
+8A68A5DEFB35E50B37ACB926DD8DB96B910BB6F315FDBAE48531574B9ACBB438
+D1ADA41812A752E9876AB76B31CDE8EFDDB0DE7AF97238A9DA0846EAD39DB2AB
+30EB7D7F61DB0876FD294E5E09916F0C79417108B30597932BF1C81DCF5CE0BD
+2D65C84441D6354A9C8647D740C1B450E5DD3237EF9BBC793F1148155C0F950A
+405BFE9BE30D9EF9F8812279F71B30949F8640E9D0E5B6CD133153B2866E7F35
+78795EDF42FAC47913A9083E7069C4D4E6B0642F55FB481E7004DEA3C3C86177
+A103AFC8FF966BB958BC5EAE139870EC202D1BAC713AF4E3F2FB9594D60E83F0
+8638980BDB2FD061C867E748420E45AFE685D27A2767D31E272B43EC2DDA5424
+AC17EB9D1C7CE94DA05F741F0F635361325F227EC2DEEB5A3EF3AF4FF03F5FFF
+349A9571CA07A944C3974706C1E1A2A433F76149A1E33322E05335787A99C9A3
+98EBC8894218611339E7F065F13C02CF110ECED530FF12350140A7BC7BC810C8
+F17E870225D6DA162362C5587A4A13F52E9F92E31D0DC959DA76A3095661D000
+25A9EB458084039E445529C5A08E3C66FE115D2FE1CAD9CF27315D440FD45C76
+464970D0438E3C1E5F9CE9A9ADA95C5584532C7998063FC7E4E4DD3248148EAC
+10DD976E786084D5CD51D263AA0B7B5F0C31C1A127E03CA8AAA424C6D31106D9
+5788B85D5B2D4557615AF4B1CE34CB66F61AB005C5968756539C44690C3B93E9
+0629165F9377A1B449E2D07356E10DA88338F5B16EC8DAEA544ADED4B3EDD716
+550D9103F3F97E86181B8379D37E53FDA0557BA5EA231B90655957080E0E6DC6
+114D07BA1C9D1BACD0EF6F7997BF73482B194824A1EE1A39A6050213FDB4C820
+FE4BDE84724041C6F51287B7AF2E7A19558AB32EE2DABA726577787D5A136434
+427EF025B3D99F7B916F17AC1382994BD9DF6FD023D2AA72437FD509F55D5EA9
+189108B7934E0B0CEA9E956A000C5E23732E45BD1762961EFF36F7389BA1BF85
+312959449D0751E198C9C34E1081CD049759573217FB73F6A7B0348533F2D942
+9CF18688587980A65F512906C42593767D8A08F81C62E42CF85B92366E0DDE12
+0B04CD253800423151CCF040354A70EBF850C23013A48ACAFC816C4C002D0BAA
+0BCD2869368C497129DFA21813D2689F3EDBDA0956F822751B125CA6ACED9525
+51F85272D896B6A12EB9FB8579DF5FCE686804E3D4BCE113B5FD83478861553D
+75E11E30471EC3A76C5DA24F5BDA4C5A8B72E93DFA470B7E49CE1F960FD3F10F
+3E0E32BEBBB09244F091ACFD721B806D00593A925F97DAFC22C86BB5B0D4648B
+1BD0C32F5EEB7A3CD106C00015CC89B0D2677C7B4F2D3D818B40336B24D3B7B6
+77D03EAE4775C93326F7EE747CBD71FB65A2A2EAC5F1D03A5999C5689B099127
+61A2F058BD984FA3D2785622909A03EDE1A209ED6BB56237887479A782C75A54
+BC20ED5EB4E2BEAD28641E95237D2FE51C70AC77BE31246C92D4A3175EE3FE6C
+02612C7134DA79EAC6522DC1B52AD97132FF53EAE224C2DE9BB37E79464F08E1
+7340C8A79B87B439A484AAC56037E30DD391961E99B1BD4034BF50D00C1657E9
+8FCF4C2DD03612021175360A582CEFC4A7D12642EB33567A389EFBE03712DEF1
+00E971320F62E803F0775767620F37B34692C313FB9C0958E00597E1953F79F0
+F32186D202AF03829D2062335B64DE098D4ECBDED19516A3F4DC88D1799D0FFD
+F24B2C0E899D45756733EE27A1FCC99BEF10C462E9F9B062E9BFC16E75459B76
+06D84FE9C552AF42B0B3EC237785B3CB5075ECB9DE28817B55C85AAEC0C94C4B
+DA282188747A4CF8D63A50B9923CD27DB14D3BC523F41728A2D90ACF46355944
+991DACE13425D8DC18BA74B9F61923E45C978DC8B2D50939947CB4B33596D6D8
+5AB3DD0BD8E4CC3CB8D14590F900354CC46858D09C4BFA8142CDE33F8B75F349
+F535CF80B6DB8E64E6DADDF520D9E29D957BF1E298027BD5D0C4171DB575EA96
+1AECF1C3DEA0950BE26E739FBFB2BE59B86E188816CD44B7ECA980C1E44AA079
+AC2E7BD3C6FF65D9779B60ED34BCB38CCF793BFCF59B84A89A8C719C40EB0A23
+A91CCF0C21CE3DF3985E13C2EB9F89D6B7CE6923077D5E27260B55BC9FAE73B7
+C7EDE7676F922A8366154FAC92C7455863A45C4F4BF140776935BA4583CB1EC7
+1486197EDDFA9E46DCE6A28C992B10DA89C4FB8CF80CD39AC536C1D41C6753E3
+692F8E76928B5D4F2E86D30F7B3954BD6301ABB58CED13884C284C53D7A734BC
+46A9502745970B12A16058695801EDDFF1E65F7242CC61F6C4163A67DB236F17
+704CF79727413904319002AA4D81BFDDF64EFAD2DC47FB896BCBC5FF19FCA3ED
+B2321FF9F8504241CC25C1922DBB23CD6AFA25DDCFD473AC617F1333CFB469F1
+A343455681B59829DFFBCE8406D374059A724C7124FEBEE05F9BF3206254A931
+0D276555A890E38C69BB578DC8D7511E5F82A15E8E4BECD06D47F6E3AFD854C0
+B968F0923B0D7A3672BF7CDA1DA9CD9FEE74D70A2CCAD4055062E3AD8685FFC0
+B5BDDB530C857C3C826981C0F2F91574DE71274A4E404A1D73020F4B50376EFC
+748EEA93D6E1E2DB1144347180ED372D2727E2DBB8E9334778AB1C4E67993D28
+5EA56E402DC2A8B87D017778ACB9585D9C73780CAD7CE94B6BB727BB93366612
+8DC1B3830E7E95EC7EC2D539FE7E73E55633CADBC630F6B7DC36D77ED47B2958
+0B263DB67F07E16A040DC602CA362233C947B95F63F16239F0CA977F1A99F9A6
+B36F831B7D8AA5BD29DC4E26DB4DDB04508C53EA8041AF99D33899327C353C96
+A765BBFE74CFDD198E2FD0D9B9F3F76F2A8178A530919CB701F51DE0BECF3BFA
+B6A10EA4DB04DA17C04B2A932E937CCB268F5F427485C217D284CF602C9091E3
+6977BB4ECD4CA46905E79C6E847C0B7FE0A84F0DD43F7EECD10CC502F95293FC
+078348DBDAC9DAF6338E1F9D7DD289F52E1021E27851CC45AA0047F2FE07B5C7
+A6F0F8BB5E26BA7FFFB21082351804662F9C476E9D721E8A5BC81F2E5CA81F45
+4FC091EC171438E64ECE1899865F483D6015792450AE1186640D1E3C328B915E
+2893621345A8EAEF8A017CCA2D2608C5823A23FC7575397C3646476E8D26BDD2
+8C51C4CEF109EDB677017739A53CFA6A509AC5152077EA5ECD7A176578B6BFC4
+ABABBD0C484F31B293EE6FE8E68A281EECA6198A8BC6CAD2EA4EE2C49390AF4C
+6A710275742AFCA4E2A1DBE04123C080FAC65EB8C6AC86388FBFFAC8EEC49BAC
+464C4E1AA0DCB37AA6503E364FC954BEC84C9552300DC9495DDDEC35795EF8AF
+50D2C0CA0F238B3FA1CBBA9F9CBE1F621C710F73B7D456073082BCB28170407C
+FC3007F52CB71E08A85621B22B4DF750D011175E0A29B4FEBC1D8625E713D050
+31325515679F4A0D6EF17529A37C0BBC3F8F2F7AA0A6F57977941AB4133DA64D
+1AEBE4C7FABCDC25854BA5583678FFB54956AAE6D94F3E06D5C0F27B1DCF2421
+1C74FD8D4F0A5824DABE0346804CDD2D96BED494EE8B9D99F133F325D8CDF0EF
+431AB25D5025BA7A7E8B329AD2F89A53C3855AF9CD54275E030C3051632E5CC0
+994AFBD2A15772BAAFAF46FA10543A2B0AAC06163802D7F748C0EA0DA9072E54
+19E4BE682E9CDBA0B0D7E9F60A90C6C8491A6F30A5D310050DBCF613CC297D4B
+66974DACBFAB4377A753A16FE6394542A275D14197D422CF91FF360E8A63E8B0
+2E746082582E2448F6CAD56E488DBC0F40FCBCBB993A787E70BC9D8E24176B61
+FF2984A3855F02787C6C3DB41752B63FE0B7B090FC6D21763E96F2AC80B8994C
+FC3DD8AD32562184A3FA34CB6C0C73CB587529E35E72337A1AD22970995051DE
+2D10E84A14340589B08FA907F5A3570F98713316F633228AC0BBEC6789BED276
+6E2E1597D0C8C22705A729622749A30BDD267F7BF3CC116F7F888A4F4AFCD688
+63AE5A71F1E2F5EEFA3B100B19D6A893BE519DC5DAA215B143F807296187E4A2
+F52FC1F4448B0F4529E2156CE980293422994E484EA3F21C9FF7A56BB005A4C2
+F073DF6552D40E5DCB7A419C620C9127C451EBC2E341CB0649A503FA0E1B38D6
+2BAD504BEEEC35C13F6CB0659E719FF18C523B882EBD74D43D769E1F8A30354F
+8B790EAA99668110FE86806BDB239796E9F55A75D110D000C72AB2A430241713
+FD770F84793CD7BC488B8BBD59DA1BE3AAABC83F5E699F2A9D4870C2130502A1
+7CC2368B92CF0D52CB70446A3F634582E2E3D320CFC4353A748C1F1D91C7E4B5
+5ACA209EA88800AB7293FD1E8064B10C1A5829535E26D3C55AF6AD9B4ACE497B
+FAB377677F34D002BCDF35C0BBB7DA7833638683788748A16D075E344CE8FF95
+C09C6DCFCCBDB48EC084126BCF94EBDB1856940C67BBB69B8825E91A98F699EF
+2E378557776C9788E2A80ABAFE3E7E3BB6C0F32FA770597E37F271C50C10A9B2
+F90C8D80F4BD9F4C1098A306CE886C127946D3DB39C82F31F1CB1B1451FF6D9D
+A519AA74E1C7C4797F5E3EB440105C51ACFF85734924C0576E826B210C501232
+456601B688A3EA9494A8F391E1A0BFB7668BF6D0E1B82A47E91BC893E13EA0BC
+F8B7BA17D586DEFE3F7C2C72909106A651908325E055DE4F4E5B266D71716474
+56D5010FDC4012A2D659234BA355366C4E737FDFC04B7BECE1C1E16A7158FB27
+21AB8752DBCF8EF4AD11D185D7CE3BD84CD520553F0EE3FFA0AB3D773978A425
+F6C1B4EEE27F127C469005AFE5E07ACF2E438CCA628A77D90C9EAF7072733357
+CCF508A46C831FB96D0033FECE34E85023015A3AAA5E373A790DEB5D743EADBD
+7D249F543389FB089F4ECCAEDC4B75034AAF5DF41AB2DB047BE7C9500D34C60D
+7F38EC93219FA9C8A96523B981103196DB4D45031BAA1CF5018F3ABA08A547AD
+02E77C769762C162C7931A91CED9B33EE6C3BF4E59FF8EFE17A952FF3EAD46A9
+FDB74FFB0FB988DCEFA31ADB3F2A78E7C51BB09504DBBF1D53D96676E5843D8E
+DB50E2C89E2FA58295694AC71D7DC610756278F387A7809C8CD27152672314BE
+E287E774C2949A13B03BCEBA7A9A1A0B927AC46D8FF136C5B305EC65609F6162
+39908934CA61A225513E658F6B42F15A3621A45191F5437EBECAC64914548C8A
+6750FA2C9CC0E3BC40E01A21E3C4BA1707915D34CB78C96F0BCB7E2B10892E71
+174268D0234CFFCD5E60BD7955A151226F4987B67A69D9313CDB1ED0F9F34958
+33F7D16834BB40A6EEC4A5E24F57067FB59FB8D8C9AADFDBD3A897D8C91770CD
+D4820C1AE39A2D1AEC8B457DD856F81B3E698CF1FC5191CF60B1A80CC3230B63
+59C1384BD01EA86208DE000C9D3857B3243C95D6B6BA5BC693C539F7F6423205
+1F0FC68EB360DA674569C20FB993449096394328BB9229F93F45ECF5E11371B9
+63C233E1661C8451A3D1E076D243F6E887C82E49E00E2847CC33858370D560A4
+6742B1F48C2EE6D561A6D43BE796A09976E0D69A4A6C346AB895264C96092511
+7527320E9EA8A73250607B09BBE48D3952998435F36FE4D1CF667BC28ABCCD69
+FEE40049B09F1F39B64F3BE92C1EAC9C4661EBC403A69A9180FA83D1D5E590E0
+647AD00FE509B0E9FEB752F85726783978CE98B4AFAD649D9623F41419F9923A
+A11729723270E0847AA464AEF74FBC743D8D805322360364E7751743552A0AFF
+CCEB847942D9689E9659D15A3D795AEC8782C6EBCE6760E687F87095FCDDEA8B
+C4D8FCE65634148638A8DE5797BF21266AD94E363F58DB84561B74CDD8D5FAB3
+59A521598B34720C54C0AFC5B1A415B7E929D6EDCEE9205DAAB716379C29289F
+2C1AA7EE0776B1C6B6AFCDED4C6ED7EDFF1AA20523EC52F8332C2C0ABBAC1A2B
+DE91AE501079F2A4ECAE93FB93082B1A241AA79C1F7907F8EB3BD528A2353FBE
+749B89A4FD00C8C9472446EE4B6F04F5073EA7C2854835FFBA548920108192AC
+8CC658B87F249321015CA481B2A5F19156F63C5F7C285E18456D0CF0E1ECABCA
+C9702A3DC3911A3B179C837D4849DFEF463B9648AA2CEE8C7B7304B551296AA5
+4E73AFFD0D86AFBBAAEB71082E250627D70CAF3D246867A3676ED1BBBE99F6FD
+32BCA350821E0925E99235BE60C72D8270769DBE50CA12BE348D5145598EB0F6
+2EFC2EAFB348EC74C1F9025DEF33772AB3A41D6F8DDE6CC6746701CF75C86B43
+3F9224B633E510BAB613F6EC46A685D32C1C474F3509FC63268C4DF841B9B38E
+9CB08A26518FFD1A402D43C079C5603589D578DE2E8225A160625B6A484460CE
+5C445FDC1D3A58A982D205C370D86195D988E277F92937BBC9FF72851B0694B4
+D484FE0755962D2C4D81DA0F1F36973CD69765482A7DF0F5E701A3C5045C97FC
+09B5DEC1E35BDF033C02B7155B72851ED7A6BFDE12196DB43AFEDADACD52B93D
+E6F247F438A11DBF4A6D6CD59834865EF349F87DBB7EBBC5503492F5BAEA9615
+32AB4D318C6D1BB372FB14CFCB4268EF69128DE3FA99379609DF7099E459B557
+E7CFA0A293121A700CCC679D815F0883CFAF64B603C9E588488904267AD3EE3B
+9A8F6BED8EF48582F4A420AAE9CC3E0A61EB8D10C816C3091074E3B6345FF4DC
+37E1C1597DA71581A9920E9858DAB295178521766178F2141851EF5E455CE390
+4CD16782A04606397A6B4D13303918255700FFC68D83420E3F37437C073DBE9F
+C80EC3F7D915376410FC4961F37D73D13268B7E93C8B4F29880B535D14DE1205
+615CCB9BCDB0164F2D9C3E9515BF00C5D4E164A6B495E6A80EA01D3D6226BABE
+762982E7B5B74799A15819EDEDFB01B444BA30899AF2498DF31B1198C9115C88
+720C6BFFE2E0F33944274AB36CDEC08D18D00AD8AAB0037680DA8525AD9EBA6D
+8847EEEF0F689C466DB5CA6382B52F56FCF8490F2A931B3A71
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+%%EndFont 
+TeXDict begin 40258431 52099146 1000 600 600 (readline.dvi)
+@start /Fa 209[24 46[{ TeX74afc74cEncoding ReEncodeFont }1
+74.7198 /CMTI9 rf /Fb 133[34 41 41 55 41 43 30 30 30
+41 43 38 43 64 21 41 1[21 43 38 23 34 43 34 43 38 11[58
+6[58 1[48 4[60 50 1[59 10[38 38 38 38 38 38 38 38 38
+38 2[26 21 30[43 43 12[{ TeXf7b6d320Encoding ReEncodeFont }45
+74.7198 /CMR9 rf /Fc 134[39 39 2[39 39 39 39 2[39 39
+39 39 2[39 39 2[39 3[39 19[39 27[39 39 2[39 45[{
+ TeX09fbbfacEncoding ReEncodeFont }18 74.7198 /CMSLTT10
+rf /Fd 129[39 39 39 39 39 39 39 39 39 39 39 39 39 39
+39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39
+1[39 39 39 2[39 39 39 39 39 39 39 39 39 39 39 39 39 1[39
+39 1[39 39 39 39 39 39 39 39 39 39 39 39 39 39 3[39 1[39
+1[39 39 39 39 39 39 39 39 39 39 39 39 39 39 1[39 39 39
+33[{ TeX09fbbfacEncoding ReEncodeFont }83 74.7198 /CMTT9
+rf /Fe 214[35 35 40[{ TeXf7b6d320Encoding ReEncodeFont }2
+90.9091 /CMSS10 rf /Ff 133[51 60 60 83 60 64 45 45 47
+60 64 57 64 95 32 60 1[32 64 57 35 53 64 51 64 56 84[64
+67 11[{ TeXf7b6d320Encoding ReEncodeFont }27 99.6264
+/CMBX10 rf /Fg 134[52 2[52 52 52 52 52 52 52 52 52 52
+52 52 1[52 52 52 52 52 52 52 52 52 1[52 18[52 52 1[52
+2[52 52 26[52 42[{ TeX09fbbfacEncoding ReEncodeFont }29
+99.6264 /CMTT10 rf /Fh 134[65 65 89 65 68 48 48 50 1[68
+61 68 102 34 65 1[34 68 61 37 56 68 55 68 60 7[93 1[127
+93 94 85 68 92 3[96 116 74 96 1[46 96 1[77 81 94 89 87
+93 6[34 61 61 61 61 61 61 61 61 61 61 1[34 46[{
+ TeXf7b6d320Encoding ReEncodeFont }54 109.091 /CMBX12
+rf /Fi 134[48 48 66 48 51 35 36 36 48 51 45 51 76 25
+48 1[25 51 45 28 40 51 40 51 45 9[93 1[68 66 51 67 1[62
+71 68 83 57 71 1[33 68 1[59 62 69 66 64 68 15[45 45 2[30
+31[51 51 12[{ TeXf7b6d320Encoding ReEncodeFont }48 90.9091
+/CMSL10 rf /Fj 138[39 27 28 28 1[39 35 39 2[37 22 4[31
+1[31 39 35 5[20 6[51 39 52 1[48 2[65 44 5[46 48 54 51
+50 53 15[35 3[24 5[20 39[{ TeXf7b6d320Encoding ReEncodeFont }29
+66.4176 /CMR8 rf /Fk 150[30 30 104[{ TeXbbad153fEncoding ReEncodeFont }
+2 74.7198 /CMSY9 rf /Fl 134[48 48 48 48 48 48 48 48 48
+48 48 48 48 48 48 48 48 1[48 48 48 48 48 48 48 1[48 2[48
+14[48 48 1[48 1[48 2[48 48 48 17[48 48 2[48 5[48 39[{
+ TeX09fbbfacEncoding ReEncodeFont }37 90.9091 /CMSLTT10
+rf /Fm 135[56 2[56 54 42 2[51 58 56 68 47 1[39 27 56
+58 49 51 57 54 1[56 97[{ TeX0ef0afcaEncoding ReEncodeFont }18
+90.9091 /CMCSC10 rf /Fn 134[44 1[60 42 49 30 37 38 1[46
+46 51 74 23 2[28 1[42 1[42 46 42 1[46 50[28 33[51 12[{
+ TeX74afc74cEncoding ReEncodeFont }20 90.9091 /CMTI10
+rf /Fo 209[43 46[{ TeX74afc74cEncoding ReEncodeFont }1
+119.552 /CMBXTI10 rf /Fp 134[85 85 117 1[90 63 64 66
+1[90 81 90 134 45 2[45 90 81 49 74 90 72 90 78 10[122
+124 112 1[120 1[110 1[126 153 97 2[60 1[127 101 106 1[117
+1[122 14[81 81 49[{ TeXf7b6d320Encoding ReEncodeFont }37
+143.462 /CMBX12 rf /Fq 242[91 13[{ TeXbbad153fEncoding ReEncodeFont }1
+90.9091 /CMSY10 rf /Fr 134[71 71 97 71 75 52 53 55 1[75
+67 75 112 37 2[37 75 67 41 61 75 60 75 65 7[102 1[139
+102 103 94 75 100 101 92 101 105 128 81 105 1[50 105
+106 85 88 103 97 96 102 9[67 67 67 67 67 67 67 2[37 1[37
+44[{ TeXf7b6d320Encoding ReEncodeFont }54 119.552 /CMBX12
+rf /Fs 129[48 48 48 48 48 48 48 48 48 48 48 48 48 48
+48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48
+1[48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48
+48 48 1[48 48 48 48 48 48 48 48 48 48 48 48 48 48 48
+48 1[48 48 1[48 48 1[48 48 48 48 48 48 48 48 48 48 48
+48 48 48 48 48 48 48 33[{ TeX09fbbfacEncoding ReEncodeFont }89
+90.9091 /CMTT10 rf /Ft 131[91 45 40 48 48 66 48 51 35
+36 36 48 51 45 51 76 25 48 28 25 51 45 28 40 51 40 51
+45 25 2[25 45 25 56 68 68 93 68 68 66 51 67 71 62 71
+68 83 57 71 47 33 68 71 59 62 69 66 64 68 5[25 25 45
+45 45 45 45 45 45 45 45 45 45 25 30 25 2[35 35 25 2[45
+1[45 19[76 51 51 53 11[{ TeXf7b6d320Encoding ReEncodeFont }83
+90.9091 /CMR10 rf /Fu 134[102 6[79 3[108 1[54 2[54 3[88
+108 1[108 94 11[149 2[144 3[151 1[116 4[152 71[{
+ TeXf7b6d320Encoding ReEncodeFont }14 172.154 /CMBX12
+rf end
+%%EndProlog
+%%BeginSetup
+%%Feature: *Resolution 600dpi
+TeXDict begin
+%%BeginPaperSize: Letter
+letter
+%%EndPaperSize
+ end
+%%EndSetup
+%%Page: 1 1
+TeXDict begin 1 0 bop 150 1318 a Fu(GNU)65 b(Readline)g(Library)p
+150 1418 3600 34 v 1873 1515 a Ft(Edition)30 b(5.2,)i(for)e
+Fs(Readline)e(Library)h Ft(V)-8 b(ersion)31 b(5.2.)3333
+1623 y(April)f(2006)150 4935 y Fr(Chet)45 b(Ramey)-11
+b(,)46 b(Case)g(W)-11 b(estern)46 b(Reserv)l(e)g(Univ)l(ersit)l(y)150
+5068 y(Brian)f(F)-11 b(o)l(x,)45 b(F)-11 b(ree)45 b(Soft)l(w)l(are)h(F)
+-11 b(oundation)p 150 5141 3600 17 v eop end
+%%Page: 2 2
+TeXDict begin 2 1 bop 150 3024 a Ft(This)37 b(man)m(ual)h(describ)s(es)
+f(the)h(GNU)h(Readline)f(Library)f(\(v)m(ersion)i(5.2,)i(26)e(April)e
+(2006\),)42 b(a)c(library)150 3133 y(whic)m(h)h(aids)g(in)g(the)g
+(consistency)h(of)g(user)e(in)m(terface)j(across)f(discrete)g(programs)
+e(whic)m(h)h(pro)m(vide)h(a)150 3243 y(command)30 b(line)h(in)m
+(terface.)150 3377 y(Cop)m(yrigh)m(t)602 3374 y(c)577
+3377 y Fq(\015)f Ft(1988-2006)k(F)-8 b(ree)32 b(Soft)m(w)m(are)f(F)-8
+b(oundation,)32 b(Inc.)150 3512 y(P)m(ermission)g(is)h(gran)m(ted)g(to)
+f(mak)m(e)i(and)d(distribute)h(v)m(erbatim)h(copies)g(of)f(this)g(man)m
+(ual)h(pro)m(vided)f(the)150 3621 y(cop)m(yrigh)m(t)g(notice)f(and)f
+(this)g(p)s(ermission)g(notice)h(are)g(preserv)m(ed)f(on)h(all)g
+(copies.)390 3756 y(P)m(ermission)k(is)h(gran)m(ted)f(to)h(cop)m(y)-8
+b(,)38 b(distribute)d(and/or)g(mo)s(dify)f(this)h(do)s(cumen)m(t)g
+(under)390 3866 y(the)j(terms)g(of)g(the)g(GNU)h(F)-8
+b(ree)39 b(Do)s(cumen)m(tation)h(License,)g(V)-8 b(ersion)39
+b(1.2)g(or)f(an)m(y)g(later)390 3975 y(v)m(ersion)28
+b(published)d(b)m(y)j(the)f(F)-8 b(ree)29 b(Soft)m(w)m(are)f(F)-8
+b(oundation;)30 b(with)d(no)g(In)m(v)-5 b(arian)m(t)28
+b(Sections,)390 4085 y(with)i(the)h(F)-8 b(ron)m(t-Co)m(v)m(er)33
+b(texts)e(b)s(eing)g(\\A)g(GNU)g(Man)m(ual,")h(and)e(with)g(the)h(Bac)m
+(k-Co)m(v)m(er)390 4194 y(T)-8 b(exts)33 b(as)g(in)f(\(a\))h(b)s(elo)m
+(w.)47 b(A)33 b(cop)m(y)g(of)f(the)h(license)g(is)g(included)e(in)h
+(the)h(section)g(en)m(titled)390 4304 y(\\GNU)e(F)-8
+b(ree)32 b(Do)s(cumen)m(tation)g(License.")390 4438 y(\(a\))39
+b(The)f(FSF's)g(Bac)m(k-Co)m(v)m(er)j(T)-8 b(ext)39 b(is:)56
+b(\\Y)-8 b(ou)39 b(ha)m(v)m(e)g(freedom)f(to)h(cop)m(y)f(and)g(mo)s
+(dify)390 4548 y(this)32 b(GNU)i(Man)m(ual,)g(lik)m(e)g(GNU)f(soft)m(w)
+m(are.)49 b(Copies)32 b(published)f(b)m(y)h(the)h(F)-8
+b(ree)34 b(Soft)m(w)m(are)390 4658 y(F)-8 b(oundation)31
+b(raise)g(funds)d(for)j(GNU)g(dev)m(elopmen)m(t.")150
+4902 y(Published)e(b)m(y)h(the)h(F)-8 b(ree)31 b(Soft)m(w)m(are)h(F)-8
+b(oundation)150 5011 y(59)31 b(T)-8 b(emple)31 b(Place,)h(Suite)e(330,)
+150 5121 y(Boston,)i(MA)e(02111-1307)150 5230 y(USA)p
+eop end
+%%Page: -1 3
+TeXDict begin -1 2 bop 3725 -116 a Ft(i)150 299 y Fp(T)-13
+b(able)53 b(of)h(Con)l(ten)l(ts)150 641 y Fr(1)135 b(Command)45
+b(Line)g(Editing)40 b Fo(.)20 b(.)f(.)g(.)h(.)f(.)h(.)f(.)h(.)f(.)g(.)h
+(.)f(.)h(.)f(.)h(.)f(.)g(.)h(.)f(.)84 b Fr(1)449 778
+y Ft(1.1)92 b(In)m(tro)s(duction)30 b(to)h(Line)f(Editing)25
+b Fn(.)16 b(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)55
+b Ft(1)449 888 y(1.2)92 b(Readline)31 b(In)m(teraction)16
+b Fn(.)h(.)e(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
+g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)46 b Ft(1)748 997 y(1.2.1)93 b(Readline)31
+b(Bare)g(Essen)m(tials)c Fn(.)15 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)56
+b Ft(1)748 1107 y(1.2.2)93 b(Readline)31 b(Mo)m(v)m(emen)m(t)h
+(Commands)14 b Fn(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)44 b Ft(2)748 1216 y(1.2.3)93 b(Readline)31
+b(Killing)g(Commands)22 b Fn(.)13 b(.)i(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)51 b Ft(2)748
+1326 y(1.2.4)93 b(Readline)31 b(Argumen)m(ts)25 b Fn(.)15
+b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)55 b Ft(3)748
+1435 y(1.2.5)93 b(Searc)m(hing)30 b(for)h(Commands)e(in)h(the)g
+(History)d Fn(.)15 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)56
+b Ft(3)449 1545 y(1.3)92 b(Readline)31 b(Init)f(File)g
+Fn(.)15 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
+g(.)g(.)g(.)g(.)g(.)58 b Ft(4)748 1655 y(1.3.1)93 b(Readline)31
+b(Init)f(File)h(Syn)m(tax)13 b Fn(.)j(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)43
+b Ft(4)748 1764 y(1.3.2)93 b(Conditional)30 b(Init)h(Constructs)9
+b Fn(.)14 b(.)h(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)39 b Ft(9)748 1874 y(1.3.3)93
+b(Sample)30 b(Init)g(File)21 b Fn(.)c(.)e(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
+g(.)g(.)g(.)g(.)51 b Ft(10)449 1983 y(1.4)92 b(Bindable)31
+b(Readline)g(Commands)12 b Fn(.)i(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)41
+b Ft(13)748 2093 y(1.4.1)93 b(Commands)29 b(F)-8 b(or)31
+b(Mo)m(ving)d Fn(.)15 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)56 b Ft(13)748
+2203 y(1.4.2)93 b(Commands)29 b(F)-8 b(or)31 b(Manipulating)g(The)f
+(History)18 b Fn(.)e(.)f(.)g(.)g(.)g(.)g(.)47 b Ft(13)748
+2312 y(1.4.3)93 b(Commands)29 b(F)-8 b(or)31 b(Changing)f(T)-8
+b(ext)30 b Fn(.)15 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
+g(.)h(.)f(.)58 b Ft(14)748 2422 y(1.4.4)93 b(Killing)31
+b(And)e(Y)-8 b(anking)17 b Fn(.)f(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)46
+b Ft(16)748 2531 y(1.4.5)93 b(Sp)s(ecifying)29 b(Numeric)i(Argumen)m
+(ts)25 b Fn(.)15 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)54 b Ft(17)748 2641 y(1.4.6)93 b(Letting)31
+b(Readline)g(T)m(yp)s(e)f(F)-8 b(or)31 b(Y)-8 b(ou)19
+b Fn(.)d(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
+49 b Ft(17)748 2751 y(1.4.7)93 b(Keyb)s(oard)29 b(Macros)11
+b Fn(.)17 b(.)e(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)41
+b Ft(17)748 2860 y(1.4.8)93 b(Some)30 b(Miscellaneous)i(Commands)13
+b Fn(.)h(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)
+42 b Ft(18)449 2970 y(1.5)92 b(Readline)31 b(vi)f(Mo)s(de)d
+Fn(.)15 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
+g(.)g(.)g(.)g(.)56 b Ft(19)150 3212 y Fr(2)135 b(Programming)46
+b(with)f(GNU)g(Readline)25 b Fo(.)c(.)e(.)h(.)f(.)g(.)h(.)f(.)h(.)69
+b Fr(21)449 3349 y Ft(2.1)92 b(Basic)32 b(Beha)m(vior)15
+b Fn(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
+g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)h(.)f(.)44 b Ft(21)449 3459 y(2.2)92
+b(Custom)30 b(F)-8 b(unctions)15 b Fn(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
+g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)44 b
+Ft(22)748 3568 y(2.2.1)93 b(Readline)31 b(T)m(yp)s(edefs)19
+b Fn(.)13 b(.)i(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)48
+b Ft(22)748 3678 y(2.2.2)93 b(W)-8 b(riting)31 b(a)g(New)f(F)-8
+b(unction)11 b Fn(.)17 b(.)e(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
+g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)41 b Ft(23)449
+3787 y(2.3)92 b(Readline)31 b(V)-8 b(ariables)30 b Fn(.)15
+b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
+g(.)58 b Ft(24)449 3897 y(2.4)92 b(Readline)31 b(Con)m(v)m(enience)h(F)
+-8 b(unctions)15 b Fn(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h
+(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)44
+b Ft(28)748 4007 y(2.4.1)93 b(Naming)30 b(a)h(F)-8 b(unction)25
+b Fn(.)15 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)53 b Ft(28)748
+4116 y(2.4.2)93 b(Selecting)31 b(a)g(Keymap)12 b Fn(.)j(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)
+g(.)g(.)g(.)g(.)g(.)41 b Ft(28)748 4226 y(2.4.3)93 b(Binding)30
+b(Keys)10 b Fn(.)k(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
+g(.)g(.)39 b Ft(29)748 4335 y(2.4.4)93 b(Asso)s(ciating)31
+b(F)-8 b(unction)31 b(Names)g(and)f(Bindings)16 b Fn(.)f(.)g(.)g(.)g(.)
+g(.)g(.)45 b Ft(31)748 4445 y(2.4.5)93 b(Allo)m(wing)31
+b(Undoing)e Fn(.)15 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)58
+b Ft(31)748 4555 y(2.4.6)93 b(Redispla)m(y)21 b Fn(.)15
+b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
+g(.)50 b Ft(32)748 4664 y(2.4.7)93 b(Mo)s(difying)30
+b(T)-8 b(ext)13 b Fn(.)j(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
+g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g
+(.)g(.)42 b Ft(34)748 4774 y(2.4.8)93 b(Character)30
+b(Input)20 b Fn(.)14 b(.)h(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
+50 b Ft(34)748 4883 y(2.4.9)93 b(T)-8 b(erminal)30 b(Managemen)m(t)c
+Fn(.)15 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)53 b Ft(35)748 4993
+y(2.4.10)93 b(Utilit)m(y)32 b(F)-8 b(unctions)26 b Fn(.)15
+b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)54 b Ft(35)748
+5103 y(2.4.11)93 b(Miscellaneous)32 b(F)-8 b(unctions)12
+b Fn(.)k(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
+g(.)h(.)f(.)g(.)g(.)g(.)41 b Ft(36)748 5212 y(2.4.12)93
+b(Alternate)32 b(In)m(terface)f Fn(.)15 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
+g(.)59 b Ft(37)748 5322 y(2.4.13)93 b(A)30 b(Readline)h(Example)17
+b Fn(.)f(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
+g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)46 b Ft(38)p eop
+end
+%%Page: -2 4
+TeXDict begin -2 3 bop 150 -116 a Ft(ii)2640 b(GNU)31
+b(Readline)g(Library)449 83 y(2.5)92 b(Readline)31 b(Signal)g(Handling)
+23 b Fn(.)15 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)52
+b Ft(39)449 193 y(2.6)92 b(Custom)30 b(Completers)25
+b Fn(.)15 b(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
+g(.)g(.)55 b Ft(41)748 302 y(2.6.1)93 b(Ho)m(w)31 b(Completing)g(W)-8
+b(orks)19 b Fn(.)d(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)49 b Ft(41)748
+412 y(2.6.2)93 b(Completion)30 b(F)-8 b(unctions)12 b
+Fn(.)17 b(.)e(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)42 b Ft(42)748
+521 y(2.6.3)93 b(Completion)30 b(V)-8 b(ariables)23 b
+Fn(.)17 b(.)e(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)52 b Ft(43)748
+631 y(2.6.4)93 b(A)30 b(Short)g(Completion)h(Example)9
+b Fn(.)15 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h
+(.)f(.)g(.)38 b Ft(47)150 873 y Fr(App)t(endix)44 b(A)99
+b(Cop)l(ying)46 b(This)e(Man)l(ual)29 b Fo(.)20 b(.)g(.)f(.)h(.)f(.)g
+(.)h(.)f(.)h(.)f(.)74 b Fr(57)449 1010 y Ft(A.1)92 b(GNU)31
+b(F)-8 b(ree)31 b(Do)s(cumen)m(tation)h(License)c Fn(.)15
+b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)56 b Ft(57)748 1120 y(A.1.1)92 b(ADDENDUM:)33
+b(Ho)m(w)e(to)g(use)f(this)g(License)h(for)g(y)m(our)930
+1230 y(do)s(cumen)m(ts)c Fn(.)15 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
+g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)57 b Ft(63)150
+1472 y Fr(Concept)45 b(Index)21 b Fo(.)e(.)g(.)h(.)f(.)h(.)f(.)h(.)f(.)
+h(.)f(.)g(.)h(.)f(.)h(.)f(.)h(.)f(.)g(.)h(.)f(.)h(.)f(.)h(.)f(.)g(.)h
+(.)f(.)h(.)f(.)h(.)65 b Fr(65)150 1742 y(F)-11 b(unction)44
+b(and)h(V)-11 b(ariable)45 b(Index)17 b Fo(.)j(.)f(.)h(.)f(.)h(.)f(.)h
+(.)f(.)g(.)h(.)f(.)h(.)f(.)h(.)f(.)g(.)h(.)62 b Fr(67)p
+eop end
+%%Page: 1 5
+TeXDict begin 1 4 bop 150 -116 a Ft(Chapter)30 b(1:)41
+b(Command)29 b(Line)i(Editing)2153 b(1)150 299 y Fp(1)80
+b(Command)54 b(Line)f(Editing)275 511 y Ft(This)29 b(c)m(hapter)i
+(describ)s(es)f(the)g(basic)h(features)g(of)f(the)h Fm(gnu)f
+Ft(command)g(line)h(editing)g(in)m(terface.)150 755 y
+Fr(1.1)68 b(In)l(tro)t(duction)45 b(to)g(Line)h(Editing)275
+995 y Ft(The)29 b(follo)m(wing)j(paragraphs)e(describ)s(e)g(the)g
+(notation)i(used)d(to)j(represen)m(t)e(k)m(eystrok)m(es.)275
+1125 y(The)i(text)j Fl(C-k)d Ft(is)i(read)f(as)h(`Con)m(trol-K')g(and)f
+(describ)s(es)g(the)g(c)m(haracter)i(pro)s(duced)d(when)g(the)3663
+1122 y Fk(h)p 3687 1069 38 4 v 3687 1125 a Fj(k)p 3687
+1140 V 3720 1122 a Fk(i)150 1235 y Ft(k)m(ey)f(is)g(pressed)e(while)h
+(the)h(Con)m(trol)g(k)m(ey)g(is)g(depressed.)275 1365
+y(The)g(text)i Fl(M-k)e Ft(is)h(read)f(as)i(`Meta-K')g(and)f(describ)s
+(es)f(the)h(c)m(haracter)h(pro)s(duced)e(when)f(the)i(Meta)150
+1474 y(k)m(ey)d(\(if)g(y)m(ou)g(ha)m(v)m(e)g(one\))g(is)g(depressed,)f
+(and)f(the)1859 1471 y Fk(h)p 1883 1418 V 1883 1474 a
+Fj(k)p 1883 1490 V 1916 1471 a Fk(i)1974 1474 y Ft(k)m(ey)j(is)e
+(pressed.)39 b(The)28 b(Meta)i(k)m(ey)f(is)g(lab)s(eled)3558
+1471 y Fk(h)p 3582 1418 143 4 v 3582 1474 a Fj(AL)-6
+b(T)p 3582 1490 V 3720 1471 a Fk(i)150 1584 y Ft(on)26
+b(man)m(y)g(k)m(eyb)s(oards.)39 b(On)26 b(k)m(eyb)s(oards)g(with)g(t)m
+(w)m(o)h(k)m(eys)g(lab)s(eled)2425 1581 y Fk(h)p 2450
+1528 V 2450 1584 a Fj(AL)-6 b(T)p 2450 1599 V 2587 1581
+a Fk(i)2643 1584 y Ft(\(usually)27 b(to)g(either)f(side)g(of)h(the)150
+1693 y(space)32 b(bar\),)g(the)775 1690 y Fk(h)p 799
+1637 V 799 1693 a Fj(AL)-6 b(T)p 799 1709 V 937 1690
+a Fk(i)998 1693 y Ft(on)32 b(the)f(left)h(side)g(is)f(generally)i(set)e
+(to)i(w)m(ork)e(as)h(a)f(Meta)i(k)m(ey)-8 b(.)45 b(The)3393
+1690 y Fk(h)p 3417 1637 V 3417 1693 a Fj(AL)-6 b(T)p
+3417 1709 V 3555 1690 a Fk(i)3616 1693 y Ft(k)m(ey)150
+1803 y(on)33 b(the)h(righ)m(t)g(ma)m(y)g(also)g(b)s(e)f(con\014gured)f
+(to)i(w)m(ork)g(as)g(a)f(Meta)i(k)m(ey)f(or)g(ma)m(y)g(b)s(e)e
+(con\014gured)h(as)h(some)150 1913 y(other)d(mo)s(di\014er,)e(suc)m(h)h
+(as)h(a)g(Comp)s(ose)f(k)m(ey)h(for)f(t)m(yping)h(accen)m(ted)h(c)m
+(haracters.)275 2043 y(If)21 b(y)m(ou)h(do)g(not)g(ha)m(v)m(e)h(a)f
+(Meta)h(or)1388 2040 y Fk(h)p 1412 1987 V 1412 2043 a
+Fj(AL)-6 b(T)p 1412 2058 V 1550 2040 a Fk(i)1601 2043
+y Ft(k)m(ey)e(,)25 b(or)d(another)g(k)m(ey)h(w)m(orking)f(as)g(a)g
+(Meta)h(k)m(ey)-8 b(,)25 b(the)d(iden)m(tical)150 2152
+y(k)m(eystrok)m(e)i(can)f(b)s(e)f(generated)i(b)m(y)e(t)m(yping)1619
+2149 y Fk(h)p 1643 2096 139 4 v 1643 2152 a Fj(ESC)p
+1643 2168 V 1777 2149 a Fk(i)1829 2152 y Fn(\014rst)p
+Ft(,)j(and)d(then)g(t)m(yping)2678 2149 y Fk(h)p 2703
+2096 38 4 v 2703 2152 a Fj(k)p 2703 2168 V 2736 2149
+a Fk(i)2765 2152 y Ft(.)38 b(Either)23 b(pro)s(cess)f(is)g(kno)m(wn)150
+2262 y(as)31 b Fi(metafying)39 b Ft(the)850 2259 y Fk(h)p
+874 2206 V 874 2262 a Fj(k)p 874 2277 V 907 2259 a Fk(i)968
+2262 y Ft(k)m(ey)-8 b(.)275 2392 y(The)39 b(text)j Fl(M-C-k)d
+Ft(is)h(read)g(as)h(`Meta-Con)m(trol-k')j(and)39 b(describ)s(es)h(the)g
+(c)m(haracter)i(pro)s(duced)d(b)m(y)150 2501 y Fi(metafying)g
+Fl(C-k)p Ft(.)275 2632 y(In)d(addition,)j(sev)m(eral)f(k)m(eys)f(ha)m
+(v)m(e)h(their)f(o)m(wn)g(names.)60 b(Sp)s(eci\014cally)-8
+b(,)2768 2629 y Fk(h)p 2792 2576 146 4 v 2792 2632 a
+Fj(DEL)p 2792 2647 V 2934 2629 a Fk(i)2964 2632 y Ft(,)3028
+2629 y Fk(h)p 3052 2576 139 4 v 3052 2632 a Fj(ESC)p
+3052 2647 V 3186 2629 a Fk(i)3216 2632 y Ft(,)3279 2629
+y Fk(h)p 3303 2576 144 4 v 3303 2632 a Fj(LFD)p 3303
+2647 V 3443 2629 a Fk(i)3473 2632 y Ft(,)3537 2629 y
+Fk(h)p 3561 2576 139 4 v 3561 2632 a Fj(SPC)p 3561 2647
+V 3695 2629 a Fk(i)3725 2632 y Ft(,)150 2738 y Fk(h)p
+174 2685 151 4 v 174 2741 a Fj(RET)p 174 2757 V 321 2738
+a Fk(i)351 2741 y Ft(,)47 b(and)612 2738 y Fk(h)p 637
+2685 148 4 v 637 2741 a Fj(T)-6 b(AB)p 637 2757 V 780
+2738 a Fk(i)853 2741 y Ft(all)45 b(stand)e(for)g(themselv)m(es)i(when)d
+(seen)i(in)f(this)g(text,)48 b(or)43 b(in)g(an)h(init)f(\014le)h(\(see)
+150 2851 y(Section)c(1.3)f([Readline)h(Init)e(File],)43
+b(page)c(4\).)67 b(If)38 b(y)m(our)h(k)m(eyb)s(oard)f(lac)m(ks)i(a)2888
+2848 y Fk(h)p 2912 2795 144 4 v 2912 2851 a Fj(LFD)p
+2912 2866 V 3052 2848 a Fk(i)3121 2851 y Ft(k)m(ey)-8
+b(,)42 b(t)m(yping)3604 2848 y Fk(h)p 3628 2795 97 4
+v 3628 2851 a Fj(C-j)p 3628 2866 V 3720 2848 a Fk(i)150
+2960 y Ft(will)30 b(pro)s(duce)e(the)i(desired)f(c)m(haracter.)42
+b(The)1748 2957 y Fk(h)p 1772 2904 151 4 v 1772 2960
+a Fj(RET)p 1772 2976 V 1919 2957 a Fk(i)1978 2960 y Ft(k)m(ey)30
+b(ma)m(y)g(b)s(e)f(lab)s(eled)2770 2957 y Fk(h)p 2794
+2904 217 4 v 2794 2960 a Fj(Return)p 2794 2976 V 3007
+2957 a Fk(i)3066 2960 y Ft(or)3176 2957 y Fk(h)p 3201
+2904 172 4 v 3201 2960 a Fj(En)n(ter)p 3201 2976 V 3368
+2957 a Fk(i)3427 2960 y Ft(on)h(some)150 3070 y(k)m(eyb)s(oards.)150
+3314 y Fr(1.2)68 b(Readline)47 b(In)l(teraction)275 3554
+y Ft(Often)24 b(during)g(an)h(in)m(teractiv)m(e)j(session)e(y)m(ou)f(t)
+m(yp)s(e)h(in)f(a)g(long)h(line)f(of)h(text,)h(only)f(to)f(notice)i
+(that)f(the)150 3663 y(\014rst)32 b(w)m(ord)g(on)g(the)g(line)h(is)g
+(missp)s(elled.)46 b(The)32 b(Readline)h(library)f(giv)m(es)h(y)m(ou)g
+(a)g(set)g(of)f(commands)g(for)150 3773 y(manipulating)e(the)g(text)h
+(as)f(y)m(ou)g(t)m(yp)s(e)g(it)g(in,)g(allo)m(wing)h(y)m(ou)f(to)h
+(just)e(\014x)g(y)m(our)h(t)m(yp)s(o,)g(and)g(not)g(forcing)150
+3883 y(y)m(ou)e(to)h(ret)m(yp)s(e)g(the)f(ma)5 b(jorit)m(y)29
+b(of)f(the)h(line.)40 b(Using)28 b(these)h(editing)g(commands,)f(y)m
+(ou)h(mo)m(v)m(e)g(the)g(cursor)150 3992 y(to)35 b(the)f(place)i(that)e
+(needs)g(correction,)j(and)d(delete)h(or)f(insert)h(the)f(text)h(of)g
+(the)f(corrections.)54 b(Then,)150 4102 y(when)30 b(y)m(ou)i(are)f
+(satis\014ed)g(with)g(the)g(line,)h(y)m(ou)g(simply)e(press)2320
+4099 y Fk(h)p 2344 4046 151 4 v 2344 4102 a Fj(RET)p
+2344 4117 V 2491 4099 a Fk(i)2520 4102 y Ft(.)43 b(Y)-8
+b(ou)32 b(do)f(not)g(ha)m(v)m(e)i(to)e(b)s(e)g(at)h(the)150
+4211 y(end)j(of)h(the)g(line)g(to)h(press)1126 4208 y
+Fk(h)p 1150 4155 V 1150 4211 a Fj(RET)p 1150 4227 V 1297
+4208 a Fk(i)1327 4211 y Ft(;)h(the)e(en)m(tire)h(line)f(is)g(accepted)h
+(regardless)f(of)g(the)g(lo)s(cation)i(of)e(the)150 4321
+y(cursor)30 b(within)g(the)g(line.)150 4532 y Fh(1.2.1)63
+b(Readline)40 b(Bare)h(Essen)m(tials)275 4772 y Ft(In)22
+b(order)g(to)i(en)m(ter)g(c)m(haracters)g(in)m(to)g(the)g(line,)h
+(simply)d(t)m(yp)s(e)i(them.)38 b(The)22 b(t)m(yp)s(ed)h(c)m(haracter)i
+(app)s(ears)150 4881 y(where)32 b(the)h(cursor)e(w)m(as,)j(and)e(then)g
+(the)h(cursor)e(mo)m(v)m(es)j(one)f(space)g(to)g(the)g(righ)m(t.)47
+b(If)32 b(y)m(ou)h(mist)m(yp)s(e)g(a)150 4991 y(c)m(haracter,)f(y)m(ou)
+f(can)g(use)f(y)m(our)g(erase)h(c)m(haracter)h(to)f(bac)m(k)g(up)f(and)
+f(delete)j(the)f(mist)m(yp)s(ed)e(c)m(haracter.)275 5121
+y(Sometimes)i(y)m(ou)g(ma)m(y)h(mist)m(yp)s(e)e(a)i(c)m(haracter,)g
+(and)e(not)i(notice)g(the)f(error)f(un)m(til)h(y)m(ou)g(ha)m(v)m(e)h(t)
+m(yp)s(ed)150 5230 y(sev)m(eral)e(other)f(c)m(haracters.)42
+b(In)28 b(that)i(case,)g(y)m(ou)f(can)g(t)m(yp)s(e)h
+Fl(C-b)d Ft(to)j(mo)m(v)m(e)g(the)f(cursor)g(to)g(the)g(left,)i(and)150
+5340 y(then)f(correct)i(y)m(our)e(mistak)m(e.)42 b(Afterw)m(ards,)31
+b(y)m(ou)f(can)h(mo)m(v)m(e)h(the)e(cursor)g(to)h(the)g(righ)m(t)g
+(with)f Fl(C-f)p Ft(.)p eop end
+%%Page: 2 6
+TeXDict begin 2 5 bop 150 -116 a Ft(2)2645 b(GNU)31 b(Readline)g
+(Library)275 299 y(When)h(y)m(ou)h(add)f(text)h(in)f(the)h(middle)f(of)
+h(a)g(line,)h(y)m(ou)e(will)h(notice)h(that)f(c)m(haracters)h(to)g(the)
+e(righ)m(t)150 408 y(of)d(the)g(cursor)f(are)h(`pushed)e(o)m(v)m(er')j
+(to)g(mak)m(e)f(ro)s(om)g(for)f(the)h(text)h(that)f(y)m(ou)g(ha)m(v)m
+(e)h(inserted.)40 b(Lik)m(ewise,)150 518 y(when)d(y)m(ou)g(delete)i
+(text)g(b)s(ehind)c(the)j(cursor,)h(c)m(haracters)g(to)f(the)g(righ)m
+(t)g(of)g(the)g(cursor)e(are)i(`pulled)150 628 y(bac)m(k')24
+b(to)f(\014ll)g(in)f(the)h(blank)f(space)i(created)f(b)m(y)g(the)g
+(remo)m(v)-5 b(al)24 b(of)f(the)g(text.)39 b(A)23 b(list)g(of)g(the)g
+(bare)f(essen)m(tials)150 737 y(for)30 b(editing)h(the)g(text)g(of)g
+(an)f(input)f(line)i(follo)m(ws.)150 892 y Fl(C-b)336
+b Ft(Mo)m(v)m(e)32 b(bac)m(k)g(one)e(c)m(haracter.)150
+1048 y Fl(C-f)336 b Ft(Mo)m(v)m(e)32 b(forw)m(ard)e(one)h(c)m
+(haracter.)150 1200 y Fk(h)p 174 1147 146 4 v 174 1203
+a Fj(DEL)p 174 1218 V 316 1200 a Fk(i)376 1203 y Ft(or)487
+1200 y Fk(h)p 512 1147 317 4 v 512 1203 a Fj(Bac)n(kspace)p
+512 1218 V 824 1200 a Fk(i)630 1312 y Ft(Delete)i(the)d(c)m(haracter)i
+(to)f(the)g(left)g(of)f(the)h(cursor.)150 1467 y Fl(C-d)336
+b Ft(Delete)33 b(the)d(c)m(haracter)i(underneath)d(the)i(cursor.)150
+1622 y(Prin)m(ting)g(c)m(haracters)630 1732 y(Insert)f(the)g(c)m
+(haracter)i(in)m(to)g(the)e(line)h(at)g(the)g(cursor.)150
+1887 y Fl(C-_)e Ft(or)i Fl(C-x)e(C-u)630 1997 y Ft(Undo)k(the)h(last)g
+(editing)g(command.)50 b(Y)-8 b(ou)34 b(can)f(undo)g(all)h(the)f(w)m(a)
+m(y)i(bac)m(k)f(to)g(an)g(empt)m(y)630 2106 y(line.)150
+2262 y(\(Dep)s(ending)g(on)g(y)m(our)g(con\014guration,)h(the)1726
+2259 y Fk(h)p 1750 2205 V 1750 2262 a Fj(Bac)n(kspace)p
+1750 2277 V 2063 2259 a Fk(i)2127 2262 y Ft(k)m(ey)g(b)s(e)e(set)h(to)h
+(delete)g(the)f(c)m(haracter)i(to)f(the)150 2371 y(left)f(of)f(the)g
+(cursor)f(and)h(the)1192 2368 y Fk(h)p 1216 2315 146
+4 v 1216 2371 a Fj(DEL)p 1216 2386 V 1358 2368 a Fk(i)1421
+2371 y Ft(k)m(ey)g(set)h(to)g(delete)g(the)f(c)m(haracter)i(underneath)
+c(the)i(cursor,)h(lik)m(e)150 2481 y Fl(C-d)p Ft(,)c(rather)g(than)g
+(the)h(c)m(haracter)h(to)f(the)f(left)h(of)g(the)f(cursor.\))150
+2698 y Fh(1.2.2)63 b(Readline)40 b(Mo)m(v)m(emen)m(t)h(Commands)275
+2940 y Ft(The)25 b(ab)s(o)m(v)m(e)i(table)g(describ)s(es)f(the)g(most)h
+(basic)f(k)m(eystrok)m(es)i(that)f(y)m(ou)f(need)g(in)g(order)f(to)i
+(do)f(editing)150 3050 y(of)g(the)f(input)g(line.)39
+b(F)-8 b(or)27 b(y)m(our)e(con)m(v)m(enience,)k(man)m(y)c(other)h
+(commands)f(ha)m(v)m(e)i(b)s(een)e(added)g(in)g(addition)150
+3160 y(to)33 b Fl(C-b)p Ft(,)e Fl(C-f)p Ft(,)h Fl(C-d)p
+Ft(,)g(and)1043 3157 y Fk(h)p 1067 3104 V 1067 3160 a
+Fj(DEL)p 1067 3175 V 1209 3157 a Fk(i)1239 3160 y Ft(.)45
+b(Here)33 b(are)f(some)g(commands)g(for)g(mo)m(ving)h(more)f(rapidly)f
+(ab)s(out)h(the)150 3269 y(line.)150 3424 y Fl(C-a)336
+b Ft(Mo)m(v)m(e)32 b(to)g(the)e(start)h(of)g(the)f(line.)150
+3579 y Fl(C-e)336 b Ft(Mo)m(v)m(e)32 b(to)g(the)e(end)g(of)g(the)h
+(line.)150 3735 y Fl(M-f)336 b Ft(Mo)m(v)m(e)32 b(forw)m(ard)e(a)h(w)m
+(ord,)f(where)g(a)h(w)m(ord)f(is)g(comp)s(osed)g(of)h(letters)h(and)d
+(digits.)150 3890 y Fl(M-b)336 b Ft(Mo)m(v)m(e)32 b(bac)m(kw)m(ard)f(a)
+g(w)m(ord.)150 4045 y Fl(C-l)336 b Ft(Clear)31 b(the)f(screen,)h
+(reprin)m(ting)f(the)h(curren)m(t)f(line)h(at)g(the)f(top.)275
+4200 y(Notice)c(ho)m(w)f Fl(C-f)e Ft(mo)m(v)m(es)j(forw)m(ard)e(a)h(c)m
+(haracter,)j(while)d Fl(M-f)e Ft(mo)m(v)m(es)j(forw)m(ard)e(a)h(w)m
+(ord.)39 b(It)24 b(is)h(a)g(lo)s(ose)150 4310 y(con)m(v)m(en)m(tion)32
+b(that)f(con)m(trol)g(k)m(eystrok)m(es)h(op)s(erate)e(on)g(c)m
+(haracters)h(while)f(meta)h(k)m(eystrok)m(es)h(op)s(erate)e(on)150
+4419 y(w)m(ords.)150 4637 y Fh(1.2.3)63 b(Readline)40
+b(Killing)i(Commands)275 4879 y Fi(Killing)j Ft(text)39
+b(means)e(to)h(delete)g(the)g(text)g(from)f(the)g(line,)j(but)d(to)h
+(sa)m(v)m(e)h(it)e(a)m(w)m(a)m(y)j(for)d(later)h(use,)150
+4988 y(usually)c(b)m(y)g Fi(y)m(anking)42 b Ft(\(re-inserting\))35
+b(it)g(bac)m(k)g(in)m(to)g(the)f(line.)52 b(\(`Cut')35
+b(and)e(`paste')i(are)g(more)f(recen)m(t)150 5098 y(jargon)d(for)f
+(`kill')h(and)f(`y)m(ank'.\))275 5230 y(If)f(the)i(description)f(for)g
+(a)h(command)f(sa)m(ys)g(that)h(it)g(`kills')g(text,)h(then)e(y)m(ou)g
+(can)h(b)s(e)e(sure)h(that)h(y)m(ou)150 5340 y(can)g(get)g(the)g(text)g
+(bac)m(k)g(in)f(a)h(di\013eren)m(t)g(\(or)g(the)f(same\))h(place)h
+(later.)p eop end
+%%Page: 3 7
+TeXDict begin 3 6 bop 150 -116 a Ft(Chapter)30 b(1:)41
+b(Command)29 b(Line)i(Editing)2153 b(3)275 299 y(When)23
+b(y)m(ou)g(use)g(a)h(kill)g(command,)g(the)g(text)g(is)f(sa)m(v)m(ed)i
+(in)e(a)g Fi(kill-ring)p Ft(.)39 b(An)m(y)24 b(n)m(um)m(b)s(er)e(of)h
+(consecutiv)m(e)150 408 y(kills)31 b(sa)m(v)m(e)i(all)f(of)f(the)g
+(killed)h(text)g(together,)g(so)g(that)f(when)f(y)m(ou)h(y)m(ank)h(it)f
+(bac)m(k,)h(y)m(ou)g(get)g(it)f(all.)43 b(The)150 518
+y(kill)33 b(ring)f(is)g(not)h(line)g(sp)s(eci\014c;)g(the)g(text)g
+(that)g(y)m(ou)g(killed)f(on)h(a)f(previously)g(t)m(yp)s(ed)h(line)f
+(is)h(a)m(v)-5 b(ailable)150 628 y(to)31 b(b)s(e)f(y)m(ank)m(ed)h(bac)m
+(k)g(later,)h(when)d(y)m(ou)i(are)g(t)m(yping)f(another)h(line.)275
+760 y(Here)f(is)h(the)f(list)h(of)g(commands)f(for)g(killing)h(text.)
+150 916 y Fl(C-k)336 b Ft(Kill)31 b(the)f(text)i(from)e(the)g(curren)m
+(t)g(cursor)g(p)s(osition)h(to)g(the)f(end)g(of)g(the)h(line.)150
+1072 y Fl(M-d)336 b Ft(Kill)27 b(from)f(the)g(cursor)g(to)h(the)f(end)g
+(of)h(the)f(curren)m(t)g(w)m(ord,)h(or,)h(if)e(b)s(et)m(w)m(een)h(w)m
+(ords,)g(to)g(the)630 1182 y(end)j(of)g(the)h(next)f(w)m(ord.)41
+b(W)-8 b(ord)30 b(b)s(oundaries)f(are)i(the)g(same)f(as)h(those)g(used)
+f(b)m(y)g Fl(M-f)p Ft(.)150 1337 y Fl(M-)246 1334 y Fk(h)p
+270 1281 146 4 v 270 1337 a Fj(DEL)p 270 1353 V 411 1334
+a Fk(i)630 1337 y Ft(Kill)h(from)f(the)h(cursor)f(the)g(start)h(of)g
+(the)g(curren)m(t)f(w)m(ord,)h(or,)f(if)h(b)s(et)m(w)m(een)g(w)m(ords,)
+f(to)i(the)630 1447 y(start)39 b(of)f(the)h(previous)f(w)m(ord.)64
+b(W)-8 b(ord)39 b(b)s(oundaries)e(are)i(the)f(same)h(as)g(those)f(used)
+g(b)m(y)630 1557 y Fl(M-b)p Ft(.)150 1712 y Fl(C-w)336
+b Ft(Kill)32 b(from)e(the)i(cursor)e(to)i(the)g(previous)e(whitespace.)
+44 b(This)31 b(is)g(di\013eren)m(t)h(than)f Fl(M-)3555
+1709 y Fk(h)p 3578 1656 V 3578 1712 a Fj(DEL)p 3578 1728
+V 3720 1709 a Fk(i)630 1822 y Ft(b)s(ecause)f(the)h(w)m(ord)f(b)s
+(oundaries)f(di\013er.)275 1978 y(Here)42 b(is)f(ho)m(w)h(to)g
+Fi(y)m(ank)47 b Ft(the)42 b(text)g(bac)m(k)h(in)m(to)f(the)g(line.)74
+b(Y)-8 b(anking)43 b(means)e(to)h(cop)m(y)h(the)e(most-)150
+2087 y(recen)m(tly-killed)33 b(text)e(from)f(the)g(kill)i(bu\013er.)150
+2243 y Fl(C-y)336 b Ft(Y)-8 b(ank)31 b(the)f(most)h(recen)m(tly)h
+(killed)f(text)g(bac)m(k)g(in)m(to)h(the)e(bu\013er)g(at)h(the)f
+(cursor.)150 2399 y Fl(M-y)336 b Ft(Rotate)36 b(the)f(kill-ring,)i(and)
+d(y)m(ank)h(the)f(new)g(top.)54 b(Y)-8 b(ou)35 b(can)g(only)f(do)h
+(this)f(if)h(the)g(prior)630 2509 y(command)30 b(is)h
+Fl(C-y)e Ft(or)h Fl(M-y)p Ft(.)150 2727 y Fh(1.2.4)63
+b(Readline)40 b(Argumen)m(ts)275 2970 y Ft(Y)-8 b(ou)29
+b(can)h(pass)f(n)m(umeric)g(argumen)m(ts)g(to)h(Readline)g(commands.)40
+b(Sometimes)30 b(the)f(argumen)m(t)h(acts)150 3079 y(as)40
+b(a)h(rep)s(eat)f(coun)m(t,)j(other)e(times)f(it)h(is)f(the)g
+Fn(sign)47 b Ft(of)41 b(the)f(argumen)m(t)g(that)h(is)f(signi\014can)m
+(t.)71 b(If)40 b(y)m(ou)150 3189 y(pass)33 b(a)h(negativ)m(e)i(argumen)
+m(t)e(to)g(a)g(command)f(whic)m(h)g(normally)h(acts)g(in)f(a)h(forw)m
+(ard)f(direction,)i(that)150 3298 y(command)g(will)h(act)g(in)f(a)h
+(bac)m(kw)m(ard)f(direction.)57 b(F)-8 b(or)36 b(example,)h(to)f(kill)g
+(text)g(bac)m(k)g(to)g(the)g(start)g(of)150 3408 y(the)31
+b(line,)g(y)m(ou)f(migh)m(t)h(t)m(yp)s(e)g(`)p Fs(M--)f(C-k)p
+Ft('.)275 3541 y(The)d(general)i(w)m(a)m(y)h(to)e(pass)g(n)m(umeric)g
+(argumen)m(ts)h(to)g(a)f(command)g(is)g(to)h(t)m(yp)s(e)f(meta)i
+(digits)e(b)s(efore)150 3650 y(the)j(command.)42 b(If)30
+b(the)h(\014rst)f(`digit')i(t)m(yp)s(ed)f(is)g(a)g(min)m(us)f(sign)h
+(\(`)p Fs(-)p Ft('\),)h(then)f(the)g(sign)f(of)h(the)g(argumen)m(t)150
+3760 y(will)39 b(b)s(e)e(negativ)m(e.)66 b(Once)38 b(y)m(ou)h(ha)m(v)m
+(e)g(t)m(yp)s(ed)f(one)h(meta)g(digit)g(to)f(get)i(the)e(argumen)m(t)h
+(started,)i(y)m(ou)150 3869 y(can)29 b(t)m(yp)s(e)g(the)g(remainder)f
+(of)h(the)g(digits,)h(and)f(then)f(the)h(command.)40
+b(F)-8 b(or)30 b(example,)g(to)f(giv)m(e)i(the)e Fl(C-d)150
+3979 y Ft(command)37 b(an)g(argumen)m(t)h(of)g(10,)i(y)m(ou)e(could)f
+(t)m(yp)s(e)h(`)p Fs(M-1)29 b(0)h(C-d)p Ft(',)39 b(whic)m(h)e(will)h
+(delete)h(the)e(next)h(ten)150 4089 y(c)m(haracters)32
+b(on)e(the)h(input)e(line.)150 4307 y Fh(1.2.5)63 b(Searc)m(hing)40
+b(for)i(Commands)g(in)f(the)g(History)275 4550 y Ft(Readline)32
+b(pro)m(vides)h(commands)f(for)g(searc)m(hing)h(through)e(the)i
+(command)f(history)g(for)g(lines)g(con-)150 4659 y(taining)f(a)g(sp)s
+(eci\014ed)f(string.)40 b(There)30 b(are)h(t)m(w)m(o)h(searc)m(h)f(mo)s
+(des:)40 b Fi(incremen)m(tal)35 b Ft(and)30 b Fi(non-incremen)m(tal)p
+Ft(.)275 4792 y(Incremen)m(tal)c(searc)m(hes)h(b)s(egin)e(b)s(efore)g
+(the)h(user)f(has)h(\014nished)e(t)m(yping)i(the)g(searc)m(h)g(string.)
+39 b(As)26 b(eac)m(h)150 4902 y(c)m(haracter)37 b(of)e(the)h(searc)m(h)
+g(string)f(is)h(t)m(yp)s(ed,)g(Readline)g(displa)m(ys)g(the)f(next)h
+(en)m(try)g(from)e(the)i(history)150 5011 y(matc)m(hing)25
+b(the)f(string)g(t)m(yp)s(ed)g(so)g(far.)39 b(An)23 b(incremen)m(tal)j
+(searc)m(h)e(requires)g(only)g(as)g(man)m(y)g(c)m(haracters)i(as)150
+5121 y(needed)i(to)i(\014nd)d(the)i(desired)f(history)h(en)m(try)-8
+b(.)41 b(T)-8 b(o)29 b(searc)m(h)h(bac)m(kw)m(ard)f(in)f(the)h(history)
+g(for)f(a)i(particular)150 5230 y(string,)g(t)m(yp)s(e)f
+Fl(C-r)p Ft(.)40 b(T)m(yping)29 b Fl(C-s)g Ft(searc)m(hes)h(forw)m(ard)
+f(through)g(the)g(history)-8 b(.)41 b(The)29 b(c)m(haracters)i(presen)m
+(t)150 5340 y(in)38 b(the)g(v)-5 b(alue)38 b(of)g(the)g
+Fs(isearch-terminators)33 b Ft(v)-5 b(ariable)39 b(are)f(used)f(to)i
+(terminate)g(an)f(incremen)m(tal)p eop end
+%%Page: 4 8
+TeXDict begin 4 7 bop 150 -116 a Ft(4)2645 b(GNU)31 b(Readline)g
+(Library)150 299 y(searc)m(h.)63 b(If)38 b(that)g(v)-5
+b(ariable)38 b(has)g(not)g(b)s(een)f(assigned)h(a)g(v)-5
+b(alue,)40 b(the)2578 296 y Fk(h)p 2602 243 139 4 v 2602
+299 a Fj(ESC)p 2602 314 V 2736 296 a Fk(i)2804 299 y
+Ft(and)d Fl(C-J)f Ft(c)m(haracters)k(will)150 408 y(terminate)j(an)g
+(incremen)m(tal)g(searc)m(h.)78 b Fl(C-g)41 b Ft(will)i(ab)s(ort)f(an)g
+(incremen)m(tal)i(searc)m(h)f(and)f(restore)h(the)150
+518 y(original)30 b(line.)41 b(When)28 b(the)h(searc)m(h)h(is)f
+(terminated,)h(the)f(history)g(en)m(try)g(con)m(taining)h(the)f(searc)m
+(h)h(string)150 628 y(b)s(ecomes)h(the)f(curren)m(t)g(line.)275
+771 y(T)-8 b(o)31 b(\014nd)e(other)j(matc)m(hing)g(en)m(tries)g(in)e
+(the)h(history)g(list,)h(t)m(yp)s(e)g Fl(C-r)e Ft(or)h
+Fl(C-s)f Ft(as)h(appropriate.)43 b(This)150 880 y(will)26
+b(searc)m(h)h(bac)m(kw)m(ard)g(or)f(forw)m(ard)g(in)f(the)i(history)f
+(for)g(the)g(next)g(en)m(try)h(matc)m(hing)g(the)f(searc)m(h)h(string)
+150 990 y(t)m(yp)s(ed)37 b(so)h(far.)63 b(An)m(y)38 b(other)f(k)m(ey)i
+(sequence)f(b)s(ound)e(to)i(a)g(Readline)h(command)e(will)h(terminate)h
+(the)150 1100 y(searc)m(h)22 b(and)e(execute)j(that)e(command.)38
+b(F)-8 b(or)22 b(instance,)h(a)2127 1097 y Fk(h)p 2151
+1044 151 4 v 2151 1100 a Fj(RET)p 2151 1115 V 2298 1097
+a Fk(i)2349 1100 y Ft(will)e(terminate)h(the)f(searc)m(h)h(and)e
+(accept)150 1209 y(the)30 b(line,)g(thereb)m(y)f(executing)i(the)e
+(command)g(from)g(the)h(history)f(list.)41 b(A)29 b(mo)m(v)m(emen)m(t)j
+(command)d(will)150 1319 y(terminate)i(the)g(searc)m(h,)g(mak)m(e)h
+(the)e(last)h(line)g(found)e(the)i(curren)m(t)f(line,)h(and)f(b)s(egin)
+g(editing.)275 1462 y(Readline)35 b(remem)m(b)s(ers)f(the)h(last)h
+(incremen)m(tal)g(searc)m(h)f(string.)54 b(If)34 b(t)m(w)m(o)j
+Fl(C-r)p Ft(s)c(are)i(t)m(yp)s(ed)g(without)150 1571
+y(an)m(y)i(in)m(terv)m(ening)g(c)m(haracters)h(de\014ning)e(a)h(new)f
+(searc)m(h)h(string,)h(an)m(y)f(remem)m(b)s(ered)e(searc)m(h)i(string)g
+(is)150 1681 y(used.)275 1824 y(Non-incremen)m(tal)48
+b(searc)m(hes)g(read)e(the)h(en)m(tire)h(searc)m(h)f(string)g(b)s
+(efore)f(starting)h(to)h(searc)m(h)f(for)150 1934 y(matc)m(hing)d
+(history)e(lines.)78 b(The)42 b(searc)m(h)h(string)g(ma)m(y)g(b)s(e)f
+(t)m(yp)s(ed)g(b)m(y)g(the)h(user)f(or)h(b)s(e)f(part)g(of)h(the)150
+2043 y(con)m(ten)m(ts)32 b(of)f(the)f(curren)m(t)g(line.)150
+2322 y Fr(1.3)68 b(Readline)47 b(Init)e(File)275 2575
+y Ft(Although)g(the)g(Readline)h(library)e(comes)i(with)f(a)h(set)f(of)
+g(Emacs-lik)m(e)i(k)m(eybindings)e(installed)150 2685
+y(b)m(y)d(default,)i(it)f(is)e(p)s(ossible)g(to)i(use)e(a)h(di\013eren)
+m(t)g(set)g(of)g(k)m(eybindings.)74 b(An)m(y)42 b(user)f(can)h
+(customize)150 2794 y(programs)32 b(that)h(use)f(Readline)h(b)m(y)g
+(putting)f(commands)g(in)g(an)g Fi(inputrc)37 b Ft(\014le,)d(con)m(v)m
+(en)m(tionally)h(in)d(his)150 2904 y(home)h(directory)-8
+b(.)50 b(The)33 b(name)g(of)g(this)g(\014le)h(is)f(tak)m(en)h(from)f
+(the)g(v)-5 b(alue)34 b(of)f(the)g(en)m(vironmen)m(t)h(v)-5
+b(ariable)150 3014 y Fs(INPUTRC)p Ft(.)38 b(If)28 b(that)g(v)-5
+b(ariable)29 b(is)f(unset,)h(the)f(default)g(is)h(`)p
+Fs(~/.inputrc)p Ft('.)37 b(If)28 b(that)h(\014le)f(do)s(es)g(not)g
+(exist)h(or)150 3123 y(cannot)i(b)s(e)f(read,)g(the)h(ultimate)g
+(default)g(is)f(`)p Fs(/etc/inputrc)p Ft('.)275 3266
+y(When)f(a)h(program)f(whic)m(h)h(uses)f(the)h(Readline)g(library)f
+(starts)h(up,)f(the)h(init)g(\014le)f(is)h(read,)g(and)f(the)150
+3376 y(k)m(ey)i(bindings)e(are)i(set.)275 3519 y(In)26
+b(addition,)i(the)f Fs(C-x)i(C-r)d Ft(command)h(re-reads)g(this)f(init)
+h(\014le,)h(th)m(us)f(incorp)s(orating)g(an)m(y)g(c)m(hanges)150
+3629 y(that)k(y)m(ou)g(migh)m(t)g(ha)m(v)m(e)g(made)g(to)g(it.)150
+3870 y Fh(1.3.1)63 b(Readline)40 b(Init)h(File)g(Syn)m(tax)275
+4123 y Ft(There)33 b(are)h(only)g(a)g(few)f(basic)h(constructs)g(allo)m
+(w)m(ed)h(in)f(the)g(Readline)g(init)g(\014le.)51 b(Blank)34
+b(lines)g(are)150 4232 y(ignored.)72 b(Lines)41 b(b)s(eginning)f(with)h
+(a)g(`)p Fs(#)p Ft(')g(are)h(commen)m(ts.)73 b(Lines)41
+b(b)s(eginning)f(with)g(a)i(`)p Fs($)p Ft(')f(indicate)150
+4342 y(conditional)29 b(constructs)f(\(see)g(Section)h(1.3.2)g
+([Conditional)g(Init)e(Constructs],)i(page)f(9\).)41
+b(Other)27 b(lines)150 4452 y(denote)k(v)-5 b(ariable)31
+b(settings)g(and)f(k)m(ey)h(bindings.)150 4624 y(V)-8
+b(ariable)32 b(Settings)630 4734 y(Y)-8 b(ou)41 b(can)g(mo)s(dify)e
+(the)i(run-time)f(b)s(eha)m(vior)g(of)h(Readline)g(b)m(y)f(altering)h
+(the)g(v)-5 b(alues)41 b(of)630 4843 y(v)-5 b(ariables)34
+b(in)f(Readline)i(using)e(the)g Fs(set)g Ft(command)g(within)g(the)h
+(init)g(\014le.)50 b(The)33 b(syn)m(tax)630 4953 y(is)d(simple:)870
+5092 y Fs(set)47 b Fl(variable)56 b(value)630 5230 y
+Ft(Here,)29 b(for)e(example,)h(is)g(ho)m(w)f(to)h(c)m(hange)g(from)f
+(the)g(default)h(Emacs-lik)m(e)h(k)m(ey)f(binding)e(to)630
+5340 y(use)k Fs(vi)g Ft(line)h(editing)g(commands:)p
+eop end
+%%Page: 5 9
+TeXDict begin 5 8 bop 150 -116 a Ft(Chapter)30 b(1:)41
+b(Command)29 b(Line)i(Editing)2153 b(5)870 299 y Fs(set)47
+b(editing-mode)d(vi)630 432 y Ft(V)-8 b(ariable)36 b(names)f(and)g(v)-5
+b(alues,)36 b(where)f(appropriate,)h(are)g(recognized)g(without)f
+(regard)630 541 y(to)c(case.)42 b(Unrecognized)31 b(v)-5
+b(ariable)31 b(names)g(are)f(ignored.)630 674 y(Bo)s(olean)c(v)-5
+b(ariables)26 b(\(those)g(that)g(can)f(b)s(e)f(set)i(to)g(on)f(or)g
+(o\013)7 b(\))25 b(are)h(set)f(to)h(on)f(if)g(the)g(v)-5
+b(alue)26 b(is)630 783 y(n)m(ull)e(or)g(empt)m(y)-8 b(,)27
+b Fi(on)d Ft(\(case-insensitiv)m(e\),)29 b(or)24 b(1.)39
+b(An)m(y)25 b(other)f(v)-5 b(alue)25 b(results)f(in)g(the)g(v)-5
+b(ariable)630 893 y(b)s(eing)30 b(set)h(to)g(o\013.)630
+1026 y(A)f(great)i(deal)f(of)g(run-time)f(b)s(eha)m(vior)g(is)g(c)m
+(hangeable)j(with)d(the)g(follo)m(wing)i(v)-5 b(ariables.)630
+1181 y Fs(bell-style)1110 1291 y Ft(Con)m(trols)44 b(what)g(happ)s(ens)
+e(when)h(Readline)i(w)m(an)m(ts)f(to)h(ring)e(the)h(termi-)1110
+1401 y(nal)37 b(b)s(ell.)61 b(If)37 b(set)h(to)g(`)p
+Fs(none)p Ft(',)g(Readline)g(nev)m(er)g(rings)e(the)i(b)s(ell.)61
+b(If)36 b(set)i(to)1110 1510 y(`)p Fs(visible)p Ft(',)32
+b(Readline)i(uses)f(a)g(visible)g(b)s(ell)g(if)g(one)g(is)g(a)m(v)-5
+b(ailable.)51 b(If)33 b(set)g(to)1110 1620 y(`)p Fs(audible)p
+Ft(')j(\(the)i(default\),)i(Readline)e(attempts)g(to)h(ring)e(the)g
+(terminal's)1110 1729 y(b)s(ell.)630 1885 y Fs(bind-tty-special-chars)
+1110 1995 y Ft(If)45 b(set)h(to)f(`)p Fs(on)p Ft(',)50
+b(Readline)45 b(attempts)i(to)f(bind)d(the)j(con)m(trol)g(c)m
+(haracters)1110 2104 y(treated)36 b(sp)s(ecially)h(b)m(y)e(the)h(k)m
+(ernel's)g(terminal)g(driv)m(er)f(to)h(their)f(Readline)1110
+2214 y(equiv)-5 b(alen)m(ts.)630 2370 y Fs(comment-begin)1110
+2479 y Ft(The)29 b(string)g(to)h(insert)f(at)h(the)f(b)s(eginning)g(of)
+g(the)h(line)f(when)f(the)i Fs(insert-)1110 2589 y(comment)e
+Ft(command)j(is)f(executed.)42 b(The)29 b(default)i(v)-5
+b(alue)31 b(is)f Fs("#")p Ft(.)630 2744 y Fs(completion-ignore-case)
+1110 2854 y Ft(If)d(set)h(to)g(`)p Fs(on)p Ft(',)g(Readline)g(p)s
+(erforms)e(\014lename)h(matc)m(hing)i(and)e(completion)1110
+2964 y(in)j(a)h(case-insensitiv)m(e)i(fashion.)40 b(The)30
+b(default)h(v)-5 b(alue)30 b(is)h(`)p Fs(off)p Ft('.)630
+3119 y Fs(completion-query-items)1110 3229 y Ft(The)26
+b(n)m(um)m(b)s(er)f(of)h(p)s(ossible)g(completions)h(that)g(determines)
+f(when)f(the)i(user)1110 3339 y(is)i(ask)m(ed)h(whether)f(the)h(list)g
+(of)f(p)s(ossibilities)h(should)e(b)s(e)h(displa)m(y)m(ed.)41
+b(If)29 b(the)1110 3448 y(n)m(um)m(b)s(er)d(of)h(p)s(ossible)f
+(completions)i(is)f(greater)h(than)e(this)h(v)-5 b(alue,)28
+b(Readline)1110 3558 y(will)f(ask)g(the)f(user)g(whether)g(or)g(not)h
+(he)f(wishes)g(to)i(view)e(them;)i(otherwise,)1110 3667
+y(they)d(are)f(simply)g(listed.)40 b(This)23 b(v)-5 b(ariable)25
+b(m)m(ust)g(b)s(e)e(set)i(to)g(an)g(in)m(teger)g(v)-5
+b(alue)1110 3777 y(greater)26 b(than)f(or)f(equal)i(to)f(0.)40
+b(A)24 b(negativ)m(e)j(v)-5 b(alue)26 b(means)e(Readline)i(should)1110
+3886 y(nev)m(er)31 b(ask.)41 b(The)29 b(default)i(limit)g(is)g
+Fs(100)p Ft(.)630 4042 y Fs(convert-meta)1110 4152 y
+Ft(If)22 b(set)g(to)h(`)p Fs(on)p Ft(',)h(Readline)f(will)f(con)m(v)m
+(ert)i(c)m(haracters)f(with)f(the)g(eigh)m(th)h(bit)f(set)1110
+4261 y(to)g(an)f Fm(asci)r(i)g Ft(k)m(ey)h(sequence)g(b)m(y)f
+(stripping)f(the)i(eigh)m(th)g(bit)f(and)g(pre\014xing)f(an)1110
+4368 y Fk(h)p 1134 4315 139 4 v 1134 4371 a Fj(ESC)p
+1134 4386 V 1268 4368 a Fk(i)1332 4371 y Ft(c)m(haracter,)36
+b(con)m(v)m(erting)g(them)e(to)g(a)h(meta-pre\014xed)f(k)m(ey)g
+(sequence.)1110 4481 y(The)c(default)g(v)-5 b(alue)31
+b(is)g(`)p Fs(on)p Ft('.)630 4636 y Fs(disable-completion)1110
+4746 y Ft(If)36 b(set)h(to)h(`)p Fs(On)p Ft(',)g(Readline)f(will)g
+(inhibit)f(w)m(ord)h(completion.)60 b(Completion)1110
+4855 y(c)m(haracters)28 b(will)e(b)s(e)f(inserted)h(in)m(to)h(the)g
+(line)f(as)g(if)g(they)h(had)e(b)s(een)g(mapp)s(ed)1110
+4965 y(to)31 b Fs(self-insert)p Ft(.)38 b(The)30 b(default)g(is)h(`)p
+Fs(off)p Ft('.)630 5121 y Fs(editing-mode)1110 5230 y
+Ft(The)d Fs(editing-mode)e Ft(v)-5 b(ariable)29 b(con)m(trols)h(whic)m
+(h)e(default)h(set)h(of)e(k)m(ey)i(bind-)1110 5340 y(ings)25
+b(is)g(used.)38 b(By)26 b(default,)g(Readline)g(starts)f(up)f(in)h
+(Emacs)g(editing)h(mo)s(de,)p eop end
+%%Page: 6 10
+TeXDict begin 6 9 bop 150 -116 a Ft(6)2645 b(GNU)31 b(Readline)g
+(Library)1110 299 y(where)e(the)g(k)m(eystrok)m(es)i(are)e(most)h
+(similar)f(to)h(Emacs.)40 b(This)29 b(v)-5 b(ariable)30
+b(can)1110 408 y(b)s(e)g(set)h(to)g(either)g(`)p Fs(emacs)p
+Ft(')e(or)h(`)p Fs(vi)p Ft('.)630 567 y Fs(enable-keypad)1110
+676 y Ft(When)23 b(set)h(to)g(`)p Fs(on)p Ft(',)h(Readline)f(will)g
+(try)f(to)h(enable)g(the)f(application)i(k)m(eypad)1110
+786 y(when)h(it)h(is)f(called.)41 b(Some)27 b(systems)f(need)h(this)f
+(to)h(enable)g(the)g(arro)m(w)g(k)m(eys.)1110 896 y(The)j(default)g(is)
+h(`)p Fs(off)p Ft('.)630 1054 y Fs(expand-tilde)1110
+1163 y Ft(If)c(set)h(to)h(`)p Fs(on)p Ft(',)f(tilde)g(expansion)g(is)f
+(p)s(erformed)f(when)h(Readline)h(attempts)1110 1273
+y(w)m(ord)i(completion.)42 b(The)30 b(default)g(is)h(`)p
+Fs(off)p Ft('.)630 1431 y Fs(history-preserve-point)1110
+1541 y Ft(If)e(set)i(to)f(`)p Fs(on)p Ft(',)g(the)g(history)g(co)s(de)g
+(attempts)g(to)h(place)f(p)s(oin)m(t)g(at)h(the)f(same)1110
+1650 y(lo)s(cation)35 b(on)e(eac)m(h)i(history)e(line)h(retriev)m(ed)g
+(with)f Fs(previous-history)c Ft(or)1110 1760 y Fs(next-history)p
+Ft(.)37 b(The)30 b(default)h(is)f(`)p Fs(off)p Ft('.)630
+1918 y Fs(horizontal-scroll-mode)1110 2028 y Ft(This)35
+b(v)-5 b(ariable)37 b(can)f(b)s(e)f(set)h(to)h(either)f(`)p
+Fs(on)p Ft(')g(or)g(`)p Fs(off)p Ft('.)57 b(Setting)36
+b(it)g(to)h(`)p Fs(on)p Ft(')1110 2138 y(means)26 b(that)h(the)f(text)h
+(of)g(the)f(lines)g(b)s(eing)g(edited)h(will)f(scroll)h(horizon)m
+(tally)1110 2247 y(on)32 b(a)g(single)g(screen)g(line)g(when)e(they)i
+(are)g(longer)h(than)e(the)h(width)f(of)h(the)1110 2357
+y(screen,)27 b(instead)g(of)f(wrapping)f(on)m(to)i(a)f(new)g(screen)g
+(line.)39 b(By)27 b(default,)g(this)1110 2466 y(v)-5
+b(ariable)31 b(is)g(set)f(to)i(`)p Fs(off)p Ft('.)630
+2625 y Fs(input-meta)1110 2734 y Ft(If)f(set)g(to)h(`)p
+Fs(on)p Ft(',)g(Readline)g(will)f(enable)h(eigh)m(t-bit)h(input)d(\(it)
+i(will)f(not)h(clear)1110 2844 y(the)40 b(eigh)m(th)g(bit)g(in)f(the)h
+(c)m(haracters)h(it)f(reads\),)j(regardless)c(of)h(what)g(the)1110
+2953 y(terminal)g(claims)h(it)g(can)f(supp)s(ort.)68
+b(The)39 b(default)h(v)-5 b(alue)40 b(is)g(`)p Fs(off)p
+Ft('.)69 b(The)1110 3063 y(name)30 b Fs(meta-flag)e Ft(is)j(a)f(synon)m
+(ym)g(for)g(this)h(v)-5 b(ariable.)630 3221 y Fs(isearch-terminators)
+1110 3331 y Ft(The)51 b(string)h(of)g(c)m(haracters)h(that)f(should)e
+(terminate)j(an)f(incremen)m(tal)1110 3440 y(searc)m(h)25
+b(without)g(subsequen)m(tly)g(executing)h(the)f(c)m(haracter)h(as)f(a)g
+(command)1110 3550 y(\(see)45 b(Section)h(1.2.5)g([Searc)m(hing],)j
+(page)d(3\).)84 b(If)44 b(this)g(v)-5 b(ariable)45 b(has)g(not)1110
+3660 y(b)s(een)31 b(giv)m(en)h(a)g(v)-5 b(alue,)32 b(the)g(c)m
+(haracters)2494 3657 y Fk(h)p 2518 3604 139 4 v 2518
+3660 a Fj(ESC)p 2518 3675 V 2652 3657 a Fk(i)2713 3660
+y Ft(and)f Fl(C-J)g Ft(will)h(terminate)g(an)1110 3769
+y(incremen)m(tal)g(searc)m(h.)630 3927 y Fs(keymap)192
+b Ft(Sets)39 b(Readline's)g(idea)h(of)f(the)g(curren)m(t)f(k)m(eymap)h
+(for)g(k)m(ey)g(binding)f(com-)1110 4037 y(mands.)81
+b(Acceptable)47 b Fs(keymap)42 b Ft(names)i(are)h Fs(emacs)p
+Ft(,)i Fs(emacs-standard)p Ft(,)1110 4147 y Fs(emacs-meta)p
+Ft(,)99 b Fs(emacs-ctlx)p Ft(,)f Fs(vi)p Ft(,)j Fs(vi-move)p
+Ft(,)f Fs(vi-command)p Ft(,)f(and)1110 4256 y Fs(vi-insert)p
+Ft(.)64 b Fs(vi)38 b Ft(is)h(equiv)-5 b(alen)m(t)41 b(to)e
+Fs(vi-command)p Ft(;)i Fs(emacs)c Ft(is)i(equiv)-5 b(alen)m(t)1110
+4366 y(to)33 b Fs(emacs-standard)p Ft(.)41 b(The)31 b(default)h(v)-5
+b(alue)32 b(is)g Fs(emacs)p Ft(.)44 b(The)31 b(v)-5 b(alue)33
+b(of)f(the)1110 4475 y Fs(editing-mode)27 b Ft(v)-5 b(ariable)31
+b(also)h(a\013ects)f(the)g(default)f(k)m(eymap.)630 4634
+y Fs(mark-directories)1110 4743 y Ft(If)38 b(set)g(to)h(`)p
+Fs(on)p Ft(',)i(completed)e(directory)f(names)g(ha)m(v)m(e)i(a)e(slash)
+g(app)s(ended.)1110 4853 y(The)30 b(default)g(is)h(`)p
+Fs(on)p Ft('.)630 5011 y Fs(mark-modified-lines)1110
+5121 y Ft(This)k(v)-5 b(ariable,)38 b(when)d(set)h(to)h(`)p
+Fs(on)p Ft(',)g(causes)g(Readline)f(to)h(displa)m(y)f(an)f(as-)1110
+5230 y(terisk)f(\(`)p Fs(*)p Ft('\))h(at)f(the)g(start)g(of)g(history)g
+(lines)g(whic)m(h)f(ha)m(v)m(e)i(b)s(een)e(mo)s(di\014ed.)1110
+5340 y(This)d(v)-5 b(ariable)31 b(is)f(`)p Fs(off)p Ft(')g(b)m(y)g
+(default.)p eop end
+%%Page: 7 11
+TeXDict begin 7 10 bop 150 -116 a Ft(Chapter)30 b(1:)41
+b(Command)29 b(Line)i(Editing)2153 b(7)630 299 y Fs
+(mark-symlinked-directori)o(es)1110 408 y Ft(If)44 b(set)h(to)h(`)p
+Fs(on)p Ft(',)i(completed)e(names)f(whic)m(h)f(are)h(sym)m(b)s(olic)g
+(links)g(to)g(di-)1110 518 y(rectories)j(ha)m(v)m(e)f(a)g(slash)f(app)s
+(ended)e(\(sub)5 b(ject)47 b(to)g(the)f(v)-5 b(alue)47
+b(of)f Fs(mark-)1110 628 y(directories)p Ft(\).)38 b(The)30
+b(default)g(is)h(`)p Fs(off)p Ft('.)630 789 y Fs(match-hidden-files)
+1110 898 y Ft(This)21 b(v)-5 b(ariable,)25 b(when)d(set)g(to)h(`)p
+Fs(on)p Ft(',)h(causes)f(Readline)g(to)g(matc)m(h)g(\014les)f(whose)
+1110 1008 y(names)44 b(b)s(egin)g(with)g(a)g(`)p Fs(.)p
+Ft(')g(\(hidden)f(\014les\))i(when)e(p)s(erforming)g(\014lename)1110
+1118 y(completion,)j(unless)41 b(the)g(leading)h(`)p
+Fs(.)p Ft(')g(is)g(supplied)e(b)m(y)h(the)h(user)f(in)g(the)1110
+1227 y(\014lename)31 b(to)g(b)s(e)e(completed.)42 b(This)30
+b(v)-5 b(ariable)31 b(is)f(`)p Fs(on)p Ft(')h(b)m(y)f(default.)630
+1388 y Fs(output-meta)1110 1498 y Ft(If)35 b(set)h(to)g(`)p
+Fs(on)p Ft(',)h(Readline)f(will)g(displa)m(y)f(c)m(haracters)i(with)e
+(the)h(eigh)m(th)g(bit)1110 1608 y(set)h(directly)g(rather)f(than)g(as)
+h(a)g(meta-pre\014xed)f(escap)s(e)h(sequence.)59 b(The)1110
+1717 y(default)31 b(is)f(`)p Fs(off)p Ft('.)630 1878
+y Fs(page-completions)1110 1988 y Ft(If)j(set)i(to)f(`)p
+Fs(on)p Ft(',)h(Readline)g(uses)e(an)h(in)m(ternal)h
+Fs(more)p Ft(-lik)m(e)f(pager)g(to)h(displa)m(y)1110
+2097 y(a)e(screenful)f(of)g(p)s(ossible)g(completions)i(at)f(a)g(time.)
+47 b(This)31 b(v)-5 b(ariable)34 b(is)e(`)p Fs(on)p Ft(')1110
+2207 y(b)m(y)e(default.)630 2368 y Fs(print-completions-horizo)o(ntal)o
+(ly)1110 2478 y Ft(If)23 b(set)i(to)g(`)p Fs(on)p Ft(',)g(Readline)g
+(will)f(displa)m(y)g(completions)h(with)f(matc)m(hes)h(sorted)1110
+2587 y(horizon)m(tally)45 b(in)e(alphab)s(etical)i(order,)i(rather)c
+(than)g(do)m(wn)g(the)h(screen.)1110 2697 y(The)30 b(default)g(is)h(`)p
+Fs(off)p Ft('.)630 2858 y Fs(show-all-if-ambiguous)1110
+2968 y Ft(This)e(alters)i(the)f(default)g(b)s(eha)m(vior)g(of)g(the)h
+(completion)g(functions.)40 b(If)29 b(set)1110 3077 y(to)f(`)p
+Fs(on)p Ft(',)g(w)m(ords)f(whic)m(h)g(ha)m(v)m(e)i(more)f(than)f(one)h
+(p)s(ossible)f(completion)h(cause)1110 3187 y(the)39
+b(matc)m(hes)h(to)g(b)s(e)e(listed)h(immediately)i(instead)e(of)g
+(ringing)g(the)g(b)s(ell.)1110 3296 y(The)30 b(default)g(v)-5
+b(alue)31 b(is)g(`)p Fs(off)p Ft('.)630 3458 y Fs
+(show-all-if-unmodified)1110 3567 y Ft(This)38 b(alters)h(the)g
+(default)g(b)s(eha)m(vior)g(of)f(the)h(completion)h(functions)e(in)h(a)
+1110 3677 y(fashion)25 b(similar)h(to)g Fi(sho)m(w-all-if-am)m(biguous)
+p Ft(.)41 b(If)25 b(set)h(to)h(`)p Fs(on)p Ft(',)f(w)m(ords)f(whic)m(h)
+1110 3786 y(ha)m(v)m(e)32 b(more)f(than)f(one)i(p)s(ossible)e
+(completion)i(without)f(an)m(y)g(p)s(ossible)f(par-)1110
+3896 y(tial)43 b(completion)h(\(the)f(p)s(ossible)f(completions)h
+(don't)f(share)g(a)h(common)1110 4006 y(pre\014x\))30
+b(cause)g(the)h(matc)m(hes)g(to)g(b)s(e)f(listed)g(immediately)i
+(instead)e(of)h(ring-)1110 4115 y(ing)g(the)f(b)s(ell.)41
+b(The)30 b(default)g(v)-5 b(alue)31 b(is)f(`)p Fs(off)p
+Ft('.)630 4276 y Fs(visible-stats)1110 4386 y Ft(If)h(set)i(to)f(`)p
+Fs(on)p Ft(',)h(a)f(c)m(haracter)i(denoting)e(a)g(\014le's)g(t)m(yp)s
+(e)g(is)g(app)s(ended)e(to)j(the)1110 4495 y(\014lename)e(when)e
+(listing)i(p)s(ossible)f(completions.)42 b(The)30 b(default)g(is)h(`)p
+Fs(off)p Ft('.)150 4657 y(Key)f(Bindings)630 4766 y(The)41
+b(syn)m(tax)i(for)f(con)m(trolling)h(k)m(ey)g(bindings)e(in)h(the)g
+(init)g(\014le)g(is)g(simple.)75 b(First)43 b(y)m(ou)630
+4876 y(need)27 b(to)i(\014nd)d(the)i(name)f(of)h(the)g(command)f(that)i
+(y)m(ou)f(w)m(an)m(t)g(to)g(c)m(hange.)41 b(The)27 b(follo)m(wing)630
+4985 y(sections)37 b(con)m(tain)g(tables)g(of)f(the)g(command)f(name,)j
+(the)e(default)g(k)m(eybinding,)h(if)f(an)m(y)-8 b(,)630
+5095 y(and)30 b(a)h(short)f(description)g(of)h(what)f(the)g(command)h
+(do)s(es.)630 5230 y(Once)36 b(y)m(ou)g(kno)m(w)g(the)g(name)g(of)g
+(the)g(command,)h(simply)f(place)h(on)e(a)i(line)f(in)g(the)g(init)630
+5340 y(\014le)e(the)g(name)f(of)h(the)g(k)m(ey)g(y)m(ou)g(wish)f(to)h
+(bind)f(the)h(command)f(to,)i(a)f(colon,)i(and)d(then)p
+eop end
+%%Page: 8 12
+TeXDict begin 8 11 bop 150 -116 a Ft(8)2645 b(GNU)31
+b(Readline)g(Library)630 299 y(the)h(name)h(of)f(the)g(command.)46
+b(There)32 b(can)g(b)s(e)g(no)g(space)g(b)s(et)m(w)m(een)h(the)f(k)m
+(ey)h(name)g(and)630 408 y(the)41 b(colon)h({)f(that)g(will)g(b)s(e)g
+(in)m(terpreted)g(as)g(part)f(of)h(the)g(k)m(ey)h(name.)72
+b(The)40 b(name)h(of)630 518 y(the)35 b(k)m(ey)g(can)g(b)s(e)f
+(expressed)f(in)i(di\013eren)m(t)g(w)m(a)m(ys,)h(dep)s(ending)d(on)h
+(what)h(y)m(ou)g(\014nd)e(most)630 628 y(comfortable.)630
+763 y(In)i(addition)h(to)h(command)f(names,)i(readline)e(allo)m(ws)h(k)
+m(eys)g(to)g(b)s(e)e(b)s(ound)f(to)j(a)f(string)630 872
+y(that)31 b(is)f(inserted)h(when)e(the)i(k)m(ey)g(is)f(pressed)g(\(a)h
+Fi(macro)5 b Ft(\).)630 1032 y Fi(k)m(eyname)g Ft(:)42
+b Fi(function-name)35 b Ft(or)c Fi(macro)1110 1142 y(k)m(eyname)k
+Ft(is)29 b(the)f(name)h(of)g(a)g(k)m(ey)h(sp)s(elled)e(out)h(in)g
+(English.)39 b(F)-8 b(or)30 b(example:)1350 1277 y Fs(Control-u:)45
+b(universal-argument)1350 1386 y(Meta-Rubout:)f(backward-kill-word)1350
+1496 y(Control-o:)h(">)i(output")1110 1631 y Ft(In)38
+b(the)h(ab)s(o)m(v)m(e)h(example,)h Fl(C-u)d Ft(is)h(b)s(ound)d(to)k
+(the)e(function)h Fs(universal-)1110 1740 y(argument)p
+Ft(,)f Fl(M-DEL)e Ft(is)i(b)s(ound)e(to)i(the)g(function)g
+Fs(backward-kill-word)p Ft(,)1110 1850 y(and)g Fl(C-o)g
+Ft(is)h(b)s(ound)e(to)j(run)d(the)j(macro)f(expressed)g(on)f(the)i
+(righ)m(t)f(hand)1110 1960 y(side)30 b(\(that)i(is,)e(to)h(insert)g
+(the)f(text)i(`)p Fs(>)e(output)p Ft(')f(in)m(to)i(the)g(line\).)1110
+2094 y(A)37 b(n)m(um)m(b)s(er)f(of)h(sym)m(b)s(olic)g(c)m(haracter)i
+(names)e(are)g(recognized)h(while)f(pro-)1110 2204 y(cessing)24
+b(this)g(k)m(ey)g(binding)f(syn)m(tax:)37 b Fi(DEL)p
+Ft(,)24 b Fi(ESC)p Ft(,)f Fi(ESCAPE)p Ft(,)g Fi(LFD)p
+Ft(,)h Fi(NEW-)1110 2314 y(LINE)p Ft(,)30 b Fi(RET)p
+Ft(,)g Fi(RETURN)p Ft(,)h Fi(R)m(UBOUT)p Ft(,)g Fi(SP)-8
+b(A)m(CE)p Ft(,)30 b Fi(SPC)p Ft(,)g(and)f Fi(T)-8 b(AB)p
+Ft(.)630 2474 y Fs(")p Fi(k)m(eyseq)r Fs(")p Ft(:)41
+b Fi(function-name)36 b Ft(or)30 b Fi(macro)1110 2583
+y(k)m(eyseq)k Ft(di\013ers)d(from)f Fi(k)m(eyname)37
+b Ft(ab)s(o)m(v)m(e)32 b(in)f(that)h(strings)f(denoting)g(an)g(en-)1110
+2693 y(tire)j(k)m(ey)h(sequence)f(can)g(b)s(e)f(sp)s(eci\014ed,)h(b)m
+(y)f(placing)i(the)f(k)m(ey)g(sequence)g(in)1110 2803
+y(double)29 b(quotes.)41 b(Some)29 b Fm(gnu)h Ft(Emacs)f(st)m(yle)i(k)m
+(ey)f(escap)s(es)g(can)g(b)s(e)f(used,)g(as)1110 2912
+y(in)k(the)h(follo)m(wing)i(example,)f(but)e(the)h(sp)s(ecial)h(c)m
+(haracter)g(names)f(are)g(not)1110 3022 y(recognized.)1350
+3157 y Fs("\\C-u":)46 b(universal-argument)1350 3266
+y("\\C-x\\C-r":)f(re-read-init-file)1350 3376 y("\\e[11~":)g("Function)
+h(Key)g(1")1110 3511 y Ft(In)64 b(the)g(ab)s(o)m(v)m(e)i(example,)74
+b Fl(C-u)64 b Ft(is)g(again)i(b)s(ound)c(to)k(the)e(function)1110
+3620 y Fs(universal-argument)39 b Ft(\(just)k(as)h(it)g(w)m(as)g(in)g
+(the)f(\014rst)g(example\),)49 b(`)p Fl(C-x)1110 3730
+y(C-r)p Ft(')41 b(is)g(b)s(ound)e(to)j(the)f(function)g
+Fs(re-read-init-file)p Ft(,)e(and)i(`)3462 3727 y Fk(h)p
+3486 3674 139 4 v 3486 3730 a Fj(ESC)p 3486 3745 V 3620
+3727 a Fk(i)31 b(h)p 3705 3674 20 4 v 3705 3730 a Fj([)p
+3705 3746 V 3720 3727 a Fk(i)1110 3836 y(h)p 1134 3783
+36 4 v 1134 3839 a Fj(1)p 1134 3855 V 1165 3836 a Fk(i)f(h)p
+1250 3783 V 1250 3839 a Fj(1)p 1250 3855 V 1281 3836
+a Fk(i)g(h)p 1365 3783 48 4 v 1365 3839 a Fs(~)p 1365
+3855 V 1409 3836 a Fk(i)1438 3839 y Ft(')h(is)f(b)s(ound)f(to)i(insert)
+f(the)h(text)g(`)p Fs(Function)d(Key)i(1)p Ft('.)630
+4000 y(The)f(follo)m(wing)i Fm(gnu)f Ft(Emacs)g(st)m(yle)h(escap)s(e)f
+(sequences)g(are)g(a)m(v)-5 b(ailable)32 b(when)d(sp)s(ecifying)630
+4109 y(k)m(ey)i(sequences:)630 4269 y Fl(\\C-)336 b Ft(con)m(trol)32
+b(pre\014x)630 4430 y Fl(\\M-)336 b Ft(meta)31 b(pre\014x)630
+4590 y Fl(\\e)384 b Ft(an)30 b(escap)s(e)h(c)m(haracter)630
+4750 y Fl(\\\\)384 b Ft(bac)m(kslash)630 4910 y Fl(\\)p
+Fs(")1110 4907 y Fk(h)p 1134 4854 V 1134 4910 a Fs(")p
+1134 4925 V 1178 4907 a Fk(i)1208 4910 y Ft(,)30 b(a)h(double)f
+(quotation)h(mark)630 5070 y Fl(\\')1110 5067 y Fk(h)p
+1134 5014 20 4 v 1134 5070 a Fj(')p 1134 5086 V 1150
+5067 a Fk(i)1179 5070 y Ft(,)g(a)g(single)g(quote)g(or)f(ap)s(ostrophe)
+630 5230 y(In)d(addition)h(to)g(the)g Fm(gnu)f Ft(Emacs)h(st)m(yle)h
+(escap)s(e)f(sequences,)h(a)f(second)f(set)h(of)g(bac)m(kslash)630
+5340 y(escap)s(es)j(is)f(a)m(v)-5 b(ailable:)p eop end
+%%Page: 9 13
+TeXDict begin 9 12 bop 150 -116 a Ft(Chapter)30 b(1:)41
+b(Command)29 b(Line)i(Editing)2153 b(9)630 299 y Fs(\\a)384
+b Ft(alert)31 b(\(b)s(ell\))630 453 y Fs(\\b)384 b Ft(bac)m(kspace)630
+606 y Fs(\\d)g Ft(delete)630 760 y Fs(\\f)g Ft(form)30
+b(feed)630 914 y Fs(\\n)384 b Ft(newline)630 1067 y Fs(\\r)g
+Ft(carriage)32 b(return)630 1221 y Fs(\\t)384 b Ft(horizon)m(tal)32
+b(tab)630 1375 y Fs(\\v)384 b Ft(v)m(ertical)32 b(tab)630
+1528 y Fs(\\)p Fl(nnn)288 b Ft(the)35 b(eigh)m(t-bit)h(c)m(haracter)g
+(whose)e(v)-5 b(alue)35 b(is)g(the)f(o)s(ctal)i(v)-5
+b(alue)35 b Fi(nnn)e Ft(\(one)i(to)1110 1638 y(three)c(digits\))630
+1791 y Fs(\\x)p Fl(HH)288 b Ft(the)40 b(eigh)m(t-bit)h(c)m(haracter)g
+(whose)e(v)-5 b(alue)39 b(is)h(the)f(hexadecimal)i(v)-5
+b(alue)40 b Fi(HH)1110 1901 y Ft(\(one)31 b(or)f(t)m(w)m(o)i(hex)e
+(digits\))630 2055 y(When)37 b(en)m(tering)h(the)g(text)g(of)g(a)g
+(macro,)i(single)e(or)f(double)g(quotes)h(m)m(ust)f(b)s(e)g(used)f(to)
+630 2164 y(indicate)23 b(a)e(macro)h(de\014nition.)38
+b(Unquoted)21 b(text)i(is)e(assumed)g(to)h(b)s(e)f(a)h(function)f
+(name.)38 b(In)630 2274 y(the)22 b(macro)f(b)s(o)s(dy)-8
+b(,)23 b(the)e(bac)m(kslash)h(escap)s(es)g(describ)s(ed)e(ab)s(o)m(v)m
+(e)j(are)e(expanded.)37 b(Bac)m(kslash)630 2383 y(will)j(quote)h(an)m
+(y)f(other)g(c)m(haracter)i(in)d(the)i(macro)f(text,)k(including)39
+b(`)p Fs(")p Ft(')h(and)g(`)p Fs(')p Ft('.)69 b(F)-8
+b(or)630 2493 y(example,)28 b(the)e(follo)m(wing)h(binding)d(will)i
+(mak)m(e)h(`)p Fl(C-x)j Fs(\\)p Ft(')c(insert)f(a)h(single)h(`)p
+Fs(\\)p Ft(')f(in)m(to)g(the)g(line:)870 2625 y Fs("\\C-x\\\\":)45
+b("\\\\")150 2840 y Fh(1.3.2)63 b(Conditional)41 b(Init)g(Constructs)
+275 3081 y Ft(Readline)36 b(implemen)m(ts)f(a)h(facilit)m(y)i(similar)d
+(in)g(spirit)g(to)h(the)g(conditional)h(compilation)g(features)150
+3191 y(of)e(the)f(C)g(prepro)s(cessor)g(whic)m(h)g(allo)m(ws)i(k)m(ey)f
+(bindings)e(and)h(v)-5 b(ariable)35 b(settings)h(to)f(b)s(e)f(p)s
+(erformed)f(as)150 3301 y(the)e(result)f(of)g(tests.)42
+b(There)30 b(are)h(four)e(parser)h(directiv)m(es)i(used.)150
+3454 y Fs($if)336 b Ft(The)31 b Fs($if)f Ft(construct)i(allo)m(ws)h
+(bindings)d(to)i(b)s(e)e(made)i(based)f(on)g(the)g(editing)h(mo)s(de,)g
+(the)630 3564 y(terminal)39 b(b)s(eing)e(used,)j(or)e(the)g
+(application)h(using)f(Readline.)64 b(The)38 b(text)h(of)f(the)g(test)
+630 3673 y(extends)30 b(to)h(the)g(end)f(of)g(the)h(line;)g(no)f(c)m
+(haracters)i(are)f(required)e(to)i(isolate)i(it.)630
+3827 y Fs(mode)288 b Ft(The)20 b Fs(mode=)g Ft(form)g(of)h(the)g
+Fs($if)f Ft(directiv)m(e)j(is)e(used)f(to)h(test)h(whether)e(Readline)
+1110 3937 y(is)29 b(in)h Fs(emacs)e Ft(or)h Fs(vi)g Ft(mo)s(de.)40
+b(This)29 b(ma)m(y)h(b)s(e)e(used)h(in)g(conjunction)h(with)f(the)1110
+4046 y(`)p Fs(set)h(keymap)p Ft(')c(command,)i(for)f(instance,)i(to)f
+(set)g(bindings)f(in)g(the)h Fs(emacs-)1110 4156 y(standard)23
+b Ft(and)h Fs(emacs-ctlx)f Ft(k)m(eymaps)i(only)g(if)g(Readline)h(is)f
+(starting)h(out)1110 4266 y(in)k Fs(emacs)f Ft(mo)s(de.)630
+4419 y Fs(term)288 b Ft(The)26 b Fs(term=)g Ft(form)g(ma)m(y)i(b)s(e)e
+(used)g(to)i(include)f(terminal-sp)s(eci\014c)g(k)m(ey)h(bind-)1110
+4529 y(ings,)38 b(p)s(erhaps)c(to)j(bind)e(the)h(k)m(ey)h(sequences)f
+(output)g(b)m(y)g(the)g(terminal's)1110 4638 y(function)24
+b(k)m(eys.)39 b(The)23 b(w)m(ord)h(on)f(the)i(righ)m(t)f(side)g(of)g
+(the)g(`)p Fs(=)p Ft(')g(is)g(tested)h(against)1110 4748
+y(b)s(oth)k(the)h(full)g(name)g(of)g(the)g(terminal)h(and)e(the)i(p)s
+(ortion)e(of)h(the)g(terminal)1110 4858 y(name)k(b)s(efore)f(the)g
+(\014rst)g(`)p Fs(-)p Ft('.)50 b(This)33 b(allo)m(ws)i
+Fs(sun)e Ft(to)h(matc)m(h)g(b)s(oth)f Fs(sun)g Ft(and)1110
+4967 y Fs(sun-cmd)p Ft(,)c(for)h(instance.)630 5121 y
+Fs(application)1110 5230 y Ft(The)21 b Fi(application)j
+Ft(construct)e(is)g(used)f(to)i(include)f(application-sp)s(eci\014c)h
+(set-)1110 5340 y(tings.)39 b(Eac)m(h)26 b(program)e(using)g(the)h
+(Readline)g(library)g(sets)g(the)g Fi(application)p eop
+end
+%%Page: 10 14
+TeXDict begin 10 13 bop 150 -116 a Ft(10)2600 b(GNU)31
+b(Readline)g(Library)1110 299 y Fi(name)p Ft(,)25 b(and)e(y)m(ou)g(can)
+h(test)g(for)f(a)g(particular)h(v)-5 b(alue.)39 b(This)22
+b(could)h(b)s(e)g(used)f(to)1110 408 y(bind)32 b(k)m(ey)h(sequences)g
+(to)h(functions)e(useful)g(for)h(a)g(sp)s(eci\014c)f(program.)48
+b(F)-8 b(or)1110 518 y(instance,)35 b(the)e(follo)m(wing)h(command)f
+(adds)f(a)i(k)m(ey)f(sequence)h(that)f(quotes)1110 628
+y(the)e(curren)m(t)f(or)g(previous)g(w)m(ord)g(in)g(Bash:)1350
+762 y Fs($if)47 b(Bash)1350 872 y(#)g(Quote)g(the)g(current)f(or)h
+(previous)e(word)1350 981 y("\\C-xq":)h("\\eb\\"\\ef\\"")1350
+1091 y($endif)150 1250 y($endif)192 b Ft(This)29 b(command,)i(as)f
+(seen)h(in)f(the)g(previous)g(example,)h(terminates)g(an)g
+Fs($if)e Ft(command.)150 1410 y Fs($else)240 b Ft(Commands)29
+b(in)h(this)h(branc)m(h)e(of)i(the)f Fs($if)g Ft(directiv)m(e)i(are)f
+(executed)g(if)f(the)h(test)g(fails.)150 1569 y Fs($include)96
+b Ft(This)43 b(directiv)m(e)i(tak)m(es)g(a)e(single)i(\014lename)e(as)h
+(an)f(argumen)m(t)h(and)f(reads)g(commands)630 1679 y(and)38
+b(bindings)f(from)h(that)i(\014le.)65 b(F)-8 b(or)39
+b(example,)j(the)d(follo)m(wing)h(directiv)m(e)g(reads)e(from)630
+1788 y(`)p Fs(/etc/inputrc)p Ft(':)870 1923 y Fs($include)46
+b(/etc/inputrc)150 2147 y Fh(1.3.3)63 b(Sample)41 b(Init)g(File)275
+2391 y Ft(Here)31 b(is)f(an)g(example)i(of)e(an)g Fi(inputrc)35
+b Ft(\014le.)42 b(This)29 b(illustrates)j(k)m(ey)f(binding,)f(v)-5
+b(ariable)31 b(assignmen)m(t,)150 2501 y(and)f(conditional)h(syn)m
+(tax.)p eop end
+%%Page: 11 15
+TeXDict begin 11 14 bop 150 -116 a Ft(Chapter)30 b(1:)41
+b(Command)29 b(Line)i(Editing)2107 b(11)390 408 y Fs(#)47
+b(This)g(file)g(controls)e(the)i(behaviour)e(of)j(line)e(input)h
+(editing)e(for)390 518 y(#)i(programs)f(that)h(use)g(the)f(GNU)h
+(Readline)f(library.)93 b(Existing)390 628 y(#)47 b(programs)f(include)
+g(FTP,)g(Bash,)h(and)g(GDB.)390 737 y(#)390 847 y(#)g(You)g(can)g
+(re-read)f(the)h(inputrc)f(file)g(with)h(C-x)g(C-r.)390
+956 y(#)g(Lines)g(beginning)e(with)i('#')g(are)g(comments.)390
+1066 y(#)390 1176 y(#)g(First,)g(include)e(any)i(systemwide)e(bindings)
+h(and)h(variable)390 1285 y(#)g(assignments)e(from)i(/etc/Inputrc)390
+1395 y($include)f(/etc/Inputrc)390 1614 y(#)390 1724
+y(#)h(Set)g(various)f(bindings)g(for)h(emacs)f(mode.)390
+1943 y(set)h(editing-mode)d(emacs)390 2162 y($if)j(mode=emacs)390
+2381 y(Meta-Control-h:)91 b(backward-kill-word)43 b(Text)k(after)f(the)
+h(function)f(name)g(is)h(ignored)p 3971 2401 42 76 v
+390 2600 a(#)390 2710 y(#)g(Arrow)g(keys)f(in)i(keypad)e(mode)390
+2819 y(#)390 2929 y(#"\\M-OD":)379 b(backward-char)390
+3039 y(#"\\M-OC":)g(forward-char)390 3148 y(#"\\M-OA":)g
+(previous-history)390 3258 y(#"\\M-OB":)g(next-history)390
+3367 y(#)390 3477 y(#)47 b(Arrow)g(keys)f(in)i(ANSI)e(mode)390
+3587 y(#)390 3696 y("\\M-[D":)380 b(backward-char)390
+3806 y("\\M-[C":)g(forward-char)390 3915 y("\\M-[A":)g
+(previous-history)390 4025 y("\\M-[B":)g(next-history)390
+4134 y(#)390 4244 y(#)47 b(Arrow)g(keys)f(in)i(8)f(bit)g(keypad)f(mode)
+390 4354 y(#)390 4463 y(#"\\M-\\C-OD":)331 b(backward-char)390
+4573 y(#"\\M-\\C-OC":)g(forward-char)390 4682 y(#"\\M-\\C-OA":)g
+(previous-history)390 4792 y(#"\\M-\\C-OB":)g(next-history)390
+4902 y(#)390 5011 y(#)47 b(Arrow)g(keys)f(in)i(8)f(bit)g(ANSI)g(mode)
+390 5121 y(#)390 5230 y(#"\\M-\\C-[D":)331 b(backward-char)390
+5340 y(#"\\M-\\C-[C":)g(forward-char)p eop end
+%%Page: 12 16
+TeXDict begin 12 15 bop 150 -116 a Ft(12)2600 b(GNU)31
+b(Readline)g(Library)390 299 y Fs(#"\\M-\\C-[A":)331
+b(previous-history)390 408 y(#"\\M-\\C-[B":)g(next-history)390
+628 y(C-q:)47 b(quoted-insert)390 847 y($endif)390 1066
+y(#)g(An)h(old-style)d(binding.)93 b(This)47 b(happens)f(to)h(be)g(the)
+g(default.)390 1176 y(TAB:)g(complete)390 1395 y(#)g(Macros)g(that)f
+(are)h(convenient)e(for)i(shell)f(interaction)390 1504
+y($if)h(Bash)390 1614 y(#)g(edit)g(the)g(path)390 1724
+y("\\C-xp":)f("PATH=${PATH}\\e\\C-e\\C-a)o(\\ef)o(\\C-f)o(")390
+1833 y(#)h(prepare)f(to)h(type)g(a)h(quoted)e(word)g(--)390
+1943 y(#)h(insert)g(open)f(and)h(close)f(double)h(quotes)390
+2052 y(#)g(and)g(move)g(to)g(just)g(after)f(the)h(open)g(quote)390
+2162 y("\\C-x\\"":)e("\\"\\"\\C-b")390 2271 y(#)i(insert)g(a)g
+(backslash)e(\(testing)h(backslash)f(escapes)390 2381
+y(#)i(in)h(sequences)d(and)i(macros\))390 2491 y("\\C-x\\\\":)e("\\\\")
+390 2600 y(#)i(Quote)g(the)g(current)f(or)h(previous)e(word)390
+2710 y("\\C-xq":)h("\\eb\\"\\ef\\"")390 2819 y(#)h(Add)g(a)h(binding)e
+(to)h(refresh)f(the)h(line,)f(which)g(is)h(unbound)390
+2929 y("\\C-xr":)f(redraw-current-line)390 3039 y(#)h(Edit)g(variable)f
+(on)h(current)f(line.)390 3148 y("\\M-\\C-v":)f
+("\\C-a\\C-k$\\C-y\\M-\\C-e\\C-)o(a\\C-)o(y=")390 3258
+y($endif)390 3477 y(#)i(use)g(a)h(visible)e(bell)g(if)h(one)g(is)h
+(available)390 3587 y(set)f(bell-style)e(visible)390
+3806 y(#)i(don't)g(strip)f(characters)f(to)i(7)h(bits)e(when)h(reading)
+390 3915 y(set)g(input-meta)e(on)390 4134 y(#)i(allow)g(iso-latin1)e
+(characters)g(to)i(be)g(inserted)f(rather)390 4244 y(#)h(than)g
+(converted)e(to)j(prefix-meta)c(sequences)390 4354 y(set)j
+(convert-meta)d(off)390 4573 y(#)j(display)f(characters)f(with)i(the)g
+(eighth)f(bit)h(set)g(directly)390 4682 y(#)g(rather)g(than)f(as)h
+(meta-prefixed)e(characters)390 4792 y(set)i(output-meta)e(on)390
+5011 y(#)i(if)h(there)e(are)h(more)g(than)f(150)h(possible)f
+(completions)e(for)390 5121 y(#)j(a)h(word,)e(ask)h(the)g(user)g(if)g
+(he)g(wants)f(to)i(see)f(all)f(of)i(them)390 5230 y(set)f
+(completion-query-items)42 b(150)p eop end
+%%Page: 13 17
+TeXDict begin 13 16 bop 150 -116 a Ft(Chapter)30 b(1:)41
+b(Command)29 b(Line)i(Editing)2107 b(13)390 299 y Fs(#)47
+b(For)g(FTP)390 408 y($if)g(Ftp)390 518 y("\\C-xg":)f("get)g(\\M-?")390
+628 y("\\C-xt":)g("put)g(\\M-?")390 737 y("\\M-.":)g(yank-last-arg)390
+847 y($endif)150 1098 y Fr(1.4)68 b(Bindable)45 b(Readline)i(Commands)
+275 1340 y Ft(This)30 b(section)j(describ)s(es)d(Readline)i(commands)f
+(that)h(ma)m(y)g(b)s(e)f(b)s(ound)e(to)j(k)m(ey)g(sequences.)44
+b(Com-)150 1449 y(mand)30 b(names)g(without)g(an)g(accompan)m(ying)i(k)
+m(ey)g(sequence)e(are)h(un)m(b)s(ound)d(b)m(y)i(default.)275
+1582 y(In)25 b(the)h(follo)m(wing)i(descriptions,)f Fi(p)s(oin)m(t)h
+Ft(refers)e(to)h(the)f(curren)m(t)g(cursor)g(p)s(osition,)h(and)f
+Fi(mark)31 b Ft(refers)150 1691 y(to)40 b(a)f(cursor)f(p)s(osition)h
+(sa)m(v)m(ed)h(b)m(y)f(the)g Fs(set-mark)d Ft(command.)66
+b(The)38 b(text)i(b)s(et)m(w)m(een)g(the)f(p)s(oin)m(t)g(and)150
+1801 y(mark)30 b(is)h(referred)e(to)i(as)g(the)f Fi(region)p
+Ft(.)150 2018 y Fh(1.4.1)63 b(Commands)42 b(F)-10 b(or)41
+b(Mo)m(ving)150 2260 y Fs(beginning-of-line)26 b(\(C-a\))630
+2370 y Ft(Mo)m(v)m(e)32 b(to)g(the)e(start)h(of)g(the)f(curren)m(t)g
+(line.)150 2525 y Fs(end-of-line)d(\(C-e\))630 2635 y
+Ft(Mo)m(v)m(e)32 b(to)g(the)e(end)g(of)g(the)h(line.)150
+2790 y Fs(forward-char)c(\(C-f\))630 2899 y Ft(Mo)m(v)m(e)32
+b(forw)m(ard)e(a)h(c)m(haracter.)150 3054 y Fs(backward-char)c(\(C-b\))
+630 3164 y Ft(Mo)m(v)m(e)32 b(bac)m(k)g(a)e(c)m(haracter.)150
+3319 y Fs(forward-word)d(\(M-f\))630 3429 y Ft(Mo)m(v)m(e)32
+b(forw)m(ard)e(to)h(the)f(end)g(of)g(the)h(next)f(w)m(ord.)41
+b(W)-8 b(ords)30 b(are)h(comp)s(osed)f(of)g(letters)i(and)630
+3538 y(digits.)150 3693 y Fs(backward-word)27 b(\(M-b\))630
+3803 y Ft(Mo)m(v)m(e)36 b(bac)m(k)e(to)g(the)g(start)g(of)g(the)g
+(curren)m(t)f(or)g(previous)g(w)m(ord.)50 b(W)-8 b(ords)34
+b(are)g(comp)s(osed)630 3913 y(of)d(letters)g(and)f(digits.)150
+4068 y Fs(clear-screen)d(\(C-l\))630 4177 y Ft(Clear)g(the)g(screen)f
+(and)h(redra)m(w)f(the)h(curren)m(t)f(line,)i(lea)m(ving)g(the)f
+(curren)m(t)g(line)g(at)g(the)g(top)630 4287 y(of)k(the)f(screen.)150
+4442 y Fs(redraw-current-line)25 b(\(\))630 4552 y Ft(Refresh)30
+b(the)g(curren)m(t)h(line.)41 b(By)30 b(default,)h(this)f(is)h(un)m(b)s
+(ound.)150 4769 y Fh(1.4.2)63 b(Commands)42 b(F)-10 b(or)41
+b(Manipulating)h(The)f(History)150 5011 y Fs(accept-line)27
+b(\(Newline)h(or)i(Return\))630 5121 y Ft(Accept)36 b(the)g(line)f
+(regardless)h(of)f(where)g(the)g(cursor)g(is.)55 b(If)34
+b(this)h(line)h(is)f(non-empt)m(y)-8 b(,)37 b(it)630
+5230 y(ma)m(y)32 b(b)s(e)g(added)f(to)h(the)g(history)g(list)h(for)e
+(future)g(recall)j(with)d Fs(add_history\(\))p Ft(.)42
+b(If)31 b(this)630 5340 y(line)g(is)f(a)h(mo)s(di\014ed)e(history)h
+(line,)h(the)g(history)f(line)h(is)f(restored)h(to)g(its)g(original)g
+(state.)p eop end
+%%Page: 14 18
+TeXDict begin 14 17 bop 150 -116 a Ft(14)2600 b(GNU)31
+b(Readline)g(Library)150 299 y Fs(previous-history)26
+b(\(C-p\))630 408 y Ft(Mo)m(v)m(e)32 b(`bac)m(k')g(through)e(the)g
+(history)h(list,)g(fetc)m(hing)g(the)g(previous)f(command.)150
+556 y Fs(next-history)d(\(C-n\))630 666 y Ft(Mo)m(v)m(e)32
+b(`forw)m(ard')f(through)e(the)i(history)f(list,)i(fetc)m(hing)f(the)g
+(next)f(command.)150 814 y Fs(beginning-of-history)25
+b(\(M-<\))630 923 y Ft(Mo)m(v)m(e)32 b(to)g(the)e(\014rst)g(line)g(in)h
+(the)f(history)-8 b(.)150 1071 y Fs(end-of-history)26
+b(\(M->\))630 1181 y Ft(Mo)m(v)m(e)32 b(to)g(the)e(end)g(of)g(the)h
+(input)e(history)-8 b(,)31 b(i.e.,)h(the)f(line)f(curren)m(tly)h(b)s
+(eing)f(en)m(tered.)150 1329 y Fs(reverse-search-history)24
+b(\(C-r\))630 1438 y Ft(Searc)m(h)31 b(bac)m(kw)m(ard)h(starting)g(at)g
+(the)f(curren)m(t)g(line)g(and)g(mo)m(ving)h(`up')e(through)h(the)g
+(his-)630 1548 y(tory)g(as)f(necessary)-8 b(.)42 b(This)29
+b(is)i(an)f(incremen)m(tal)i(searc)m(h.)150 1696 y Fs
+(forward-search-history)24 b(\(C-s\))630 1805 y Ft(Searc)m(h)30
+b(forw)m(ard)f(starting)h(at)g(the)g(curren)m(t)f(line)h(and)f(mo)m
+(ving)h(`do)m(wn')f(through)g(the)h(the)630 1915 y(history)g(as)h
+(necessary)-8 b(.)41 b(This)30 b(is)g(an)h(incremen)m(tal)g(searc)m(h.)
+150 2063 y Fs(non-incremental-reverse-)o(sear)o(ch-h)o(ist)o(ory)24
+b(\(M-p\))630 2172 y Ft(Searc)m(h)31 b(bac)m(kw)m(ard)h(starting)g(at)g
+(the)f(curren)m(t)g(line)g(and)g(mo)m(ving)h(`up')e(through)h(the)g
+(his-)630 2282 y(tory)36 b(as)g(necessary)h(using)e(a)i(non-incremen)m
+(tal)g(searc)m(h)f(for)g(a)g(string)g(supplied)f(b)m(y)h(the)630
+2391 y(user.)150 2539 y Fs(non-incremental-forward-)o(sear)o(ch-h)o
+(ist)o(ory)24 b(\(M-n\))630 2649 y Ft(Searc)m(h)30 b(forw)m(ard)f
+(starting)h(at)g(the)g(curren)m(t)f(line)h(and)f(mo)m(ving)h(`do)m(wn')
+f(through)g(the)h(the)630 2758 y(history)d(as)f(necessary)i(using)e(a)h
+(non-incremen)m(tal)g(searc)m(h)h(for)e(a)h(string)g(supplied)e(b)m(y)i
+(the)630 2868 y(user.)150 3016 y Fs(history-search-forward)d(\(\))630
+3125 y Ft(Searc)m(h)42 b(forw)m(ard)f(through)f(the)i(history)f(for)g
+(the)h(string)f(of)h(c)m(haracters)h(b)s(et)m(w)m(een)f(the)630
+3235 y(start)36 b(of)f(the)g(curren)m(t)g(line)g(and)g(the)g(p)s(oin)m
+(t.)55 b(This)34 b(is)i(a)f(non-incremen)m(tal)h(searc)m(h.)56
+b(By)630 3345 y(default,)31 b(this)f(command)g(is)h(un)m(b)s(ound.)150
+3492 y Fs(history-search-backward)24 b(\(\))630 3602
+y Ft(Searc)m(h)35 b(bac)m(kw)m(ard)g(through)f(the)h(history)g(for)g
+(the)f(string)h(of)g(c)m(haracters)h(b)s(et)m(w)m(een)g(the)630
+3712 y(start)g(of)f(the)g(curren)m(t)g(line)g(and)g(the)g(p)s(oin)m(t.)
+55 b(This)34 b(is)i(a)f(non-incremen)m(tal)h(searc)m(h.)56
+b(By)630 3821 y(default,)31 b(this)f(command)g(is)h(un)m(b)s(ound.)150
+3969 y Fs(yank-nth-arg)c(\(M-C-y\))630 4079 y Ft(Insert)37
+b(the)g(\014rst)f(argumen)m(t)i(to)f(the)h(previous)e(command)h
+(\(usually)g(the)g(second)g(w)m(ord)630 4188 y(on)32
+b(the)g(previous)f(line\))i(at)f(p)s(oin)m(t.)46 b(With)32
+b(an)g(argumen)m(t)g Fi(n)p Ft(,)g(insert)g(the)g Fi(n)p
+Ft(th)f(w)m(ord)g(from)630 4298 y(the)k(previous)f(command)h(\(the)g(w)
+m(ords)g(in)f(the)h(previous)g(command)f(b)s(egin)h(with)f(w)m(ord)630
+4407 y(0\).)69 b(A)40 b(negativ)m(e)h(argumen)m(t)f(inserts)g(the)f
+Fi(n)p Ft(th)g(w)m(ord)g(from)g(the)h(end)f(of)h(the)f(previous)630
+4517 y(command.)48 b(Once)33 b(the)g(argumen)m(t)h Fi(n)e
+Ft(is)h(computed,)h(the)f(argumen)m(t)g(is)g(extracted)i(as)e(if)630
+4627 y(the)e(`)p Fs(!)p Fl(n)11 b Ft(')29 b(history)i(expansion)f(had)g
+(b)s(een)f(sp)s(eci\014ed.)150 4774 y Fs(yank-last-arg)e(\(M-.)i(or)h
+(M-_\))630 4884 y Ft(Insert)k(last)i(argumen)m(t)g(to)g(the)f(previous)
+f(command)h(\(the)h(last)f(w)m(ord)g(of)g(the)g(previous)630
+4994 y(history)c(en)m(try\).)41 b(With)31 b(an)g(argumen)m(t,)g(b)s
+(eha)m(v)m(e)g(exactly)i(lik)m(e)f Fs(yank-nth-arg)p
+Ft(.)38 b(Succes-)630 5103 y(siv)m(e)d(calls)h(to)f Fs(yank-last-arg)c
+Ft(mo)m(v)m(e)36 b(bac)m(k)g(through)d(the)i(history)g(list,)h
+(inserting)f(the)630 5213 y(last)d(argumen)m(t)f(of)g(eac)m(h)h(line)f
+(in)f(turn.)41 b(The)30 b(history)h(expansion)f(facilities)j(are)e
+(used)f(to)630 5322 y(extract)i(the)e(last)i(argumen)m(t,)f(as)f(if)h
+(the)f(`)p Fs(!$)p Ft(')g(history)h(expansion)f(had)g(b)s(een)f(sp)s
+(eci\014ed.)p eop end
+%%Page: 15 19
+TeXDict begin 15 18 bop 150 -116 a Ft(Chapter)30 b(1:)41
+b(Command)29 b(Line)i(Editing)2107 b(15)150 299 y Fh(1.4.3)63
+b(Commands)42 b(F)-10 b(or)41 b(Changing)g(T)-10 b(ext)150
+547 y Fs(delete-char)27 b(\(C-d\))630 656 y Ft(Delete)41
+b(the)e(c)m(haracter)i(at)e(p)s(oin)m(t.)66 b(If)39 b(p)s(oin)m(t)f(is)
+h(at)h(the)f(b)s(eginning)f(of)h(the)g(line,)j(there)630
+766 y(are)37 b(no)g(c)m(haracters)i(in)d(the)i(line,)h(and)d(the)h
+(last)h(c)m(haracter)h(t)m(yp)s(ed)e(w)m(as)g(not)g(b)s(ound)e(to)630
+875 y Fs(delete-char)p Ft(,)28 b(then)i(return)f Fm(eof)p
+Ft(.)150 1042 y Fs(backward-delete-char)c(\(Rubout\))630
+1152 y Ft(Delete)32 b(the)f(c)m(haracter)g(b)s(ehind)e(the)h(cursor.)40
+b(A)30 b(n)m(umeric)g(argumen)m(t)h(means)f(to)h(kill)g(the)630
+1261 y(c)m(haracters)h(instead)e(of)h(deleting)g(them.)150
+1428 y Fs(forward-backward-delete-)o(char)24 b(\(\))630
+1538 y Ft(Delete)40 b(the)f(c)m(haracter)h(under)c(the)j(cursor,)h
+(unless)d(the)i(cursor)e(is)h(at)h(the)g(end)e(of)i(the)630
+1647 y(line,)33 b(in)e(whic)m(h)g(case)i(the)f(c)m(haracter)h(b)s
+(ehind)d(the)i(cursor)f(is)g(deleted.)46 b(By)32 b(default,)g(this)630
+1757 y(is)e(not)h(b)s(ound)d(to)j(a)g(k)m(ey)-8 b(.)150
+1924 y Fs(quoted-insert)27 b(\(C-q)i(or)h(C-v\))630 2033
+y Ft(Add)j(the)i(next)f(c)m(haracter)i(t)m(yp)s(ed)e(to)h(the)f(line)h
+(v)m(erbatim.)53 b(This)33 b(is)i(ho)m(w)f(to)h(insert)f(k)m(ey)630
+2143 y(sequences)d(lik)m(e)g Fl(C-q)p Ft(,)f(for)g(example.)150
+2310 y Fs(tab-insert)e(\(M-)802 2307 y Fk(h)p 825 2254
+148 4 v 825 2310 a Fj(T)-6 b(AB)p 825 2325 V 969 2307
+a Fk(i)998 2310 y Fs(\))630 2419 y Ft(Insert)30 b(a)h(tab)f(c)m
+(haracter.)150 2586 y Fs(self-insert)d(\(a,)j(b,)g(A,)f(1,)h(!,)g(...)o
+(\))630 2696 y Ft(Insert)g(y)m(ourself.)150 2862 y Fs(transpose-chars)c
+(\(C-t\))630 2972 y Ft(Drag)33 b(the)f(c)m(haracter)h(b)s(efore)f(the)g
+(cursor)f(forw)m(ard)h(o)m(v)m(er)h(the)f(c)m(haracter)i(at)e(the)g
+(cursor,)630 3081 y(mo)m(ving)k(the)g(cursor)f(forw)m(ard)g(as)g(w)m
+(ell.)57 b(If)35 b(the)h(insertion)g(p)s(oin)m(t)f(is)g(at)i(the)e(end)
+g(of)h(the)630 3191 y(line,)24 b(then)e(this)g(transp)s(oses)f(the)h
+(last)h(t)m(w)m(o)g(c)m(haracters)g(of)f(the)h(line.)38
+b(Negativ)m(e)25 b(argumen)m(ts)630 3301 y(ha)m(v)m(e)32
+b(no)e(e\013ect.)150 3467 y Fs(transpose-words)c(\(M-t\))630
+3577 y Ft(Drag)33 b(the)g(w)m(ord)f(b)s(efore)g(p)s(oin)m(t)g(past)g
+(the)h(w)m(ord)f(after)g(p)s(oin)m(t,)i(mo)m(ving)f(p)s(oin)m(t)f(past)
+g(that)630 3687 y(w)m(ord)c(as)h(w)m(ell.)41 b(If)27
+b(the)i(insertion)f(p)s(oin)m(t)h(is)f(at)h(the)g(end)e(of)i(the)f
+(line,)i(this)e(transp)s(oses)g(the)630 3796 y(last)j(t)m(w)m(o)h(w)m
+(ords)e(on)g(the)h(line.)150 3963 y Fs(upcase-word)c(\(M-u\))630
+4073 y Ft(Upp)s(ercase)32 b(the)g(curren)m(t)g(\(or)g(follo)m(wing\))i
+(w)m(ord.)45 b(With)32 b(a)g(negativ)m(e)j(argumen)m(t,)e(upp)s(er-)630
+4182 y(case)e(the)g(previous)f(w)m(ord,)g(but)g(do)g(not)h(mo)m(v)m(e)h
+(the)e(cursor.)150 4349 y Fs(downcase-word)d(\(M-l\))630
+4458 y Ft(Lo)m(w)m(ercase)c(the)f(curren)m(t)f(\(or)h(follo)m(wing\))i
+(w)m(ord.)37 b(With)22 b(a)g(negativ)m(e)i(argumen)m(t,)g(lo)m(w)m
+(ercase)630 4568 y(the)31 b(previous)e(w)m(ord,)i(but)e(do)i(not)f(mo)m
+(v)m(e)i(the)f(cursor.)150 4735 y Fs(capitalize-word)26
+b(\(M-c\))630 4844 y Ft(Capitalize)d(the)f(curren)m(t)f(\(or)g(follo)m
+(wing\))i(w)m(ord.)38 b(With)21 b(a)h(negativ)m(e)h(argumen)m(t,)h
+(capitalize)630 4954 y(the)31 b(previous)e(w)m(ord,)i(but)e(do)i(not)f
+(mo)m(v)m(e)i(the)f(cursor.)150 5121 y Fs(overwrite-mode)26
+b(\(\))630 5230 y Ft(T)-8 b(oggle)35 b(o)m(v)m(erwrite)g(mo)s(de.)48
+b(With)33 b(an)g(explicit)h(p)s(ositiv)m(e)g(n)m(umeric)f(argumen)m(t,)
+h(switc)m(hes)630 5340 y(to)22 b(o)m(v)m(erwrite)i(mo)s(de.)37
+b(With)22 b(an)g(explicit)h(non-p)s(ositiv)m(e)f(n)m(umeric)g(argumen)m
+(t,)i(switc)m(hes)e(to)p eop end
+%%Page: 16 20
+TeXDict begin 16 19 bop 150 -116 a Ft(16)2600 b(GNU)31
+b(Readline)g(Library)630 299 y(insert)f(mo)s(de.)41 b(This)30
+b(command)h(a\013ects)h(only)e Fs(emacs)f Ft(mo)s(de;)i
+Fs(vi)f Ft(mo)s(de)g(do)s(es)g(o)m(v)m(erwrite)630 408
+y(di\013eren)m(tly)-8 b(.)42 b(Eac)m(h)31 b(call)h(to)f
+Fs(readline\(\))c Ft(starts)k(in)f(insert)g(mo)s(de.)630
+539 y(In)e(o)m(v)m(erwrite)j(mo)s(de,)e(c)m(haracters)i(b)s(ound)c(to)j
+Fs(self-insert)c Ft(replace)k(the)g(text)g(at)g(p)s(oin)m(t)630
+648 y(rather)41 b(than)h(pushing)e(the)i(text)g(to)g(the)g(righ)m(t.)75
+b(Characters)42 b(b)s(ound)d(to)j Fs(backward-)630 758
+y(delete-char)27 b Ft(replace)32 b(the)e(c)m(haracter)i(b)s(efore)e(p)s
+(oin)m(t)h(with)f(a)g(space.)630 888 y(By)h(default,)f(this)h(command)f
+(is)g(un)m(b)s(ound.)150 1099 y Fh(1.4.4)63 b(Killing)42
+b(And)e(Y)-10 b(anking)150 1339 y Fs(kill-line)28 b(\(C-k\))630
+1449 y Ft(Kill)j(the)f(text)i(from)e(p)s(oin)m(t)g(to)h(the)g(end)e(of)
+i(the)f(line.)150 1599 y Fs(backward-kill-line)25 b(\(C-x)30
+b(Rubout\))630 1709 y Ft(Kill)h(bac)m(kw)m(ard)g(to)g(the)f(b)s
+(eginning)g(of)g(the)h(line.)150 1860 y Fs(unix-line-discard)26
+b(\(C-u\))630 1969 y Ft(Kill)31 b(bac)m(kw)m(ard)g(from)e(the)i(cursor)
+f(to)h(the)f(b)s(eginning)g(of)h(the)f(curren)m(t)g(line.)150
+2120 y Fs(kill-whole-line)c(\(\))630 2230 y Ft(Kill)37
+b(all)g(c)m(haracters)h(on)f(the)f(curren)m(t)h(line,)h(no)f(matter)g
+(where)f(p)s(oin)m(t)h(is.)59 b(By)36 b(default,)630
+2339 y(this)30 b(is)h(un)m(b)s(ound.)150 2490 y Fs(kill-word)d(\(M-d\))
+630 2600 y Ft(Kill)i(from)f(p)s(oin)m(t)g(to)h(the)g(end)e(of)i(the)f
+(curren)m(t)h(w)m(ord,)f(or)g(if)h(b)s(et)m(w)m(een)g(w)m(ords,)f(to)h
+(the)g(end)630 2709 y(of)h(the)f(next)h(w)m(ord.)40 b(W)-8
+b(ord)31 b(b)s(oundaries)e(are)h(the)h(same)g(as)f Fs(forward-word)p
+Ft(.)150 2860 y Fs(backward-kill-word)25 b(\(M-)1183
+2857 y Fk(h)p 1207 2804 146 4 v 1207 2860 a Fj(DEL)p
+1207 2875 V 1348 2857 a Fk(i)1378 2860 y Fs(\))630 2970
+y Ft(Kill)k(the)g(w)m(ord)g(b)s(ehind)e(p)s(oin)m(t.)40
+b(W)-8 b(ord)29 b(b)s(oundaries)f(are)h(the)g(same)g(as)g
+Fs(backward-word)p Ft(.)150 3120 y Fs(unix-word-rubout)d(\(C-w\))630
+3230 y Ft(Kill)32 b(the)g(w)m(ord)f(b)s(ehind)f(p)s(oin)m(t,)i(using)f
+(white)h(space)g(as)g(a)g(w)m(ord)f(b)s(oundary)-8 b(.)43
+b(The)31 b(killed)630 3339 y(text)g(is)g(sa)m(v)m(ed)g(on)g(the)f
+(kill-ring.)150 3490 y Fs(unix-filename-rubout)25 b(\(\))630
+3600 y Ft(Kill)37 b(the)f(w)m(ord)g(b)s(ehind)f(p)s(oin)m(t,)j(using)e
+(white)g(space)h(and)f(the)g(slash)g(c)m(haracter)i(as)f(the)630
+3709 y(w)m(ord)30 b(b)s(oundaries.)39 b(The)30 b(killed)h(text)g(is)g
+(sa)m(v)m(ed)g(on)g(the)f(kill-ring.)150 3860 y Fs
+(delete-horizontal-space)24 b(\(\))630 3970 y Ft(Delete)33
+b(all)e(spaces)g(and)e(tabs)i(around)e(p)s(oin)m(t.)41
+b(By)31 b(default,)f(this)h(is)f(un)m(b)s(ound.)150 4121
+y Fs(kill-region)d(\(\))630 4230 y Ft(Kill)k(the)f(text)i(in)e(the)g
+(curren)m(t)h(region.)41 b(By)31 b(default,)f(this)h(command)f(is)g(un)
+m(b)s(ound.)150 4381 y Fs(copy-region-as-kill)25 b(\(\))630
+4490 y Ft(Cop)m(y)34 b(the)g(text)h(in)f(the)g(region)g(to)h(the)f
+(kill)h(bu\013er,)f(so)g(it)h(can)f(b)s(e)f(y)m(ank)m(ed)i(righ)m(t)f
+(a)m(w)m(a)m(y)-8 b(.)630 4600 y(By)31 b(default,)f(this)h(command)f
+(is)g(un)m(b)s(ound.)150 4751 y Fs(copy-backward-word)25
+b(\(\))630 4860 y Ft(Cop)m(y)38 b(the)h(w)m(ord)f(b)s(efore)g(p)s(oin)m
+(t)g(to)i(the)e(kill)h(bu\013er.)64 b(The)38 b(w)m(ord)g(b)s(oundaries)
+f(are)i(the)630 4970 y(same)31 b(as)f Fs(backward-word)p
+Ft(.)38 b(By)30 b(default,)h(this)f(command)g(is)h(un)m(b)s(ound.)150
+5121 y Fs(copy-forward-word)26 b(\(\))630 5230 y Ft(Cop)m(y)31
+b(the)g(w)m(ord)g(follo)m(wing)h(p)s(oin)m(t)f(to)h(the)f(kill)h
+(bu\013er.)42 b(The)30 b(w)m(ord)h(b)s(oundaries)e(are)j(the)630
+5340 y(same)f(as)f Fs(forward-word)p Ft(.)38 b(By)30
+b(default,)h(this)g(command)f(is)g(un)m(b)s(ound.)p eop
+end
+%%Page: 17 21
+TeXDict begin 17 20 bop 150 -116 a Ft(Chapter)30 b(1:)41
+b(Command)29 b(Line)i(Editing)2107 b(17)150 299 y Fs(yank)29
+b(\(C-y\))630 408 y Ft(Y)-8 b(ank)31 b(the)f(top)h(of)g(the)f(kill)h
+(ring)f(in)m(to)i(the)e(bu\013er)g(at)h(p)s(oin)m(t.)150
+552 y Fs(yank-pop)d(\(M-y\))630 661 y Ft(Rotate)36 b(the)f(kill-ring,)i
+(and)d(y)m(ank)h(the)f(new)g(top.)54 b(Y)-8 b(ou)35 b(can)g(only)f(do)h
+(this)f(if)h(the)g(prior)630 771 y(command)30 b(is)h
+Fs(yank)e Ft(or)h Fs(yank-pop)p Ft(.)150 971 y Fh(1.4.5)63
+b(Sp)s(ecifying)42 b(Numeric)f(Argumen)m(ts)150 1207
+y Fs(digit-argument)26 b(\()p Fl(M-0)p Fs(,)j Fl(M-1)p
+Fs(,)h(...)f Fl(M--)p Fs(\))630 1317 y Ft(Add)d(this)h(digit)g(to)h
+(the)f(argumen)m(t)g(already)h(accum)m(ulating,)h(or)e(start)h(a)f(new)
+f(argumen)m(t.)630 1427 y Fl(M--)j Ft(starts)i(a)g(negativ)m(e)i
+(argumen)m(t.)150 1570 y Fs(universal-argument)25 b(\(\))630
+1680 y Ft(This)g(is)g(another)h(w)m(a)m(y)g(to)h(sp)s(ecify)e(an)g
+(argumen)m(t.)40 b(If)25 b(this)g(command)h(is)f(follo)m(w)m(ed)i(b)m
+(y)f(one)630 1789 y(or)k(more)f(digits,)i(optionally)g(with)e(a)h
+(leading)h(min)m(us)e(sign,)h(those)g(digits)g(de\014ne)f(the)h(ar-)630
+1899 y(gumen)m(t.)41 b(If)28 b(the)i(command)f(is)g(follo)m(w)m(ed)h(b)
+m(y)f(digits,)i(executing)f Fs(universal-argument)630
+2008 y Ft(again)j(ends)e(the)h(n)m(umeric)f(argumen)m(t,)i(but)e(is)h
+(otherwise)g(ignored.)45 b(As)32 b(a)g(sp)s(ecial)h(case,)630
+2118 y(if)g(this)g(command)f(is)h(immediately)h(follo)m(w)m(ed)h(b)m(y)
+d(a)h(c)m(haracter)i(that)e(is)g(neither)g(a)g(digit)630
+2228 y(or)28 b(min)m(us)f(sign,)i(the)f(argumen)m(t)g(coun)m(t)h(for)e
+(the)i(next)f(command)f(is)h(m)m(ultiplied)h(b)m(y)e(four.)630
+2337 y(The)37 b(argumen)m(t)h(coun)m(t)f(is)h(initially)h(one,)g(so)f
+(executing)g(this)f(function)g(the)h(\014rst)e(time)630
+2447 y(mak)m(es)d(the)e(argumen)m(t)i(coun)m(t)f(four,)f(a)i(second)e
+(time)i(mak)m(es)f(the)g(argumen)m(t)g(coun)m(t)h(six-)630
+2556 y(teen,)e(and)f(so)h(on.)40 b(By)31 b(default,)g(this)f(is)g(not)h
+(b)s(ound)d(to)j(a)g(k)m(ey)-8 b(.)150 2757 y Fh(1.4.6)63
+b(Letting)40 b(Readline)h(T)m(yp)s(e)g(F)-10 b(or)42
+b(Y)-10 b(ou)150 2993 y Fs(complete)28 b(\()610 2990
+y Fk(h)p 634 2937 148 4 v 634 2993 a Fj(T)-6 b(AB)p 634
+3008 V 778 2990 a Fk(i)808 2993 y Fs(\))630 3102 y Ft(A)m(ttempt)24
+b(to)f(p)s(erform)e(completion)j(on)f(the)g(text)g(b)s(efore)f(p)s(oin)
+m(t.)39 b(The)22 b(actual)i(completion)630 3212 y(p)s(erformed)29
+b(is)h(application-sp)s(eci\014c.)42 b(The)30 b(default)h(is)f
+(\014lename)h(completion.)150 3355 y Fs(possible-completions)25
+b(\(M-?\))630 3465 y Ft(List)31 b(the)f(p)s(ossible)g(completions)i(of)
+e(the)h(text)g(b)s(efore)f(p)s(oin)m(t.)150 3608 y Fs
+(insert-completions)25 b(\(M-*\))630 3718 y Ft(Insert)30
+b(all)h(completions)h(of)f(the)g(text)g(b)s(efore)f(p)s(oin)m(t)h(that)
+g(w)m(ould)f(ha)m(v)m(e)i(b)s(een)e(generated)630 3827
+y(b)m(y)g Fs(possible-completions)p Ft(.)150 3971 y Fs(menu-complete)d
+(\(\))630 4080 y Ft(Similar)d(to)g Fs(complete)p Ft(,)f(but)h(replaces)
+g(the)g(w)m(ord)g(to)g(b)s(e)f(completed)i(with)e(a)i(single)f(matc)m
+(h)630 4190 y(from)37 b(the)h(list)h(of)f(p)s(ossible)f(completions.)64
+b(Rep)s(eated)39 b(execution)g(of)f Fs(menu-complete)630
+4300 y Ft(steps)i(through)g(the)g(list)h(of)f(p)s(ossible)g
+(completions,)k(inserting)c(eac)m(h)i(matc)m(h)f(in)f(turn.)630
+4409 y(A)m(t)e(the)f(end)f(of)h(the)g(list)g(of)g(completions,)i(the)e
+(b)s(ell)g(is)g(rung)f(\(sub)5 b(ject)36 b(to)i(the)f(setting)630
+4519 y(of)f Fs(bell-style)p Ft(\))e(and)h(the)h(original)i(text)f(is)f
+(restored.)57 b(An)36 b(argumen)m(t)h(of)f Fi(n)f Ft(mo)m(v)m(es)i
+Fi(n)630 4628 y Ft(p)s(ositions)e(forw)m(ard)f(in)g(the)h(list)h(of)e
+(matc)m(hes;)39 b(a)c(negativ)m(e)i(argumen)m(t)e(ma)m(y)g(b)s(e)f
+(used)g(to)630 4738 y(mo)m(v)m(e)40 b(bac)m(kw)m(ard)e(through)g(the)g
+(list.)65 b(This)38 b(command)g(is)g(in)m(tended)g(to)h(b)s(e)f(b)s
+(ound)e(to)630 4845 y Fk(h)p 654 4792 V 654 4848 a Fj(T)-6
+b(AB)p 654 4863 V 798 4845 a Fk(i)828 4848 y Ft(,)30
+b(but)g(is)g(un)m(b)s(ound)e(b)m(y)i(default.)150 4991
+y Fs(delete-char-or-list)25 b(\(\))630 5101 y Ft(Deletes)k(the)e(c)m
+(haracter)h(under)e(the)h(cursor)f(if)h(not)g(at)g(the)g(b)s(eginning)g
+(or)f(end)h(of)g(the)g(line)630 5210 y(\(lik)m(e)k Fs(delete-char)p
+Ft(\).)37 b(If)29 b(at)h(the)f(end)f(of)i(the)f(line,)h(b)s(eha)m(v)m
+(es)g(iden)m(tically)h(to)e Fs(possible-)630 5320 y(completions)p
+Ft(.)38 b(This)29 b(command)h(is)h(un)m(b)s(ound)d(b)m(y)i(default.)p
+eop end
+%%Page: 18 22
+TeXDict begin 18 21 bop 150 -116 a Ft(18)2600 b(GNU)31
+b(Readline)g(Library)150 299 y Fh(1.4.7)63 b(Keyb)s(oard)41
+b(Macros)150 545 y Fs(start-kbd-macro)26 b(\(C-x)j(\(\))630
+655 y Ft(Begin)i(sa)m(ving)h(the)e(c)m(haracters)i(t)m(yp)s(ed)e(in)m
+(to)h(the)g(curren)m(t)f(k)m(eyb)s(oard)g(macro.)150
+818 y Fs(end-kbd-macro)d(\(C-x)i(\)\))630 927 y Ft(Stop)e(sa)m(ving)h
+(the)g(c)m(haracters)g(t)m(yp)s(ed)f(in)m(to)i(the)e(curren)m(t)g(k)m
+(eyb)s(oard)g(macro)h(and)f(sa)m(v)m(e)i(the)630 1037
+y(de\014nition.)150 1200 y Fs(call-last-kbd-macro)c(\(C-x)k(e\))630
+1310 y Ft(Re-execute)37 b(the)e(last)h(k)m(eyb)s(oard)f(macro)h
+(de\014ned,)f(b)m(y)h(making)f(the)g(c)m(haracters)i(in)e(the)630
+1419 y(macro)c(app)s(ear)f(as)g(if)h(t)m(yp)s(ed)f(at)h(the)f(k)m(eyb)s
+(oard.)150 1651 y Fh(1.4.8)63 b(Some)41 b(Miscellaneous)i(Commands)150
+1898 y Fs(re-read-init-file)26 b(\(C-x)j(C-r\))630 2007
+y Ft(Read)22 b(in)g(the)g(con)m(ten)m(ts)h(of)f(the)g
+Fi(inputrc)27 b Ft(\014le,)d(and)d(incorp)s(orate)h(an)m(y)h(bindings)d
+(or)i(v)-5 b(ariable)630 2117 y(assignmen)m(ts)31 b(found)e(there.)150
+2280 y Fs(abort)g(\(C-g\))630 2390 y Ft(Ab)s(ort)d(the)h(curren)m(t)f
+(editing)h(command)f(and)g(ring)h(the)f(terminal's)h(b)s(ell)g(\(sub)5
+b(ject)26 b(to)i(the)630 2499 y(setting)j(of)g Fs(bell-style)p
+Ft(\).)150 2663 y Fs(do-uppercase-version)25 b(\(M-a,)k(M-b,)g(M-)p
+Fl(x)p Fs(,)g(...)o(\))630 2772 y Ft(If)e(the)h(meta\014ed)g(c)m
+(haracter)h Fi(x)34 b Ft(is)28 b(lo)m(w)m(ercase,)i(run)d(the)g
+(command)h(that)g(is)g(b)s(ound)d(to)k(the)630 2882 y(corresp)s(onding)
+g(upp)s(ercase)h(c)m(haracter.)150 3045 y Fs(prefix-meta)d(\()753
+3042 y Fk(h)p 777 2989 139 4 v 777 3045 a Fj(ESC)p 777
+3060 V 911 3042 a Fk(i)941 3045 y Fs(\))630 3155 y Ft(Metafy)39
+b(the)e(next)h(c)m(haracter)h(t)m(yp)s(ed.)62 b(This)37
+b(is)g(for)h(k)m(eyb)s(oards)f(without)g(a)h(meta)g(k)m(ey)-8
+b(.)630 3264 y(T)m(yping)30 b(`)968 3261 y Fk(h)p 993
+3208 V 993 3264 a Fj(ESC)p 993 3280 V 1127 3261 a Fk(i)1187
+3264 y Fs(f)p Ft(')g(is)g(equiv)-5 b(alen)m(t)32 b(to)f(t)m(yping)g
+Fl(M-f)p Ft(.)150 3428 y Fs(undo)e(\(C-_)g(or)h(C-x)g(C-u\))630
+3537 y Ft(Incremen)m(tal)h(undo,)f(separately)h(remem)m(b)s(ered)f(for)
+g(eac)m(h)i(line.)150 3700 y Fs(revert-line)27 b(\(M-r\))630
+3810 y Ft(Undo)33 b(all)h(c)m(hanges)g(made)f(to)h(this)f(line.)49
+b(This)32 b(is)h(lik)m(e)i(executing)f(the)f Fs(undo)f
+Ft(command)630 3920 y(enough)e(times)h(to)g(get)h(bac)m(k)f(to)g(the)f
+(b)s(eginning.)150 4083 y Fs(tilde-expand)d(\(M-~\))630
+4192 y Ft(P)m(erform)j(tilde)h(expansion)g(on)f(the)g(curren)m(t)h(w)m
+(ord.)150 4356 y Fs(set-mark)d(\(C-@\))630 4465 y Ft(Set)33
+b(the)g(mark)f(to)i(the)f(p)s(oin)m(t.)48 b(If)32 b(a)h(n)m(umeric)g
+(argumen)m(t)g(is)g(supplied,)f(the)h(mark)g(is)f(set)630
+4575 y(to)f(that)g(p)s(osition.)150 4738 y Fs(exchange-point-and-mark)
+24 b(\(C-x)29 b(C-x\))630 4848 y Ft(Sw)m(ap)i(the)g(p)s(oin)m(t)g(with)
+g(the)g(mark.)43 b(The)31 b(curren)m(t)g(cursor)f(p)s(osition)i(is)f
+(set)h(to)f(the)h(sa)m(v)m(ed)630 4957 y(p)s(osition,)f(and)e(the)i
+(old)g(cursor)e(p)s(osition)i(is)f(sa)m(v)m(ed)i(as)e(the)h(mark.)150
+5121 y Fs(character-search)26 b(\(C-]\))630 5230 y Ft(A)f(c)m(haracter)
+h(is)f(read)g(and)f(p)s(oin)m(t)h(is)g(mo)m(v)m(ed)h(to)g(the)f(next)g
+(o)s(ccurrence)g(of)g(that)g(c)m(haracter.)630 5340 y(A)30
+b(negativ)m(e)j(coun)m(t)e(searc)m(hes)g(for)f(previous)g(o)s
+(ccurrences.)p eop end
+%%Page: 19 23
+TeXDict begin 19 22 bop 150 -116 a Ft(Chapter)30 b(1:)41
+b(Command)29 b(Line)i(Editing)2107 b(19)150 299 y Fs
+(character-search-backwar)o(d)24 b(\(M-C-]\))630 408
+y Ft(A)45 b(c)m(haracter)h(is)f(read)g(and)f(p)s(oin)m(t)h(is)g(mo)m(v)
+m(ed)h(to)f(the)g(previous)f(o)s(ccurrence)h(of)g(that)630
+518 y(c)m(haracter.)d(A)31 b(negativ)m(e)h(coun)m(t)f(searc)m(hes)h
+(for)e(subsequen)m(t)f(o)s(ccurrences.)150 677 y Fs(insert-comment)d
+(\(M-#\))630 787 y Ft(Without)36 b(a)g(n)m(umeric)g(argumen)m(t,)h(the)
+f(v)-5 b(alue)36 b(of)g(the)g Fs(comment-begin)c Ft(v)-5
+b(ariable)36 b(is)g(in-)630 897 y(serted)c(at)g(the)g(b)s(eginning)f
+(of)h(the)f(curren)m(t)h(line.)45 b(If)31 b(a)h(n)m(umeric)f(argumen)m
+(t)h(is)g(supplied,)630 1006 y(this)k(command)h(acts)g(as)g(a)g
+(toggle:)55 b(if)37 b(the)f(c)m(haracters)i(at)g(the)e(b)s(eginning)g
+(of)h(the)g(line)630 1116 y(do)30 b(not)h(matc)m(h)h(the)f(v)-5
+b(alue)31 b(of)f Fs(comment-begin)p Ft(,)e(the)i(v)-5
+b(alue)31 b(is)g(inserted,)g(otherwise)g(the)630 1225
+y(c)m(haracters)42 b(in)d Fs(comment-begin)e Ft(are)j(deleted)h(from)f
+(the)g(b)s(eginning)g(of)g(the)g(line.)71 b(In)630 1335
+y(either)31 b(case,)h(the)e(line)h(is)f(accepted)i(as)f(if)f(a)h
+(newline)f(had)g(b)s(een)f(t)m(yp)s(ed.)150 1494 y Fs(dump-functions)d
+(\(\))630 1604 y Ft(Prin)m(t)g(all)i(of)e(the)h(functions)f(and)g
+(their)g(k)m(ey)h(bindings)e(to)j(the)e(Readline)h(output)f(stream.)630
+1714 y(If)31 b(a)h(n)m(umeric)g(argumen)m(t)g(is)g(supplied,)f(the)h
+(output)f(is)h(formatted)g(in)f(suc)m(h)h(a)g(w)m(a)m(y)g(that)630
+1823 y(it)f(can)g(b)s(e)e(made)i(part)f(of)g(an)h Fi(inputrc)k
+Ft(\014le.)41 b(This)29 b(command)h(is)h(un)m(b)s(ound)c(b)m(y)k
+(default.)150 1983 y Fs(dump-variables)26 b(\(\))630
+2092 y Ft(Prin)m(t)21 b(all)h(of)g(the)f(settable)i(v)-5
+b(ariables)22 b(and)f(their)g(v)-5 b(alues)22 b(to)g(the)f(Readline)h
+(output)f(stream.)630 2202 y(If)31 b(a)h(n)m(umeric)g(argumen)m(t)g(is)
+g(supplied,)f(the)h(output)f(is)h(formatted)g(in)f(suc)m(h)h(a)g(w)m(a)
+m(y)g(that)630 2311 y(it)f(can)g(b)s(e)e(made)i(part)f(of)g(an)h
+Fi(inputrc)k Ft(\014le.)41 b(This)29 b(command)h(is)h(un)m(b)s(ound)c
+(b)m(y)k(default.)150 2471 y Fs(dump-macros)c(\(\))630
+2580 y Ft(Prin)m(t)34 b(all)g(of)g(the)g(Readline)g(k)m(ey)h(sequences)
+f(b)s(ound)e(to)i(macros)g(and)f(the)h(strings)g(they)630
+2690 y(output.)53 b(If)35 b(a)g(n)m(umeric)f(argumen)m(t)i(is)e
+(supplied,)h(the)g(output)g(is)f(formatted)i(in)e(suc)m(h)h(a)630
+2800 y(w)m(a)m(y)c(that)g(it)f(can)g(b)s(e)g(made)g(part)f(of)i(an)e
+Fi(inputrc)35 b Ft(\014le.)41 b(This)29 b(command)h(is)g(un)m(b)s(ound)
+d(b)m(y)630 2909 y(default.)150 3068 y Fs(emacs-editing-mode)e(\(C-e\))
+630 3178 y Ft(When)30 b(in)g Fs(vi)g Ft(command)g(mo)s(de,)g(this)h
+(causes)f(a)h(switc)m(h)g(to)g Fs(emacs)e Ft(editing)i(mo)s(de.)150
+3337 y Fs(vi-editing-mode)26 b(\(M-C-j\))630 3447 y Ft(When)k(in)g
+Fs(emacs)f Ft(editing)i(mo)s(de,)f(this)h(causes)f(a)h(switc)m(h)g(to)g
+Fs(vi)f Ft(editing)h(mo)s(de.)150 3704 y Fr(1.5)68 b(Readline)47
+b(vi)e(Mo)t(de)275 3949 y Ft(While)24 b(the)g(Readline)g(library)f(do)s
+(es)h(not)g(ha)m(v)m(e)g(a)h(full)e(set)h(of)g Fs(vi)f
+Ft(editing)h(functions,)h(it)f(do)s(es)g(con)m(tain)150
+4058 y(enough)34 b(to)h(allo)m(w)g(simple)f(editing)h(of)f(the)g(line.)
+52 b(The)34 b(Readline)g Fs(vi)g Ft(mo)s(de)f(b)s(eha)m(v)m(es)i(as)f
+(sp)s(eci\014ed)f(in)150 4168 y(the)e Fm(posix)e Ft(1003.2)k(standard.)
+275 4302 y(In)28 b(order)g(to)i(switc)m(h)g(in)m(teractiv)m(ely)i(b)s
+(et)m(w)m(een)d Fs(emacs)f Ft(and)g Fs(vi)h Ft(editing)g(mo)s(des,)g
+(use)g(the)g(command)150 4412 y Fl(M-C-j)36 b Ft(\(b)s(ound)h(to)h
+(emacs-editing-mo)s(de)i(when)d(in)g Fs(vi)h Ft(mo)s(de)f(and)g(to)i
+(vi-editing-mo)s(de)g(in)e Fs(emacs)150 4521 y Ft(mo)s(de\).)k(The)30
+b(Readline)h(default)f(is)g Fs(emacs)f Ft(mo)s(de.)275
+4656 y(When)g(y)m(ou)i(en)m(ter)f(a)h(line)f(in)g Fs(vi)f
+Ft(mo)s(de,)h(y)m(ou)h(are)f(already)h(placed)f(in)g(`insertion')g(mo)s
+(de,)g(as)h(if)f(y)m(ou)150 4765 y(had)c(t)m(yp)s(ed)g(an)g(`)p
+Fs(i)p Ft('.)39 b(Pressing)1215 4762 y Fk(h)p 1239 4709
+139 4 v 1239 4765 a Fj(ESC)p 1239 4781 V 1373 4762 a
+Fk(i)1429 4765 y Ft(switc)m(hes)27 b(y)m(ou)g(in)m(to)g(`command')f(mo)
+s(de,)h(where)f(y)m(ou)h(can)f(edit)h(the)150 4875 y(text)35
+b(of)f(the)g(line)g(with)f(the)h(standard)f Fs(vi)g Ft(mo)m(v)m(emen)m
+(t)j(k)m(eys,)g(mo)m(v)m(e)f(to)f(previous)g(history)f(lines)h(with)150
+4985 y(`)p Fs(k)p Ft(')d(and)e(subsequen)m(t)h(lines)h(with)f(`)p
+Fs(j)p Ft(',)g(and)g(so)h(forth.)p eop end
+%%Page: 20 24
+TeXDict begin 20 23 bop 150 -116 a Ft(20)2600 b(GNU)31
+b(Readline)g(Library)p eop end
+%%Page: 21 25
+TeXDict begin 21 24 bop 150 -116 a Ft(Chapter)30 b(2:)41
+b(Programming)30 b(with)g(GNU)h(Readline)1683 b(21)150
+299 y Fp(2)80 b(Programming)54 b(with)f(GNU)h(Readline)275
+527 y Ft(This)33 b(c)m(hapter)h(describ)s(es)f(the)h(in)m(terface)i(b)s
+(et)m(w)m(een)e(the)g Fm(gnu)g Ft(Readline)h(Library)e(and)g(other)h
+(pro-)150 637 y(grams.)k(If)22 b(y)m(ou)h(are)g(a)g(programmer,)h(and)d
+(y)m(ou)i(wish)f(to)h(include)f(the)h(features)g(found)e(in)h
+Fm(gnu)g Ft(Readline)150 746 y(suc)m(h)g(as)h(completion,)j(line)d
+(editing,)i(and)d(in)m(teractiv)m(e)j(history)e(manipulation)g(in)f(y)m
+(our)g(o)m(wn)h(programs,)150 856 y(this)30 b(section)i(is)e(for)g(y)m
+(ou.)150 1110 y Fr(2.1)68 b(Basic)45 b(Beha)l(vior)275
+1353 y Ft(Man)m(y)31 b(programs)f(pro)m(vide)h(a)g(command)f(line)h(in)
+m(terface,)h(suc)m(h)f(as)f Fs(mail)p Ft(,)g Fs(ftp)p
+Ft(,)g(and)g Fs(sh)p Ft(.)41 b(F)-8 b(or)31 b(suc)m(h)150
+1462 y(programs,)e(the)f(default)h(b)s(eha)m(viour)f(of)h(Readline)g
+(is)g(su\016cien)m(t.)40 b(This)28 b(section)i(describ)s(es)d(ho)m(w)i
+(to)g(use)150 1572 y(Readline)35 b(in)f(the)h(simplest)f(w)m(a)m(y)h(p)
+s(ossible,)h(p)s(erhaps)c(to)j(replace)h(calls)f(in)f(y)m(our)h(co)s
+(de)f(to)h Fs(gets\(\))e Ft(or)150 1682 y Fs(fgets\(\))p
+Ft(.)275 1815 y(The)f(function)g Fs(readline\(\))e Ft(prin)m(ts)i(a)g
+(prompt)g Fi(prompt)i Ft(and)e(then)g(reads)g(and)g(returns)f(a)i
+(single)150 1924 y(line)g(of)g(text)h(from)e(the)h(user.)47
+b(If)32 b Fi(prompt)i Ft(is)e Fs(NULL)g Ft(or)h(the)f(empt)m(y)i
+(string,)f(no)g(prompt)e(is)i(displa)m(y)m(ed.)150 2034
+y(The)k(line)g Fs(readline)e Ft(returns)h(is)h(allo)s(cated)i(with)e
+Fs(malloc\(\))p Ft(;)h(the)f(caller)i(should)d Fs(free\(\))f
+Ft(the)j(line)150 2144 y(when)29 b(it)i(has)f(\014nished)f(with)h(it.)
+42 b(The)29 b(declaration)j(for)f Fs(readline)d Ft(in)i(ANSI)g(C)g(is)
+390 2277 y Fs(char)47 b(*readline)e(\(const)h(char)h(*)p
+Fl(prompt)11 b Fs(\);)150 2410 y Ft(So,)31 b(one)f(migh)m(t)h(sa)m(y)
+390 2544 y Fs(char)47 b(*line)f(=)h(readline)f(\("Enter)g(a)h(line:)g
+("\);)150 2677 y Ft(in)23 b(order)f(to)h(read)g(a)g(line)h(of)f(text)h
+(from)e(the)h(user.)38 b(The)22 b(line)h(returned)f(has)g(the)h
+(\014nal)g(newline)g(remo)m(v)m(ed,)150 2787 y(so)31
+b(only)f(the)h(text)g(remains.)275 2920 y(If)40 b Fs(readline)e
+Ft(encoun)m(ters)j(an)f Fs(EOF)f Ft(while)i(reading)f(the)h(line,)j
+(and)39 b(the)i(line)g(is)f(empt)m(y)h(at)g(that)150
+3029 y(p)s(oin)m(t,)30 b(then)f Fs(\(char)g(*\)NULL)e
+Ft(is)j(returned.)39 b(Otherwise,)30 b(the)f(line)h(is)f(ended)g(just)g
+(as)g(if)h(a)f(newline)h(had)150 3139 y(b)s(een)g(t)m(yp)s(ed.)275
+3272 y(If)25 b(y)m(ou)h(w)m(an)m(t)h(the)f(user)f(to)i(b)s(e)e(able)h
+(to)h(get)g(at)g(the)f(line)g(later,)i(\(with)2651 3269
+y Fk(h)p 2675 3216 114 4 v 2675 3272 a Fj(C-p)p 2675
+3288 V 2784 3269 a Fk(i)2840 3272 y Ft(for)e(example\),)i(y)m(ou)e(m)m
+(ust)150 3382 y(call)32 b Fs(add_history\(\))26 b Ft(to)32
+b(sa)m(v)m(e)f(the)g(line)g(a)m(w)m(a)m(y)h(in)e(a)h
+Fi(history)38 b Ft(list)31 b(of)g(suc)m(h)f(lines.)390
+3515 y Fs(add_history)45 b(\(line\);)150 3649 y Ft(F)-8
+b(or)31 b(full)f(details)i(on)e(the)g(GNU)h(History)g(Library)-8
+b(,)31 b(see)g(the)f(asso)s(ciated)i(man)m(ual.)275 3782
+y(It)f(is)g(preferable)g(to)i(a)m(v)m(oid)f(sa)m(ving)h(empt)m(y)e
+(lines)h(on)f(the)h(history)f(list,)h(since)g(users)e(rarely)i(ha)m(v)m
+(e)h(a)150 3892 y(burning)28 b(need)h(to)i(reuse)e(a)h(blank)g(line.)40
+b(Here)31 b(is)e(a)h(function)g(whic)m(h)f(usefully)g(replaces)i(the)f
+(standard)150 4001 y Fs(gets\(\))f Ft(library)h(function,)g(and)g(has)g
+(the)g(adv)-5 b(an)m(tage)33 b(of)d(no)g(static)i(bu\013er)e(to)h(o)m
+(v)m(er\015o)m(w:)390 4134 y Fs(/*)47 b(A)h(static)e(variable)f(for)i
+(holding)f(the)h(line.)f(*/)390 4244 y(static)g(char)h(*line_read)e(=)i
+(\(char)g(*\)NULL;)390 4463 y(/*)g(Read)g(a)g(string,)f(and)h(return)f
+(a)i(pointer)d(to)j(it.)533 4573 y(Returns)e(NULL)h(on)g(EOF.)f(*/)390
+4682 y(char)h(*)390 4792 y(rl_gets)f(\(\))390 4902 y({)485
+5011 y(/*)i(If)f(the)g(buffer)f(has)h(already)f(been)g(allocated,)629
+5121 y(return)g(the)h(memory)f(to)h(the)g(free)f(pool.)h(*/)485
+5230 y(if)h(\(line_read\))581 5340 y({)p eop end
+%%Page: 22 26
+TeXDict begin 22 25 bop 150 -116 a Ft(22)2600 b(GNU)31
+b(Readline)g(Library)676 299 y Fs(free)47 b(\(line_read\);)676
+408 y(line_read)f(=)h(\(char)f(*\)NULL;)581 518 y(})485
+737 y(/*)i(Get)f(a)g(line)g(from)f(the)h(user.)g(*/)485
+847 y(line_read)f(=)h(readline)f(\(""\);)485 1066 y(/*)i(If)f(the)g
+(line)f(has)h(any)g(text)g(in)g(it,)629 1176 y(save)f(it)h(on)h(the)f
+(history.)e(*/)485 1285 y(if)j(\(line_read)d(&&)i(*line_read\))581
+1395 y(add_history)e(\(line_read\);)485 1614 y(return)i(\(line_read\);)
+390 1724 y(})275 1854 y Ft(This)22 b(function)i(giv)m(es)h(the)f(user)f
+(the)h(default)g(b)s(eha)m(viour)f(of)2338 1851 y Fk(h)p
+2362 1798 148 4 v 2362 1854 a Fj(T)-6 b(AB)p 2362 1870
+V 2506 1851 a Fk(i)2560 1854 y Ft(completion:)38 b(completion)25
+b(on)f(\014le)150 1964 y(names.)41 b(If)31 b(y)m(ou)g(do)f(not)h(w)m
+(an)m(t)g(Readline)h(to)f(complete)h(on)f(\014lenames,)g(y)m(ou)g(can)f
+(c)m(hange)i(the)f(binding)150 2074 y(of)g(the)410 2071
+y Fk(h)p 434 2018 V 434 2074 a Fj(T)-6 b(AB)p 434 2089
+V 578 2071 a Fk(i)638 2074 y Ft(k)m(ey)31 b(with)f Fs(rl_bind_key\(\))p
+Ft(.)390 2205 y Fs(int)47 b(rl_bind_key)e(\(int)h Fl(key)p
+Fs(,)h(rl_command_func_t)c(*)p Fl(function)11 b Fs(\);)275
+2335 y(rl_bind_key\(\))29 b Ft(tak)m(es)35 b(t)m(w)m(o)g(argumen)m(ts:)
+47 b Fi(k)m(ey)c Ft(is)33 b(the)h(c)m(haracter)h(that)f(y)m(ou)g(w)m
+(an)m(t)g(to)g(bind,)g(and)150 2445 y Fi(function)h Ft(is)h(the)g
+(address)f(of)h(the)g(function)g(to)g(call)h(when)e Fi(k)m(ey)44
+b Ft(is)36 b(pressed.)56 b(Binding)3257 2442 y Fk(h)p
+3281 2389 V 3281 2445 a Fj(T)-6 b(AB)p 3281 2460 V 3425
+2442 a Fk(i)3490 2445 y Ft(to)37 b Fs(rl_)150 2555 y(insert\(\))c
+Ft(mak)m(es)845 2552 y Fk(h)p 869 2499 V 869 2555 a Fj(T)-6
+b(AB)p 869 2570 V 1013 2552 a Fk(i)1077 2555 y Ft(insert)35
+b(itself.)56 b Fs(rl_bind_key\(\))32 b Ft(returns)h(non-zero)j(if)f
+Fi(k)m(ey)44 b Ft(is)35 b(not)g(a)h(v)-5 b(alid)150 2664
+y(ASCI)s(I)29 b(c)m(haracter)j(co)s(de)e(\(b)s(et)m(w)m(een)i(0)f(and)e
+(255\).)275 2795 y(Th)m(us,)g(to)i(disable)g(the)f(default)1407
+2792 y Fk(h)p 1431 2739 V 1431 2795 a Fj(T)-6 b(AB)p
+1431 2810 V 1575 2792 a Fk(i)1635 2795 y Ft(b)s(eha)m(vior,)31
+b(the)f(follo)m(wing)i(su\016ces:)390 2926 y Fs(rl_bind_key)45
+b(\('\\t',)h(rl_insert\);)275 3057 y Ft(This)25 b(co)s(de)i(should)e(b)
+s(e)h(executed)h(once)g(at)g(the)g(start)g(of)f(y)m(our)h(program;)g(y)
+m(ou)g(migh)m(t)g(write)g(a)g(func-)150 3166 y(tion)33
+b(called)h Fs(initialize_readline\(\))27 b Ft(whic)m(h)33
+b(p)s(erforms)e(this)h(and)h(other)g(desired)f(initializations,)150
+3276 y(suc)m(h)e(as)h(installing)g(custom)g(completers)g(\(see)g
+(Section)h(2.6)f([Custom)f(Completers],)h(page)g(41\).)150
+3523 y Fr(2.2)68 b(Custom)45 b(F)-11 b(unctions)275 3763
+y Ft(Readline)25 b(pro)m(vides)f(man)m(y)h(functions)f(for)g
+(manipulating)g(the)h(text)g(of)g(the)g(line,)h(but)e(it)h(isn't)f(p)s
+(ossi-)150 3873 y(ble)i(to)h(an)m(ticipate)i(the)e(needs)f(of)g(all)h
+(programs.)39 b(This)26 b(section)h(describ)s(es)f(the)g(v)-5
+b(arious)27 b(functions)f(and)150 3982 y(v)-5 b(ariables)27
+b(de\014ned)e(within)g(the)h(Readline)h(library)f(whic)m(h)g(allo)m(w)h
+(a)g(user)e(program)h(to)h(add)e(customized)150 4092
+y(functionalit)m(y)32 b(to)f(Readline.)275 4223 y(Before)37
+b(declaring)g(an)m(y)g(functions)f(that)h(customize)h(Readline's)f(b)s
+(eha)m(vior,)h(or)f(using)f(an)m(y)h(func-)150 4332 y(tionalit)m(y)48
+b(Readline)e(pro)m(vides)f(in)g(other)h(co)s(de,)k(an)45
+b(application)i(writer)e(should)g(include)g(the)h(\014le)150
+4442 y Fs(<readline/readline.h>)28 b Ft(in)33 b(an)m(y)h(\014le)f(that)
+h(uses)f(Readline's)h(features.)51 b(Since)33 b(some)h(of)g(the)f
+(de\014-)150 4552 y(nitions)e(in)g Fs(readline.h)d Ft(use)j(the)h
+Fs(stdio)d Ft(library)-8 b(,)32 b(the)f(\014le)h Fs(<stdio.h>)c
+Ft(should)i(b)s(e)h(included)f(b)s(efore)150 4661 y Fs(readline.h)p
+Ft(.)275 4792 y Fs(readline.h)d Ft(de\014nes)j(a)h(C)f(prepro)s(cessor)
+g(v)-5 b(ariable)31 b(that)g(should)f(b)s(e)g(treated)h(as)g(an)g(in)m
+(teger,)h Fs(RL_)150 4902 y(READLINE_VERSION)p Ft(,)20
+b(whic)m(h)h(ma)m(y)i(b)s(e)f(used)f(to)i(conditionally)h(compile)f
+(application)g(co)s(de)f(dep)s(ending)150 5011 y(on)35
+b(the)g(installed)h(Readline)f(v)m(ersion.)56 b(The)34
+b(v)-5 b(alue)35 b(is)h(a)f(hexadecimal)h(enco)s(ding)f(of)g(the)h(ma)5
+b(jor)35 b(and)150 5121 y(minor)f(v)m(ersion)g(n)m(um)m(b)s(ers)f(of)h
+(the)h(library)-8 b(,)35 b(of)f(the)h(form)e(0x)p Fi(MMmm)p
+Ft(.)53 b Fi(MM)45 b Ft(is)34 b(the)g(t)m(w)m(o-digit)j(ma)5
+b(jor)150 5230 y(v)m(ersion)29 b(n)m(um)m(b)s(er;)g Fi(mm)f
+Ft(is)h(the)g(t)m(w)m(o-digit)j(minor)c(v)m(ersion)i(n)m(um)m(b)s(er.)
+38 b(F)-8 b(or)30 b(Readline)g(4.2,)g(for)f(example,)150
+5340 y(the)i(v)-5 b(alue)30 b(of)h Fs(RL_READLINE_VERSION)25
+b Ft(w)m(ould)30 b(b)s(e)g Fs(0x0402)p Ft(.)p eop end
+%%Page: 23 27
+TeXDict begin 23 26 bop 150 -116 a Ft(Chapter)30 b(2:)41
+b(Programming)30 b(with)g(GNU)h(Readline)1683 b(23)150
+299 y Fh(2.2.1)63 b(Readline)40 b(T)m(yp)s(edefs)275
+540 y Ft(F)-8 b(or)31 b(readabilt)m(y)-8 b(,)32 b(w)m(e)f(declare)g(a)g
+(n)m(um)m(b)s(er)e(of)h(new)g(ob)5 b(ject)32 b(t)m(yp)s(es,)e(all)h(p)s
+(oin)m(ters)g(to)g(functions.)275 672 y(The)k(reason)h(for)f(declaring)
+h(these)h(new)e(t)m(yp)s(es)g(is)h(to)h(mak)m(e)f(it)g(easier)h(to)f
+(write)g(co)s(de)g(describing)150 782 y(p)s(oin)m(ters)30
+b(to)h(C)f(functions)g(with)g(appropriately)h(protot)m(yp)s(ed)f
+(argumen)m(ts)h(and)f(return)f(v)-5 b(alues.)275 913
+y(F)d(or)37 b(instance,)j(sa)m(y)d(w)m(e)g(w)m(an)m(t)h(to)g(declare)f
+(a)h(v)-5 b(ariable)37 b Fi(func)42 b Ft(as)37 b(a)g(p)s(oin)m(ter)g
+(to)g(a)h(function)e(whic)m(h)150 1023 y(tak)m(es)27
+b(t)m(w)m(o)g Fs(int)e Ft(argumen)m(ts)h(and)f(returns)f(an)i
+Fs(int)f Ft(\(this)h(is)f(the)h(t)m(yp)s(e)g(of)g(all)h(of)e(the)h
+(Readline)h(bindable)150 1132 y(functions\).)41 b(Instead)30
+b(of)g(the)h(classic)h(C)e(declaration)275 1264 y Fs(int)f
+(\(*func\)\(\);)150 1396 y Ft(or)h(the)h(ANSI-C)f(st)m(yle)i
+(declaration)275 1528 y Fs(int)d(\(*func\)\(int,)e(int\);)150
+1659 y Ft(w)m(e)k(ma)m(y)g(write)275 1791 y Fs(rl_command_func_t)25
+b(*func;)275 1923 y Ft(The)k(full)h(list)i(of)e(function)g(p)s(oin)m
+(ter)g(t)m(yp)s(es)h(a)m(v)-5 b(ailable)33 b(is)150 2077
+y Fs(typedef)28 b(int)i(rl_command_func_t)c(\(int,)i(int\);)150
+2186 y(typedef)g(char)i(*rl_compentry_func_t)24 b(\(const)29
+b(char)g(*,)h(int\);)150 2296 y(typedef)e(char)i
+(**rl_completion_func_t)24 b(\(const)29 b(char)g(*,)h(int,)f(int\);)150
+2405 y(typedef)f(char)i(*rl_quote_func_t)c(\(char)i(*,)i(int,)f(char)h
+(*\);)150 2515 y(typedef)e(char)i(*rl_dequote_func_t)25
+b(\(char)k(*,)h(int\);)150 2625 y(typedef)e(int)i(rl_compignore_func_t)
+25 b(\(char)k(**\);)150 2734 y(typedef)f(void)i(rl_compdisp_func_t)25
+b(\(char)k(**,)g(int,)h(int\);)150 2844 y(typedef)e(int)i
+(rl_hook_func_t)c(\(void\);)150 2953 y(typedef)i(int)i(rl_getc_func_t)c
+(\(FILE)j(*\);)150 3063 y(typedef)f(int)i(rl_linebuf_func_t)c(\(char)i
+(*,)i(int\);)150 3173 y(typedef)e(int)i(rl_intfunc_t)d(\(int\);)150
+3282 y(#define)h(rl_ivoidfunc_t)f(rl_hook_func_t)150
+3392 y(typedef)h(int)i(rl_icpfunc_t)d(\(char)i(*\);)150
+3501 y(typedef)f(int)i(rl_icppfunc_t)d(\(char)i(**\);)150
+3611 y(typedef)f(void)i(rl_voidfunc_t)c(\(void\);)150
+3720 y(typedef)i(void)i(rl_vintfunc_t)c(\(int\);)150
+3830 y(typedef)i(void)i(rl_vcpfunc_t)d(\(char)i(*\);)150
+3940 y(typedef)f(void)i(rl_vcppfunc_t)c(\(char)j(**\);)150
+4133 y Fh(2.2.2)63 b(W)-10 b(riting)41 b(a)f(New)h(F)-10
+b(unction)275 4375 y Ft(In)31 b(order)h(to)g(write)h(new)e(functions)h
+(for)g(Readline,)i(y)m(ou)e(need)g(to)h(kno)m(w)f(the)g(calling)i(con)m
+(v)m(en)m(tions)150 4484 y(for)j(k)m(eyb)s(oard-in)m(v)m(ok)m(ed)h
+(functions,)g(and)e(the)h(names)g(of)g(the)g(v)-5 b(ariables)38
+b(that)f(describ)s(e)f(the)h(curren)m(t)150 4594 y(state)32
+b(of)e(the)h(line)g(read)f(so)g(far.)275 4726 y(The)f(calling)j
+(sequence)f(for)f(a)h(command)f Fs(foo)g Ft(lo)s(oks)g(lik)m(e)390
+4857 y Fs(int)47 b(foo)g(\(int)f(count,)h(int)f(key\))150
+4989 y Ft(where)35 b Fi(coun)m(t)k Ft(is)d(the)g(n)m(umeric)g(argumen)m
+(t)g(\(or)g(1)g(if)g(defaulted\))h(and)e Fi(k)m(ey)44
+b Ft(is)36 b(the)g(k)m(ey)h(that)f(in)m(v)m(ok)m(ed)150
+5099 y(this)30 b(function.)275 5230 y(It)23 b(is)g(completely)h(up)e
+(to)i(the)f(function)g(as)g(to)h(what)f(should)f(b)s(e)h(done)f(with)h
+(the)g(n)m(umeric)g(argumen)m(t.)150 5340 y(Some)40 b(functions)g(use)f
+(it)i(as)f(a)g(rep)s(eat)h(coun)m(t,)i(some)d(as)h(a)f(\015ag,)j(and)c
+(others)h(to)h(c)m(ho)s(ose)g(alternate)p eop end
+%%Page: 24 28
+TeXDict begin 24 27 bop 150 -116 a Ft(24)2600 b(GNU)31
+b(Readline)g(Library)150 299 y(b)s(eha)m(vior)43 b(\(refreshing)g(the)h
+(curren)m(t)f(line)h(as)f(opp)s(osed)g(to)h(refreshing)e(the)i(screen,)
+j(for)c(example\).)150 408 y(Some)33 b(c)m(ho)s(ose)h(to)g(ignore)g
+(it.)50 b(In)32 b(general,)j(if)f(a)f(function)g(uses)g(the)g(n)m
+(umeric)g(argumen)m(t)h(as)f(a)h(rep)s(eat)150 518 y(coun)m(t,)29
+b(it)g(should)e(b)s(e)g(able)h(to)h(do)f(something)g(useful)f(with)h(b)
+s(oth)f(negativ)m(e)j(and)d(p)s(ositiv)m(e)i(argumen)m(ts.)150
+628 y(A)m(t)i(the)g(v)m(ery)g(least,)h(it)e(should)g(b)s(e)g(a)m(w)m
+(are)h(that)g(it)g(can)g(b)s(e)f(passed)g(a)g(negativ)m(e)j(argumen)m
+(t.)275 759 y(A)27 b(command)h(function)f(should)g(return)g(0)h(if)g
+(its)g(action)h(completes)g(successfully)-8 b(,)29 b(and)e(a)h
+(non-zero)150 869 y(v)-5 b(alue)40 b(if)f(some)g(error)g(o)s(ccurs.)67
+b(This)38 b(is)h(the)g(con)m(v)m(en)m(tion)j(ob)s(ey)m(ed)d(b)m(y)g
+(all)h(of)f(the)h(builtin)e(Readline)150 978 y(bindable)30
+b(command)g(functions.)150 1226 y Fr(2.3)68 b(Readline)47
+b(V)-11 b(ariables)275 1467 y Ft(These)30 b(v)-5 b(ariables)31
+b(are)f(a)m(v)-5 b(ailable)33 b(to)e(function)f(writers.)3371
+1641 y([V)-8 b(ariable])-3598 b Fg(char)39 b(*)g Ff(rl)p
+575 1641 35 5 v 50 w(line)p 806 1641 V 50 w(bu\013er)390
+1751 y Ft(This)30 b(is)i(the)f(line)g(gathered)h(so)f(far.)43
+b(Y)-8 b(ou)32 b(are)f(w)m(elcome)i(to)f(mo)s(dify)f(the)g(con)m(ten)m
+(ts)i(of)e(the)g(line,)390 1861 y(but)k(see)h(Section)g(2.4.5)h([Allo)m
+(wing)h(Undoing],)f(page)f(32.)57 b(The)35 b(function)g
+Fs(rl_extend_line_)390 1970 y(buffer)29 b Ft(is)h(a)m(v)-5
+b(ailable)33 b(to)e(increase)g(the)g(memory)f(allo)s(cated)i(to)f
+Fs(rl_line_buffer)p Ft(.)3371 2145 y([V)-8 b(ariable])-3598
+b Fg(int)39 b Ff(rl)p 432 2145 V 51 w(p)s(oin)m(t)390
+2254 y Ft(The)30 b(o\013set)h(of)g(the)f(curren)m(t)h(cursor)e(p)s
+(osition)i(in)f Fs(rl_line_buffer)c Ft(\(the)31 b Fn(p)-5
+b(oint)9 b Ft(\).)3371 2429 y([V)-8 b(ariable])-3598
+b Fg(int)39 b Ff(rl)p 432 2429 V 51 w(end)390 2539 y
+Ft(The)27 b(n)m(um)m(b)s(er)g(of)h(c)m(haracters)h(presen)m(t)f(in)g
+Fs(rl_line_buffer)p Ft(.)36 b(When)27 b Fs(rl_point)f
+Ft(is)i(at)h(the)f(end)390 2648 y(of)j(the)f(line,)h
+Fs(rl_point)d Ft(and)i Fs(rl_end)f Ft(are)h(equal.)3371
+2823 y([V)-8 b(ariable])-3598 b Fg(int)39 b Ff(rl)p 432
+2823 V 51 w(mark)390 2932 y Ft(The)d Fi(mark)42 b Ft(\(sa)m(v)m(ed)d(p)
+s(osition\))e(in)g(the)g(curren)m(t)f(line.)61 b(If)36
+b(set,)k(the)d(mark)f(and)h(p)s(oin)m(t)f(de\014ne)h(a)390
+3042 y Fn(r)-5 b(e)g(gion)p Ft(.)3371 3217 y([V)d(ariable])-3598
+b Fg(int)39 b Ff(rl)p 432 3217 V 51 w(done)390 3326 y
+Ft(Setting)22 b(this)g(to)g(a)g(non-zero)g(v)-5 b(alue)23
+b(causes)f(Readline)g(to)g(return)f(the)h(curren)m(t)f(line)h
+(immediately)-8 b(.)3371 3501 y([V)g(ariable])-3598 b
+Fg(int)39 b Ff(rl)p 432 3501 V 51 w(n)m(um)p 703 3501
+V 50 w(c)m(hars)p 1013 3501 V 49 w(to)p 1164 3501 V 51
+w(read)390 3611 y Ft(Setting)34 b(this)e(to)i(a)f(p)s(ositiv)m(e)h(v)-5
+b(alue)34 b(b)s(efore)e(calling)i Fs(readline\(\))d Ft(causes)i
+(Readline)g(to)h(return)390 3720 y(after)i(accepting)h(that)g(man)m(y)e
+(c)m(haracters,)k(rather)d(than)f(reading)h(up)e(to)j(a)f(c)m(haracter)
+h(b)s(ound)390 3830 y(to)31 b Fs(accept-line)p Ft(.)3371
+4004 y([V)-8 b(ariable])-3598 b Fg(int)39 b Ff(rl)p 432
+4004 V 51 w(p)s(ending)p 884 4004 V 48 w(input)390 4114
+y Ft(Setting)26 b(this)f(to)h(a)f(v)-5 b(alue)26 b(mak)m(es)g(it)g(the)
+f(next)g(k)m(eystrok)m(e)i(read.)39 b(This)24 b(is)i(a)f(w)m(a)m(y)h
+(to)g(stu\013)f(a)g(single)390 4224 y(c)m(haracter)32
+b(in)m(to)f(the)g(input)e(stream.)3371 4398 y([V)-8 b(ariable])-3598
+b Fg(int)39 b Ff(rl)p 432 4398 V 51 w(dispatc)m(hing)390
+4508 y Ft(Set)24 b(to)h(a)g(non-zero)g(v)-5 b(alue)24
+b(if)h(a)f(function)g(is)g(b)s(eing)g(called)i(from)d(a)i(k)m(ey)g
+(binding;)g(zero)g(otherwise.)390 4617 y(Application)37
+b(functions)e(can)h(test)h(this)e(to)i(disco)m(v)m(er)g(whether)e(they)
+h(w)m(ere)g(called)h(directly)f(or)390 4727 y(b)m(y)30
+b(Readline's)h(dispatc)m(hing)g(mec)m(hanism.)3371 4902
+y([V)-8 b(ariable])-3598 b Fg(int)39 b Ff(rl)p 432 4902
+V 51 w(erase)p 737 4902 V 49 w(empt)m(y)p 1100 4902 V
+50 w(line)390 5011 y Ft(Setting)47 b(this)e(to)i(a)f(non-zero)h(v)-5
+b(alue)46 b(causes)h(Readline)f(to)h(completely)g(erase)g(the)f(curren)
+m(t)390 5121 y(line,)f(including)c(an)m(y)g(prompt,)j(an)m(y)d(time)h
+(a)g(newline)f(is)h(t)m(yp)s(ed)f(as)g(the)h(only)f(c)m(haracter)i(on)
+390 5230 y(an)36 b(otherwise-empt)m(y)i(line.)58 b(The)36
+b(cursor)g(is)g(mo)m(v)m(ed)h(to)g(the)g(b)s(eginning)e(of)i(the)f
+(newly-blank)390 5340 y(line.)p eop end
+%%Page: 25 29
+TeXDict begin 25 28 bop 150 -116 a Ft(Chapter)30 b(2:)41
+b(Programming)30 b(with)g(GNU)h(Readline)1683 b(25)3371
+299 y([V)-8 b(ariable])-3598 b Fg(char)39 b(*)g Ff(rl)p
+575 299 35 5 v 50 w(prompt)390 408 y Ft(The)26 b(prompt)f(Readline)i
+(uses.)38 b(This)26 b(is)g(set)h(from)e(the)i(argumen)m(t)f(to)h
+Fs(readline\(\))p Ft(,)d(and)i(should)390 518 y(not)h(b)s(e)f(assigned)
+h(to)h(directly)-8 b(.)41 b(The)26 b Fs(rl_set_prompt\(\))d
+Ft(function)j(\(see)i(Section)g(2.4.6)h([Redis-)390 628
+y(pla)m(y],)i(page)h(32\))f(ma)m(y)g(b)s(e)f(used)f(to)j(mo)s(dify)d
+(the)i(prompt)e(string)h(after)h(calling)h Fs(readline\(\))p
+Ft(.)3371 825 y([V)-8 b(ariable])-3598 b Fg(int)39 b
+Ff(rl)p 432 825 V 51 w(already)p 851 825 V 49 w(prompted)390
+934 y Ft(If)d(an)g(application)i(wishes)d(to)i(displa)m(y)g(the)f
+(prompt)g(itself,)i(rather)f(than)f(ha)m(v)m(e)h(Readline)g(do)390
+1044 y(it)c(the)g(\014rst)f(time)i Fs(readline\(\))c
+Ft(is)i(called,)j(it)e(should)f(set)h(this)g(v)-5 b(ariable)34
+b(to)f(a)g(non-zero)g(v)-5 b(alue)390 1154 y(after)38
+b(displa)m(ying)h(the)f(prompt.)63 b(The)37 b(prompt)g(m)m(ust)h(also)h
+(b)s(e)e(passed)g(as)i(the)f(argumen)m(t)g(to)390 1263
+y Fs(readline\(\))30 b Ft(so)j(the)h(redispla)m(y)f(functions)f(can)i
+(up)s(date)e(the)h(displa)m(y)g(prop)s(erly)-8 b(.)48
+b(The)32 b(calling)390 1373 y(application)g(is)e(resp)s(onsible)g(for)g
+(managing)h(the)f(v)-5 b(alue;)31 b(Readline)g(nev)m(er)g(sets)g(it.)
+3371 1570 y([V)-8 b(ariable])-3598 b Fg(const)40 b(char)f(*)g
+Ff(rl)p 875 1570 V 50 w(library)p 1263 1570 V 50 w(v)m(ersion)390
+1680 y Ft(The)30 b(v)m(ersion)h(n)m(um)m(b)s(er)e(of)h(this)h(revision)
+f(of)h(the)f(library)-8 b(.)3371 1877 y([V)g(ariable])-3598
+b Fg(int)39 b Ff(rl)p 432 1877 V 51 w(readline)p 884
+1877 V 48 w(v)m(ersion)390 1987 y Ft(An)34 b(in)m(teger)h(enco)s(ding)f
+(the)g(curren)m(t)g(v)m(ersion)h(of)f(the)g(library)-8
+b(.)52 b(The)34 b(enco)s(ding)g(is)g(of)g(the)g(form)390
+2096 y(0x)p Fi(MMmm)p Ft(,)39 b(where)d Fi(MM)47 b Ft(is)36
+b(the)h(t)m(w)m(o-digit)i(ma)5 b(jor)36 b(v)m(ersion)h(n)m(um)m(b)s
+(er,)g(and)f Fi(mm)g Ft(is)h(the)f(t)m(w)m(o-)390 2206
+y(digit)i(minor)f(v)m(ersion)h(n)m(um)m(b)s(er.)60 b(F)-8
+b(or)38 b(example,)i(for)d(Readline-4.2,)k Fs(rl_readline_version)390
+2315 y Ft(w)m(ould)30 b(ha)m(v)m(e)i(the)e(v)-5 b(alue)31
+b(0x0402.)3371 2513 y([V)-8 b(ariable])-3598 b Fg(int)39
+b Ff(rl)p 432 2513 V 51 w(gn)m(u)p 665 2513 V 49 w(readline)p
+1115 2513 V 49 w(p)390 2622 y Ft(Alw)m(a)m(ys)32 b(set)f(to)g(1,)g
+(denoting)f(that)h(this)g(is)f Fm(gnu)g Ft(readline)h(rather)f(than)g
+(some)h(em)m(ulation.)3371 2819 y([V)-8 b(ariable])-3598
+b Fg(const)40 b(char)f(*)g Ff(rl)p 875 2819 V 50 w(terminal)p
+1349 2819 V 49 w(name)390 2929 y Ft(The)28 b(terminal)g(t)m(yp)s(e,)h
+(used)e(for)h(initialization.)43 b(If)28 b(not)g(set)h(b)m(y)e(the)i
+(application,)h(Readline)f(sets)390 3039 y(this)h(to)h(the)g(v)-5
+b(alue)31 b(of)f(the)h Fs(TERM)e Ft(en)m(vironmen)m(t)i(v)-5
+b(ariable)31 b(the)g(\014rst)e(time)j(it)e(is)h(called.)3371
+3236 y([V)-8 b(ariable])-3598 b Fg(const)40 b(char)f(*)g
+Ff(rl)p 875 3236 V 50 w(readline)p 1326 3236 V 48 w(name)390
+3345 y Ft(This)30 b(v)-5 b(ariable)32 b(is)g(set)f(to)h(a)g(unique)e
+(name)h(b)m(y)g(eac)m(h)i(application)f(using)f(Readline.)44
+b(The)30 b(v)-5 b(alue)390 3455 y(allo)m(ws)29 b(conditional)h(parsing)
+d(of)h(the)h(inputrc)e(\014le)h(\(see)h(Section)g(1.3.2)g([Conditional)
+g(Init)f(Con-)390 3565 y(structs],)j(page)g(9\).)3371
+3762 y([V)-8 b(ariable])-3598 b Fg(FILE)39 b(*)g Ff(rl)p
+575 3762 V 50 w(instream)390 3871 y Ft(The)h(stdio)i(stream)f(from)g
+(whic)m(h)f(Readline)i(reads)f(input.)71 b(If)41 b Fs(NULL)p
+Ft(,)i(Readline)e(defaults)g(to)390 3981 y Fi(stdin)p
+Ft(.)3371 4178 y([V)-8 b(ariable])-3598 b Fg(FILE)39
+b(*)g Ff(rl)p 575 4178 V 50 w(outstream)390 4288 y Ft(The)34
+b(stdio)h(stream)f(to)i(whic)m(h)e(Readline)h(p)s(erforms)e(output.)52
+b(If)34 b Fs(NULL)p Ft(,)h(Readline)g(defaults)f(to)390
+4398 y Fi(stdout)p Ft(.)3371 4595 y([V)-8 b(ariable])-3598
+b Fg(int)39 b Ff(rl)p 432 4595 V 51 w(prefer)p 782 4595
+V 49 w(en)m(v)p 1005 4595 V 50 w(winsize)390 4704 y Ft(If)28
+b(non-zero,)h(Readline)g(giv)m(es)h(v)-5 b(alues)29 b(found)e(in)h(the)
+g Fs(LINES)f Ft(and)h Fs(COLUMNS)e Ft(en)m(vironmen)m(t)j(v)-5
+b(ari-)390 4814 y(ables)41 b(greater)h(precedence)g(than)e(v)-5
+b(alues)41 b(fetc)m(hed)h(from)e(the)h(k)m(ernel)h(when)e(computing)h
+(the)390 4924 y(screen)30 b(dimensions.)3371 5121 y([V)-8
+b(ariable])-3598 b Fg(rl_command_func_t)43 b(*)c Ff(rl)p
+1255 5121 V 50 w(last)p 1483 5121 V 50 w(func)390 5230
+y Ft(The)34 b(address)g(of)h(the)g(last)h(command)e(function)g
+(Readline)i(executed.)55 b(Ma)m(y)35 b(b)s(e)g(used)f(to)h(test)390
+5340 y(whether)30 b(or)g(not)h(a)f(function)h(is)f(b)s(eing)g(executed)
+h(t)m(wice)h(in)e(succession,)h(for)f(example.)p eop
+end
+%%Page: 26 30
+TeXDict begin 26 29 bop 150 -116 a Ft(26)2600 b(GNU)31
+b(Readline)g(Library)3371 299 y([V)-8 b(ariable])-3598
+b Fg(rl_hook_func_t)42 b(*)d Ff(rl)p 1098 299 35 5 v
+50 w(startup)p 1514 299 V 49 w(ho)s(ok)390 408 y Ft(If)34
+b(non-zero,)i(this)e(is)h(the)f(address)f(of)i(a)g(function)f(to)h
+(call)g(just)f(b)s(efore)g Fs(readline)e Ft(prin)m(ts)i(the)390
+518 y(\014rst)c(prompt.)3371 704 y([V)-8 b(ariable])-3598
+b Fg(rl_hook_func_t)42 b(*)d Ff(rl)p 1098 704 V 50 w(pre)p
+1312 704 V 50 w(input)p 1631 704 V 49 w(ho)s(ok)390 814
+y Ft(If)c(non-zero,)j(this)d(is)g(the)h(address)f(of)g(a)h(function)f
+(to)i(call)f(after)g(the)g(\014rst)f(prompt)f(has)i(b)s(een)390
+924 y(prin)m(ted)30 b(and)g(just)f(b)s(efore)h Fs(readline)f
+Ft(starts)h(reading)h(input)e(c)m(haracters.)3371 1110
+y([V)-8 b(ariable])-3598 b Fg(rl_hook_func_t)42 b(*)d
+Ff(rl)p 1098 1110 V 50 w(ev)m(en)m(t)p 1417 1110 V 49
+w(ho)s(ok)390 1219 y Ft(If)h(non-zero,)k(this)d(is)f(the)h(address)f
+(of)h(a)g(function)f(to)h(call)h(p)s(erio)s(dically)f(when)f(Readline)h
+(is)390 1329 y(w)m(aiting)30 b(for)f(terminal)h(input.)39
+b(By)30 b(default,)g(this)f(will)g(b)s(e)g(called)h(at)g(most)f(ten)h
+(times)f(a)h(second)390 1439 y(if)g(there)h(is)f(no)h(k)m(eyb)s(oard)f
+(input.)3371 1625 y([V)-8 b(ariable])-3598 b Fg(rl_getc_func_t)42
+b(*)d Ff(rl)p 1098 1625 V 50 w(getc)p 1354 1625 V 50
+w(function)390 1734 y Ft(If)30 b(non-zero,)h(Readline)g(will)g(call)h
+(indirectly)e(through)g(this)h(p)s(oin)m(ter)f(to)h(get)h(a)e(c)m
+(haracter)i(from)390 1844 y(the)39 b(input)e(stream.)65
+b(By)39 b(default,)i(it)e(is)f(set)h(to)g Fs(rl_getc)p
+Ft(,)g(the)g(default)f(Readline)h(c)m(haracter)390 1954
+y(input)29 b(function)h(\(see)i(Section)f(2.4.8)h([Character)f(Input],)
+f(page)h(34\).)3371 2140 y([V)-8 b(ariable])-3598 b Fg(rl_voidfunc_t)42
+b(*)d Ff(rl)p 1046 2140 V 50 w(redispla)m(y)p 1546 2140
+V 49 w(function)390 2250 y Ft(If)d(non-zero,)i(Readline)e(will)h(call)g
+(indirectly)f(through)g(this)g(p)s(oin)m(ter)g(to)g(up)s(date)g(the)g
+(displa)m(y)390 2359 y(with)27 b(the)g(curren)m(t)g(con)m(ten)m(ts)h
+(of)f(the)h(editing)f(bu\013er.)39 b(By)27 b(default,)h(it)g(is)f(set)g
+(to)h Fs(rl_redisplay)p Ft(,)390 2469 y(the)j(default)f(Readline)h
+(redispla)m(y)g(function)f(\(see)h(Section)g(2.4.6)h([Redispla)m(y],)g
+(page)f(32\).)3371 2655 y([V)-8 b(ariable])-3598 b Fg(rl_vintfunc_t)42
+b(*)d Ff(rl)p 1046 2655 V 50 w(prep)p 1324 2655 V 49
+w(term)p 1613 2655 V 51 w(function)390 2765 y Ft(If)24
+b(non-zero,)i(Readline)e(will)h(call)g(indirectly)g(through)e(this)h(p)
+s(oin)m(ter)g(to)h(initialize)h(the)e(terminal.)390 2874
+y(The)37 b(function)f(tak)m(es)j(a)e(single)h(argumen)m(t,)i(an)d
+Fs(int)f Ft(\015ag)h(that)h(sa)m(ys)g(whether)e(or)h(not)g(to)h(use)390
+2984 y(eigh)m(t-bit)e(c)m(haracters.)53 b(By)35 b(default,)g(this)f(is)
+g(set)h(to)g Fs(rl_prep_terminal)29 b Ft(\(see)35 b(Section)g(2.4.9)390
+3093 y([T)-8 b(erminal)31 b(Managemen)m(t],)i(page)e(35\).)3371
+3280 y([V)-8 b(ariable])-3598 b Fg(rl_voidfunc_t)42 b(*)d
+Ff(rl)p 1046 3280 V 50 w(deprep)p 1441 3280 V 49 w(term)p
+1730 3280 V 50 w(function)390 3389 y Ft(If)d(non-zero,)j(Readline)e
+(will)g(call)h(indirectly)f(through)f(this)g(p)s(oin)m(ter)h(to)g
+(reset)g(the)g(terminal.)390 3499 y(This)d(function)h(should)f(undo)g
+(the)h(e\013ects)h(of)f Fs(rl_prep_term_function)p Ft(.)49
+b(By)35 b(default,)i(this)390 3608 y(is)30 b(set)h(to)g
+Fs(rl_deprep_terminal)26 b Ft(\(see)31 b(Section)g(2.4.9)i([T)-8
+b(erminal)30 b(Managemen)m(t],)j(page)e(35\).)3371 3795
+y([V)-8 b(ariable])-3598 b Fg(Keymap)40 b Ff(rl)p 589
+3795 V 50 w(executing)p 1118 3795 V 49 w(k)m(eymap)390
+3904 y Ft(This)35 b(v)-5 b(ariable)37 b(is)f(set)g(to)h(the)f(k)m
+(eymap)h(\(see)g(Section)f(2.4.2)i([Keymaps],)g(page)e(28\))i(in)d
+(whic)m(h)390 4014 y(the)c(curren)m(tly)f(executing)i(readline)e
+(function)g(w)m(as)h(found.)3371 4200 y([V)-8 b(ariable])-3598
+b Fg(Keymap)40 b Ff(rl)p 589 4200 V 50 w(binding)p 1016
+4200 V 49 w(k)m(eymap)390 4310 y Ft(This)35 b(v)-5 b(ariable)37
+b(is)f(set)g(to)h(the)f(k)m(eymap)h(\(see)g(Section)f(2.4.2)i
+([Keymaps],)g(page)e(28\))i(in)d(whic)m(h)390 4419 y(the)c(last)g(k)m
+(ey)g(binding)e(o)s(ccurred.)3371 4606 y([V)-8 b(ariable])-3598
+b Fg(char)39 b(*)g Ff(rl)p 575 4606 V 50 w(executing)p
+1104 4606 V 49 w(macro)390 4715 y Ft(This)30 b(v)-5 b(ariable)31
+b(is)f(set)h(to)g(the)g(text)g(of)g(an)m(y)f(curren)m(tly-executing)i
+(macro.)3371 4902 y([V)-8 b(ariable])-3598 b Fg(int)39
+b Ff(rl)p 432 4902 V 51 w(readline)p 884 4902 V 48 w(state)390
+5011 y Ft(A)c(v)-5 b(ariable)35 b(with)f(bit)g(v)-5 b(alues)35
+b(that)g(encapsulate)h(the)e(curren)m(t)h(Readline)g(state.)54
+b(A)34 b(bit)h(is)f(set)390 5121 y(with)k(the)g Fs(RL_SETSTATE)c
+Ft(macro,)41 b(and)c(unset)h(with)f(the)h Fs(RL_UNSETSTATE)d
+Ft(macro.)63 b(Use)39 b(the)390 5230 y Fs(RL_ISSTATE)34
+b Ft(macro)k(to)g(test)g(whether)f(a)h(particular)f(state)i(bit)e(is)g
+(set.)62 b(Curren)m(t)36 b(state)j(bits)390 5340 y(include:)p
+eop end
+%%Page: 27 31
+TeXDict begin 27 30 bop 150 -116 a Ft(Chapter)30 b(2:)41
+b(Programming)30 b(with)g(GNU)h(Readline)1683 b(27)390
+299 y Fs(RL_STATE_NONE)870 408 y Ft(Readline)31 b(has)f(not)h(y)m(et)g
+(b)s(een)f(called,)i(nor)e(has)g(it)h(b)s(egun)e(to)i(in)m(tialize.)390
+555 y Fs(RL_STATE_INITIALIZING)870 664 y Ft(Readline)g(is)f
+(initializing)j(its)e(in)m(ternal)g(data)g(structures.)390
+810 y Fs(RL_STATE_INITIALIZED)870 920 y Ft(Readline)g(has)f(completed)h
+(its)g(initialization.)390 1066 y Fs(RL_STATE_TERMPREPPED)870
+1176 y Ft(Readline)e(has)g(mo)s(di\014ed)e(the)i(terminal)g(mo)s(des)f
+(to)i(do)e(its)i(o)m(wn)e(input)g(and)g(redis-)870 1285
+y(pla)m(y)-8 b(.)390 1431 y Fs(RL_STATE_READCMD)870 1541
+y Ft(Readline)31 b(is)f(reading)h(a)g(command)f(from)g(the)g(k)m(eyb)s
+(oard.)390 1687 y Fs(RL_STATE_METANEXT)870 1797 y Ft(Readline)h(is)f
+(reading)h(more)f(input)g(after)h(reading)f(the)h(meta-pre\014x)f(c)m
+(haracter.)390 1943 y Fs(RL_STATE_DISPATCHING)870 2052
+y Ft(Readline)h(is)f(dispatc)m(hing)h(to)g(a)g(command.)390
+2198 y Fs(RL_STATE_MOREINPUT)870 2308 y Ft(Readline)g(is)f(reading)h
+(more)f(input)g(while)g(executing)i(an)e(editing)h(command.)390
+2454 y Fs(RL_STATE_ISEARCH)870 2564 y Ft(Readline)g(is)f(p)s(erforming)
+g(an)g(incremen)m(tal)i(history)e(searc)m(h.)390 2710
+y Fs(RL_STATE_NSEARCH)870 2819 y Ft(Readline)h(is)f(p)s(erforming)g(a)g
+(non-incremen)m(tal)i(history)e(searc)m(h.)390 2966 y
+Fs(RL_STATE_SEARCH)870 3075 y Ft(Readline)21 b(is)f(searc)m(hing)i(bac)
+m(kw)m(ard)e(or)h(forw)m(ard)e(through)h(the)h(history)f(for)g(a)h
+(string.)390 3221 y Fs(RL_STATE_NUMERICARG)870 3331 y
+Ft(Readline)31 b(is)f(reading)h(a)g(n)m(umeric)f(argumen)m(t.)390
+3477 y Fs(RL_STATE_MACROINPUT)870 3587 y Ft(Readline)25
+b(is)f(curren)m(tly)g(getting)i(its)f(input)e(from)h(a)g
+(previously-de\014ned)f(k)m(eyb)s(oard)870 3696 y(macro.)390
+3842 y Fs(RL_STATE_MACRODEF)870 3952 y Ft(Readline)31
+b(is)f(curren)m(tly)h(reading)f(c)m(haracters)i(de\014ning)e(a)g(k)m
+(eyb)s(oard)h(macro.)390 4098 y Fs(RL_STATE_OVERWRITE)870
+4208 y Ft(Readline)g(is)f(in)g(o)m(v)m(erwrite)i(mo)s(de.)390
+4354 y Fs(RL_STATE_COMPLETING)870 4463 y Ft(Readline)f(is)f(p)s
+(erforming)g(w)m(ord)g(completion.)390 4609 y Fs(RL_STATE_SIGHANDLER)
+870 4719 y Ft(Readline)h(is)f(curren)m(tly)h(executing)g(the)g
+(readline)g(signal)g(handler.)390 4865 y Fs(RL_STATE_UNDOING)870
+4975 y Ft(Readline)g(is)f(p)s(erforming)g(an)g(undo.)390
+5121 y Fs(RL_STATE_DONE)870 5230 y Ft(Readline)e(has)g(read)f(a)i(k)m
+(ey)f(sequence)g(b)s(ound)e(to)i Fs(accept-line)d Ft(and)i(is)h(ab)s
+(out)f(to)870 5340 y(return)i(the)i(line)g(to)g(the)f(caller.)p
+eop end
+%%Page: 28 32
+TeXDict begin 28 31 bop 150 -116 a Ft(28)2600 b(GNU)31
+b(Readline)g(Library)3371 299 y([V)-8 b(ariable])-3598
+b Fg(int)39 b Ff(rl)p 432 299 35 5 v 51 w(explicit)p
+852 299 V 49 w(arg)390 408 y Ft(Set)g(to)g(a)h(non-zero)f(v)-5
+b(alue)39 b(if)g(an)g(explicit)h(n)m(umeric)e(argumen)m(t)i(w)m(as)f
+(sp)s(eci\014ed)f(b)m(y)g(the)h(user.)390 518 y(Only)30
+b(v)-5 b(alid)30 b(in)h(a)f(bindable)g(command)g(function.)3371
+708 y([V)-8 b(ariable])-3598 b Fg(int)39 b Ff(rl)p 432
+708 V 51 w(n)m(umeric)p 886 708 V 49 w(arg)390 817 y
+Ft(Set)45 b(to)h(the)g(v)-5 b(alue)46 b(of)f(an)m(y)h(n)m(umeric)f
+(argumen)m(t)h(explicitly)h(sp)s(eci\014ed)d(b)m(y)h(the)h(user)e(b)s
+(efore)390 927 y(executing)27 b(the)f(curren)m(t)g(Readline)h
+(function.)38 b(Only)26 b(v)-5 b(alid)26 b(in)g(a)g(bindable)f(command)
+h(function.)3371 1117 y([V)-8 b(ariable])-3598 b Fg(int)39
+b Ff(rl)p 432 1117 V 51 w(editing)p 830 1117 V 48 w(mo)s(de)390
+1226 y Ft(Set)25 b(to)h(a)g(v)-5 b(alue)25 b(denoting)h(Readline's)f
+(curren)m(t)g(editing)h(mo)s(de.)39 b(A)25 b(v)-5 b(alue)25
+b(of)h Fi(1)32 b Ft(means)25 b(Readline)390 1336 y(is)30
+b(curren)m(tly)h(in)f(emacs)h(mo)s(de;)f Fi(0)38 b Ft(means)31
+b(that)f(vi)h(mo)s(de)f(is)g(activ)m(e.)150 1600 y Fr(2.4)68
+b(Readline)47 b(Con)l(v)l(enience)f(F)-11 b(unctions)150
+1939 y Fh(2.4.1)63 b(Naming)41 b(a)g(F)-10 b(unction)275
+2186 y Ft(The)39 b(user)g(can)h(dynamically)g(c)m(hange)h(the)f
+(bindings)e(of)i(k)m(eys)h(while)e(using)h(Readline.)69
+b(This)39 b(is)150 2296 y(done)e(b)m(y)f(represen)m(ting)h(the)g
+(function)g(with)f(a)i(descriptiv)m(e)f(name.)61 b(The)36
+b(user)g(is)h(able)g(to)h(t)m(yp)s(e)f(the)150 2405 y(descriptiv)m(e)31
+b(name)g(when)e(referring)h(to)h(the)g(function.)40 b(Th)m(us,)30
+b(in)g(an)g(init)h(\014le,)f(one)h(migh)m(t)g(\014nd)390
+2543 y Fs(Meta-Rubout:)92 b(backward-kill-word)275 2680
+y Ft(This)39 b(binds)f(the)i(k)m(eystrok)m(e)1322 2677
+y Fk(h)p 1346 2624 417 4 v 1346 2680 a Fj(Meta-Rub)r(out)p
+1346 2695 V 1759 2677 a Fk(i)1828 2680 y Ft(to)h(the)f(function)g
+Fn(descriptively)49 b Ft(named)39 b Fs(backward-)150
+2789 y(kill-word)p Ft(.)59 b(Y)-8 b(ou,)39 b(as)f(the)f(programmer,)i
+(should)d(bind)g(the)h(functions)g(y)m(ou)h(write)f(to)h(descriptiv)m
+(e)150 2899 y(names)30 b(as)h(w)m(ell.)42 b(Readline)31
+b(pro)m(vides)f(a)h(function)f(for)g(doing)g(that:)3350
+3089 y([F)-8 b(unction])-3599 b Fg(int)39 b Ff(rl)p 432
+3089 35 5 v 51 w(add)p 667 3089 V 49 w(defun)44 b Fe(\()p
+Fs(const)29 b(char)g(*name,)g(rl_command_func_t)d(*function,)565
+3198 y(int)k(key)p Fe(\))390 3308 y Ft(Add)k Fi(name)41
+b Ft(to)36 b(the)f(list)h(of)g(named)e(functions.)55
+b(Mak)m(e)37 b Fi(function)e Ft(b)s(e)g(the)g(function)g(that)h(gets)
+390 3418 y(called.)42 b(If)30 b Fi(k)m(ey)39 b Ft(is)30
+b(not)h(-1,)g(then)f(bind)f(it)i(to)g Fi(function)f Ft(using)g
+Fs(rl_bind_key\(\))p Ft(.)275 3607 y(Using)g(this)g(function)g(alone)h
+(is)f(su\016cien)m(t)g(for)g(most)h(applications.)42
+b(It)30 b(is)g(the)g(recommended)g(w)m(a)m(y)150 3717
+y(to)e(add)e(a)h(few)g(functions)g(to)g(the)g(default)h(functions)e
+(that)i(Readline)f(has)g(built)g(in.)39 b(If)26 b(y)m(ou)i(need)e(to)i
+(do)150 3826 y(something)34 b(other)g(than)f(adding)h(a)g(function)f
+(to)h(Readline,)i(y)m(ou)e(ma)m(y)g(need)f(to)i(use)e(the)h(underlying)
+150 3936 y(functions)c(describ)s(ed)f(b)s(elo)m(w.)150
+4166 y Fh(2.4.2)63 b(Selecting)41 b(a)f(Keymap)275 4412
+y Ft(Key)30 b(bindings)g(tak)m(e)j(place)e(on)g(a)g Fi(k)m(eymap)p
+Ft(.)43 b(The)31 b(k)m(eymap)g(is)g(the)g(asso)s(ciation)i(b)s(et)m(w)m
+(een)e(the)g(k)m(eys)150 4522 y(that)e(the)g(user)e(t)m(yp)s(es)i(and)f
+(the)g(functions)g(that)h(get)h(run.)39 b(Y)-8 b(ou)29
+b(can)f(mak)m(e)i(y)m(our)e(o)m(wn)h(k)m(eymaps,)g(cop)m(y)150
+4632 y(existing)i(k)m(eymaps,)g(and)f(tell)i(Readline)f(whic)m(h)f(k)m
+(eymap)h(to)g(use.)3350 4821 y([F)-8 b(unction])-3599
+b Fg(Keymap)40 b Ff(rl)p 589 4821 V 50 w(mak)m(e)p 900
+4821 V 51 w(bare)p 1171 4821 V 49 w(k)m(eymap)46 b Fe(\()p
+Fs(void)p Fe(\))390 4931 y Ft(Returns)23 b(a)i(new,)g(empt)m(y)f(k)m
+(eymap.)40 b(The)23 b(space)i(for)f(the)g(k)m(eymap)h(is)f(allo)s
+(cated)i(with)e Fs(malloc\(\))p Ft(;)390 5041 y(the)31
+b(caller)g(should)f(free)g(it)h(b)m(y)f(calling)i Fs
+(rl_discard_keymap\(\))25 b Ft(when)30 b(done.)3350 5230
+y([F)-8 b(unction])-3599 b Fg(Keymap)40 b Ff(rl)p 589
+5230 V 50 w(cop)m(y)p 868 5230 V 51 w(k)m(eymap)46 b
+Fe(\()p Fs(Keymap)29 b(map)p Fe(\))390 5340 y Ft(Return)h(a)g(new)g(k)m
+(eymap)h(whic)m(h)f(is)h(a)f(cop)m(y)h(of)g Fi(map)p
+Ft(.)p eop end
+%%Page: 29 33
+TeXDict begin 29 32 bop 150 -116 a Ft(Chapter)30 b(2:)41
+b(Programming)30 b(with)g(GNU)h(Readline)1683 b(29)3350
+299 y([F)-8 b(unction])-3599 b Fg(Keymap)40 b Ff(rl)p
+589 299 35 5 v 50 w(mak)m(e)p 900 299 V 51 w(k)m(eymap)45
+b Fe(\()p Fs(void)p Fe(\))390 408 y Ft(Return)31 b(a)g(new)g(k)m(eymap)
+h(with)f(the)h(prin)m(ting)f(c)m(haracters)i(b)s(ound)c(to)j(rl)p
+2909 408 28 4 v 40 w(insert,)g(the)g(lo)m(w)m(ercase)390
+518 y(Meta)24 b(c)m(haracters)g(b)s(ound)d(to)i(run)e(their)i(equiv)-5
+b(alen)m(ts,)25 b(and)d(the)h(Meta)h(digits)f(b)s(ound)e(to)i(pro)s
+(duce)390 628 y(n)m(umeric)30 b(argumen)m(ts.)3350 803
+y([F)-8 b(unction])-3599 b Fg(void)39 b Ff(rl)p 484 803
+35 5 v 51 w(discard)p 894 803 V 49 w(k)m(eymap)46 b Fe(\()p
+Fs(Keymap)29 b(keymap)p Fe(\))390 913 y Ft(F)-8 b(ree)31
+b(the)g(storage)h(asso)s(ciated)g(with)e Fi(k)m(eymap)p
+Ft(.)275 1089 y(Readline)45 b(has)g(sev)m(eral)i(in)m(ternal)f(k)m
+(eymaps.)86 b(These)45 b(functions)g(allo)m(w)h(y)m(ou)g(to)g(c)m
+(hange)g(whic)m(h)150 1198 y(k)m(eymap)31 b(is)f(activ)m(e.)3350
+1374 y([F)-8 b(unction])-3599 b Fg(Keymap)40 b Ff(rl)p
+589 1374 V 50 w(get)p 794 1374 V 50 w(k)m(eymap)46 b
+Fe(\()p Fs(void)p Fe(\))390 1484 y Ft(Returns)29 b(the)i(curren)m(tly)f
+(activ)m(e)j(k)m(eymap.)3350 1659 y([F)-8 b(unction])-3599
+b Fg(void)39 b Ff(rl)p 484 1659 V 51 w(set)p 678 1659
+V 49 w(k)m(eymap)46 b Fe(\()p Fs(Keymap)29 b(keymap)p
+Fe(\))390 1769 y Ft(Mak)m(es)j Fi(k)m(eymap)h Ft(the)e(curren)m(tly)f
+(activ)m(e)j(k)m(eymap.)3350 1945 y([F)-8 b(unction])-3599
+b Fg(Keymap)40 b Ff(rl)p 589 1945 V 50 w(get)p 794 1945
+V 50 w(k)m(eymap)p 1229 1945 V 51 w(b)m(y)p 1401 1945
+V 50 w(name)45 b Fe(\()p Fs(const)29 b(char)g(*name)p
+Fe(\))390 2054 y Ft(Return)j(the)i(k)m(eymap)f(matc)m(hing)i
+Fi(name)p Ft(.)49 b Fi(name)38 b Ft(is)c(one)f(whic)m(h)g(w)m(ould)g(b)
+s(e)f(supplied)g(in)h(a)h Fs(set)390 2164 y(keymap)29
+b Ft(inputrc)g(line)i(\(see)g(Section)g(1.3)h([Readline)f(Init)f
+(File],)i(page)f(4\).)3350 2339 y([F)-8 b(unction])-3599
+b Fg(char)39 b(*)g Ff(rl)p 575 2339 V 50 w(get)p 780
+2339 V 50 w(k)m(eymap)p 1215 2339 V 51 w(name)44 b Fe(\()p
+Fs(Keymap)29 b(keymap)p Fe(\))390 2449 y Ft(Return)j(the)i(name)f(matc)
+m(hing)h Fi(k)m(eymap)p Ft(.)50 b Fi(name)38 b Ft(is)c(one)f(whic)m(h)g
+(w)m(ould)g(b)s(e)f(supplied)g(in)h(a)h Fs(set)390 2559
+y(keymap)29 b Ft(inputrc)g(line)i(\(see)g(Section)g(1.3)h([Readline)f
+(Init)f(File],)i(page)f(4\).)150 2774 y Fh(2.4.3)63 b(Binding)42
+b(Keys)275 3015 y Ft(Key)23 b(sequences)i(are)f(asso)s(ciate)i(with)e
+(functions)f(through)g(the)h(k)m(eymap.)39 b(Readline)25
+b(has)f(sev)m(eral)h(in-)150 3125 y(ternal)30 b(k)m(eymaps:)40
+b Fs(emacs_standard_keymap)p Ft(,)24 b Fs(emacs_meta_keymap)p
+Ft(,)h Fs(emacs_ctlx_keymap)p Ft(,)g Fs(vi_)150 3235
+y(movement_keymap)p Ft(,)41 b(and)h Fs(vi_insertion_keymap)p
+Ft(.)71 b Fs(emacs_standard_keymap)37 b Ft(is)42 b(the)g(default,)150
+3344 y(and)30 b(the)g(examples)h(in)f(this)h(man)m(ual)f(assume)g
+(that.)275 3476 y(Since)d Fs(readline\(\))e Ft(installs)j(a)g(set)g(of)
+g(default)g(k)m(ey)g(bindings)f(the)h(\014rst)e(time)j(it)f(is)f
+(called,)j(there)e(is)150 3585 y(alw)m(a)m(ys)34 b(the)f(danger)f(that)
+i(a)f(custom)g(binding)e(installed)j(b)s(efore)e(the)h(\014rst)e(call)j
+(to)g Fs(readline\(\))c Ft(will)150 3695 y(b)s(e)25 b(o)m(v)m
+(erridden.)39 b(An)26 b(alternate)h(mec)m(hanism)f(is)g(to)g(install)h
+(custom)f(k)m(ey)g(bindings)f(in)g(an)h(initialization)150
+3805 y(function)37 b(assigned)g(to)h(the)f Fs(rl_startup_hook)c
+Ft(v)-5 b(ariable)38 b(\(see)g(Section)g(2.3)g([Readline)g(V)-8
+b(ariables],)150 3914 y(page)31 b(24\).)275 4046 y(These)f(functions)g
+(manage)h(k)m(ey)g(bindings.)3350 4221 y([F)-8 b(unction])-3599
+b Fg(int)39 b Ff(rl)p 432 4221 V 51 w(bind)p 707 4221
+V 49 w(k)m(ey)45 b Fe(\()p Fs(int)30 b(key,)f(rl_command_func_t)d
+(*function)p Fe(\))390 4331 y Ft(Binds)32 b Fi(k)m(ey)42
+b Ft(to)34 b Fi(function)e Ft(in)h(the)g(curren)m(tly)g(activ)m(e)i(k)m
+(eymap.)49 b(Returns)32 b(non-zero)i(in)f(the)g(case)390
+4441 y(of)e(an)f(in)m(v)-5 b(alid)31 b Fi(k)m(ey)p Ft(.)3350
+4616 y([F)-8 b(unction])-3599 b Fg(int)39 b Ff(rl)p 432
+4616 V 51 w(bind)p 707 4616 V 49 w(k)m(ey)p 926 4616
+V 50 w(in)p 1072 4616 V 50 w(map)46 b Fe(\()p Fs(int)29
+b(key,)h(rl_command_func_t)25 b(*function,)565 4726 y(Keymap)k(map)p
+Fe(\))390 4836 y Ft(Bind)h Fi(k)m(ey)39 b Ft(to)31 b
+Fi(function)f Ft(in)g Fi(map)p Ft(.)40 b(Returns)30 b(non-zero)h(in)f
+(the)h(case)g(of)f(an)h(in)m(v)-5 b(alid)31 b Fi(k)m(ey)p
+Ft(.)3350 5011 y([F)-8 b(unction])-3599 b Fg(int)39 b
+Ff(rl)p 432 5011 V 51 w(bind)p 707 5011 V 49 w(k)m(ey)p
+926 5011 V 50 w(if)p 1043 5011 V 51 w(un)m(b)s(ound)k
+Fe(\()p Fs(int)30 b(key,)f(rl_command_func_t)565 5121
+y(*function)p Fe(\))390 5230 y Ft(Binds)43 b Fi(k)m(ey)53
+b Ft(to)45 b Fi(function)e Ft(if)h(it)h(is)f(not)g(already)g(b)s(ound)e
+(in)i(the)g(curren)m(tly)g(activ)m(e)i(k)m(eymap.)390
+5340 y(Returns)29 b(non-zero)i(in)f(the)h(case)g(of)g(an)f(in)m(v)-5
+b(alid)31 b Fi(k)m(ey)39 b Ft(or)30 b(if)h Fi(k)m(ey)39
+b Ft(is)30 b(already)h(b)s(ound.)p eop end
+%%Page: 30 34
+TeXDict begin 30 33 bop 150 -116 a Ft(30)2600 b(GNU)31
+b(Readline)g(Library)3350 299 y([F)-8 b(unction])-3599
+b Fg(int)39 b Ff(rl)p 432 299 35 5 v 51 w(bind)p 707
+299 V 49 w(k)m(ey)p 926 299 V 50 w(if)p 1043 299 V 51
+w(un)m(b)s(ound)p 1535 299 V 48 w(in)p 1679 299 V 50
+w(map)45 b Fe(\()p Fs(int)30 b(key,)565 408 y(rl_command_func_t)c
+(*function,)h(Keymap)i(map)p Fe(\))390 518 y Ft(Binds)e
+Fi(k)m(ey)36 b Ft(to)28 b Fi(function)f Ft(if)g(it)h(is)f(not)h
+(already)g(b)s(ound)d(in)i Fi(map)p Ft(.)39 b(Returns)27
+b(non-zero)g(in)g(the)h(case)390 628 y(of)j(an)f(in)m(v)-5
+b(alid)31 b Fi(k)m(ey)39 b Ft(or)30 b(if)g Fi(k)m(ey)39
+b Ft(is)31 b(already)g(b)s(ound.)3350 792 y([F)-8 b(unction])-3599
+b Fg(int)39 b Ff(rl)p 432 792 V 51 w(un)m(bind)p 832
+792 V 48 w(k)m(ey)46 b Fe(\()p Fs(int)29 b(key)p Fe(\))390
+902 y Ft(Bind)36 b Fi(k)m(ey)45 b Ft(to)37 b(the)f(n)m(ull)g(function)g
+(in)g(the)h(curren)m(tly)f(activ)m(e)i(k)m(eymap.)59
+b(Returns)35 b(non-zero)i(in)390 1011 y(case)31 b(of)g(error.)3350
+1176 y([F)-8 b(unction])-3599 b Fg(int)39 b Ff(rl)p 432
+1176 V 51 w(un)m(bind)p 832 1176 V 48 w(k)m(ey)p 1050
+1176 V 51 w(in)p 1197 1176 V 49 w(map)46 b Fe(\()p Fs(int)29
+b(key,)h(Keymap)e(map)p Fe(\))390 1285 y Ft(Bind)i Fi(k)m(ey)39
+b Ft(to)31 b(the)g(n)m(ull)f(function)g(in)g Fi(map)p
+Ft(.)40 b(Returns)30 b(non-zero)h(in)f(case)h(of)g(error.)3350
+1450 y([F)-8 b(unction])-3599 b Fg(int)39 b Ff(rl)p 432
+1450 V 51 w(un)m(bind)p 832 1450 V 48 w(function)p 1292
+1450 V 49 w(in)p 1437 1450 V 50 w(map)45 b Fe(\()p Fs
+(rl_command_func_t)26 b(*function,)565 1559 y(Keymap)j(map)p
+Fe(\))390 1669 y Ft(Un)m(bind)g(all)i(k)m(eys)g(that)g(execute)h
+Fi(function)e Ft(in)g Fi(map)p Ft(.)3350 1833 y([F)-8
+b(unction])-3599 b Fg(int)39 b Ff(rl)p 432 1833 V 51
+w(un)m(bind)p 832 1833 V 48 w(command)p 1362 1833 V 50
+w(in)p 1508 1833 V 50 w(map)46 b Fe(\()p Fs(const)29
+b(char)g(*command,)f(Keymap)565 1943 y(map)p Fe(\))390
+2052 y Ft(Un)m(bind)h(all)i(k)m(eys)g(that)g(are)g(b)s(ound)e(to)i
+Fi(command)i Ft(in)d Fi(map)p Ft(.)3350 2217 y([F)-8
+b(unction])-3599 b Fg(int)39 b Ff(rl)p 432 2217 V 51
+w(bind)p 707 2217 V 49 w(k)m(eyseq)46 b Fe(\()p Fs(const)29
+b(char)g(*keyseq,)f(rl_command_func_t)565 2326 y(*function)p
+Fe(\))390 2436 y Ft(Bind)43 b(the)g(k)m(ey)h(sequence)f(represen)m(ted)
+g(b)m(y)g(the)g(string)g Fi(k)m(eyseq)j Ft(to)e(the)f(function)g
+Fi(function)p Ft(,)390 2545 y(b)s(eginning)27 b(in)h(the)h(curren)m(t)f
+(k)m(eymap.)40 b(This)28 b(mak)m(es)h(new)e(k)m(eymaps)i(as)f
+(necessary)-8 b(.)41 b(The)28 b(return)390 2655 y(v)-5
+b(alue)31 b(is)f(non-zero)h(if)g Fi(k)m(eyseq)i Ft(is)d(in)m(v)-5
+b(alid.)3350 2819 y([F)d(unction])-3599 b Fg(int)39 b
+Ff(rl)p 432 2819 V 51 w(bind)p 707 2819 V 49 w(k)m(eyseq)p
+1084 2819 V 51 w(in)p 1231 2819 V 49 w(map)46 b Fe(\()p
+Fs(const)29 b(char)g(*keyseq,)565 2929 y(rl_command_func_t)d
+(*function,)h(Keymap)i(map)p Fe(\))390 3039 y Ft(Bind)c(the)g(k)m(ey)h
+(sequence)f(represen)m(ted)g(b)m(y)g(the)g(string)g Fi(k)m(eyseq)j
+Ft(to)e(the)f(function)g Fi(function)p Ft(.)39 b(This)390
+3148 y(mak)m(es)30 b(new)f(k)m(eymaps)g(as)g(necessary)-8
+b(.)42 b(Initial)30 b(bindings)d(are)j(p)s(erformed)e(in)g
+Fi(map)p Ft(.)40 b(The)29 b(return)390 3258 y(v)-5 b(alue)31
+b(is)f(non-zero)h(if)g Fi(k)m(eyseq)i Ft(is)d(in)m(v)-5
+b(alid.)3350 3422 y([F)d(unction])-3599 b Fg(int)39 b
+Ff(rl)p 432 3422 V 51 w(set)p 626 3422 V 49 w(k)m(ey)46
+b Fe(\()p Fs(const)29 b(char)g(*keyseq,)g(rl_command_func_t)c
+(*function,)565 3532 y(Keymap)k(map)p Fe(\))390 3641
+y Ft(Equiv)-5 b(alen)m(t)31 b(to)g Fs(rl_bind_keyseq_in_map)p
+Ft(.)3350 3806 y([F)-8 b(unction])-3599 b Fg(int)39 b
+Ff(rl)p 432 3806 V 51 w(bind)p 707 3806 V 49 w(k)m(eyseq)p
+1084 3806 V 51 w(if)p 1202 3806 V 50 w(un)m(b)s(ound)k
+Fe(\()p Fs(const)30 b(char)f(*keyseq,)565 3915 y(rl_command_func_t)d
+(*function)p Fe(\))390 4025 y Ft(Binds)35 b Fi(k)m(eyseq)k
+Ft(to)d Fi(function)f Ft(if)g(it)h(is)g(not)g(already)g(b)s(ound)d(in)i
+(the)h(curren)m(tly)f(activ)m(e)j(k)m(eymap.)390 4134
+y(Returns)29 b(non-zero)i(in)f(the)h(case)g(of)g(an)f(in)m(v)-5
+b(alid)31 b Fi(k)m(eyseq)j Ft(or)c(if)g Fi(k)m(eyseq)k
+Ft(is)c(already)h(b)s(ound.)3350 4299 y([F)-8 b(unction])-3599
+b Fg(int)39 b Ff(rl)p 432 4299 V 51 w(bind)p 707 4299
+V 49 w(k)m(eyseq)p 1084 4299 V 51 w(if)p 1202 4299 V
+50 w(un)m(b)s(ound)p 1693 4299 V 48 w(in)p 1837 4299
+V 50 w(map)46 b Fe(\()p Fs(const)29 b(char)g(*keyseq,)565
+4408 y(rl_command_func_t)d(*function,)h(Keymap)i(map)p
+Fe(\))390 4518 y Ft(Binds)i Fi(k)m(eyseq)k Ft(to)e Fi(function)f
+Ft(if)g(it)g(is)g(not)g(already)h(b)s(ound)d(in)h Fi(map)p
+Ft(.)46 b(Returns)31 b(non-zero)h(in)g(the)390 4628 y(case)f(of)g(an)f
+(in)m(v)-5 b(alid)31 b Fi(k)m(eyseq)j Ft(or)c(if)g Fi(k)m(eyseq)k
+Ft(is)c(already)h(b)s(ound.)3350 4792 y([F)-8 b(unction])-3599
+b Fg(int)39 b Ff(rl)p 432 4792 V 51 w(generic)p 840 4792
+V 49 w(bind)44 b Fe(\()p Fs(int)30 b(type,)f(const)g(char)g(*keyseq,)f
+(char)h(*data,)565 4902 y(Keymap)g(map)p Fe(\))390 5011
+y Ft(Bind)e(the)g(k)m(ey)h(sequence)f(represen)m(ted)g(b)m(y)g(the)g
+(string)g Fi(k)m(eyseq)j Ft(to)e(the)f(arbitrary)g(p)s(oin)m(ter)g
+Fi(data)p Ft(.)390 5121 y Fi(t)m(yp)s(e)34 b Ft(sa)m(ys)29
+b(what)f(kind)g(of)g(data)h(is)g(p)s(oin)m(ted)f(to)h(b)m(y)g
+Fi(data)p Ft(;)h(this)e(can)h(b)s(e)f(a)g(function)g(\()p
+Fs(ISFUNC)p Ft(\),)h(a)390 5230 y(macro)h(\()p Fs(ISMACR)p
+Ft(\),)f(or)g(a)h(k)m(eymap)g(\()p Fs(ISKMAP)p Ft(\).)40
+b(This)28 b(mak)m(es)j(new)e(k)m(eymaps)g(as)h(necessary)-8
+b(.)41 b(The)390 5340 y(initial)32 b(k)m(eymap)e(in)h(whic)m(h)f(to)h
+(do)f(bindings)f(is)i Fi(map)p Ft(.)p eop end
+%%Page: 31 35
+TeXDict begin 31 34 bop 150 -116 a Ft(Chapter)30 b(2:)41
+b(Programming)30 b(with)g(GNU)h(Readline)1683 b(31)3350
+299 y([F)-8 b(unction])-3599 b Fg(int)39 b Ff(rl)p 432
+299 35 5 v 51 w(parse)p 748 299 V 49 w(and)p 981 299
+V 50 w(bind)44 b Fe(\()p Fs(char)29 b(*line)p Fe(\))390
+408 y Ft(P)m(arse)h Fi(line)35 b Ft(as)29 b(if)h(it)g(had)e(b)s(een)h
+(read)g(from)g(the)h Fs(inputrc)d Ft(\014le)j(and)e(p)s(erform)g(an)m
+(y)i(k)m(ey)g(bindings)390 518 y(and)g(v)-5 b(ariable)31
+b(assignmen)m(ts)g(found)e(\(see)i(Section)h(1.3)f([Readline)g(Init)f
+(File],)j(page)e(4\).)3350 709 y([F)-8 b(unction])-3599
+b Fg(int)39 b Ff(rl)p 432 709 V 51 w(read)p 703 709 V
+49 w(init)p 925 709 V 49 w(\014le)45 b Fe(\()p Fs(const)29
+b(char)g(*filename)p Fe(\))390 818 y Ft(Read)j(k)m(eybindings)f(and)g
+(v)-5 b(ariable)32 b(assignmen)m(ts)g(from)f Fi(\014lename)37
+b Ft(\(see)32 b(Section)g(1.3)h([Readline)390 928 y(Init)d(File],)i
+(page)f(4\).)150 1158 y Fh(2.4.4)63 b(Asso)s(ciating)41
+b(F)-10 b(unction)42 b(Names)f(and)g(Bindings)275 1405
+y Ft(These)21 b(functions)f(allo)m(w)j(y)m(ou)f(to)g(\014nd)d(out)j
+(what)f(k)m(eys)h(in)m(v)m(ok)m(e)h(named)e(functions)f(and)h(the)g
+(functions)150 1515 y(in)m(v)m(ok)m(ed)29 b(b)m(y)e(a)h(particular)g(k)
+m(ey)g(sequence.)40 b(Y)-8 b(ou)28 b(ma)m(y)g(also)h(asso)s(ciate)g(a)f
+(new)f(function)g(name)h(with)f(an)150 1624 y(arbitrary)j(function.)
+3350 1815 y([F)-8 b(unction])-3599 b Fg(rl_command_func_t)43
+b(*)c Ff(rl)p 1255 1815 V 50 w(named)p 1637 1815 V 50
+w(function)44 b Fe(\()p Fs(const)29 b(char)g(*name)p
+Fe(\))390 1924 y Ft(Return)h(the)g(function)g(with)g(name)h
+Fi(name)p Ft(.)3350 2115 y([F)-8 b(unction])-3599 b Fg
+(rl_command_func_t)43 b(*)c Ff(rl)p 1255 2115 V 50 w(function)p
+1717 2115 V 49 w(of)p 1858 2115 V 51 w(k)m(eyseq)46 b
+Fe(\()p Fs(const)29 b(char)g(*keyseq,)565 2225 y(Keymap)g(map,)g(int)g
+(*type)p Fe(\))390 2334 y Ft(Return)j(the)g(function)h(in)m(v)m(ok)m
+(ed)h(b)m(y)e Fi(k)m(eyseq)k Ft(in)c(k)m(eymap)h Fi(map)p
+Ft(.)47 b(If)32 b Fi(map)j Ft(is)d Fs(NULL)p Ft(,)g(the)h(curren)m(t)
+390 2444 y(k)m(eymap)k(is)g(used.)60 b(If)37 b Fi(t)m(yp)s(e)42
+b Ft(is)37 b(not)g Fs(NULL)p Ft(,)h(the)f(t)m(yp)s(e)g(of)g(the)g(ob)5
+b(ject)38 b(is)f(returned)f(in)h(the)g Fs(int)390 2553
+y Ft(v)-5 b(ariable)31 b(it)g(p)s(oin)m(ts)f(to)h(\(one)g(of)g
+Fs(ISFUNC)p Ft(,)e Fs(ISKMAP)p Ft(,)g(or)h Fs(ISMACR)p
+Ft(\).)3350 2744 y([F)-8 b(unction])-3599 b Fg(char)39
+b(**)g Ff(rl)p 627 2744 V 51 w(in)m(v)m(oking)p 1098
+2744 V 50 w(k)m(eyseqs)46 b Fe(\()p Fs(rl_command_func_t)26
+b(*function)p Fe(\))390 2853 y Ft(Return)k(an)i(arra)m(y)f(of)h
+(strings)f(represen)m(ting)g(the)g(k)m(ey)h(sequences)g(used)e(to)i(in)
+m(v)m(ok)m(e)h Fi(function)e Ft(in)390 2963 y(the)g(curren)m(t)f(k)m
+(eymap.)3350 3153 y([F)-8 b(unction])-3599 b Fg(char)39
+b(**)g Ff(rl)p 627 3153 V 51 w(in)m(v)m(oking)p 1098
+3153 V 50 w(k)m(eyseqs)p 1521 3153 V 51 w(in)p 1668 3153
+V 50 w(map)45 b Fe(\()p Fs(rl_command_func_t)565 3263
+y(*function,)28 b(Keymap)g(map)p Fe(\))390 3373 y Ft(Return)i(an)i
+(arra)m(y)f(of)h(strings)f(represen)m(ting)g(the)g(k)m(ey)h(sequences)g
+(used)e(to)i(in)m(v)m(ok)m(e)h Fi(function)e Ft(in)390
+3482 y(the)g(k)m(eymap)f Fi(map)p Ft(.)3350 3673 y([F)-8
+b(unction])-3599 b Fg(void)39 b Ff(rl)p 484 3673 V 51
+w(function)p 947 3673 V 49 w(dump)s(er)45 b Fe(\()p Fs(int)29
+b(readable)p Fe(\))390 3782 y Ft(Prin)m(t)g(the)h(readline)f(function)g
+(names)g(and)g(the)g(k)m(ey)h(sequences)g(curren)m(tly)f(b)s(ound)e(to)
+j(them)f(to)390 3892 y Fs(rl_outstream)p Ft(.)36 b(If)27
+b Fi(readable)33 b Ft(is)28 b(non-zero,)h(the)e(list)i(is)e(formatted)h
+(in)f(suc)m(h)g(a)h(w)m(a)m(y)h(that)f(it)g(can)390 4001
+y(b)s(e)i(made)g(part)g(of)h(an)f Fs(inputrc)f Ft(\014le)h(and)g
+(re-read.)3350 4192 y([F)-8 b(unction])-3599 b Fg(void)39
+b Ff(rl)p 484 4192 V 51 w(list)p 689 4192 V 50 w(funmap)p
+1117 4192 V 49 w(names)45 b Fe(\()p Fs(void)p Fe(\))390
+4301 y Ft(Prin)m(t)30 b(the)h(names)f(of)h(all)g(bindable)f(Readline)h
+(functions)f(to)h Fs(rl_outstream)p Ft(.)3350 4492 y([F)-8
+b(unction])-3599 b Fg(const)40 b(char)f(**)g Ff(rl)p
+927 4492 V 50 w(funmap)p 1355 4492 V 50 w(names)45 b
+Fe(\()p Fs(void)p Fe(\))390 4602 y Ft(Return)25 b(a)i(NULL)f
+(terminated)g(arra)m(y)h(of)f(kno)m(wn)f(function)h(names.)39
+b(The)26 b(arra)m(y)g(is)g(sorted.)39 b(The)390 4711
+y(arra)m(y)26 b(itself)g(is)f(allo)s(cated,)k(but)24
+b(not)i(the)f(strings)g(inside.)39 b(Y)-8 b(ou)26 b(should)e
+Fs(free\(\))g Ft(the)h(arra)m(y)h(when)390 4821 y(y)m(ou)31
+b(are)f(done,)h(but)f(not)g(the)h(p)s(oin)m(ters.)3350
+5011 y([F)-8 b(unction])-3599 b Fg(int)39 b Ff(rl)p 432
+5011 V 51 w(add)p 667 5011 V 49 w(funmap)p 1094 5011
+V 49 w(en)m(try)45 b Fe(\()p Fs(const)29 b(char)h(*name,)e
+(rl_command_func_t)565 5121 y(*function)p Fe(\))390 5230
+y Ft(Add)k Fi(name)38 b Ft(to)33 b(the)g(list)h(of)f(bindable)f
+(Readline)h(command)g(names,)g(and)f(mak)m(e)i Fi(function)f
+Ft(the)390 5340 y(function)d(to)h(b)s(e)f(called)h(when)f
+Fi(name)35 b Ft(is)c(in)m(v)m(ok)m(ed.)p eop end
+%%Page: 32 36
+TeXDict begin 32 35 bop 150 -116 a Ft(32)2600 b(GNU)31
+b(Readline)g(Library)150 299 y Fh(2.4.5)63 b(Allo)m(wing)41
+b(Undoing)275 539 y Ft(Supp)s(orting)24 b(the)i(undo)f(command)h(is)h
+(a)f(painless)h(thing,)g(and)e(mak)m(es)j(y)m(our)e(functions)f(m)m(uc)
+m(h)i(more)150 648 y(useful.)40 b(It)30 b(is)h(certainly)g(easy)g(to)g
+(try)g(something)g(if)f(y)m(ou)h(kno)m(w)f(y)m(ou)h(can)f(undo)g(it.)
+275 779 y(If)40 b(y)m(our)h(function)f(simply)g(inserts)h(text)h(once,)
+i(or)d(deletes)h(text)g(once,)i(and)c(uses)h Fs(rl_insert_)150
+888 y(text\(\))26 b Ft(or)i Fs(rl_delete_text\(\))23
+b Ft(to)29 b(do)f(it,)h(then)f(undoing)f(is)g(already)i(done)f(for)f(y)
+m(ou)h(automatically)-8 b(.)275 1018 y(If)20 b(y)m(ou)g(do)h(m)m
+(ultiple)g(insertions)f(or)h(m)m(ultiple)g(deletions,)j(or)c(an)m(y)h
+(com)m(bination)h(of)e(these)h(op)s(erations,)150 1128
+y(y)m(ou)38 b(should)f(group)h(them)g(together)h(in)m(to)g(one)f(op)s
+(eration.)64 b(This)37 b(is)h(done)g(with)g Fs(rl_begin_undo_)150
+1238 y(group\(\))28 b Ft(and)i Fs(rl_end_undo_group\(\))p
+Ft(.)275 1368 y(The)f(t)m(yp)s(es)i(of)f(ev)m(en)m(ts)i(that)f(can)g(b)
+s(e)e(undone)h(are:)390 1476 y Fd(enum)40 b(undo_code)h({)f
+(UNDO_DELETE,)i(UNDO_INSERT,)g(UNDO_BEGIN,)g(UNDO_END)f(};)275
+1606 y Ft(Notice)32 b(that)f Fs(UNDO_DELETE)c Ft(means)j(to)h(insert)f
+(some)h(text,)h(and)d Fs(UNDO_INSERT)e Ft(means)k(to)g(delete)150
+1715 y(some)d(text.)41 b(That)27 b(is,)i(the)e(undo)g(co)s(de)h(tells)g
+(what)g(to)g(undo,)f(not)h(ho)m(w)g(to)g(undo)e(it.)41
+b Fs(UNDO_BEGIN)25 b Ft(and)150 1825 y Fs(UNDO_END)j
+Ft(are)j(tags)g(added)f(b)m(y)g Fs(rl_begin_undo_group\(\))25
+b Ft(and)30 b Fs(rl_end_undo_group\(\))p Ft(.)3350 1997
+y([F)-8 b(unction])-3599 b Fg(int)39 b Ff(rl)p 432 1997
+35 5 v 51 w(b)s(egin)p 756 1997 V 49 w(undo)p 1054 1997
+V 50 w(group)45 b Fe(\()p Fs(void)p Fe(\))390 2106 y
+Ft(Begins)32 b(sa)m(ving)g(undo)d(information)j(in)e(a)i(group)e
+(construct.)43 b(The)30 b(undo)g(information)h(usually)390
+2216 y(comes)42 b(from)f(calls)i(to)f Fs(rl_insert_text\(\))37
+b Ft(and)k Fs(rl_delete_text\(\))p Ft(,)f(but)h(could)h(b)s(e)f(the)390
+2325 y(result)30 b(of)h(calls)g(to)g Fs(rl_add_undo\(\))p
+Ft(.)3350 2497 y([F)-8 b(unction])-3599 b Fg(int)39 b
+Ff(rl)p 432 2497 V 51 w(end)p 664 2497 V 49 w(undo)p
+962 2497 V 49 w(group)46 b Fe(\()p Fs(void)p Fe(\))390
+2606 y Ft(Closes)29 b(the)h(curren)m(t)e(undo)g(group)h(started)g(with)
+g Fs(rl_begin_undo_group)c(\(\))p Ft(.)39 b(There)29
+b(should)390 2716 y(b)s(e)h(one)g(call)i(to)f Fs(rl_end_undo_group\(\))
+25 b Ft(for)30 b(eac)m(h)i(call)g(to)f Fs(rl_begin_undo_group\(\))p
+Ft(.)3350 2888 y([F)-8 b(unction])-3599 b Fg(void)39
+b Ff(rl)p 484 2888 V 51 w(add)p 719 2888 V 49 w(undo)45
+b Fe(\()p Fs(enum)29 b(undo_code)f(what,)h(int)h(start,)e(int)i(end,)f
+(char)565 2997 y(*text)p Fe(\))390 3107 y Ft(Remem)m(b)s(er)34
+b(ho)m(w)g(to)h(undo)d(an)i(ev)m(en)m(t)i(\(according)f(to)g
+Fi(what)r Ft(\).)52 b(The)33 b(a\013ected)j(text)f(runs)d(from)390
+3216 y Fi(start)h Ft(to)e Fi(end)p Ft(,)f(and)g(encompasses)h
+Fi(text)p Ft(.)3350 3388 y([F)-8 b(unction])-3599 b Fg(void)39
+b Ff(rl)p 484 3388 V 51 w(free)p 723 3388 V 49 w(undo)p
+1021 3388 V 50 w(list)45 b Fe(\()p Fs(void)p Fe(\))390
+3497 y Ft(F)-8 b(ree)31 b(the)g(existing)g(undo)f(list.)3350
+3669 y([F)-8 b(unction])-3599 b Fg(int)39 b Ff(rl)p 432
+3669 V 51 w(do)p 604 3669 V 50 w(undo)45 b Fe(\()p Fs(void)p
+Fe(\))390 3779 y Ft(Undo)22 b(the)h(\014rst)g(thing)f(on)h(the)g(undo)f
+(list.)39 b(Returns)22 b Fs(0)g Ft(if)h(there)g(w)m(as)g(nothing)g(to)h
+(undo,)f(non-zero)390 3888 y(if)30 b(something)h(w)m(as)g(undone.)275
+4060 y(Finally)-8 b(,)32 b(if)f(y)m(ou)h(neither)f(insert)g(nor)f
+(delete)j(text,)f(but)f(directly)g(mo)s(dify)g(the)g(existing)h(text)g
+(\(e.g.,)150 4169 y(c)m(hange)40 b(its)f(case\),)j(call)e
+Fs(rl_modifying\(\))35 b Ft(once,)42 b(just)c(b)s(efore)g(y)m(ou)h(mo)s
+(dify)f(the)h(text.)67 b(Y)-8 b(ou)39 b(m)m(ust)150 4279
+y(supply)29 b(the)h(indices)h(of)f(the)h(text)g(range)g(that)g(y)m(ou)g
+(are)g(going)g(to)g(mo)s(dify)-8 b(.)3350 4450 y([F)g(unction])-3599
+b Fg(int)39 b Ff(rl)p 432 4450 V 51 w(mo)s(difying)46
+b Fe(\()p Fs(int)29 b(start,)g(int)h(end)p Fe(\))390
+4560 y Ft(T)-8 b(ell)41 b(Readline)g(to)g(sa)m(v)m(e)g(the)g(text)g(b)s
+(et)m(w)m(een)g Fi(start)i Ft(and)c Fi(end)k Ft(as)e(a)f(single)h(undo)
+e(unit.)70 b(It)40 b(is)390 4670 y(assumed)30 b(that)h(y)m(ou)f(will)h
+(subsequen)m(tly)f(mo)s(dify)f(that)i(text.)150 4881
+y Fh(2.4.6)63 b(Redispla)m(y)3350 5121 y Ft([F)-8 b(unction])-3599
+b Fg(void)39 b Ff(rl)p 484 5121 V 51 w(redispla)m(y)44
+b Fe(\()p Fs(void)p Fe(\))390 5230 y Ft(Change)38 b(what's)f(displa)m
+(y)m(ed)i(on)e(the)h(screen)g(to)h(re\015ect)f(the)g(curren)m(t)g(con)m
+(ten)m(ts)h(of)f Fs(rl_line_)390 5340 y(buffer)p Ft(.)p
+eop end
+%%Page: 33 37
+TeXDict begin 33 36 bop 150 -116 a Ft(Chapter)30 b(2:)41
+b(Programming)30 b(with)g(GNU)h(Readline)1683 b(33)3350
+299 y([F)-8 b(unction])-3599 b Fg(int)39 b Ff(rl)p 432
+299 35 5 v 51 w(forced)p 790 299 V 49 w(up)s(date)p 1188
+299 V 49 w(displa)m(y)44 b Fe(\()p Fs(void)p Fe(\))390
+408 y Ft(F)-8 b(orce)41 b(the)f(line)g(to)h(b)s(e)e(up)s(dated)f(and)h
+(redispla)m(y)m(ed,)k(whether)c(or)g(not)h(Readline)h(thinks)e(the)390
+518 y(screen)30 b(displa)m(y)h(is)f(correct.)3350 725
+y([F)-8 b(unction])-3599 b Fg(int)39 b Ff(rl)p 432 725
+V 51 w(on)p 604 725 V 50 w(new)p 854 725 V 49 w(line)44
+b Fe(\()p Fs(void)p Fe(\))390 835 y Ft(T)-8 b(ell)31
+b(the)f(up)s(date)f(functions)g(that)i(w)m(e)f(ha)m(v)m(e)h(mo)m(v)m
+(ed)g(on)m(to)g(a)f(new)f(\(empt)m(y\))i(line,)g(usually)e(after)390
+944 y(ouputting)h(a)h(newline.)3350 1151 y([F)-8 b(unction])-3599
+b Fg(int)39 b Ff(rl)p 432 1151 V 51 w(on)p 604 1151 V
+50 w(new)p 854 1151 V 49 w(line)p 1084 1151 V 49 w(with)p
+1357 1151 V 50 w(prompt)45 b Fe(\()p Fs(void)p Fe(\))390
+1261 y Ft(T)-8 b(ell)25 b(the)f(up)s(date)f(functions)h(that)h(w)m(e)f
+(ha)m(v)m(e)h(mo)m(v)m(ed)g(on)m(to)h(a)e(new)g(line,)i(with)d
+Fi(rl)p 3106 1261 28 4 v 40 w(prompt)i Ft(already)390
+1370 y(displa)m(y)m(ed.)41 b(This)28 b(could)g(b)s(e)g(used)g(b)m(y)g
+(applications)i(that)f(w)m(an)m(t)h(to)f(output)f(the)h(prompt)f
+(string)390 1480 y(themselv)m(es,)h(but)e(still)h(need)g(Readline)g(to)
+g(kno)m(w)f(the)h(prompt)e(string)h(length)h(for)f(redispla)m(y)-8
+b(.)41 b(It)390 1590 y(should)29 b(b)s(e)h(used)g(after)h(setting)g
+Fi(rl)p 1590 1590 V 40 w(already)p 1920 1590 V 41 w(prompted)p
+Ft(.)3350 1797 y([F)-8 b(unction])-3599 b Fg(int)39 b
+Ff(rl)p 432 1797 35 5 v 51 w(reset)p 726 1797 V 49 w(line)p
+956 1797 V 49 w(state)44 b Fe(\()p Fs(void)p Fe(\))390
+1906 y Ft(Reset)36 b(the)e(displa)m(y)h(state)h(to)g(a)f(clean)g(state)
+h(and)e(redispla)m(y)h(the)g(curren)m(t)g(line)g(starting)g(on)g(a)390
+2016 y(new)30 b(line.)3350 2223 y([F)-8 b(unction])-3599
+b Fg(int)39 b Ff(rl)p 432 2223 V 51 w(crlf)45 b Fe(\()p
+Fs(void)p Fe(\))390 2332 y Ft(Mo)m(v)m(e)32 b(the)f(cursor)f(to)h(the)f
+(start)h(of)g(the)f(next)h(screen)f(line.)3350 2539 y([F)-8
+b(unction])-3599 b Fg(int)39 b Ff(rl)p 432 2539 V 51
+w(sho)m(w)p 729 2539 V 50 w(c)m(har)44 b Fe(\()p Fs(int)30
+b(c)p Fe(\))390 2649 y Ft(Displa)m(y)k(c)m(haracter)g
+Fi(c)k Ft(on)32 b Fs(rl_outstream)p Ft(.)44 b(If)32 b(Readline)h(has)g
+(not)f(b)s(een)g(set)h(to)g(displa)m(y)g(meta)390 2759
+y(c)m(haracters)27 b(directly)-8 b(,)29 b(this)c(will)i(con)m(v)m(ert)g
+(meta)g(c)m(haracters)h(to)e(a)h(meta-pre\014xed)f(k)m(ey)g(sequence.)
+390 2868 y(This)k(is)g(in)m(tended)g(for)g(use)g(b)m(y)h(applications)g
+(whic)m(h)f(wish)g(to)h(do)f(their)h(o)m(wn)f(redispla)m(y)-8
+b(.)3350 3075 y([F)g(unction])-3599 b Fg(int)39 b Ff(rl)p
+432 3075 V 51 w(message)45 b Fe(\()p Fs(const)29 b(char)g(*,)h(...)o
+Fe(\))390 3185 y Ft(The)20 b(argumen)m(ts)h(are)g(a)g(format)g(string)g
+(as)f(w)m(ould)h(b)s(e)f(supplied)f(to)j Fs(printf)p
+Ft(,)f(p)s(ossibly)e(con)m(taining)390 3294 y(con)m(v)m(ersion)45
+b(sp)s(eci\014cations)g(suc)m(h)f(as)g(`)p Fs(\045d)p
+Ft(',)k(and)c(an)m(y)g(additional)h(argumen)m(ts)g(necessary)f(to)390
+3404 y(satisfy)e(the)f(con)m(v)m(ersion)i(sp)s(eci\014cations.)74
+b(The)41 b(resulting)h(string)f(is)g(displa)m(y)m(ed)h(in)f(the)h
+Fi(ec)m(ho)390 3513 y(area)p Ft(.)63 b(The)37 b(ec)m(ho)i(area)f(is)g
+(also)g(used)f(to)h(displa)m(y)g(n)m(umeric)f(argumen)m(ts)h(and)f
+(searc)m(h)h(strings.)390 3623 y(Y)-8 b(ou)34 b(should)e(call)j
+Fs(rl_save_prompt)29 b Ft(to)34 b(sa)m(v)m(e)h(the)f(prompt)e
+(information)i(b)s(efore)f(calling)i(this)390 3733 y(function.)3350
+3940 y([F)-8 b(unction])-3599 b Fg(int)39 b Ff(rl)p 432
+3940 V 51 w(clear)p 722 3940 V 49 w(message)45 b Fe(\()p
+Fs(void)p Fe(\))390 4049 y Ft(Clear)29 b(the)g(message)h(in)f(the)g(ec)
+m(ho)h(area.)41 b(If)29 b(the)g(prompt)f(w)m(as)h(sa)m(v)m(ed)h(with)f
+(a)g(call)i(to)e Fs(rl_save_)390 4159 y(prompt)38 b Ft(b)s(efore)h(the)
+g(last)h(call)h(to)f Fs(rl_message)p Ft(,)f(call)i Fs
+(rl_restore_prompt)34 b Ft(b)s(efore)39 b(calling)390
+4268 y(this)30 b(function.)3350 4475 y([F)-8 b(unction])-3599
+b Fg(void)39 b Ff(rl)p 484 4475 V 51 w(sa)m(v)m(e)p 743
+4475 V 50 w(prompt)45 b Fe(\()p Fs(void)p Fe(\))390 4585
+y Ft(Sa)m(v)m(e)f(the)f(lo)s(cal)i(Readline)e(prompt)f(displa)m(y)i
+(state)g(in)f(preparation)g(for)g(displa)m(ying)g(a)g(new)390
+4695 y(message)31 b(in)g(the)f(message)i(area)f(with)f
+Fs(rl_message\(\))p Ft(.)3350 4902 y([F)-8 b(unction])-3599
+b Fg(void)39 b Ff(rl)p 484 4902 V 51 w(restore)p 882
+4902 V 50 w(prompt)45 b Fe(\()p Fs(void)p Fe(\))390 5011
+y Ft(Restore)f(the)e(lo)s(cal)i(Readline)g(prompt)d(displa)m(y)i(state)
+h(sa)m(v)m(ed)g(b)m(y)f(the)f(most)h(recen)m(t)h(call)g(to)390
+5121 y Fs(rl_save_prompt)p Ft(.)69 b(if)41 b Fs(rl_save_prompt)d
+Ft(w)m(as)j(called)i(to)f(sa)m(v)m(e)h(the)e(prompt)f(b)s(efore)h(a)h
+(call)390 5230 y(to)37 b Fs(rl_message)p Ft(,)f(this)h(function)f
+(should)g(b)s(e)g(called)i(b)s(efore)f(the)g(corresp)s(onding)e(call)j
+(to)g Fs(rl_)390 5340 y(clear_message)p Ft(.)p eop end
+%%Page: 34 38
+TeXDict begin 34 37 bop 150 -116 a Ft(34)2600 b(GNU)31
+b(Readline)g(Library)3350 299 y([F)-8 b(unction])-3599
+b Fg(int)39 b Ff(rl)p 432 299 35 5 v 51 w(expand)p 844
+299 V 49 w(prompt)45 b Fe(\()p Fs(char)29 b(*prompt)p
+Fe(\))390 408 y Ft(Expand)41 b(an)m(y)j(sp)s(ecial)f(c)m(haracter)h
+(sequences)f(in)g Fi(prompt)g Ft(and)f(set)i(up)d(the)i(lo)s(cal)h
+(Readline)390 518 y(prompt)35 b(redispla)m(y)h(v)-5 b(ariables.)57
+b(This)35 b(function)h(is)g(called)h(b)m(y)e Fs(readline\(\))p
+Ft(.)55 b(It)35 b(ma)m(y)i(also)g(b)s(e)390 628 y(called)22
+b(to)g(expand)f(the)g(primary)f(prompt)g(if)i(the)f Fs
+(rl_on_new_line_with_prom)o(pt\()o(\))15 b Ft(function)390
+737 y(or)25 b Fs(rl_already_prompted)c Ft(v)-5 b(ariable)26
+b(is)f(used.)39 b(It)25 b(returns)f(the)i(n)m(um)m(b)s(er)e(of)i
+(visible)f(c)m(haracters)390 847 y(on)34 b(the)g(last)g(line)g(of)g
+(the)g(\(p)s(ossibly)f(m)m(ulti-line\))j(prompt.)50 b(Applications)34
+b(ma)m(y)h(indicate)f(that)390 956 y(the)28 b(prompt)f(con)m(tains)i(c)
+m(haracters)g(that)g(tak)m(e)g(up)e(no)h(ph)m(ysical)g(screen)g(space)g
+(when)f(displa)m(y)m(ed)390 1066 y(b)m(y)41 b(brac)m(k)m(eting)i(a)e
+(sequence)g(of)g(suc)m(h)g(c)m(haracters)h(with)f(the)g(sp)s(ecial)h
+(mark)m(ers)f Fs(RL_PROMPT_)390 1176 y(START_IGNORE)27
+b Ft(and)k Fs(RL_PROMPT_END_IGNORE)25 b Ft(\(declared)31
+b(in)g(`)p Fs(readline.h)p Ft('.)39 b(This)30 b(ma)m(y)i(b)s(e)390
+1285 y(used)e(to)h(em)m(b)s(ed)f(terminal-sp)s(eci\014c)h(escap)s(e)f
+(sequences)h(in)f(prompts.)3350 1461 y([F)-8 b(unction])-3599
+b Fg(int)39 b Ff(rl)p 432 1461 V 51 w(set)p 626 1461
+V 49 w(prompt)45 b Fe(\()p Fs(const)30 b(char)f(*prompt)p
+Fe(\))390 1571 y Ft(Mak)m(e)f(Readline)g(use)f Fi(prompt)h
+Ft(for)e(subsequen)m(t)h(redispla)m(y)-8 b(.)40 b(This)26
+b(calls)i Fs(rl_expand_prompt\(\))390 1681 y Ft(to)j(expand)f(the)g
+(prompt)g(and)g(sets)g Fs(rl_prompt)e Ft(to)j(the)g(result.)150
+1897 y Fh(2.4.7)63 b(Mo)s(difying)43 b(T)-10 b(ext)3350
+2138 y Ft([F)i(unction])-3599 b Fg(int)39 b Ff(rl)p 432
+2138 V 51 w(insert)p 769 2138 V 49 w(text)44 b Fe(\()p
+Fs(const)30 b(char)f(*text)p Fe(\))390 2248 y Ft(Insert)i
+Fi(text)k Ft(in)m(to)d(the)g(line)g(at)g(the)g(curren)m(t)f(cursor)g(p)
+s(osition.)45 b(Returns)30 b(the)i(n)m(um)m(b)s(er)f(of)g(c)m(har-)390
+2357 y(acters)g(inserted.)3350 2534 y([F)-8 b(unction])-3599
+b Fg(int)39 b Ff(rl)p 432 2534 V 51 w(delete)p 783 2534
+V 47 w(text)45 b Fe(\()p Fs(int)30 b(start,)f(int)g(end)p
+Fe(\))390 2643 y Ft(Delete)40 b(the)e(text)h(b)s(et)m(w)m(een)f
+Fi(start)i Ft(and)d Fi(end)k Ft(in)c(the)h(curren)m(t)g(line.)63
+b(Returns)36 b(the)i(n)m(um)m(b)s(er)f(of)390 2753 y(c)m(haracters)32
+b(deleted.)3350 2929 y([F)-8 b(unction])-3599 b Fg(char)39
+b(*)g Ff(rl)p 575 2929 V 50 w(cop)m(y)p 854 2929 V 51
+w(text)44 b Fe(\()p Fs(int)30 b(start,)f(int)g(end)p
+Fe(\))390 3039 y Ft(Return)h(a)g(cop)m(y)h(of)g(the)g(text)g(b)s(et)m
+(w)m(een)g Fi(start)i Ft(and)d Fi(end)j Ft(in)d(the)h(curren)m(t)f
+(line.)3350 3215 y([F)-8 b(unction])-3599 b Fg(int)39
+b Ff(rl)p 432 3215 V 51 w(kill)p 639 3215 V 50 w(text)44
+b Fe(\()p Fs(int)30 b(start,)f(int)g(end)p Fe(\))390
+3324 y Ft(Cop)m(y)34 b(the)g(text)i(b)s(et)m(w)m(een)e
+Fi(start)j Ft(and)d Fi(end)j Ft(in)d(the)g(curren)m(t)g(line)g(to)h
+(the)f(kill)h(ring,)g(app)s(ending)390 3434 y(or)f(prep)s(ending)e(to)j
+(the)f(last)h(kill)f(if)g(the)g(last)h(command)f(w)m(as)g(a)h(kill)f
+(command.)51 b(The)34 b(text)h(is)390 3544 y(deleted.)51
+b(If)33 b Fi(start)j Ft(is)e(less)g(than)f Fi(end)p Ft(,)h(the)g(text)g
+(is)g(app)s(ended,)f(otherwise)h(prep)s(ended.)48 b(If)33
+b(the)390 3653 y(last)e(command)f(w)m(as)h(not)g(a)f(kill,)i(a)f(new)e
+(kill)i(ring)g(slot)g(is)f(used.)3350 3829 y([F)-8 b(unction])-3599
+b Fg(int)39 b Ff(rl)p 432 3829 V 51 w(push)p 720 3829
+V 49 w(macro)p 1075 3829 V 51 w(input)44 b Fe(\()p Fs(char)29
+b(*macro)p Fe(\))390 3939 y Ft(Cause)f Fi(macro)33 b
+Ft(to)c(b)s(e)f(inserted)g(in)m(to)h(the)g(line,)g(as)f(if)h(it)f(had)g
+(b)s(een)g(in)m(v)m(ok)m(ed)h(b)m(y)f(a)h(k)m(ey)g(b)s(ound)d(to)390
+4049 y(a)31 b(macro.)41 b(Not)31 b(esp)s(ecially)h(useful;)e(use)g
+Fs(rl_insert_text\(\))c Ft(instead.)150 4265 y Fh(2.4.8)63
+b(Character)39 b(Input)3350 4506 y Ft([F)-8 b(unction])-3599
+b Fg(int)39 b Ff(rl)p 432 4506 V 51 w(read)p 703 4506
+V 49 w(k)m(ey)46 b Fe(\()p Fs(void)p Fe(\))390 4616 y
+Ft(Return)29 b(the)g(next)h(c)m(haracter)h(a)m(v)-5 b(ailable)32
+b(from)d(Readline's)h(curren)m(t)f(input)g(stream.)41
+b(This)28 b(han-)390 4725 y(dles)e(input)g(inserted)g(in)m(to)i(the)e
+(input)g(stream)h(via)g Fi(rl)p 2226 4725 28 4 v 40 w(p)s(ending)p
+2583 4725 V 38 w(input)h Ft(\(see)f(Section)h(2.3)f([Read-)390
+4835 y(line)40 b(V)-8 b(ariables],)43 b(page)d(24\))g(and)f
+Fs(rl_stuff_char\(\))p Ft(,)f(macros,)k(and)d(c)m(haracters)h(read)f
+(from)390 4945 y(the)34 b(k)m(eyb)s(oard.)52 b(While)35
+b(w)m(aiting)g(for)f(input,)g(this)g(function)g(will)g(call)i(an)m(y)e
+(function)g(assigned)390 5054 y(to)d(the)g Fs(rl_event_hook)26
+b Ft(v)-5 b(ariable.)3350 5230 y([F)d(unction])-3599
+b Fg(int)39 b Ff(rl)p 432 5230 35 5 v 51 w(getc)44 b
+Fe(\()p Fs(FILE)30 b(*stream)p Fe(\))390 5340 y Ft(Return)20
+b(the)i(next)f(c)m(haracter)i(a)m(v)-5 b(ailable)24 b(from)c
+Fi(stream)p Ft(,)k(whic)m(h)d(is)g(assumed)g(to)h(b)s(e)e(the)i(k)m
+(eyb)s(oard.)p eop end
+%%Page: 35 39
+TeXDict begin 35 38 bop 150 -116 a Ft(Chapter)30 b(2:)41
+b(Programming)30 b(with)g(GNU)h(Readline)1683 b(35)3350
+299 y([F)-8 b(unction])-3599 b Fg(int)39 b Ff(rl)p 432
+299 35 5 v 51 w(stu\013)p 704 299 V 49 w(c)m(har)45 b
+Fe(\()p Fs(int)30 b(c)p Fe(\))390 408 y Ft(Insert)i Fi(c)39
+b Ft(in)m(to)34 b(the)f(Readline)g(input)f(stream.)49
+b(It)33 b(will)g(b)s(e)f Fs(")p Ft(read)p Fs(")g Ft(b)s(efore)h
+(Readline)g(attempts)390 518 y(to)27 b(read)g(c)m(haracters)h(from)f
+(the)g(terminal)g(with)f Fs(rl_read_key\(\))p Ft(.)36
+b(Up)27 b(to)g(512)h(c)m(haracters)g(ma)m(y)390 628 y(b)s(e)i(pushed)f
+(bac)m(k.)42 b Fs(rl_stuff_char)27 b Ft(returns)i(1)i(if)f(the)h(c)m
+(haracter)h(w)m(as)f(successfully)g(inserted;)390 737
+y(0)g(otherwise.)3350 973 y([F)-8 b(unction])-3599 b
+Fg(int)39 b Ff(rl)p 432 973 V 51 w(execute)p 862 973
+V 48 w(next)45 b Fe(\()p Fs(int)30 b(c)p Fe(\))390 1082
+y Ft(Mak)m(e)37 b Fi(c)42 b Ft(b)s(e)35 b(the)h(next)f(command)h(to)g
+(b)s(e)f(executed)i(when)d Fs(rl_read_key\(\))e Ft(is)k(called.)58
+b(This)390 1192 y(sets)31 b Fi(rl)p 635 1192 28 4 v 40
+w(p)s(ending)p 992 1192 V 38 w(input)p Ft(.)3350 1427
+y([F)-8 b(unction])-3599 b Fg(int)39 b Ff(rl)p 432 1427
+35 5 v 51 w(clear)p 722 1427 V 49 w(p)s(ending)p 1172
+1427 V 49 w(input)44 b Fe(\()p Fs(void)p Fe(\))390 1537
+y Ft(Unset)e Fi(rl)p 729 1537 28 4 v 40 w(p)s(ending)p
+1086 1537 V 38 w(input)p Ft(,)i(e\013ectiv)m(ely)h(negating)e(the)f
+(e\013ect)h(of)f(an)m(y)g(previous)f(call)i(to)g Fs(rl_)390
+1646 y(execute_next\(\))p Ft(.)59 b(This)36 b(w)m(orks)i(only)g(if)f
+(the)h(p)s(ending)e(input)h(has)g(not)h(already)g(b)s(een)f(read)390
+1756 y(with)30 b Fs(rl_read_key\(\))p Ft(.)3350 1991
+y([F)-8 b(unction])-3599 b Fg(int)39 b Ff(rl)p 432 1991
+35 5 v 51 w(set)p 626 1991 V 49 w(k)m(eyb)s(oard)p 1136
+1991 V 51 w(input)p 1456 1991 V 48 w(timeout)45 b Fe(\()p
+Fs(int)29 b(u)p Fe(\))390 2101 y Ft(While)41 b(w)m(aiting)g(for)f(k)m
+(eyb)s(oard)g(input)f(in)h Fs(rl_read_key\(\))p Ft(,)f(Readline)i(will)
+f(w)m(ait)h(for)f Fi(u)g Ft(mi-)390 2210 y(croseconds)31
+b(for)g(input)f(b)s(efore)g(calling)j(an)m(y)e(function)f(assigned)i
+(to)f Fs(rl_event_hook)p Ft(.)39 b Fi(u)30 b Ft(m)m(ust)390
+2320 y(b)s(e)h(greater)i(than)f(or)g(equal)g(to)h(zero)f(\(a)h
+(zero-length)g(timeout)g(is)f(equiv)-5 b(alen)m(t)33
+b(to)g(a)f(p)s(oll\).)45 b(The)390 2429 y(default)31
+b(w)m(aiting)g(p)s(erio)s(d)e(is)i(one-ten)m(th)g(of)g(a)g(second.)40
+b(Returns)30 b(the)g(old)h(timeout)g(v)-5 b(alue.)150
+2705 y Fh(2.4.9)63 b(T)-10 b(erminal)41 b(Managemen)m(t)3350
+2974 y Ft([F)-8 b(unction])-3599 b Fg(void)39 b Ff(rl)p
+484 2974 V 51 w(prep)p 763 2974 V 49 w(terminal)44 b
+Fe(\()p Fs(int)30 b(meta_flag)p Fe(\))390 3084 y Ft(Mo)s(dify)42
+b(the)h(terminal)g(settings)g(for)f(Readline's)i(use,)h(so)e
+Fs(readline\(\))c Ft(can)k(read)f(a)h(single)390 3193
+y(c)m(haracter)32 b(at)g(a)f(time)h(from)e(the)h(k)m(eyb)s(oard.)43
+b(The)30 b Fi(meta)p 2376 3193 28 4 v 41 w(\015ag)39
+b Ft(argumen)m(t)31 b(should)f(b)s(e)g(non-zero)390 3303
+y(if)g(Readline)h(should)f(read)g(eigh)m(t-bit)i(input.)3350
+3538 y([F)-8 b(unction])-3599 b Fg(void)39 b Ff(rl)p
+484 3538 35 5 v 51 w(deprep)p 880 3538 V 48 w(terminal)45
+b Fe(\()p Fs(void)p Fe(\))390 3648 y Ft(Undo)31 b(the)h(e\013ects)h(of)
+f Fs(rl_prep_terminal\(\))p Ft(,)27 b(lea)m(ving)33 b(the)f(terminal)g
+(in)f(the)h(state)h(in)e(whic)m(h)390 3757 y(it)g(w)m(as)g(b)s(efore)f
+(the)g(most)h(recen)m(t)g(call)h(to)f Fs(rl_prep_terminal\(\))p
+Ft(.)3350 3993 y([F)-8 b(unction])-3599 b Fg(void)39
+b Ff(rl)p 484 3993 V 51 w(tt)m(y)p 682 3993 V 50 w(set)p
+875 3993 V 49 w(default)p 1273 3993 V 49 w(bindings)44
+b Fe(\()p Fs(Keymap)29 b(kmap)p Fe(\))390 4102 y Ft(Read)37
+b(the)g(op)s(erating)h(system's)f(terminal)g(editing)h(c)m(haracters)g
+(\(as)g(w)m(ould)e(b)s(e)h(displa)m(y)m(ed)g(b)m(y)390
+4212 y Fs(stty)p Ft(\))30 b(to)h(their)f(Readline)h(equiv)-5
+b(alen)m(ts.)42 b(The)30 b(bindings)f(are)i(p)s(erformed)e(in)h
+Fi(kmap)p Ft(.)3350 4447 y([F)-8 b(unction])-3599 b Fg(void)39
+b Ff(rl)p 484 4447 V 51 w(tt)m(y)p 682 4447 V 50 w(unset)p
+1003 4447 V 49 w(default)p 1401 4447 V 48 w(bindings)44
+b Fe(\()p Fs(Keymap)29 b(kmap)p Fe(\))390 4557 y Ft(Reset)k(the)f
+(bindings)e(manipulated)i(b)m(y)g Fs(rl_tty_set_default_bind)o(ing)o(s)
+26 b Ft(so)32 b(that)g(the)g(ter-)390 4666 y(minal)40
+b(editing)g(c)m(haracters)h(are)f(b)s(ound)e(to)i Fs(rl_insert)p
+Ft(.)66 b(The)39 b(bindings)f(are)i(p)s(erformed)e(in)390
+4776 y Fi(kmap)p Ft(.)3350 5011 y([F)-8 b(unction])-3599
+b Fg(int)39 b Ff(rl)p 432 5011 V 51 w(reset)p 726 5011
+V 49 w(terminal)44 b Fe(\()p Fs(const)29 b(char)h(*terminal_name)p
+Fe(\))390 5121 y Ft(Reinitialize)c(Readline's)f(idea)f(of)g(the)g
+(terminal)h(settings)f(using)g Fi(terminal)p 2977 5121
+28 4 v 40 w(name)29 b Ft(as)24 b(the)g(termi-)390 5230
+y(nal)32 b(t)m(yp)s(e)g(\(e.g.,)i Fs(vt100)p Ft(\).)44
+b(If)31 b Fi(terminal)p 1753 5230 V 41 w(name)37 b Ft(is)31
+b Fs(NULL)p Ft(,)h(the)g(v)-5 b(alue)32 b(of)g(the)g
+Fs(TERM)e Ft(en)m(vironmen)m(t)390 5340 y(v)-5 b(ariable)31
+b(is)g(used.)p eop end
+%%Page: 36 40
+TeXDict begin 36 39 bop 150 -116 a Ft(36)2600 b(GNU)31
+b(Readline)g(Library)150 299 y Fh(2.4.10)63 b(Utilit)m(y)40
+b(F)-10 b(unctions)3350 545 y Ft([F)i(unction])-3599
+b Fg(void)39 b Ff(rl)p 484 545 35 5 v 51 w(replace)p
+891 545 V 49 w(line)44 b Fe(\()p Fs(const)29 b(char)g(*text,)g(int)g
+(clear_undo)p Fe(\))390 654 y Ft(Replace)41 b(the)e(con)m(ten)m(ts)i
+(of)f Fs(rl_line_buffer)35 b Ft(with)k Fi(text)p Ft(.)69
+b(The)39 b(p)s(oin)m(t)h(and)e(mark)h(are)h(pre-)390
+764 y(serv)m(ed,)27 b(if)e(p)s(ossible.)39 b(If)25 b
+Fi(clear)p 1422 764 28 4 v 41 w(undo)k Ft(is)d(non-zero,)h(the)f(undo)e
+(list)i(asso)s(ciated)h(with)e(the)h(curren)m(t)390 874
+y(line)31 b(is)f(cleared.)3350 1062 y([F)-8 b(unction])-3599
+b Fg(int)39 b Ff(rl)p 432 1062 35 5 v 51 w(extend)p 822
+1062 V 48 w(line)p 1051 1062 V 50 w(bu\013er)44 b Fe(\()p
+Fs(int)30 b(len)p Fe(\))390 1171 y Ft(Ensure)f(that)h
+Fs(rl_line_buffer)d Ft(has)j(enough)f(space)i(to)g(hold)f
+Fi(len)g Ft(c)m(haracters,)i(p)s(ossibly)d(real-)390
+1281 y(lo)s(cating)j(it)f(if)f(necessary)-8 b(.)3350
+1469 y([F)g(unction])-3599 b Fg(int)39 b Ff(rl)p 432
+1469 V 51 w(initialize)j Fe(\()p Fs(void)p Fe(\))390
+1579 y Ft(Initialize)d(or)e(re-initialize)i(Readline's)f(in)m(ternal)f
+(state.)62 b(It's)37 b(not)g(strictly)h(necessary)f(to)h(call)390
+1688 y(this;)31 b Fs(readline\(\))c Ft(calls)32 b(it)f(b)s(efore)f
+(reading)g(an)m(y)h(input.)3350 1876 y([F)-8 b(unction])-3599
+b Fg(int)39 b Ff(rl)p 432 1876 V 51 w(ding)44 b Fe(\()p
+Fs(void)p Fe(\))390 1986 y Ft(Ring)30 b(the)h(terminal)g(b)s(ell,)f(ob)
+s(eying)h(the)f(setting)i(of)e Fs(bell-style)p Ft(.)3350
+2174 y([F)-8 b(unction])-3599 b Fg(int)39 b Ff(rl)p 432
+2174 V 51 w(alphab)s(etic)j Fe(\()p Fs(int)30 b(c)p Fe(\))390
+2283 y Ft(Return)g(1)g(if)h Fi(c)36 b Ft(is)30 b(an)h(alphab)s(etic)g
+(c)m(haracter.)3350 2472 y([F)-8 b(unction])-3599 b Fg(void)39
+b Ff(rl)p 484 2472 V 51 w(displa)m(y)p 885 2472 V 49
+w(matc)m(h)p 1242 2472 V 50 w(list)45 b Fe(\()p Fs(char)29
+b(**matches,)f(int)h(len,)h(int)f(max)p Fe(\))390 2581
+y Ft(A)35 b(con)m(v)m(enience)h(function)e(for)g(displa)m(ying)h(a)g
+(list)g(of)g(strings)f(in)g(columnar)g(format)h(on)f(Read-)390
+2691 y(line's)g(output)f(stream.)51 b Fs(matches)31 b
+Ft(is)j(the)f(list)i(of)e(strings,)i(in)e(argv)h(format,)h(suc)m(h)e
+(as)h(a)g(list)g(of)390 2800 y(completion)26 b(matc)m(hes.)39
+b Fs(len)24 b Ft(is)g(the)g(n)m(um)m(b)s(er)f(of)i(strings)f(in)g
+Fs(matches)p Ft(,)f(and)h Fs(max)f Ft(is)i(the)f(length)h(of)390
+2910 y(the)h(longest)i(string)e(in)g Fs(matches)p Ft(.)37
+b(This)25 b(function)h(uses)g(the)g(setting)i(of)e Fs
+(print-completions-)390 3019 y(horizontally)33 b Ft(to)k(select)h(ho)m
+(w)e(the)g(matc)m(hes)i(are)e(displa)m(y)m(ed)h(\(see)g(Section)g
+(1.3.1)h([Readline)390 3129 y(Init)30 b(File)i(Syn)m(tax],)f(page)g
+(4\).)275 3317 y(The)g(follo)m(wing)j(are)e(implemen)m(ted)h(as)f
+(macros,)h(de\014ned)e(in)h Fs(chardefs.h)p Ft(.)43 b(Applications)33
+b(should)150 3427 y(refrain)d(from)g(using)g(them.)3350
+3615 y([F)-8 b(unction])-3599 b Fg(int)p 353 3615 V 90
+w Ff(rl)p 483 3615 V 50 w(upp)s(ercase)p 1033 3615 V
+48 w(p)46 b Fe(\()p Fs(int)29 b(c)p Fe(\))390 3724 y
+Ft(Return)h(1)g(if)h Fi(c)36 b Ft(is)30 b(an)h(upp)s(ercase)e(alphab)s
+(etic)i(c)m(haracter.)3350 3912 y([F)-8 b(unction])-3599
+b Fg(int)p 353 3912 V 90 w Ff(rl)p 483 3912 V 50 w(lo)m(w)m(ercase)p
+1004 3912 V 49 w(p)45 b Fe(\()p Fs(int)30 b(c)p Fe(\))390
+4022 y Ft(Return)g(1)g(if)h Fi(c)36 b Ft(is)30 b(a)h(lo)m(w)m(ercase)i
+(alphab)s(etic)e(c)m(haracter.)3350 4210 y([F)-8 b(unction])-3599
+b Fg(int)p 353 4210 V 90 w Ff(rl)p 483 4210 V 50 w(digit)p
+763 4210 V 49 w(p)46 b Fe(\()p Fs(int)29 b(c)p Fe(\))390
+4320 y Ft(Return)h(1)g(if)h Fi(c)36 b Ft(is)30 b(a)h(n)m(umeric)f(c)m
+(haracter.)3350 4508 y([F)-8 b(unction])-3599 b Fg(int)p
+353 4508 V 90 w Ff(rl)p 483 4508 V 50 w(to)p 635 4508
+V 50 w(upp)s(er)44 b Fe(\()p Fs(int)30 b(c)p Fe(\))390
+4617 y Ft(If)23 b Fi(c)30 b Ft(is)24 b(a)g(lo)m(w)m(ercase)i(alphab)s
+(etic)e(c)m(haracter,)j(return)c(the)h(corresp)s(onding)e(upp)s(ercase)
+h(c)m(haracter.)3350 4805 y([F)-8 b(unction])-3599 b
+Fg(int)p 353 4805 V 90 w Ff(rl)p 483 4805 V 50 w(to)p
+635 4805 V 50 w(lo)m(w)m(er)45 b Fe(\()p Fs(int)30 b(c)p
+Fe(\))390 4915 y Ft(If)e Fi(c)35 b Ft(is)29 b(an)g(upp)s(ercase)f
+(alphab)s(etic)h(c)m(haracter,)i(return)d(the)h(corresp)s(onding)f(lo)m
+(w)m(ercase)j(c)m(harac-)390 5025 y(ter.)3350 5213 y([F)-8
+b(unction])-3599 b Fg(int)p 353 5213 V 90 w Ff(rl)p 483
+5213 V 50 w(digit)p 763 5213 V 49 w(v)-6 b(alue)45 b
+Fe(\()p Fs(int)30 b(c)p Fe(\))390 5322 y Ft(If)g Fi(c)36
+b Ft(is)31 b(a)f(n)m(um)m(b)s(er,)g(return)f(the)h(v)-5
+b(alue)31 b(it)g(represen)m(ts.)p eop end
+%%Page: 37 41
+TeXDict begin 37 40 bop 150 -116 a Ft(Chapter)30 b(2:)41
+b(Programming)30 b(with)g(GNU)h(Readline)1683 b(37)150
+299 y Fh(2.4.11)63 b(Miscellaneous)42 b(F)-10 b(unctions)3350
+561 y Ft([F)i(unction])-3599 b Fg(int)39 b Ff(rl)p 432
+561 35 5 v 51 w(macro)p 789 561 V 50 w(bind)45 b Fe(\()p
+Fs(const)29 b(char)g(*keyseq,)f(const)h(char)g(*macro,)g(Keymap)565
+671 y(map)p Fe(\))390 780 y Ft(Bind)23 b(the)g(k)m(ey)h(sequence)g
+Fi(k)m(eyseq)i Ft(to)e(in)m(v)m(ok)m(e)h(the)f(macro)f
+Fi(macro)p Ft(.)39 b(The)23 b(binding)f(is)i(p)s(erformed)d(in)390
+890 y Fi(map)p Ft(.)39 b(When)28 b Fi(k)m(eyseq)i Ft(is)e(in)m(v)m(ok)m
+(ed,)i(the)d Fi(macro)33 b Ft(will)28 b(b)s(e)f(inserted)g(in)m(to)i
+(the)e(line.)41 b(This)26 b(function)390 999 y(is)k(deprecated;)i(use)e
+Fs(rl_generic_bind\(\))25 b Ft(instead.)3350 1220 y([F)-8
+b(unction])-3599 b Fg(void)39 b Ff(rl)p 484 1220 V 51
+w(macro)p 841 1220 V 51 w(dump)s(er)45 b Fe(\()p Fs(int)29
+b(readable)p Fe(\))390 1329 y Ft(Prin)m(t)e(the)g(k)m(ey)h(sequences)g
+(b)s(ound)d(to)j(macros)f(and)g(their)g(v)-5 b(alues,)28
+b(using)f(the)g(curren)m(t)g(k)m(eymap,)390 1439 y(to)32
+b Fs(rl_outstream)p Ft(.)40 b(If)31 b Fi(readable)36
+b Ft(is)c(non-zero,)g(the)f(list)h(is)f(formatted)h(in)f(suc)m(h)g(a)g
+(w)m(a)m(y)i(that)e(it)390 1548 y(can)g(b)s(e)e(made)i(part)f(of)h(an)f
+Fs(inputrc)e Ft(\014le)j(and)e(re-read.)3350 1769 y([F)-8
+b(unction])-3599 b Fg(int)39 b Ff(rl)p 432 1769 V 51
+w(v)-6 b(ariable)p 877 1769 V 48 w(bind)45 b Fe(\()p
+Fs(const)29 b(char)g(*variable,)f(const)h(char)g(*value)p
+Fe(\))390 1878 y Ft(Mak)m(e)i(the)e(Readline)g(v)-5 b(ariable)30
+b Fi(v)-5 b(ariable)35 b Ft(ha)m(v)m(e)30 b Fi(v)-5 b(alue)p
+Ft(.)41 b(This)28 b(b)s(eha)m(v)m(es)h(as)h(if)f(the)g(readline)g(com-)
+390 1988 y(mand)f(`)p Fs(set)i Fl(variable)38 b(value)11
+b Ft(')28 b(had)g(b)s(een)g(executed)i(in)e(an)h Fs(inputrc)e
+Ft(\014le)i(\(see)g(Section)h(1.3.1)390 2098 y([Readline)h(Init)f(File)
+i(Syn)m(tax],)f(page)g(4\).)3350 2318 y([F)-8 b(unction])-3599
+b Fg(char)39 b(*)g Ff(rl)p 575 2318 V 50 w(v)-6 b(ariable)p
+1019 2318 V 49 w(v)g(alue)44 b Fe(\()p Fs(const)30 b(char)f(*variable)p
+Fe(\))390 2427 y Ft(Return)f(a)i(string)f(represen)m(ting)h(the)f(v)-5
+b(alue)30 b(of)f(the)h(Readline)g(v)-5 b(ariable)30 b
+Fi(v)-5 b(ariable)p Ft(.)41 b(F)-8 b(or)30 b(b)s(o)s(olean)390
+2537 y(v)-5 b(ariables,)31 b(this)g(string)f(is)g(either)h(`)p
+Fs(on)p Ft(')f(or)h(`)p Fs(off)p Ft('.)3350 2757 y([F)-8
+b(unction])-3599 b Fg(void)39 b Ff(rl)p 484 2757 V 51
+w(v)-6 b(ariable)p 929 2757 V 49 w(dump)s(er)44 b Fe(\()p
+Fs(int)30 b(readable)p Fe(\))390 2867 y Ft(Prin)m(t)f(the)f(readline)h
+(v)-5 b(ariable)30 b(names)e(and)g(their)h(curren)m(t)f(v)-5
+b(alues)29 b(to)h Fs(rl_outstream)p Ft(.)37 b(If)28 b
+Fi(read-)390 2977 y(able)40 b Ft(is)34 b(non-zero,)i(the)e(list)g(is)g
+(formatted)h(in)f(suc)m(h)g(a)g(w)m(a)m(y)h(that)g(it)f(can)g(b)s(e)g
+(made)g(part)g(of)g(an)390 3086 y Fs(inputrc)28 b Ft(\014le)j(and)f
+(re-read.)3350 3306 y([F)-8 b(unction])-3599 b Fg(int)39
+b Ff(rl)p 432 3306 V 51 w(set)p 626 3306 V 49 w(paren)p
+959 3306 V 49 w(blink)p 1260 3306 V 50 w(timeout)44 b
+Fe(\()p Fs(int)30 b(u)p Fe(\))390 3416 y Ft(Set)25 b(the)h(time)f(in)m
+(terv)-5 b(al)27 b(\(in)e(microseconds\))h(that)g(Readline)f(w)m(aits)h
+(when)e(sho)m(wing)i(a)f(balancing)390 3526 y(c)m(haracter)32
+b(when)d Fs(blink-matching-paren)c Ft(has)30 b(b)s(een)g(enabled.)3350
+3746 y([F)-8 b(unction])-3599 b Fg(char)39 b(*)g Ff(rl)p
+575 3746 V 50 w(get)p 780 3746 V 50 w(termcap)45 b Fe(\()p
+Fs(const)29 b(char)g(*cap)p Fe(\))390 3856 y Ft(Retriev)m(e)g(the)e
+(string)g(v)-5 b(alue)27 b(of)g(the)h(termcap)f(capabilit)m(y)i
+Fi(cap)p Ft(.)40 b(Readline)27 b(fetc)m(hes)h(the)g(termcap)390
+3965 y(en)m(try)34 b(for)f(the)h(curren)m(t)f(terminal)h(name)g(and)f
+(uses)g(those)h(capabilities)h(to)f(mo)m(v)m(e)h(around)e(the)390
+4075 y(screen)21 b(line)h(and)e(p)s(erform)g(other)h(terminal-sp)s
+(eci\014c)h(op)s(erations,)h(lik)m(e)f(erasing)g(a)f(line.)38
+b(Readline)390 4184 y(do)s(es)d(not)g(use)g(all)g(of)h(a)f(terminal's)g
+(capabilities,)k(and)34 b(this)h(function)g(will)g(return)f(v)-5
+b(alues)35 b(for)390 4294 y(only)30 b(those)h(capabilities)i(Readline)e
+(uses.)150 4554 y Fh(2.4.12)63 b(Alternate)40 b(In)m(terface)275
+4816 y Ft(An)k(alternate)i(in)m(terface)g(is)f(a)m(v)-5
+b(ailable)47 b(to)f(plain)e Fs(readline\(\))p Ft(.)81
+b(Some)45 b(applications)h(need)e(to)150 4926 y(in)m(terlea)m(v)m(e)32
+b(k)m(eyb)s(oard)d(I/O)g(with)f(\014le,)i(device,)h(or)e(windo)m(w)f
+(system)h(I/O,)g(t)m(ypically)i(b)m(y)e(using)g(a)g(main)150
+5035 y(lo)s(op)f(to)g Fs(select\(\))e Ft(on)h(v)-5 b(arious)28
+b(\014le)g(descriptors.)39 b(T)-8 b(o)28 b(accomo)s(date)i(this)e
+(need,)g(readline)g(can)g(also)h(b)s(e)150 5145 y(in)m(v)m(ok)m(ed)k
+(as)e(a)h(`callbac)m(k')h(function)e(from)g(an)g(ev)m(en)m(t)h(lo)s
+(op.)44 b(There)30 b(are)i(functions)f(a)m(v)-5 b(ailable)33
+b(to)f(mak)m(e)150 5254 y(this)e(easy)-8 b(.)p eop end
+%%Page: 38 42
+TeXDict begin 38 41 bop 150 -116 a Ft(38)2600 b(GNU)31
+b(Readline)g(Library)3350 299 y([F)-8 b(unction])-3599
+b Fg(void)39 b Ff(rl)p 484 299 35 5 v 51 w(callbac)m(k)p
+934 299 V 49 w(handler)p 1363 299 V 49 w(install)44 b
+Fe(\()p Fs(const)29 b(char)g(*prompt,)565 408 y(rl_vcpfunc_t)e
+(*lhandler)p Fe(\))390 518 y Ft(Set)e(up)f(the)h(terminal)g(for)f
+(readline)i(I/O)e(and)g(displa)m(y)h(the)g(initial)h(expanded)e(v)-5
+b(alue)26 b(of)f Fi(prompt)p Ft(.)390 628 y(Sa)m(v)m(e)33
+b(the)f(v)-5 b(alue)32 b(of)g Fi(lhandler)37 b Ft(to)c(use)e(as)h(a)g
+(function)f(to)h(call)h(when)e(a)h(complete)h(line)f(of)g(input)390
+737 y(has)e(b)s(een)g(en)m(tered.)41 b(The)30 b(function)g(tak)m(es)i
+(the)e(text)i(of)e(the)h(line)g(as)f(an)g(argumen)m(t.)3350
+925 y([F)-8 b(unction])-3599 b Fg(void)39 b Ff(rl)p 484
+925 V 51 w(callbac)m(k)p 934 925 V 49 w(read)p 1203 925
+V 50 w(c)m(har)44 b Fe(\()p Fs(void)p Fe(\))390 1035
+y Ft(Whenev)m(er)34 b(an)g(application)h(determines)e(that)i(k)m(eyb)s
+(oard)e(input)g(is)h(a)m(v)-5 b(ailable,)37 b(it)d(should)f(call)390
+1144 y Fs(rl_callback_read_char\(\))p Ft(,)17 b(whic)m(h)22
+b(will)g(read)f(the)h(next)g(c)m(haracter)h(from)f(the)f(curren)m(t)h
+(input)390 1254 y(source.)77 b(If)41 b(that)i(c)m(haracter)h(completes)
+g(the)e(line,)k Fs(rl_callback_read_char)36 b Ft(will)43
+b(in)m(v)m(ok)m(e)390 1364 y(the)36 b Fi(lhandler)41
+b Ft(function)35 b(sa)m(v)m(ed)h(b)m(y)g Fs(rl_callback_handler_ins)o
+(tall)29 b Ft(to)36 b(pro)s(cess)f(the)g(line.)390 1473
+y(Before)28 b(calling)g(the)f Fi(lhandler)32 b Ft(function,)c(the)e
+(terminal)i(settings)f(are)g(reset)h(to)f(the)g(v)-5
+b(alues)27 b(they)390 1583 y(had)i(b)s(efore)g(calling)j
+Fs(rl_callback_handler_ins)o(tall)o Ft(.)j(If)29 b(the)h
+Fi(lhandler)36 b Ft(function)29 b(returns,)390 1692 y(the)c(terminal)g
+(settings)h(are)f(mo)s(di\014ed)e(for)i(Readline's)g(use)f(again.)40
+b Fs(EOF)24 b Ft(is)h(indicated)g(b)m(y)f(calling)390
+1802 y Fi(lhandler)36 b Ft(with)30 b(a)h Fs(NULL)e Ft(line.)3350
+1990 y([F)-8 b(unction])-3599 b Fg(void)39 b Ff(rl)p
+484 1990 V 51 w(callbac)m(k)p 934 1990 V 49 w(handler)p
+1363 1990 V 49 w(remo)m(v)m(e)45 b Fe(\()p Fs(void)p
+Fe(\))390 2100 y Ft(Restore)38 b(the)f(terminal)h(to)g(its)f(initial)i
+(state)f(and)f(remo)m(v)m(e)h(the)g(line)f(handler.)60
+b(This)37 b(ma)m(y)h(b)s(e)390 2209 y(called)f(from)f(within)g(a)h
+(callbac)m(k)h(as)f(w)m(ell)g(as)f(indep)s(enden)m(tly)-8
+b(.)58 b(If)36 b(the)h Fi(lhandler)42 b Ft(installed)37
+b(b)m(y)390 2319 y Fs(rl_callback_handler_inst)o(all)32
+b Ft(do)s(es)39 b(not)g(exit)g(the)g(program,)i(either)e(this)g
+(function)f(or)390 2428 y(the)32 b(function)f(referred)f(to)i(b)m(y)g
+(the)f(v)-5 b(alue)32 b(of)g Fs(rl_deprep_term_function)25
+b Ft(should)30 b(b)s(e)h(called)390 2538 y(b)s(efore)f(the)h(program)f
+(exits)h(to)g(reset)g(the)f(terminal)h(settings.)150
+2766 y Fh(2.4.13)63 b(A)41 b(Readline)f(Example)275 3012
+y Ft(Here)f(is)g(a)g(function)g(whic)m(h)g(c)m(hanges)h(lo)m(w)m
+(ercase)h(c)m(haracters)g(to)e(their)g(upp)s(ercase)f(equiv)-5
+b(alen)m(ts,)150 3121 y(and)38 b(upp)s(ercase)f(c)m(haracters)j(to)f
+(lo)m(w)m(ercase.)68 b(If)37 b(this)i(function)f(w)m(as)h(b)s(ound)d
+(to)j(`)p Fs(M-c)p Ft(',)h(then)e(t)m(yping)150 3231
+y(`)p Fs(M-c)p Ft(')26 b(w)m(ould)g(c)m(hange)h(the)g(case)g(of)g(the)f
+(c)m(haracter)i(under)d(p)s(oin)m(t.)39 b(T)m(yping)26
+b(`)p Fs(M-1)k(0)g(M-c)p Ft(')c(w)m(ould)g(c)m(hange)150
+3341 y(the)31 b(case)g(of)g(the)f(follo)m(wing)i(10)f(c)m(haracters,)h
+(lea)m(ving)g(the)f(cursor)f(on)g(the)g(last)i(c)m(haracter)g(c)m
+(hanged.)390 3477 y Fs(/*)47 b(Invert)f(the)h(case)g(of)g(the)g(COUNT)f
+(following)g(characters.)e(*/)390 3587 y(int)390 3696
+y(invert_case_line)f(\(count,)j(key\))629 3806 y(int)h(count,)f(key;)
+390 3915 y({)485 4025 y(register)g(int)h(start,)f(end,)h(i;)485
+4244 y(start)g(=)g(rl_point;)485 4463 y(if)h(\(rl_point)d(>=)i
+(rl_end\))581 4573 y(return)f(\(0\);)485 4792 y(if)i(\(count)e(<)h(0\))
+581 4902 y({)676 5011 y(direction)f(=)h(-1;)676 5121
+y(count)g(=)g(-count;)581 5230 y(})485 5340 y(else)p
+eop end
+%%Page: 39 43
+TeXDict begin 39 42 bop 150 -116 a Ft(Chapter)30 b(2:)41
+b(Programming)30 b(with)g(GNU)h(Readline)1683 b(39)581
+299 y Fs(direction)45 b(=)j(1;)485 518 y(/*)g(Find)e(the)h(end)g(of)g
+(the)g(range)g(to)g(modify.)f(*/)485 628 y(end)h(=)h(start)e(+)i
+(\(count)e(*)h(direction\);)485 847 y(/*)h(Force)e(it)h(to)g(be)h
+(within)e(range.)g(*/)485 956 y(if)i(\(end)e(>)i(rl_end\))581
+1066 y(end)f(=)g(rl_end;)485 1176 y(else)g(if)g(\(end)g(<)g(0\))581
+1285 y(end)g(=)g(0;)485 1504 y(if)h(\(start)e(==)h(end\))581
+1614 y(return)f(\(0\);)485 1833 y(if)i(\(start)e(>)h(end\))581
+1943 y({)676 2052 y(int)g(temp)g(=)g(start;)676 2162
+y(start)g(=)g(end;)676 2271 y(end)g(=)h(temp;)581 2381
+y(})485 2600 y(/*)g(Tell)e(readline)g(that)g(we)i(are)f(modifying)e
+(the)i(line,)629 2710 y(so)g(it)g(will)g(save)f(the)h(undo)g
+(information.)d(*/)485 2819 y(rl_modifying)h(\(start,)h(end\);)485
+3039 y(for)h(\(i)h(=)f(start;)f(i)i(!=)f(end;)f(i++\))581
+3148 y({)676 3258 y(if)i(\(_rl_uppercase_p)43 b
+(\(rl_line_buffer[i]\)\))772 3367 y(rl_line_buffer[i])g(=)k
+(_rl_to_lower)e(\(rl_line_buffer[i]\);)676 3477 y(else)i(if)g
+(\(_rl_lowercase_p)d(\(rl_line_buffer[i]\)\))772 3587
+y(rl_line_buffer[i])f(=)k(_rl_to_upper)e(\(rl_line_buffer[i]\);)581
+3696 y(})485 3806 y(/*)j(Move)e(point)h(to)g(on)g(top)g(of)g(the)g
+(last)g(character)e(changed.)g(*/)485 3915 y(rl_point)h(=)h
+(\(direction)e(==)j(1\))f(?)g(end)g(-)h(1)f(:)h(start;)485
+4025 y(return)f(\(0\);)390 4134 y(})150 4425 y Fr(2.5)68
+b(Readline)47 b(Signal)e(Handling)275 4682 y Ft(Signals)c(are)h(async)m
+(hronous)g(ev)m(en)m(ts)h(sen)m(t)f(to)g(a)g(pro)s(cess)f(b)m(y)h(the)g
+(Unix)f(k)m(ernel,)k(sometimes)e(on)150 4792 y(b)s(ehalf)c(of)h
+(another)g(pro)s(cess.)68 b(They)39 b(are)h(in)m(tended)g(to)g
+(indicate)h(exceptional)h(ev)m(en)m(ts,)i(lik)m(e)d(a)f(user)150
+4902 y(pressing)29 b(the)i(in)m(terrupt)e(k)m(ey)i(on)f(his)f
+(terminal,)i(or)f(a)g(net)m(w)m(ork)h(connection)g(b)s(eing)f(brok)m
+(en.)40 b(There)30 b(is)150 5011 y(a)d(class)g(of)f(signals)h(that)g
+(can)g(b)s(e)f(sen)m(t)h(to)g(the)f(pro)s(cess)g(curren)m(tly)h
+(reading)f(input)f(from)h(the)h(k)m(eyb)s(oard.)150 5121
+y(Since)g(Readline)g(c)m(hanges)h(the)e(terminal)i(attributes)f(when)f
+(it)h(is)f(called,)j(it)e(needs)g(to)g(p)s(erform)e(sp)s(ecial)150
+5230 y(pro)s(cessing)i(when)g(suc)m(h)g(a)h(signal)g(is)g(receiv)m(ed)h
+(in)e(order)g(to)h(restore)h(the)e(terminal)h(to)h(a)f(sane)f(state,)j
+(or)150 5340 y(pro)m(vide)g(application)i(writers)e(with)g(functions)g
+(to)h(do)g(so)f(man)m(ually)-8 b(.)p eop end
+%%Page: 40 44
+TeXDict begin 40 43 bop 150 -116 a Ft(40)2600 b(GNU)31
+b(Readline)g(Library)275 299 y(Readline)40 b(con)m(tains)i(an)e(in)m
+(ternal)h(signal)g(handler)f(that)h(is)f(installed)h(for)f(a)h(n)m(um)m
+(b)s(er)e(of)h(signals)150 408 y(\()p Fs(SIGINT)p Ft(,)k
+Fs(SIGQUIT)p Ft(,)f Fs(SIGTERM)p Ft(,)g Fs(SIGALRM)p
+Ft(,)h Fs(SIGTSTP)p Ft(,)f Fs(SIGTTIN)p Ft(,)g(and)e
+Fs(SIGTTOU)p Ft(\).)75 b(When)41 b(one)i(of)150 518 y(these)32
+b(signals)g(is)g(receiv)m(ed,)i(the)e(signal)g(handler)f(will)h(reset)g
+(the)g(terminal)g(attributes)h(to)f(those)g(that)150
+628 y(w)m(ere)c(in)f(e\013ect)h(b)s(efore)f Fs(readline\(\))d
+Ft(w)m(as)k(called,)h(reset)f(the)g(signal)f(handling)g(to)h(what)f(it)
+h(w)m(as)f(b)s(efore)150 737 y Fs(readline\(\))42 b Ft(w)m(as)k
+(called,)k(and)44 b(resend)h(the)g(signal)h(to)g(the)f(calling)i
+(application.)86 b(If)44 b(and)h(when)150 847 y(the)34
+b(calling)i(application's)f(signal)g(handler)e(returns,)h(Readline)g
+(will)h(reinitialize)h(the)e(terminal)h(and)150 956 y(con)m(tin)m(ue)29
+b(to)g(accept)h(input.)39 b(When)28 b(a)h Fs(SIGINT)d
+Ft(is)j(receiv)m(ed,)h(the)e(Readline)h(signal)g(handler)f(p)s(erforms)
+150 1066 y(some)39 b(additional)h(w)m(ork,)h(whic)m(h)d(will)h(cause)g
+(an)m(y)h(partially-en)m(tered)g(line)f(to)h(b)s(e)e(ab)s(orted)g
+(\(see)i(the)150 1176 y(description)30 b(of)h Fs
+(rl_free_line_state\(\))25 b Ft(b)s(elo)m(w\).)275 1323
+y(There)e(is)i(an)f(additional)h(Readline)g(signal)g(handler,)g(for)f
+Fs(SIGWINCH)p Ft(,)g(whic)m(h)g(the)g(k)m(ernel)h(sends)e(to)j(a)150
+1433 y(pro)s(cess)i(whenev)m(er)h(the)g(terminal's)g(size)h(c)m(hanges)
+g(\(for)f(example,)h(if)f(a)g(user)f(resizes)i(an)e Fs(xterm)p
+Ft(\).)39 b(The)150 1542 y(Readline)d Fs(SIGWINCH)e Ft(handler)g(up)s
+(dates)h(Readline's)h(in)m(ternal)h(screen)e(size)i(information,)g(and)
+e(then)150 1652 y(calls)g(an)m(y)f Fs(SIGWINCH)e Ft(signal)i(handler)f
+(the)h(calling)h(application)g(has)f(installed.)51 b(Readline)35
+b(calls)g(the)150 1762 y(application's)i Fs(SIGWINCH)c
+Ft(signal)i(handler)g(without)g(resetting)h(the)g(terminal)f(to)h(its)g
+(original)g(state.)150 1871 y(If)31 b(the)i(application's)g(signal)g
+(handler)e(do)s(es)g(more)h(than)g(up)s(date)f(its)i(idea)f(of)g(the)g
+(terminal)h(size)g(and)150 1981 y(return)28 b(\(for)i(example,)h(a)f
+Fs(longjmp)d Ft(bac)m(k)k(to)f(a)g(main)g(pro)s(cessing)f(lo)s(op\),)h
+(it)g Fn(must)39 b Ft(call)31 b Fs(rl_cleanup_)150 2090
+y(after_signal\(\))26 b Ft(\(describ)s(ed)k(b)s(elo)m(w\),)h(to)g
+(restore)g(the)g(terminal)g(state.)275 2238 y(Readline)e(pro)m(vides)f
+(t)m(w)m(o)i(v)-5 b(ariables)29 b(that)h(allo)m(w)g(application)g
+(writers)e(to)h(con)m(trol)h(whether)e(or)h(not)150 2348
+y(it)34 b(will)f(catc)m(h)i(certain)f(signals)f(and)g(act)h(on)f(them)g
+(when)f(they)i(are)f(receiv)m(ed.)51 b(It)33 b(is)g(imp)s(ortan)m(t)g
+(that)150 2457 y(applications)38 b(c)m(hange)g(the)e(v)-5
+b(alues)37 b(of)g(these)g(v)-5 b(ariables)37 b(only)g(when)f(calling)i
+Fs(readline\(\))p Ft(,)d(not)i(in)g(a)150 2567 y(signal)31
+b(handler,)f(so)g(Readline's)i(in)m(ternal)f(signal)g(state)h(is)e(not)
+h(corrupted.)3371 2777 y([V)-8 b(ariable])-3598 b Fg(int)39
+b Ff(rl)p 432 2777 35 5 v 51 w(catc)m(h)p 747 2777 V
+48 w(signals)390 2887 y Ft(If)28 b(this)h(v)-5 b(ariable)30
+b(is)f(non-zero,)h(Readline)f(will)g(install)h(signal)f(handlers)f(for)
+h Fs(SIGINT)p Ft(,)f Fs(SIGQUIT)p Ft(,)390 2997 y Fs(SIGTERM)p
+Ft(,)h Fs(SIGALRM)p Ft(,)f Fs(SIGTSTP)p Ft(,)h Fs(SIGTTIN)p
+Ft(,)g(and)g Fs(SIGTTOU)p Ft(.)390 3144 y(The)h(default)g(v)-5
+b(alue)31 b(of)g Fs(rl_catch_signals)26 b Ft(is)k(1.)3371
+3355 y([V)-8 b(ariable])-3598 b Fg(int)39 b Ff(rl)p 432
+3355 V 51 w(catc)m(h)p 747 3355 V 48 w(sigwinc)m(h)390
+3465 y Ft(If)30 b(this)g(v)-5 b(ariable)31 b(is)g(non-zero,)g(Readline)
+g(will)g(install)g(a)g(signal)g(handler)e(for)h Fs(SIGWINCH)p
+Ft(.)390 3612 y(The)g(default)g(v)-5 b(alue)31 b(of)g
+Fs(rl_catch_sigwinch)25 b Ft(is)31 b(1.)275 3823 y(If)f(an)h
+(application)h(do)s(es)f(not)g(wish)f(to)i(ha)m(v)m(e)g(Readline)g
+(catc)m(h)g(an)m(y)f(signals,)h(or)f(to)h(handle)e(signals)150
+3932 y(other)39 b(than)f(those)h(Readline)h(catc)m(hes)g(\()p
+Fs(SIGHUP)p Ft(,)g(for)e(example\),)k(Readline)d(pro)m(vides)g(con)m(v)
+m(enience)150 4042 y(functions)30 b(to)h(do)f(the)h(necessary)g
+(terminal)g(and)e(in)m(ternal)i(state)h(clean)m(up)f(up)s(on)e(receipt)
+i(of)g(a)f(signal.)3350 4253 y([F)-8 b(unction])-3599
+b Fg(void)39 b Ff(rl)p 484 4253 V 51 w(clean)m(up)p 916
+4253 V 48 w(after)p 1200 4253 V 49 w(signal)45 b Fe(\()p
+Fs(void)p Fe(\))390 4362 y Ft(This)33 b(function)h(will)g(reset)g(the)g
+(state)i(of)e(the)g(terminal)g(to)h(what)f(it)g(w)m(as)g(b)s(efore)g
+Fs(readline\(\))390 4472 y Ft(w)m(as)c(called,)h(and)d(remo)m(v)m(e)j
+(the)f(Readline)g(signal)g(handlers)e(for)h(all)h(signals,)h(dep)s
+(ending)d(on)h(the)390 4581 y(v)-5 b(alues)31 b(of)f
+Fs(rl_catch_signals)c Ft(and)k Fs(rl_catch_sigwinch)p
+Ft(.)3350 4792 y([F)-8 b(unction])-3599 b Fg(void)39
+b Ff(rl)p 484 4792 V 51 w(free)p 723 4792 V 49 w(line)p
+953 4792 V 50 w(state)44 b Fe(\()p Fs(void)p Fe(\))390
+4902 y Ft(This)38 b(will)i(free)f(an)m(y)h(partial)g(state)g(asso)s
+(ciated)h(with)e(the)g(curren)m(t)g(input)f(line)i(\(undo)e(infor-)390
+5011 y(mation,)46 b(an)m(y)d(partial)h(history)e(en)m(try)-8
+b(,)47 b(an)m(y)42 b(partially-en)m(tered)j(k)m(eyb)s(oard)d(macro,)47
+b(and)42 b(an)m(y)390 5121 y(partially-en)m(tered)50
+b(n)m(umeric)d(argumen)m(t\).)94 b(This)47 b(should)g(b)s(e)g(called)i
+(b)s(efore)e Fs(rl_cleanup_)390 5230 y(after_signal\(\))p
+Ft(.)74 b(The)42 b(Readline)h(signal)g(handler)f(for)h
+Fs(SIGINT)e Ft(calls)i(this)g(to)g(ab)s(ort)g(the)390
+5340 y(curren)m(t)30 b(input)g(line.)p eop end
+%%Page: 41 45
+TeXDict begin 41 44 bop 150 -116 a Ft(Chapter)30 b(2:)41
+b(Programming)30 b(with)g(GNU)h(Readline)1683 b(41)3350
+299 y([F)-8 b(unction])-3599 b Fg(void)39 b Ff(rl)p 484
+299 35 5 v 51 w(reset)p 778 299 V 49 w(after)p 1063 299
+V 50 w(signal)44 b Fe(\()p Fs(void)p Fe(\))390 408 y
+Ft(This)28 b(will)g(reinitialize)j(the)e(terminal)g(and)f(reinstall)h
+(an)m(y)g(Readline)g(signal)g(handlers,)f(dep)s(end-)390
+518 y(ing)j(on)f(the)g(v)-5 b(alues)31 b(of)g Fs(rl_catch_signals)26
+b Ft(and)j Fs(rl_catch_sigwinch)p Ft(.)275 703 y(If)38
+b(an)i(application)g(do)s(es)f(not)h(wish)f(Readline)h(to)g(catc)m(h)h
+Fs(SIGWINCH)p Ft(,)e(it)h(ma)m(y)g(call)h Fs(rl_resize_)150
+812 y(terminal\(\))24 b Ft(or)j Fs(rl_set_screen_size\(\))22
+b Ft(to)28 b(force)g(Readline)f(to)h(up)s(date)f(its)g(idea)h(of)f(the)
+g(terminal)150 922 y(size)k(when)f(a)g Fs(SIGWINCH)e
+Ft(is)j(receiv)m(ed.)3350 1106 y([F)-8 b(unction])-3599
+b Fg(void)39 b Ff(rl)p 484 1106 V 51 w(resize)p 816 1106
+V 49 w(terminal)45 b Fe(\()p Fs(void)p Fe(\))390 1216
+y Ft(Up)s(date)30 b(Readline's)h(in)m(ternal)g(screen)g(size)g(b)m(y)f
+(reading)h(v)-5 b(alues)31 b(from)f(the)g(k)m(ernel.)3350
+1400 y([F)-8 b(unction])-3599 b Fg(void)39 b Ff(rl)p
+484 1400 V 51 w(set)p 678 1400 V 49 w(screen)p 1040 1400
+V 50 w(size)45 b Fe(\()p Fs(int)30 b(rows,)f(int)g(cols)p
+Fe(\))390 1510 y Ft(Set)f(Readline's)h(idea)g(of)f(the)g(terminal)h
+(size)g(to)g Fi(ro)m(ws)j Ft(ro)m(ws)c(and)f Fi(cols)33
+b Ft(columns.)40 b(If)27 b(either)i Fi(ro)m(ws)390 1619
+y Ft(or)35 b Fi(columns)k Ft(is)c(less)g(than)g(or)g(equal)h(to)g(0,)h
+(Readline's)f(idea)g(of)f(that)h(terminal)f(dimension)g(is)390
+1729 y(unc)m(hanged.)275 1913 y(If)d(an)i(application)g(do)s(es)f(not)h
+(w)m(an)m(t)g(to)g(install)g(a)g Fs(SIGWINCH)d Ft(handler,)j(but)e(is)i
+(still)g(in)m(terested)g(in)150 2023 y(the)d(screen)f(dimensions,)g
+(Readline's)h(idea)g(of)g(the)f(screen)h(size)g(ma)m(y)g(b)s(e)f
+(queried.)3350 2207 y([F)-8 b(unction])-3599 b Fg(void)39
+b Ff(rl)p 484 2207 V 51 w(get)p 690 2207 V 50 w(screen)p
+1053 2207 V 49 w(size)45 b Fe(\()p Fs(int)30 b(*rows,)e(int)i(*cols)p
+Fe(\))390 2317 y Ft(Return)f(Readline's)i(idea)g(of)f(the)g(terminal's)
+h(size)g(in)f(the)g(v)-5 b(ariables)31 b(p)s(oin)m(ted)f(to)g(b)m(y)g
+(the)h(argu-)390 2427 y(men)m(ts.)3350 2611 y([F)-8 b(unction])-3599
+b Fg(void)39 b Ff(rl)p 484 2611 V 51 w(reset)p 778 2611
+V 49 w(screen)p 1140 2611 V 50 w(size)44 b Fe(\()p Fs(void)p
+Fe(\))390 2721 y Ft(Cause)30 b(Readline)h(to)g(reobtain)g(the)g(screen)
+f(size)h(and)f(recalculate)j(its)e(dimensions.)275 2905
+y(The)e(follo)m(wing)j(functions)e(install)h(and)f(remo)m(v)m(e)i
+(Readline's)f(signal)g(handlers.)3350 3090 y([F)-8 b(unction])-3599
+b Fg(int)39 b Ff(rl)p 432 3090 V 51 w(set)p 626 3090
+V 49 w(signals)45 b Fe(\()p Fs(void)p Fe(\))390 3199
+y Ft(Install)36 b(Readline's)f(signal)h(handler)e(for)h
+Fs(SIGINT)p Ft(,)g Fs(SIGQUIT)p Ft(,)g Fs(SIGTERM)p Ft(,)f
+Fs(SIGALRM)p Ft(,)h Fs(SIGTSTP)p Ft(,)390 3309 y Fs(SIGTTIN)p
+Ft(,)23 b Fs(SIGTTOU)p Ft(,)g(and)f Fs(SIGWINCH)p Ft(,)h(dep)s(ending)f
+(on)h(the)g(v)-5 b(alues)23 b(of)h Fs(rl_catch_signals)19
+b Ft(and)390 3418 y Fs(rl_catch_sigwinch)p Ft(.)3350
+3603 y([F)-8 b(unction])-3599 b Fg(int)39 b Ff(rl)p 432
+3603 V 51 w(clear)p 722 3603 V 49 w(signals)45 b Fe(\()p
+Fs(void)p Fe(\))390 3712 y Ft(Remo)m(v)m(e)32 b(all)f(of)g(the)g
+(Readline)g(signal)g(handlers)e(installed)i(b)m(y)f Fs
+(rl_set_signals\(\))p Ft(.)150 3970 y Fr(2.6)68 b(Custom)45
+b(Completers)275 4214 y Ft(T)m(ypically)-8 b(,)35 b(a)f(program)f(that)
+h(reads)f(commands)f(from)h(the)g(user)g(has)g(a)g(w)m(a)m(y)i(of)e
+(disam)m(biguating)150 4324 y(commands)i(and)g(data.)56
+b(If)35 b(y)m(our)h(program)f(is)g(one)h(of)g(these,)h(then)e(it)h(can)
+g(pro)m(vide)f(completion)i(for)150 4433 y(commands,)29
+b(data,)i(or)e(b)s(oth.)39 b(The)29 b(follo)m(wing)i(sections)f
+(describ)s(e)e(ho)m(w)i(y)m(our)f(program)g(and)f(Readline)150
+4543 y(co)s(op)s(erate)j(to)h(pro)m(vide)e(this)g(service.)150
+4767 y Fh(2.6.1)63 b(Ho)m(w)40 b(Completing)i(W)-10 b(orks)275
+5011 y Ft(In)33 b(order)h(to)h(complete)h(some)e(text,)j(the)d(full)g
+(list)h(of)f(p)s(ossible)g(completions)i(m)m(ust)e(b)s(e)f(a)m(v)-5
+b(ailable.)150 5121 y(That)34 b(is,)h(it)g(is)f(not)g(p)s(ossible)g(to)
+g(accurately)i(expand)d(a)i(partial)g(w)m(ord)e(without)h(kno)m(wing)h
+(all)g(of)f(the)150 5230 y(p)s(ossible)g(w)m(ords)h(whic)m(h)g(mak)m(e)
+h(sense)e(in)h(that)h(con)m(text.)56 b(The)34 b(Readline)i(library)f
+(pro)m(vides)f(the)i(user)150 5340 y(in)m(terface)f(to)f(completion,)h
+(and)e(t)m(w)m(o)i(of)e(the)g(most)h(common)g(completion)g(functions:)
+46 b(\014lename)34 b(and)p eop end
+%%Page: 42 46
+TeXDict begin 42 45 bop 150 -116 a Ft(42)2600 b(GNU)31
+b(Readline)g(Library)150 299 y(username.)37 b(F)-8 b(or)23
+b(completing)g(other)e(t)m(yp)s(es)h(of)g(text,)j(y)m(ou)d(m)m(ust)f
+(write)h(y)m(our)f(o)m(wn)h(completion)h(function.)150
+408 y(This)30 b(section)h(describ)s(es)f(exactly)i(what)e(suc)m(h)g
+(functions)g(m)m(ust)g(do,)h(and)f(pro)m(vides)g(an)g(example.)275
+535 y(There)f(are)i(three)g(ma)5 b(jor)30 b(functions)g(used)g(to)h(p)s
+(erform)e(completion:)199 662 y(1.)61 b(The)43 b(user-in)m(terface)h
+(function)f Fs(rl_complete\(\))p Ft(.)76 b(This)43 b(function)g(is)g
+(called)i(with)e(the)h(same)330 771 y(argumen)m(ts)36
+b(as)g(other)g(bindable)f(Readline)h(functions:)51 b
+Fi(coun)m(t)38 b Ft(and)d Fi(in)m(v)m(oking)p 3107 771
+28 4 v 41 w(k)m(ey)p Ft(.)57 b(It)36 b(isolates)330 881
+y(the)i(w)m(ord)f(to)h(b)s(e)f(completed)i(and)d(calls)j
+Fs(rl_completion_matches\(\))31 b Ft(to)39 b(generate)g(a)f(list)g(of)
+330 990 y(p)s(ossible)31 b(completions.)44 b(It)31 b(then)g(either)g
+(lists)h(the)f(p)s(ossible)g(completions,)h(inserts)f(the)g(p)s
+(ossible)330 1100 y(completions,)50 b(or)45 b(actually)i(p)s(erforms)d
+(the)h(completion,)50 b(dep)s(ending)44 b(on)h(whic)m(h)g(b)s(eha)m
+(vior)g(is)330 1210 y(desired.)199 1336 y(2.)61 b(The)33
+b(in)m(ternal)h(function)g Fs(rl_completion_matches\(\))27
+b Ft(uses)33 b(an)g(application-supplied)h Fi(gener-)330
+1446 y(ator)44 b Ft(function)37 b(to)h(generate)g(the)f(list)h(of)f(p)s
+(ossible)f(matc)m(hes,)k(and)d(then)f(returns)g(the)h(arra)m(y)h(of)330
+1555 y(these)h(matc)m(hes.)68 b(The)39 b(caller)h(should)e(place)i(the)
+f(address)f(of)h(its)g(generator)i(function)d(in)h Fs(rl_)330
+1665 y(completion_entry_functio)o(n)p Ft(.)199 1792 y(3.)61
+b(The)22 b(generator)i(function)f(is)g(called)h(rep)s(eatedly)f(from)g
+Fs(rl_completion_matches\(\))o Ft(,)c(returning)330 1901
+y(a)33 b(string)g(eac)m(h)h(time.)49 b(The)32 b(argumen)m(ts)h(to)h
+(the)f(generator)h(function)e(are)h Fi(text)j Ft(and)c
+Fi(state)p Ft(.)50 b Fi(text)330 2011 y Ft(is)32 b(the)g(partial)h(w)m
+(ord)f(to)h(b)s(e)e(completed.)47 b Fi(state)38 b Ft(is)32
+b(zero)h(the)f(\014rst)g(time)g(the)h(function)e(is)h(called,)330
+2120 y(allo)m(wing)46 b(the)e(generator)h(to)f(p)s(erform)f(an)m(y)h
+(necessary)g(initialization,)51 b(and)43 b(a)h(p)s(ositiv)m(e)h(non-)
+330 2230 y(zero)30 b(in)m(teger)h(for)d(eac)m(h)j(subsequen)m(t)d
+(call.)42 b(The)29 b(generator)h(function)f(returns)f
+Fs(\(char)h(*\)NULL)e Ft(to)330 2339 y(inform)37 b Fs
+(rl_completion_matches\(\))32 b Ft(that)39 b(there)f(are)g(no)g(more)g
+(p)s(ossibilities)h(left.)65 b(Usually)330 2449 y(the)39
+b(generator)h(function)e(computes)h(the)g(list)g(of)g(p)s(ossible)f
+(completions)i(when)e Fi(state)45 b Ft(is)39 b(zero,)330
+2559 y(and)25 b(returns)f(them)i(one)f(at)i(a)f(time)g(on)f(subsequen)m
+(t)g(calls.)40 b(Eac)m(h)26 b(string)g(the)g(generator)g(function)330
+2668 y(returns)31 b(as)h(a)g(matc)m(h)h(m)m(ust)f(b)s(e)f(allo)s(cated)
+j(with)d Fs(malloc\(\))p Ft(;)g(Readline)h(frees)g(the)g(strings)g
+(when)330 2778 y(it)i(has)g(\014nished)e(with)i(them.)51
+b(Suc)m(h)33 b(a)h(generator)h(function)f(is)g(referred)f(to)h(as)h(an)
+e Fi(application-)330 2887 y(sp)s(eci\014c)d(completion)i(function)p
+Ft(.)3350 3048 y([F)-8 b(unction])-3599 b Fg(int)39 b
+Ff(rl)p 432 3048 35 5 v 51 w(complete)44 b Fe(\()p Fs(int)30
+b(ignore,)e(int)h(invoking_key)p Fe(\))390 3158 y Ft(Complete)i(the)g
+(w)m(ord)g(at)g(or)g(b)s(efore)f(p)s(oin)m(t.)41 b(Y)-8
+b(ou)32 b(ha)m(v)m(e)g(supplied)d(the)i(function)f(that)h(do)s(es)g
+(the)390 3267 y(initial)42 b(simple)f(matc)m(hing)i(selection)f
+(algorithm)h(\(see)f Fs(rl_completion_matches\(\))o Ft(\).)67
+b(The)390 3377 y(default)31 b(is)f(to)h(do)f(\014lename)h(completion.)
+3371 3537 y([V)-8 b(ariable])-3598 b Fg(rl_compentry_func_t)44
+b(*)38 b Ff(rl)p 1359 3537 V 51 w(completion)p 1960 3537
+V 49 w(en)m(try)p 2275 3537 V 50 w(function)390 3647
+y Ft(This)h(is)h(a)g(p)s(oin)m(ter)g(to)h(the)f(generator)h(function)f
+(for)f Fs(rl_completion_matches\(\))p Ft(.)63 b(If)40
+b(the)390 3757 y(v)-5 b(alue)24 b(of)g Fs(rl_completion_entry_funct)o
+(ion)17 b Ft(is)24 b Fs(NULL)f Ft(then)g(the)h(default)g(\014lename)g
+(generator)390 3866 y(function,)49 b Fs(rl_filename_completion_)o(fun)o
+(ctio)o(n\(\))p Ft(,)42 b(is)j(used.)84 b(An)44 b Fi(application-sp)s
+(eci\014c)390 3976 y(completion)22 b(function)f Ft(is)g(a)h(function)e
+(whose)h(address)f(is)h(assigned)h(to)f Fs(rl_completion_entry_)390
+4085 y(function)28 b Ft(and)i(whose)g(return)f(v)-5 b(alues)31
+b(are)g(used)e(to)j(generate)f(p)s(ossible)f(completions.)150
+4286 y Fh(2.6.2)63 b(Completion)41 b(F)-10 b(unctions)275
+4522 y Ft(Here)30 b(is)h(the)f(complete)i(list)f(of)g(callable)h
+(completion)g(functions)e(presen)m(t)g(in)g(Readline.)3350
+4682 y([F)-8 b(unction])-3599 b Fg(int)39 b Ff(rl)p 432
+4682 V 51 w(complete)p 933 4682 V 49 w(in)m(ternal)k
+Fe(\()p Fs(int)30 b(what_to_do)p Fe(\))390 4792 y Ft(Complete)37
+b(the)g(w)m(ord)f(at)i(or)e(b)s(efore)g(p)s(oin)m(t.)60
+b Fi(what)p 2208 4792 28 4 v 40 w(to)p 2328 4792 V 41
+w(do)41 b Ft(sa)m(ys)c(what)f(to)i(do)e(with)g(the)h(com-)390
+4902 y(pletion.)44 b(A)31 b(v)-5 b(alue)32 b(of)f(`)p
+Fs(?)p Ft(')g(means)h(list)f(the)h(p)s(ossible)e(completions.)45
+b(`)p Fs(TAB)p Ft(')31 b(means)g(do)g(standard)390 5011
+y(completion.)44 b(`)p Fs(*)p Ft(')32 b(means)f(insert)g(all)h(of)f
+(the)g(p)s(ossible)g(completions.)44 b(`)p Fs(!)p Ft(')32
+b(means)f(to)h(displa)m(y)f(all)390 5121 y(of)k(the)f(p)s(ossible)g
+(completions,)j(if)d(there)h(is)f(more)g(than)h(one,)g(as)g(w)m(ell)g
+(as)g(p)s(erforming)e(partial)390 5230 y(completion.)41
+b(`)p Fs(@)p Ft(')27 b(is)h(similar)f(to)h(`)p Fs(!)p
+Ft(',)h(but)d(p)s(ossible)h(completions)i(are)e(not)h(listed)g(if)f
+(the)g(p)s(ossible)390 5340 y(completions)32 b(share)e(a)g(common)h
+(pre\014x.)p eop end
+%%Page: 43 47
+TeXDict begin 43 46 bop 150 -116 a Ft(Chapter)30 b(2:)41
+b(Programming)30 b(with)g(GNU)h(Readline)1683 b(43)3350
+299 y([F)-8 b(unction])-3599 b Fg(int)39 b Ff(rl)p 432
+299 35 5 v 51 w(complete)44 b Fe(\()p Fs(int)30 b(ignore,)e(int)h
+(invoking_key)p Fe(\))390 408 y Ft(Complete)42 b(the)f(w)m(ord)g(at)h
+(or)f(b)s(efore)g(p)s(oin)m(t.)73 b(Y)-8 b(ou)41 b(ha)m(v)m(e)i
+(supplied)c(the)j(function)f(that)g(do)s(es)390 518 y(the)33
+b(initial)h(simple)f(matc)m(hing)h(selection)h(algorithm)f(\(see)g
+Fs(rl_completion_matches\(\))27 b Ft(and)390 628 y Fs
+(rl_completion_entry_func)o(tion)o Ft(\).)52 b(The)35
+b(default)h(is)g(to)h(do)e(\014lename)h(completion.)59
+b(This)390 737 y(calls)32 b Fs(rl_complete_internal\(\))24
+b Ft(with)30 b(an)g(argumen)m(t)h(dep)s(ending)e(on)h
+Fi(in)m(v)m(oking)p 3314 737 28 4 v 41 w(k)m(ey)p Ft(.)3350
+913 y([F)-8 b(unction])-3599 b Fg(int)39 b Ff(rl)p 432
+913 35 5 v 51 w(p)s(ossible)p 878 913 V 49 w(completions)45
+b Fe(\()p Fs(int)30 b(count,)e(int)i(invoking_key)p Fe(\))390
+1023 y Ft(List)41 b(the)f(p)s(ossible)g(completions.)73
+b(See)40 b(description)h(of)g Fs(rl_complete)27 b(\(\))p
+Ft(.)70 b(This)40 b(calls)i Fs(rl_)390 1132 y(complete_internal\(\))25
+b Ft(with)30 b(an)g(argumen)m(t)h(of)g(`)p Fs(?)p Ft('.)3350
+1308 y([F)-8 b(unction])-3599 b Fg(int)39 b Ff(rl)p 432
+1308 V 51 w(insert)p 769 1308 V 49 w(completions)44 b
+Fe(\()p Fs(int)30 b(count,)f(int)g(invoking_key)p Fe(\))390
+1418 y Ft(Insert)k(the)h(list)g(of)g(p)s(ossible)f(completions)i(in)m
+(to)f(the)g(line,)h(deleting)g(the)f(partially-completed)390
+1527 y(w)m(ord.)44 b(See)32 b(description)g(of)g Fs(rl_complete\(\))p
+Ft(.)41 b(This)31 b(calls)i Fs(rl_complete_internal\(\))25
+b Ft(with)390 1637 y(an)30 b(argumen)m(t)h(of)g(`)p Fs(*)p
+Ft('.)3350 1813 y([F)-8 b(unction])-3599 b Fg(int)39
+b Ff(rl)p 432 1813 V 51 w(completion)p 1033 1813 V 49
+w(mo)s(de)45 b Fe(\()p Fs(rl_command_func_t)26 b(*cfunc)p
+Fe(\))390 1922 y Ft(Returns)50 b(the)g(apppriate)h(v)-5
+b(alue)50 b(to)i(pass)e(to)h Fs(rl_complete_internal\(\))44
+b Ft(dep)s(ending)49 b(on)390 2032 y(whether)40 b Fi(cfunc)46
+b Ft(w)m(as)41 b(called)h(t)m(wice)g(in)f(succession)g(and)f(the)h(v)-5
+b(alues)41 b(of)g(the)g Fs(show-all-if-)390 2142 y(ambiguous)25
+b Ft(and)i Fs(show-all-if-unmodified)21 b Ft(v)-5 b(ariables.)41
+b(Application-sp)s(eci\014c)29 b(completion)390 2251
+y(functions)h(ma)m(y)h(use)f(this)g(function)g(to)h(presen)m(t)g(the)f
+(same)h(in)m(terface)h(as)f Fs(rl_complete\(\))p Ft(.)3350
+2427 y([F)-8 b(unction])-3599 b Fg(char)39 b(**)g Ff(rl)p
+627 2427 V 51 w(completion)p 1228 2427 V 49 w(matc)m(hes)44
+b Fe(\()p Fs(const)30 b(char)f(*text,)565 2537 y(rl_compentry_func_t)c
+(*entry_func)p Fe(\))390 2646 y Ft(Returns)37 b(an)h(arra)m(y)g(of)g
+(strings)g(whic)m(h)f(is)h(a)g(list)h(of)f(completions)h(for)e
+Fi(text)p Ft(.)64 b(If)38 b(there)g(are)g(no)390 2756
+y(completions,)f(returns)c Fs(NULL)p Ft(.)52 b(The)34
+b(\014rst)f(en)m(try)i(in)f(the)h(returned)e(arra)m(y)i(is)g(the)f
+(substitution)390 2865 y(for)26 b Fi(text)p Ft(.)40 b(The)26
+b(remaining)h(en)m(tries)g(are)g(the)f(p)s(ossible)g(completions.)40
+b(The)26 b(arra)m(y)h(is)f(terminated)390 2975 y(with)k(a)h
+Fs(NULL)e Ft(p)s(oin)m(ter.)390 3107 y Fi(en)m(try)p
+603 3107 28 4 v 40 w(func)44 b Ft(is)c(a)g(function)f(of)h(t)m(w)m(o)g
+(args,)j(and)38 b(returns)h(a)g Fs(char)30 b(*)p Ft(.)67
+b(The)39 b(\014rst)g(argumen)m(t)h(is)390 3216 y Fi(text)p
+Ft(.)66 b(The)39 b(second)f(is)h(a)g(state)h(argumen)m(t;)j(it)c(is)g
+(zero)g(on)g(the)g(\014rst)f(call,)k(and)c(non-zero)h(on)390
+3326 y(subsequen)m(t)33 b(calls.)52 b Fi(en)m(try)p 1320
+3326 V 41 w(func)38 b Ft(returns)33 b(a)h Fs(NULL)f Ft(p)s(oin)m(ter)g
+(to)i(the)f(caller)h(when)e(there)h(are)g(no)390 3435
+y(more)d(matc)m(hes.)3350 3611 y([F)-8 b(unction])-3599
+b Fg(char)39 b(*)g Ff(rl)p 575 3611 35 5 v 50 w(\014lename)p
+1042 3611 V 49 w(completion)p 1641 3611 V 49 w(function)44
+b Fe(\()p Fs(const)30 b(char)f(*text,)g(int)565 3721
+y(state)p Fe(\))390 3830 y Ft(A)d(generator)h(function)e(for)g
+(\014lename)h(completion)h(in)e(the)h(general)h(case.)40
+b Fi(text)28 b Ft(is)e(a)g(partial)h(\014le-)390 3940
+y(name.)38 b(The)21 b(Bash)g(source)h(is)g(a)f(useful)g(reference)h
+(for)f(writing)h(application-sp)s(eci\014c)h(completion)390
+4050 y(functions)30 b(\(the)h(Bash)f(completion)i(functions)e(call)i
+(this)e(and)g(other)g(Readline)h(functions\).)3350 4225
+y([F)-8 b(unction])-3599 b Fg(char)39 b(*)g Ff(rl)p 575
+4225 V 50 w(username)p 1102 4225 V 50 w(completion)p
+1702 4225 V 49 w(function)44 b Fe(\()p Fs(const)29 b(char)g(*text,)g
+(int)565 4335 y(state)p Fe(\))390 4445 y Ft(A)g(completion)g(generator)
+h(for)e(usernames.)40 b Fi(text)31 b Ft(con)m(tains)f(a)f(partial)g
+(username)f(preceded)g(b)m(y)390 4554 y(a)j(random)f(c)m(haracter)i
+(\(usually)e(`)p Fs(~)p Ft('\).)42 b(As)31 b(with)f(all)h(completion)h
+(generators,)g Fi(state)37 b Ft(is)31 b(zero)g(on)390
+4664 y(the)g(\014rst)e(call)j(and)e(non-zero)h(for)f(subsequen)m(t)f
+(calls.)150 4880 y Fh(2.6.3)63 b(Completion)41 b(V)-10
+b(ariables)3371 5121 y Ft([V)i(ariable])-3598 b Fg(rl_compentry_func_t)
+44 b(*)38 b Ff(rl)p 1359 5121 V 51 w(completion)p 1960
+5121 V 49 w(en)m(try)p 2275 5121 V 50 w(function)390
+5230 y Ft(A)c(p)s(oin)m(ter)f(to)h(the)g(generator)h(function)e(for)g
+Fs(rl_completion_matches\(\))p Ft(.)44 b Fs(NULL)32 b
+Ft(means)h(to)390 5340 y(use)d Fs(rl_filename_completion_fu)o(nct)o
+(ion\()o(\))p Ft(,)25 b(the)30 b(default)h(\014lename)f(completer.)p
+eop end
+%%Page: 44 48
+TeXDict begin 44 47 bop 150 -116 a Ft(44)2600 b(GNU)31
+b(Readline)g(Library)3371 299 y([V)-8 b(ariable])-3598
+b Fg(rl_completion_func_t)44 b(*)39 b Ff(rl)p 1412 299
+35 5 v 50 w(attempted)p 1982 299 V 48 w(completion)p
+2580 299 V 49 w(function)390 408 y Ft(A)c(p)s(oin)m(ter)g(to)g(an)g
+(alternativ)m(e)i(function)d(to)i(create)g(matc)m(hes.)55
+b(The)34 b(function)h(is)f(called)i(with)390 518 y Fi(text)p
+Ft(,)26 b Fi(start)p Ft(,)f(and)d Fi(end)p Ft(.)38 b
+Fi(start)25 b Ft(and)e Fi(end)j Ft(are)d(indices)g(in)g
+Fs(rl_line_buffer)c Ft(de\014ning)j(the)h(b)s(ound-)390
+628 y(aries)j(of)h Fi(text)p Ft(,)h(whic)m(h)d(is)h(a)h(c)m(haracter)g
+(string.)39 b(If)26 b(this)g(function)f(exists)i(and)e(returns)g
+Fs(NULL)p Ft(,)h(or)g(if)390 737 y(this)c(v)-5 b(ariable)22
+b(is)g(set)h(to)f Fs(NULL)p Ft(,)h(then)f Fs(rl_complete\(\))c
+Ft(will)k(call)h(the)f(v)-5 b(alue)23 b(of)f Fs(rl_completion_)390
+847 y(entry_function)i Ft(to)30 b(generate)f(matc)m(hes,)i(otherwise)d
+(the)h(arra)m(y)g(of)f(strings)h(returned)e(will)i(b)s(e)390
+956 y(used.)37 b(If)22 b(this)g(function)g(sets)h(the)g
+Fs(rl_attempted_completion)o(_ove)o(r)16 b Ft(v)-5 b(ariable)24
+b(to)f(a)f(non-zero)390 1066 y(v)-5 b(alue,)35 b(Readline)g(will)f(not)
+g(p)s(erform)f(its)h(default)g(completion)h(ev)m(en)g(if)f(this)g
+(function)f(returns)390 1176 y(no)d(matc)m(hes.)3371
+1351 y([V)-8 b(ariable])-3598 b Fg(rl_quote_func_t)43
+b(*)38 b Ff(rl)p 1150 1351 V 51 w(\014lename)p 1618 1351
+V 48 w(quoting)p 2045 1351 V 51 w(function)390 1461 y
+Ft(A)33 b(p)s(oin)m(ter)f(to)h(a)g(function)g(that)g(will)g(quote)g(a)g
+(\014lename)f(in)h(an)f(application-sp)s(eci\014c)i(fashion.)390
+1570 y(This)k(is)i(called)g(if)f(\014lename)h(completion)g(is)f(b)s
+(eing)g(attempted)i(and)d(one)i(of)f(the)g(c)m(haracters)390
+1680 y(in)33 b Fs(rl_filename_quote_charac)o(ter)o(s)27
+b Ft(app)s(ears)33 b(in)g(a)g(completed)h(\014lename.)50
+b(The)32 b(function)390 1789 y(is)37 b(called)h(with)e
+Fi(text)p Ft(,)k Fi(matc)m(h)p 1438 1789 28 4 v 41 w(t)m(yp)s(e)p
+Ft(,)f(and)d Fi(quote)p 2119 1789 V 41 w(p)s(oin)m(ter)p
+Ft(.)60 b(The)36 b Fi(text)k Ft(is)d(the)g(\014lename)g(to)h(b)s(e)390
+1899 y(quoted.)76 b(The)42 b Fi(matc)m(h)p 1210 1899
+V 41 w(t)m(yp)s(e)48 b Ft(is)42 b(either)h Fs(SINGLE_MATCH)p
+Ft(,)f(if)g(there)g(is)h(only)f(one)h(completion)390
+2008 y(matc)m(h,)33 b(or)e Fs(MULT_MATCH)p Ft(.)41 b(Some)31
+b(functions)g(use)g(this)h(to)g(decide)f(whether)g(or)h(not)f(to)h
+(insert)g(a)390 2118 y(closing)22 b(quote)f(c)m(haracter.)40
+b(The)20 b Fi(quote)p 1751 2118 V 41 w(p)s(oin)m(ter)27
+b Ft(is)21 b(a)g(p)s(oin)m(ter)g(to)g(an)m(y)h(op)s(ening)e(quote)h(c)m
+(haracter)390 2228 y(the)31 b(user)e(t)m(yp)s(ed.)41
+b(Some)30 b(functions)g(c)m(ho)s(ose)h(to)g(reset)g(this)g(c)m
+(haracter.)3371 2403 y([V)-8 b(ariable])-3598 b Fg(rl_dequote_func_t)43
+b(*)c Ff(rl)p 1255 2403 35 5 v 50 w(\014lename)p 1722
+2403 V 49 w(dequoting)p 2267 2403 V 49 w(function)390
+2513 y Ft(A)30 b(p)s(oin)m(ter)f(to)i(a)f(function)f(that)h(will)g
+(remo)m(v)m(e)h(application-sp)s(eci\014c)g(quoting)f(c)m(haracters)h
+(from)390 2622 y(a)i(\014lename)g(b)s(efore)f(completion)h(is)g
+(attempted,)h(so)f(those)g(c)m(haracters)h(do)e(not)h(in)m(terfere)g
+(with)390 2732 y(matc)m(hing)39 b(the)f(text)i(against)f(names)f(in)g
+(the)g(\014lesystem.)64 b(It)38 b(is)g(called)i(with)d
+Fi(text)p Ft(,)42 b(the)c(text)390 2841 y(of)k(the)h(w)m(ord)f(to)g(b)s
+(e)g(dequoted,)j(and)d Fi(quote)p 2014 2841 28 4 v 41
+w(c)m(har)p Ft(,)j(whic)m(h)d(is)h(the)f(quoting)h(c)m(haracter)g(that)
+390 2951 y(delimits)33 b(the)f(\014lename)g(\(usually)h(`)p
+Fs(')p Ft(')f(or)g(`)p Fs(")p Ft('\).)46 b(If)32 b Fi(quote)p
+2368 2951 V 41 w(c)m(har)39 b Ft(is)32 b(zero,)i(the)e(\014lename)g(w)m
+(as)h(not)390 3061 y(in)d(an)g(em)m(b)s(edded)g(string.)3371
+3236 y([V)-8 b(ariable])-3598 b Fg(rl_linebuf_func_t)43
+b(*)c Ff(rl)p 1255 3236 35 5 v 50 w(c)m(har)p 1520 3236
+V 50 w(is)p 1647 3236 V 50 w(quoted)p 2040 3236 V 50
+w(p)390 3345 y Ft(A)e(p)s(oin)m(ter)g(to)g(a)g(function)g(to)g(call)h
+(that)g(determines)f(whether)f(or)h(not)g(a)g(sp)s(eci\014c)f(c)m
+(haracter)390 3455 y(in)e(the)h(line)f(bu\013er)g(is)g(quoted,)i
+(according)g(to)f(whatev)m(er)g(quoting)g(mec)m(hanism)g(the)f(program)
+390 3565 y(calling)26 b(Readline)g(uses.)38 b(The)24
+b(function)h(is)g(called)h(with)e(t)m(w)m(o)i(argumen)m(ts:)39
+b Fi(text)p Ft(,)27 b(the)e(text)h(of)f(the)390 3674
+y(line,)31 b(and)g Fi(index)p Ft(,)f(the)h(index)f(of)h(the)g(c)m
+(haracter)i(in)d(the)h(line.)42 b(It)31 b(is)g(used)f(to)h(decide)g
+(whether)g(a)390 3784 y(c)m(haracter)h(found)d(in)g Fs
+(rl_completer_word_break_ch)o(ara)o(cter)o(s)24 b Ft(should)29
+b(b)s(e)h(used)f(to)i(break)390 3893 y(w)m(ords)f(for)g(the)h
+(completer.)3371 4069 y([V)-8 b(ariable])-3598 b Fg
+(rl_compignore_func_t)44 b(*)39 b Ff(rl)p 1412 4069 V
+50 w(ignore)p 1772 4069 V 50 w(some)p 2072 4069 V 51
+w(completions)p 2718 4069 V 50 w(function)390 4178 y
+Ft(This)e(function,)i(if)f(de\014ned,)g(is)g(called)h(b)m(y)e(the)h
+(completer)h(when)e(real)h(\014lename)g(completion)390
+4288 y(is)c(done,)h(after)f(all)h(the)g(matc)m(hing)g(names)e(ha)m(v)m
+(e)j(b)s(een)d(generated.)53 b(It)34 b(is)g(passed)f(a)i
+Fs(NULL)d Ft(ter-)390 4398 y(minated)f(arra)m(y)g(of)g(matc)m(hes.)43
+b(The)31 b(\014rst)f(elemen)m(t)i(\()p Fs(matches[0])p
+Ft(\))d(is)h(the)h(maximal)h(substring)390 4507 y(common)d(to)g(all)h
+(matc)m(hes.)41 b(This)28 b(function)h(can)g(re-arrange)g(the)g(list)h
+(of)f(matc)m(hes)g(as)g(required,)390 4617 y(but)h(eac)m(h)h(elemen)m
+(t)h(deleted)f(from)f(the)h(arra)m(y)g(m)m(ust)f(b)s(e)g(freed.)3371
+4792 y([V)-8 b(ariable])-3598 b Fg(rl_icppfunc_t)42 b(*)d
+Ff(rl)p 1046 4792 V 50 w(directory)p 1552 4792 V 50 w(completion)p
+2152 4792 V 49 w(ho)s(ok)390 4902 y Ft(This)44 b(function,)49
+b(if)d(de\014ned,)i(is)d(allo)m(w)m(ed)i(to)f(mo)s(dify)e(the)i
+(directory)g(p)s(ortion)e(of)i(\014lenames)390 5011 y(Readline)37
+b(completes.)61 b(It)36 b(is)h(called)g(with)g(the)f(address)g(of)h(a)g
+(string)f(\(the)h(curren)m(t)f(directory)390 5121 y(name\))i(as)f(an)g
+(argumen)m(t,)i(and)e(ma)m(y)h(mo)s(dify)e(that)i(string.)60
+b(If)37 b(the)g(string)h(is)f(replaced)g(with)390 5230
+y(a)j(new)g(string,)i(the)e(old)g(v)-5 b(alue)41 b(should)e(b)s(e)g
+(freed.)69 b(An)m(y)40 b(mo)s(di\014ed)f(directory)h(name)g(should)390
+5340 y(ha)m(v)m(e)30 b(a)g(trailing)g(slash.)40 b(The)29
+b(mo)s(di\014ed)f(v)-5 b(alue)30 b(will)f(b)s(e)g(displa)m(y)m(ed)g(as)
+h(part)f(of)g(the)g(completion,)p eop end
+%%Page: 45 49
+TeXDict begin 45 48 bop 150 -116 a Ft(Chapter)30 b(2:)41
+b(Programming)30 b(with)g(GNU)h(Readline)1683 b(45)390
+299 y(replacing)29 b(the)f(directory)h(p)s(ortion)f(of)g(the)h
+(pathname)f(the)g(user)g(t)m(yp)s(ed.)39 b(It)28 b(returns)f(an)i(in)m
+(teger)390 408 y(that)34 b(should)e(b)s(e)g(non-zero)i(if)e(the)i
+(function)e(mo)s(di\014es)h(its)g(directory)g(argumen)m(t.)49
+b(It)34 b(could)f(b)s(e)390 518 y(used)g(to)h(expand)f(sym)m(b)s(olic)h
+(links)f(or)g(shell)h(v)-5 b(ariables)34 b(in)f(pathnames.)50
+b(A)m(t)34 b(the)g(least,)i(ev)m(en)e(if)390 628 y(no)i(other)h
+(expansion)f(is)g(p)s(erformed,)g(this)g(function)g(should)f(remo)m(v)m
+(e)j(an)m(y)f(quote)f(c)m(haracters)390 737 y(from)30
+b(the)g(directory)h(name,)g(b)s(ecause)f(its)h(result)f(will)h(b)s(e)f
+(passed)g(directly)h(to)g Fs(opendir\(\))p Ft(.)3371
+915 y([V)-8 b(ariable])-3598 b Fg(rl_compdisp_func_t)44
+b(*)38 b Ff(rl)p 1307 915 35 5 v 51 w(completion)p 1908
+915 V 49 w(displa)m(y)p 2307 915 V 49 w(matc)m(hes)p
+2762 915 V 50 w(ho)s(ok)390 1025 y Ft(If)22 b(non-zero,)i(then)e(this)g
+(is)g(the)g(address)f(of)h(a)g(function)g(to)h(call)g(when)e
+(completing)i(a)g(w)m(ord)e(w)m(ould)390 1134 y(normally)h(displa)m(y)h
+(the)f(list)h(of)f(p)s(ossible)g(matc)m(hes.)39 b(This)21
+b(function)h(is)g(called)i(in)e(lieu)g(of)g(Readline)390
+1244 y(displa)m(ying)37 b(the)h(list.)61 b(It)37 b(tak)m(es)i(three)e
+(argumen)m(ts:)54 b(\()p Fs(char)30 b(**)p Fi(matc)m(hes)p
+Ft(,)39 b Fs(int)d Fi(n)m(um)p 3370 1244 28 4 v 40 w(matc)m(hes)p
+Ft(,)390 1354 y Fs(int)26 b Fi(max)p 735 1354 V 40 w(length)p
+Ft(\))h(where)f Fi(matc)m(hes)31 b Ft(is)c(the)f(arra)m(y)h(of)g(matc)m
+(hing)g(strings,)h Fi(n)m(um)p 3152 1354 V 39 w(matc)m(hes)j
+Ft(is)c(the)390 1463 y(n)m(um)m(b)s(er)h(of)h(strings)g(in)g(that)g
+(arra)m(y)-8 b(,)31 b(and)d Fi(max)p 2020 1463 V 40 w(length)i
+Ft(is)f(the)g(length)h(of)f(the)g(longest)h(string)f(in)390
+1573 y(that)g(arra)m(y)-8 b(.)41 b(Readline)28 b(pro)m(vides)g(a)h(con)
+m(v)m(enience)h(function,)e Fs(rl_display_match_list)p
+Ft(,)23 b(that)390 1682 y(tak)m(es)36 b(care)g(of)f(doing)g(the)g
+(displa)m(y)f(to)i(Readline's)f(output)g(stream.)54 b(That)35
+b(function)f(ma)m(y)i(b)s(e)390 1792 y(called)c(from)d(this)i(ho)s(ok.)
+3371 1970 y([V)-8 b(ariable])-3598 b Fg(const)40 b(char)f(*)g
+Ff(rl)p 875 1970 35 5 v 50 w(basic)p 1173 1970 V 50 w(w)m(ord)p
+1471 1970 V 50 w(break)p 1801 1970 V 50 w(c)m(haracters)390
+2080 y Ft(The)44 b(basic)g(list)h(of)f(c)m(haracters)i(that)f(signal)g
+(a)f(break)g(b)s(et)m(w)m(een)h(w)m(ords)f(for)g(the)g(completer)390
+2189 y(routine.)61 b(The)37 b(default)g(v)-5 b(alue)37
+b(of)h(this)f(v)-5 b(ariable)38 b(is)f(the)g(c)m(haracters)i(whic)m(h)e
+(break)g(w)m(ords)f(for)390 2299 y(completion)c(in)e(Bash:)41
+b Fs(")30 b(\\t\\n\\"\\\\'`@$><=;|&{\(")p Ft(.)3371 2477
+y([V)-8 b(ariable])-3598 b Fg(const)40 b(char)f(*)g Ff(rl)p
+875 2477 V 50 w(basic)p 1173 2477 V 50 w(quote)p 1502
+2477 V 50 w(c)m(haracters)390 2587 y Ft(A)30 b(list)i(of)e(quote)h(c)m
+(haracters)h(whic)m(h)e(can)h(cause)g(a)f(w)m(ord)g(break.)3371
+2765 y([V)-8 b(ariable])-3598 b Fg(const)40 b(char)f(*)g
+Ff(rl)p 875 2765 V 50 w(completer)p 1422 2765 V 49 w(w)m(ord)p
+1719 2765 V 50 w(break)p 2049 2765 V 50 w(c)m(haracters)390
+2874 y Ft(The)64 b(list)i(of)f(c)m(haracters)h(that)g(signal)g(a)f
+(break)g(b)s(et)m(w)m(een)g(w)m(ords)g(for)f Fs(rl_complete_)390
+2984 y(internal\(\))p Ft(.)38 b(The)30 b(default)g(list)h(is)g(the)f(v)
+-5 b(alue)31 b(of)g Fs(rl_basic_word_break_cha)o(ract)o(ers)p
+Ft(.)3371 3162 y([V)-8 b(ariable])-3598 b Fg(rl_cpvfunc_t)42
+b(*)c Ff(rl)p 993 3162 V 51 w(completion)p 1594 3162
+V 49 w(w)m(ord)p 1891 3162 V 50 w(break)p 2221 3162 V
+50 w(ho)s(ok)390 3271 y Ft(If)31 b(non-zero,)i(this)e(is)h(the)f
+(address)g(of)g(a)h(function)g(to)g(call)h(when)d(Readline)i(is)g
+(deciding)f(where)390 3381 y(to)k(separate)g(w)m(ords)f(for)g(w)m(ord)g
+(completion.)54 b(It)34 b(should)f(return)g(a)i(c)m(haracter)h(string)e
+(lik)m(e)i Fs(rl_)390 3491 y(completer_word_break_cha)o(ract)o(ers)26
+b Ft(to)34 b(b)s(e)e(used)g(to)i(p)s(erform)e(the)h(curren)m(t)f
+(completion.)390 3600 y(The)24 b(function)h(ma)m(y)g(c)m(ho)s(ose)h(to)
+f(set)g Fs(rl_completer_word_break_ch)o(arac)o(ter)o(s)19
+b Ft(itself.)39 b(If)25 b(the)390 3710 y(function)30
+b(returns)f Fs(NULL)p Ft(,)h Fs(rl_completer_word_break)o(_cha)o(rac)o
+(ters)24 b Ft(is)30 b(used.)3371 3888 y([V)-8 b(ariable])-3598
+b Fg(const)40 b(char)f(*)g Ff(rl)p 875 3888 V 50 w(completer)p
+1422 3888 V 49 w(quote)p 1750 3888 V 50 w(c)m(haracters)390
+3998 y Ft(A)34 b(list)g(of)g(c)m(haracters)h(whic)m(h)e(can)h(b)s(e)g
+(used)e(to)j(quote)f(a)g(substring)f(of)h(the)f(line.)51
+b(Completion)390 4107 y(o)s(ccurs)26 b(on)g(the)g(en)m(tire)i
+(substring,)e(and)f(within)h(the)g(substring)g Fs
+(rl_completer_word_break)o(_)390 4217 y(characters)32
+b Ft(are)k(treated)g(as)f(an)m(y)h(other)f(c)m(haracter,)j(unless)d
+(they)g(also)h(app)s(ear)e(within)h(this)390 4326 y(list.)3371
+4504 y([V)-8 b(ariable])-3598 b Fg(const)40 b(char)f(*)g
+Ff(rl)p 875 4504 V 50 w(\014lename)p 1342 4504 V 49 w(quote)p
+1670 4504 V 50 w(c)m(haracters)390 4614 y Ft(A)34 b(list)g(of)g(c)m
+(haracters)h(that)f(cause)h(a)f(\014lename)g(to)g(b)s(e)f(quoted)h(b)m
+(y)f(the)h(completer)h(when)e(they)390 4724 y(app)s(ear)d(in)g(a)h
+(completed)g(\014lename.)41 b(The)30 b(default)g(is)h(the)f(n)m(ull)h
+(string.)3371 4902 y([V)-8 b(ariable])-3598 b Fg(const)40
+b(char)f(*)g Ff(rl)p 875 4902 V 50 w(sp)s(ecial)p 1261
+4902 V 49 w(pre\014xes)390 5011 y Ft(The)27 b(list)i(of)e(c)m
+(haracters)j(that)e(are)g(w)m(ord)f(break)h(c)m(haracters,)i(but)d
+(should)f(b)s(e)h(left)i(in)e Fi(text)k Ft(when)390 5121
+y(it)25 b(is)g(passed)f(to)h(the)g(completion)h(function.)38
+b(Programs)25 b(can)g(use)f(this)h(to)g(help)f(determine)h(what)390
+5230 y(kind)j(of)i(completing)g(to)g(do.)41 b(F)-8 b(or)30
+b(instance,)g(Bash)g(sets)f(this)g(v)-5 b(ariable)31
+b(to)f Fs(")p Ft($)p Fs(@")e Ft(so)i(that)g(it)g(can)390
+5340 y(complete)i(shell)e(v)-5 b(ariables)31 b(and)f(hostnames.)p
+eop end
+%%Page: 46 50
+TeXDict begin 46 49 bop 150 -116 a Ft(46)2600 b(GNU)31
+b(Readline)g(Library)3371 299 y([V)-8 b(ariable])-3598
+b Fg(int)39 b Ff(rl)p 432 299 35 5 v 51 w(completion)p
+1033 299 V 49 w(query)p 1366 299 V 51 w(items)390 408
+y Ft(Up)d(to)h(this)f(man)m(y)g(items)h(will)f(b)s(e)g(displa)m(y)m(ed)
+h(in)e(resp)s(onse)h(to)h(a)f(p)s(ossible-completions)h(call.)390
+518 y(After)28 b(that,)h(readline)f(asks)g(the)g(user)f(if)h(she)f(is)h
+(sure)f(she)h(w)m(an)m(ts)g(to)h(see)f(them)g(all.)40
+b(The)28 b(default)390 628 y(v)-5 b(alue)31 b(is)f(100.)42
+b(A)31 b(negativ)m(e)h(v)-5 b(alue)31 b(indicates)g(that)g(Readline)g
+(should)f(nev)m(er)h(ask)f(the)h(user.)3371 819 y([V)-8
+b(ariable])-3598 b Fg(int)39 b Ff(rl)p 432 819 V 51 w(completion)p
+1033 819 V 49 w(app)s(end)p 1450 819 V 48 w(c)m(haracter)390
+929 y Ft(When)33 b(a)h(single)f(completion)i(alternativ)m(e)h(matc)m
+(hes)e(at)g(the)f(end)g(of)g(the)h(command)f(line,)h(this)390
+1039 y(c)m(haracter)23 b(is)e(app)s(ended)f(to)i(the)g(inserted)f
+(completion)i(text.)39 b(The)20 b(default)i(is)g(a)f(space)h(c)m
+(haracter)390 1148 y(\(`)31 b('\).)86 b(Setting)46 b(this)f(to)h(the)g
+(n)m(ull)f(c)m(haracter)i(\(`)p Fs(\\0)p Ft('\))f(prev)m(en)m(ts)g(an)m
+(ything)g(b)s(eing)f(app)s(ended)390 1258 y(automatically)-8
+b(.)66 b(This)37 b(can)h(b)s(e)f(c)m(hanged)h(in)g(application-sp)s
+(eci\014c)h(completion)g(functions)e(to)390 1367 y(pro)m(vide)j(the)g
+(\\most)g(sensible)g(w)m(ord)f(separator)i(c)m(haracter")h(according)e
+(to)h(an)e(application-)390 1477 y(sp)s(eci\014c)30 b(command)g(line)h
+(syn)m(tax)g(sp)s(eci\014cation.)3371 1669 y([V)-8 b(ariable])-3598
+b Fg(int)39 b Ff(rl)p 432 1669 V 51 w(completion)p 1033
+1669 V 49 w(suppress)p 1509 1669 V 50 w(app)s(end)390
+1778 y Ft(If)33 b(non-zero,)i Fi(rl)p 949 1778 28 4 v
+39 w(completion)p 1421 1778 V 42 w(app)s(end)p 1755 1778
+V 38 w(c)m(haracter)42 b Ft(is)33 b(not)g(app)s(ended)f(to)i(matc)m
+(hes)g(at)g(the)g(end)390 1888 y(of)28 b(the)f(command)h(line,)h(as)e
+(describ)s(ed)g(ab)s(o)m(v)m(e.)41 b(It)27 b(is)h(set)g(to)g(0)g(b)s
+(efore)g(an)m(y)f(application-sp)s(eci\014c)390 1998
+y(completion)32 b(function)e(is)g(called,)i(and)e(ma)m(y)h(only)f(b)s
+(e)g(c)m(hanged)h(within)f(suc)m(h)g(a)h(function.)3371
+2189 y([V)-8 b(ariable])-3598 b Fg(int)39 b Ff(rl)p 432
+2189 35 5 v 51 w(completion)p 1033 2189 V 49 w(quote)p
+1361 2189 V 50 w(c)m(haracter)390 2299 y Ft(When)d(Readline)h(is)f
+(completing)h(quoted)g(text,)h(as)f(delimited)g(b)m(y)f(one)g(of)g(the)
+h(c)m(haracters)g(in)390 2408 y Fi(rl)p 457 2408 28 4
+v 40 w(completer)p 885 2408 V 41 w(quote)p 1145 2408
+V 41 w(c)m(haracters)p Ft(,)43 b(it)c(sets)g(this)g(v)-5
+b(ariable)40 b(to)g(the)f(quoting)g(c)m(haracter)i(found.)390
+2518 y(This)30 b(is)g(set)h(b)s(efore)f(an)m(y)h(application-sp)s
+(eci\014c)g(completion)h(function)e(is)h(called.)3371
+2710 y([V)-8 b(ariable])-3598 b Fg(int)39 b Ff(rl)p 432
+2710 35 5 v 51 w(completion)p 1033 2710 V 49 w(suppress)p
+1509 2710 V 50 w(quote)390 2819 y Ft(If)32 b(non-zero,)h(Readline)g(do)
+s(es)f(not)h(app)s(end)d(a)j(matc)m(hing)g(quote)g(c)m(haracter)h(when)
+d(p)s(erforming)390 2929 y(completion)25 b(on)e(a)h(quoted)g(string.)38
+b(It)24 b(is)f(set)h(to)h(0)f(b)s(efore)f(an)m(y)h(application-sp)s
+(eci\014c)h(completion)390 3039 y(function)30 b(is)g(called,)i(and)e
+(ma)m(y)h(only)g(b)s(e)e(c)m(hanged)i(within)f(suc)m(h)g(a)h(function.)
+3371 3230 y([V)-8 b(ariable])-3598 b Fg(int)39 b Ff(rl)p
+432 3230 V 51 w(completion)p 1033 3230 V 49 w(found)p
+1366 3230 V 50 w(quote)390 3340 y Ft(When)31 b(Readline)i(is)e
+(completing)i(quoted)f(text,)h(it)f(sets)g(this)g(v)-5
+b(ariable)32 b(to)h(a)f(non-zero)g(v)-5 b(alue)32 b(if)390
+3450 y(the)21 b(w)m(ord)g(b)s(eing)g(completed)h(con)m(tains)g(or)f(is)
+g(delimited)h(b)m(y)f(an)m(y)g(quoting)h(c)m(haracters,)i(including)390
+3559 y(bac)m(kslashes.)42 b(This)29 b(is)i(set)g(b)s(efore)f(an)m(y)g
+(application-sp)s(eci\014c)i(completion)g(function)e(is)g(called.)3371
+3751 y([V)-8 b(ariable])-3598 b Fg(int)39 b Ff(rl)p 432
+3751 V 51 w(completion)p 1033 3751 V 49 w(mark)p 1340
+3751 V 51 w(symlink)p 1779 3751 V 51 w(dirs)390 3861
+y Ft(If)31 b(non-zero,)i(a)f(slash)g(will)g(b)s(e)f(app)s(ended)f(to)j
+(completed)g(\014lenames)e(that)i(are)f(sym)m(b)s(olic)g(links)390
+3970 y(to)25 b(directory)g(names,)g(sub)5 b(ject)24 b(to)h(the)f(v)-5
+b(alue)25 b(of)f(the)h(user-settable)g Fi(mark-directories)k
+Ft(v)-5 b(ariable.)390 4080 y(This)27 b(v)-5 b(ariable)28
+b(exists)g(so)f(that)h(application-sp)s(eci\014c)h(completion)g
+(functions)e(can)g(o)m(v)m(erride)i(the)390 4189 y(user's)42
+b(global)h(preference)g(\(set)g(via)g(the)f Fi(mark-symlink)m
+(ed-directories)48 b Ft(Readline)43 b(v)-5 b(ariable\))390
+4299 y(if)38 b(appropriate.)62 b(This)37 b(v)-5 b(ariable)38
+b(is)g(set)g(to)g(the)g(user's)f(preference)g(b)s(efore)g(an)m(y)h
+(application-)390 4408 y(sp)s(eci\014c)31 b(completion)i(function)f(is)
+f(called,)j(so)e(unless)f(that)h(function)f(mo)s(di\014es)g(the)h(v)-5
+b(alue,)33 b(the)390 4518 y(user's)d(preferences)g(are)h(honored.)3371
+4710 y([V)-8 b(ariable])-3598 b Fg(int)39 b Ff(rl)p 432
+4710 V 51 w(ignore)p 793 4710 V 50 w(completion)p 1393
+4710 V 49 w(duplicates)390 4819 y Ft(If)30 b(non-zero,)h(then)f
+(duplicates)h(in)f(the)h(matc)m(hes)g(are)g(remo)m(v)m(ed.)42
+b(The)29 b(default)i(is)f(1.)3371 5011 y([V)-8 b(ariable])-3598
+b Fg(int)39 b Ff(rl)p 432 5011 V 51 w(\014lename)p 900
+5011 V 48 w(completion)p 1498 5011 V 50 w(desired)390
+5121 y Ft(Non-zero)33 b(means)f(that)g(the)g(results)f(of)h(the)g(matc)
+m(hes)h(are)f(to)h(b)s(e)e(treated)i(as)f(\014lenames.)45
+b(This)390 5230 y(is)40 b Fn(always)49 b Ft(zero)41 b(when)e
+(completion)i(is)f(attempted,)j(and)d(can)g(only)g(b)s(e)f(c)m(hanged)i
+(within)e(an)390 5340 y(application-sp)s(eci\014c)i(completion)g
+(function.)67 b(If)39 b(it)h(is)f(set)h(to)h(a)e(non-zero)h(v)-5
+b(alue)40 b(b)m(y)f(suc)m(h)h(a)p eop end
+%%Page: 47 51
+TeXDict begin 47 50 bop 150 -116 a Ft(Chapter)30 b(2:)41
+b(Programming)30 b(with)g(GNU)h(Readline)1683 b(47)390
+299 y(function,)24 b(directory)f(names)f(ha)m(v)m(e)h(a)g(slash)f(app)s
+(ended)e(and)i(Readline)h(attempts)g(to)g(quote)g(com-)390
+408 y(pleted)35 b(\014lenames)g(if)g(they)h(con)m(tain)g(an)m(y)f(c)m
+(haracters)i(in)e Fs(rl_filename_quote_chara)o(cter)o(s)390
+518 y Ft(and)30 b Fs(rl_filename_quoting_des)o(ired)24
+b Ft(is)30 b(set)h(to)g(a)g(non-zero)g(v)-5 b(alue.)3371
+702 y([V)d(ariable])-3598 b Fg(int)39 b Ff(rl)p 432 702
+35 5 v 51 w(\014lename)p 900 702 V 48 w(quoting)p 1327
+702 V 50 w(desired)390 812 y Ft(Non-zero)29 b(means)f(that)h(the)f
+(results)g(of)g(the)g(matc)m(hes)i(are)e(to)h(b)s(e)e(quoted)h(using)g
+(double)f(quotes)390 922 y(\(or)43 b(an)f(application-sp)s(eci\014c)i
+(quoting)f(mec)m(hanism\))g(if)f(the)h(completed)g(\014lename)g(con)m
+(tains)390 1031 y(an)m(y)28 b(c)m(haracters)h(in)e Fs
+(rl_filename_quote_chars)p Ft(.)34 b(This)27 b(is)g Fn(always)37
+b Ft(non-zero)28 b(when)f(comple-)390 1141 y(tion)h(is)g(attempted,)h
+(and)e(can)h(only)g(b)s(e)f(c)m(hanged)h(within)f(an)h(application-sp)s
+(eci\014c)h(completion)390 1250 y(function.)37 b(The)21
+b(quoting)g(is)g(e\013ected)i(via)e(a)h(call)g(to)g(the)f(function)g(p)
+s(oin)m(ted)g(to)g(b)m(y)g Fs(rl_filename_)390 1360 y(quoting_function)
+p Ft(.)3371 1544 y([V)-8 b(ariable])-3598 b Fg(int)39
+b Ff(rl)p 432 1544 V 51 w(attempted)p 1003 1544 V 47
+w(completion)p 1600 1544 V 49 w(o)m(v)m(er)390 1654 y
+Ft(If)93 b(an)h(application-sp)s(eci\014c)i(completion)f(function)f
+(assigned)g(to)h Fs(rl_attempted_)390 1763 y(completion_function)48
+b Ft(sets)53 b(this)g(v)-5 b(ariable)54 b(to)g(a)f(non-zero)h(v)-5
+b(alue,)60 b(Readline)53 b(will)h(not)390 1873 y(p)s(erform)28
+b(its)i(default)g(\014lename)g(completion)h(ev)m(en)f(if)g(the)f
+(application's)i(completion)g(function)390 1983 y(returns)e(no)h(matc)m
+(hes.)42 b(It)31 b(should)e(b)s(e)h(set)h(only)f(b)m(y)h(an)f
+(application's)i(completion)f(function.)3371 2167 y([V)-8
+b(ariable])-3598 b Fg(int)39 b Ff(rl)p 432 2167 V 51
+w(completion)p 1033 2167 V 49 w(t)m(yp)s(e)390 2276 y
+Ft(Set)c(to)h(a)f(c)m(haracter)i(describing)e(the)g(t)m(yp)s(e)g(of)g
+(completion)i(Readline)e(is)g(curren)m(tly)h(attempt-)390
+2386 y(ing;)f(see)f(the)g(description)f(of)g Fs
+(rl_complete_internal\(\))28 b Ft(\(see)34 b(Section)g(2.6.2)h
+([Completion)390 2496 y(F)-8 b(unctions],)39 b(page)f(42\))f(for)g(the)
+g(list)g(of)g(c)m(haracters.)61 b(This)36 b(is)g(set)i(to)f(the)g
+(appropriate)f(v)-5 b(alue)390 2605 y(b)s(efore)31 b(an)m(y)h
+(application-sp)s(eci\014c)h(completion)g(function)f(is)f(called,)j
+(allo)m(wing)f(suc)m(h)e(functions)390 2715 y(to)g(presen)m(t)g(the)f
+(same)h(in)m(terface)h(as)e Fs(rl_complete\(\))p Ft(.)3371
+2899 y([V)-8 b(ariable])-3598 b Fg(int)39 b Ff(rl)p 432
+2899 V 51 w(inhibit)p 816 2899 V 48 w(completion)390
+3009 y Ft(If)28 b(this)g(v)-5 b(ariable)29 b(is)f(non-zero,)i
+(completion)f(is)f(inhibited.)40 b(The)28 b(completion)h(c)m(haracter)h
+(will)f(b)s(e)390 3118 y(inserted)h(as)h(an)m(y)g(other)f(b)s(ound)e
+(to)k Fs(self-insert)p Ft(.)150 3342 y Fh(2.6.4)63 b(A)40
+b(Short)i(Completion)g(Example)275 3587 y Ft(Here)20
+b(is)h(a)g(small)f(application)i(demonstrating)f(the)f(use)g(of)h(the)g
+(GNU)f(Readline)h(library)-8 b(.)38 b(It)20 b(is)h(called)150
+3696 y Fs(fileman)p Ft(,)35 b(and)g(the)h(source)f(co)s(de)h(resides)f
+(in)h(`)p Fs(examples/fileman.c)p Ft('.)51 b(This)35
+b(sample)h(application)150 3806 y(pro)m(vides)26 b(completion)i(of)e
+(command)g(names,)h(line)f(editing)h(features,)h(and)d(access)j(to)f
+(the)f(history)g(list.)p eop end
+%%Page: 48 52
+TeXDict begin 48 51 bop 150 -116 a Ft(48)2600 b(GNU)31
+b(Readline)g(Library)390 299 y Fd(/*)40 b(fileman.c)h(--)f(A)f(tiny)h
+(application)i(which)e(demonstrates)i(how)e(to)g(use)g(the)508
+386 y(GNU)g(Readline)h(library.)80 b(This)40 b(application)i
+(interactively)g(allows)f(users)508 473 y(to)e(manipulate)j(files)e
+(and)g(their)h(modes.)f(*/)390 648 y(#include)h(<stdio.h>)390
+735 y(#include)g(<sys/types.h>)390 822 y(#include)g(<sys/file.h>)390
+909 y(#include)g(<sys/stat.h>)390 996 y(#include)g(<sys/errno.h>)390
+1171 y(#include)g(<readline/readline.h>)390 1258 y(#include)g
+(<readline/history.h>)390 1432 y(extern)g(char)f(*xmalloc)h(\(\);)390
+1606 y(/*)f(The)g(names)g(of)g(functions)h(that)f(actually)h(do)f(the)g
+(manipulation.)i(*/)390 1694 y(int)e(com_list)h(__P\(\(char)g(*\)\);)
+390 1781 y(int)f(com_view)h(__P\(\(char)g(*\)\);)390
+1868 y(int)f(com_rename)h(__P\(\(char)h(*\)\);)390 1955
+y(int)e(com_stat)h(__P\(\(char)g(*\)\);)390 2042 y(int)f(com_pwd)h
+(__P\(\(char)g(*\)\);)390 2130 y(int)f(com_delete)h(__P\(\(char)h
+(*\)\);)390 2217 y(int)e(com_help)h(__P\(\(char)g(*\)\);)390
+2304 y(int)f(com_cd)g(__P\(\(char)i(*\)\);)390 2391 y(int)e(com_quit)h
+(__P\(\(char)g(*\)\);)390 2565 y(/*)f(A)f(structure)i(which)g(contains)
+g(information)h(on)d(the)h(commands)h(this)f(program)508
+2653 y(can)g(understand.)h(*/)390 2827 y(typedef)g(struct)f({)468
+2914 y(char)h(*name;)f(/*)g(User)g(printable)h(name)f(of)g(the)g
+(function.)h(*/)468 3001 y(rl_icpfunc_t)h(*func;)f(/*)f(Function)h(to)e
+(call)i(to)e(do)h(the)g(job.)g(*/)468 3088 y(char)h(*doc;)f(/*)g
+(Documentation)i(for)e(this)g(function.)80 b(*/)390 3176
+y(})39 b(COMMAND;)390 3350 y(COMMAND)i(commands[])g(=)f({)468
+3437 y({)g("cd",)g(com_cd,)h("Change)g(to)f(directory)h(DIR")f(},)468
+3524 y({)g("delete",)h(com_delete,)h("Delete)f(FILE")f(},)468
+3611 y({)g("help",)h(com_help,)g("Display)g(this)f(text")h(},)468
+3699 y({)f("?",)g(com_help,)h("Synonym)g(for)f(`help'")h(},)468
+3786 y({)f("list",)h(com_list,)g("List)f(files)h(in)e(DIR")i(},)468
+3873 y({)f("ls",)g(com_list,)i("Synonym)f(for)f(`list'")g(},)468
+3960 y({)g("pwd",)g(com_pwd,)i("Print)e(the)g(current)h(working)g
+(directory")g(},)468 4047 y({)f("quit",)h(com_quit,)g("Quit)f(using)h
+(Fileman")g(},)468 4134 y({)f("rename",)h(com_rename,)h("Rename)f(FILE)
+f(to)g(NEWNAME")h(},)468 4222 y({)f("stat",)h(com_stat,)g("Print)g(out)
+f(statistics)h(on)f(FILE")g(},)468 4309 y({)g("view",)h(com_view,)g
+("View)f(the)g(contents)h(of)f(FILE")g(},)468 4396 y({)g(\(char)g
+(*\)NULL,)h(\(rl_icpfunc_t)h(*\)NULL,)f(\(char)f(*\)NULL)h(})390
+4483 y(};)390 4658 y(/*)f(Forward)g(declarations.)j(*/)390
+4745 y(char)d(*stripwhite)i(\(\);)390 4832 y(COMMAND)f(*find_command)h
+(\(\);)390 5006 y(/*)e(The)g(name)g(of)f(this)i(program,)g(as)e(taken)i
+(from)f(argv[0].)h(*/)390 5093 y(char)f(*progname;)390
+5268 y(/*)g(When)g(non-zero,)h(this)f(means)h(the)f(user)g(is)f(done)h
+(using)h(this)f(program.)h(*/)p eop end
+%%Page: 49 53
+TeXDict begin 49 52 bop 150 -116 a Ft(Chapter)30 b(2:)41
+b(Programming)30 b(with)g(GNU)h(Readline)1683 b(49)390
+299 y Fd(int)40 b(done;)390 473 y(char)g(*)390 560 y(dupstr)h(\(s\))586
+648 y(int)f(s;)390 735 y({)468 822 y(char)h(*r;)468 996
+y(r)f(=)f(xmalloc)i(\(strlen)g(\(s\))f(+)f(1\);)468 1083
+y(strcpy)i(\(r,)f(s\);)468 1171 y(return)h(\(r\);)390
+1258 y(})390 1432 y(main)f(\(argc,)h(argv\))586 1519
+y(int)f(argc;)586 1606 y(char)g(**argv;)390 1694 y({)468
+1781 y(char)h(*line,)f(*s;)468 1955 y(progname)h(=)f(argv[0];)468
+2130 y(initialize_readline)k(\(\);)c(/*)g(Bind)g(our)g(completer.)h(*/)
+468 2304 y(/*)f(Loop)g(reading)h(and)f(executing)h(lines)g(until)f(the)
+g(user)g(quits.)h(*/)468 2391 y(for)f(\()g(;)f(done)h(==)g(0;)g(\))547
+2478 y({)625 2565 y(line)g(=)g(readline)h(\("FileMan:)h("\);)625
+2740 y(if)e(\(!line\))704 2827 y(break;)625 3001 y(/*)g(Remove)h
+(leading)f(and)g(trailing)h(whitespace)h(from)e(the)g(line.)743
+3088 y(Then,)g(if)g(there)g(is)g(anything)h(left,)g(add)e(it)h(to)g
+(the)g(history)h(list)743 3176 y(and)f(execute)h(it.)f(*/)625
+3263 y(s)g(=)f(stripwhite)j(\(line\);)625 3437 y(if)e(\(*s\))704
+3524 y({)782 3611 y(add_history)i(\(s\);)782 3699 y(execute_line)g
+(\(s\);)704 3786 y(})625 3960 y(free)e(\(line\);)547
+4047 y(})468 4134 y(exit)h(\(0\);)390 4222 y(})390 4396
+y(/*)f(Execute)g(a)g(command)h(line.)f(*/)390 4483 y(int)390
+4570 y(execute_line)i(\(line\))586 4658 y(char)e(*line;)390
+4745 y({)468 4832 y(register)h(int)f(i;)468 4919 y(COMMAND)h(*command;)
+468 5006 y(char)g(*word;)468 5181 y(/*)f(Isolate)h(the)f(command)h
+(word.)f(*/)468 5268 y(i)g(=)f(0;)p eop end
+%%Page: 50 54
+TeXDict begin 50 53 bop 150 -116 a Ft(50)2600 b(GNU)31
+b(Readline)g(Library)468 299 y Fd(while)41 b(\(line[i])g(&&)f
+(whitespace)h(\(line[i]\)\))547 386 y(i++;)468 473 y(word)g(=)e(line)h
+(+)g(i;)468 648 y(while)h(\(line[i])g(&&)f(!whitespace)h(\(line[i]\)\))
+547 735 y(i++;)468 909 y(if)f(\(line[i]\))547 996 y(line[i++])h(=)f
+('\\0';)468 1171 y(command)h(=)f(find_command)i(\(word\);)468
+1345 y(if)e(\(!command\))547 1432 y({)625 1519 y(fprintf)h(\(stderr,)g
+("\045s:)f(No)g(such)g(command)h(for)f(FileMan.\\n",)i(word\);)625
+1606 y(return)f(\(-1\);)547 1694 y(})468 1868 y(/*)f(Get)g(argument)h
+(to)f(command,)h(if)f(any.)g(*/)468 1955 y(while)h(\(whitespace)h
+(\(line[i]\)\))547 2042 y(i++;)468 2217 y(word)f(=)e(line)h(+)g(i;)468
+2391 y(/*)g(Call)g(the)g(function.)h(*/)468 2478 y(return)g
+(\(\(*\(command->func\)\))j(\(word\)\);)390 2565 y(})390
+2740 y(/*)c(Look)g(up)f(NAME)i(as)e(the)h(name)g(of)g(a)g(command,)h
+(and)e(return)i(a)f(pointer)g(to)g(that)508 2827 y(command.)80
+b(Return)41 b(a)e(NULL)h(pointer)h(if)f(NAME)g(isn't)g(a)g(command)g
+(name.)h(*/)390 2914 y(COMMAND)g(*)390 3001 y(find_command)h(\(name\))
+586 3088 y(char)e(*name;)390 3176 y({)468 3263 y(register)h(int)f(i;)
+468 3437 y(for)g(\(i)g(=)f(0;)h(commands[i].name;)j(i++\))547
+3524 y(if)d(\(strcmp)g(\(name,)h(commands[i].name\))i(==)d(0\))625
+3611 y(return)h(\(&commands[i]\);)468 3786 y(return)g(\(\(COMMAND)g
+(*\)NULL\);)390 3873 y(})390 4047 y(/*)f(Strip)g(whitespace)i(from)e
+(the)g(start)g(and)g(end)g(of)f(STRING.)81 b(Return)40
+b(a)g(pointer)508 4134 y(into)g(STRING.)h(*/)390 4222
+y(char)f(*)390 4309 y(stripwhite)h(\(string\))586 4396
+y(char)f(*string;)390 4483 y({)468 4570 y(register)h(char)g(*s,)f(*t;)
+468 4745 y(for)g(\(s)g(=)f(string;)i(whitespace)h(\(*s\);)e(s++\))547
+4832 y(;)468 5006 y(if)g(\(*s)g(==)g(0\))547 5093 y(return)g(\(s\);)468
+5268 y(t)g(=)f(s)h(+)f(strlen)i(\(s\))f(-)f(1;)p eop
+end
+%%Page: 51 55
+TeXDict begin 51 54 bop 150 -116 a Ft(Chapter)30 b(2:)41
+b(Programming)30 b(with)g(GNU)h(Readline)1683 b(51)468
+299 y Fd(while)41 b(\(t)e(>)h(s)f(&&)h(whitespace)i(\(*t\)\))547
+386 y(t--;)468 473 y(*++t)f(=)e('\\0';)468 648 y(return)i(s;)390
+735 y(})390 909 y(/*)f(******************************)q(*****)q(****)q
+(*****)q(****)q(****)q(*****)q(****)q(***)45 b(*/)390
+996 y(/*)2589 b(*/)390 1083 y(/*)707 b(Interface)41 b(to)f(Readline)h
+(Completion)629 b(*/)390 1171 y(/*)2589 b(*/)390 1258
+y(/*)40 b(******************************)q(*****)q(****)q(*****)q(****)
+q(****)q(*****)q(****)q(***)45 b(*/)390 1432 y(char)40
+b(*command_generator)j(__P\(\(const)f(char)e(*,)g(int\)\);)390
+1519 y(char)g(**fileman_completion)k(__P\(\(const)d(char)g(*,)e(int,)h
+(int\)\);)390 1694 y(/*)g(Tell)g(the)g(GNU)g(Readline)h(library)g(how)e
+(to)h(complete.)81 b(We)39 b(want)h(to)g(try)g(to)508
+1781 y(complete)h(on)e(command)i(names)g(if)e(this)h(is)g(the)g(first)g
+(word)h(in)e(the)h(line,)g(or)508 1868 y(on)f(filenames)j(if)d(not.)h
+(*/)390 1955 y(initialize_readline)k(\(\))390 2042 y({)468
+2130 y(/*)c(Allow)g(conditional)i(parsing)f(of)f(the)g(~/.inputrc)h
+(file.)g(*/)468 2217 y(rl_readline_name)i(=)d("FileMan";)468
+2391 y(/*)g(Tell)g(the)g(completer)h(that)g(we)e(want)h(a)g(crack)g
+(first.)h(*/)468 2478 y(rl_attempted_completion_fun)q(ctio)q(n)k(=)39
+b(fileman_completion;)390 2565 y(})390 2740 y(/*)h(Attempt)g(to)g
+(complete)h(on)f(the)g(contents)h(of)f(TEXT.)79 b(START)41
+b(and)e(END)508 2827 y(bound)h(the)g(region)h(of)e(rl_line_buffer)k
+(that)d(contains)h(the)f(word)g(to)508 2914 y(complete.)80
+b(TEXT)40 b(is)g(the)g(word)g(to)g(complete.)80 b(We)40
+b(can)g(use)g(the)g(entire)508 3001 y(contents)h(of)e(rl_line_buffer)k
+(in)d(case)g(we)f(want)h(to)g(do)g(some)g(simple)508
+3088 y(parsing.)80 b(Returnthe)41 b(array)g(of)e(matches,)i(or)f(NULL)g
+(if)g(there)g(aren't)h(any.)f(*/)390 3176 y(char)g(**)390
+3263 y(fileman_completion)j(\(text,)e(start,)g(end\))586
+3350 y(const)f(char)h(*text;)586 3437 y(int)f(start,)h(end;)390
+3524 y({)468 3611 y(char)g(**matches;)468 3786 y(matches)g(=)f(\(char)g
+(**\)NULL;)468 3960 y(/*)g(If)g(this)g(word)g(is)g(at)f(the)h(start)h
+(of)e(the)h(line,)h(then)f(it)g(is)f(a)h(command)586
+4047 y(to)g(complete.)80 b(Otherwise)42 b(it)d(is)h(the)g(name)g(of)g
+(a)f(file)h(in)g(the)g(current)586 4134 y(directory.)i(*/)468
+4222 y(if)e(\(start)h(==)e(0\))547 4309 y(matches)i(=)e
+(rl_completion_matches)44 b(\(text,)d(command_generator\);)468
+4483 y(return)g(\(matches\);)390 4570 y(})390 4745 y(/*)f(Generator)h
+(function)g(for)f(command)h(completion.)81 b(STATE)40
+b(lets)g(us)508 4832 y(know)g(whether)h(to)e(start)i(from)f(scratch;)h
+(without)g(any)f(state)508 4919 y(\(i.e.)g(STATE)g(==)g(0\),)g(then)g
+(we)g(start)g(at)g(the)g(top)g(of)f(the)h(list.)h(*/)390
+5006 y(char)f(*)390 5093 y(command_generator)j(\(text,)e(state\))586
+5181 y(const)f(char)h(*text;)586 5268 y(int)f(state;)p
+eop end
+%%Page: 52 56
+TeXDict begin 52 55 bop 150 -116 a Ft(52)2600 b(GNU)31
+b(Readline)g(Library)390 299 y Fd({)468 386 y(static)41
+b(int)f(list_index,)i(len;)468 473 y(char)f(*name;)468
+648 y(/*)f(If)g(this)g(is)g(a)f(new)h(word)g(to)g(complete,)h
+(initialize)h(now.)79 b(This)586 735 y(includes)41 b(saving)g(the)f
+(length)g(of)g(TEXT)g(for)g(efficiency,)i(and)586 822
+y(initializing)g(the)e(index)g(variable)h(to)f(0.)g(*/)468
+909 y(if)g(\(!state\))547 996 y({)625 1083 y(list_index)i(=)d(0;)625
+1171 y(len)h(=)g(strlen)g(\(text\);)547 1258 y(})468
+1432 y(/*)g(Return)h(the)f(next)g(name)g(which)g(partially)i(matches)e
+(from)h(the)586 1519 y(command)g(list.)f(*/)468 1606
+y(while)h(\(name)f(=)g(commands[list_index].name\))547
+1694 y({)625 1781 y(list_index++;)625 1955 y(if)g(\(strncmp)h(\(name,)g
+(text,)f(len\))g(==)g(0\))704 2042 y(return)g(\(dupstr\(name\)\);)547
+2130 y(})468 2304 y(/*)g(If)g(no)f(names)i(matched,)g(then)f(return)h
+(NULL.)f(*/)468 2391 y(return)h(\(\(char)g(*\)NULL\);)390
+2478 y(})390 2653 y(/*)f(******************************)q(*****)q(****)
+q(*****)q(****)q(****)q(*****)q(****)q(***)45 b(*/)390
+2740 y(/*)2589 b(*/)390 2827 y(/*)903 b(FileMan)41 b(Commands)1060
+b(*/)390 2914 y(/*)2589 b(*/)390 3001 y(/*)40 b
+(******************************)q(*****)q(****)q(*****)q(****)q(****)q
+(*****)q(****)q(***)45 b(*/)390 3176 y(/*)40 b(String)g(to)g(pass)g(to)
+g(system)g(\(\).)80 b(This)40 b(is)f(for)h(the)g(LIST,)h(VIEW)f(and)g
+(RENAME)508 3263 y(commands.)h(*/)390 3350 y(static)g(char)f
+(syscom[1024];)390 3524 y(/*)g(List)g(the)g(file\(s\))h(named)f(in)g
+(arg.)g(*/)390 3611 y(com_list)h(\(arg\))586 3699 y(char)f(*arg;)390
+3786 y({)468 3873 y(if)g(\(!arg\))547 3960 y(arg)g(=)f("";)468
+4134 y(sprintf)i(\(syscom,)g("ls)f(-FClg)h(\045s",)f(arg\);)468
+4222 y(return)h(\(system)g(\(syscom\)\);)390 4309 y(})390
+4483 y(com_view)g(\(arg\))586 4570 y(char)f(*arg;)390
+4658 y({)468 4745 y(if)g(\(!valid_argument)j(\("view",)e(arg\)\))547
+4832 y(return)f(1;)468 5006 y(sprintf)h(\(syscom,)g("more)g(\045s",)f
+(arg\);)468 5093 y(return)h(\(system)g(\(syscom\)\);)390
+5181 y(})p eop end
+%%Page: 53 57
+TeXDict begin 53 56 bop 150 -116 a Ft(Chapter)30 b(2:)41
+b(Programming)30 b(with)g(GNU)h(Readline)1683 b(53)390
+299 y Fd(com_rename)41 b(\(arg\))586 386 y(char)f(*arg;)390
+473 y({)468 560 y(too_dangerous)j(\("rename"\);)468 648
+y(return)e(\(1\);)390 735 y(})390 909 y(com_stat)g(\(arg\))586
+996 y(char)f(*arg;)390 1083 y({)468 1171 y(struct)h(stat)f(finfo;)468
+1345 y(if)g(\(!valid_argument)j(\("stat",)e(arg\)\))547
+1432 y(return)f(\(1\);)468 1606 y(if)g(\(stat)g(\(arg,)h(&finfo\))g(==)
+e(-1\))547 1694 y({)625 1781 y(perror)i(\(arg\);)625
+1868 y(return)g(\(1\);)547 1955 y(})468 2130 y(printf)g(\("Statistics)h
+(for)e(`\045s':\\n",)h(arg\);)468 2304 y(printf)g(\("\045s)f(has)g
+(\045d)g(link\045s,)h(and)f(is)f(\045d)h(byte\045s)g(in)g(length.\\n",)
+i(arg,)782 2391 y(finfo.st_nlink,)782 2478 y(\(finfo.st_nlink)h(==)d
+(1\))f(?)h("")f(:)h("s",)782 2565 y(finfo.st_size,)782
+2653 y(\(finfo.st_size)j(==)c(1\))h(?)g("")f(:)h("s"\);)468
+2740 y(printf)h(\("Inode)g(Last)f(Change)h(at:)f(\045s",)g(ctime)g
+(\(&finfo.st_ctime\)\);)468 2827 y(printf)h(\(")236 b(Last)40
+b(access)h(at:)f(\045s",)g(ctime)g(\(&finfo.st_atime\)\);)468
+2914 y(printf)h(\(")157 b(Last)41 b(modified)g(at:)f(\045s",)g(ctime)g
+(\(&finfo.st_mtime\)\);)468 3001 y(return)h(\(0\);)390
+3088 y(})390 3263 y(com_delete)g(\(arg\))586 3350 y(char)f(*arg;)390
+3437 y({)468 3524 y(too_dangerous)j(\("delete"\);)468
+3611 y(return)e(\(1\);)390 3699 y(})390 3873 y(/*)f(Print)g(out)g(help)
+g(for)g(ARG,)g(or)g(for)g(all)g(of)f(the)h(commands)h(if)f(ARG)g(is)508
+3960 y(not)g(present.)h(*/)390 4047 y(com_help)g(\(arg\))586
+4134 y(char)f(*arg;)390 4222 y({)468 4309 y(register)h(int)f(i;)468
+4396 y(int)g(printed)h(=)f(0;)468 4570 y(for)g(\(i)g(=)f(0;)h
+(commands[i].name;)j(i++\))547 4658 y({)625 4745 y(if)d(\(!*arg)h(||)e
+(\(strcmp)i(\(arg,)g(commands[i].name\))i(==)c(0\)\))704
+4832 y({)782 4919 y(printf)i(\("\045s\\t\\t\045s.\\n",)i
+(commands[i].name,)g(commands[i].doc\);)782 5006 y(printed++;)704
+5093 y(})547 5181 y(})p eop end
+%%Page: 54 58
+TeXDict begin 54 57 bop 150 -116 a Ft(54)2600 b(GNU)31
+b(Readline)g(Library)468 299 y Fd(if)40 b(\(!printed\))547
+386 y({)625 473 y(printf)h(\("No)f(commands)h(match)g(`\045s'.)79
+b(Possibilties)42 b(are:\\n",)f(arg\);)625 648 y(for)f(\(i)g(=)f(0;)h
+(commands[i].name;)j(i++\))704 735 y({)782 822 y(/*)d(Print)g(in)g(six)
+g(columns.)h(*/)782 909 y(if)f(\(printed)h(==)f(6\))861
+996 y({)939 1083 y(printed)h(=)e(0;)939 1171 y(printf)i(\("\\n"\);)861
+1258 y(})782 1432 y(printf)g(\("\045s\\t",)g(commands[i].name\);)782
+1519 y(printed++;)704 1606 y(})625 1781 y(if)f(\(printed\))704
+1868 y(printf)g(\("\\n"\);)547 1955 y(})468 2042 y(return)h(\(0\);)390
+2130 y(})390 2304 y(/*)f(Change)g(to)g(the)g(directory)h(ARG.)f(*/)390
+2391 y(com_cd)h(\(arg\))586 2478 y(char)f(*arg;)390 2565
+y({)468 2653 y(if)g(\(chdir)h(\(arg\))f(==)g(-1\))547
+2740 y({)625 2827 y(perror)h(\(arg\);)625 2914 y(return)g(1;)547
+3001 y(})468 3176 y(com_pwd)g(\(""\);)468 3263 y(return)g(\(0\);)390
+3350 y(})390 3524 y(/*)f(Print)g(out)g(the)g(current)h(working)g
+(directory.)g(*/)390 3611 y(com_pwd)g(\(ignore\))586
+3699 y(char)f(*ignore;)390 3786 y({)468 3873 y(char)h(dir[1024],)g(*s;)
+468 4047 y(s)f(=)f(getcwd)i(\(dir,)f(sizeof\(dir\))i(-)e(1\);)468
+4134 y(if)g(\(s)g(==)f(0\))547 4222 y({)625 4309 y(printf)i(\("Error)g
+(getting)g(pwd:)f(\045s\\n",)g(dir\);)625 4396 y(return)h(1;)547
+4483 y(})468 4658 y(printf)g(\("Current)g(directory)h(is)d(\045s\\n",)i
+(dir\);)468 4745 y(return)g(0;)390 4832 y(})390 5006
+y(/*)f(The)g(user)g(wishes)g(to)g(quit)g(using)h(this)f(program.)80
+b(Just)40 b(set)g(DONE)508 5093 y(non-zero.)h(*/)390
+5181 y(com_quit)g(\(arg\))586 5268 y(char)f(*arg;)p eop
+end
+%%Page: 55 59
+TeXDict begin 55 58 bop 150 -116 a Ft(Chapter)30 b(2:)41
+b(Programming)30 b(with)g(GNU)h(Readline)1683 b(55)390
+299 y Fd({)468 386 y(done)41 b(=)e(1;)468 473 y(return)i(\(0\);)390
+560 y(})390 735 y(/*)f(Function)h(which)f(tells)g(you)g(that)h(you)e
+(can't)i(do)e(this.)i(*/)390 822 y(too_dangerous)h(\(caller\))586
+909 y(char)e(*caller;)390 996 y({)468 1083 y(fprintf)h(\(stderr,)821
+1171 y("\045s:)g(Too)f(dangerous)h(for)f(me)f(to)h(distribute.\\n",)821
+1258 y(caller\);)468 1345 y(fprintf)h(\(stderr,)g("Write)g(it)f
+(yourself.\\n"\);)390 1432 y(})390 1606 y(/*)g(Return)g(non-zero)h(if)f
+(ARG)g(is)g(a)f(valid)h(argument)h(for)f(CALLER,)508
+1694 y(else)g(print)g(an)g(error)g(message)h(and)f(return)h(zero.)f(*/)
+390 1781 y(int)390 1868 y(valid_argument)i(\(caller,)f(arg\))586
+1955 y(char)f(*caller,)h(*arg;)390 2042 y({)468 2130
+y(if)f(\(!arg)g(||)g(!*arg\))547 2217 y({)625 2304 y(fprintf)h
+(\(stderr,)g("\045s:)f(Argument)h(required.\\n",)i(caller\);)625
+2391 y(return)e(\(0\);)547 2478 y(})468 2653 y(return)g(\(1\);)390
+2740 y(})p eop end
+%%Page: 56 60
+TeXDict begin 56 59 bop 150 -116 a Ft(56)2600 b(GNU)31
+b(Readline)g(Library)p eop end
+%%Page: 57 61
+TeXDict begin 57 60 bop 150 -116 a Ft(App)s(endix)29
+b(A:)h(Cop)m(ying)h(This)f(Man)m(ual)2105 b(57)150 299
+y Fp(App)t(endix)52 b(A)40 b(Cop)l(ying)51 b(This)j(Man)l(ual)150
+690 y Fr(A.1)67 b(GNU)45 b(F)-11 b(ree)45 b(Do)t(cumen)l(tation)h
+(License)1396 909 y Ft(V)-8 b(ersion)31 b(1.2,)h(No)m(v)m(em)m(b)s(er)g
+(2002)390 1052 y(Cop)m(yrigh)m(t)842 1049 y(c)817 1052
+y Fq(\015)e Ft(2000,2001,2002)36 b(F)-8 b(ree)32 b(Soft)m(w)m(are)f(F)
+-8 b(oundation,)32 b(Inc.)390 1161 y(59)f(T)-8 b(emple)31
+b(Place,)h(Suite)e(330,)i(Boston,)g(MA)61 b(02111-1307,)35
+b(USA)390 1380 y(Ev)m(ery)m(one)c(is)g(p)s(ermitted)f(to)h(cop)m(y)g
+(and)f(distribute)g(v)m(erbatim)h(copies)390 1490 y(of)g(this)f
+(license)h(do)s(cumen)m(t,)g(but)e(c)m(hanging)j(it)f(is)f(not)h(allo)m
+(w)m(ed.)199 1632 y(0.)61 b(PREAMBLE)330 1770 y(The)37
+b(purp)s(ose)e(of)i(this)g(License)h(is)f(to)h(mak)m(e)g(a)g(man)m
+(ual,)h(textb)s(o)s(ok,)h(or)d(other)g(functional)h(and)330
+1880 y(useful)29 b(do)s(cumen)m(t)h Fi(free)36 b Ft(in)29
+b(the)i(sense)f(of)g(freedom:)41 b(to)31 b(assure)e(ev)m(ery)m(one)j
+(the)e(e\013ectiv)m(e)j(freedom)330 1990 y(to)f(cop)m(y)g(and)f
+(redistribute)g(it,)h(with)g(or)f(without)g(mo)s(difying)g(it,)i
+(either)f(commercially)h(or)e(non-)330 2099 y(commercially)-8
+b(.)56 b(Secondarily)-8 b(,)36 b(this)f(License)g(preserv)m(es)g(for)f
+(the)h(author)f(and)g(publisher)f(a)i(w)m(a)m(y)330 2209
+y(to)i(get)g(credit)g(for)f(their)g(w)m(ork,)i(while)e(not)g(b)s(eing)g
+(considered)g(resp)s(onsible)f(for)h(mo)s(di\014cations)330
+2318 y(made)30 b(b)m(y)h(others.)330 2457 y(This)22 b(License)i(is)f(a)
+h(kind)e(of)i(\\cop)m(yleft",)j(whic)m(h)c(means)g(that)h(deriv)-5
+b(ativ)m(e)24 b(w)m(orks)f(of)h(the)f(do)s(cumen)m(t)330
+2566 y(m)m(ust)34 b(themselv)m(es)h(b)s(e)e(free)h(in)g(the)g(same)g
+(sense.)51 b(It)34 b(complemen)m(ts)h(the)f(GNU)g(General)h(Public)330
+2676 y(License,)c(whic)m(h)f(is)h(a)f(cop)m(yleft)i(license)g(designed)
+e(for)g(free)h(soft)m(w)m(are.)330 2814 y(W)-8 b(e)31
+b(ha)m(v)m(e)f(designed)g(this)f(License)h(in)f(order)g(to)i(use)e(it)h
+(for)f(man)m(uals)h(for)f(free)h(soft)m(w)m(are,)h(b)s(ecause)330
+2924 y(free)42 b(soft)m(w)m(are)i(needs)e(free)g(do)s(cumen)m(tation:)
+65 b(a)42 b(free)h(program)f(should)f(come)i(with)f(man)m(uals)330
+3033 y(pro)m(viding)29 b(the)g(same)g(freedoms)f(that)i(the)f(soft)m(w)
+m(are)h(do)s(es.)40 b(But)29 b(this)f(License)i(is)f(not)g(limited)g
+(to)330 3143 y(soft)m(w)m(are)j(man)m(uals;)f(it)g(can)g(b)s(e)f(used)g
+(for)g(an)m(y)h(textual)h(w)m(ork,)f(regardless)g(of)g(sub)5
+b(ject)30 b(matter)i(or)330 3252 y(whether)f(it)h(is)f(published)f(as)i
+(a)f(prin)m(ted)g(b)s(o)s(ok.)44 b(W)-8 b(e)32 b(recommend)f(this)h
+(License)g(principally)f(for)330 3362 y(w)m(orks)f(whose)h(purp)s(ose)d
+(is)j(instruction)f(or)g(reference.)199 3500 y(1.)61
+b(APPLICABILITY)29 b(AND)j(DEFINITIONS)330 3639 y(This)39
+b(License)i(applies)f(to)g(an)m(y)h(man)m(ual)f(or)g(other)g(w)m(ork,)i
+(in)e(an)m(y)g(medium,)i(that)e(con)m(tains)i(a)330 3748
+y(notice)h(placed)f(b)m(y)f(the)h(cop)m(yrigh)m(t)h(holder)e(sa)m(ying)
+h(it)g(can)g(b)s(e)f(distributed)f(under)g(the)i(terms)330
+3858 y(of)c(this)f(License.)62 b(Suc)m(h)37 b(a)h(notice)h(gran)m(ts)f
+(a)g(w)m(orld-wide,)h(ro)m(y)m(alt)m(y-free)i(license,)f(unlimited)d
+(in)330 3967 y(duration,)49 b(to)d(use)f(that)g(w)m(ork)h(under)d(the)j
+(conditions)f(stated)h(herein.)85 b(The)45 b(\\Do)s(cumen)m(t",)330
+4077 y(b)s(elo)m(w,)29 b(refers)f(to)h(an)m(y)g(suc)m(h)f(man)m(ual)h
+(or)f(w)m(ork.)40 b(An)m(y)29 b(mem)m(b)s(er)e(of)i(the)f(public)g(is)g
+(a)h(licensee,)i(and)330 4187 y(is)25 b(addressed)f(as)h(\\y)m(ou".)40
+b(Y)-8 b(ou)26 b(accept)g(the)f(license)h(if)f(y)m(ou)h(cop)m(y)-8
+b(,)27 b(mo)s(dify)d(or)h(distribute)g(the)g(w)m(ork)330
+4296 y(in)30 b(a)h(w)m(a)m(y)g(requiring)f(p)s(ermission)f(under)g(cop)
+m(yrigh)m(t)j(la)m(w.)330 4435 y(A)i(\\Mo)s(di\014ed)f(V)-8
+b(ersion")35 b(of)f(the)g(Do)s(cumen)m(t)g(means)g(an)m(y)g(w)m(ork)f
+(con)m(taining)j(the)e(Do)s(cumen)m(t)g(or)330 4544 y(a)k(p)s(ortion)f
+(of)h(it,)i(either)e(copied)g(v)m(erbatim,)i(or)d(with)h(mo)s
+(di\014cations)f(and/or)h(translated)g(in)m(to)330 4654
+y(another)31 b(language.)330 4792 y(A)26 b(\\Secondary)g(Section")h(is)
+f(a)h(named)e(app)s(endix)f(or)i(a)h(fron)m(t-matter)g(section)g(of)f
+(the)g(Do)s(cumen)m(t)330 4902 y(that)c(deals)g(exclusiv)m(ely)h(with)e
+(the)g(relationship)h(of)f(the)h(publishers)d(or)i(authors)g(of)h(the)f
+(Do)s(cumen)m(t)330 5011 y(to)38 b(the)f(Do)s(cumen)m(t's)i(o)m(v)m
+(erall)g(sub)5 b(ject)37 b(\(or)h(to)g(related)g(matters\))g(and)f(con)
+m(tains)h(nothing)f(that)330 5121 y(could)j(fall)h(directly)g(within)f
+(that)h(o)m(v)m(erall)i(sub)5 b(ject.)70 b(\(Th)m(us,)42
+b(if)e(the)h(Do)s(cumen)m(t)g(is)f(in)g(part)h(a)330
+5230 y(textb)s(o)s(ok)24 b(of)g(mathematics,)j(a)d(Secondary)f(Section)
+h(ma)m(y)g(not)g(explain)g(an)m(y)g(mathematics.\))40
+b(The)330 5340 y(relationship)28 b(could)f(b)s(e)g(a)g(matter)i(of)e
+(historical)i(connection)f(with)f(the)h(sub)5 b(ject)27
+b(or)g(with)g(related)p eop end
+%%Page: 58 62
+TeXDict begin 58 61 bop 150 -116 a Ft(58)2600 b(GNU)31
+b(Readline)g(Library)330 299 y(matters,)38 b(or)d(of)h(legal,)i
+(commercial,)h(philosophical,)f(ethical)f(or)e(p)s(olitical)i(p)s
+(osition)f(regarding)330 408 y(them.)330 549 y(The)25
+b(\\In)m(v)-5 b(arian)m(t)27 b(Sections")g(are)f(certain)g(Secondary)g
+(Sections)g(whose)f(titles)i(are)f(designated,)i(as)330
+659 y(b)s(eing)e(those)h(of)g(In)m(v)-5 b(arian)m(t)27
+b(Sections,)i(in)d(the)h(notice)h(that)f(sa)m(ys)g(that)g(the)g(Do)s
+(cumen)m(t)g(is)g(released)330 769 y(under)f(this)i(License.)40
+b(If)27 b(a)h(section)h(do)s(es)f(not)f(\014t)h(the)g(ab)s(o)m(v)m(e)h
+(de\014nition)e(of)h(Secondary)f(then)h(it)g(is)330 878
+y(not)k(allo)m(w)m(ed)i(to)e(b)s(e)g(designated)g(as)g(In)m(v)-5
+b(arian)m(t.)46 b(The)31 b(Do)s(cumen)m(t)i(ma)m(y)f(con)m(tain)i(zero)
+e(In)m(v)-5 b(arian)m(t)330 988 y(Sections.)39 b(If)25
+b(the)f(Do)s(cumen)m(t)i(do)s(es)e(not)h(iden)m(tify)g(an)m(y)g(In)m(v)
+-5 b(arian)m(t)25 b(Sections)h(then)e(there)h(are)g(none.)330
+1129 y(The)36 b(\\Co)m(v)m(er)i(T)-8 b(exts")38 b(are)f(certain)g
+(short)g(passages)g(of)g(text)g(that)h(are)f(listed,)i(as)d(F)-8
+b(ron)m(t-Co)m(v)m(er)330 1238 y(T)g(exts)26 b(or)f(Bac)m(k-Co)m(v)m
+(er)j(T)-8 b(exts,)27 b(in)d(the)h(notice)i(that)e(sa)m(ys)h(that)g
+(the)f(Do)s(cumen)m(t)h(is)f(released)g(under)330 1348
+y(this)h(License.)40 b(A)25 b(F)-8 b(ron)m(t-Co)m(v)m(er)29
+b(T)-8 b(ext)26 b(ma)m(y)h(b)s(e)e(at)i(most)f(5)g(w)m(ords,)g(and)g(a)
+g(Bac)m(k-Co)m(v)m(er)j(T)-8 b(ext)26 b(ma)m(y)330 1457
+y(b)s(e)k(at)h(most)g(25)g(w)m(ords.)330 1598 y(A)36
+b(\\T)-8 b(ransparen)m(t")36 b(cop)m(y)g(of)g(the)f(Do)s(cumen)m(t)h
+(means)g(a)g(mac)m(hine-readable)h(cop)m(y)-8 b(,)38
+b(represen)m(ted)330 1708 y(in)d(a)h(format)g(whose)g(sp)s
+(eci\014cation)g(is)g(a)m(v)-5 b(ailable)38 b(to)f(the)f(general)g
+(public,)h(that)f(is)g(suitable)g(for)330 1817 y(revising)c(the)g(do)s
+(cumen)m(t)f(straigh)m(tforw)m(ardly)i(with)e(generic)i(text)g(editors)
+f(or)f(\(for)h(images)h(com-)330 1927 y(p)s(osed)23 b(of)h(pixels\))g
+(generic)h(pain)m(t)f(programs)g(or)f(\(for)h(dra)m(wings\))g(some)g
+(widely)g(a)m(v)-5 b(ailable)26 b(dra)m(wing)330 2037
+y(editor,)k(and)f(that)g(is)g(suitable)h(for)f(input)f(to)i(text)g
+(formatters)f(or)g(for)g(automatic)i(translation)f(to)330
+2146 y(a)d(v)-5 b(ariet)m(y)28 b(of)f(formats)g(suitable)h(for)e(input)
+g(to)i(text)g(formatters.)40 b(A)27 b(cop)m(y)g(made)g(in)g(an)g
+(otherwise)330 2256 y(T)-8 b(ransparen)m(t)37 b(\014le)h(format)g
+(whose)f(markup,)i(or)e(absence)h(of)g(markup,)g(has)g(b)s(een)f
+(arranged)g(to)330 2365 y(th)m(w)m(art)27 b(or)g(discourage)g
+(subsequen)m(t)f(mo)s(di\014cation)h(b)m(y)g(readers)f(is)g(not)h(T)-8
+b(ransparen)m(t.)39 b(An)27 b(image)330 2475 y(format)35
+b(is)f(not)h(T)-8 b(ransparen)m(t)34 b(if)g(used)g(for)g(an)m(y)g
+(substan)m(tial)h(amoun)m(t)g(of)g(text.)53 b(A)35 b(cop)m(y)g(that)g
+(is)330 2585 y(not)c(\\T)-8 b(ransparen)m(t")31 b(is)f(called)i
+(\\Opaque".)330 2725 y(Examples)53 b(of)g(suitable)h(formats)f(for)g(T)
+-8 b(ransparen)m(t)53 b(copies)h(include)f(plain)g Fm(asci)r(i)g
+Ft(without)330 2835 y(markup,)41 b(T)-8 b(exinfo)40 b(input)f(format,)j
+(LaT)1775 2855 y(E)1826 2835 y(X)d(input)g(format,)k
+Fm(sgml)c Ft(or)g Fm(xml)g Ft(using)g(a)h(publicly)330
+2945 y(a)m(v)-5 b(ailable)34 b Fm(dtd)p Ft(,)d(and)g
+(standard-conforming)g(simple)h Fm(html)p Ft(,)f(P)m(ostScript)h(or)f
+Fm(pdf)g Ft(designed)g(for)330 3054 y(h)m(uman)37 b(mo)s(di\014cation.)
+65 b(Examples)38 b(of)g(transparen)m(t)g(image)i(formats)e(include)g
+Fm(png)p Ft(,)i Fm(x)n(cf)e Ft(and)330 3164 y Fm(jpg)p
+Ft(.)63 b(Opaque)38 b(formats)g(include)g(proprietary)g(formats)g(that)
+h(can)f(b)s(e)g(read)g(and)f(edited)i(only)330 3273 y(b)m(y)g
+(proprietary)g(w)m(ord)g(pro)s(cessors,)j Fm(sgml)c Ft(or)i
+Fm(xml)e Ft(for)i(whic)m(h)f(the)g Fm(dtd)g Ft(and/or)g(pro)s(cessing)
+330 3383 y(to)s(ols)32 b(are)f(not)g(generally)h(a)m(v)-5
+b(ailable,)34 b(and)c(the)h(mac)m(hine-generated)i Fm(html)p
+Ft(,)d(P)m(ostScript)i(or)f Fm(pdf)330 3493 y Ft(pro)s(duced)e(b)m(y)h
+(some)h(w)m(ord)f(pro)s(cessors)g(for)g(output)g(purp)s(oses)e(only)-8
+b(.)330 3634 y(The)34 b(\\Title)h(P)m(age")i(means,)e(for)f(a)h(prin)m
+(ted)f(b)s(o)s(ok,)h(the)f(title)i(page)f(itself,)h(plus)e(suc)m(h)f
+(follo)m(wing)330 3743 y(pages)28 b(as)g(are)g(needed)g(to)g(hold,)g
+(legibly)-8 b(,)30 b(the)e(material)h(this)f(License)g(requires)f(to)h
+(app)s(ear)f(in)h(the)330 3853 y(title)g(page.)40 b(F)-8
+b(or)28 b(w)m(orks)e(in)g(formats)h(whic)m(h)g(do)f(not)h(ha)m(v)m(e)h
+(an)m(y)e(title)j(page)e(as)g(suc)m(h,)g(\\Title)h(P)m(age")330
+3962 y(means)j(the)f(text)i(near)e(the)h(most)g(prominen)m(t)g(app)s
+(earance)f(of)h(the)g(w)m(ork's)g(title,)h(preceding)f(the)330
+4072 y(b)s(eginning)f(of)g(the)h(b)s(o)s(dy)e(of)h(the)h(text.)330
+4213 y(A)f(section)h(\\En)m(titled)g(XYZ")f(means)f(a)h(named)g
+(subunit)e(of)h(the)h(Do)s(cumen)m(t)h(whose)e(title)i(either)330
+4322 y(is)d(precisely)g(XYZ)g(or)f(con)m(tains)i(XYZ)f(in)f(paren)m
+(theses)i(follo)m(wing)g(text)g(that)f(translates)h(XYZ)e(in)330
+4432 y(another)e(language.)40 b(\(Here)26 b(XYZ)f(stands)f(for)h(a)g
+(sp)s(eci\014c)g(section)h(name)f(men)m(tioned)h(b)s(elo)m(w,)g(suc)m
+(h)330 4542 y(as)i(\\Ac)m(kno)m(wledgemen)m(ts",)33 b(\\Dedications",)e
+(\\Endorsemen)m(ts",)e(or)f(\\History".\))42 b(T)-8 b(o)29
+b(\\Preserv)m(e)330 4651 y(the)34 b(Title")h(of)e(suc)m(h)h(a)g
+(section)g(when)f(y)m(ou)h(mo)s(dify)e(the)i(Do)s(cumen)m(t)h(means)e
+(that)h(it)g(remains)g(a)330 4761 y(section)e(\\En)m(titled)f(XYZ")g
+(according)g(to)g(this)g(de\014nition.)330 4902 y(The)c(Do)s(cumen)m(t)
+i(ma)m(y)f(include)f(W)-8 b(arran)m(t)m(y)30 b(Disclaimers)f(next)f(to)
+g(the)g(notice)h(whic)m(h)e(states)i(that)330 5011 y(this)34
+b(License)g(applies)g(to)h(the)f(Do)s(cumen)m(t.)52 b(These)33
+b(W)-8 b(arran)m(t)m(y)36 b(Disclaimers)f(are)g(considered)e(to)330
+5121 y(b)s(e)k(included)g(b)m(y)g(reference)h(in)g(this)f(License,)j
+(but)d(only)h(as)g(regards)f(disclaiming)i(w)m(arran)m(ties:)330
+5230 y(an)m(y)e(other)g(implication)i(that)e(these)g(W)-8
+b(arran)m(t)m(y)39 b(Disclaimers)f(ma)m(y)g(ha)m(v)m(e)g(is)f(v)m(oid)g
+(and)f(has)h(no)330 5340 y(e\013ect)32 b(on)e(the)h(meaning)f(of)h
+(this)f(License.)p eop end
+%%Page: 59 63
+TeXDict begin 59 62 bop 150 -116 a Ft(App)s(endix)29
+b(A:)h(Cop)m(ying)h(This)f(Man)m(ual)2105 b(59)199 299
+y(2.)61 b(VERBA)-8 b(TIM)31 b(COPYING)330 445 y(Y)-8
+b(ou)39 b(ma)m(y)f(cop)m(y)h(and)e(distribute)h(the)g(Do)s(cumen)m(t)h
+(in)f(an)m(y)g(medium,)h(either)g(commercially)h(or)330
+555 y(noncommercially)-8 b(,)48 b(pro)m(vided)42 b(that)h(this)f
+(License,)47 b(the)42 b(cop)m(yrigh)m(t)i(notices,)j(and)42
+b(the)h(license)330 664 y(notice)37 b(sa)m(ying)g(this)e(License)i
+(applies)e(to)i(the)f(Do)s(cumen)m(t)g(are)g(repro)s(duced)e(in)i(all)g
+(copies,)j(and)330 774 y(that)27 b(y)m(ou)g(add)f(no)h(other)f
+(conditions)h(whatso)s(ev)m(er)h(to)f(those)g(of)g(this)f(License.)40
+b(Y)-8 b(ou)27 b(ma)m(y)g(not)g(use)330 883 y(tec)m(hnical)35
+b(measures)d(to)i(obstruct)f(or)g(con)m(trol)h(the)f(reading)g(or)g
+(further)e(cop)m(ying)j(of)f(the)g(copies)330 993 y(y)m(ou)25
+b(mak)m(e)g(or)g(distribute.)38 b(Ho)m(w)m(ev)m(er,)28
+b(y)m(ou)d(ma)m(y)g(accept)h(comp)s(ensation)f(in)f(exc)m(hange)j(for)d
+(copies.)330 1103 y(If)32 b(y)m(ou)g(distribute)g(a)h(large)g(enough)f
+(n)m(um)m(b)s(er)f(of)h(copies)h(y)m(ou)f(m)m(ust)h(also)g(follo)m(w)g
+(the)f(conditions)330 1212 y(in)e(section)i(3.)330 1358
+y(Y)-8 b(ou)21 b(ma)m(y)h(also)f(lend)g(copies,)i(under)d(the)h(same)g
+(conditions)g(stated)h(ab)s(o)m(v)m(e,)i(and)c(y)m(ou)h(ma)m(y)g
+(publicly)330 1468 y(displa)m(y)31 b(copies.)199 1614
+y(3.)61 b(COPYING)30 b(IN)g(QUANTITY)330 1760 y(If)25
+b(y)m(ou)g(publish)f(prin)m(ted)g(copies)i(\(or)g(copies)g(in)f(media)g
+(that)h(commonly)g(ha)m(v)m(e)g(prin)m(ted)f(co)m(v)m(ers\))i(of)330
+1870 y(the)32 b(Do)s(cumen)m(t,)h(n)m(um)m(b)s(ering)e(more)h(than)f
+(100,)j(and)d(the)h(Do)s(cumen)m(t's)h(license)f(notice)h(requires)330
+1979 y(Co)m(v)m(er)i(T)-8 b(exts,)36 b(y)m(ou)f(m)m(ust)f(enclose)i
+(the)e(copies)h(in)f(co)m(v)m(ers)i(that)f(carry)-8 b(,)36
+b(clearly)f(and)f(legibly)-8 b(,)37 b(all)330 2089 y(these)j(Co)m(v)m
+(er)g(T)-8 b(exts:)59 b(F)-8 b(ron)m(t-Co)m(v)m(er)41
+b(T)-8 b(exts)40 b(on)f(the)g(fron)m(t)g(co)m(v)m(er,)44
+b(and)38 b(Bac)m(k-Co)m(v)m(er)k(T)-8 b(exts)40 b(on)330
+2198 y(the)29 b(bac)m(k)h(co)m(v)m(er.)42 b(Both)30 b(co)m(v)m(ers)h(m)
+m(ust)e(also)h(clearly)g(and)f(legibly)h(iden)m(tify)f(y)m(ou)h(as)f
+(the)h(publisher)330 2308 y(of)k(these)h(copies.)53 b(The)34
+b(fron)m(t)h(co)m(v)m(er)h(m)m(ust)e(presen)m(t)g(the)h(full)f(title)i
+(with)d(all)j(w)m(ords)d(of)i(the)f(title)330 2418 y(equally)e
+(prominen)m(t)e(and)g(visible.)43 b(Y)-8 b(ou)31 b(ma)m(y)g(add)g
+(other)g(material)h(on)f(the)g(co)m(v)m(ers)h(in)e(addition.)330
+2527 y(Cop)m(ying)36 b(with)g(c)m(hanges)h(limited)g(to)g(the)g(co)m(v)
+m(ers,)i(as)d(long)h(as)g(they)f(preserv)m(e)g(the)h(title)g(of)g(the)
+330 2637 y(Do)s(cumen)m(t)h(and)e(satisfy)i(these)f(conditions,)j(can)d
+(b)s(e)g(treated)h(as)f(v)m(erbatim)h(cop)m(ying)g(in)f(other)330
+2746 y(resp)s(ects.)330 2892 y(If)32 b(the)h(required)f(texts)i(for)e
+(either)h(co)m(v)m(er)i(are)e(to)s(o)g(v)m(oluminous)g(to)g(\014t)g
+(legibly)-8 b(,)35 b(y)m(ou)e(should)f(put)330 3002 y(the)h(\014rst)f
+(ones)h(listed)g(\(as)h(man)m(y)f(as)g(\014t)g(reasonably\))g(on)g(the)
+g(actual)h(co)m(v)m(er,)h(and)e(con)m(tin)m(ue)h(the)330
+3112 y(rest)d(on)m(to)g(adjacen)m(t)h(pages.)330 3258
+y(If)27 b(y)m(ou)g(publish)e(or)i(distribute)g(Opaque)f(copies)i(of)f
+(the)h(Do)s(cumen)m(t)f(n)m(um)m(b)s(ering)f(more)i(than)e(100,)330
+3367 y(y)m(ou)i(m)m(ust)g(either)h(include)e(a)i(mac)m(hine-readable)g
+(T)-8 b(ransparen)m(t)28 b(cop)m(y)h(along)g(with)e(eac)m(h)i(Opaque)
+330 3477 y(cop)m(y)-8 b(,)38 b(or)d(state)h(in)f(or)g(with)g(eac)m(h)h
+(Opaque)e(cop)m(y)i(a)g(computer-net)m(w)m(ork)g(lo)s(cation)h(from)d
+(whic)m(h)330 3587 y(the)24 b(general)i(net)m(w)m(ork-using)f(public)e
+(has)h(access)i(to)f(do)m(wnload)f(using)g(public-standard)f(net)m(w)m
+(ork)330 3696 y(proto)s(cols)40 b(a)f(complete)h(T)-8
+b(ransparen)m(t)39 b(cop)m(y)g(of)g(the)h(Do)s(cumen)m(t,)i(free)d(of)g
+(added)f(material.)67 b(If)330 3806 y(y)m(ou)39 b(use)g(the)g(latter)h
+(option,)h(y)m(ou)f(m)m(ust)e(tak)m(e)j(reasonably)e(pruden)m(t)e
+(steps,)k(when)d(y)m(ou)h(b)s(egin)330 3915 y(distribution)f(of)g
+(Opaque)g(copies)h(in)e(quan)m(tit)m(y)-8 b(,)43 b(to)38
+b(ensure)g(that)h(this)f(T)-8 b(ransparen)m(t)38 b(cop)m(y)h(will)330
+4025 y(remain)30 b(th)m(us)g(accessible)i(at)f(the)f(stated)h(lo)s
+(cation)h(un)m(til)e(at)h(least)h(one)e(y)m(ear)h(after)g(the)f(last)h
+(time)330 4134 y(y)m(ou)37 b(distribute)f(an)h(Opaque)f(cop)m(y)i
+(\(directly)g(or)e(through)g(y)m(our)h(agen)m(ts)h(or)f(retailers\))h
+(of)f(that)330 4244 y(edition)31 b(to)g(the)g(public.)330
+4390 y(It)k(is)f(requested,)i(but)e(not)h(required,)g(that)g(y)m(ou)g
+(con)m(tact)h(the)f(authors)f(of)h(the)g(Do)s(cumen)m(t)g(w)m(ell)330
+4500 y(b)s(efore)28 b(redistributing)g(an)m(y)h(large)h(n)m(um)m(b)s
+(er)d(of)i(copies,)h(to)f(giv)m(e)h(them)f(a)g(c)m(hance)h(to)f(pro)m
+(vide)g(y)m(ou)330 4609 y(with)h(an)g(up)s(dated)f(v)m(ersion)i(of)g
+(the)f(Do)s(cumen)m(t.)199 4755 y(4.)61 b(MODIFICA)-8
+b(TIONS)330 4902 y(Y)g(ou)26 b(ma)m(y)g(cop)m(y)g(and)f(distribute)g(a)
+h(Mo)s(di\014ed)f(V)-8 b(ersion)26 b(of)g(the)g(Do)s(cumen)m(t)g(under)
+e(the)h(conditions)330 5011 y(of)c(sections)h(2)g(and)e(3)h(ab)s(o)m(v)
+m(e,)k(pro)m(vided)20 b(that)i(y)m(ou)f(release)i(the)e(Mo)s(di\014ed)f
+(V)-8 b(ersion)22 b(under)d(precisely)330 5121 y(this)29
+b(License,)h(with)f(the)g(Mo)s(di\014ed)f(V)-8 b(ersion)30
+b(\014lling)f(the)g(role)h(of)f(the)g(Do)s(cumen)m(t,)h(th)m(us)f
+(licensing)330 5230 y(distribution)k(and)h(mo)s(di\014cation)g(of)h
+(the)f(Mo)s(di\014ed)f(V)-8 b(ersion)35 b(to)g(who)s(ev)m(er)f(p)s
+(ossesses)f(a)i(cop)m(y)g(of)330 5340 y(it.)41 b(In)30
+b(addition,)h(y)m(ou)f(m)m(ust)h(do)f(these)h(things)f(in)g(the)h(Mo)s
+(di\014ed)e(V)-8 b(ersion:)p eop end
+%%Page: 60 64
+TeXDict begin 60 63 bop 150 -116 a Ft(60)2600 b(GNU)31
+b(Readline)g(Library)357 299 y(A.)60 b(Use)33 b(in)f(the)h(Title)h(P)m
+(age)g(\(and)f(on)f(the)h(co)m(v)m(ers,)i(if)e(an)m(y\))g(a)g(title)h
+(distinct)f(from)g(that)g(of)g(the)510 408 y(Do)s(cumen)m(t,)j(and)d
+(from)g(those)i(of)f(previous)f(v)m(ersions)h(\(whic)m(h)g(should,)g
+(if)g(there)g(w)m(ere)g(an)m(y)-8 b(,)510 518 y(b)s(e)31
+b(listed)h(in)f(the)g(History)h(section)g(of)g(the)f(Do)s(cumen)m(t\).)
+45 b(Y)-8 b(ou)32 b(ma)m(y)g(use)f(the)g(same)h(title)h(as)510
+628 y(a)e(previous)f(v)m(ersion)g(if)h(the)f(original)i(publisher)d(of)
+h(that)h(v)m(ersion)g(giv)m(es)h(p)s(ermission.)360 758
+y(B.)61 b(List)31 b(on)f(the)h(Title)g(P)m(age,)i(as)d(authors,)h(one)g
+(or)f(more)h(p)s(ersons)e(or)h(en)m(tities)j(resp)s(onsible)c(for)510
+867 y(authorship)c(of)h(the)h(mo)s(di\014cations)f(in)g(the)g(Mo)s
+(di\014ed)f(V)-8 b(ersion,)28 b(together)g(with)d(at)i(least)h(\014v)m
+(e)510 977 y(of)c(the)g(principal)g(authors)f(of)i(the)f(Do)s(cumen)m
+(t)g(\(all)h(of)g(its)f(principal)g(authors,)h(if)f(it)g(has)g(few)m
+(er)510 1087 y(than)30 b(\014v)m(e\),)h(unless)f(they)h(release)g(y)m
+(ou)g(from)f(this)g(requiremen)m(t.)359 1217 y(C.)60
+b(State)32 b(on)e(the)h(Title)h(page)f(the)g(name)g(of)g(the)g
+(publisher)e(of)i(the)g(Mo)s(di\014ed)f(V)-8 b(ersion,)32
+b(as)f(the)510 1326 y(publisher.)355 1456 y(D.)61 b(Preserv)m(e)31
+b(all)g(the)g(cop)m(yrigh)m(t)h(notices)f(of)g(the)f(Do)s(cumen)m(t.)
+363 1587 y(E.)60 b(Add)30 b(an)i(appropriate)f(cop)m(yrigh)m(t)i
+(notice)f(for)g(y)m(our)f(mo)s(di\014cations)g(adjacen)m(t)i(to)f(the)g
+(other)510 1696 y(cop)m(yrigh)m(t)g(notices.)365 1826
+y(F.)61 b(Include,)28 b(immediately)h(after)f(the)h(cop)m(yrigh)m(t)g
+(notices,)h(a)e(license)h(notice)g(giving)g(the)f(public)510
+1936 y(p)s(ermission)23 b(to)j(use)e(the)g(Mo)s(di\014ed)g(V)-8
+b(ersion)25 b(under)e(the)i(terms)f(of)h(this)f(License,)j(in)d(the)g
+(form)510 2045 y(sho)m(wn)30 b(in)g(the)g(Addendum)f(b)s(elo)m(w.)353
+2176 y(G.)61 b(Preserv)m(e)23 b(in)g(that)g(license)h(notice)g(the)f
+(full)g(lists)g(of)g(In)m(v)-5 b(arian)m(t)23 b(Sections)h(and)e
+(required)g(Co)m(v)m(er)510 2285 y(T)-8 b(exts)31 b(giv)m(en)g(in)f
+(the)h(Do)s(cumen)m(t's)g(license)h(notice.)357 2415
+y(H.)60 b(Include)30 b(an)g(unaltered)g(cop)m(y)h(of)g(this)f(License.)
+392 2545 y(I.)60 b(Preserv)m(e)33 b(the)f(section)h(En)m(titled)g
+(\\History",)h(Preserv)m(e)f(its)f(Title,)i(and)d(add)h(to)h(it)f(an)g
+(item)510 2655 y(stating)d(at)g(least)g(the)g(title,)h(y)m(ear,)g(new)d
+(authors,)i(and)e(publisher)f(of)j(the)f(Mo)s(di\014ed)f(V)-8
+b(ersion)510 2765 y(as)32 b(giv)m(en)g(on)f(the)h(Title)g(P)m(age.)45
+b(If)31 b(there)h(is)f(no)g(section)i(En)m(titled)f(\\History")h(in)e
+(the)g(Do)s(cu-)510 2874 y(men)m(t,)37 b(create)f(one)f(stating)h(the)f
+(title,)i(y)m(ear,)g(authors,)f(and)e(publisher)f(of)i(the)g(Do)s
+(cumen)m(t)510 2984 y(as)h(giv)m(en)h(on)f(its)h(Title)g(P)m(age,)i
+(then)d(add)g(an)g(item)g(describing)g(the)g(Mo)s(di\014ed)g(V)-8
+b(ersion)37 b(as)510 3093 y(stated)31 b(in)f(the)h(previous)f(sen)m
+(tence.)378 3224 y(J.)60 b(Preserv)m(e)33 b(the)g(net)m(w)m(ork)g(lo)s
+(cation,)i(if)d(an)m(y)-8 b(,)34 b(giv)m(en)f(in)g(the)f(Do)s(cumen)m
+(t)h(for)g(public)e(access)j(to)510 3333 y(a)e(T)-8 b(ransparen)m(t)30
+b(cop)m(y)i(of)g(the)f(Do)s(cumen)m(t,)h(and)f(lik)m(ewise)h(the)g(net)
+m(w)m(ork)g(lo)s(cations)g(giv)m(en)g(in)510 3443 y(the)g(Do)s(cumen)m
+(t)g(for)g(previous)f(v)m(ersions)h(it)g(w)m(as)g(based)f(on.)45
+b(These)31 b(ma)m(y)h(b)s(e)f(placed)h(in)g(the)510 3552
+y(\\History")27 b(section.)40 b(Y)-8 b(ou)25 b(ma)m(y)h(omit)g(a)f(net)
+m(w)m(ork)h(lo)s(cation)g(for)f(a)h(w)m(ork)f(that)g(w)m(as)h
+(published)510 3662 y(at)36 b(least)h(four)e(y)m(ears)i(b)s(efore)e
+(the)h(Do)s(cumen)m(t)h(itself,)h(or)d(if)h(the)g(original)h(publisher)
+d(of)i(the)510 3771 y(v)m(ersion)31 b(it)g(refers)f(to)h(giv)m(es)h(p)s
+(ermission.)354 3902 y(K.)60 b(F)-8 b(or)24 b(an)m(y)h(section)f(En)m
+(titled)h(\\Ac)m(kno)m(wledgemen)m(ts")i(or)d(\\Dedications",)k
+(Preserv)m(e)c(the)g(Title)510 4011 y(of)j(the)f(section,)j(and)d
+(preserv)m(e)h(in)f(the)h(section)g(all)h(the)e(substance)h(and)f(tone)
+h(of)f(eac)m(h)i(of)f(the)510 4121 y(con)m(tributor)k(ac)m(kno)m
+(wledgemen)m(ts)i(and/or)d(dedications)h(giv)m(en)h(therein.)368
+4251 y(L.)60 b(Preserv)m(e)36 b(all)g(the)g(In)m(v)-5
+b(arian)m(t)36 b(Sections)g(of)f(the)h(Do)s(cumen)m(t,)h(unaltered)f
+(in)f(their)g(text)i(and)510 4361 y(in)f(their)g(titles.)58
+b(Section)37 b(n)m(um)m(b)s(ers)d(or)i(the)g(equiv)-5
+b(alen)m(t)38 b(are)e(not)g(considered)g(part)g(of)g(the)510
+4470 y(section)c(titles.)341 4600 y(M.)61 b(Delete)33
+b(an)m(y)e(section)h(En)m(titled)f(\\Endorsemen)m(ts".)42
+b(Suc)m(h)30 b(a)i(section)f(ma)m(y)h(not)f(b)s(e)f(included)510
+4710 y(in)g(the)h(Mo)s(di\014ed)e(V)-8 b(ersion.)357
+4840 y(N.)60 b(Do)29 b(not)g(retitle)h(an)m(y)e(existing)i(section)f
+(to)g(b)s(e)f(En)m(titled)h(\\Endorsemen)m(ts")g(or)f(to)h(con\015ict)g
+(in)510 4950 y(title)j(with)e(an)m(y)h(In)m(v)-5 b(arian)m(t)31
+b(Section.)354 5080 y(O.)60 b(Preserv)m(e)31 b(an)m(y)g(W)-8
+b(arran)m(t)m(y)32 b(Disclaimers.)330 5230 y(If)h(the)g(Mo)s(di\014ed)g
+(V)-8 b(ersion)34 b(includes)f(new)g(fron)m(t-matter)i(sections)f(or)f
+(app)s(endices)g(that)h(qualify)330 5340 y(as)28 b(Secondary)g
+(Sections)g(and)f(con)m(tain)j(no)d(material)j(copied)e(from)f(the)h
+(Do)s(cumen)m(t,)i(y)m(ou)e(ma)m(y)g(at)p eop end
+%%Page: 61 65
+TeXDict begin 61 64 bop 150 -116 a Ft(App)s(endix)29
+b(A:)h(Cop)m(ying)h(This)f(Man)m(ual)2105 b(61)330 299
+y(y)m(our)32 b(option)h(designate)h(some)e(or)h(all)g(of)f(these)h
+(sections)h(as)e(in)m(v)-5 b(arian)m(t.)48 b(T)-8 b(o)33
+b(do)f(this,)h(add)f(their)330 408 y(titles)37 b(to)f(the)f(list)h(of)g
+(In)m(v)-5 b(arian)m(t)36 b(Sections)g(in)f(the)h(Mo)s(di\014ed)f(V)-8
+b(ersion's)36 b(license)g(notice.)57 b(These)330 518
+y(titles)32 b(m)m(ust)e(b)s(e)g(distinct)h(from)e(an)m(y)i(other)g
+(section)g(titles.)330 650 y(Y)-8 b(ou)43 b(ma)m(y)g(add)f(a)g(section)
+i(En)m(titled)f(\\Endorsemen)m(ts",)j(pro)m(vided)c(it)h(con)m(tains)g
+(nothing)g(but)330 759 y(endorsemen)m(ts)30 b(of)g(y)m(our)f(Mo)s
+(di\014ed)g(V)-8 b(ersion)31 b(b)m(y)e(v)-5 b(arious)30
+b(parties|for)g(example,)g(statemen)m(ts)i(of)330 869
+y(p)s(eer)27 b(review)g(or)g(that)h(the)f(text)i(has)d(b)s(een)h(appro)
+m(v)m(ed)g(b)m(y)g(an)h(organization)h(as)e(the)h(authoritativ)m(e)330
+978 y(de\014nition)i(of)h(a)f(standard.)330 1110 y(Y)-8
+b(ou)29 b(ma)m(y)g(add)e(a)i(passage)g(of)g(up)e(to)i(\014v)m(e)g(w)m
+(ords)e(as)i(a)g(F)-8 b(ron)m(t-Co)m(v)m(er)30 b(T)-8
+b(ext,)30 b(and)e(a)g(passage)i(of)e(up)330 1219 y(to)g(25)g(w)m(ords)e
+(as)i(a)f(Bac)m(k-Co)m(v)m(er)j(T)-8 b(ext,)29 b(to)f(the)f(end)f(of)i
+(the)f(list)h(of)f(Co)m(v)m(er)h(T)-8 b(exts)27 b(in)g(the)h(Mo)s
+(di\014ed)330 1329 y(V)-8 b(ersion.)58 b(Only)35 b(one)h(passage)h(of)f
+(F)-8 b(ron)m(t-Co)m(v)m(er)38 b(T)-8 b(ext)36 b(and)g(one)g(of)g(Bac)m
+(k-Co)m(v)m(er)j(T)-8 b(ext)36 b(ma)m(y)h(b)s(e)330 1439
+y(added)27 b(b)m(y)g(\(or)h(through)f(arrangemen)m(ts)h(made)g(b)m(y\))
+g(an)m(y)g(one)f(en)m(tit)m(y)-8 b(.)42 b(If)27 b(the)h(Do)s(cumen)m(t)
+g(already)330 1548 y(includes)34 b(a)g(co)m(v)m(er)h(text)g(for)f(the)g
+(same)h(co)m(v)m(er,)h(previously)e(added)f(b)m(y)h(y)m(ou)g(or)g(b)m
+(y)g(arrangemen)m(t)330 1658 y(made)h(b)m(y)g(the)h(same)f(en)m(tit)m
+(y)i(y)m(ou)f(are)f(acting)i(on)e(b)s(ehalf)f(of,)j(y)m(ou)f(ma)m(y)g
+(not)f(add)g(another;)j(but)330 1767 y(y)m(ou)c(ma)m(y)h(replace)g(the)
+f(old)g(one,)i(on)e(explicit)h(p)s(ermission)e(from)g(the)i(previous)e
+(publisher)f(that)330 1877 y(added)e(the)g(old)h(one.)330
+2008 y(The)25 b(author\(s\))h(and)f(publisher\(s\))f(of)i(the)f(Do)s
+(cumen)m(t)h(do)g(not)f(b)m(y)h(this)f(License)h(giv)m(e)h(p)s
+(ermission)330 2118 y(to)k(use)f(their)g(names)h(for)f(publicit)m(y)g
+(for)h(or)f(to)h(assert)g(or)f(imply)g(endorsemen)m(t)g(of)h(an)m(y)g
+(Mo)s(di\014ed)330 2228 y(V)-8 b(ersion.)199 2359 y(5.)61
+b(COMBINING)31 b(DOCUMENTS)330 2491 y(Y)-8 b(ou)39 b(ma)m(y)g(com)m
+(bine)h(the)f(Do)s(cumen)m(t)g(with)g(other)f(do)s(cumen)m(ts)h
+(released)g(under)f(this)g(License,)330 2600 y(under)f(the)h(terms)g
+(de\014ned)f(in)h(section)h(4)g(ab)s(o)m(v)m(e)g(for)f(mo)s(di\014ed)f
+(v)m(ersions,)k(pro)m(vided)d(that)h(y)m(ou)330 2710
+y(include)25 b(in)g(the)g(com)m(bination)i(all)f(of)g(the)f(In)m(v)-5
+b(arian)m(t)26 b(Sections)g(of)g(all)g(of)f(the)h(original)g(do)s
+(cumen)m(ts,)330 2819 y(unmo)s(di\014ed,)g(and)g(list)h(them)g(all)g
+(as)g(In)m(v)-5 b(arian)m(t)28 b(Sections)f(of)g(y)m(our)g(com)m(bined)
+g(w)m(ork)f(in)h(its)g(license)330 2929 y(notice,)32
+b(and)e(that)h(y)m(ou)f(preserv)m(e)h(all)g(their)g(W)-8
+b(arran)m(t)m(y)32 b(Disclaimers.)330 3061 y(The)e(com)m(bined)g(w)m
+(ork)h(need)e(only)i(con)m(tain)g(one)g(cop)m(y)g(of)f(this)g(License,)
+i(and)d(m)m(ultiple)i(iden)m(tical)330 3170 y(In)m(v)-5
+b(arian)m(t)33 b(Sections)g(ma)m(y)g(b)s(e)f(replaced)h(with)f(a)h
+(single)g(cop)m(y)-8 b(.)48 b(If)32 b(there)h(are)g(m)m(ultiple)g(In)m
+(v)-5 b(arian)m(t)330 3280 y(Sections)27 b(with)g(the)g(same)g(name)g
+(but)f(di\013eren)m(t)h(con)m(ten)m(ts,)i(mak)m(e)f(the)f(title)h(of)f
+(eac)m(h)h(suc)m(h)f(section)330 3389 y(unique)33 b(b)m(y)h(adding)f
+(at)i(the)f(end)g(of)g(it,)h(in)f(paren)m(theses,)i(the)e(name)g(of)g
+(the)g(original)h(author)f(or)330 3499 y(publisher)23
+b(of)i(that)h(section)g(if)f(kno)m(wn,)h(or)f(else)h(a)f(unique)f(n)m
+(um)m(b)s(er.)38 b(Mak)m(e)26 b(the)g(same)f(adjustmen)m(t)330
+3608 y(to)g(the)g(section)g(titles)h(in)e(the)h(list)g(of)f(In)m(v)-5
+b(arian)m(t)26 b(Sections)f(in)f(the)g(license)i(notice)g(of)e(the)h
+(com)m(bined)330 3718 y(w)m(ork.)330 3850 y(In)41 b(the)g(com)m
+(bination,)46 b(y)m(ou)41 b(m)m(ust)g(com)m(bine)h(an)m(y)g(sections)g
+(En)m(titled)g(\\History")h(in)e(the)g(v)-5 b(ari-)330
+3959 y(ous)32 b(original)h(do)s(cumen)m(ts,)g(forming)f(one)g(section)h
+(En)m(titled)g(\\History";)i(lik)m(ewise)f(com)m(bine)f(an)m(y)330
+4069 y(sections)g(En)m(titled)f(\\Ac)m(kno)m(wledgemen)m(ts",)k(and)31
+b(an)m(y)h(sections)h(En)m(titled)g(\\Dedications".)47
+b(Y)-8 b(ou)330 4178 y(m)m(ust)30 b(delete)i(all)f(sections)h(En)m
+(titled)f(\\Endorsemen)m(ts.")199 4310 y(6.)61 b(COLLECTIONS)28
+b(OF)i(DOCUMENTS)330 4441 y(Y)-8 b(ou)32 b(ma)m(y)h(mak)m(e)g(a)f
+(collection)i(consisting)f(of)f(the)g(Do)s(cumen)m(t)g(and)g(other)g
+(do)s(cumen)m(ts)f(released)330 4551 y(under)41 b(this)h(License,)k
+(and)c(replace)h(the)g(individual)f(copies)h(of)f(this)g(License)h(in)f
+(the)h(v)-5 b(arious)330 4661 y(do)s(cumen)m(ts)42 b(with)g(a)h(single)
+g(cop)m(y)h(that)f(is)f(included)g(in)g(the)h(collection,)48
+b(pro)m(vided)42 b(that)i(y)m(ou)330 4770 y(follo)m(w)38
+b(the)g(rules)e(of)h(this)g(License)h(for)f(v)m(erbatim)h(cop)m(ying)g
+(of)f(eac)m(h)h(of)f(the)h(do)s(cumen)m(ts)e(in)h(all)330
+4880 y(other)31 b(resp)s(ects.)330 5011 y(Y)-8 b(ou)32
+b(ma)m(y)g(extract)h(a)f(single)g(do)s(cumen)m(t)f(from)g(suc)m(h)g(a)h
+(collection,)i(and)d(distribute)g(it)h(individu-)330
+5121 y(ally)k(under)d(this)i(License,)i(pro)m(vided)e(y)m(ou)g(insert)g
+(a)g(cop)m(y)h(of)f(this)g(License)g(in)m(to)h(the)g(extracted)330
+5230 y(do)s(cumen)m(t,)d(and)f(follo)m(w)i(this)e(License)h(in)g(all)g
+(other)g(resp)s(ects)f(regarding)h(v)m(erbatim)g(cop)m(ying)h(of)330
+5340 y(that)d(do)s(cumen)m(t.)p eop end
+%%Page: 62 66
+TeXDict begin 62 65 bop 150 -116 a Ft(62)2600 b(GNU)31
+b(Readline)g(Library)199 299 y(7.)61 b(A)m(GGREGA)-8
+b(TION)32 b(WITH)e(INDEPENDENT)h(W)m(ORKS)330 428 y(A)d(compilation)i
+(of)e(the)g(Do)s(cumen)m(t)h(or)f(its)g(deriv)-5 b(ativ)m(es)30
+b(with)d(other)i(separate)g(and)e(indep)s(enden)m(t)330
+538 y(do)s(cumen)m(ts)33 b(or)g(w)m(orks,)h(in)f(or)h(on)f(a)g(v)m
+(olume)h(of)g(a)f(storage)i(or)e(distribution)g(medium,)g(is)h(called)
+330 648 y(an)c(\\aggregate")k(if)c(the)g(cop)m(yrigh)m(t)i(resulting)e
+(from)f(the)i(compilation)g(is)f(not)h(used)e(to)i(limit)g(the)330
+757 y(legal)d(righ)m(ts)f(of)g(the)g(compilation's)h(users)e(b)s(ey)m
+(ond)g(what)g(the)h(individual)f(w)m(orks)g(p)s(ermit.)39
+b(When)330 867 y(the)28 b(Do)s(cumen)m(t)g(is)g(included)f(an)g
+(aggregate,)32 b(this)27 b(License)h(do)s(es)g(not)g(apply)f(to)h(the)g
+(other)g(w)m(orks)330 976 y(in)i(the)h(aggregate)i(whic)m(h)d(are)h
+(not)f(themselv)m(es)i(deriv)-5 b(ativ)m(e)32 b(w)m(orks)e(of)h(the)f
+(Do)s(cumen)m(t.)330 1106 y(If)22 b(the)h(Co)m(v)m(er)h(T)-8
+b(ext)23 b(requiremen)m(t)g(of)g(section)h(3)f(is)g(applicable)h(to)f
+(these)h(copies)f(of)g(the)g(Do)s(cumen)m(t,)330 1215
+y(then)f(if)g(the)h(Do)s(cumen)m(t)g(is)g(less)f(than)g(one)h(half)f
+(of)h(the)g(en)m(tire)g(aggregate,)k(the)c(Do)s(cumen)m(t's)g(Co)m(v)m
+(er)330 1325 y(T)-8 b(exts)27 b(ma)m(y)g(b)s(e)f(placed)h(on)g(co)m(v)m
+(ers)h(that)f(brac)m(k)m(et)h(the)f(Do)s(cumen)m(t)g(within)f(the)h
+(aggregate,)j(or)d(the)330 1435 y(electronic)37 b(equiv)-5
+b(alen)m(t)36 b(of)g(co)m(v)m(ers)g(if)f(the)g(Do)s(cumen)m(t)h(is)f
+(in)g(electronic)i(form.)54 b(Otherwise)35 b(they)330
+1544 y(m)m(ust)30 b(app)s(ear)g(on)g(prin)m(ted)g(co)m(v)m(ers)i(that)f
+(brac)m(k)m(et)h(the)f(whole)f(aggregate.)199 1674 y(8.)61
+b(TRANSLA)-8 b(TION)330 1803 y(T)g(ranslation)41 b(is)f(considered)f(a)
+i(kind)e(of)h(mo)s(di\014cation,)j(so)d(y)m(ou)g(ma)m(y)h(distribute)e
+(translations)330 1913 y(of)45 b(the)f(Do)s(cumen)m(t)h(under)e(the)h
+(terms)h(of)f(section)i(4.)83 b(Replacing)45 b(In)m(v)-5
+b(arian)m(t)45 b(Sections)g(with)330 2022 y(translations)h(requires)f
+(sp)s(ecial)h(p)s(ermission)f(from)g(their)g(cop)m(yrigh)m(t)i
+(holders,)i(but)c(y)m(ou)g(ma)m(y)330 2132 y(include)24
+b(translations)i(of)e(some)h(or)g(all)g(In)m(v)-5 b(arian)m(t)25
+b(Sections)g(in)f(addition)h(to)g(the)g(original)h(v)m(ersions)330
+2242 y(of)32 b(these)f(In)m(v)-5 b(arian)m(t)33 b(Sections.)44
+b(Y)-8 b(ou)32 b(ma)m(y)g(include)f(a)h(translation)g(of)g(this)f
+(License,)i(and)d(all)j(the)330 2351 y(license)42 b(notices)g(in)f(the)
+h(Do)s(cumen)m(t,)j(and)40 b(an)m(y)i(W)-8 b(arran)m(t)m(y)42
+b(Disclaimers,)k(pro)m(vided)41 b(that)h(y)m(ou)330 2461
+y(also)f(include)f(the)g(original)h(English)f(v)m(ersion)g(of)g(this)g
+(License)h(and)e(the)h(original)h(v)m(ersions)g(of)330
+2570 y(those)35 b(notices)g(and)e(disclaimers.)53 b(In)33
+b(case)i(of)g(a)f(disagreemen)m(t)h(b)s(et)m(w)m(een)g(the)f
+(translation)i(and)330 2680 y(the)f(original)i(v)m(ersion)e(of)h(this)f
+(License)h(or)f(a)g(notice)i(or)e(disclaimer,)i(the)f(original)g(v)m
+(ersion)g(will)330 2790 y(prev)-5 b(ail.)330 2919 y(If)28
+b(a)h(section)h(in)e(the)h(Do)s(cumen)m(t)h(is)e(En)m(titled)i(\\Ac)m
+(kno)m(wledgemen)m(ts",)i(\\Dedications",)g(or)d(\\His-)330
+3029 y(tory",)f(the)f(requiremen)m(t)f(\(section)i(4\))f(to)g(Preserv)m
+(e)g(its)f(Title)i(\(section)f(1\))g(will)g(t)m(ypically)h(require)330
+3138 y(c)m(hanging)j(the)g(actual)h(title.)199 3268 y(9.)61
+b(TERMINA)-8 b(TION)330 3397 y(Y)g(ou)30 b(ma)m(y)h(not)f(cop)m(y)-8
+b(,)31 b(mo)s(dify)-8 b(,)30 b(sublicense,)g(or)g(distribute)f(the)h
+(Do)s(cumen)m(t)g(except)h(as)f(expressly)330 3507 y(pro)m(vided)41
+b(for)h(under)e(this)i(License.)75 b(An)m(y)42 b(other)g(attempt)h(to)g
+(cop)m(y)-8 b(,)46 b(mo)s(dify)-8 b(,)44 b(sublicense)e(or)330
+3616 y(distribute)36 b(the)h(Do)s(cumen)m(t)g(is)g(v)m(oid,)i(and)d
+(will)h(automatically)i(terminate)f(y)m(our)e(righ)m(ts)h(under)330
+3726 y(this)28 b(License.)40 b(Ho)m(w)m(ev)m(er,)31 b(parties)d(who)f
+(ha)m(v)m(e)i(receiv)m(ed)g(copies,)h(or)d(righ)m(ts,)i(from)f(y)m(ou)g
+(under)e(this)330 3836 y(License)37 b(will)g(not)g(ha)m(v)m(e)h(their)f
+(licenses)g(terminated)h(so)f(long)g(as)g(suc)m(h)f(parties)h(remain)g
+(in)f(full)330 3945 y(compliance.)154 4075 y(10.)61 b(FUTURE)30
+b(REVISIONS)f(OF)i(THIS)e(LICENSE)330 4204 y(The)41 b(F)-8
+b(ree)43 b(Soft)m(w)m(are)f(F)-8 b(oundation)43 b(ma)m(y)f(publish)e
+(new,)k(revised)d(v)m(ersions)h(of)g(the)g(GNU)g(F)-8
+b(ree)330 4314 y(Do)s(cumen)m(tation)34 b(License)e(from)g(time)h(to)g
+(time.)46 b(Suc)m(h)31 b(new)h(v)m(ersions)g(will)h(b)s(e)e(similar)h
+(in)g(spirit)330 4423 y(to)j(the)g(presen)m(t)f(v)m(ersion,)i(but)e(ma)
+m(y)h(di\013er)f(in)g(detail)h(to)g(address)f(new)g(problems)f(or)i
+(concerns.)330 4533 y(See)c Fs(http://www.gnu.org/copy)o(left)o(/)p
+Ft(.)330 4663 y(Eac)m(h)f(v)m(ersion)g(of)g(the)f(License)h(is)g(giv)m
+(en)g(a)g(distinguishing)f(v)m(ersion)h(n)m(um)m(b)s(er.)39
+b(If)29 b(the)g(Do)s(cumen)m(t)330 4772 y(sp)s(eci\014es)45
+b(that)h(a)g(particular)f(n)m(um)m(b)s(ered)f(v)m(ersion)i(of)f(this)g
+(License)h(\\or)g(an)m(y)g(later)g(v)m(ersion")330 4882
+y(applies)33 b(to)g(it,)h(y)m(ou)e(ha)m(v)m(e)i(the)f(option)g(of)f
+(follo)m(wing)i(the)f(terms)f(and)g(conditions)h(either)g(of)f(that)330
+4991 y(sp)s(eci\014ed)37 b(v)m(ersion)i(or)e(of)h(an)m(y)h(later)g(v)m
+(ersion)f(that)g(has)g(b)s(een)f(published)f(\(not)j(as)f(a)g(draft\))g
+(b)m(y)330 5101 y(the)33 b(F)-8 b(ree)34 b(Soft)m(w)m(are)f(F)-8
+b(oundation.)49 b(If)32 b(the)h(Do)s(cumen)m(t)g(do)s(es)g(not)g(sp)s
+(ecify)f(a)h(v)m(ersion)g(n)m(um)m(b)s(er)f(of)330 5210
+y(this)i(License,)j(y)m(ou)d(ma)m(y)i(c)m(ho)s(ose)f(an)m(y)g(v)m
+(ersion)g(ev)m(er)g(published)e(\(not)i(as)g(a)f(draft\))h(b)m(y)f(the)
+h(F)-8 b(ree)330 5320 y(Soft)m(w)m(are)31 b(F)-8 b(oundation.)p
+eop end
+%%Page: 63 67
+TeXDict begin 63 66 bop 150 -116 a Ft(App)s(endix)29
+b(A:)h(Cop)m(ying)h(This)f(Man)m(ual)2105 b(63)150 299
+y Fh(A.1.1)62 b(ADDENDUM:)41 b(Ho)m(w)g(to)g(use)g(this)g(License)g
+(for)h(y)m(our)f(do)s(cumen)m(ts)275 543 y Ft(T)-8 b(o)27
+b(use)g(this)g(License)h(in)f(a)h(do)s(cumen)m(t)f(y)m(ou)h(ha)m(v)m(e)
+g(written,)g(include)f(a)h(cop)m(y)g(of)f(the)h(License)g(in)f(the)150
+653 y(do)s(cumen)m(t)j(and)g(put)g(the)g(follo)m(wing)i(cop)m(yrigh)m
+(t)g(and)e(license)h(notices)g(just)f(after)h(the)g(title)h(page:)468
+765 y Fd(Copyright)42 b(\(C\))79 b Fc(year)88 b(your)40
+b(name)p Fd(.)468 852 y(Permission)i(is)e(granted)g(to)g(copy,)h
+(distribute)g(and/or)g(modify)f(this)g(document)468 939
+y(under)h(the)f(terms)g(of)g(the)g(GNU)g(Free)g(Documentation)i
+(License,)f(Version)g(1.2)468 1026 y(or)f(any)g(later)g(version)h
+(published)h(by)d(the)h(Free)g(Software)h(Foundation;)468
+1113 y(with)g(no)e(Invariant)j(Sections,)f(no)f(Front-Cover)h(Texts,)g
+(and)f(no)f(Back-Cover)j(Texts.)468 1200 y(A)e(copy)g(of)g(the)g
+(license)g(is)g(included)h(in)f(the)g(section)h(entitled)g(``GNU)468
+1288 y(Free)g(Documentation)h(License''.)275 1410 y Ft(If)d(y)m(ou)h
+(ha)m(v)m(e)h(In)m(v)-5 b(arian)m(t)41 b(Sections,)i(F)-8
+b(ron)m(t-Co)m(v)m(er)42 b(T)-8 b(exts)41 b(and)e(Bac)m(k-Co)m(v)m(er)k
+(T)-8 b(exts,)43 b(replace)e(the)150 1520 y(\\with...T)-8
+b(exts.")43 b(line)30 b(with)h(this:)547 1632 y Fd(with)40
+b(the)g(Invariant)h(Sections)g(being)g Fc(list)f(their)g(titles)p
+Fd(,)h(with)547 1719 y(the)f(Front-Cover)i(Texts)e(being)g
+Fc(list)p Fd(,)h(and)f(with)g(the)g(Back-Cover)h(Texts)547
+1806 y(being)f Fc(list)p Fd(.)275 1929 y Ft(If)34 b(y)m(ou)i(ha)m(v)m
+(e)g(In)m(v)-5 b(arian)m(t)36 b(Sections)g(without)f(Co)m(v)m(er)h(T)-8
+b(exts,)38 b(or)d(some)g(other)h(com)m(bination)g(of)g(the)150
+2038 y(three,)31 b(merge)g(those)g(t)m(w)m(o)g(alternativ)m(es)i(to)e
+(suit)f(the)h(situation.)275 2173 y(If)23 b(y)m(our)h(do)s(cumen)m(t)f
+(con)m(tains)i(non)m(trivial)g(examples)g(of)f(program)f(co)s(de,)j(w)m
+(e)e(recommend)g(releasing)150 2283 y(these)44 b(examples)f(in)g
+(parallel)h(under)e(y)m(our)h(c)m(hoice)i(of)e(free)g(soft)m(w)m(are)h
+(license,)k(suc)m(h)43 b(as)g(the)g(GNU)150 2392 y(General)31
+b(Public)f(License,)i(to)f(p)s(ermit)e(their)i(use)f(in)g(free)g(soft)m
+(w)m(are.)p eop end
+%%Page: 64 68
+TeXDict begin 64 67 bop 150 -116 a Ft(64)2600 b(GNU)31
+b(Readline)g(Library)p eop end
+%%Page: 65 69
+TeXDict begin 65 68 bop 150 -116 a Ft(Concept)31 b(Index)2927
+b(65)150 299 y Fp(Concept)52 b(Index)150 638 y Fr(A)150
+759 y Fb(application-sp)r(eci\014c)27 b(completion)f(functions)9
+b Fa(.)14 b(.)e(.)g(.)h(.)f(.)g(.)35 b Fb(41)150 1022
+y Fr(C)150 1143 y Fb(command)26 b(editing)20 b Fa(.)12
+b(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f
+(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)46 b Fb(1)150
+1406 y Fr(E)150 1527 y Fb(editing)26 b(command)g(lines)e
+Fa(.)12 b(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h
+(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)49 b Fb(1)150 1789 y Fr(F)150
+1910 y Fb(FDL,)26 b(GNU)f(F)-6 b(ree)25 b(Do)r(cumen)n(tation)h
+(License)11 b Fa(.)j(.)e(.)g(.)h(.)f(.)g(.)37 b Fb(57)150
+2173 y Fr(I)150 2294 y Fb(initialization)28 b(\014le,)e(readline)8
+b Fa(.)13 b(.)g(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f
+(.)g(.)h(.)f(.)g(.)h(.)34 b Fb(4)150 2384 y(in)n(teraction,)27
+b(readline)10 b Fa(.)j(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h
+(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)36
+b Fb(1)2025 638 y Fr(K)2025 759 y Fb(kill)26 b(ring)15
+b Fa(.)e(.)f(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)
+f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g
+(.)h(.)f(.)g(.)42 b Fb(3)2025 849 y(killing)26 b(text)18
+b Fa(.)12 b(.)g(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g
+(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)
+g(.)44 b Fb(2)2025 1111 y Fr(N)2025 1233 y Fb(notation,)26
+b(readline)13 b Fa(.)h(.)e(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h
+(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)40
+b Fb(1)2025 1495 y Fr(R)2025 1616 y Fb(readline,)26 b(function)15
+b Fa(.)e(.)g(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)
+h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)41 b Fb(21)2025
+1879 y Fr(V)2025 2000 y Fb(v)l(ariables,)27 b(readline)8
+b Fa(.)k(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)
+g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)34 b
+Fb(5)2025 2263 y Fr(Y)2025 2384 y Fb(y)n(anking)25 b(text)8
+b Fa(.)j(.)i(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)
+h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)34
+b Fb(2)p eop end
+%%Page: 66 70
+TeXDict begin 66 69 bop 150 -116 a Ft(66)2600 b(GNU)31
+b(Readline)g(Library)p eop end
+%%Page: 67 71
+TeXDict begin 67 70 bop 150 -116 a Ft(F)-8 b(unction)31
+b(and)f(V)-8 b(ariable)32 b(Index)2370 b(67)150 299 y
+Fp(F)-13 b(unction)52 b(and)h(V)-13 b(ariable)53 b(Index)p
+159 610 41 6 v 150 729 a Fd(_rl_digit_p)23 b Fa(.)12
+b(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h
+(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)46
+b Fb(36)150 818 y Fd(_rl_digit_value)15 b Fa(.)g(.)e(.)f(.)g(.)h(.)f(.)
+g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f
+(.)g(.)g(.)h(.)40 b Fb(36)150 906 y Fd(_rl_lowercase_p)15
+b Fa(.)g(.)e(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)
+h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)40 b Fb(36)150
+995 y Fd(_rl_to_lower)22 b Fa(.)12 b(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)
+f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g
+(.)h(.)f(.)g(.)45 b Fb(36)150 1084 y Fd(_rl_to_upper)22
+b Fa(.)12 b(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f
+(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)45
+b Fb(36)150 1172 y Fd(_rl_uppercase_p)15 b Fa(.)g(.)e(.)f(.)g(.)h(.)f
+(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)
+f(.)g(.)g(.)h(.)40 b Fb(36)150 1431 y Fr(A)150 1550 y
+Fd(abort)27 b(\(C-g\))9 b Fa(.)k(.)g(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)
+h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f
+(.)g(.)h(.)f(.)g(.)35 b Fb(18)150 1639 y Fd(accept-line)28
+b(\(Newline)g(or)e(Return\))12 b Fa(.)h(.)g(.)f(.)g(.)h(.)f(.)g(.)h(.)f
+(.)g(.)h(.)37 b Fb(13)150 1898 y Fr(B)150 2017 y Fd(backward-char)29
+b(\(C-b\))16 b Fa(.)d(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h
+(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)41 b Fb(13)150
+2106 y Fd(backward-delete-char)30 b(\(Rubout\))21 b Fa(.)13
+b(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)45 b
+Fb(15)150 2194 y Fd(backward-kill-line)30 b(\(C-x)c(Rubout\))f
+Fa(.)12 b(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)49 b
+Fb(16)150 2283 y Fd(backward-kill-word)30 b(\(M-)999
+2280 y Fk(h)p 1024 2227 146 4 v 1024 2283 a Fj(DEL)p
+1024 2298 V 1165 2280 a Fk(i)1195 2283 y Fd(\))21 b Fa(.)13
+b(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)46
+b Fb(16)150 2372 y Fd(backward-word)29 b(\(M-b\))16 b
+Fa(.)d(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f
+(.)g(.)h(.)f(.)g(.)g(.)h(.)41 b Fb(13)150 2460 y Fd
+(beginning-of-history)30 b(\(M-<\))25 b Fa(.)12 b(.)h(.)f(.)g(.)h(.)f
+(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)49 b Fb(14)150
+2549 y Fd(beginning-of-line)29 b(\(C-a\))10 b Fa(.)k(.)e(.)g(.)h(.)f(.)
+g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)35
+b Fb(13)150 2637 y(b)r(ell-st)n(yle)14 b Fa(.)f(.)f(.)g(.)h(.)f(.)g(.)h
+(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)
+g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)40 b
+Fb(5)150 2726 y(bind-tt)n(y-sp)r(ecial-c)n(hars)21 b
+Fa(.)12 b(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h
+(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)48 b Fb(5)150 2983
+y Fr(C)150 3102 y Fd(call-last-kbd-macro)30 b(\(C-x)c(e\))11
+b Fa(.)i(.)f(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)36
+b Fb(18)150 3191 y Fd(capitalize-word)29 b(\(M-c\))13
+b Fa(.)g(.)g(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)
+g(.)h(.)f(.)g(.)h(.)38 b Fb(15)150 3279 y Fd(character-search)29
+b(\(C-]\))11 b Fa(.)j(.)e(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f
+(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)37 b Fb(18)150 3368 y
+Fd(character-search-backward)31 b(\(M-C-]\))14 b Fa(.)g(.)e(.)g(.)h(.)f
+(.)g(.)h(.)f(.)39 b Fb(19)150 3457 y Fd(clear-screen)28
+b(\(C-l\))17 b Fa(.)d(.)e(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h
+(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)43 b Fb(13)150
+3545 y(commen)n(t-b)r(egin)18 b Fa(.)12 b(.)g(.)h(.)f(.)g(.)h(.)f(.)g
+(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)
+f(.)g(.)h(.)f(.)g(.)44 b Fb(5)150 3634 y Fd(complete)27
+b(\()528 3631 y Fk(h)p 553 3578 148 4 v 553 3634 a Fj(T)-6
+b(AB)p 553 3649 V 697 3631 a Fk(i)726 3634 y Fd(\))20
+b Fa(.)12 b(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f
+(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)45 b Fb(17)150
+3723 y(completion-query-items)8 b Fa(.)k(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)
+h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)34
+b Fb(5)150 3811 y(con)n(v)n(ert-meta)18 b Fa(.)12 b(.)h(.)f(.)g(.)h(.)f
+(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)
+h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)45 b Fb(5)150 3900
+y Fd(copy-backward-word)30 b(\(\))13 b Fa(.)f(.)h(.)f(.)g(.)h(.)f(.)g
+(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)38
+b Fb(16)150 3988 y Fd(copy-forward-word)29 b(\(\))14
+b Fa(.)f(.)g(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)
+h(.)f(.)g(.)h(.)f(.)g(.)40 b Fb(16)150 4077 y Fd(copy-region-as-kill)30
+b(\(\))11 b Fa(.)i(.)f(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g
+(.)h(.)f(.)g(.)h(.)f(.)g(.)37 b Fb(16)150 4336 y Fr(D)150
+4455 y Fd(delete-char)28 b(\(C-d\))20 b Fa(.)12 b(.)g(.)h(.)f(.)g(.)h
+(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)
+h(.)f(.)44 b Fb(15)150 4544 y Fd(delete-char-or-list)30
+b(\(\))11 b Fa(.)i(.)f(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g
+(.)h(.)f(.)g(.)h(.)f(.)g(.)37 b Fb(17)150 4632 y Fd
+(delete-horizontal-space)31 b(\(\))24 b Fa(.)12 b(.)h(.)f(.)g(.)h(.)f
+(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)49 b Fb(16)150
+4721 y Fd(digit-argument)29 b(\()p Fc(M-0)p Fd(,)e Fc(M-1)p
+Fd(,)f(...)g Fc(M--)p Fd(\))14 b Fa(.)g(.)e(.)h(.)f(.)g(.)h(.)f(.)g(.)
+40 b Fb(17)150 4810 y(disable-completion)16 b Fa(.)e(.)e(.)h(.)f(.)g(.)
+h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g
+(.)h(.)f(.)g(.)h(.)42 b Fb(5)150 4898 y Fd(do-uppercase-version)30
+b(\(M-a,)d(M-b,)f(M-)p Fc(x)p Fd(,)h(...)q(\))318 4985
+y Fa(.)12 b(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f
+(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)
+h(.)f(.)g(.)h(.)f(.)g(.)40 b Fb(18)150 5074 y Fd(downcase-word)29
+b(\(M-l\))16 b Fa(.)d(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h
+(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)41 b Fb(15)150
+5163 y Fd(dump-functions)29 b(\(\))19 b Fa(.)12 b(.)g(.)h(.)f(.)g(.)h
+(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)
+h(.)f(.)44 b Fb(19)150 5251 y Fd(dump-macros)28 b(\(\))c
+Fa(.)12 b(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h
+(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)48
+b Fb(19)150 5340 y Fd(dump-variables)29 b(\(\))19 b Fa(.)12
+b(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h
+(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)44 b Fb(19)2025 610 y
+Fr(E)2025 727 y Fb(editing-mo)r(de)19 b Fa(.)12 b(.)g(.)h(.)f(.)g(.)h
+(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)
+g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)45 b Fb(5)2025 815
+y Fd(emacs-editing-mode)29 b(\(C-e\))8 b Fa(.)14 b(.)f(.)f(.)g(.)h(.)f
+(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)34
+b Fb(19)2025 902 y(enable-k)n(eypad)18 b Fa(.)10 b(.)j(.)f(.)g(.)h(.)f
+(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)
+f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)44 b Fb(6)2025 990 y
+Fd(end-kbd-macro)28 b(\(C-x)f(\)\))20 b Fa(.)12 b(.)h(.)f(.)g(.)h(.)f
+(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)45
+b Fb(18)2025 1077 y Fd(end-of-history)29 b(\(M->\))14
+b Fa(.)f(.)g(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)
+g(.)h(.)f(.)g(.)h(.)f(.)40 b Fb(14)2025 1165 y Fd(end-of-line)28
+b(\(C-e\))20 b Fa(.)12 b(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)
+h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)44
+b Fb(13)2025 1253 y Fd(exchange-point-and-mark)31 b(\(C-x)26
+b(C-x\))21 b Fa(.)13 b(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)46
+b Fb(18)2025 1340 y(expand-tilde)11 b Fa(.)g(.)i(.)f(.)g(.)h(.)f(.)g(.)
+g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f
+(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)37 b Fb(6)2025 1592
+y Fr(F)2025 1709 y Fd(forward-backward-delete-char)32
+b(\(\))16 b Fa(.)d(.)f(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)42
+b Fb(15)2025 1796 y Fd(forward-char)28 b(\(C-f\))17 b
+Fa(.)d(.)e(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f
+(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)43 b Fb(13)2025 1884 y
+Fd(forward-search-history)30 b(\(C-s\))22 b Fa(.)13 b(.)f(.)g(.)h(.)f
+(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)47 b Fb(14)2025 1972
+y Fd(forward-word)28 b(\(M-f\))17 b Fa(.)d(.)e(.)g(.)h(.)f(.)g(.)h(.)f
+(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)43
+b Fb(13)2025 2215 y Fr(H)2025 2332 y Fb(history-preserv)n(e-p)r(oin)n
+(t)16 b Fa(.)11 b(.)i(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g
+(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)42 b Fb(6)2025
+2419 y Fd(history-search-backward)31 b(\(\))24 b Fa(.)12
+b(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)49
+b Fb(14)2025 2507 y Fd(history-search-forward)30 b(\(\))7
+b Fa(.)13 b(.)f(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f
+(.)g(.)33 b Fb(14)2025 2595 y(horizon)n(tal-scroll-mo)r(de)11
+b Fa(.)j(.)f(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)
+g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)37 b Fb(6)2025 2830 y
+Fr(I)2025 2946 y Fb(input-meta)15 b Fa(.)d(.)g(.)g(.)h(.)f(.)g(.)h(.)f
+(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)
+h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)42 b Fb(6)2025 3034
+y Fd(insert-comment)29 b(\(M-#\))14 b Fa(.)f(.)g(.)f(.)g(.)h(.)f(.)g(.)
+h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)40
+b Fb(19)2025 3122 y Fd(insert-completions)29 b(\(M-*\))8
+b Fa(.)14 b(.)f(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g
+(.)h(.)f(.)34 b Fb(17)2025 3209 y(isearc)n(h-terminators)6
+b Fa(.)14 b(.)e(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h
+(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)33 b Fb(6)2025
+3444 y Fr(K)2025 3561 y Fb(k)n(eymap)17 b Fa(.)12 b(.)g(.)g(.)h(.)f(.)g
+(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)
+f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)44
+b Fb(6)2025 3649 y Fd(kill-line)27 b(\(C-k\))c Fa(.)12
+b(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f
+(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)47 b Fb(16)2025
+3736 y Fd(kill-region)28 b(\(\))23 b Fa(.)13 b(.)f(.)g(.)h(.)f(.)g(.)h
+(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)
+g(.)h(.)f(.)g(.)49 b Fb(16)2025 3824 y Fd(kill-whole-line)29
+b(\(\))17 b Fa(.)c(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f
+(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)43 b Fb(16)2025
+3911 y Fd(kill-word)27 b(\(M-d\))c Fa(.)12 b(.)h(.)f(.)g(.)h(.)f(.)g(.)
+h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f
+(.)g(.)h(.)47 b Fb(16)2025 4155 y Fr(M)2025 4272 y Fb(mark-mo)r
+(di\014ed-lines)15 b Fa(.)d(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f
+(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)42
+b Fb(6)2025 4359 y(mark-symlink)n(ed-directories)20 b
+Fa(.)12 b(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g
+(.)h(.)f(.)g(.)47 b Fb(7)2025 4447 y(matc)n(h-hidden-\014les)20
+b Fa(.)13 b(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g
+(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)48 b Fb(7)2025
+4534 y Fd(menu-complete)28 b(\(\))21 b Fa(.)12 b(.)g(.)h(.)f(.)g(.)h(.)
+f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h
+(.)f(.)g(.)46 b Fb(17)2025 4622 y(meta-\015ag)9 b Fa(.)j(.)h(.)f(.)g(.)
+h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g
+(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)35
+b Fb(6)2025 4874 y Fr(N)2025 4990 y Fd(next-history)28
+b(\(C-n\))17 b Fa(.)d(.)e(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h
+(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)43 b Fb(14)2025
+5078 y Fd(non-incremental-forward-search)q(-hist)q(ory)32
+b(\(M-n\))2193 5165 y Fa(.)12 b(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f
+(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)
+f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)40 b Fb(14)2025
+5253 y Fd(non-incremental-reverse-search)q(-hist)q(ory)32
+b(\(M-p\))2193 5340 y Fa(.)12 b(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f
+(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)
+f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)40 b Fb(14)p
+eop end
+%%Page: 68 72
+TeXDict begin 68 71 bop 150 -116 a Ft(68)2600 b(GNU)31
+b(Readline)g(Library)150 299 y Fr(O)150 417 y Fb(output-meta)10
+b Fa(.)i(.)g(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)
+h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)36
+b Fb(7)150 506 y Fd(overwrite-mode)29 b(\(\))19 b Fa(.)12
+b(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h
+(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)44 b Fb(15)150 754 y Fr(P)150
+872 y Fb(page-completions)23 b Fa(.)12 b(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)
+f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h
+(.)f(.)g(.)48 b Fb(7)150 961 y Fd(possible-completions)30
+b(\(M-?\))25 b Fa(.)12 b(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)
+g(.)g(.)h(.)49 b Fb(17)150 1049 y Fd(prefix-meta)28 b(\()646
+1046 y Fk(h)p 671 993 139 4 v 671 1049 a Fj(ESC)p 671
+1064 V 804 1046 a Fk(i)834 1049 y Fd(\))20 b Fa(.)13
+b(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f
+(.)g(.)h(.)f(.)g(.)h(.)45 b Fb(18)150 1137 y Fd(previous-history)29
+b(\(C-p\))11 b Fa(.)j(.)e(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f
+(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)37 b Fb(14)150 1396 y
+Fr(Q)150 1514 y Fd(quoted-insert)29 b(\(C-q)d(or)g(C-v\))20
+b Fa(.)13 b(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g
+(.)45 b Fb(15)150 1772 y Fr(R)150 1891 y Fd(re-read-init-file)29
+b(\(C-x)e(C-r\))11 b Fa(.)i(.)f(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h
+(.)f(.)g(.)h(.)36 b Fb(18)150 1979 y Fd(readline)7 b
+Fa(.)14 b(.)e(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h
+(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)
+g(.)h(.)32 b Fb(21)150 2068 y Fd(redraw-current-line)e(\(\))11
+b Fa(.)i(.)f(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)
+g(.)h(.)f(.)g(.)37 b Fb(13)150 2156 y Fd(reverse-search-history)31
+b(\(C-r\))22 b Fa(.)12 b(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)
+h(.)46 b Fb(14)150 2245 y Fd(revert-line)28 b(\(M-r\))20
+b Fa(.)12 b(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f
+(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)44 b Fb(18)150
+2333 y Fd(rl_add_defun)22 b Fa(.)12 b(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h
+(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)
+g(.)h(.)f(.)g(.)45 b Fb(28)150 2421 y Fd(rl_add_funmap_entry)9
+b Fa(.)17 b(.)12 b(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f
+(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)34 b Fb(31)150 2510
+y Fd(rl_add_undo)23 b Fa(.)12 b(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h
+(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)
+g(.)h(.)f(.)46 b Fb(32)150 2598 y Fd(rl_alphabetic)18
+b Fa(.)d(.)d(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)
+f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)43
+b Fb(36)150 2687 y Fd(rl_already_prompted)9 b Fa(.)17
+b(.)12 b(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)
+f(.)g(.)h(.)f(.)g(.)h(.)34 b Fb(25)150 2775 y Fd
+(rl_attempted_completion_funct)q(ion)9 b Fa(.)18 b(.)12
+b(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)34 b Fb(44)150 2864 y
+Fd(rl_attempted_completion_over)15 b Fa(.)j(.)12 b(.)g(.)h(.)f(.)g(.)h
+(.)f(.)g(.)h(.)f(.)g(.)h(.)39 b Fb(47)150 2952 y Fd
+(rl_basic_quote_characters)18 b Fa(.)g(.)13 b(.)f(.)g(.)h(.)f(.)g(.)h
+(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)44 b Fb(45)150 3041
+y Fd(rl_basic_word_break_character)q(s)11 b Fa(.)18 b(.)13
+b(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)37 b Fb(45)150
+3129 y Fd(rl_begin_undo_group)9 b Fa(.)17 b(.)12 b(.)g(.)h(.)f(.)g(.)g
+(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)34
+b Fb(32)150 3217 y Fd(rl_bind_key)23 b Fa(.)12 b(.)h(.)f(.)g(.)h(.)f(.)
+g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h
+(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)46 b Fb(29)150 3306 y
+Fd(rl_bind_key_if_unbound)28 b Fa(.)12 b(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)
+h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)48 b Fb(29)150
+3394 y Fd(rl_bind_key_if_unbound_in_map)14 b Fa(.)j(.)c(.)f(.)g(.)h(.)f
+(.)g(.)h(.)f(.)g(.)h(.)f(.)38 b Fb(30)150 3483 y Fd(rl_bind_key_in_map)
+10 b Fa(.)17 b(.)12 b(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f
+(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)36 b Fb(29)150
+3571 y Fd(rl_bind_keyseq)16 b Fa(.)g(.)c(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)
+h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f
+(.)g(.)42 b Fb(30)150 3660 y Fd(rl_bind_keyseq_if_unbound)18
+b Fa(.)g(.)13 b(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g
+(.)44 b Fb(30)150 3748 y Fd(rl_bind_keyseq_if_unbound_in_)q(map)9
+b Fa(.)18 b(.)12 b(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)34 b
+Fb(30)150 3836 y Fd(rl_bind_keyseq_in_map)29 b Fa(.)12
+b(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h
+(.)f(.)g(.)50 b Fb(30)150 3925 y Fd(rl_binding_keymap)12
+b Fa(.)k(.)c(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)
+g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)37 b Fb(26)150 4013
+y Fd(rl_callback_handler_install)16 b Fa(.)i(.)12 b(.)h(.)f(.)g(.)h(.)f
+(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)41 b Fb(37)150 4102 y
+Fd(rl_callback_handler_remove)17 b Fa(.)h(.)12 b(.)h(.)f(.)g(.)h(.)f(.)
+g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)42 b Fb(38)150 4190 y
+Fd(rl_callback_read_char)29 b Fa(.)12 b(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f
+(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)50 b Fb(38)150
+4279 y Fd(rl_catch_signals)13 b Fa(.)j(.)d(.)f(.)g(.)h(.)f(.)g(.)g(.)h
+(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)
+39 b Fb(40)150 4367 y Fd(rl_catch_sigwinch)12 b Fa(.)k(.)c(.)h(.)f(.)g
+(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)
+f(.)g(.)h(.)37 b Fb(40)150 4456 y Fd(rl_char_is_quoted_p)9
+b Fa(.)17 b(.)12 b(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f
+(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)34 b Fb(44)150 4544
+y Fd(rl_cleanup_after_signal)26 b Fa(.)13 b(.)f(.)g(.)h(.)f(.)g(.)h(.)f
+(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)47 b Fb(40)150
+4632 y Fd(rl_clear_message)13 b Fa(.)j(.)d(.)f(.)g(.)h(.)f(.)g(.)g(.)h
+(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)
+39 b Fb(33)150 4721 y Fd(rl_clear_pending_input)28 b
+Fa(.)12 b(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f
+(.)g(.)h(.)f(.)48 b Fb(35)150 4809 y Fd(rl_clear_signals)13
+b Fa(.)j(.)d(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)
+g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)39 b Fb(41)150
+4898 y Fd(rl_complete)13 b Fa(.)i(.)d(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f
+(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)
+h(.)39 b Fb(42,)26 b(43)150 4986 y Fd(rl_complete_internal)7
+b Fa(.)17 b(.)c(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g
+(.)g(.)h(.)f(.)g(.)h(.)f(.)33 b Fb(42)150 5075 y Fd
+(rl_completer_quote_characters)14 b Fa(.)j(.)c(.)f(.)g(.)h(.)f(.)g(.)h
+(.)f(.)g(.)h(.)f(.)38 b Fb(45)150 5163 y Fd
+(rl_completer_word_break_chara)q(cter)q(s)29 b Fa(.)12
+b(.)h(.)f(.)g(.)h(.)f(.)49 b Fb(45)150 5252 y Fd
+(rl_completion_append_characte)q(r)11 b Fa(.)18 b(.)13
+b(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)37 b Fb(46)150
+5340 y Fd(rl_completion_display_matches)q(_hoo)q(k)29
+b Fa(.)12 b(.)h(.)f(.)g(.)h(.)f(.)49 b Fb(45)2025 299
+y Fd(rl_completion_entry_function)7 b Fa(.)18 b(.)12
+b(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)32 b Fb(42,)27 b(43)2025
+387 y Fd(rl_completion_found_quote)18 b Fa(.)g(.)12 b(.)h(.)f(.)g(.)h
+(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)44 b Fb(46)2025
+476 y Fd(rl_completion_mark_symlink_dir)q(s)10 b Fa(.)18
+b(.)12 b(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)35 b Fb(46)2025
+564 y Fd(rl_completion_matches)29 b Fa(.)12 b(.)g(.)h(.)f(.)g(.)h(.)f
+(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)50
+b Fb(43)2025 653 y Fd(rl_completion_mode)10 b Fa(.)17
+b(.)12 b(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)
+f(.)g(.)h(.)f(.)g(.)h(.)f(.)36 b Fb(43)2025 741 y Fd
+(rl_completion_query_items)18 b Fa(.)g(.)12 b(.)h(.)f(.)g(.)h(.)f(.)g
+(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)44 b Fb(46)2025 830
+y Fd(rl_completion_quote_character)13 b Fa(.)18 b(.)13
+b(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)38 b Fb(46)2025
+918 y Fd(rl_completion_suppress_append)13 b Fa(.)18 b(.)13
+b(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)38 b Fb(46)2025
+1006 y Fd(rl_completion_suppress_quote)15 b Fa(.)i(.)c(.)f(.)g(.)h(.)f
+(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)40 b Fb(46)2025 1095 y
+Fd(rl_completion_type)10 b Fa(.)17 b(.)12 b(.)g(.)g(.)h(.)f(.)g(.)h(.)f
+(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)36
+b Fb(47)2025 1183 y Fd(rl_completion_word_break_hook)13
+b Fa(.)18 b(.)13 b(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)38
+b Fb(45)2025 1272 y Fd(rl_copy_keymap)16 b Fa(.)f(.)e(.)f(.)g(.)h(.)f
+(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)
+f(.)g(.)g(.)h(.)f(.)42 b Fb(28)2025 1360 y Fd(rl_copy_text)22
+b Fa(.)12 b(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h
+(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)45
+b Fb(34)2025 1449 y Fd(rl_crlf)8 b Fa(.)14 b(.)e(.)g(.)h(.)f(.)g(.)h(.)
+f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h
+(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)34 b Fb(33)2025
+1537 y Fd(rl_delete_text)16 b Fa(.)f(.)e(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)
+g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h
+(.)f(.)42 b Fb(34)2025 1625 y Fd(rl_deprep_term_function)26
+b Fa(.)13 b(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g
+(.)h(.)f(.)47 b Fb(26)2025 1714 y Fd(rl_deprep_terminal)10
+b Fa(.)17 b(.)12 b(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f
+(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)36 b Fb(35)2025
+1802 y Fd(rl_ding)8 b Fa(.)14 b(.)e(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f
+(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)
+f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)34 b Fb(36)2025 1891
+y Fd(rl_directory_completion_hook)15 b Fa(.)i(.)c(.)f(.)g(.)h(.)f(.)g
+(.)h(.)f(.)g(.)h(.)f(.)g(.)40 b Fb(44)2025 1979 y Fd(rl_discard_keymap)
+12 b Fa(.)k(.)c(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h
+(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)38 b Fb(29)2025
+2068 y Fd(rl_dispatching)16 b Fa(.)f(.)e(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)
+g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h
+(.)f(.)42 b Fb(24)2025 2156 y Fd(rl_display_match_list)29
+b Fa(.)12 b(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f
+(.)g(.)g(.)h(.)f(.)50 b Fb(36)2025 2245 y Fd(rl_do_undo)24
+b Fa(.)12 b(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g
+(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)48
+b Fb(32)2025 2333 y Fd(rl_done)8 b Fa(.)14 b(.)e(.)g(.)h(.)f(.)g(.)h(.)
+f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h
+(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)34 b Fb(24)2025
+2421 y Fd(rl_editing_mode)15 b Fa(.)g(.)e(.)f(.)g(.)g(.)h(.)f(.)g(.)h
+(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)
+h(.)40 b Fb(28)2025 2510 y Fd(rl_end)10 b Fa(.)j(.)f(.)h(.)f(.)g(.)h(.)
+f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g
+(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)35
+b Fb(24)2025 2598 y Fd(rl_end_undo_group)12 b Fa(.)k(.)c(.)g(.)h(.)f(.)
+g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f
+(.)g(.)g(.)38 b Fb(32)2025 2687 y Fd(rl_erase_empty_line)9
+b Fa(.)16 b(.)d(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f
+(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)35 b Fb(24)2025 2775 y
+Fd(rl_event_hook)18 b Fa(.)d(.)d(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)
+g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h
+(.)43 b Fb(26)2025 2864 y Fd(rl_execute_next)15 b Fa(.)g(.)e(.)f(.)g(.)
+g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f
+(.)g(.)h(.)f(.)g(.)h(.)40 b Fb(35)2025 2952 y Fd(rl_executing_keymap)9
+b Fa(.)16 b(.)d(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f
+(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)35 b Fb(26)2025 3041 y
+Fd(rl_executing_macro)10 b Fa(.)17 b(.)12 b(.)g(.)g(.)h(.)f(.)g(.)h(.)f
+(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)36
+b Fb(26)2025 3129 y Fd(rl_expand_prompt)13 b Fa(.)j(.)c(.)h(.)f(.)g(.)h
+(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)
+g(.)h(.)f(.)39 b Fb(34)2025 3217 y Fd(rl_explicit_arg)15
+b Fa(.)g(.)e(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)
+g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)40 b Fb(28)2025
+3306 y Fd(rl_extend_line_buffer)29 b Fa(.)12 b(.)g(.)h(.)f(.)g(.)h(.)f
+(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)50
+b Fb(36)2025 3394 y Fd(rl_filename_completion_desired)12
+b Fa(.)18 b(.)12 b(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)37
+b Fb(46)2025 3483 y Fd(rl_filename_completion_functio)q(n)10
+b Fa(.)18 b(.)12 b(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)35
+b Fb(43)2025 3571 y Fd(rl_filename_dequoting_function)12
+b Fa(.)18 b(.)12 b(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)37
+b Fb(44)2025 3660 y Fd(rl_filename_quote_characters)15
+b Fa(.)i(.)c(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)40
+b Fb(45)2025 3748 y Fd(rl_filename_quoting_desired)16
+b Fa(.)i(.)12 b(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)41
+b Fb(47)2025 3836 y Fd(rl_filename_quoting_function)15
+b Fa(.)i(.)c(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)40
+b Fb(44)2025 3925 y Fd(rl_forced_update_display)25 b
+Fa(.)12 b(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g
+(.)g(.)46 b Fb(33)2025 4013 y Fd(rl_free_line_state)10
+b Fa(.)17 b(.)12 b(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f
+(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)36 b Fb(40)2025
+4102 y Fd(rl_free_undo_list)12 b Fa(.)k(.)c(.)g(.)h(.)f(.)g(.)h(.)f(.)g
+(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)38
+b Fb(32)2025 4190 y Fd(rl_function_dumper)10 b Fa(.)17
+b(.)12 b(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)
+f(.)g(.)h(.)f(.)g(.)h(.)f(.)36 b Fb(31)2025 4279 y Fd
+(rl_function_of_keyseq)29 b Fa(.)12 b(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h
+(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)50 b Fb(31)2025
+4367 y Fd(rl_funmap_names)15 b Fa(.)g(.)e(.)f(.)g(.)g(.)h(.)f(.)g(.)h
+(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)
+h(.)40 b Fb(31)2025 4456 y Fd(rl_generic_bind)15 b Fa(.)g(.)e(.)f(.)g
+(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)
+f(.)g(.)h(.)f(.)g(.)h(.)40 b Fb(30)2025 4544 y Fd(rl_get_keymap)18
+b Fa(.)d(.)d(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)
+h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)43
+b Fb(29)2025 4632 y Fd(rl_get_keymap_by_name)29 b Fa(.)12
+b(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g
+(.)h(.)f(.)50 b Fb(29)2025 4721 y Fd(rl_get_keymap_name)10
+b Fa(.)17 b(.)12 b(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f
+(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)36 b Fb(29)2025
+4809 y Fd(rl_get_screen_size)10 b Fa(.)17 b(.)12 b(.)g(.)g(.)h(.)f(.)g
+(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)
+36 b Fb(41)2025 4898 y Fd(rl_get_termcap)16 b Fa(.)f(.)e(.)f(.)g(.)h(.)
+f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h
+(.)f(.)g(.)g(.)h(.)f(.)42 b Fb(37)2025 4986 y Fd(rl_getc)8
+b Fa(.)14 b(.)e(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h
+(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)
+g(.)h(.)f(.)34 b Fb(34)2025 5075 y Fd(rl_getc_function)13
+b Fa(.)j(.)c(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)
+f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)39 b Fb(26)2025
+5163 y Fd(rl_gnu_readline_p)12 b Fa(.)k(.)c(.)g(.)h(.)f(.)g(.)h(.)f(.)g
+(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)38
+b Fb(25)2025 5252 y Fd(rl_ignore_completion_duplicate)q(s)10
+b Fa(.)18 b(.)12 b(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)35
+b Fb(46)2025 5340 y Fd(rl_ignore_some_completions_fun)q(ction)29
+b Fa(.)12 b(.)g(.)h(.)f(.)g(.)48 b Fb(44)p eop end
+%%Page: 69 73
+TeXDict begin 69 72 bop 150 -116 a Ft(F)-8 b(unction)31
+b(and)f(V)-8 b(ariable)32 b(Index)2370 b(69)150 299 y
+Fd(rl_inhibit_completion)29 b Fa(.)12 b(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f
+(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)50 b Fb(47)150
+387 y Fd(rl_initialize)18 b Fa(.)d(.)d(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h
+(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)
+h(.)f(.)43 b Fb(36)150 476 y Fd(rl_insert_completions)29
+b Fa(.)12 b(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f
+(.)g(.)h(.)f(.)g(.)50 b Fb(43)150 564 y Fd(rl_insert_text)16
+b Fa(.)g(.)c(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)
+h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)42 b
+Fb(34)150 652 y Fd(rl_instream)23 b Fa(.)12 b(.)h(.)f(.)g(.)h(.)f(.)g
+(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)
+f(.)g(.)h(.)f(.)g(.)h(.)f(.)46 b Fb(25)150 740 y Fd
+(rl_invoking_keyseqs)9 b Fa(.)17 b(.)12 b(.)g(.)h(.)f(.)g(.)g(.)h(.)f
+(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)34
+b Fb(31)150 829 y Fd(rl_invoking_keyseqs_in_map)17 b
+Fa(.)h(.)12 b(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)42
+b Fb(31)150 917 y Fd(rl_kill_text)22 b Fa(.)12 b(.)g(.)h(.)f(.)g(.)h(.)
+f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h
+(.)f(.)g(.)g(.)h(.)f(.)g(.)45 b Fb(34)150 1005 y Fd(rl_last_func)22
+b Fa(.)12 b(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f
+(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)45
+b Fb(25)150 1094 y Fd(rl_library_version)10 b Fa(.)17
+b(.)12 b(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)
+g(.)h(.)f(.)g(.)h(.)f(.)g(.)36 b Fb(25)150 1182 y Fd(rl_line_buffer)16
+b Fa(.)g(.)c(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)
+h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)42 b
+Fb(24)150 1270 y Fd(rl_list_funmap_names)7 b Fa(.)17
+b(.)c(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h
+(.)f(.)g(.)h(.)f(.)33 b Fb(31)150 1359 y Fd(rl_macro_bind)18
+b Fa(.)d(.)d(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)
+f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)43
+b Fb(37)150 1447 y Fd(rl_macro_dumper)15 b Fa(.)g(.)e(.)f(.)g(.)h(.)f
+(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)
+f(.)g(.)g(.)h(.)40 b Fb(37)150 1535 y Fd(rl_make_bare_keymap)9
+b Fa(.)17 b(.)12 b(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f
+(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)34 b Fb(28)150 1624
+y Fd(rl_make_keymap)16 b Fa(.)g(.)c(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f
+(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)
+42 b Fb(29)150 1712 y Fd(rl_mark)8 b Fa(.)14 b(.)e(.)h(.)f(.)g(.)h(.)f
+(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)
+h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)34 b
+Fb(24)150 1800 y Fd(rl_message)24 b Fa(.)13 b(.)f(.)g(.)h(.)f(.)g(.)g
+(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)
+g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)47 b Fb(33)150 1889 y
+Fd(rl_modifying)22 b Fa(.)12 b(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g
+(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)
+f(.)g(.)45 b Fb(32)150 1977 y Fd(rl_named_function)12
+b Fa(.)k(.)c(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)
+g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)37 b Fb(31)150 2065
+y Fd(rl_num_chars_to_read)7 b Fa(.)17 b(.)c(.)f(.)g(.)h(.)f(.)g(.)h(.)f
+(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)33
+b Fb(24)150 2154 y Fd(rl_numeric_arg)16 b Fa(.)g(.)c(.)g(.)h(.)f(.)g(.)
+h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f
+(.)g(.)h(.)f(.)g(.)42 b Fb(28)150 2242 y Fd(rl_on_new_line)16
+b Fa(.)g(.)c(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)
+h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)42 b
+Fb(33)150 2330 y Fd(rl_on_new_line_with_prompt)17 b Fa(.)h(.)12
+b(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)42
+b Fb(33)150 2419 y Fd(rl_outstream)22 b Fa(.)12 b(.)g(.)h(.)f(.)g(.)h
+(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)
+h(.)f(.)g(.)g(.)h(.)f(.)g(.)45 b Fb(25)150 2507 y Fd(rl_parse_and_bind)
+12 b Fa(.)k(.)c(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f
+(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)37 b Fb(31)150
+2595 y Fd(rl_pending_input)13 b Fa(.)j(.)d(.)f(.)g(.)h(.)f(.)g(.)g(.)h
+(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)
+39 b Fb(24)150 2684 y Fd(rl_point)7 b Fa(.)14 b(.)e(.)g(.)h(.)f(.)g(.)h
+(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)
+h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)32 b Fb(24)150
+2772 y Fd(rl_possible_completions)26 b Fa(.)13 b(.)f(.)g(.)h(.)f(.)g(.)
+h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)47 b
+Fb(43)150 2860 y Fd(rl_pre_input_hook)12 b Fa(.)k(.)c(.)h(.)f(.)g(.)h
+(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)
+g(.)h(.)37 b Fb(26)150 2948 y Fd(rl_prefer_env_winsize)29
+b Fa(.)12 b(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f
+(.)g(.)h(.)f(.)g(.)50 b Fb(25)150 3037 y Fd(rl_prep_term_function)29
+b Fa(.)12 b(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f
+(.)g(.)h(.)f(.)g(.)50 b Fb(26)150 3125 y Fd(rl_prep_terminal)13
+b Fa(.)j(.)d(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)
+g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)39 b Fb(35)150
+3213 y Fd(rl_prompt)25 b Fa(.)13 b(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h
+(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)
+g(.)h(.)f(.)g(.)h(.)f(.)49 b Fb(25)150 3302 y Fd(rl_push_macro_input)9
+b Fa(.)17 b(.)12 b(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f
+(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)34 b Fb(34)150 3390
+y Fd(rl_read_init_file)12 b Fa(.)k(.)c(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f
+(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)37
+b Fb(31)150 3478 y Fd(rl_read_key)23 b Fa(.)12 b(.)h(.)f(.)g(.)h(.)f(.)
+g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h
+(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)46 b Fb(34)150 3567 y
+Fd(rl_readline_name)13 b Fa(.)j(.)d(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g
+(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)39
+b Fb(25)150 3655 y Fd(rl_readline_state)12 b Fa(.)k(.)c(.)h(.)f(.)g(.)h
+(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)
+g(.)h(.)37 b Fb(26)150 3743 y Fd(rl_readline_version)9
+b Fa(.)17 b(.)12 b(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f
+(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)34 b Fb(25)150 3832
+y Fd(rl_redisplay)22 b Fa(.)12 b(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)
+g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h
+(.)f(.)g(.)45 b Fb(32)150 3920 y Fd(rl_redisplay_function)29
+b Fa(.)12 b(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f
+(.)g(.)h(.)f(.)g(.)50 b Fb(26)150 4008 y Fd(rl_replace_line)15
+b Fa(.)g(.)e(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)
+h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)40 b Fb(36)150
+4097 y Fd(rl_reset_after_signal)29 b Fa(.)12 b(.)h(.)f(.)g(.)h(.)f(.)g
+(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)50
+b Fb(41)150 4185 y Fd(rl_reset_line_state)9 b Fa(.)17
+b(.)12 b(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)
+f(.)g(.)h(.)f(.)g(.)h(.)34 b Fb(33)150 4273 y Fd(rl_reset_screen_size)7
+b Fa(.)17 b(.)c(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g
+(.)g(.)h(.)f(.)g(.)h(.)f(.)33 b Fb(41)150 4362 y Fd(rl_reset_terminal)
+12 b Fa(.)k(.)c(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f
+(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)37 b Fb(35)150
+4450 y Fd(rl_resize_terminal)10 b Fa(.)17 b(.)12 b(.)g(.)h(.)f(.)g(.)h
+(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)
+36 b Fb(41)150 4538 y Fd(rl_restore_prompt)12 b Fa(.)k(.)c(.)h(.)f(.)g
+(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)
+f(.)g(.)h(.)37 b Fb(33)150 4627 y Fd(rl_save_prompt)16
+b Fa(.)g(.)c(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)
+h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)42 b
+Fb(33)150 4715 y Fd(rl_set_key)24 b Fa(.)13 b(.)f(.)g(.)h(.)f(.)g(.)g
+(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)
+g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)47 b Fb(30)150 4803 y
+Fd(rl_set_keyboard_input_timeout)14 b Fa(.)j(.)c(.)f(.)g(.)h(.)f(.)g(.)
+h(.)f(.)g(.)h(.)f(.)38 b Fb(35)150 4892 y Fd(rl_set_keymap)18
+b Fa(.)d(.)d(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)
+f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)43
+b Fb(29)150 4980 y Fd(rl_set_paren_blink_timeout)17 b
+Fa(.)h(.)12 b(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)42
+b Fb(37)2025 299 y Fd(rl_set_prompt)18 b Fa(.)d(.)d(.)g(.)h(.)f(.)g(.)h
+(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)
+g(.)h(.)f(.)g(.)h(.)43 b Fb(34)2025 386 y Fd(rl_set_screen_size)10
+b Fa(.)17 b(.)12 b(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f
+(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)36 b Fb(41)2025
+473 y Fd(rl_set_signals)16 b Fa(.)f(.)e(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g
+(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)
+f(.)42 b Fb(41)2025 561 y Fd(rl_show_char)22 b Fa(.)12
+b(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g
+(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)45
+b Fb(33)2025 648 y Fd(rl_special_prefixes)9 b Fa(.)16
+b(.)d(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h
+(.)f(.)g(.)h(.)f(.)g(.)35 b Fb(45)2025 735 y Fd(rl_startup_hook)15
+b Fa(.)g(.)e(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)
+g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)40 b Fb(26)2025
+822 y Fd(rl_stuff_char)18 b Fa(.)d(.)d(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h
+(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)
+g(.)h(.)43 b Fb(35)2025 910 y Fd(rl_terminal_name)13
+b Fa(.)j(.)c(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)
+f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)39 b Fb(25)2025
+997 y Fd(rl_tty_set_default_bindings)16 b Fa(.)i(.)12
+b(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)41
+b Fb(35)2025 1084 y Fd(rl_tty_unset_default_bindings)13
+b Fa(.)18 b(.)13 b(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)38
+b Fb(35)2025 1171 y Fd(rl_unbind_command_in_map)25 b
+Fa(.)12 b(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g
+(.)g(.)46 b Fb(30)2025 1259 y Fd(rl_unbind_function_in_map)18
+b Fa(.)g(.)12 b(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f
+(.)44 b Fb(30)2025 1346 y Fd(rl_unbind_key)18 b Fa(.)d(.)d(.)g(.)h(.)f
+(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)
+h(.)f(.)g(.)h(.)f(.)g(.)h(.)43 b Fb(30)2025 1433 y Fd
+(rl_unbind_key_in_map)7 b Fa(.)17 b(.)12 b(.)h(.)f(.)g(.)h(.)f(.)g(.)h
+(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)33
+b Fb(30)2025 1520 y Fd(rl_username_completion_functio)q(n)10
+b Fa(.)18 b(.)12 b(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)35
+b Fb(43)2025 1608 y Fd(rl_variable_bind)13 b Fa(.)j(.)c(.)h(.)f(.)g(.)h
+(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)
+g(.)h(.)f(.)39 b Fb(37)2025 1695 y Fd(rl_variable_dumper)10
+b Fa(.)17 b(.)12 b(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f
+(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)36 b Fb(37)2025
+1782 y Fd(rl_variable_value)12 b Fa(.)k(.)c(.)g(.)h(.)f(.)g(.)h(.)f(.)g
+(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)38
+b Fb(37)2025 2025 y Fr(S)2025 2141 y Fd(self-insert)28
+b(\(a,)e(b,)g(A,)g(1,)g(!,)g(...)q(\))13 b Fa(.)f(.)h(.)f(.)g(.)h(.)f
+(.)g(.)h(.)f(.)g(.)h(.)38 b Fb(15)2025 2228 y Fd(set-mark)27
+b(\(C-@\))d Fa(.)13 b(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g
+(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)49
+b Fb(18)2025 2315 y(sho)n(w-all-if-am)n(biguous)22 b
+Fa(.)13 b(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h
+(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)47 b Fb(7)2025 2403
+y(sho)n(w-all-if-unmo)r(di\014ed)12 b Fa(.)h(.)f(.)h(.)f(.)g(.)h(.)f(.)
+g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)39
+b Fb(7)2025 2490 y Fd(start-kbd-macro)29 b(\(C-x)d(\(\))17
+b Fa(.)c(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)
+f(.)g(.)h(.)42 b Fb(18)2025 2731 y Fr(T)2025 2848 y Fd(tab-insert)28
+b(\(M-)2560 2845 y Fk(h)p 2585 2791 148 4 v 2585 2848
+a Fj(T)-6 b(AB)p 2585 2863 V 2728 2845 a Fk(i)2758 2848
+y Fd(\))13 b Fa(.)g(.)f(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g
+(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)39 b Fb(15)2025 2935
+y Fd(tilde-expand)28 b(\(M-~\))17 b Fa(.)d(.)e(.)g(.)h(.)f(.)g(.)h(.)f
+(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)43
+b Fb(18)2025 3022 y Fd(transpose-chars)29 b(\(C-t\))13
+b Fa(.)g(.)f(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)
+g(.)h(.)f(.)g(.)g(.)39 b Fb(15)2025 3109 y Fd(transpose-words)29
+b(\(M-t\))13 b Fa(.)g(.)f(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f
+(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)39 b Fb(15)2025 3361
+y Fr(U)2025 3477 y Fd(undo)26 b(\(C-_)h(or)f(C-x)g(C-u\))15
+b Fa(.)e(.)g(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)
+h(.)f(.)g(.)h(.)f(.)g(.)41 b Fb(18)2025 3565 y Fd(universal-argument)29
+b(\(\))13 b Fa(.)g(.)f(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g
+(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)39 b Fb(17)2025 3652 y
+Fd(unix-filename-rubout)30 b(\(\))10 b Fa(.)j(.)f(.)g(.)h(.)f(.)g(.)h
+(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)36
+b Fb(16)2025 3739 y Fd(unix-line-discard)29 b(\(C-u\))10
+b Fa(.)k(.)e(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)
+h(.)f(.)g(.)36 b Fb(16)2025 3826 y Fd(unix-word-rubout)29
+b(\(C-w\))11 b Fa(.)j(.)e(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h
+(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)37 b Fb(16)2025 3914 y
+Fd(upcase-word)28 b(\(M-u\))20 b Fa(.)12 b(.)g(.)h(.)f(.)g(.)h(.)f(.)g
+(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)
+44 b Fb(15)2025 4165 y Fr(V)2025 4282 y Fd(vi-editing-mode)29
+b(\(M-C-j\))10 b Fa(.)k(.)e(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g
+(.)h(.)f(.)g(.)h(.)f(.)g(.)36 b Fb(19)2025 4369 y(visible-stats)22
+b Fa(.)12 b(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f
+(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)
+47 b Fb(7)2025 4602 y Fr(Y)2025 4718 y Fd(yank)26 b(\(C-y\))11
+b Fa(.)i(.)g(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)
+h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)36
+b Fb(17)2025 4805 y Fd(yank-last-arg)28 b(\(M-.)f(or)f(M-_\))20
+b Fa(.)12 b(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f
+(.)45 b Fb(14)2025 4893 y Fd(yank-nth-arg)28 b(\(M-C-y\))14
+b Fa(.)g(.)f(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)
+g(.)h(.)f(.)g(.)h(.)f(.)40 b Fb(14)2025 4980 y Fd(yank-pop)27
+b(\(M-y\))d Fa(.)13 b(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g
+(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)49
+b Fb(17)p eop end
+%%Page: 70 74
+TeXDict begin 70 73 bop 150 -116 a Ft(70)2600 b(GNU)31
+b(Readline)g(Library)p eop end
+%%Trailer
+
+userdict /end-hook known{end-hook}if
+%%EOF
diff --git a/doc/readline_3.ps b/doc/readline_3.ps
new file mode 100644 (file)
index 0000000..70ce2a9
--- /dev/null
@@ -0,0 +1,1361 @@
+%!PS-Adobe-3.0
+%%Creator: groff version 1.19.1
+%%CreationDate: Thu Jul  6 09:35:44 2006
+%%DocumentNeededResources: font Times-Roman
+%%+ font Times-Bold
+%%+ font Times-Italic
+%%+ font Courier
+%%DocumentSuppliedResources: procset grops 1.19 1
+%%Pages: 14
+%%PageOrder: Ascend
+%%DocumentMedia: Default 595 842 0 () ()
+%%Orientation: Portrait
+%%EndComments
+%%BeginDefaults
+%%PageMedia: Default
+%%EndDefaults
+%%BeginProlog
+%%BeginResource: procset grops 1.19 1
+%!PS-Adobe-3.0 Resource-ProcSet
+/setpacking where{
+pop
+currentpacking
+true setpacking
+}if
+/grops 120 dict dup begin
+/SC 32 def
+/A/show load def
+/B{0 SC 3 -1 roll widthshow}bind def
+/C{0 exch ashow}bind def
+/D{0 exch 0 SC 5 2 roll awidthshow}bind def
+/E{0 rmoveto show}bind def
+/F{0 rmoveto 0 SC 3 -1 roll widthshow}bind def
+/G{0 rmoveto 0 exch ashow}bind def
+/H{0 rmoveto 0 exch 0 SC 5 2 roll awidthshow}bind def
+/I{0 exch rmoveto show}bind def
+/J{0 exch rmoveto 0 SC 3 -1 roll widthshow}bind def
+/K{0 exch rmoveto 0 exch ashow}bind def
+/L{0 exch rmoveto 0 exch 0 SC 5 2 roll awidthshow}bind def
+/M{rmoveto show}bind def
+/N{rmoveto 0 SC 3 -1 roll widthshow}bind def
+/O{rmoveto 0 exch ashow}bind def
+/P{rmoveto 0 exch 0 SC 5 2 roll awidthshow}bind def
+/Q{moveto show}bind def
+/R{moveto 0 SC 3 -1 roll widthshow}bind def
+/S{moveto 0 exch ashow}bind def
+/T{moveto 0 exch 0 SC 5 2 roll awidthshow}bind def
+/SF{
+findfont exch
+[exch dup 0 exch 0 exch neg 0 0]makefont
+dup setfont
+[exch/setfont cvx]cvx bind def
+}bind def
+/MF{
+findfont
+[5 2 roll
+0 3 1 roll
+neg 0 0]makefont
+dup setfont
+[exch/setfont cvx]cvx bind def
+}bind def
+/level0 0 def
+/RES 0 def
+/PL 0 def
+/LS 0 def
+/MANUAL{
+statusdict begin/manualfeed true store end
+}bind def
+/PLG{
+gsave newpath clippath pathbbox grestore
+exch pop add exch pop
+}bind def
+/BP{
+/level0 save def
+1 setlinecap
+1 setlinejoin
+72 RES div dup scale
+LS{
+90 rotate
+}{
+0 PL translate
+}ifelse
+1 -1 scale
+}bind def
+/EP{
+level0 restore
+showpage
+}bind def
+/DA{
+newpath arcn stroke
+}bind def
+/SN{
+transform
+.25 sub exch .25 sub exch
+round .25 add exch round .25 add exch
+itransform
+}bind def
+/DL{
+SN
+moveto
+SN
+lineto stroke
+}bind def
+/DC{
+newpath 0 360 arc closepath
+}bind def
+/TM matrix def
+/DE{
+TM currentmatrix pop
+translate scale newpath 0 0 .5 0 360 arc closepath
+TM setmatrix
+}bind def
+/RC/rcurveto load def
+/RL/rlineto load def
+/ST/stroke load def
+/MT/moveto load def
+/CL/closepath load def
+/Fr{
+setrgbcolor fill
+}bind def
+/setcmykcolor where{
+pop
+/Fk{
+setcmykcolor fill
+}bind def
+}if
+/Fg{
+setgray fill
+}bind def
+/FL/fill load def
+/LW/setlinewidth load def
+/Cr/setrgbcolor load def
+/setcmykcolor where{
+pop
+/Ck/setcmykcolor load def
+}if
+/Cg/setgray load def
+/RE{
+findfont
+dup maxlength 1 index/FontName known not{1 add}if dict begin
+{
+1 index/FID ne{def}{pop pop}ifelse
+}forall
+/Encoding exch def
+dup/FontName exch def
+currentdict end definefont pop
+}bind def
+/DEFS 0 def
+/EBEGIN{
+moveto
+DEFS begin
+}bind def
+/EEND/end load def
+/CNT 0 def
+/level1 0 def
+/PBEGIN{
+/level1 save def
+translate
+div 3 1 roll div exch scale
+neg exch neg exch translate
+0 setgray
+0 setlinecap
+1 setlinewidth
+0 setlinejoin
+10 setmiterlimit
+[]0 setdash
+/setstrokeadjust where{
+pop
+false setstrokeadjust
+}if
+/setoverprint where{
+pop
+false setoverprint
+}if
+newpath
+/CNT countdictstack def
+userdict begin
+/showpage{}def
+/setpagedevice{}def
+}bind def
+/PEND{
+clear
+countdictstack CNT sub{end}repeat
+level1 restore
+}bind def
+end def
+/setpacking where{
+pop
+setpacking
+}if
+%%EndResource
+%%EndProlog
+%%BeginSetup
+%%BeginFeature: *PageSize Default
+<< /PageSize [ 595 842 ] /ImagingBBox null >> setpagedevice
+%%EndFeature
+%%IncludeResource: font Times-Roman
+%%IncludeResource: font Times-Bold
+%%IncludeResource: font Times-Italic
+%%IncludeResource: font Courier
+grops begin/DEFS 1 dict def DEFS begin/u{.001 mul}bind def end/RES 72
+def/PL 841.89 def/LS false def/ENC0[/asciicircum/asciitilde/Scaron
+/Zcaron/scaron/zcaron/Ydieresis/trademark/quotesingle/Euro/.notdef
+/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
+/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
+/.notdef/.notdef/.notdef/space/exclam/quotedbl/numbersign/dollar/percent
+/ampersand/quoteright/parenleft/parenright/asterisk/plus/comma/hyphen
+/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon
+/semicolon/less/equal/greater/question/at/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O
+/P/Q/R/S/T/U/V/W/X/Y/Z/bracketleft/backslash/bracketright/circumflex
+/underscore/quoteleft/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y
+/z/braceleft/bar/braceright/tilde/.notdef/quotesinglbase/guillemotleft
+/guillemotright/bullet/florin/fraction/perthousand/dagger/daggerdbl
+/endash/emdash/ff/fi/fl/ffi/ffl/dotlessi/dotlessj/grave/hungarumlaut
+/dotaccent/breve/caron/ring/ogonek/quotedblleft/quotedblright/oe/lslash
+/quotedblbase/OE/Lslash/.notdef/exclamdown/cent/sterling/currency/yen
+/brokenbar/section/dieresis/copyright/ordfeminine/guilsinglleft
+/logicalnot/minus/registered/macron/degree/plusminus/twosuperior
+/threesuperior/acute/mu/paragraph/periodcentered/cedilla/onesuperior
+/ordmasculine/guilsinglright/onequarter/onehalf/threequarters
+/questiondown/Agrave/Aacute/Acircumflex/Atilde/Adieresis/Aring/AE
+/Ccedilla/Egrave/Eacute/Ecircumflex/Edieresis/Igrave/Iacute/Icircumflex
+/Idieresis/Eth/Ntilde/Ograve/Oacute/Ocircumflex/Otilde/Odieresis
+/multiply/Oslash/Ugrave/Uacute/Ucircumflex/Udieresis/Yacute/Thorn
+/germandbls/agrave/aacute/acircumflex/atilde/adieresis/aring/ae/ccedilla
+/egrave/eacute/ecircumflex/edieresis/igrave/iacute/icircumflex/idieresis
+/eth/ntilde/ograve/oacute/ocircumflex/otilde/odieresis/divide/oslash
+/ugrave/uacute/ucircumflex/udieresis/yacute/thorn/ydieresis]def
+/Courier@0 ENC0/Courier RE/Times-Italic@0 ENC0/Times-Italic RE
+/Times-Bold@0 ENC0/Times-Bold RE/Times-Roman@0 ENC0/Times-Roman RE
+%%EndSetup
+%%Page: 1 1
+%%BeginPageSetup
+BP
+%%EndPageSetup
+/F0 10/Times-Roman@0 SF 342.2(READLINE\(3\) READLINE\(3\))72 48 R/F1
+10.95/Times-Bold@0 SF -.219(NA)72 84 S(ME).219 E F0
+(readline \255 get a line from a user with editing)108 96 Q F1(SYNOPSIS)
+72 112.8 Q/F2 10/Times-Bold@0 SF(#include <stdio.h>)108 124.8 Q
+(#include <r)108 136.8 Q(eadline/r)-.18 E(eadline.h>)-.18 E(#include <r)
+108 148.8 Q(eadline/history)-.18 E(.h>)-.7 E/F3 10/Times-Italic@0 SF
+-.15(ch)108 165.6 S(ar *).15 E F2 -.18(re)108 177.6 S(adline).18 E F0
+(\()2.5 E F3(const c)A(har *pr)-.15 E(ompt)-.45 E F0(\);)A F1(COPYRIGHT)
+72 194.4 Q F0(Readline is Cop)108 206.4 Q
+(yright \251 1989\2552004 by the Free Softw)-.1 E(are F)-.1 E
+(oundation, Inc.)-.15 E F1(DESCRIPTION)72 223.2 Q F2 -.18(re)108 235.2 S
+(adline).18 E F0 .088
+(will read a line from the terminal and return it, using)2.588 F F2(pr)
+2.587 E(ompt)-.18 E F0 .087(as a prompt.)2.587 F(If)5.087 E F2(pr)2.587
+E(ompt)-.18 E F0(is)2.587 E F2(NULL)2.587 E F0(or)2.587 E .42
+(the empty string, no prompt is issued.)108 247.2 R .421
+(The line returned is allocated with)5.42 F F3(malloc)2.921 E F0 .421
+(\(3\); the caller must free it).31 F(when \214nished.)108 259.2 Q
+(The line returned has the \214nal ne)5 E(wline remo)-.25 E -.15(ve)-.15
+G(d, so only the te).15 E(xt of the line remains.)-.15 E F2 -.18(re)108
+276 S(adline).18 E F0(of)3.79 E 1.29
+(fers editing capabilities while the user is entering the line.)-.25 F
+1.289(By def)6.289 F 1.289(ault, the line editing com-)-.1 F
+(mands are similar to those of emacs.)108 288 Q 2.5(Av)5 G
+(i\255style line editing interf)-2.5 E(ace is also a)-.1 E -.25(va)-.2 G
+(ilable.).25 E .272
+(This manual page describes only the most basic use of)108 304.8 R F2
+-.18(re)2.772 G(adline).18 E F0 5.272(.M)C .272
+(uch more functionality is a)-5.272 F -.25(va)-.2 G .272(ilable; see).25
+F F3(The GNU Readline Libr)108 316.8 Q(ary)-.15 E F0(and)2.5 E F3
+(The GNU History Libr)2.5 E(ary)-.15 E F0(for additional information.)
+2.5 E F1(RETURN V)72 333.6 Q(ALUE)-1.478 E F2 -.18(re)108 345.6 S
+(adline).18 E F0 1.09(returns the te)3.59 F 1.09(xt of the line read.)
+-.15 F 3.589(Ab)6.09 G 1.089(lank line returns the empty string.)-3.589
+F(If)6.089 E F2(EOF)3.589 E F0 1.089(is encountered)3.589 F .283
+(while reading a line, and the line is empty)108 357.6 R(,)-.65 E F2
+(NULL)2.783 E F0 .283(is returned.)2.783 F .283(If an)5.283 F F2(EOF)
+2.783 E F0 .283(is read with a non\255empty line, it)2.783 F
+(is treated as a ne)108 369.6 Q(wline.)-.25 E F1(NO)72 386.4 Q -.986(TA)
+-.438 G(TION)-.054 E F0 .181
+(An emacs-style notation is used to denote k)108 398.4 R -.15(ey)-.1 G
+(strok).15 E 2.681(es. Control)-.1 F -.1(ke)2.681 G .18
+(ys are denoted by C\255)-.05 F F3 -.1(ke)C(y)-.2 E F0 2.68(,e)C .18
+(.g., C\255n means)-2.68 F 2.582(Control\255N. Similarly)108 410.4 R(,)
+-.65 E F3(meta)2.962 E F0 -.1(ke)2.842 G .082(ys are denoted by M\255)
+-.05 F F3 -.1(ke)C(y)-.2 E F0 2.583(,s)C 2.583(oM)-2.583 G .083
+(\255x means Meta\255X.)-2.583 F .083(\(On k)5.083 F -.15(ey)-.1 G .083
+(boards without a).15 F F3(meta)108 422.4 Q F0 -.1(ke)3.491 G 2.031 -.65
+(y, M)-.05 H<ad>.65 E F3(x)A F0 .731(means ESC)3.231 F F3(x)3.231 E F0
+3.231(,i)C .731(.e., press the Escape k)-3.231 F 1.03 -.15(ey t)-.1 H
+.73(hen the).15 F F3(x)4 E F0 -.1(ke)3.76 G 4.53 -.65(y. T)-.05 H .73
+(his mak).65 F .73(es ESC the)-.1 F F3 .73(meta pr)3.23 F(e\214x)-.37 E
+F0(.)A .48(The combination M\255C\255)108 434.4 R F3(x)A F0 .48
+(means ESC\255Control\255)2.98 F F3(x)A F0 2.98(,o)C 2.98(rp)-2.98 G .48
+(ress the Escape k)-2.98 F .78 -.15(ey t)-.1 H .48
+(hen hold the Control k).15 F .78 -.15(ey w)-.1 H(hile).15 E
+(pressing the)108 446.4 Q F3(x)3.27 E F0 -.1(ke)3.03 G -.65(y.)-.05 G
+(\)).65 E .62(Readline commands may be gi)108 463.2 R -.15(ve)-.25 G
+3.119(nn).15 G(umeric)-3.119 E F3(ar)3.119 E(guments)-.37 E F0 3.119(,w)
+.27 G .619(hich normally act as a repeat count.)-3.119 F(Sometimes,)
+5.619 E(ho)108 475.2 Q(we)-.25 E -.15(ve)-.25 G 1.418 -.4(r, i).15 H
+3.118(ti).4 G 3.119(st)-3.118 G .619(he sign of the ar)-3.119 F .619
+(gument that is signi\214cant.)-.18 F -.15(Pa)5.619 G .619(ssing a ne)
+.15 F -.05(ga)-.15 G(ti).05 E .919 -.15(ve a)-.25 H -.18(rg).15 G .619
+(ument to a command that).18 F 1.019(acts in the forw)108 487.2 R 1.018
+(ard direction \(e.g.,)-.1 F F2(kill\255line)3.518 E F0 3.518(\)c)C
+1.018(auses that command to act in a backw)-3.518 F 1.018
+(ard direction.)-.1 F(Com-)6.018 E(mands whose beha)108 499.2 Q
+(vior with ar)-.2 E(guments de)-.18 E(viates from this are noted.)-.25 E
+.811(When a command is described as)108 516 R F3(killing)3.311 E F0(te)
+3.311 E .811(xt, the te)-.15 F .811(xt deleted is sa)-.15 F -.15(ve)-.2
+G 3.311(df).15 G .812(or possible future retrie)-3.311 F -.25(va)-.25 G
+3.312(l\().25 G F3(yank-)-3.312 E(ing)108 528 Q F0 2.529(\). The)B .029
+(killed te)2.529 F .029(xt is sa)-.15 F -.15(ve)-.2 G 2.529(di).15 G
+2.529(na)-2.529 G F3 .029(kill ring)B F0 5.029(.C)C(onsecuti)-5.029 E
+.329 -.15(ve k)-.25 H .029(ills cause the te).15 F .029
+(xt to be accumulated into one unit,)-.15 F .567(which can be yank)108
+540 R .567(ed all at once.)-.1 F .567(Commands which do not kill te)
+5.567 F .567(xt separate the chunks of te)-.15 F .567(xt on the kill)
+-.15 F(ring.)108 552 Q F1(INITIALIZA)72 568.8 Q(TION FILE)-1.04 E F0
+.091(Readline is customized by putting commands in an initialization \
+\214le \(the)108 580.8 R F3(inputr)2.591 E(c)-.37 E F0 2.591
+(\214le\). The)2.591 F .091(name of this \214le)2.591 F 1.442(is tak)108
+592.8 R 1.443(en from the v)-.1 F 1.443(alue of the)-.25 F F2(INPUTRC)
+3.943 E F0(en)3.943 E 1.443(vironment v)-.4 F 3.943(ariable. If)-.25 F
+1.443(that v)3.943 F 1.443(ariable is unset, the def)-.25 F 1.443
+(ault is)-.1 F F3(~/.inputr)108 604.8 Q(c)-.37 E F0 5.058(.I).31 G 2.558
+(ft)-5.058 G .058(hat \214le)-2.558 F .058(does not e)5.058 F .058
+(xist or cannot be read, the ultimate def)-.15 F .058(ault is)-.1 F F3
+(/etc/inputr)2.557 E(c)-.37 E F0 5.057(.W).31 G .057(hen a program)
+-5.057 F 1.158(which uses the readline library starts up, the init \214\
+le is read, and the k)108 616.8 R 1.459 -.15(ey b)-.1 H 1.159
+(indings and v).15 F 1.159(ariables are set.)-.25 F .029
+(There are only a fe)108 628.8 R 2.529(wb)-.25 G .029
+(asic constructs allo)-2.529 F .028(wed in the readline init \214le.)
+-.25 F .028(Blank lines are ignored.)5.028 F .028(Lines be)5.028 F(gin-)
+-.15 E .553(ning with a)108 640.8 R F2(#)3.053 E F0 .554(are comments.)
+3.053 F .554(Lines be)5.554 F .554(ginning with a)-.15 F F2($)3.054 E F0
+.554(indicate conditional constructs.)3.054 F .554(Other lines denote)
+5.554 F -.1(ke)108 652.8 S 2.987(yb)-.05 G .487(indings and v)-2.987 F
+.487(ariable settings.)-.25 F .487
+(Each program using this library may add its o)5.487 F .486
+(wn commands and bind-)-.25 F(ings.)108 664.8 Q -.15(Fo)108 681.6 S 2.5
+(re).15 G(xample, placing)-2.65 E(M\255Control\255u: uni)144 698.4 Q
+-.15(ve)-.25 G(rsal\255ar).15 E(gument)-.18 E(or)108 710.4 Q
+(C\255Meta\255u: uni)144 722.4 Q -.15(ve)-.25 G(rsal\255ar).15 E(gument)
+-.18 E(GNU Readline 5.2)72 768 Q(2006 Apr 26)134.015 E(1)203.725 E 0 Cg
+EP
+%%Page: 2 2
+%%BeginPageSetup
+BP
+%%EndPageSetup
+/F0 10/Times-Roman@0 SF 342.2(READLINE\(3\) READLINE\(3\))72 48 R
+(into the)108 84 Q/F1 10/Times-Italic@0 SF(inputr)2.51 E(c)-.37 E F0 -.1
+(wo)2.81 G(uld mak).1 E 2.5(eM)-.1 G(\255C\255u e)-2.5 E -.15(xe)-.15 G
+(cute the readline command).15 E F1(univer)2.5 E(sal\255ar)-.1 E(gument)
+-.37 E F0(.).68 E 2.795(The follo)108 100.8 R 2.795
+(wing symbolic character names are recognized while processing k)-.25 F
+3.095 -.15(ey b)-.1 H(indings:).15 E F1(DEL)5.295 E F0(,).53 E F1(ESC)
+5.295 E F0(,).72 E F1(ESCAPE)108 112.8 Q F0(,).73 E F1(LFD)2.5 E F0(,)
+.28 E F1(NEWLINE)2.5 E F0(,).73 E F1(RET)2.5 E F0(,)1.27 E F1(RETURN)2.5
+E F0(,)1.1 E F1 -.4(RU)2.5 G(BOUT).4 E F0(,)1.27 E F1(SP)2.5 E -.3(AC)
+-.9 G(E).3 E F0(,).73 E F1(SPC)2.5 E F0 2.5(,a).72 G(nd)-2.5 E F1 -.5
+(TA)2.5 G(B).5 E F0(.).27 E .209
+(In addition to command names, readline allo)108 129.6 R .209(ws k)-.25
+F -.15(ey)-.1 G 2.709(st).15 G 2.709(ob)-2.709 G 2.709(eb)-2.709 G .209
+(ound to a string that is inserted when the k)-2.709 F .509 -.15(ey i)
+-.1 H(s).15 E(pressed \(a)108 141.6 Q F1(macr)2.5 E(o)-.45 E F0(\).)A/F2
+10/Times-Bold@0 SF -.25(Ke)87 163.2 S 2.5(yB).25 G(indings)-2.5 E F0
+.366(The syntax for controlling k)108 175.2 R .666 -.15(ey b)-.1 H .366
+(indings in the).15 F F1(inputr)2.876 E(c)-.37 E F0 .366
+(\214le is simple.)3.176 F .366(All that is required is the name of the)
+5.366 F .383(command or the te)108 187.2 R .383(xt of a macro and a k)
+-.15 F .683 -.15(ey s)-.1 H .383
+(equence to which it should be bound. The name may be speci-).15 F .853
+(\214ed in one of tw)108 199.2 R 3.353(ow)-.1 G .853
+(ays: as a symbolic k)-3.453 F 1.153 -.15(ey n)-.1 H .853
+(ame, possibly with).15 F F1(Meta\255)3.353 E F0(or)3.353 E F1(Contr)
+3.353 E(ol\255)-.45 E F0(pre\214x)3.353 E .853(es, or as a k)-.15 F -.15
+(ey)-.1 G 2.919(sequence. The)108 211.2 R .419(name and k)2.919 F .719
+-.15(ey s)-.1 H .419(equence are separated by a colon.).15 F .419
+(There can be no whitespace between the)5.419 F(name and the colon.)108
+223.2 Q 1.755(When using the form)108 240 R F2 -.1(ke)4.255 G(yname).1 E
+F0(:)A F1(function-name).833 E F0(or)4.255 E F1(macr)4.255 E(o)-.45 E F0
+(,)A F1 -.1(ke)4.255 G(yname)-.2 E F0 1.756(is the name of a k)4.435 F
+2.056 -.15(ey s)-.1 H 1.756(pelled out in).15 F 2.5(English. F)108 252 R
+(or e)-.15 E(xample:)-.15 E(Control\255u: uni)144 276 Q -.15(ve)-.25 G
+(rsal\255ar).15 E(gument)-.18 E(Meta\255Rubout: backw)144 288 Q
+(ard\255kill\255w)-.1 E(ord)-.1 E(Control\255o: "> output")144 300 Q
+.148(In the abo)108 316.8 R .448 -.15(ve ex)-.15 H(ample,).15 E F1
+(C\255u)2.488 E F0 .148(is bound to the function)2.898 F F2(uni)2.647 E
+-.1(ve)-.1 G(rsal\255ar).1 E(gument)-.1 E F0(,)A F1(M-DEL)3.327 E F0
+.147(is bound to the function)3.177 F F2(backward\255kill\255w)108 328.8
+Q(ord)-.1 E F0 3.835(,a)C(nd)-3.835 E F1(C\255o)3.675 E F0 1.336
+(is bound to run the macro e)4.016 F 1.336
+(xpressed on the right hand side \(that is, to)-.15 F(insert the te)108
+340.8 Q(xt)-.15 E/F3 10/Courier@0 SF 6(>o)2.5 G(utput)-6 E F0
+(into the line\).)2.5 E .056(In the second form,)108 357.6 R F2("k)2.556
+E(eyseq")-.1 E F0(:)A F1(function\255name).833 E F0(or)2.556 E F1(macr)
+2.556 E(o)-.45 E F0(,)A F2 -.1(ke)2.556 G(yseq).1 E F0(dif)2.555 E .055
+(fers from)-.25 F F2 -.1(ke)2.555 G(yname).1 E F0(abo)2.555 E .355 -.15
+(ve i)-.15 H 2.555(nt).15 G .055(hat strings)-2.555 F 1.284
+(denoting an entire k)108 369.6 R 1.584 -.15(ey s)-.1 H 1.284(equence m\
+ay be speci\214ed by placing the sequence within double quotes.).15 F
+(Some)6.284 E .386(GNU Emacs style k)108 381.6 R .686 -.15(ey e)-.1 H
+.385(scapes can be used, as in the follo).15 F .385(wing e)-.25 F .385
+(xample, b)-.15 F .385(ut the symbolic character names)-.2 F
+(are not recognized.)108 393.6 Q("\\C\255u": uni)144 417.6 Q -.15(ve)
+-.25 G(rsal\255ar).15 E(gument)-.18 E
+("\\C\255x\\C\255r": re\255read\255init\255\214le)144 429.6 Q
+("\\e[11~": "Function K)144 441.6 Q .3 -.15(ey 1)-.25 H(").15 E .198
+(In this e)108 458.4 R(xample,)-.15 E F1(C-u)2.538 E F0 .199(is ag)2.949
+F .199(ain bound to the function)-.05 F F2(uni)2.699 E -.1(ve)-.1 G
+(rsal\255ar).1 E(gument)-.1 E F0(.)A F1 .199(C-x C-r)5.039 F F0 .199
+(is bound to the function)3.429 F F2 -.18(re)108 470.4 S<ad72>.18 E
+(ead\255init\255\214le)-.18 E F0 2.5(,a)C(nd)-2.5 E F1(ESC [ 1 1 ~)3.01
+E F0(is bound to insert the te)3.94 E(xt)-.15 E F3(Function Key 1)2.5 E
+F0(.)A(The full set of GNU Emacs style escape sequences a)108 487.2 Q
+-.25(va)-.2 G(ilable when specifying k).25 E .3 -.15(ey s)-.1 H
+(equences is).15 E F2<5c43ad>144 499.2 Q F0(control pre\214x)20.3 E F2
+<5c4dad>144 511.2 Q F0(meta pre\214x)18.08 E F2(\\e)144 523.2 Q F0
+(an escape character)28.78 E F2(\\\\)144 535.2 Q F0(backslash)30.44 E F2
+(\\")144 547.2 Q F0(literal ", a double quote)27.67 E F2(\\')144 559.2 Q
+F0(literal ', a single quote)29.89 E(In addition to the GNU Emacs style\
+ escape sequences, a second set of backslash escapes is a)108 576 Q -.25
+(va)-.2 G(ilable:).25 E F2(\\a)144 588 Q F0(alert \(bell\))28.22 E F2
+(\\b)144 600 Q F0(backspace)27.66 E F2(\\d)144 612 Q F0(delete)27.66 E
+F2(\\f)144 624 Q F0(form feed)29.89 E F2(\\n)144 636 Q F0(ne)27.66 E
+(wline)-.25 E F2(\\r)144 648 Q F0(carriage return)28.78 E F2(\\t)144 660
+Q F0(horizontal tab)29.89 E F2(\\v)144 672 Q F0 -.15(ve)28.22 G
+(rtical tab).15 E F2(\\)144 684 Q F1(nnn)A F0
+(the eight-bit character whose v)18.22 E(alue is the octal v)-.25 E
+(alue)-.25 E F1(nnn)2.5 E F0(\(one to three digits\))2.5 E F2(\\x)144
+696 Q F1(HH)A F0(the eight-bit character whose v)13.78 E(alue is the he)
+-.25 E(xadecimal v)-.15 E(alue)-.25 E F1(HH)2.5 E F0(\(one or tw)2.5 E
+2.5(oh)-.1 G .3 -.15(ex d)-2.5 H(igits\)).15 E .74(When entering the te)
+108 712.8 R .74(xt of a macro, single or double quotes should be used t\
+o indicate a macro de\214nition.)-.15 F .089(Unquoted te)108 724.8 R
+.089(xt is assumed to be a function name.)-.15 F .09(In the macro body)
+5.089 F 2.59(,t)-.65 G .09(he backslash escapes described abo)-2.59 F
+-.15(ve)-.15 G(GNU Readline 5.2)72 768 Q(2006 Apr 26)134.015 E(2)203.725
+E 0 Cg EP
+%%Page: 3 3
+%%BeginPageSetup
+BP
+%%EndPageSetup
+/F0 10/Times-Roman@0 SF 342.2(READLINE\(3\) READLINE\(3\))72 48 R(are e)
+108 84 Q 2.5(xpanded. Backslash)-.15 F(will quote an)2.5 E 2.5(yo)-.15 G
+(ther character in the macro te)-2.5 E(xt, including " and '.)-.15 E/F1
+10/Times-Bold@0 SF(Bash)108 100.8 Q F0(allo)2.93 E .43
+(ws the current readline k)-.25 F .73 -.15(ey b)-.1 H .429
+(indings to be displayed or modi\214ed with the).15 F F1(bind)2.929 E F0
+-.2(bu)2.929 G .429(iltin command.).2 F 1.095
+(The editing mode may be switched during interacti)108 112.8 R 1.395
+-.15(ve u)-.25 H 1.095(se by using the).15 F F1<ad6f>3.595 E F0 1.095
+(option to the)3.595 F F1(set)3.595 E F0 -.2(bu)3.595 G 1.095
+(iltin com-).2 F 3.076(mand. Other)108 124.8 R .576
+(programs using this library pro)3.076 F .575(vide similar mechanisms.)
+-.15 F(The)5.575 E/F2 10/Times-Italic@0 SF(inputr)3.085 E(c)-.37 E F0
+.575(\214le may be edited and)3.385 F(re-read if a program does not pro)
+108 136.8 Q(vide an)-.15 E 2.5(yo)-.15 G(ther means to incorporate ne)
+-2.5 E 2.5(wb)-.25 G(indings.)-2.5 E F1 -.92(Va)87 153.6 S(riables).92 E
+F0 .043(Readline has v)108 165.6 R .043
+(ariables that can be used to further customize its beha)-.25 F(vior)-.2
+E 5.043(.A)-.55 G -.25(va)-2.5 G .043(riable may be set in the).25 F F2
+(inpu-)2.554 E(tr)108 177.6 Q(c)-.37 E F0
+(\214le with a statement of the form)2.81 E F1(set)144 194.4 Q F2
+(variable\255name value)2.5 E F0 .79(Except where noted, readline v)108
+211.2 R .79(ariables can tak)-.25 F 3.29(et)-.1 G .79(he v)-3.29 F
+(alues)-.25 E F1(On)3.29 E F0(or)3.29 E F1(Off)3.29 E F0 .79
+(\(without re)3.29 F -.05(ga)-.15 G .79(rd to case\).).05 F(Unrecog-)
+5.79 E .448(nized v)108 223.2 R .448(ariable names are ignored.)-.25 F
+.448(When a v)5.448 F .448(ariable v)-.25 F .448
+(alue is read, empty or null v)-.25 F .449(alues, "on" \(case-insensi-)
+-.25 F(ti)108 235.2 Q -.15(ve)-.25 G .468(\), and "1" are equi).15 F
+-.25(va)-.25 G .468(lent to).25 F F1(On)2.968 E F0 5.468(.A)C .468
+(ll other v)-5.468 F .468(alues are equi)-.25 F -.25(va)-.25 G .468
+(lent to).25 F F1(Off)2.968 E F0 5.468(.T)C .467(he v)-5.468 F .467
+(ariables and their def)-.25 F(ault)-.1 E -.25(va)108 247.2 S(lues are:)
+.25 E F1(bell\255style \(audible\))108 264 Q F0 .01
+(Controls what happens when readline w)144 276 R .011
+(ants to ring the terminal bell.)-.1 F .011(If set to)5.011 F F1(none)
+2.511 E F0 2.511(,r)C .011(eadline ne)-2.511 F -.15(ve)-.25 G(r).15 E
+.94(rings the bell.)144 288 R .94(If set to)5.94 F F1(visible)3.44 E F0
+3.44(,r)C .94(eadline uses a visible bell if one is a)-3.44 F -.25(va)
+-.2 G 3.44(ilable. If).25 F .94(set to)3.44 F F1(audible)3.44 E F0(,)A
+(readline attempts to ring the terminal')144 300 Q 2.5(sb)-.55 G(ell.)
+-2.5 E F1(bind\255tty\255special\255chars \(On\))108 312 Q F0 .055
+(If set to)144 324 R F1(On)2.555 E F0 2.555(,r)C .056(eadline attempts \
+to bind the control characters treated specially by the k)-2.555 F
+(ernel')-.1 E 2.556(st)-.55 G(ermi-)-2.556 E(nal dri)144 336 Q -.15(ve)
+-.25 G 2.5(rt).15 G 2.5(ot)-2.5 G(heir readline equi)-2.5 E -.25(va)-.25
+G(lents.).25 E F1(comment\255begin \(`)108 348 Q(`#')-.63 E('\))-.63 E
+F0 .062(The string that is inserted in)144 360 R F1(vi)2.562 E F0 .062
+(mode when the)2.562 F F1(insert\255comment)2.562 E F0 .062
+(command is e)2.562 F -.15(xe)-.15 G 2.562(cuted. This).15 F(com-)2.562
+E(mand is bound to)144 372 Q F1(M\255#)2.5 E F0(in emacs mode and to)2.5
+E F1(#)2.5 E F0(in vi command mode.)2.5 E F1(completion\255ignor)108 384
+Q(e\255case \(Off\))-.18 E F0(If set to)144 396 Q F1(On)2.5 E F0 2.5(,r)
+C(eadline performs \214lename matching and completion in a case\255inse\
+nsiti)-2.5 E .3 -.15(ve f)-.25 H(ashion.).05 E F1
+(completion\255query\255items \(100\))108 408 Q F0 .529
+(This determines when the user is queried about vie)144 420 R .53
+(wing the number of possible completions gen-)-.25 F .561(erated by the)
+144 432 R F1(possible\255completions)3.061 E F0 3.061(command. It)3.061
+F .561(may be set to an)3.061 F 3.06(yi)-.15 G(nte)-3.06 E .56(ger v)
+-.15 F .56(alue greater than or)-.25 F .782(equal to zero.)144 444 R
+.783(If the number of possible completions is greater than or equal to \
+the v)5.782 F .783(alue of this)-.25 F -.25(va)144 456 S .237
+(riable, the user is ask).25 F .237(ed whether or not he wishes to vie)
+-.1 F 2.737(wt)-.25 G .237(hem; otherwise the)-2.737 F 2.737(ya)-.15 G
+.237(re simply listed)-2.737 F(on the terminal.)144 468 Q 2.5(An)5 G
+-2.25 -.15(eg a)-2.5 H(ti).15 E .3 -.15(ve v)-.25 H
+(alue causes readline to ne)-.1 E -.15(ve)-.25 G 2.5(ra).15 G(sk.)-2.5 E
+F1(con)108 480 Q -.1(ve)-.4 G(rt\255meta \(On\)).1 E F0 .612(If set to)
+144 492 R F1(On)3.112 E F0 3.112(,r)C .613(eadline will con)-3.112 F
+-.15(ve)-.4 G .613(rt characters with the eighth bit set to an ASCII k)
+.15 F .913 -.15(ey s)-.1 H .613(equence by).15 F 1.316(stripping the ei\
+ghth bit and pre\214xing it with an escape character \(in ef)144 504 R
+1.315(fect, using escape as the)-.25 F F2(meta pr)144 516 Q(e\214x)-.37
+E F0(\).)A F1(disable\255completion \(Off\))108 528 Q F0 .038(If set to)
+144 540 R F1(On)2.538 E F0 2.538(,r)C .038(eadline will inhibit w)-2.538
+F .038(ord completion.)-.1 F .038
+(Completion characters will be inserted into the)5.038 F(line as if the)
+144 552 Q 2.5(yh)-.15 G(ad been mapped to)-2.5 E F1(self-insert)2.5 E F0
+(.)A F1(editing\255mode \(emacs\))108 564 Q F0 .216
+(Controls whether readline be)144 576 R .215(gins with a set of k)-.15 F
+.515 -.15(ey b)-.1 H .215(indings similar to emacs or vi.).15 F F1
+(editing\255mode)5.215 E F0(can be set to either)144 588 Q F1(emacs)2.5
+E F0(or)2.5 E F1(vi)2.5 E F0(.)A F1(enable\255k)108 600 Q(eypad \(Off\))
+-.1 E F0 .892(When set to)144 612 R F1(On)3.393 E F0 3.393(,r)C .893
+(eadline will try to enable the application k)-3.393 F -.15(ey)-.1 G
+.893(pad when it is called.).15 F .893(Some sys-)5.893 F
+(tems need this to enable the arro)144 624 Q 2.5(wk)-.25 G -.15(ey)-2.6
+G(s.).15 E F1(expand\255tilde \(Off\))108 636 Q F0(If set to)144 648 Q
+F1(on)2.5 E F0 2.5(,t)C(ilde e)-2.5 E
+(xpansion is performed when readline attempts w)-.15 E(ord completion.)
+-.1 E F1(history\255pr)108 660 Q(eser)-.18 E -.1(ve)-.1 G
+(\255point \(Off\)).1 E F0 1.493(If set to)144 672 R F1(on)3.993 E F0
+3.993(,t)C 1.493(he history code attempts to place point at the same lo\
+cation on each history line)-3.993 F(retrie)144 684 Q -.15(ve)-.25 G 2.5
+(dw).15 G(ith)-2.5 E F1(pr)2.5 E -.15(ev)-.18 G(ious-history).15 E F0
+(or)2.5 E F1(next-history)2.5 E F0(.)A F1(horizontal\255scr)108 696 Q
+(oll\255mode \(Off\))-.18 E F0 .448(When set to)144 708 R F1(On)2.948 E
+F0 2.948(,m)C(ak)-2.948 E .448
+(es readline use a single line for display)-.1 F 2.948(,s)-.65 G .449
+(crolling the input horizontally on a)-2.948 F 1.194(single screen line\
+ when it becomes longer than the screen width rather than wrapping to a\
+ ne)144 720 R(w)-.25 E(GNU Readline 5.2)72 768 Q(2006 Apr 26)134.015 E
+(3)203.725 E 0 Cg EP
+%%Page: 4 4
+%%BeginPageSetup
+BP
+%%EndPageSetup
+/F0 10/Times-Roman@0 SF 342.2(READLINE\(3\) READLINE\(3\))72 48 R(line.)
+144 84 Q/F1 10/Times-Bold@0 SF(input\255meta \(Off\))108 96 Q F0 .367
+(If set to)144 108 R F1(On)2.867 E F0 2.867(,r)C .367(eadline will enab\
+le eight-bit input \(that is, it will not clear the eighth bit in the c\
+har)-2.867 F(-)-.2 E .957(acters it reads\), re)144 120 R -.05(ga)-.15 G
+.956(rdless of what the terminal claims it can support.).05 F .956
+(The name)5.956 F F1(meta\255\215ag)3.456 E F0 .956(is a)3.456 F(synon)
+144 132 Q(ym for this v)-.15 E(ariable.)-.25 E F1(isear)108 144 Q
+(ch\255terminators \(`)-.18 E(`C\255[ C\255J')-.63 E('\))-.63 E F0 .439
+(The string of characters that should terminate an incremental search w\
+ithout subsequently e)144 156 R -.15(xe)-.15 G(cut-).15 E .935
+(ing the character as a command.)144 168 R .935(If this v)5.935 F .935
+(ariable has not been gi)-.25 F -.15(ve)-.25 G 3.434(nav).15 G .934
+(alue, the characters)-3.684 F/F2 10/Times-Italic@0 SF(ESC)3.434 E F0
+(and)144 180 Q F2(C\255J)2.5 E F0(will terminate an incremental search.)
+2.5 E F1 -.1(ke)108 192 S(ymap \(emacs\)).1 E F0 2.323
+(Set the current readline k)144 204 R -.15(ey)-.1 G 4.823(map. The).15 F
+2.323(set of le)4.823 F -.05(ga)-.15 G 4.823(lk).05 G -.15(ey)-4.923 G
+2.323(map names is).15 F F2 2.324(emacs, emacs-standar)4.823 F(d,)-.37 E
+.809(emacs-meta, emacs-ctlx, vi, vi-mo)144 216 R(ve)-.1 E 3.308(,v)-.1 G
+(i-command)-3.308 E F0 3.308(,a)C(nd)-3.308 E F2(vi-insert)3.308 E F0(.)
+.68 E F2(vi)5.808 E F0 .808(is equi)3.308 F -.25(va)-.25 G .808(lent to)
+.25 F F2(vi-command)3.308 E F0(;)A F2(emacs)144 228 Q F0 .697(is equi)
+3.196 F -.25(va)-.25 G .697(lent to).25 F F2(emacs-standar)3.197 E(d)
+-.37 E F0 5.697(.T)C .697(he def)-5.697 F .697(ault v)-.1 F .697
+(alue is)-.25 F F2(emacs)3.197 E F0 5.697(.T).27 G .697(he v)-5.697 F
+.697(alue of)-.25 F F1(editing\255mode)3.197 E F0(also af)144 240 Q
+(fects the def)-.25 E(ault k)-.1 E -.15(ey)-.1 G(map.).15 E F1
+(mark\255dir)108 252 Q(ectories \(On\))-.18 E F0(If set to)144 264 Q F1
+(On)2.5 E F0 2.5(,c)C(ompleted directory names ha)-2.5 E .3 -.15(ve a s)
+-.2 H(lash appended.).15 E F1(mark\255modi\214ed\255lines \(Off\))108
+276 Q F0(If set to)144 288 Q F1(On)2.5 E F0 2.5(,h)C
+(istory lines that ha)-2.5 E .3 -.15(ve b)-.2 H
+(een modi\214ed are displayed with a preceding asterisk \().15 E F1(*)A
+F0(\).)A F1(mark\255symlink)108 300 Q(ed\255dir)-.1 E(ectories \(Off\))
+-.18 E F0 .175(If set to)144 312 R F1(On)2.675 E F0 2.675(,c)C .175
+(ompleted names which are symbolic links to directories ha)-2.675 F .475
+-.15(ve a s)-.2 H .175(lash appended \(sub-).15 F(ject to the v)144 324
+Q(alue of)-.25 E F1(mark\255dir)2.5 E(ectories)-.18 E F0(\).)A F1
+(match\255hidden\255\214les \(On\))108 336 Q F0 .192(This v)144 348 R
+.192(ariable, when set to)-.25 F F1(On)2.692 E F0 2.692(,c)C .192
+(auses readline to match \214les whose names be)-2.692 F .193
+(gin with a `.)-.15 F 2.693('\()-.7 G(hidden)-2.693 E 1.024
+(\214les\) when performing \214lename completion, unless the leading `.)
+144 360 R 3.523('i)-.7 G 3.523(ss)-3.523 G 1.023
+(upplied by the user in the)-3.523 F(\214lename to be completed.)144 372
+Q F1(output\255meta \(Off\))108 384 Q F0 .506(If set to)144 396 R F1(On)
+3.006 E F0 3.006(,r)C .507(eadline will display characters with the eig\
+hth bit set directly rather than as a meta-)-3.006 F(pre\214x)144 408 Q
+(ed escape sequence.)-.15 E F1(page\255completions \(On\))108 420 Q F0
+.809(If set to)144 432 R F1(On)3.308 E F0 3.308(,r)C .808
+(eadline uses an internal)-3.308 F F2(mor)3.308 E(e)-.37 E F0(-lik)A
+3.308(ep)-.1 G .808(ager to display a screenful of possible comple-)
+-3.308 F(tions at a time.)144 444 Q F1
+(print\255completions\255horizontally \(Off\))108 456 Q F0 1.318
+(If set to)144 468 R F1(On)3.818 E F0 3.818(,r)C 1.319(eadline will dis\
+play completions with matches sorted horizontally in alphabetical)-3.818
+F(order)144 480 Q 2.5(,r)-.4 G(ather than do)-2.5 E(wn the screen.)-.25
+E F1(sho)108 492 Q(w\255all\255if\255ambiguous \(Off\))-.1 E F0 .478
+(This alters the def)144 504 R .478(ault beha)-.1 F .478
+(vior of the completion functions.)-.2 F .477(If set to)5.477 F F1(on)
+2.977 E F0 2.977(,w)C .477(ords which ha)-3.077 F .777 -.15(ve m)-.2 H
+(ore).15 E 1.264(than one possible completion cause the matches to be l\
+isted immediately instead of ringing the)144 516 R(bell.)144 528 Q F1
+(sho)108 540 Q(w\255all\255if\255unmodi\214ed \(Off\))-.1 E F0 5.346
+(This alters the def)144 552 R 5.346(ault beha)-.1 F 5.345
+(vior of the completion functions in a f)-.2 F 5.345(ashion similar to)
+-.1 F F1(sho)144 564 Q(w\255all\255if\255ambiguous)-.1 E F0 6.922(.I)C
+4.422(fs)-6.922 G 1.922(et to)-4.422 F F1(on)4.422 E F0 4.422(,w)C 1.922
+(ords which ha)-4.522 F 2.223 -.15(ve m)-.2 H 1.923
+(ore than one possible completion).15 F 1.04(without an)144 576 R 3.54
+(yp)-.15 G 1.039
+(ossible partial completion \(the possible completions don')-3.54 F
+3.539(ts)-.18 G 1.039(hare a common pre\214x\))-3.539 F(cause the match\
+es to be listed immediately instead of ringing the bell.)144 588 Q F1
+(visible\255stats \(Off\))108 600 Q F0 .846(If set to)144 612 R F1(On)
+3.346 E F0 3.346(,ac)C .846(haracter denoting a \214le')-3.346 F 3.346
+(st)-.55 G .846(ype as reported by)-3.346 F F2(stat)3.346 E F0 .846
+(\(2\) is appended to the \214lename)B
+(when listing possible completions.)144 624 Q F1(Conditional Constructs)
+87 640.8 Q F0 .05(Readline implements a f)108 652.8 R .05(acility simil\
+ar in spirit to the conditional compilation features of the C preproces\
+sor)-.1 F .096(which allo)108 664.8 R .096(ws k)-.25 F .396 -.15(ey b)
+-.1 H .096(indings and v).15 F .096
+(ariable settings to be performed as the result of tests.)-.25 F .097
+(There are four parser)5.096 F(directi)108 676.8 Q -.15(ve)-.25 G 2.5
+(su).15 G(sed.)-2.5 E F1($if)108 693.6 Q F0(The)24.89 E F1($if)2.963 E
+F0 .463(construct allo)2.963 F .462(ws bindings to be made based on the\
+ editing mode, the terminal being used,)-.25 F .477
+(or the application using readline.)144 705.6 R .477(The te)5.477 F .477
+(xt of the test e)-.15 F .477
+(xtends to the end of the line; no characters)-.15 F
+(are required to isolate it.)144 717.6 Q(GNU Readline 5.2)72 768 Q
+(2006 Apr 26)134.015 E(4)203.725 E 0 Cg EP
+%%Page: 5 5
+%%BeginPageSetup
+BP
+%%EndPageSetup
+/F0 10/Times-Roman@0 SF 342.2(READLINE\(3\) READLINE\(3\))72 48 R/F1 10
+/Times-Bold@0 SF(mode)144 84 Q F0(The)12.67 E F1(mode=)3.712 E F0 1.212
+(form of the)3.712 F F1($if)3.711 E F0(directi)3.711 E 1.511 -.15(ve i)
+-.25 H 3.711(su).15 G 1.211
+(sed to test whether readline is in emacs or vi)-3.711 F 3.065
+(mode. This)180 96 R .565(may be used in conjunction with the)3.065 F F1
+.565(set k)3.065 F(eymap)-.1 E F0 .565(command, for instance, to)3.065 F
+.03(set bindings in the)180 108 R/F2 10/Times-Italic@0 SF(emacs-standar)
+2.529 E(d)-.37 E F0(and)2.529 E F2(emacs-ctlx)2.529 E F0 -.1(ke)2.529 G
+.029(ymaps only if readline is starting out)-.05 F(in emacs mode.)180
+120 Q F1(term)144 136.8 Q F0(The)15.46 E F1(term=)3.196 E F0 .696
+(form may be used to include terminal-speci\214c k)3.196 F .996 -.15
+(ey b)-.1 H .697(indings, perhaps to bind).15 F .654(the k)180 148.8 R
+.954 -.15(ey s)-.1 H .654(equences output by the terminal').15 F 3.154
+(sf)-.55 G .654(unction k)-3.154 F -.15(ey)-.1 G 3.154(s. The).15 F -.1
+(wo)3.154 G .654(rd on the right side of).1 F(the)180 160.8 Q F1(=)3.003
+E F0 .503(is tested ag)3.003 F .504(ainst the full name of the terminal\
+ and the portion of the terminal name)-.05 F(before the \214rst)180
+172.8 Q F1<ad>2.5 E F0 5(.T)C(his allo)-5 E(ws)-.25 E F2(sun)2.84 E F0
+(to match both)2.74 E F2(sun)2.84 E F0(and)2.74 E F2(sun\255cmd)2.5 E F0
+2.5(,f).77 G(or instance.)-2.5 E F1(application)144 189.6 Q F0(The)180
+201.6 Q F1(application)3.003 E F0 .503
+(construct is used to include application-speci\214c settings.)3.003 F
+.503(Each program)5.503 F .114(using the readline library sets the)180
+213.6 R F2 .114(application name)2.614 F F0 2.614(,a)C .114
+(nd an initialization \214le can test for a)-2.614 F .501(particular v)
+180 225.6 R 3.001(alue. This)-.25 F .501(could be used to bind k)3.001 F
+.801 -.15(ey s)-.1 H .5(equences to functions useful for a spe-).15 F
+.396(ci\214c program.)180 237.6 R -.15(Fo)5.396 G 2.896(ri).15 G .396
+(nstance, the follo)-2.896 F .396(wing command adds a k)-.25 F .696 -.15
+(ey s)-.1 H .397(equence that quotes the).15 F(current or pre)180 249.6
+Q(vious w)-.25 E(ord in Bash:)-.1 E F1($if)180 273.6 Q F0(Bash)2.5 E 2.5
+(#Q)180 285.6 S(uote the current or pre)-2.5 E(vious w)-.25 E(ord)-.1 E
+("\\C-xq": "\\eb\\"\\ef\\"")180 297.6 Q F1($endif)180 309.6 Q($endif)108
+326.4 Q F0(This command, as seen in the pre)9.33 E(vious e)-.25 E
+(xample, terminates an)-.15 E F1($if)2.5 E F0(command.)2.5 E F1($else)
+108 343.2 Q F0(Commands in this branch of the)15.45 E F1($if)2.5 E F0
+(directi)2.5 E .3 -.15(ve a)-.25 H(re e).15 E -.15(xe)-.15 G
+(cuted if the test f).15 E(ails.)-.1 E F1($include)108 360 Q F0 .357
+(This directi)144 372 R .657 -.15(ve t)-.25 H(ak).15 E .357
+(es a single \214lename as an ar)-.1 F .356
+(gument and reads commands and bindings from that)-.18 F 2.5(\214le. F)
+144 384 R(or e)-.15 E(xample, the follo)-.15 E(wing directi)-.25 E .3
+-.15(ve w)-.25 H(ould read).05 E F2(/etc/inputr)2.5 E(c)-.37 E F0(:)A F1
+($include)144 408 Q F2(/etc/inputr)5.833 E(c)-.37 E/F3 10.95
+/Times-Bold@0 SF(SEARCHING)72 424.8 Q F0 1.003(Readline pro)108 436.8 R
+1.003(vides commands for searching through the command history for line\
+s containing a speci\214ed)-.15 F 2.5(string. There)108 448.8 R(are tw)
+2.5 E 2.5(os)-.1 G(earch modes:)-2.5 E F2(incr)2.51 E(emental)-.37 E F0
+(and)3.01 E F2(non-incr)2.5 E(emental)-.37 E F0(.).51 E .698
+(Incremental searches be)108 465.6 R .698
+(gin before the user has \214nished typing the search string.)-.15 F
+.697(As each character of the)5.697 F .112
+(search string is typed, readline displays the ne)108 477.6 R .112
+(xt entry from the history matching the string typed so f)-.15 F(ar)-.1
+E 5.113(.A)-.55 G(n)-5.113 E .545
+(incremental search requires only as man)108 489.6 R 3.045(yc)-.15 G
+.544(haracters as needed to \214nd the desired history entry)-3.045 F
+5.544(.T)-.65 G 3.044(os)-6.344 G(earch)-3.044 E(backw)108 501.6 Q .18
+(ard in the history for a particular string, type)-.1 F F1(C\255r)2.681
+E F0 5.181(.T)C(yping)-5.981 E F1(C\255s)2.681 E F0 .181(searches forw)
+2.681 F .181(ard through the history)-.1 F(.)-.65 E .354
+(The characters present in the v)108 513.6 R .354(alue of the)-.25 F F1
+(isear)2.854 E(ch-terminators)-.18 E F0 -.25(va)2.854 G .354
+(riable are used to terminate an incremen-).25 F .6(tal search.)108
+525.6 R .6(If that v)5.6 F .6(ariable has not been assigned a v)-.25 F
+.6(alue the)-.25 F F2(Escape)3.1 E F0(and)3.1 E F1(C\255J)3.1 E F0 .6
+(characters will terminate an)3.1 F .123(incremental search.)108 537.6 R
+F1(C\255G)5.123 E F0 .123
+(will abort an incremental search and restore the original line.)2.623 F
+.122(When the search is)5.122 F(terminated, the history entry containin\
+g the search string becomes the current line.)108 549.6 Q 2.406 -.8
+(To \214)108 566.4 T .806
+(nd other matching entries in the history list, type).8 F F1(C\255s)
+3.306 E F0(or)3.306 E F1(C\255r)3.306 E F0 .806(as appropriate.)3.306 F
+.807(This will search back-)5.806 F -.1(wa)108 578.4 S 1.309(rd or forw)
+.1 F 1.309(ard in the history for the ne)-.1 F 1.309
+(xt line matching the search string typed so f)-.15 F(ar)-.1 E 6.309(.A)
+-.55 G 1.609 -.15(ny o)-6.309 H 1.308(ther k).15 F -.15(ey)-.1 G .317
+(sequence bound to a readline command will terminate the search and e)
+108 590.4 R -.15(xe)-.15 G .318(cute that command.).15 F -.15(Fo)5.318 G
+2.818(ri).15 G(nstance,)-2.818 E 3.481(an)108 602.4 S -.25(ew)-3.481 G
+.981(line will terminate the search and accept the line, thereby e).25 F
+-.15(xe)-.15 G .98(cuting the command from the history).15 F 3.061
+(list. A)108 614.4 R(mo)3.061 E -.15(ve)-.15 G .562
+(ment command will terminate the search, mak).15 F 3.062(et)-.1 G .562
+(he last line found the current line, and be)-3.062 F(gin)-.15 E
+(editing.)108 626.4 Q .567(Non-incremental searches read the entire sea\
+rch string before starting to search for matching history lines.)108
+643.2 R(The search string may be typed by the user or be part of the co\
+ntents of the current line.)108 655.2 Q F3(EDITING COMMANDS)72 672 Q F0
+1.391(The follo)108 684 R 1.391
+(wing is a list of the names of the commands and the def)-.25 F 1.391
+(ault k)-.1 F 1.691 -.15(ey s)-.1 H 1.391(equences to which the).15 F
+3.892(ya)-.15 G(re)-3.892 E 2.5(bound. Command)108 696 R
+(names without an accompan)2.5 E(ying k)-.15 E .3 -.15(ey s)-.1 H
+(equence are unbound by def).15 E(ault.)-.1 E .055(In the follo)108
+712.8 R .055(wing descriptions,)-.25 F F2(point)2.555 E F0 .055
+(refers to the current cursor position, and)2.555 F F2(mark)2.555 E F0
+.054(refers to a cursor position)2.554 F(sa)108 724.8 Q -.15(ve)-.2 G
+2.5(db).15 G 2.5(yt)-2.5 G(he)-2.5 E F1(set\255mark)2.5 E F0 2.5
+(command. The)2.5 F(te)2.5 E
+(xt between the point and mark is referred to as the)-.15 E F2 -.37(re)
+2.5 G(gion)-.03 E F0(.)A(GNU Readline 5.2)72 768 Q(2006 Apr 26)134.015 E
+(5)203.725 E 0 Cg EP
+%%Page: 6 6
+%%BeginPageSetup
+BP
+%%EndPageSetup
+/F0 10/Times-Roman@0 SF 342.2(READLINE\(3\) READLINE\(3\))72 48 R/F1 10
+/Times-Bold@0 SF(Commands f)87 84 Q(or Mo)-.25 E(ving)-.1 E
+(beginning\255of\255line \(C\255a\))108 96 Q F0(Mo)144 108 Q .3 -.15
+(ve t)-.15 H 2.5(ot).15 G(he start of the current line.)-2.5 E F1
+(end\255of\255line \(C\255e\))108 120 Q F0(Mo)144 132 Q .3 -.15(ve t)
+-.15 H 2.5(ot).15 G(he end of the line.)-2.5 E F1 -.25(fo)108 144 S
+(rward\255char \(C\255f\)).25 E F0(Mo)144 156 Q .3 -.15(ve f)-.15 H(orw)
+.15 E(ard a character)-.1 E(.)-.55 E F1(backward\255char \(C\255b\))108
+168 Q F0(Mo)144 180 Q .3 -.15(ve b)-.15 H(ack a character).15 E(.)-.55 E
+F1 -.25(fo)108 192 S(rward\255w).25 E(ord \(M\255f\))-.1 E F0(Mo)144 204
+Q .822 -.15(ve f)-.15 H(orw).15 E .522(ard to the end of the ne)-.1 F
+.523(xt w)-.15 F 3.023(ord. W)-.1 F .523
+(ords are composed of alphanumeric characters \(let-)-.8 F
+(ters and digits\).)144 216 Q F1(backward\255w)108 228 Q(ord \(M\255b\))
+-.1 E F0(Mo)144 240 Q 1.71 -.15(ve b)-.15 H 1.41
+(ack to the start of the current or pre).15 F 1.41(vious w)-.25 F 3.91
+(ord. W)-.1 F 1.41(ords are composed of alphanumeric)-.8 F
+(characters \(letters and digits\).)144 252 Q F1(clear\255scr)108 264 Q
+(een \(C\255l\))-.18 E F0 .993(Clear the screen lea)144 276 R .993
+(ving the current line at the top of the screen.)-.2 F -.4(Wi)5.993 G
+.993(th an ar).4 F .993(gument, refresh the)-.18 F
+(current line without clearing the screen.)144 288 Q F1 -.18(re)108 300
+S(draw\255curr).18 E(ent\255line)-.18 E F0(Refresh the current line.)144
+312 Q F1(Commands f)87 328.8 Q(or Manipulating the History)-.25 E
+(accept\255line \(Newline, Retur)108 340.8 Q(n\))-.15 E F0 .365
+(Accept the line re)144 352.8 R -.05(ga)-.15 G .364
+(rdless of where the cursor is.).05 F .364(If this line is non-empty)
+5.364 F 2.864(,i)-.65 G 2.864(tm)-2.864 G .364(ay be added to the)-2.864
+F .74(history list for future recall with)144 364.8 R F1
+(add_history\(\))3.24 E F0 5.741(.I)C 3.241(ft)-5.741 G .741
+(he line is a modi\214ed history line, the history)-3.241 F
+(line is restored to its original state.)144 376.8 Q F1(pr)108 388.8 Q
+-.15(ev)-.18 G(ious\255history \(C\255p\)).15 E F0(Fetch the pre)144
+400.8 Q(vious command from the history list, mo)-.25 E
+(ving back in the list.)-.15 E F1(next\255history \(C\255n\))108 412.8 Q
+F0(Fetch the ne)144 424.8 Q(xt command from the history list, mo)-.15 E
+(ving forw)-.15 E(ard in the list.)-.1 E F1
+(beginning\255of\255history \(M\255<\))108 436.8 Q F0(Mo)144 448.8 Q .3
+-.15(ve t)-.15 H 2.5(ot).15 G(he \214rst line in the history)-2.5 E(.)
+-.65 E F1(end\255of\255history \(M\255>\))108 460.8 Q F0(Mo)144 472.8 Q
+.3 -.15(ve t)-.15 H 2.5(ot).15 G(he end of the input history)-2.5 E 2.5
+(,i)-.65 G(.e., the line currently being entered.)-2.5 E F1 -2.29 -.18
+(re v)108 484.8 T(erse\255sear).08 E(ch\255history \(C\255r\))-.18 E F0
+1.471(Search backw)144 496.8 R 1.471
+(ard starting at the current line and mo)-.1 F 1.47
+(ving `up' through the history as necessary)-.15 F(.)-.65 E
+(This is an incremental search.)144 508.8 Q F1 -.25(fo)108 520.8 S
+(rward\255sear).25 E(ch\255history \(C\255s\))-.18 E F0 1.131
+(Search forw)144 532.8 R 1.131(ard starting at the current line and mo)
+-.1 F 1.132(ving `do)-.15 F 1.132(wn' through the history as necessary)
+-.25 F(.)-.65 E(This is an incremental search.)144 544.8 Q F1
+(non\255incr)108 556.8 Q(emental\255r)-.18 E -2.3 -.15(ev e)-.18 H
+(rse\255sear).15 E(ch\255history \(M\255p\))-.18 E F0 .165(Search backw)
+144 568.8 R .164(ard through the history starting at the current line u\
+sing a non-incremental search for)-.1 F 2.5(as)144 580.8 S
+(tring supplied by the user)-2.5 E(.)-.55 E F1(non\255incr)108 592.8 Q
+(emental\255f)-.18 E(orward\255sear)-.25 E(ch\255history \(M\255n\))-.18
+E F0 1.353(Search forw)144 604.8 R 1.354(ard through the history using \
+a non-incremental search for a string supplied by the)-.1 F(user)144
+616.8 Q(.)-.55 E F1(history\255sear)108 628.8 Q(ch\255f)-.18 E(orward)
+-.25 E F0 .249(Search forw)144 640.8 R .249(ard through the history for\
+ the string of characters between the start of the current line)-.1 F
+(and the current cursor position \(the)144 652.8 Q/F2 10/Times-Italic@0
+SF(point)2.5 E F0 2.5(\). This)B(is a non-incremental search.)2.5 E F1
+(history\255sear)108 664.8 Q(ch\255backward)-.18 E F0 .95(Search backw)
+144 676.8 R .951(ard through the history for the string of characters b\
+etween the start of the current)-.1 F(line and the point.)144 688.8 Q
+(This is a non-incremental search.)5 E F1(yank\255nth\255ar)108 700.8 Q
+2.5(g\()-.1 G<4dad43ad7929>-2.5 E F0 .622(Insert the \214rst ar)144
+712.8 R .622(gument to the pre)-.18 F .622
+(vious command \(usually the second w)-.25 F .622(ord on the pre)-.1 F
+.622(vious line\))-.25 F .794(at point.)144 724.8 R -.4(Wi)5.794 G .794
+(th an ar).4 F(gument)-.18 E F2(n)3.294 E F0 3.294(,i).24 G .794
+(nsert the)-3.294 F F2(n)3.294 E F0 .794(th w)B .794(ord from the pre)
+-.1 F .794(vious command \(the w)-.25 F .795(ords in the)-.1 F
+(GNU Readline 5.2)72 768 Q(2006 Apr 26)134.015 E(6)203.725 E 0 Cg EP
+%%Page: 7 7
+%%BeginPageSetup
+BP
+%%EndPageSetup
+/F0 10/Times-Roman@0 SF 342.2(READLINE\(3\) READLINE\(3\))72 48 R(pre)
+144 84 Q .292(vious command be)-.25 F .292(gin with w)-.15 F .291
+(ord 0\).)-.1 F 2.791(An)5.291 G -2.25 -.15(eg a)-2.791 H(ti).15 E .591
+-.15(ve a)-.25 H -.18(rg).15 G .291(ument inserts the).18 F/F1 10
+/Times-Italic@0 SF(n)2.791 E F0 .291(th w)B .291(ord from the end of)-.1
+F .281(the pre)144 96 R .281(vious command.)-.25 F .281(Once the ar)
+5.281 F(gument)-.18 E F1(n)2.781 E F0 .281(is computed, the ar)2.781 F
+.281(gument is e)-.18 F .282(xtracted as if the "!)-.15 F F1(n)A F0(")A
+(history e)144 108 Q(xpansion had been speci\214ed.)-.15 E/F2 10
+/Times-Bold@0 SF(yank\255last\255ar)108 120 Q 2.5(g\()-.1 G -1.667
+(M\255. ,)-2.5 F -1.667(M\255_ \))2.5 F F0 1.308(Insert the last ar)144
+132 R 1.308(gument to the pre)-.18 F 1.307(vious command \(the last w)
+-.25 F 1.307(ord of the pre)-.1 F 1.307(vious history entry\).)-.25 F
+-.4(Wi)144 144 S .735(th an ar).4 F .735(gument, beha)-.18 F 1.035 -.15
+(ve ex)-.2 H .735(actly lik).15 F(e)-.1 E F2(yank\255nth\255ar)3.235 E
+(g)-.1 E F0 5.736(.S)C(uccessi)-5.736 E 1.036 -.15(ve c)-.25 H .736
+(alls to).15 F F2(yank\255last\255ar)3.236 E(g)-.1 E F0(mo)3.236 E -.15
+(ve)-.15 G .728(back through the history list, inserting the last ar)144
+156 R .728(gument of each line in turn.)-.18 F .728(The history e)5.728
+F(xpan-)-.15 E .14(sion f)144 168 R .14(acilities are used to e)-.1 F
+.14(xtract the last ar)-.15 F .14(gument, as if the "!$" history e)-.18
+F .14(xpansion had been speci-)-.15 F(\214ed.)144 180 Q F2(Commands f)87
+196.8 Q(or Changing T)-.25 E(ext)-.92 E(delete\255char \(C\255d\))108
+208.8 Q F0 .358(Delete the character at point.)144 220.8 R .358
+(If point is at the be)5.358 F .358
+(ginning of the line, there are no characters in the)-.15 F
+(line, and the last character typed w)144 232.8 Q(as not bound to)-.1 E
+F2(delete\255char)2.5 E F0 2.5(,t)C(hen return)-2.5 E/F3 9/Times-Bold@0
+SF(EOF)2.5 E/F4 9/Times-Roman@0 SF(.)A F2
+(backward\255delete\255char \(Rubout\))108 244.8 Q F0 .552
+(Delete the character behind the cursor)144 256.8 R 5.553(.W)-.55 G .553
+(hen gi)-5.553 F -.15(ve)-.25 G 3.053(nan).15 G .553(umeric ar)-3.053 F
+.553(gument, sa)-.18 F .853 -.15(ve t)-.2 H .553(he deleted te).15 F
+.553(xt on)-.15 F(the kill ring.)144 268.8 Q F2 -.25(fo)108 280.8 S
+(rward\255backward\255delete\255char).25 E F0 .474
+(Delete the character under the cursor)144 292.8 R 2.974(,u)-.4 G .474
+(nless the cursor is at the end of the line, in which case the)-2.974 F
+(character behind the cursor is deleted.)144 304.8 Q F2
+(quoted\255insert \(C\255q, C\255v\))108 316.8 Q F0 1.228(Add the ne)144
+328.8 R 1.228(xt character that you type to the line v)-.15 F 3.728
+(erbatim. This)-.15 F 1.228(is ho)3.728 F 3.729(wt)-.25 G 3.729(oi)
+-3.729 G 1.229(nsert characters lik)-3.729 F(e)-.1 E F2(C\255q)144 340.8
+Q F0 2.5(,f)C(or e)-2.5 E(xample.)-.15 E F2(tab\255insert \(M-T)108
+352.8 Q(AB\))-.9 E F0(Insert a tab character)144 364.8 Q(.)-.55 E F2
+(self\255insert \(a, b, A, 1, !, ...\))108 376.8 Q F0
+(Insert the character typed.)144 388.8 Q F2
+(transpose\255chars \(C\255t\))108 400.8 Q F0 .322
+(Drag the character before point forw)144 412.8 R .321(ard o)-.1 F -.15
+(ve)-.15 G 2.821(rt).15 G .321(he character at point, mo)-2.821 F .321
+(ving point forw)-.15 F .321(ard as well.)-.1 F 1.182
+(If point is at the end of the line, then this transposes the tw)144
+424.8 R 3.683(oc)-.1 G 1.183(haracters before point.)-3.683 F(Ne)6.183 E
+-.05(ga)-.15 G(ti).05 E -.15(ve)-.25 G(ar)144 436.8 Q(guments ha)-.18 E
+.3 -.15(ve n)-.2 H 2.5(oe).15 G -.25(ff)-2.5 G(ect.).25 E F2
+(transpose\255w)108 448.8 Q(ords \(M\255t\))-.1 E F0 .024(Drag the w)144
+460.8 R .024(ord before point past the w)-.1 F .023(ord after point, mo)
+-.1 F .023(ving point o)-.15 F -.15(ve)-.15 G 2.523(rt).15 G .023(hat w)
+-2.523 F .023(ord as well.)-.1 F .023(If point)5.023 F
+(is at the end of the line, this transposes the last tw)144 472.8 Q 2.5
+(ow)-.1 G(ords on the line.)-2.6 E F2(upcase\255w)108 484.8 Q
+(ord \(M\255u\))-.1 E F0 1.698(Uppercase the current \(or follo)144
+496.8 R 1.698(wing\) w)-.25 F 4.198(ord. W)-.1 F 1.698(ith a ne)-.4 F
+-.05(ga)-.15 G(ti).05 E 1.999 -.15(ve a)-.25 H -.18(rg).15 G 1.699
+(ument, uppercase the pre).18 F(vious)-.25 E -.1(wo)144 508.8 S(rd, b).1
+E(ut do not mo)-.2 E .3 -.15(ve p)-.15 H(oint.).15 E F2(do)108 520.8 Q
+(wncase\255w)-.1 E(ord \(M\255l\))-.1 E F0(Lo)144 532.8 Q 1.648
+(wercase the current \(or follo)-.25 F 1.648(wing\) w)-.25 F 4.148
+(ord. W)-.1 F 1.647(ith a ne)-.4 F -.05(ga)-.15 G(ti).05 E 1.947 -.15
+(ve a)-.25 H -.18(rg).15 G 1.647(ument, lo).18 F 1.647(wercase the pre)
+-.25 F(vious)-.25 E -.1(wo)144 544.8 S(rd, b).1 E(ut do not mo)-.2 E .3
+-.15(ve p)-.15 H(oint.).15 E F2(capitalize\255w)108 556.8 Q
+(ord \(M\255c\))-.1 E F0 1.974(Capitalize the current \(or follo)144
+568.8 R 1.974(wing\) w)-.25 F 4.474(ord. W)-.1 F 1.974(ith a ne)-.4 F
+-.05(ga)-.15 G(ti).05 E 2.274 -.15(ve a)-.25 H -.18(rg).15 G 1.975
+(ument, capitalize the pre).18 F(vious)-.25 E -.1(wo)144 580.8 S(rd, b)
+.1 E(ut do not mo)-.2 E .3 -.15(ve p)-.15 H(oint.).15 E F2 -.1(ove)108
+592.8 S(rwrite\255mode).1 E F0 -.8(To)144 604.8 S .438(ggle o).8 F -.15
+(ve)-.15 G .438(rwrite mode.).15 F -.4(Wi)5.438 G .438(th an e).4 F .438
+(xplicit positi)-.15 F .737 -.15(ve n)-.25 H .437(umeric ar).15 F .437
+(gument, switches to o)-.18 F -.15(ve)-.15 G .437(rwrite mode.).15 F -.4
+(Wi)144 616.8 S .78(th an e).4 F .781(xplicit non-positi)-.15 F 1.081
+-.15(ve n)-.25 H .781(umeric ar).15 F .781
+(gument, switches to insert mode.)-.18 F .781(This command af)5.781 F
+(fects)-.25 E(only)144 628.8 Q F2(emacs)4.395 E F0(mode;)4.395 E F2(vi)
+4.395 E F0 1.894(mode does o)4.395 F -.15(ve)-.15 G 1.894(rwrite dif).15
+F(ferently)-.25 E 6.894(.E)-.65 G 1.894(ach call to)-6.894 F F1 -.37(re)
+4.394 G(adline\(\)).37 E F0 1.894(starts in insert)4.394 F 3.968
+(mode. In)144 640.8 R -.15(ove)3.968 G 1.468
+(rwrite mode, characters bound to).15 F F2(self\255insert)3.969 E F0
+1.469(replace the te)3.969 F 1.469(xt at point rather than)-.15 F .958
+(pushing the te)144 652.8 R .958(xt to the right.)-.15 F .957
+(Characters bound to)5.958 F F2(backward\255delete\255char)3.457 E F0
+.957(replace the character)3.457 F(before point with a space.)144 664.8
+Q(By def)5 E(ault, this command is unbound.)-.1 E F2(Killing and Y)87
+681.6 Q(anking)-.85 E(kill\255line \(C\255k\))108 693.6 Q F0
+(Kill the te)144 705.6 Q(xt from point to the end of the line.)-.15 E
+(GNU Readline 5.2)72 768 Q(2006 Apr 26)134.015 E(7)203.725 E 0 Cg EP
+%%Page: 8 8
+%%BeginPageSetup
+BP
+%%EndPageSetup
+/F0 10/Times-Roman@0 SF 342.2(READLINE\(3\) READLINE\(3\))72 48 R/F1 10
+/Times-Bold@0 SF(backward\255kill\255line \(C\255x Rubout\))108 84 Q F0
+(Kill backw)144 96 Q(ard to the be)-.1 E(ginning of the line.)-.15 E F1
+(unix\255line\255discard \(C\255u\))108 108 Q F0(Kill backw)144 120 Q
+(ard from point to the be)-.1 E(ginning of the line.)-.15 E
+(The killed te)5 E(xt is sa)-.15 E -.15(ve)-.2 G 2.5(do).15 G 2.5(nt)
+-2.5 G(he kill-ring.)-2.5 E F1(kill\255whole\255line)108 132 Q F0
+(Kill all characters on the current line, no matter where point is.)144
+144 Q F1(kill\255w)108 156 Q(ord \(M\255d\))-.1 E F0 1.308
+(Kill from point the end of the current w)144 168 R 1.308
+(ord, or if between w)-.1 F 1.308(ords, to the end of the ne)-.1 F 1.308
+(xt w)-.15 F(ord.)-.1 E -.8(Wo)144 180 S
+(rd boundaries are the same as those used by).8 E F1 -.25(fo)2.5 G
+(rward\255w).25 E(ord)-.1 E F0(.)A F1(backward\255kill\255w)108 192 Q
+(ord \(M\255Rubout\))-.1 E F0(Kill the w)144 204 Q(ord behind point.)-.1
+E -.8(Wo)5 G(rd boundaries are the same as those used by).8 E F1
+(backward\255w)2.5 E(ord)-.1 E F0(.)A F1(unix\255w)108 216 Q
+(ord\255rubout \(C\255w\))-.1 E F0 .365(Kill the w)144 228 R .365
+(ord behind point, using white space as a w)-.1 F .364(ord boundary)-.1
+F 5.364(.T)-.65 G .364(he killed te)-5.364 F .364(xt is sa)-.15 F -.15
+(ve)-.2 G 2.864(do).15 G 2.864(nt)-2.864 G(he)-2.864 E(kill-ring.)144
+240 Q F1(unix\255\214lename\255rubout)108 252 Q F0 .166(Kill the w)144
+264 R .166
+(ord behind point, using white space and the slash character as the w)
+-.1 F .167(ord boundaries.)-.1 F(The)5.167 E(killed te)144 276 Q
+(xt is sa)-.15 E -.15(ve)-.2 G 2.5(do).15 G 2.5(nt)-2.5 G(he kill-ring.)
+-2.5 E F1(delete\255horizontal\255space \(M\255\\\))108 288 Q F0
+(Delete all spaces and tabs around point.)144 300 Q F1(kill\255r)108 312
+Q(egion)-.18 E F0 1.13(Kill the te)144 324 R 1.13
+(xt between the point and)-.15 F/F2 10/Times-Italic@0 SF(mark)3.63 E F0
+(\(sa)3.63 E -.15(ve)-.2 G 3.63(dc).15 G 1.13(ursor position\).)-3.63 F
+1.13(This te)6.13 F 1.13(xt is referred to as the)-.15 F F2 -.37(re)144
+336 S(gion)-.03 E F0(.)A F1(copy\255r)108 348 Q(egion\255as\255kill)-.18
+E F0(Cop)144 360 Q 2.5(yt)-.1 G(he te)-2.5 E(xt in the re)-.15 E
+(gion to the kill b)-.15 E(uf)-.2 E(fer)-.25 E(.)-.55 E F1
+(copy\255backward\255w)108 372 Q(ord)-.1 E F0(Cop)144 384 Q 4.8(yt)-.1 G
+2.3(he w)-4.8 F 2.3(ord before point to the kill b)-.1 F(uf)-.2 E(fer)
+-.25 E 7.301(.T)-.55 G 2.301(he w)-7.301 F 2.301
+(ord boundaries are the same as)-.1 F F1(back-)4.801 E(ward\255w)144 396
+Q(ord)-.1 E F0(.)A F1(copy\255f)108 408 Q(orward\255w)-.25 E(ord)-.1 E
+F0(Cop)144 420 Q 4.508(yt)-.1 G 2.008(he w)-4.508 F 2.008(ord follo)-.1
+F 2.008(wing point to the kill b)-.25 F(uf)-.2 E(fer)-.25 E 7.007(.T)
+-.55 G 2.007(he w)-7.007 F 2.007(ord boundaries are the same as)-.1 F F1
+-.25(fo)4.507 G -.37(r-).25 G(ward\255w)144 432 Q(ord)-.1 E F0(.)A F1
+(yank \(C\255y\))108 444 Q F0 -1(Ya)144 456 S
+(nk the top of the kill ring into the b)1 E(uf)-.2 E(fer at point.)-.25
+E F1(yank\255pop \(M\255y\))108 468 Q F0
+(Rotate the kill ring, and yank the ne)144 480 Q 2.5(wt)-.25 G 2.5
+(op. Only)-2.5 F -.1(wo)2.5 G(rks follo).1 E(wing)-.25 E F1(yank)2.5 E
+F0(or)2.5 E F1(yank\255pop)2.5 E F0(.)A F1(Numeric Ar)87 496.8 Q
+(guments)-.1 E(digit\255ar)108 508.8 Q
+(gument \(M\2550, M\2551, ..., M\255\255\))-.1 E F0 .641
+(Add this digit to the ar)144 520.8 R .641
+(gument already accumulating, or start a ne)-.18 F 3.141(wa)-.25 G -.18
+(rg)-3.141 G 3.142(ument. M\255\255).18 F .642(starts a ne)3.142 F(g-)
+-.15 E(ati)144 532.8 Q .3 -.15(ve a)-.25 H -.18(rg).15 G(ument.).18 E F1
+(uni)108 544.8 Q -.1(ve)-.1 G(rsal\255ar).1 E(gument)-.1 E F0 .779
+(This is another w)144 556.8 R .779(ay to specify an ar)-.1 F 3.279
+(gument. If)-.18 F .779(this command is follo)3.279 F .778
+(wed by one or more digits,)-.25 F 1.376
+(optionally with a leading minus sign, those digits de\214ne the ar)144
+568.8 R 3.876(gument. If)-.18 F 1.376(the command is fol-)3.876 F(lo)144
+580.8 Q 1.17(wed by digits, e)-.25 F -.15(xe)-.15 G(cuting).15 E F1(uni)
+3.67 E -.1(ve)-.1 G(rsal\255ar).1 E(gument)-.1 E F0(ag)3.67 E 1.17
+(ain ends the numeric ar)-.05 F 1.17(gument, b)-.18 F 1.17(ut is other)
+-.2 F(-)-.2 E .898(wise ignored.)144 592.8 R .898
+(As a special case, if this command is immediately follo)5.898 F .898
+(wed by a character that is)-.25 F .243
+(neither a digit or minus sign, the ar)144 604.8 R .243
+(gument count for the ne)-.18 F .243(xt command is multiplied by four)
+-.15 F 5.242(.T)-.55 G(he)-5.242 E(ar)144 616.8 Q .378
+(gument count is initially one, so e)-.18 F -.15(xe)-.15 G .378
+(cuting this function the \214rst time mak).15 F .378(es the ar)-.1 F
+.378(gument count)-.18 F(four)144 628.8 Q 2.5(,as)-.4 G(econd time mak)
+-2.5 E(es the ar)-.1 E(gument count sixteen, and so on.)-.18 E F1
+(Completing)87 645.6 Q(complete \(T)108 657.6 Q(AB\))-.9 E F0 1.909
+(Attempt to perform completion on the te)144 669.6 R 1.908
+(xt before point.)-.15 F 1.908(The actual completion performed is)6.908
+F(application-speci\214c.)144 681.6 Q F1(Bash)5.517 E F0 3.017(,f)C .518
+(or instance, attempts completion treating the te)-3.017 F .518
+(xt as a v)-.15 F .518(ariable \(if the)-.25 F(te)144 693.6 Q .657
+(xt be)-.15 F .657(gins with)-.15 F F1($)3.156 E F0 .656
+(\), username \(if the te)B .656(xt be)-.15 F .656(gins with)-.15 F F1
+(~)3.156 E F0 .656(\), hostname \(if the te)B .656(xt be)-.15 F .656
+(gins with)-.15 F F1(@)3.156 E F0 .656(\), or)B .929
+(command \(including aliases and functions\) in turn.)144 705.6 R .93
+(If none of these produces a match, \214lename)5.929 F 1.274
+(completion is attempted.)144 717.6 R F1(Gdb)6.273 E F0 3.773(,o)C 3.773
+(nt)-3.773 G 1.273(he other hand, allo)-3.773 F 1.273
+(ws completion of program functions and)-.25 F -.25(va)144 729.6 S(riab\
+les, and only attempts \214lename completion under certain circumstance\
+s.).25 E(GNU Readline 5.2)72 768 Q(2006 Apr 26)134.015 E(8)203.725 E 0
+Cg EP
+%%Page: 9 9
+%%BeginPageSetup
+BP
+%%EndPageSetup
+/F0 10/Times-Roman@0 SF 342.2(READLINE\(3\) READLINE\(3\))72 48 R/F1 10
+/Times-Bold@0 SF(possible\255completions \(M\255?\))108 84 Q F0
+(List the possible completions of the te)144 96 Q(xt before point.)-.15
+E F1(insert\255completions \(M\255*\))108 108 Q F0 .783
+(Insert all completions of the te)144 120 R .783(xt before point that w)
+-.15 F .783(ould ha)-.1 F 1.083 -.15(ve b)-.2 H .783(een generated by)
+.15 F F1(possible\255com-)3.283 E(pletions)144 132 Q F0(.)A F1
+(menu\255complete)108 144 Q F0 .929(Similar to)144 156 R F1(complete)
+3.429 E F0 3.429(,b)C .929(ut replaces the w)-3.629 F .929
+(ord to be completed with a single match from the list of)-.1 F 1.193
+(possible completions.)144 168 R 1.193(Repeated e)6.193 F -.15(xe)-.15 G
+1.193(cution of).15 F F1(menu\255complete)3.694 E F0 1.194
+(steps through the list of possible)3.694 F .829
+(completions, inserting each match in turn.)144 180 R .828
+(At the end of the list of completions, the bell is rung)5.828 F .727
+(\(subject to the setting of)144 192 R F1(bell\255style)3.227 E F0 3.227
+(\)a)C .727(nd the original te)-3.227 F .727(xt is restored.)-.15 F .727
+(An ar)5.727 F .727(gument of)-.18 F/F2 10/Times-Italic@0 SF(n)3.227 E
+F0(mo)3.227 E -.15(ve)-.15 G(s).15 E F2(n)3.228 E F0 1.73
+(positions forw)144 204 R 1.73(ard in the list of matches; a ne)-.1 F
+-.05(ga)-.15 G(ti).05 E 2.03 -.15(ve a)-.25 H -.18(rg).15 G 1.73
+(ument may be used to mo).18 F 2.03 -.15(ve b)-.15 H(ackw).15 E(ard)-.1
+E(through the list.)144 216 Q(This command is intended to be bound to)5
+E F1 -.9(TA)2.5 G(B).9 E F0 2.5(,b)C(ut is unbound by def)-2.7 E(ault.)
+-.1 E F1(delete\255char\255or\255list)108 228 Q F0 .373
+(Deletes the character under the cursor if not at the be)144 240 R .374
+(ginning or end of the line \(lik)-.15 F(e)-.1 E F1(delete-char)2.874 E
+F0(\).)A(If at the end of the line, beha)144 252 Q -.15(ve)-.2 G 2.5(si)
+.15 G(dentically to)-2.5 E F1(possible-completions)2.5 E F0(.)A F1 -.25
+(Ke)87 268.8 S(yboard Macr).25 E(os)-.18 E(start\255kbd\255macr)108
+280.8 Q 2.5(o\()-.18 G(C\255x \()-2.5 E(\)).833 E F0(Be)144 292.8 Q
+(gin sa)-.15 E(ving the characters typed into the current k)-.2 E -.15
+(ey)-.1 G(board macro.).15 E F1(end\255kbd\255macr)108 304.8 Q 2.5(o\()
+-.18 G(C\255x \))-2.5 E(\)).833 E F0(Stop sa)144 316.8 Q
+(ving the characters typed into the current k)-.2 E -.15(ey)-.1 G
+(board macro and store the de\214nition.).15 E F1
+(call\255last\255kbd\255macr)108 328.8 Q 2.5(o\()-.18 G(C\255x e\))-2.5
+E F0(Re-e)144 340.8 Q -.15(xe)-.15 G 1(cute the last k).15 F -.15(ey)-.1
+G .999(board macro de\214ned, by making the characters in the macro app\
+ear as if).15 F(typed at the k)144 352.8 Q -.15(ey)-.1 G(board.).15 E F1
+(Miscellaneous)87 369.6 Q -.18(re)108 381.6 S<ad72>.18 E
+(ead\255init\255\214le \(C\255x C\255r\))-.18 E F0 1.776
+(Read in the contents of the)144 393.6 R F2(inputr)4.276 E(c)-.37 E F0
+1.777(\214le, and incorporate an)4.276 F 4.277(yb)-.15 G 1.777
+(indings or v)-4.277 F 1.777(ariable assignments)-.25 F(found there.)144
+405.6 Q F1(abort \(C\255g\))108 417.6 Q F0 3.249
+(Abort the current editing command and ring the terminal')144 429.6 R
+5.748(sb)-.55 G 3.248(ell \(subject to the setting of)-5.748 F F1
+(bell\255style)144 441.6 Q F0(\).)A F1(do\255upper)108 453.6 Q
+(case\255v)-.18 E(ersion \(M\255a, M\255b, M\255)-.1 E F2(x)A F1 2.5(,.)
+C(..\))-2.5 E F0 1.755(If the meta\214ed character)144 465.6 R F2(x)
+4.255 E F0 1.755(is lo)4.255 F 1.756
+(wercase, run the command that is bound to the corresponding)-.25 F
+(uppercase character)144 477.6 Q(.)-.55 E F1(pr)108 489.6 Q
+(e\214x\255meta \(ESC\))-.18 E F0(Metafy the ne)144 501.6 Q
+(xt character typed.)-.15 E/F3 9/Times-Bold@0 SF(ESC)5 E F1(f)2.25 E F0
+(is equi)2.5 E -.25(va)-.25 G(lent to).25 E F1(Meta\255f)2.5 E F0(.)A F1
+(undo \(C\255_, C\255x C\255u\))108 513.6 Q F0
+(Incremental undo, separately remembered for each line.)144 525.6 Q F1
+-2.29 -.18(re v)108 537.6 T(ert\255line \(M\255r\)).08 E F0 1.095
+(Undo all changes made to this line.)144 549.6 R 1.095(This is lik)6.095
+F 3.595(ee)-.1 G -.15(xe)-3.745 G 1.095(cuting the).15 F F1(undo)3.595 E
+F0 1.095(command enough times to)3.595 F
+(return the line to its initial state.)144 561.6 Q F1
+(tilde\255expand \(M\255&\))108 573.6 Q F0(Perform tilde e)144 585.6 Q
+(xpansion on the current w)-.15 E(ord.)-.1 E F1
+(set\255mark \(C\255@, M\255<space>\))108 597.6 Q F0
+(Set the mark to the point.)144 609.6 Q(If a numeric ar)5 E
+(gument is supplied, the mark is set to that position.)-.18 E F1
+(exchange\255point\255and\255mark \(C\255x C\255x\))108 621.6 Q F0(Sw)
+144 633.6 Q .282(ap the point with the mark.)-.1 F .283
+(The current cursor position is set to the sa)5.283 F -.15(ve)-.2 G
+2.783(dp).15 G .283(osition, and the old)-2.783 F(cursor position is sa)
+144 645.6 Q -.15(ve)-.2 G 2.5(da).15 G 2.5(st)-2.5 G(he mark.)-2.5 E F1
+(character\255sear)108 657.6 Q(ch \(C\255]\))-.18 E F0 3.036(Ac)144
+669.6 S .536(haracter is read and point is mo)-3.036 F -.15(ve)-.15 G
+3.035(dt).15 G 3.035(ot)-3.035 G .535(he ne)-3.035 F .535
+(xt occurrence of that character)-.15 F 5.535(.A)-.55 G(ne)-2.5 E -.05
+(ga)-.15 G(ti).05 E .835 -.15(ve c)-.25 H(ount).15 E(searches for pre)
+144 681.6 Q(vious occurrences.)-.25 E F1(character\255sear)108 693.6 Q
+(ch\255backward \(M\255C\255]\))-.18 E F0 3.543(Ac)144 705.6 S 1.043
+(haracter is read and point is mo)-3.543 F -.15(ve)-.15 G 3.544(dt).15 G
+3.544(ot)-3.544 G 1.044(he pre)-3.544 F 1.044
+(vious occurrence of that character)-.25 F 6.044(.A)-.55 G(ne)-2.5 E
+-.05(ga)-.15 G(ti).05 E -.15(ve)-.25 G
+(count searches for subsequent occurrences.)144 717.6 Q
+(GNU Readline 5.2)72 768 Q(2006 Apr 26)134.015 E(9)203.725 E 0 Cg EP
+%%Page: 10 10
+%%BeginPageSetup
+BP
+%%EndPageSetup
+/F0 10/Times-Roman@0 SF 342.2(READLINE\(3\) READLINE\(3\))72 48 R/F1 10
+/Times-Bold@0 SF(insert\255comment \(M\255#\))108 84 Q F0 -.4(Wi)144 96
+S .481(thout a numeric ar).4 F .481(gument, the v)-.18 F .481
+(alue of the readline)-.25 F F1(comment\255begin)2.981 E F0 -.25(va)
+2.981 G .48(riable is inserted at the).25 F(be)144 108 Q .097
+(ginning of the current line.)-.15 F .098(If a numeric ar)5.097 F .098
+(gument is supplied, this command acts as a toggle:)-.18 F(if)5.098 E
+.322(the characters at the be)144 120 R .321
+(ginning of the line do not match the v)-.15 F .321(alue of)-.25 F F1
+(comment\255begin)2.821 E F0 2.821(,t)C .321(he v)-2.821 F .321(alue is)
+-.25 F 1.013(inserted, otherwise the characters in)144 132 R F1
+(comment-begin)3.514 E F0 1.014(are deleted from the be)3.514 F 1.014
+(ginning of the line.)-.15 F 1.469
+(In either case, the line is accepted as if a ne)144 144 R 1.468
+(wline had been typed.)-.25 F 1.468(The def)6.468 F 1.468(ault v)-.1 F
+1.468(alue of)-.25 F F1(com-)3.968 E(ment\255begin)144 156 Q F0(mak)
+2.982 E .483(es the current line a shell comment.)-.1 F .483
+(If a numeric ar)5.483 F .483(gument causes the comment)-.18 F
+(character to be remo)144 168 Q -.15(ve)-.15 G(d, the line will be e).15
+E -.15(xe)-.15 G(cuted by the shell.).15 E F1(dump\255functions)108 180
+Q F0 .627(Print all of the functions and their k)144 192 R .927 -.15
+(ey b)-.1 H .626(indings to the readline output stream.).15 F .626
+(If a numeric ar)5.626 F(gu-)-.18 E
+(ment is supplied, the output is formatted in such a w)144 204 Q
+(ay that it can be made part of an)-.1 E/F2 10/Times-Italic@0 SF(inputr)
+2.5 E(c)-.37 E F0(\214le.)2.5 E F1(dump\255v)108 216 Q(ariables)-.1 E F0
+.283(Print all of the settable v)144 228 R .283(ariables and their v)
+-.25 F .283(alues to the readline output stream.)-.25 F .283
+(If a numeric ar)5.283 F(gu-)-.18 E
+(ment is supplied, the output is formatted in such a w)144 240 Q
+(ay that it can be made part of an)-.1 E F2(inputr)2.5 E(c)-.37 E F0
+(\214le.)2.5 E F1(dump\255macr)108 252 Q(os)-.18 E F0 .593
+(Print all of the readline k)144 264 R .893 -.15(ey s)-.1 H .592
+(equences bound to macros and the strings the).15 F 3.092(yo)-.15 G
+3.092(utput. If)-3.092 F 3.092(an)3.092 G(umeric)-3.092 E(ar)144 276 Q
+.528(gument is supplied, the output is formatted in such a w)-.18 F .528
+(ay that it can be made part of an)-.1 F F2(inputr)3.028 E(c)-.37 E F0
+(\214le.)144 288 Q F1(emacs\255editing\255mode \(C\255e\))108 300 Q F0
+(When in)144 312 Q F1(vi)2.5 E F0(command mode, this causes a switch to)
+2.5 E F1(emacs)2.5 E F0(editing mode.)2.5 E F1
+(vi\255editing\255mode \(M\255C\255j\))108 324 Q F0(When in)144 336 Q F1
+(emacs)2.5 E F0(editing mode, this causes a switch to)2.5 E F1(vi)2.5 E
+F0(editing mode.)2.5 E/F3 10.95/Times-Bold@0 SF(DEF)72 352.8 Q -.548(AU)
+-.986 G 2.014 -1.007(LT K).548 H(EY BINDINGS)1.007 E F0 .065(The follo)
+108 364.8 R .065(wing is a list of the def)-.25 F .065
+(ault emacs and vi bindings.)-.1 F .064
+(Characters with the eighth bit set are written as)5.064 F .527
+(M\255<character>, and are referred to as)108 376.8 R F2(meta\214ed)
+3.407 E F0 3.027(characters. The)3.797 F .527
+(printable ASCII characters not mentioned)3.027 F 1.116
+(in the list of emacs standard bindings are bound to the)108 388.8 R F1
+(self\255insert)3.615 E F0 1.115(function, which just inserts the gi)
+3.615 F -.15(ve)-.25 G(n).15 E .945(character into the input line.)108
+400.8 R .945(In vi insertion mode, all characters not speci\214cally me\
+ntioned are bound to)5.945 F F1(self\255insert)108 412.8 Q F0 5.359(.C)C
+.359(haracters assigned to signal generation by)-5.359 F F2(stty)2.859 E
+F0 .359(\(1\) or the terminal dri).32 F -.15(ve)-.25 G 1.159 -.4(r, s)
+.15 H .358(uch as C-Z or C-C,).4 F .187(retain that function.)108 424.8
+R .187(Upper and lo)5.187 F .188(wer case meta\214ed characters are bou\
+nd to the same function in the emacs)-.25 F .305(mode meta k)108 436.8 R
+-.15(ey)-.1 G 2.805(map. The).15 F .305(remaining characters are unboun\
+d, which causes readline to ring the bell \(subject)2.805 F
+(to the setting of the)108 448.8 Q F1(bell\255style)2.5 E F0 -.25(va)2.5
+G(riable\).).25 E F1(Emacs Mode)87 465.6 Q F0(Emacs Standard bindings)
+151.2 477.6 Q 2.5("C-@" set-mark)151.2 501.6 R 2.5("C-A" be)151.2 513.6
+R(ginning-of-line)-.15 E 2.5("C-B" backw)151.2 525.6 R(ard-char)-.1 E
+2.5("C-D" delete-char)151.2 537.6 R 2.5("C-E" end-of-line)151.2 549.6 R
+2.5("C-F" forw)151.2 561.6 R(ard-char)-.1 E 2.5("C-G" abort)151.2 573.6
+R 2.5("C-H" backw)151.2 585.6 R(ard-delete-char)-.1 E 2.5
+("C-I" complete)151.2 597.6 R 2.5("C-J" accept-line)151.2 609.6 R 2.5
+("C-K" kill-line)151.2 621.6 R 2.5("C-L" clear)151.2 633.6 R(-screen)-.2
+E 2.5("C-M" accept-line)151.2 645.6 R 2.5("C-N" ne)151.2 657.6 R
+(xt-history)-.15 E 2.5("C-P" pre)151.2 669.6 R(vious-history)-.25 E 2.5
+("C-Q" quoted-insert)151.2 681.6 R 2.5("C-R" re)151.2 693.6 R -.15(ve)
+-.25 G(rse-search-history).15 E 2.5("C-S" forw)151.2 705.6 R
+(ard-search-history)-.1 E 2.5("C-T" transpose-chars)151.2 717.6 R 2.5
+("C-U" unix-line-discard)151.2 729.6 R(GNU Readline 5.2)72 768 Q
+(2006 Apr 26)134.015 E(10)198.725 E 0 Cg EP
+%%Page: 11 11
+%%BeginPageSetup
+BP
+%%EndPageSetup
+/F0 10/Times-Roman@0 SF 342.2(READLINE\(3\) READLINE\(3\))72 48 R 2.5
+("C-V" quoted-insert)151.2 84 R 2.5("C-W" unix-w)151.2 96 R(ord-rubout)
+-.1 E 2.5("C-Y" yank)151.2 108 R 2.5("C-]" character)151.2 120 R
+(-search)-.2 E 2.5("C-_" undo)151.2 132 R 3.333("")151.2 144 S(to "/")
+-.833 E(self-insert)5 E 2.5("0" to)151.2 156 R 2.5("9" self-insert)2.5 F
+2.5(":" to)151.2 168 R 2.5("~" self-insert)2.5 F 2.5("C-?" backw)151.2
+180 R(ard-delete-char)-.1 E(Emacs Meta bindings)151.2 196.8 Q 2.5
+("M-C-G" abort)151.2 220.8 R 2.5("M-C-H" backw)151.2 232.8 R(ard-kill-w)
+-.1 E(ord)-.1 E 2.5("M-C-I" tab-insert)151.2 244.8 R 2.5
+("M-C-J" vi-editing-mode)151.2 256.8 R 2.5("M-C-M" vi-editing-mode)151.2
+268.8 R 2.5("M-C-R" re)151.2 280.8 R -.15(ve)-.25 G(rt-line).15 E 2.5
+("M-C-Y" yank-nth-ar)151.2 292.8 R(g)-.18 E 2.5("M-C-[" complete)151.2
+304.8 R 2.5("M-C-]" character)151.2 316.8 R(-search-backw)-.2 E(ard)-.1
+E 2.5("M-space" set-mark)151.2 328.8 R 2.5("M-#" insert-comment)151.2
+340.8 R 2.5("M-&" tilde-e)151.2 352.8 R(xpand)-.15 E 2.5
+("M-*" insert-completions)151.2 364.8 R 2.5("M--" digit-ar)151.2 376.8 R
+(gument)-.18 E 2.5("M-." yank-last-ar)151.2 388.8 R(g)-.18 E 2.5
+("M-0" digit-ar)151.2 400.8 R(gument)-.18 E 2.5("M-1" digit-ar)151.2
+412.8 R(gument)-.18 E 2.5("M-2" digit-ar)151.2 424.8 R(gument)-.18 E 2.5
+("M-3" digit-ar)151.2 436.8 R(gument)-.18 E 2.5("M-4" digit-ar)151.2
+448.8 R(gument)-.18 E 2.5("M-5" digit-ar)151.2 460.8 R(gument)-.18 E 2.5
+("M-6" digit-ar)151.2 472.8 R(gument)-.18 E 2.5("M-7" digit-ar)151.2
+484.8 R(gument)-.18 E 2.5("M-8" digit-ar)151.2 496.8 R(gument)-.18 E 2.5
+("M-9" digit-ar)151.2 508.8 R(gument)-.18 E 2.5("M-<" be)151.2 520.8 R
+(ginning-of-history)-.15 E 2.5("M-=" possible-completions)151.2 532.8 R
+2.5("M->" end-of-history)151.2 544.8 R 2.5("M-?" possible-completions)
+151.2 556.8 R 2.5("M-B" backw)151.2 568.8 R(ard-w)-.1 E(ord)-.1 E 2.5
+("M-C" capitalize-w)151.2 580.8 R(ord)-.1 E 2.5("M-D" kill-w)151.2 592.8
+R(ord)-.1 E 2.5("M-F" forw)151.2 604.8 R(ard-w)-.1 E(ord)-.1 E 2.5
+("M-L" do)151.2 616.8 R(wncase-w)-.25 E(ord)-.1 E 2.5
+("M-N" non-incremental-forw)151.2 628.8 R(ard-search-history)-.1 E 2.5
+("M-P" non-incremental-re)151.2 640.8 R -.15(ve)-.25 G
+(rse-search-history).15 E 2.5("M-R" re)151.2 652.8 R -.15(ve)-.25 G
+(rt-line).15 E 2.5("M-T" transpose-w)151.2 664.8 R(ords)-.1 E 2.5
+("M-U" upcase-w)151.2 676.8 R(ord)-.1 E 2.5("M-Y" yank-pop)151.2 688.8 R
+2.5("M-\\" delete-horizontal-space)151.2 700.8 R 2.5("M-~" tilde-e)151.2
+712.8 R(xpand)-.15 E 2.5("M-C-?" backw)151.2 724.8 R(ard-kill-w)-.1 E
+(ord)-.1 E(GNU Readline 5.2)72 768 Q(2006 Apr 26)134.015 E(11)198.725 E
+0 Cg EP
+%%Page: 12 12
+%%BeginPageSetup
+BP
+%%EndPageSetup
+/F0 10/Times-Roman@0 SF 342.2(READLINE\(3\) READLINE\(3\))72 48 R 2.5
+("M-_" yank-last-ar)151.2 84 R(g)-.18 E(Emacs Control-X bindings)151.2
+100.8 Q 2.5("C-XC-G" abort)151.2 124.8 R 2.5
+("C-XC-R" re-read-init-\214le)151.2 136.8 R 2.5("C-XC-U" undo)151.2
+148.8 R 2.5("C-XC-X" e)151.2 160.8 R(xchange-point-and-mark)-.15 E 2.5
+("C-X\(" start-kbd-macro)151.2 172.8 R 2.5("C-X\)" end-kbd-macro)151.2
+184.8 R 2.5("C-XE" call-last-kbd-macro)151.2 196.8 R 2.5("C-XC-?" backw)
+151.2 208.8 R(ard-kill-line)-.1 E/F1 10/Times-Bold@0 SF
+(VI Mode bindings)87 237.6 Q F0(VI Insert Mode functions)151.2 249.6 Q
+2.5("C-D" vi-eof-maybe)151.2 273.6 R 2.5("C-H" backw)151.2 285.6 R
+(ard-delete-char)-.1 E 2.5("C-I" complete)151.2 297.6 R 2.5
+("C-J" accept-line)151.2 309.6 R 2.5("C-M" accept-line)151.2 321.6 R 2.5
+("C-R" re)151.2 333.6 R -.15(ve)-.25 G(rse-search-history).15 E 2.5
+("C-S" forw)151.2 345.6 R(ard-search-history)-.1 E 2.5
+("C-T" transpose-chars)151.2 357.6 R 2.5("C-U" unix-line-discard)151.2
+369.6 R 2.5("C-V" quoted-insert)151.2 381.6 R 2.5("C-W" unix-w)151.2
+393.6 R(ord-rubout)-.1 E 2.5("C-Y" yank)151.2 405.6 R 2.5("C-[" vi-mo)
+151.2 417.6 R -.15(ve)-.15 G(ment-mode).15 E 2.5("C-_" undo)151.2 429.6
+R 3.333("")151.2 441.6 S(to "~")-.833 E(self-insert)5 E 2.5("C-?" backw)
+151.2 453.6 R(ard-delete-char)-.1 E(VI Command Mode functions)151.2
+470.4 Q 2.5("C-D" vi-eof-maybe)151.2 494.4 R 2.5
+("C-E" emacs-editing-mode)151.2 506.4 R 2.5("C-G" abort)151.2 518.4 R
+2.5("C-H" backw)151.2 530.4 R(ard-char)-.1 E 2.5("C-J" accept-line)151.2
+542.4 R 2.5("C-K" kill-line)151.2 554.4 R 2.5("C-L" clear)151.2 566.4 R
+(-screen)-.2 E 2.5("C-M" accept-line)151.2 578.4 R 2.5("C-N" ne)151.2
+590.4 R(xt-history)-.15 E 2.5("C-P" pre)151.2 602.4 R(vious-history)-.25
+E 2.5("C-Q" quoted-insert)151.2 614.4 R 2.5("C-R" re)151.2 626.4 R -.15
+(ve)-.25 G(rse-search-history).15 E 2.5("C-S" forw)151.2 638.4 R
+(ard-search-history)-.1 E 2.5("C-T" transpose-chars)151.2 650.4 R 2.5
+("C-U" unix-line-discard)151.2 662.4 R 2.5("C-V" quoted-insert)151.2
+674.4 R 2.5("C-W" unix-w)151.2 686.4 R(ord-rubout)-.1 E 2.5("C-Y" yank)
+151.2 698.4 R 2.5("C-_" vi-undo)151.2 710.4 R -4.166 3.333("" f)151.2
+722.4 T(orw)-3.333 E(ard-char)-.1 E(GNU Readline 5.2)72 768 Q
+(2006 Apr 26)134.015 E(12)198.725 E 0 Cg EP
+%%Page: 13 13
+%%BeginPageSetup
+BP
+%%EndPageSetup
+/F0 10/Times-Roman@0 SF 342.2(READLINE\(3\) READLINE\(3\))72 48 R 2.5
+("#" insert-comment)151.2 84 R 2.5("$" end-of-line)151.2 96 R 2.5
+("%" vi-match)151.2 108 R 2.5("&" vi-tilde-e)151.2 120 R(xpand)-.15 E
+2.5("*" vi-complete)151.2 132 R 2.5("+" ne)151.2 144 R(xt-history)-.15 E
+2.5("," vi-char)151.2 156 R(-search)-.2 E 2.5("-" pre)151.2 168 R
+(vious-history)-.25 E 2.5("." vi-redo)151.2 180 R 2.5("/" vi-search)
+151.2 192 R 2.5("0" be)151.2 204 R(ginning-of-line)-.15 E("1" to "9")
+151.2 216 Q(vi-ar)5 E(g-digit)-.18 E 2.5(";" vi-char)151.2 228 R
+(-search)-.2 E 2.5("=" vi-complete)151.2 240 R 2.5("?" vi-search)151.2
+252 R 2.5("A" vi-append-eol)151.2 264 R 2.5("B" vi-pre)151.2 276 R(v-w)
+-.25 E(ord)-.1 E 2.5("C" vi-change-to)151.2 288 R 2.5("D" vi-delete-to)
+151.2 300 R 2.5("E" vi-end-w)151.2 312 R(ord)-.1 E 2.5("F" vi-char)151.2
+324 R(-search)-.2 E 2.5("G" vi-fetch-history)151.2 336 R 2.5
+("I" vi-insert-be)151.2 348 R(g)-.15 E 2.5("N" vi-search-ag)151.2 360 R
+(ain)-.05 E 2.5("P" vi-put)151.2 372 R 2.5("R" vi-replace)151.2 384 R
+2.5("S" vi-subst)151.2 396 R 2.5("T" vi-char)151.2 408 R(-search)-.2 E
+2.5("U" re)151.2 420 R -.15(ve)-.25 G(rt-line).15 E 2.5("W" vi-ne)151.2
+432 R(xt-w)-.15 E(ord)-.1 E 2.5("X" backw)151.2 444 R(ard-delete-char)
+-.1 E 2.5("Y" vi-yank-to)151.2 456 R 2.5("\\" vi-complete)151.2 468 R
+2.5("^" vi-\214rst-print)151.2 480 R 2.5("_" vi-yank-ar)151.2 492 R(g)
+-.18 E 2.5("`" vi-goto-mark)151.2 504 R 2.5("a" vi-append-mode)151.2 516
+R 2.5("b" vi-pre)151.2 528 R(v-w)-.25 E(ord)-.1 E 2.5("c" vi-change-to)
+151.2 540 R 2.5("d" vi-delete-to)151.2 552 R 2.5("e" vi-end-w)151.2 564
+R(ord)-.1 E 2.5("f" vi-char)151.2 576 R(-search)-.2 E 2.5("h" backw)
+151.2 588 R(ard-char)-.1 E 2.5("i" vi-insertion-mode)151.2 600 R 2.5
+("j" ne)151.2 612 R(xt-history)-.15 E 2.5("k" pre)151.2 624 R(v-history)
+-.25 E 2.5("l" forw)151.2 636 R(ard-char)-.1 E 2.5("m" vi-set-mark)151.2
+648 R 2.5("n" vi-search-ag)151.2 660 R(ain)-.05 E 2.5("p" vi-put)151.2
+672 R 2.5("r" vi-change-char)151.2 684 R 2.5("s" vi-subst)151.2 696 R
+2.5("t" vi-char)151.2 708 R(-search)-.2 E 2.5("u" vi-undo)151.2 720 R
+(GNU Readline 5.2)72 768 Q(2006 Apr 26)134.015 E(13)198.725 E 0 Cg EP
+%%Page: 14 14
+%%BeginPageSetup
+BP
+%%EndPageSetup
+/F0 10/Times-Roman@0 SF 342.2(READLINE\(3\) READLINE\(3\))72 48 R 2.5
+("w" vi-ne)151.2 84 R(xt-w)-.15 E(ord)-.1 E 2.5("x" vi-delete)151.2 96 R
+2.5("y" vi-yank-to)151.2 108 R 2.5("|" vi-column)151.2 120 R 2.5
+("~" vi-change-case)151.2 132 R/F1 10.95/Times-Bold@0 SF(SEE ALSO)72
+148.8 Q/F2 10/Times-Italic@0 SF(The Gnu Readline Libr)108 160.8 Q(ary)
+-.15 E F0 2.5(,B)C(rian F)-2.5 E(ox and Chet Rame)-.15 E(y)-.15 E F2
+(The Gnu History Libr)108 172.8 Q(ary)-.15 E F0 2.5(,B)C(rian F)-2.5 E
+(ox and Chet Rame)-.15 E(y)-.15 E F2(bash)108 184.8 Q F0(\(1\))A F1
+(FILES)72 201.6 Q F2(~/.inputr)109.666 213.6 Q(c)-.37 E F0(Indi)144
+225.6 Q(vidual)-.25 E/F3 10/Times-Bold@0 SF -.18(re)2.5 G(adline).18 E
+F0(initialization \214le)2.5 E F1 -.548(AU)72 242.4 S(THORS).548 E F0
+(Brian F)108 254.4 Q(ox, Free Softw)-.15 E(are F)-.1 E(oundation)-.15 E
+(bfox@gnu.or)108 266.4 Q(g)-.18 E(Chet Rame)108 283.2 Q 1.3 -.65(y, C)
+-.15 H(ase W).65 E(estern Reserv)-.8 E 2.5(eU)-.15 G(ni)-2.5 E -.15(ve)
+-.25 G(rsity).15 E(chet@ins.CWR)108 295.2 Q(U.Edu)-.4 E F1 -.11(BU)72
+312 S 2.738(GR).11 G(EPOR)-2.738 E(TS)-.438 E F0 .69(If you \214nd a b)
+108 324 R .69(ug in)-.2 F F3 -.18(re)3.19 G(adline,).18 E F0 .69
+(you should report it.)3.19 F .691(But \214rst, you should mak)5.69 F
+3.191(es)-.1 G .691(ure that it really is a b)-3.191 F(ug,)-.2 E
+(and that it appears in the latest v)108 336 Q(ersion of the)-.15 E F3
+-.18(re)2.5 G(adline).18 E F0(library that you ha)2.5 E -.15(ve)-.2 G(.)
+.15 E .705(Once you ha)108 352.8 R 1.005 -.15(ve d)-.2 H .705
+(etermined that a b).15 F .704(ug actually e)-.2 F .704(xists, mail a b)
+-.15 F .704(ug report to)-.2 F F2 -.2(bu)3.204 G(g\255r).2 E(eadline)
+-.37 E F0(@)A F2(gnu.or)A(g)-.37 E F0 5.704(.I)C 3.204(fy)-5.704 G(ou)
+-3.204 E(ha)108 364.8 Q 1.809 -.15(ve a \214)-.2 H 1.509
+(x, you are welcome to mail that as well!).15 F 1.51
+(Suggestions and `philosophical' b)6.51 F 1.51(ug reports may be)-.2 F
+(mailed to)108 376.8 Q F2 -.2(bu)2.5 G(g-r).2 E(eadline)-.37 E F0(@)A F2
+(gnu.or)A(g)-.37 E F0(or posted to the Usenet ne)2.5 E(wsgroup)-.25 E F3
+(gnu.bash.b)2.5 E(ug)-.2 E F0(.)A(Comments and b)108 393.6 Q
+(ug reports concerning this manual page should be directed to)-.2 E F2
+-.15(ch)2.5 G(et@ins.CWR).15 E -.25(U.)-.4 G(Edu).25 E F0(.).25 E F1
+-.11(BU)72 410.4 S(GS).11 E F0(It')108 422.4 Q 2.5(st)-.55 G
+(oo big and too slo)-2.5 E -.65(w.)-.25 G(GNU Readline 5.2)72 768 Q
+(2006 Apr 26)134.015 E(14)198.725 E 0 Cg EP
+%%Trailer
+end
+%%EOF
diff --git a/doc/rlman.texi b/doc/rlman.texi
new file mode 100644 (file)
index 0000000..e14c655
--- /dev/null
@@ -0,0 +1,101 @@
+\input texinfo    @c -*-texinfo-*-
+@comment %**start of header (This is for running Texinfo on a region.)
+@setfilename readline.info
+@settitle GNU Readline Library
+@comment %**end of header (This is for running Texinfo on a region.)
+@synindex vr fn
+@setchapternewpage odd
+
+@include version.texi
+
+@copying
+This manual describes the GNU Readline Library
+(version @value{VERSION}, @value{UPDATED}), a library which aids in the
+consistency of user interface across discrete programs which provide
+a command line interface.
+
+Copyright @copyright{} 1988-2006 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.
+
+@quotation
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.2 or
+any later version published by the Free Software Foundation; with no
+Invariant Sections, with the Front-Cover texts being ``A GNU Manual,''
+and with the Back-Cover Texts as in (a) below.  A copy of the license is
+included in the section entitled ``GNU Free Documentation License.''
+
+(a) The FSF's Back-Cover Text is: ``You have freedom to copy and modify
+this GNU Manual, like GNU software.  Copies published by the Free
+Software Foundation raise funds for GNU development.''
+@end quotation
+@end copying
+
+@dircategory Libraries
+@direntry
+* Readline: (readline).       The GNU readline library API.
+@end direntry
+
+@titlepage  
+@title GNU Readline Library
+@subtitle Edition @value{EDITION}, for @code{Readline Library} Version @value{VERSION}.
+@subtitle @value{UPDATED-MONTH}
+@author Chet Ramey, Case Western Reserve University
+@author Brian Fox, Free Software Foundation
+
+@page
+@vskip 0pt plus 1filll
+@insertcopying
+
+@sp 1
+Published by the Free Software Foundation @*
+59 Temple Place, Suite 330, @*
+Boston, MA 02111-1307 @*
+USA @*
+
+@end titlepage
+
+@contents
+
+@ifnottex
+@node Top
+@top GNU Readline Library
+
+This document describes the GNU Readline Library, a utility which aids
+in the consistency of user interface across discrete programs which
+provide a command line interface.
+
+@menu
+* Command Line Editing::          GNU Readline User's Manual.
+* Programming with GNU Readline::  GNU Readline Programmer's Manual.
+* Copying This Manual::                   Copying this manual.
+* Concept Index::                 Index of concepts described in this manual.
+* Function and Variable Index::           Index of externally visible functions
+                                  and variables.
+@end menu
+@end ifnottex
+
+@include rluser.texi
+@include rltech.texi
+
+@node Copying This Manual
+@appendix Copying This Manual
+
+@menu
+* GNU Free Documentation License::     License for copying this manual.
+@end menu
+
+@include fdl.texi
+
+@node Concept Index
+@unnumbered Concept Index
+@printindex cp
+
+@node Function and Variable Index
+@unnumbered Function and Variable Index
+@printindex fn
+
+@bye
diff --git a/doc/rltech.texi b/doc/rltech.texi
new file mode 100644 (file)
index 0000000..ecff106
--- /dev/null
@@ -0,0 +1,2290 @@
+@comment %**start of header (This is for running Texinfo on a region.)
+@setfilename rltech.info
+@comment %**end of header (This is for running Texinfo on a region.)
+@setchapternewpage odd
+
+@ifinfo
+This document describes the GNU Readline Library, a utility for aiding
+in the consistency of user interface across discrete programs that need
+to provide a command line interface.
+
+Copyright (C) 1988-2006 Free Software Foundation, Inc.
+
+Permission is granted to make and distribute verbatim copies of
+this manual provided the copyright notice and this permission notice
+pare preserved on all copies.
+
+@ignore
+Permission is granted to process this file through TeX and print the
+results, provided the printed document carries 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 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 Foundation.
+@end ifinfo
+
+@node Programming with GNU Readline
+@chapter Programming with GNU Readline
+
+This chapter describes the interface between the @sc{gnu} Readline Library and
+other programs.  If you are a programmer, and you wish to include the
+features found in @sc{gnu} Readline
+such as completion, line editing, and interactive history manipulation
+in your own programs, this section is for you.
+
+@menu
+* Basic Behavior::     Using the default behavior of Readline.
+* Custom Functions::   Adding your own functions to Readline.
+* Readline Variables::                 Variables accessible to custom
+                                       functions.
+* Readline Convenience Functions::     Functions which Readline supplies to
+                                       aid in writing your own custom
+                                       functions.
+* Readline Signal Handling::   How Readline behaves when it receives signals.
+* Custom Completers::  Supplanting or supplementing Readline's
+                       completion functions.
+@end menu
+
+@node Basic Behavior
+@section Basic Behavior
+
+Many programs provide a command line interface, such as @code{mail},
+@code{ftp}, and @code{sh}.  For such programs, the default behaviour of
+Readline is sufficient.  This section describes how to use Readline in
+the simplest way possible, perhaps to replace calls in your code to
+@code{gets()} or @code{fgets()}.
+
+@findex readline
+@cindex readline, function
+
+The function @code{readline()} prints a prompt @var{prompt}
+and then reads and returns a single line of text from the user.
+If @var{prompt} is @code{NULL} or the empty string, no prompt is displayed.
+The line @code{readline} returns is allocated with @code{malloc()};
+the caller should @code{free()} the line when it has finished with it.
+The declaration for @code{readline} in ANSI C is
+
+@example
+@code{char *readline (const char *@var{prompt});}
+@end example
+
+@noindent
+So, one might say
+@example
+@code{char *line = readline ("Enter a line: ");}
+@end example
+@noindent
+in order to read a line of text from the user.
+The line returned has the final newline removed, so only the
+text remains.
+
+If @code{readline} encounters an @code{EOF} while reading the line, and the
+line is empty at that point, then @code{(char *)NULL} is returned.
+Otherwise, the line is ended just as if a newline had been typed.
+
+If you want the user to be able to get at the line later, (with
+@key{C-p} for example), you must call @code{add_history()} to save the
+line away in a @dfn{history} list of such lines.
+
+@example
+@code{add_history (line)};
+@end example
+
+@noindent
+For full details on the GNU History Library, see the associated manual.
+
+It is preferable to avoid saving empty lines on the history list, since
+users rarely have a burning need to reuse a blank line.  Here is
+a function which usefully replaces the standard @code{gets()} library
+function, and has the advantage of no static buffer to overflow:
+
+@example
+/* A static variable for holding the line. */
+static char *line_read = (char *)NULL;
+
+/* Read a string, and return a pointer to it.
+   Returns NULL on EOF. */
+char *
+rl_gets ()
+@{
+  /* If the buffer has already been allocated,
+     return the memory to the free pool. */
+  if (line_read)
+    @{
+      free (line_read);
+      line_read = (char *)NULL;
+    @}
+
+  /* Get a line from the user. */
+  line_read = readline ("");
+
+  /* If the line has any text in it,
+     save it on the history. */
+  if (line_read && *line_read)
+    add_history (line_read);
+
+  return (line_read);
+@}
+@end example
+
+This function gives the user the default behaviour of @key{TAB}
+completion: completion on file names.  If you do not want Readline to
+complete on filenames, you can change the binding of the @key{TAB} key
+with @code{rl_bind_key()}.
+
+@example
+@code{int rl_bind_key (int @var{key}, rl_command_func_t *@var{function});}
+@end example
+
+@code{rl_bind_key()} takes two arguments: @var{key} is the character that
+you want to bind, and @var{function} is the address of the function to
+call when @var{key} is pressed.  Binding @key{TAB} to @code{rl_insert()}
+makes @key{TAB} insert itself.
+@code{rl_bind_key()} returns non-zero if @var{key} is not a valid
+ASCII character code (between 0 and 255).
+
+Thus, to disable the default @key{TAB} behavior, the following suffices:
+@example
+@code{rl_bind_key ('\t', rl_insert);}
+@end example
+
+This code should be executed once at the start of your program; you
+might write a function called @code{initialize_readline()} which
+performs this and other desired initializations, such as installing
+custom completers (@pxref{Custom Completers}).
+
+@node Custom Functions
+@section Custom Functions
+
+Readline provides many functions for manipulating the text of
+the line, but it isn't possible to anticipate the needs of all
+programs.  This section describes the various functions and variables
+defined within the Readline library which allow a user program to add
+customized functionality to Readline.
+
+Before declaring any functions that customize Readline's behavior, or
+using any functionality Readline provides in other code, an
+application writer should include the file @code{<readline/readline.h>}
+in any file that uses Readline's features.  Since some of the definitions
+in @code{readline.h} use the @code{stdio} library, the file
+@code{<stdio.h>} should be included before @code{readline.h}.
+
+@code{readline.h} defines a C preprocessor variable that should
+be treated as an integer, @code{RL_READLINE_VERSION}, which may
+be used to conditionally compile application code depending on
+the installed Readline version.  The value is a hexadecimal
+encoding of the major and minor version numbers of the library,
+of the form 0x@var{MMmm}.  @var{MM} is the two-digit major
+version number; @var{mm} is the two-digit minor version number. 
+For Readline 4.2, for example, the value of
+@code{RL_READLINE_VERSION} would be @code{0x0402}. 
+
+@menu
+* Readline Typedefs::  C declarations to make code readable.
+* Function Writing::   Variables and calling conventions.
+@end menu
+
+@node Readline Typedefs
+@subsection Readline Typedefs
+
+For readabilty, we declare a number of new object types, all pointers
+to functions.
+
+The reason for declaring these new types is to make it easier to write
+code describing pointers to C functions with appropriately prototyped
+arguments and return values.
+
+For instance, say we want to declare a variable @var{func} as a pointer
+to a function which takes two @code{int} arguments and returns an
+@code{int} (this is the type of all of the Readline bindable functions).
+Instead of the classic C declaration
+
+@code{int (*func)();}
+
+@noindent
+or the ANSI-C style declaration
+
+@code{int (*func)(int, int);}
+
+@noindent
+we may write
+
+@code{rl_command_func_t *func;}
+
+The full list of function pointer types available is
+
+@table @code
+@item typedef int rl_command_func_t (int, int);
+
+@item typedef char *rl_compentry_func_t (const char *, int);
+
+@item typedef char **rl_completion_func_t (const char *, int, int);
+
+@item typedef char *rl_quote_func_t (char *, int, char *);
+
+@item typedef char *rl_dequote_func_t (char *, int);
+
+@item typedef int rl_compignore_func_t (char **);
+
+@item typedef void rl_compdisp_func_t (char **, int, int);
+
+@item typedef int rl_hook_func_t (void);
+
+@item typedef int rl_getc_func_t (FILE *);
+
+@item typedef int rl_linebuf_func_t (char *, int);
+
+@item typedef int rl_intfunc_t (int);
+@item #define rl_ivoidfunc_t rl_hook_func_t
+@item typedef int rl_icpfunc_t (char *);
+@item typedef int rl_icppfunc_t (char **);
+
+@item typedef void rl_voidfunc_t (void);
+@item typedef void rl_vintfunc_t (int);
+@item typedef void rl_vcpfunc_t (char *);
+@item typedef void rl_vcppfunc_t (char **);
+
+@end table
+
+@node Function Writing
+@subsection Writing a New Function
+
+In order to write new functions for Readline, you need to know the
+calling conventions for keyboard-invoked functions, and the names of the
+variables that describe the current state of the line read so far.
+
+The calling sequence for a command @code{foo} looks like
+
+@example
+@code{int foo (int count, int key)}
+@end example
+
+@noindent
+where @var{count} is the numeric argument (or 1 if defaulted) and
+@var{key} is the key that invoked this function.
+
+It is completely up to the function as to what should be done with the
+numeric argument.  Some functions use it as a repeat count, some
+as a flag, and others to choose alternate behavior (refreshing the current
+line as opposed to refreshing the screen, for example).  Some choose to
+ignore it.  In general, if a
+function uses the numeric argument as a repeat count, it should be able
+to do something useful with both negative and positive arguments.
+At the very least, it should be aware that it can be passed a
+negative argument.
+
+A command function should return 0 if its action completes successfully,
+and a non-zero value if some error occurs.
+This is the convention obeyed by all of the builtin Readline bindable
+command functions.
+
+@node Readline Variables
+@section Readline Variables
+
+These variables are available to function writers.
+
+@deftypevar {char *} rl_line_buffer
+This is the line gathered so far.  You are welcome to modify the
+contents of the line, but see @ref{Allowing Undoing}.  The
+function @code{rl_extend_line_buffer} is available to increase
+the memory allocated to @code{rl_line_buffer}.
+@end deftypevar
+
+@deftypevar int rl_point
+The offset of the current cursor position in @code{rl_line_buffer}
+(the @emph{point}).
+@end deftypevar
+
+@deftypevar int rl_end
+The number of characters present in @code{rl_line_buffer}.  When
+@code{rl_point} is at the end of the line, @code{rl_point} and
+@code{rl_end} are equal.
+@end deftypevar
+
+@deftypevar int rl_mark
+The @var{mark} (saved position) in the current line.  If set, the mark
+and point define a @emph{region}.
+@end deftypevar
+
+@deftypevar int rl_done
+Setting this to a non-zero value causes Readline to return the current
+line immediately.
+@end deftypevar
+
+@deftypevar int rl_num_chars_to_read
+Setting this to a positive value before calling @code{readline()} causes
+Readline to return after accepting that many characters, rather
+than reading up to a character bound to @code{accept-line}.
+@end deftypevar
+
+@deftypevar int rl_pending_input
+Setting this to a value makes it the next keystroke read.  This is a
+way to stuff a single character into the input stream.
+@end deftypevar
+
+@deftypevar int rl_dispatching
+Set to a non-zero value if a function is being called from a key binding;
+zero otherwise.  Application functions can test this to discover whether
+they were called directly or by Readline's dispatching mechanism.
+@end deftypevar
+
+@deftypevar int rl_erase_empty_line
+Setting this to a non-zero value causes Readline to completely erase
+the current line, including any prompt, any time a newline is typed as
+the only character on an otherwise-empty line.  The cursor is moved to
+the beginning of the newly-blank line.
+@end deftypevar
+
+@deftypevar {char *} rl_prompt
+The prompt Readline uses.  This is set from the argument to
+@code{readline()}, and should not be assigned to directly.
+The @code{rl_set_prompt()} function (@pxref{Redisplay}) may
+be used to modify the prompt string after calling @code{readline()}.
+@end deftypevar
+
+@deftypevar int rl_already_prompted
+If an application wishes to display the prompt itself, rather than have
+Readline do it the first time @code{readline()} is called, it should set
+this variable to a non-zero value after displaying the prompt.
+The prompt must also be passed as the argument to @code{readline()} so
+the redisplay functions can update the display properly.
+The calling application is responsible for managing the value; Readline
+never sets it.
+@end deftypevar
+
+@deftypevar {const char *} rl_library_version
+The version number of this revision of the library.
+@end deftypevar
+
+@deftypevar int rl_readline_version
+An integer encoding the current version of the library.  The encoding is
+of the form 0x@var{MMmm}, where @var{MM} is the two-digit major version
+number, and @var{mm} is the two-digit minor version number.
+For example, for Readline-4.2, @code{rl_readline_version} would have the
+value 0x0402.
+@end deftypevar
+
+@deftypevar {int} rl_gnu_readline_p
+Always set to 1, denoting that this is @sc{gnu} readline rather than some
+emulation.
+@end deftypevar
+
+@deftypevar {const char *} rl_terminal_name
+The terminal type, used for initialization.  If not set by the application,
+Readline sets this to the value of the @env{TERM} environment variable
+the first time it is called.
+@end deftypevar
+
+@deftypevar {const char *} rl_readline_name
+This variable is set to a unique name by each application using Readline.
+The value allows conditional parsing of the inputrc file
+(@pxref{Conditional Init Constructs}).
+@end deftypevar
+
+@deftypevar {FILE *} rl_instream
+The stdio stream from which Readline reads input.
+If @code{NULL}, Readline defaults to @var{stdin}.
+@end deftypevar
+
+@deftypevar {FILE *} rl_outstream
+The stdio stream to which Readline performs output.
+If @code{NULL}, Readline defaults to @var{stdout}.
+@end deftypevar
+
+@deftypevar int rl_prefer_env_winsize
+If non-zero, Readline gives values found in the @env{LINES} and
+@env{COLUMNS} environment variables greater precedence than values fetched
+from the kernel when computing the screen dimensions.
+@end deftypevar
+
+@deftypevar {rl_command_func_t *} rl_last_func
+The address of the last command function Readline executed.  May be used to
+test whether or not a function is being executed twice in succession, for
+example.
+@end deftypevar
+
+@deftypevar {rl_hook_func_t *} rl_startup_hook
+If non-zero, this is the address of a function to call just
+before @code{readline} prints the first prompt.
+@end deftypevar
+
+@deftypevar {rl_hook_func_t *} rl_pre_input_hook
+If non-zero, this is the address of a function to call after
+the first prompt has been printed and just before @code{readline}
+starts reading input characters.
+@end deftypevar
+
+@deftypevar {rl_hook_func_t *} rl_event_hook
+If non-zero, this is the address of a function to call periodically
+when Readline is waiting for terminal input.
+By default, this will be called at most ten times a second if there
+is no keyboard input.
+@end deftypevar
+
+@deftypevar {rl_getc_func_t *} rl_getc_function
+If non-zero, Readline will call indirectly through this pointer
+to get a character from the input stream.  By default, it is set to
+@code{rl_getc}, the default Readline character input function
+(@pxref{Character Input}).
+@end deftypevar
+
+@deftypevar {rl_voidfunc_t *} rl_redisplay_function
+If non-zero, Readline will call indirectly through this pointer
+to update the display with the current contents of the editing buffer.
+By default, it is set to @code{rl_redisplay}, the default Readline
+redisplay function (@pxref{Redisplay}).
+@end deftypevar
+
+@deftypevar {rl_vintfunc_t *} rl_prep_term_function
+If non-zero, Readline will call indirectly through this pointer
+to initialize the terminal.  The function takes a single argument, an
+@code{int} flag that says whether or not to use eight-bit characters.
+By default, this is set to @code{rl_prep_terminal}
+(@pxref{Terminal Management}).
+@end deftypevar
+
+@deftypevar {rl_voidfunc_t *} rl_deprep_term_function
+If non-zero, Readline will call indirectly through this pointer
+to reset the terminal.  This function should undo the effects of
+@code{rl_prep_term_function}.
+By default, this is set to @code{rl_deprep_terminal}
+(@pxref{Terminal Management}).
+@end deftypevar
+
+@deftypevar {Keymap} rl_executing_keymap
+This variable is set to the keymap (@pxref{Keymaps}) in which the
+currently executing readline function was found.
+@end deftypevar 
+
+@deftypevar {Keymap} rl_binding_keymap
+This variable is set to the keymap (@pxref{Keymaps}) in which the
+last key binding occurred.
+@end deftypevar 
+
+@deftypevar {char *} rl_executing_macro
+This variable is set to the text of any currently-executing macro.
+@end deftypevar
+
+@deftypevar {int} rl_readline_state
+A variable with bit values that encapsulate the current Readline state.
+A bit is set with the @code{RL_SETSTATE} macro, and unset with the
+@code{RL_UNSETSTATE} macro.  Use the @code{RL_ISSTATE} macro to test
+whether a particular state bit is set.  Current state bits include:
+
+@table @code
+@item RL_STATE_NONE
+Readline has not yet been called, nor has it begun to intialize.
+@item RL_STATE_INITIALIZING
+Readline is initializing its internal data structures.
+@item RL_STATE_INITIALIZED
+Readline has completed its initialization.
+@item RL_STATE_TERMPREPPED
+Readline has modified the terminal modes to do its own input and redisplay.
+@item RL_STATE_READCMD
+Readline is reading a command from the keyboard.
+@item RL_STATE_METANEXT
+Readline is reading more input after reading the meta-prefix character.
+@item RL_STATE_DISPATCHING
+Readline is dispatching to a command.
+@item RL_STATE_MOREINPUT
+Readline is reading more input while executing an editing command.
+@item RL_STATE_ISEARCH
+Readline is performing an incremental history search.
+@item RL_STATE_NSEARCH
+Readline is performing a non-incremental history search.
+@item RL_STATE_SEARCH
+Readline is searching backward or forward through the history for a string.
+@item RL_STATE_NUMERICARG
+Readline is reading a numeric argument.
+@item RL_STATE_MACROINPUT
+Readline is currently getting its input from a previously-defined keyboard
+macro.
+@item RL_STATE_MACRODEF
+Readline is currently reading characters defining a keyboard macro.
+@item RL_STATE_OVERWRITE
+Readline is in overwrite mode.
+@item RL_STATE_COMPLETING
+Readline is performing word completion.
+@item RL_STATE_SIGHANDLER
+Readline is currently executing the readline signal handler.
+@item RL_STATE_UNDOING
+Readline is performing an undo.
+@item RL_STATE_DONE
+Readline has read a key sequence bound to @code{accept-line}
+and is about to return the line to the caller.
+@end table
+
+@end deftypevar
+
+@deftypevar {int} rl_explicit_arg
+Set to a non-zero value if an explicit numeric argument was specified by
+the user.  Only valid in a bindable command function.
+@end deftypevar
+
+@deftypevar {int} rl_numeric_arg
+Set to the value of any numeric argument explicitly specified by the user
+before executing the current Readline function.  Only valid in a bindable
+command function.
+@end deftypevar
+
+@deftypevar {int} rl_editing_mode
+Set to a value denoting Readline's current editing mode.  A value of
+@var{1} means Readline is currently in emacs mode; @var{0}
+means that vi mode is active.
+@end deftypevar
+
+
+@node Readline Convenience Functions
+@section Readline Convenience Functions
+
+@menu
+* Function Naming::    How to give a function you write a name.
+* Keymaps::            Making keymaps.
+* Binding Keys::       Changing Keymaps.
+* Associating Function Names and Bindings::    Translate function names to
+                                               key sequences.
+* Allowing Undoing::   How to make your functions undoable.
+* Redisplay::          Functions to control line display.
+* Modifying Text::     Functions to modify @code{rl_line_buffer}.
+* Character Input::    Functions to read keyboard input.
+* Terminal Management::        Functions to manage terminal settings.
+* Utility Functions::  Generally useful functions and hooks.
+* Miscellaneous Functions::    Functions that don't fall into any category.
+* Alternate Interface::        Using Readline in a `callback' fashion.
+* A Readline Example::         An example Readline function.
+@end menu
+
+@node Function Naming
+@subsection Naming a Function
+
+The user can dynamically change the bindings of keys while using
+Readline.  This is done by representing the function with a descriptive
+name.  The user is able to type the descriptive name when referring to
+the function.  Thus, in an init file, one might find
+
+@example
+Meta-Rubout:   backward-kill-word
+@end example
+
+This binds the keystroke @key{Meta-Rubout} to the function
+@emph{descriptively} named @code{backward-kill-word}.  You, as the
+programmer, should bind the functions you write to descriptive names as
+well.  Readline provides a function for doing that:
+
+@deftypefun int rl_add_defun (const char *name, rl_command_func_t *function, int key)
+Add @var{name} to the list of named functions.  Make @var{function} be
+the function that gets called.  If @var{key} is not -1, then bind it to
+@var{function} using @code{rl_bind_key()}.
+@end deftypefun
+
+Using this function alone is sufficient for most applications.
+It is the recommended way to add a few functions to the default
+functions that Readline has built in.
+If you need to do something other than adding a function to Readline,
+you may need to use the underlying functions described below.
+
+@node Keymaps
+@subsection Selecting a Keymap
+
+Key bindings take place on a @dfn{keymap}.  The keymap is the
+association between the keys that the user types and the functions that
+get run.  You can make your own keymaps, copy existing keymaps, and tell
+Readline which keymap to use.
+
+@deftypefun Keymap rl_make_bare_keymap (void)
+Returns a new, empty keymap.  The space for the keymap is allocated with
+@code{malloc()}; the caller should free it by calling
+@code{rl_discard_keymap()} when done.
+@end deftypefun
+
+@deftypefun Keymap rl_copy_keymap (Keymap map)
+Return a new keymap which is a copy of @var{map}.
+@end deftypefun
+
+@deftypefun Keymap rl_make_keymap (void)
+Return a new keymap with the printing characters bound to rl_insert,
+the lowercase Meta characters bound to run their equivalents, and
+the Meta digits bound to produce numeric arguments.
+@end deftypefun
+
+@deftypefun void rl_discard_keymap (Keymap keymap)
+Free the storage associated with @var{keymap}.
+@end deftypefun
+
+Readline has several internal keymaps.  These functions allow you to
+change which keymap is active.
+
+@deftypefun Keymap rl_get_keymap (void)
+Returns the currently active keymap.
+@end deftypefun
+
+@deftypefun void rl_set_keymap (Keymap keymap)
+Makes @var{keymap} the currently active keymap.
+@end deftypefun
+
+@deftypefun Keymap rl_get_keymap_by_name (const char *name)
+Return the keymap matching @var{name}.  @var{name} is one which would
+be supplied in a @code{set keymap} inputrc line (@pxref{Readline Init File}).
+@end deftypefun
+
+@deftypefun {char *} rl_get_keymap_name (Keymap keymap)
+Return the name matching @var{keymap}.  @var{name} is one which would
+be supplied in a @code{set keymap} inputrc line (@pxref{Readline Init File}).
+@end deftypefun
+
+@node Binding Keys
+@subsection Binding Keys
+
+Key sequences are associate with functions through the keymap.
+Readline has several internal keymaps: @code{emacs_standard_keymap},
+@code{emacs_meta_keymap}, @code{emacs_ctlx_keymap},
+@code{vi_movement_keymap}, and @code{vi_insertion_keymap}.
+@code{emacs_standard_keymap} is the default, and the examples in
+this manual assume that.
+
+Since @code{readline()} installs a set of default key bindings the first
+time it is called, there is always the danger that a custom binding
+installed before the first call to @code{readline()} will be overridden.
+An alternate mechanism is to install custom key bindings in an
+initialization function assigned to the @code{rl_startup_hook} variable
+(@pxref{Readline Variables}).
+
+These functions manage key bindings.
+
+@deftypefun int rl_bind_key (int key, rl_command_func_t *function)
+Binds @var{key} to @var{function} in the currently active keymap.
+Returns non-zero in the case of an invalid @var{key}.
+@end deftypefun
+
+@deftypefun int rl_bind_key_in_map (int key, rl_command_func_t *function, Keymap map)
+Bind @var{key} to @var{function} in @var{map}.
+Returns non-zero in the case of an invalid @var{key}.
+@end deftypefun
+
+@deftypefun int rl_bind_key_if_unbound (int key, rl_command_func_t *function)
+Binds @var{key} to @var{function} if it is not already bound in the
+currently active keymap.
+Returns non-zero in the case of an invalid @var{key} or if @var{key} is
+already bound.
+@end deftypefun
+
+@deftypefun int rl_bind_key_if_unbound_in_map (int key, rl_command_func_t *function, Keymap map)
+Binds @var{key} to @var{function} if it is not already bound in @var{map}.
+Returns non-zero in the case of an invalid @var{key} or if @var{key} is
+already bound.
+@end deftypefun
+
+@deftypefun int rl_unbind_key (int key)
+Bind @var{key} to the null function in the currently active keymap.
+Returns non-zero in case of error.
+@end deftypefun
+
+@deftypefun int rl_unbind_key_in_map (int key, Keymap map)
+Bind @var{key} to the null function in @var{map}.
+Returns non-zero in case of error.
+@end deftypefun
+
+@deftypefun int rl_unbind_function_in_map (rl_command_func_t *function, Keymap map)
+Unbind all keys that execute @var{function} in @var{map}.
+@end deftypefun
+
+@deftypefun int rl_unbind_command_in_map (const char *command, Keymap map)
+Unbind all keys that are bound to @var{command} in @var{map}.
+@end deftypefun
+
+@deftypefun int rl_bind_keyseq (const char *keyseq, rl_command_func_t *function)
+Bind the key sequence represented by the string @var{keyseq} to the function
+@var{function}, beginning in the current keymap.
+This makes new keymaps as necessary.
+The return value is non-zero if @var{keyseq} is invalid.
+@end deftypefun
+
+@deftypefun int rl_bind_keyseq_in_map (const char *keyseq, rl_command_func_t *function, Keymap map)
+Bind the key sequence represented by the string @var{keyseq} to the function
+@var{function}.  This makes new keymaps as necessary.
+Initial bindings are performed in @var{map}.
+The return value is non-zero if @var{keyseq} is invalid.
+@end deftypefun
+
+@deftypefun int rl_set_key (const char *keyseq, rl_command_func_t *function, Keymap map)
+Equivalent to @code{rl_bind_keyseq_in_map}.
+@end deftypefun
+
+@deftypefun int rl_bind_keyseq_if_unbound (const char *keyseq, rl_command_func_t *function)
+Binds @var{keyseq} to @var{function} if it is not already bound in the
+currently active keymap.
+Returns non-zero in the case of an invalid @var{keyseq} or if @var{keyseq} is
+already bound.
+@end deftypefun
+
+@deftypefun int rl_bind_keyseq_if_unbound_in_map (const char *keyseq, rl_command_func_t *function, Keymap map)
+Binds @var{keyseq} to @var{function} if it is not already bound in @var{map}.
+Returns non-zero in the case of an invalid @var{keyseq} or if @var{keyseq} is
+already bound.
+@end deftypefun
+
+@deftypefun int rl_generic_bind (int type, const char *keyseq, char *data, Keymap map)
+Bind the key sequence represented by the string @var{keyseq} to the arbitrary
+pointer @var{data}.  @var{type} says what kind of data is pointed to by
+@var{data}; this can be a function (@code{ISFUNC}), a macro
+(@code{ISMACR}), or a keymap (@code{ISKMAP}).  This makes new keymaps as
+necessary.  The initial keymap in which to do bindings is @var{map}.
+@end deftypefun
+
+@deftypefun int rl_parse_and_bind (char *line)
+Parse @var{line} as if it had been read from the @code{inputrc} file and
+perform any key bindings and variable assignments found
+(@pxref{Readline Init File}).
+@end deftypefun
+
+@deftypefun int rl_read_init_file (const char *filename)
+Read keybindings and variable assignments from @var{filename}
+(@pxref{Readline Init File}).
+@end deftypefun
+
+@node Associating Function Names and Bindings
+@subsection Associating Function Names and Bindings
+
+These functions allow you to find out what keys invoke named functions
+and the functions invoked by a particular key sequence.  You may also
+associate a new function name with an arbitrary function.
+
+@deftypefun {rl_command_func_t *} rl_named_function (const char *name)
+Return the function with name @var{name}.
+@end deftypefun
+
+@deftypefun {rl_command_func_t *} rl_function_of_keyseq (const char *keyseq, Keymap map, int *type)
+Return the function invoked by @var{keyseq} in keymap @var{map}.
+If @var{map} is @code{NULL}, the current keymap is used.  If @var{type} is
+not @code{NULL}, the type of the object is returned in the @code{int} variable
+it points to (one of @code{ISFUNC}, @code{ISKMAP}, or @code{ISMACR}).
+@end deftypefun
+
+@deftypefun {char **} rl_invoking_keyseqs (rl_command_func_t *function)
+Return an array of strings representing the key sequences used to
+invoke @var{function} in the current keymap.
+@end deftypefun
+
+@deftypefun {char **} rl_invoking_keyseqs_in_map (rl_command_func_t *function, Keymap map)
+Return an array of strings representing the key sequences used to
+invoke @var{function} in the keymap @var{map}.
+@end deftypefun
+
+@deftypefun void rl_function_dumper (int readable)
+Print the readline function names and the key sequences currently
+bound to them to @code{rl_outstream}.  If @var{readable} is non-zero,
+the list is formatted in such a way that it can be made part of an
+@code{inputrc} file and re-read.
+@end deftypefun
+
+@deftypefun void rl_list_funmap_names (void)
+Print the names of all bindable Readline functions to @code{rl_outstream}.
+@end deftypefun
+
+@deftypefun {const char **} rl_funmap_names (void)
+Return a NULL terminated array of known function names.  The array is
+sorted.  The array itself is allocated, but not the strings inside.  You
+should @code{free()} the array when you are done, but not the pointers.
+@end deftypefun
+
+@deftypefun int rl_add_funmap_entry (const char *name, rl_command_func_t *function)
+Add @var{name} to the list of bindable Readline command names, and make
+@var{function} the function to be called when @var{name} is invoked.
+@end deftypefun
+
+@node Allowing Undoing
+@subsection Allowing Undoing
+
+Supporting the undo command is a painless thing, and makes your
+functions much more useful.  It is certainly easy to try
+something if you know you can undo it.
+
+If your function simply inserts text once, or deletes text once, and
+uses @code{rl_insert_text()} or @code{rl_delete_text()} to do it, then
+undoing is already done for you automatically.
+
+If you do multiple insertions or multiple deletions, or any combination
+of these operations, you should group them together into one operation.
+This is done with @code{rl_begin_undo_group()} and
+@code{rl_end_undo_group()}.
+
+The types of events that can be undone are:
+
+@smallexample
+enum undo_code @{ UNDO_DELETE, UNDO_INSERT, UNDO_BEGIN, UNDO_END @}; 
+@end smallexample
+
+Notice that @code{UNDO_DELETE} means to insert some text, and
+@code{UNDO_INSERT} means to delete some text.  That is, the undo code
+tells what to undo, not how to undo it.  @code{UNDO_BEGIN} and
+@code{UNDO_END} are tags added by @code{rl_begin_undo_group()} and
+@code{rl_end_undo_group()}.
+
+@deftypefun int rl_begin_undo_group (void)
+Begins saving undo information in a group construct.  The undo
+information usually comes from calls to @code{rl_insert_text()} and
+@code{rl_delete_text()}, but could be the result of calls to
+@code{rl_add_undo()}.
+@end deftypefun
+
+@deftypefun int rl_end_undo_group (void)
+Closes the current undo group started with @code{rl_begin_undo_group
+()}.  There should be one call to @code{rl_end_undo_group()}
+for each call to @code{rl_begin_undo_group()}.
+@end deftypefun
+
+@deftypefun void rl_add_undo (enum undo_code what, int start, int end, char *text)
+Remember how to undo an event (according to @var{what}).  The affected
+text runs from @var{start} to @var{end}, and encompasses @var{text}.
+@end deftypefun
+
+@deftypefun void rl_free_undo_list (void)
+Free the existing undo list.
+@end deftypefun
+
+@deftypefun int rl_do_undo (void)
+Undo the first thing on the undo list.  Returns @code{0} if there was
+nothing to undo, non-zero if something was undone.
+@end deftypefun
+
+Finally, if you neither insert nor delete text, but directly modify the
+existing text (e.g., change its case), call @code{rl_modifying()}
+once, just before you modify the text.  You must supply the indices of
+the text range that you are going to modify.
+
+@deftypefun int rl_modifying (int start, int end)
+Tell Readline to save the text between @var{start} and @var{end} as a
+single undo unit.  It is assumed that you will subsequently modify
+that text.
+@end deftypefun
+
+@node Redisplay
+@subsection Redisplay
+
+@deftypefun void rl_redisplay (void)
+Change what's displayed on the screen to reflect the current contents
+of @code{rl_line_buffer}.
+@end deftypefun
+
+@deftypefun int rl_forced_update_display (void)
+Force the line to be updated and redisplayed, whether or not
+Readline thinks the screen display is correct.
+@end deftypefun
+
+@deftypefun int rl_on_new_line (void)
+Tell the update functions that we have moved onto a new (empty) line,
+usually after ouputting a newline.
+@end deftypefun
+
+@deftypefun int rl_on_new_line_with_prompt (void)
+Tell the update functions that we have moved onto a new line, with
+@var{rl_prompt} already displayed.
+This could be used by applications that want to output the prompt string
+themselves, but still need Readline to know the prompt string length for
+redisplay.
+It should be used after setting @var{rl_already_prompted}.
+@end deftypefun
+
+@deftypefun int rl_reset_line_state (void)
+Reset the display state to a clean state and redisplay the current line
+starting on a new line.
+@end deftypefun
+
+@deftypefun int rl_crlf (void)
+Move the cursor to the start of the next screen line.
+@end deftypefun
+
+@deftypefun int rl_show_char (int c)
+Display character @var{c} on @code{rl_outstream}.
+If Readline has not been set to display meta characters directly, this
+will convert meta characters to a meta-prefixed key sequence.
+This is intended for use by applications which wish to do their own
+redisplay.
+@end deftypefun
+
+@deftypefun int rl_message (const char *, @dots{})
+The arguments are a format string as would be supplied to @code{printf},
+possibly containing conversion specifications such as @samp{%d}, and
+any additional arguments necessary to satisfy the conversion specifications.
+The resulting string is displayed in the @dfn{echo area}.  The echo area
+is also used to display numeric arguments and search strings.
+You should call @code{rl_save_prompt} to save the prompt information
+before calling this function.
+@end deftypefun
+
+@deftypefun int rl_clear_message (void)
+Clear the message in the echo area.  If the prompt was saved with a call to
+@code{rl_save_prompt} before the last call to @code{rl_message},
+call @code{rl_restore_prompt} before calling this function.
+@end deftypefun
+
+@deftypefun void rl_save_prompt (void)
+Save the local Readline prompt display state in preparation for
+displaying a new message in the message area with @code{rl_message()}.
+@end deftypefun
+
+@deftypefun void rl_restore_prompt (void)
+Restore the local Readline prompt display state saved by the most
+recent call to @code{rl_save_prompt}.
+if @code{rl_save_prompt} was called to save the prompt before a call
+to @code{rl_message}, this function should be called before the
+corresponding call to @code{rl_clear_message}.
+@end deftypefun
+
+@deftypefun int rl_expand_prompt (char *prompt)
+Expand any special character sequences in @var{prompt} and set up the
+local Readline prompt redisplay variables.
+This function is called by @code{readline()}.  It may also be called to
+expand the primary prompt if the @code{rl_on_new_line_with_prompt()}
+function or @code{rl_already_prompted} variable is used.
+It returns the number of visible characters on the last line of the
+(possibly multi-line) prompt.
+Applications may indicate that the prompt contains characters that take
+up no physical screen space when displayed by bracketing a sequence of
+such characters with the special markers @code{RL_PROMPT_START_IGNORE}
+and @code{RL_PROMPT_END_IGNORE} (declared in @file{readline.h}.  This may
+be used to embed terminal-specific escape sequences in prompts.
+@end deftypefun
+
+@deftypefun int rl_set_prompt (const char *prompt)
+Make Readline use @var{prompt} for subsequent redisplay.  This calls
+@code{rl_expand_prompt()} to expand the prompt and sets @code{rl_prompt}
+to the result.
+@end deftypefun
+
+@node Modifying Text
+@subsection Modifying Text
+
+@deftypefun int rl_insert_text (const char *text)
+Insert @var{text} into the line at the current cursor position.
+Returns the number of characters inserted.
+@end deftypefun
+
+@deftypefun int rl_delete_text (int start, int end)
+Delete the text between @var{start} and @var{end} in the current line.
+Returns the number of characters deleted.
+@end deftypefun
+
+@deftypefun {char *} rl_copy_text (int start, int end)
+Return a copy of the text between @var{start} and @var{end} in
+the current line.
+@end deftypefun
+
+@deftypefun int rl_kill_text (int start, int end)
+Copy the text between @var{start} and @var{end} in the current line
+to the kill ring, appending or prepending to the last kill if the
+last command was a kill command.  The text is deleted.
+If @var{start} is less than @var{end},
+the text is appended, otherwise prepended.  If the last command was
+not a kill, a new kill ring slot is used.
+@end deftypefun
+
+@deftypefun int rl_push_macro_input (char *macro)
+Cause @var{macro} to be inserted into the line, as if it had been invoked
+by a key bound to a macro.  Not especially useful; use
+@code{rl_insert_text()} instead.
+@end deftypefun
+
+@node Character Input
+@subsection Character Input
+
+@deftypefun int rl_read_key (void)
+Return the next character available from Readline's current input stream.
+This handles input inserted into
+the input stream via @var{rl_pending_input} (@pxref{Readline Variables})
+and @code{rl_stuff_char()}, macros, and characters read from the keyboard.
+While waiting for input, this function will call any function assigned to
+the @code{rl_event_hook} variable.
+@end deftypefun
+
+@deftypefun int rl_getc (FILE *stream)
+Return the next character available from @var{stream}, which is assumed to
+be the keyboard.
+@end deftypefun
+
+@deftypefun int rl_stuff_char (int c)
+Insert @var{c} into the Readline input stream.  It will be "read"
+before Readline attempts to read characters from the terminal with
+@code{rl_read_key()}.  Up to 512 characters may be pushed back.
+@code{rl_stuff_char} returns 1 if the character was successfully inserted;
+0 otherwise.
+@end deftypefun
+
+@deftypefun int rl_execute_next (int c)
+Make @var{c} be the next command to be executed when @code{rl_read_key()}
+is called.  This sets @var{rl_pending_input}.
+@end deftypefun
+
+@deftypefun int rl_clear_pending_input (void)
+Unset @var{rl_pending_input}, effectively negating the effect of any
+previous call to @code{rl_execute_next()}.  This works only if the
+pending input has not already been read with @code{rl_read_key()}.
+@end deftypefun
+
+@deftypefun int rl_set_keyboard_input_timeout (int u)
+While waiting for keyboard input in @code{rl_read_key()}, Readline will
+wait for @var{u} microseconds for input before calling any function
+assigned to @code{rl_event_hook}.  @var{u} must be greater than or equal
+to zero (a zero-length timeout is equivalent to a poll).
+The default waiting period is one-tenth of a second.
+Returns the old timeout value.
+@end deftypefun
+
+@node Terminal Management
+@subsection Terminal Management
+
+@deftypefun void rl_prep_terminal (int meta_flag)
+Modify the terminal settings for Readline's use, so @code{readline()}
+can read a single character at a time from the keyboard.
+The @var{meta_flag} argument should be non-zero if Readline should
+read eight-bit input.
+@end deftypefun
+
+@deftypefun void rl_deprep_terminal (void)
+Undo the effects of @code{rl_prep_terminal()}, leaving the terminal in
+the state in which it was before the most recent call to
+@code{rl_prep_terminal()}.
+@end deftypefun
+
+@deftypefun void rl_tty_set_default_bindings (Keymap kmap)
+Read the operating system's terminal editing characters (as would be
+displayed by @code{stty}) to their Readline equivalents.
+The bindings are performed in @var{kmap}.
+@end deftypefun
+
+@deftypefun void rl_tty_unset_default_bindings (Keymap kmap)
+Reset the bindings manipulated by @code{rl_tty_set_default_bindings} so
+that the terminal editing characters are bound to @code{rl_insert}.
+The bindings are performed in @var{kmap}.
+@end deftypefun
+
+@deftypefun int rl_reset_terminal (const char *terminal_name)
+Reinitialize Readline's idea of the terminal settings using
+@var{terminal_name} as the terminal type (e.g., @code{vt100}).
+If @var{terminal_name} is @code{NULL}, the value of the @code{TERM}
+environment variable is used.
+@end deftypefun
+
+@node Utility Functions
+@subsection Utility Functions
+
+@deftypefun void rl_replace_line (const char *text, int clear_undo)
+Replace the contents of @code{rl_line_buffer} with @var{text}.
+The point and mark are preserved, if possible.
+If @var{clear_undo} is non-zero, the undo list associated with the
+current line is cleared.
+@end deftypefun
+
+@deftypefun int rl_extend_line_buffer (int len)
+Ensure that @code{rl_line_buffer} has enough space to hold @var{len}
+characters, possibly reallocating it if necessary.
+@end deftypefun
+
+@deftypefun int rl_initialize (void)
+Initialize or re-initialize Readline's internal state.
+It's not strictly necessary to call this; @code{readline()} calls it before
+reading any input.
+@end deftypefun
+
+@deftypefun int rl_ding (void)
+Ring the terminal bell, obeying the setting of @code{bell-style}.
+@end deftypefun
+
+@deftypefun int rl_alphabetic (int c)
+Return 1 if @var{c} is an alphabetic character.
+@end deftypefun
+
+@deftypefun void rl_display_match_list (char **matches, int len, int max)
+A convenience function for displaying a list of strings in
+columnar format on Readline's output stream.  @code{matches} is the list
+of strings, in argv format, such as a list of completion matches.
+@code{len} is the number of strings in @code{matches}, and @code{max}
+is the length of the longest string in @code{matches}.  This function uses
+the setting of @code{print-completions-horizontally} to select how the
+matches are displayed (@pxref{Readline Init File Syntax}).
+@end deftypefun
+
+The following are implemented as macros, defined in @code{chardefs.h}.
+Applications should refrain from using them.
+
+@deftypefun int _rl_uppercase_p (int c)
+Return 1 if @var{c} is an uppercase alphabetic character.
+@end deftypefun
+
+@deftypefun int _rl_lowercase_p (int c)
+Return 1 if @var{c} is a lowercase alphabetic character.
+@end deftypefun
+
+@deftypefun int _rl_digit_p (int c)
+Return 1 if @var{c} is a numeric character.
+@end deftypefun
+
+@deftypefun int _rl_to_upper (int c)
+If @var{c} is a lowercase alphabetic character, return the corresponding
+uppercase character.
+@end deftypefun
+
+@deftypefun int _rl_to_lower (int c)
+If @var{c} is an uppercase alphabetic character, return the corresponding
+lowercase character.
+@end deftypefun
+
+@deftypefun int _rl_digit_value (int c)
+If @var{c} is a number, return the value it represents.
+@end deftypefun
+
+@node Miscellaneous Functions
+@subsection Miscellaneous Functions
+
+@deftypefun int rl_macro_bind (const char *keyseq, const char *macro, Keymap map)
+Bind the key sequence @var{keyseq} to invoke the macro @var{macro}.
+The binding is performed in @var{map}.  When @var{keyseq} is invoked, the
+@var{macro} will be inserted into the line.  This function is deprecated;
+use @code{rl_generic_bind()} instead.
+@end deftypefun
+
+@deftypefun void rl_macro_dumper (int readable)
+Print the key sequences bound to macros and their values, using
+the current keymap, to @code{rl_outstream}.
+If @var{readable} is non-zero, the list is formatted in such a way
+that it can be made part of an @code{inputrc} file and re-read.
+@end deftypefun
+
+@deftypefun int rl_variable_bind (const char *variable, const char *value)
+Make the Readline variable @var{variable} have @var{value}.
+This behaves as if the readline command
+@samp{set @var{variable} @var{value}} had been executed in an @code{inputrc}
+file (@pxref{Readline Init File Syntax}).
+@end deftypefun
+
+@deftypefun {char *} rl_variable_value (const char *variable)
+Return a string representing the value of the Readline variable @var{variable}.
+For boolean variables, this string is either @samp{on} or @samp{off}.
+@end deftypefun
+
+@deftypefun void rl_variable_dumper (int readable)
+Print the readline variable names and their current values
+to @code{rl_outstream}.
+If @var{readable} is non-zero, the list is formatted in such a way
+that it can be made part of an @code{inputrc} file and re-read.
+@end deftypefun
+
+@deftypefun int rl_set_paren_blink_timeout (int u)
+Set the time interval (in microseconds) that Readline waits when showing
+a balancing character when @code{blink-matching-paren} has been enabled.
+@end deftypefun
+
+@deftypefun {char *} rl_get_termcap (const char *cap)
+Retrieve the string value of the termcap capability @var{cap}.
+Readline fetches the termcap entry for the current terminal name and
+uses those capabilities to move around the screen line and perform other
+terminal-specific operations, like erasing a line.  Readline does not
+use all of a terminal's capabilities, and this function will return
+values for only those capabilities Readline uses.
+@end deftypefun
+
+@node Alternate Interface
+@subsection Alternate Interface
+
+An alternate interface is available to plain @code{readline()}.  Some
+applications need to interleave keyboard I/O with file, device, or
+window system I/O, typically by using a main loop to @code{select()}
+on various file descriptors.  To accomodate this need, readline can
+also be invoked as a `callback' function from an event loop.  There
+are functions available to make this easy.
+
+@deftypefun void rl_callback_handler_install (const char *prompt, rl_vcpfunc_t *lhandler)
+Set up the terminal for readline I/O and display the initial
+expanded value of @var{prompt}.  Save the value of @var{lhandler} to
+use as a function to call when a complete line of input has been entered.
+The function takes the text of the line as an argument.
+@end deftypefun
+
+@deftypefun void rl_callback_read_char (void)
+Whenever an application determines that keyboard input is available, it
+should call @code{rl_callback_read_char()}, which will read the next
+character from the current input source.
+If that character completes the line, @code{rl_callback_read_char} will
+invoke the @var{lhandler} function saved by @code{rl_callback_handler_install}
+to process the line.
+Before calling the @var{lhandler} function, the terminal settings are
+reset to the values they had before calling
+@code{rl_callback_handler_install}.
+If the @var{lhandler} function returns,
+the terminal settings are modified for Readline's use again.
+@code{EOF} is  indicated by calling @var{lhandler} with a
+@code{NULL} line.
+@end deftypefun
+
+@deftypefun void rl_callback_handler_remove (void)
+Restore the terminal to its initial state and remove the line handler.
+This may be called from within a callback as well as independently.
+If the @var{lhandler} installed by @code{rl_callback_handler_install}
+does not exit the program, either this function or the function referred
+to by the value of @code{rl_deprep_term_function} should be called before
+the program exits to reset the terminal settings.
+@end deftypefun
+
+@node A Readline Example
+@subsection A Readline Example
+
+Here is a function which changes lowercase characters to their uppercase
+equivalents, and uppercase characters to lowercase.  If
+this function was bound to @samp{M-c}, then typing @samp{M-c} would
+change the case of the character under point.  Typing @samp{M-1 0 M-c}
+would change the case of the following 10 characters, leaving the cursor on
+the last character changed.
+
+@example
+/* Invert the case of the COUNT following characters. */
+int
+invert_case_line (count, key)
+     int count, key;
+@{
+  register int start, end, i;
+
+  start = rl_point;
+
+  if (rl_point >= rl_end)
+    return (0);
+
+  if (count < 0)
+    @{
+      direction = -1;
+      count = -count;
+    @}
+  else
+    direction = 1;
+      
+  /* Find the end of the range to modify. */
+  end = start + (count * direction);
+
+  /* Force it to be within range. */
+  if (end > rl_end)
+    end = rl_end;
+  else if (end < 0)
+    end = 0;
+
+  if (start == end)
+    return (0);
+
+  if (start > end)
+    @{
+      int temp = start;
+      start = end;
+      end = temp;
+    @}
+
+  /* Tell readline that we are modifying the line,
+     so it will save the undo information. */
+  rl_modifying (start, end);
+
+  for (i = start; i != end; i++)
+    @{
+      if (_rl_uppercase_p (rl_line_buffer[i]))
+        rl_line_buffer[i] = _rl_to_lower (rl_line_buffer[i]);
+      else if (_rl_lowercase_p (rl_line_buffer[i]))
+        rl_line_buffer[i] = _rl_to_upper (rl_line_buffer[i]);
+    @}
+  /* Move point to on top of the last character changed. */
+  rl_point = (direction == 1) ? end - 1 : start;
+  return (0);
+@}
+@end example
+
+@node Readline Signal Handling
+@section Readline Signal Handling
+
+Signals are asynchronous events sent to a process by the Unix kernel,
+sometimes on behalf of another process.  They are intended to indicate
+exceptional events, like a user pressing the interrupt key on his terminal,
+or a network connection being broken.  There is a class of signals that can
+be sent to the process currently reading input from the keyboard.  Since
+Readline changes the terminal attributes when it is called, it needs to
+perform special processing when such a signal is received in order to
+restore the terminal to a sane state, or provide application writers with
+functions to do so manually. 
+
+Readline contains an internal signal handler that is installed for a
+number of signals (@code{SIGINT}, @code{SIGQUIT}, @code{SIGTERM},
+@code{SIGALRM}, @code{SIGTSTP}, @code{SIGTTIN}, and @code{SIGTTOU}).
+When one of these signals is received, the signal handler
+will reset the terminal attributes to those that were in effect before
+@code{readline()} was called, reset the signal handling to what it was
+before @code{readline()} was called, and resend the signal to the calling
+application.
+If and when the calling application's signal handler returns, Readline
+will reinitialize the terminal and continue to accept input.
+When a @code{SIGINT} is received, the Readline signal handler performs
+some additional work, which will cause any partially-entered line to be
+aborted (see the description of @code{rl_free_line_state()} below).
+
+There is an additional Readline signal handler, for @code{SIGWINCH}, which
+the kernel sends to a process whenever the terminal's size changes (for
+example, if a user resizes an @code{xterm}).  The Readline @code{SIGWINCH}
+handler updates Readline's internal screen size information, and then calls
+any @code{SIGWINCH} signal handler the calling application has installed. 
+Readline calls the application's @code{SIGWINCH} signal handler without
+resetting the terminal to its original state.  If the application's signal
+handler does more than update its idea of the terminal size and return (for
+example, a @code{longjmp} back to a main processing loop), it @emph{must}
+call @code{rl_cleanup_after_signal()} (described below), to restore the
+terminal state. 
+
+Readline provides two variables that allow application writers to
+control whether or not it will catch certain signals and act on them
+when they are received.  It is important that applications change the
+values of these variables only when calling @code{readline()}, not in
+a signal handler, so Readline's internal signal state is not corrupted.
+
+@deftypevar int rl_catch_signals
+If this variable is non-zero, Readline will install signal handlers for
+@code{SIGINT}, @code{SIGQUIT}, @code{SIGTERM}, @code{SIGALRM},
+@code{SIGTSTP}, @code{SIGTTIN}, and @code{SIGTTOU}.
+
+The default value of @code{rl_catch_signals} is 1.
+@end deftypevar
+
+@deftypevar int rl_catch_sigwinch
+If this variable is non-zero, Readline will install a signal handler for
+@code{SIGWINCH}.
+
+The default value of @code{rl_catch_sigwinch} is 1.
+@end deftypevar
+
+If an application does not wish to have Readline catch any signals, or
+to handle signals other than those Readline catches (@code{SIGHUP},
+for example), 
+Readline provides convenience functions to do the necessary terminal
+and internal state cleanup upon receipt of a signal.
+
+@deftypefun void rl_cleanup_after_signal (void)
+This function will reset the state of the terminal to what it was before
+@code{readline()} was called, and remove the Readline signal handlers for
+all signals, depending on the values of @code{rl_catch_signals} and
+@code{rl_catch_sigwinch}.
+@end deftypefun
+
+@deftypefun void rl_free_line_state (void)
+This will free any partial state associated with the current input line
+(undo information, any partial history entry, any partially-entered
+keyboard macro, and any partially-entered numeric argument).  This
+should be called before @code{rl_cleanup_after_signal()}.  The
+Readline signal handler for @code{SIGINT} calls this to abort the
+current input line.
+@end deftypefun
+
+@deftypefun void rl_reset_after_signal (void)
+This will reinitialize the terminal and reinstall any Readline signal
+handlers, depending on the values of @code{rl_catch_signals} and
+@code{rl_catch_sigwinch}.
+@end deftypefun
+
+If an application does not wish Readline to catch @code{SIGWINCH}, it may
+call @code{rl_resize_terminal()} or @code{rl_set_screen_size()} to force
+Readline to update its idea of the terminal size when a @code{SIGWINCH}
+is received.
+
+@deftypefun void rl_resize_terminal (void)
+Update Readline's internal screen size by reading values from the kernel.
+@end deftypefun
+
+@deftypefun void rl_set_screen_size (int rows, int cols)
+Set Readline's idea of the terminal size to @var{rows} rows and
+@var{cols} columns.  If either @var{rows} or @var{columns} is less than
+or equal to 0, Readline's idea of that terminal dimension is unchanged.
+@end deftypefun
+
+If an application does not want to install a @code{SIGWINCH} handler, but
+is still interested in the screen dimensions, Readline's idea of the screen
+size may be queried.
+
+@deftypefun void rl_get_screen_size (int *rows, int *cols)
+Return Readline's idea of the terminal's size in the
+variables pointed to by the arguments.
+@end deftypefun
+
+@deftypefun void rl_reset_screen_size (void)
+Cause Readline to reobtain the screen size and recalculate its dimensions.
+@end deftypefun
+
+The following functions install and remove Readline's signal handlers.
+
+@deftypefun int rl_set_signals (void)
+Install Readline's signal handler for @code{SIGINT}, @code{SIGQUIT},
+@code{SIGTERM}, @code{SIGALRM}, @code{SIGTSTP}, @code{SIGTTIN},
+@code{SIGTTOU}, and @code{SIGWINCH}, depending on the values of
+@code{rl_catch_signals} and @code{rl_catch_sigwinch}.
+@end deftypefun
+
+@deftypefun int rl_clear_signals (void)
+Remove all of the Readline signal handlers installed by
+@code{rl_set_signals()}.
+@end deftypefun
+
+@node Custom Completers
+@section Custom Completers
+@cindex application-specific completion functions
+
+Typically, a program that reads commands from the user has a way of
+disambiguating commands and data.  If your program is one of these, then
+it can provide completion for commands, data, or both.
+The following sections describe how your program and Readline
+cooperate to provide this service.
+
+@menu
+* How Completing Works::       The logic used to do completion.
+* Completion Functions::       Functions provided by Readline.
+* Completion Variables::       Variables which control completion.
+* A Short Completion Example:: An example of writing completer subroutines.
+@end menu
+
+@node How Completing Works
+@subsection How Completing Works
+
+In order to complete some text, the full list of possible completions
+must be available.  That is, it is not possible to accurately
+expand a partial word without knowing all of the possible words
+which make sense in that context.  The Readline library provides
+the user interface to completion, and two of the most common
+completion functions:  filename and username.  For completing other types
+of text, you must write your own completion function.  This section
+describes exactly what such functions must do, and provides an example.
+
+There are three major functions used to perform completion:
+
+@enumerate
+@item
+The user-interface function @code{rl_complete()}.  This function is
+called with the same arguments as other bindable Readline functions:
+@var{count} and @var{invoking_key}.
+It isolates the word to be completed and calls
+@code{rl_completion_matches()} to generate a list of possible completions.
+It then either lists the possible completions, inserts the possible
+completions, or actually performs the
+completion, depending on which behavior is desired.
+
+@item
+The internal function @code{rl_completion_matches()} uses an
+application-supplied @dfn{generator} function to generate the list of
+possible matches, and then returns the array of these matches.
+The caller should place the address of its generator function in
+@code{rl_completion_entry_function}.
+
+@item
+The generator function is called repeatedly from
+@code{rl_completion_matches()}, returning a string each time.  The
+arguments to the generator function are @var{text} and @var{state}.
+@var{text} is the partial word to be completed.  @var{state} is zero the
+first time the function is called, allowing the generator to perform
+any necessary initialization, and a positive non-zero integer for
+each subsequent call.  The generator function returns
+@code{(char *)NULL} to inform @code{rl_completion_matches()} that there are
+no more possibilities left.  Usually the generator function computes the
+list of possible completions when @var{state} is zero, and returns them
+one at a time on subsequent calls.  Each string the generator function
+returns as a match must be allocated with @code{malloc()}; Readline
+frees the strings when it has finished with them.
+Such a generator function is referred to as an
+@dfn{application-specific completion function}.
+
+@end enumerate
+
+@deftypefun int rl_complete (int ignore, int invoking_key)
+Complete the word at or before point.  You have supplied the function
+that does the initial simple matching selection algorithm (see
+@code{rl_completion_matches()}).  The default is to do filename completion.
+@end deftypefun
+
+@deftypevar {rl_compentry_func_t *} rl_completion_entry_function
+This is a pointer to the generator function for
+@code{rl_completion_matches()}.
+If the value of @code{rl_completion_entry_function} is
+@code{NULL} then the default filename generator
+function, @code{rl_filename_completion_function()}, is used.
+An @dfn{application-specific completion function} is a function whose
+address is assigned to @code{rl_completion_entry_function} and whose
+return values are used to  generate possible completions.
+@end deftypevar
+
+@node Completion Functions
+@subsection Completion Functions
+
+Here is the complete list of callable completion functions present in
+Readline.
+
+@deftypefun int rl_complete_internal (int what_to_do)
+Complete the word at or before point.  @var{what_to_do} says what to do
+with the completion.  A value of @samp{?} means list the possible
+completions.  @samp{TAB} means do standard completion.  @samp{*} means
+insert all of the possible completions.  @samp{!} means to display
+all of the possible completions, if there is more than one, as well as
+performing partial completion.  @samp{@@} is similar to @samp{!}, but
+possible completions are not listed if the possible completions share
+a common prefix.
+@end deftypefun
+
+@deftypefun int rl_complete (int ignore, int invoking_key)
+Complete the word at or before point.  You have supplied the function
+that does the initial simple matching selection algorithm (see
+@code{rl_completion_matches()} and @code{rl_completion_entry_function}).
+The default is to do filename
+completion.  This calls @code{rl_complete_internal()} with an
+argument depending on @var{invoking_key}.
+@end deftypefun
+
+@deftypefun int rl_possible_completions (int count, int invoking_key)
+List the possible completions.  See description of @code{rl_complete
+()}.  This calls @code{rl_complete_internal()} with an argument of
+@samp{?}.
+@end deftypefun
+
+@deftypefun int rl_insert_completions (int count, int invoking_key)
+Insert the list of possible completions into the line, deleting the
+partially-completed word.  See description of @code{rl_complete()}.
+This calls @code{rl_complete_internal()} with an argument of @samp{*}.
+@end deftypefun
+
+@deftypefun int rl_completion_mode (rl_command_func_t *cfunc)
+Returns the apppriate value to pass to @code{rl_complete_internal()}
+depending on whether @var{cfunc} was called twice in succession and
+the values of the @code{show-all-if-ambiguous} and
+@code{show-all-if-unmodified} variables.
+Application-specific completion functions may use this function to present
+the same interface as @code{rl_complete()}.
+@end deftypefun
+
+@deftypefun {char **} rl_completion_matches (const char *text, rl_compentry_func_t *entry_func)
+Returns an array of strings which is a list of completions for
+@var{text}.  If there are no completions, returns @code{NULL}.
+The first entry in the returned array is the substitution for @var{text}.
+The remaining entries are the possible completions.  The array is
+terminated with a @code{NULL} pointer.
+
+@var{entry_func} is a function of two args, and returns a
+@code{char *}.  The first argument is @var{text}.  The second is a
+state argument; it is zero on the first call, and non-zero on subsequent
+calls.  @var{entry_func} returns a @code{NULL}  pointer to the caller
+when there are no more matches.
+@end deftypefun
+
+@deftypefun {char *} rl_filename_completion_function (const char *text, int state)
+A generator function for filename completion in the general case.
+@var{text} is a partial filename.
+The Bash source is a useful reference for writing application-specific
+completion functions (the Bash completion functions call this and other
+Readline functions).
+@end deftypefun
+
+@deftypefun {char *} rl_username_completion_function (const char *text, int state)
+A completion generator for usernames.  @var{text} contains a partial
+username preceded by a random character (usually @samp{~}).  As with all
+completion generators, @var{state} is zero on the first call and non-zero
+for subsequent calls.
+@end deftypefun
+
+@node Completion Variables
+@subsection Completion Variables
+
+@deftypevar {rl_compentry_func_t *} rl_completion_entry_function
+A pointer to the generator function for @code{rl_completion_matches()}.
+@code{NULL} means to use @code{rl_filename_completion_function()},
+the default filename completer.
+@end deftypevar
+
+@deftypevar {rl_completion_func_t *} rl_attempted_completion_function
+A pointer to an alternative function to create matches.
+The function is called with @var{text}, @var{start}, and @var{end}.
+@var{start} and @var{end} are indices in @code{rl_line_buffer} defining
+the boundaries of @var{text}, which is a character string.
+If this function exists and returns @code{NULL}, or if this variable is
+set to @code{NULL}, then @code{rl_complete()} will call the value of
+@code{rl_completion_entry_function} to generate matches, otherwise the
+array of strings returned will be used.
+If this function sets the @code{rl_attempted_completion_over}
+variable to a non-zero value, Readline will not perform its default
+completion even if this function returns no matches.
+@end deftypevar
+
+@deftypevar {rl_quote_func_t *} rl_filename_quoting_function
+A pointer to a function that will quote a filename in an
+application-specific fashion.  This is called if filename completion is being
+attempted and one of the characters in @code{rl_filename_quote_characters}
+appears in a completed filename.  The function is called with
+@var{text}, @var{match_type}, and @var{quote_pointer}.  The @var{text}
+is the filename to be quoted.  The @var{match_type} is either
+@code{SINGLE_MATCH}, if there is only one completion match, or
+@code{MULT_MATCH}.  Some functions use this to decide whether or not to
+insert a closing quote character.  The @var{quote_pointer} is a pointer
+to any opening quote character the user typed.  Some functions choose
+to reset this character.
+@end deftypevar
+
+@deftypevar {rl_dequote_func_t *} rl_filename_dequoting_function
+A pointer to a function that will remove application-specific quoting
+characters from a filename before completion is attempted, so those
+characters do not interfere with matching the text against names in
+the filesystem.  It is called with @var{text}, the text of the word
+to be dequoted, and @var{quote_char}, which is the quoting character 
+that delimits the filename (usually @samp{'} or @samp{"}).  If
+@var{quote_char} is zero, the filename was not in an embedded string.
+@end deftypevar
+
+@deftypevar {rl_linebuf_func_t *} rl_char_is_quoted_p
+A pointer to a function to call that determines whether or not a specific
+character in the line buffer is quoted, according to whatever quoting
+mechanism the program calling Readline uses.  The function is called with
+two arguments: @var{text}, the text of the line, and @var{index}, the
+index of the character in the line.  It is used to decide whether a
+character found in @code{rl_completer_word_break_characters} should be
+used to break words for the completer.
+@end deftypevar
+
+@deftypevar {rl_compignore_func_t *} rl_ignore_some_completions_function
+This function, if defined, is called by the completer when real filename
+completion is done, after all the matching names have been generated.
+It is passed a @code{NULL} terminated array of matches.
+The first element (@code{matches[0]}) is the
+maximal substring common to all matches. This function can
+re-arrange the list of matches as required, but each element deleted
+from the array must be freed.
+@end deftypevar
+
+@deftypevar {rl_icppfunc_t *} rl_directory_completion_hook
+This function, if defined, is allowed to modify the directory portion
+of filenames Readline completes.  It is called with the address of a
+string (the current directory name) as an argument, and may modify that string.
+If the string is replaced with a new string, the old value should be freed.
+Any modified directory name should have a trailing slash.
+The modified value will be displayed as part of the completion, replacing
+the directory portion of the pathname the user typed.
+It returns an integer that should be non-zero if the function modifies
+its directory argument.
+It could be used to expand symbolic links or shell variables in pathnames.
+At the least, even if no other expansion is performed, this function should
+remove any quote characters from the directory name, because its result will
+be passed directly to @code{opendir()}.
+@end deftypevar
+
+@deftypevar {rl_compdisp_func_t *} rl_completion_display_matches_hook
+If non-zero, then this is the address of a function to call when
+completing a word would normally display the list of possible matches.
+This function is called in lieu of Readline displaying the list.
+It takes three arguments:
+(@code{char **}@var{matches}, @code{int} @var{num_matches}, @code{int} @var{max_length})
+where @var{matches} is the array of matching strings,
+@var{num_matches} is the number of strings in that array, and
+@var{max_length} is the length of the longest string in that array.
+Readline provides a convenience function, @code{rl_display_match_list},
+that takes care of doing the display to Readline's output stream.  That
+function may be called from this hook.
+@end deftypevar
+
+@deftypevar {const char *} rl_basic_word_break_characters
+The basic list of characters that signal a break between words for the
+completer routine.  The default value of this variable is the characters
+which break words for completion in Bash:
+@code{" \t\n\"\\'`@@$><=;|&@{("}.
+@end deftypevar
+
+@deftypevar {const char *} rl_basic_quote_characters
+A list of quote characters which can cause a word break.
+@end deftypevar
+
+@deftypevar {const char *} rl_completer_word_break_characters
+The list of characters that signal a break between words for
+@code{rl_complete_internal()}.  The default list is the value of
+@code{rl_basic_word_break_characters}.
+@end deftypevar
+
+@deftypevar {rl_cpvfunc_t *} rl_completion_word_break_hook
+If non-zero, this is the address of a function to call when Readline is
+deciding where to separate words for word completion.  It should return
+a character string like @code{rl_completer_word_break_characters} to be
+used to perform the current completion.  The function may choose to set
+@code{rl_completer_word_break_characters} itself.  If the function
+returns @code{NULL}, @code{rl_completer_word_break_characters} is used.
+@end deftypevar
+
+@deftypevar {const char *} rl_completer_quote_characters
+A list of characters which can be used to quote a substring of the line.
+Completion occurs on the entire substring, and within the substring
+@code{rl_completer_word_break_characters} are treated as any other character,
+unless they also appear within this list.
+@end deftypevar
+
+@deftypevar {const char *} rl_filename_quote_characters
+A list of characters that cause a filename to be quoted by the completer
+when they appear in a completed filename.  The default is the null string.
+@end deftypevar
+
+@deftypevar {const char *} rl_special_prefixes
+The list of characters that are word break characters, but should be
+left in @var{text} when it is passed to the completion function.
+Programs can use this to help determine what kind of completing to do.
+For instance, Bash sets this variable to "$@@" so that it can complete
+shell variables and hostnames.
+@end deftypevar
+
+@deftypevar int rl_completion_query_items
+Up to this many items will be displayed in response to a
+possible-completions call.  After that, readline asks the user if she is sure
+she wants to see them all.  The default value is 100.  A negative value 
+indicates that Readline should never ask the user.
+@end deftypevar
+
+@deftypevar {int} rl_completion_append_character
+When a single completion alternative matches at the end of the command
+line, this character is appended to the inserted completion text.  The
+default is a space character (@samp{ }).  Setting this to the null
+character (@samp{\0}) prevents anything being appended automatically.
+This can be changed in application-specific completion functions to
+provide the ``most sensible word separator character'' according to
+an application-specific command line syntax specification.
+@end deftypevar
+
+@deftypevar int rl_completion_suppress_append
+If non-zero, @var{rl_completion_append_character} is not appended to
+matches at the end of the command line, as described above.
+It is set to 0 before any application-specific completion function
+is called, and may only be changed within such a function.
+@end deftypevar
+
+@deftypevar int rl_completion_quote_character
+When Readline is completing quoted text, as delimited by one of the
+characters in @var{rl_completer_quote_characters}, it sets this variable
+to the quoting character found.
+This is set before any application-specific completion function is called.
+@end deftypevar
+
+@deftypevar int rl_completion_suppress_quote
+If non-zero, Readline does not append a matching quote character when
+performing completion on a quoted string.
+It is set to 0 before any application-specific completion function
+is called, and may only be changed within such a function.
+@end deftypevar
+
+@deftypevar int rl_completion_found_quote
+When Readline is completing quoted text, it sets this variable
+to a non-zero value if the word being completed contains or is delimited
+by any quoting characters, including backslashes.
+This is set before any application-specific completion function is called.
+@end deftypevar
+
+@deftypevar int rl_completion_mark_symlink_dirs
+If non-zero, a slash will be appended to completed filenames that are
+symbolic links to directory names, subject to the value of the
+user-settable @var{mark-directories} variable.
+This variable exists so that application-specific completion functions
+can override the user's global preference (set via the
+@var{mark-symlinked-directories} Readline variable) if appropriate.
+This variable is set to the user's preference before any
+application-specific completion function is called, so unless that
+function modifies the value, the user's preferences are honored.
+@end deftypevar
+
+@deftypevar int rl_ignore_completion_duplicates
+If non-zero, then duplicates in the matches are removed.
+The default is 1.
+@end deftypevar
+
+@deftypevar int rl_filename_completion_desired
+Non-zero means that the results of the matches are to be treated as
+filenames.  This is @emph{always} zero when completion is attempted,
+and can only be changed
+within an application-specific completion function.  If it is set to a
+non-zero value by such a function, directory names have a slash appended
+and Readline attempts to quote completed filenames if they contain any
+characters in @code{rl_filename_quote_characters} and
+@code{rl_filename_quoting_desired} is set to a non-zero value.
+@end deftypevar
+
+@deftypevar int rl_filename_quoting_desired
+Non-zero means that the results of the matches are to be quoted using
+double quotes (or an application-specific quoting mechanism) if the
+completed filename contains any characters in
+@code{rl_filename_quote_chars}.  This is @emph{always} non-zero
+when completion is attempted, and can only be changed within an
+application-specific completion function.
+The quoting is effected via a call to the function pointed to
+by @code{rl_filename_quoting_function}.
+@end deftypevar
+
+@deftypevar int rl_attempted_completion_over
+If an application-specific completion function assigned to
+@code{rl_attempted_completion_function} sets this variable to a non-zero
+value, Readline will not perform its default filename completion even
+if the application's completion function returns no matches.
+It should be set only by an application's completion function.
+@end deftypevar
+
+@deftypevar int rl_completion_type
+Set to a character describing the type of completion Readline is currently
+attempting; see the description of @code{rl_complete_internal()}
+(@pxref{Completion Functions}) for the list of characters.
+This is set to the appropriate value before any application-specific
+completion function is called, allowing such functions to present
+the same interface as @code{rl_complete()}.
+@end deftypevar
+
+@deftypevar int rl_inhibit_completion
+If this variable is non-zero, completion is inhibited.  The completion
+character will be inserted as any other bound to @code{self-insert}.
+@end deftypevar
+
+@node A Short Completion Example
+@subsection A Short Completion Example
+
+Here is a small application demonstrating the use of the GNU Readline
+library.  It is called @code{fileman}, and the source code resides in
+@file{examples/fileman.c}.  This sample application provides
+completion of command names, line editing features, and access to the
+history list.
+
+@page
+@smallexample
+/* fileman.c -- A tiny application which demonstrates how to use the
+   GNU Readline library.  This application interactively allows users
+   to manipulate files and their modes. */
+
+#include <stdio.h>
+#include <sys/types.h>
+#include <sys/file.h>
+#include <sys/stat.h>
+#include <sys/errno.h>
+
+#include <readline/readline.h>
+#include <readline/history.h>
+
+extern char *xmalloc ();
+
+/* The names of functions that actually do the manipulation. */
+int com_list __P((char *));
+int com_view __P((char *));
+int com_rename __P((char *));
+int com_stat __P((char *));
+int com_pwd __P((char *));
+int com_delete __P((char *));
+int com_help __P((char *));
+int com_cd __P((char *));
+int com_quit __P((char *));
+
+/* A structure which contains information on the commands this program
+   can understand. */
+
+typedef struct @{
+  char *name;                  /* User printable name of the function. */
+  rl_icpfunc_t *func;          /* Function to call to do the job. */
+  char *doc;                   /* Documentation for this function.  */
+@} COMMAND;
+
+COMMAND commands[] = @{
+  @{ "cd", com_cd, "Change to directory DIR" @},
+  @{ "delete", com_delete, "Delete FILE" @},
+  @{ "help", com_help, "Display this text" @},
+  @{ "?", com_help, "Synonym for `help'" @},
+  @{ "list", com_list, "List files in DIR" @},
+  @{ "ls", com_list, "Synonym for `list'" @},
+  @{ "pwd", com_pwd, "Print the current working directory" @},
+  @{ "quit", com_quit, "Quit using Fileman" @},
+  @{ "rename", com_rename, "Rename FILE to NEWNAME" @},
+  @{ "stat", com_stat, "Print out statistics on FILE" @},
+  @{ "view", com_view, "View the contents of FILE" @},
+  @{ (char *)NULL, (rl_icpfunc_t *)NULL, (char *)NULL @}
+@};
+
+/* Forward declarations. */
+char *stripwhite ();
+COMMAND *find_command ();
+
+/* The name of this program, as taken from argv[0]. */
+char *progname;
+
+/* When non-zero, this means the user is done using this program. */
+int done;
+
+char *
+dupstr (s)
+     int s;
+@{
+  char *r;
+
+  r = xmalloc (strlen (s) + 1);
+  strcpy (r, s);
+  return (r);
+@}
+
+main (argc, argv)
+     int argc;
+     char **argv;
+@{
+  char *line, *s;
+
+  progname = argv[0];
+
+  initialize_readline ();      /* Bind our completer. */
+
+  /* Loop reading and executing lines until the user quits. */
+  for ( ; done == 0; )
+    @{
+      line = readline ("FileMan: ");
+
+      if (!line)
+        break;
+
+      /* Remove leading and trailing whitespace from the line.
+         Then, if there is anything left, add it to the history list
+         and execute it. */
+      s = stripwhite (line);
+
+      if (*s)
+        @{
+          add_history (s);
+          execute_line (s);
+        @}
+
+      free (line);
+    @}
+  exit (0);
+@}
+
+/* Execute a command line. */
+int
+execute_line (line)
+     char *line;
+@{
+  register int i;
+  COMMAND *command;
+  char *word;
+
+  /* Isolate the command word. */
+  i = 0;
+  while (line[i] && whitespace (line[i]))
+    i++;
+  word = line + i;
+
+  while (line[i] && !whitespace (line[i]))
+    i++;
+
+  if (line[i])
+    line[i++] = '\0';
+
+  command = find_command (word);
+
+  if (!command)
+    @{
+      fprintf (stderr, "%s: No such command for FileMan.\n", word);
+      return (-1);
+    @}
+
+  /* Get argument to command, if any. */
+  while (whitespace (line[i]))
+    i++;
+
+  word = line + i;
+
+  /* Call the function. */
+  return ((*(command->func)) (word));
+@}
+
+/* Look up NAME as the name of a command, and return a pointer to that
+   command.  Return a NULL pointer if NAME isn't a command name. */
+COMMAND *
+find_command (name)
+     char *name;
+@{
+  register int i;
+
+  for (i = 0; commands[i].name; i++)
+    if (strcmp (name, commands[i].name) == 0)
+      return (&commands[i]);
+
+  return ((COMMAND *)NULL);
+@}
+
+/* Strip whitespace from the start and end of STRING.  Return a pointer
+   into STRING. */
+char *
+stripwhite (string)
+     char *string;
+@{
+  register char *s, *t;
+
+  for (s = string; whitespace (*s); s++)
+    ;
+    
+  if (*s == 0)
+    return (s);
+
+  t = s + strlen (s) - 1;
+  while (t > s && whitespace (*t))
+    t--;
+  *++t = '\0';
+
+  return s;
+@}
+
+/* **************************************************************** */
+/*                                                                  */
+/*                  Interface to Readline Completion                */
+/*                                                                  */
+/* **************************************************************** */
+
+char *command_generator __P((const char *, int));
+char **fileman_completion __P((const char *, int, int));
+
+/* Tell the GNU Readline library how to complete.  We want to try to
+   complete on command names if this is the first word in the line, or
+   on filenames if not. */
+initialize_readline ()
+@{
+  /* Allow conditional parsing of the ~/.inputrc file. */
+  rl_readline_name = "FileMan";
+
+  /* Tell the completer that we want a crack first. */
+  rl_attempted_completion_function = fileman_completion;
+@}
+
+/* Attempt to complete on the contents of TEXT.  START and END
+   bound the region of rl_line_buffer that contains the word to
+   complete.  TEXT is the word to complete.  We can use the entire
+   contents of rl_line_buffer in case we want to do some simple
+   parsing.  Returnthe array of matches, or NULL if there aren't any. */
+char **
+fileman_completion (text, start, end)
+     const char *text;
+     int start, end;
+@{
+  char **matches;
+
+  matches = (char **)NULL;
+
+  /* If this word is at the start of the line, then it is a command
+     to complete.  Otherwise it is the name of a file in the current
+     directory. */
+  if (start == 0)
+    matches = rl_completion_matches (text, command_generator);
+
+  return (matches);
+@}
+
+/* Generator function for command completion.  STATE lets us
+   know whether to start from scratch; without any state
+   (i.e. STATE == 0), then we start at the top of the list. */
+char *
+command_generator (text, state)
+     const char *text;
+     int state;
+@{
+  static int list_index, len;
+  char *name;
+
+  /* If this is a new word to complete, initialize now.  This
+     includes saving the length of TEXT for efficiency, and
+     initializing the index variable to 0. */
+  if (!state)
+    @{
+      list_index = 0;
+      len = strlen (text);
+    @}
+
+  /* Return the next name which partially matches from the
+     command list. */
+  while (name = commands[list_index].name)
+    @{
+      list_index++;
+
+      if (strncmp (name, text, len) == 0)
+        return (dupstr(name));
+    @}
+
+  /* If no names matched, then return NULL. */
+  return ((char *)NULL);
+@}
+
+/* **************************************************************** */
+/*                                                                  */
+/*                       FileMan Commands                           */
+/*                                                                  */
+/* **************************************************************** */
+
+/* String to pass to system ().  This is for the LIST, VIEW and RENAME
+   commands. */
+static char syscom[1024];
+
+/* List the file(s) named in arg. */
+com_list (arg)
+     char *arg;
+@{
+  if (!arg)
+    arg = "";
+
+  sprintf (syscom, "ls -FClg %s", arg);
+  return (system (syscom));
+@}
+
+com_view (arg)
+     char *arg;
+@{
+  if (!valid_argument ("view", arg))
+    return 1;
+
+  sprintf (syscom, "more %s", arg);
+  return (system (syscom));
+@}
+
+com_rename (arg)
+     char *arg;
+@{
+  too_dangerous ("rename");
+  return (1);
+@}
+
+com_stat (arg)
+     char *arg;
+@{
+  struct stat finfo;
+
+  if (!valid_argument ("stat", arg))
+    return (1);
+
+  if (stat (arg, &finfo) == -1)
+    @{
+      perror (arg);
+      return (1);
+    @}
+
+  printf ("Statistics for `%s':\n", arg);
+
+  printf ("%s has %d link%s, and is %d byte%s in length.\n", arg,
+          finfo.st_nlink,
+          (finfo.st_nlink == 1) ? "" : "s",
+          finfo.st_size,
+          (finfo.st_size == 1) ? "" : "s");
+  printf ("Inode Last Change at: %s", ctime (&finfo.st_ctime));
+  printf ("      Last access at: %s", ctime (&finfo.st_atime));
+  printf ("    Last modified at: %s", ctime (&finfo.st_mtime));
+  return (0);
+@}
+
+com_delete (arg)
+     char *arg;
+@{
+  too_dangerous ("delete");
+  return (1);
+@}
+
+/* Print out help for ARG, or for all of the commands if ARG is
+   not present. */
+com_help (arg)
+     char *arg;
+@{
+  register int i;
+  int printed = 0;
+
+  for (i = 0; commands[i].name; i++)
+    @{
+      if (!*arg || (strcmp (arg, commands[i].name) == 0))
+        @{
+          printf ("%s\t\t%s.\n", commands[i].name, commands[i].doc);
+          printed++;
+        @}
+    @}
+
+  if (!printed)
+    @{
+      printf ("No commands match `%s'.  Possibilties are:\n", arg);
+
+      for (i = 0; commands[i].name; i++)
+        @{
+          /* Print in six columns. */
+          if (printed == 6)
+            @{
+              printed = 0;
+              printf ("\n");
+            @}
+
+          printf ("%s\t", commands[i].name);
+          printed++;
+        @}
+
+      if (printed)
+        printf ("\n");
+    @}
+  return (0);
+@}
+
+/* Change to the directory ARG. */
+com_cd (arg)
+     char *arg;
+@{
+  if (chdir (arg) == -1)
+    @{
+      perror (arg);
+      return 1;
+    @}
+
+  com_pwd ("");
+  return (0);
+@}
+
+/* Print out the current working directory. */
+com_pwd (ignore)
+     char *ignore;
+@{
+  char dir[1024], *s;
+
+  s = getcwd (dir, sizeof(dir) - 1);
+  if (s == 0)
+    @{
+      printf ("Error getting pwd: %s\n", dir);
+      return 1;
+    @}
+
+  printf ("Current directory is %s\n", dir);
+  return 0;
+@}
+
+/* The user wishes to quit using this program.  Just set DONE
+   non-zero. */
+com_quit (arg)
+     char *arg;
+@{
+  done = 1;
+  return (0);
+@}
+
+/* Function which tells you that you can't do this. */
+too_dangerous (caller)
+     char *caller;
+@{
+  fprintf (stderr,
+           "%s: Too dangerous for me to distribute.\n",
+           caller);
+  fprintf (stderr, "Write it yourself.\n");
+@}
+
+/* Return non-zero if ARG is a valid argument for CALLER,
+   else print an error message and return zero. */
+int
+valid_argument (caller, arg)
+     char *caller, *arg;
+@{
+  if (!arg || !*arg)
+    @{
+      fprintf (stderr, "%s: Argument required.\n", caller);
+      return (0);
+    @}
+
+  return (1);
+@}
+@end smallexample
diff --git a/doc/rluser.texi b/doc/rluser.texi
new file mode 100644 (file)
index 0000000..5c6467a
--- /dev/null
@@ -0,0 +1,1850 @@
+@comment %**start of header (This is for running Texinfo on a region.)
+@setfilename rluser.info
+@comment %**end of header (This is for running Texinfo on a region.)
+@setchapternewpage odd
+
+@ignore
+This file documents the end user interface to the GNU command line
+editing features.  It is to be an appendix to manuals for programs which
+use these features.  There is a document entitled "readline.texinfo"
+which contains both end-user and programmer documentation for the
+GNU Readline Library.
+
+Copyright (C) 1988-2006 Free Software Foundation, Inc.
+
+Authored by Brian Fox and Chet Ramey.
+
+Permission is granted to process this file through Tex and print the
+results, provided the printed document carries copying permission notice
+identical to this one except for the removal of this paragraph (this
+paragraph not being relevant to the printed manual).
+
+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
+GNU Copyright statement is available to the distributee, 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.
+@end ignore
+
+@comment If you are including this manual as an appendix, then set the
+@comment variable readline-appendix.
+
+@ifclear BashFeatures
+@defcodeindex bt
+@end ifclear
+
+@node Command Line Editing
+@chapter Command Line Editing
+
+This chapter describes the basic features of the @sc{gnu}
+command line editing interface.
+@ifset BashFeatures
+Command line editing is provided by the Readline library, which is
+used by several different programs, including Bash.
+@end ifset
+
+@menu
+* Introduction and Notation::  Notation used in this text.
+* Readline Interaction::       The minimum set of commands for editing a line.
+* Readline Init File::         Customizing Readline from a user's view.
+* Bindable Readline Commands:: A description of most of the Readline commands
+                               available for binding
+* Readline vi Mode::           A short description of how to make Readline
+                               behave like the vi editor.
+@ifset BashFeatures
+* Programmable Completion::    How to specify the possible completions for
+                               a specific command.
+* Programmable Completion Builtins::   Builtin commands to specify how to
+                               complete arguments for a particular command.
+@end ifset
+@end menu
+
+@node Introduction and Notation
+@section Introduction to Line Editing
+
+The following paragraphs describe the notation used to represent
+keystrokes.
+
+The text @kbd{C-k} is read as `Control-K' and describes the character
+produced when the @key{k} key is pressed while the Control key
+is depressed.
+
+The text @kbd{M-k} is read as `Meta-K' and describes the character
+produced when the Meta key (if you have one) is depressed, and the @key{k}
+key is pressed.
+The Meta key is labeled @key{ALT} on many keyboards.
+On keyboards with two keys labeled @key{ALT} (usually to either side of
+the space bar), the @key{ALT} on the left side is generally set to
+work as a Meta key.
+The @key{ALT} key on the right may also be configured to work as a
+Meta key or may be configured as some other modifier, such as a
+Compose key for typing accented characters.
+
+If you do not have a Meta or @key{ALT} key, or another key working as
+a Meta key, the identical keystroke can be generated by typing @key{ESC}
+@emph{first}, and then typing @key{k}.
+Either process is known as @dfn{metafying} the @key{k} key.
+
+The text @kbd{M-C-k} is read as `Meta-Control-k' and describes the
+character produced by @dfn{metafying} @kbd{C-k}.
+
+In addition, several keys have their own names.  Specifically,
+@key{DEL}, @key{ESC}, @key{LFD}, @key{SPC}, @key{RET}, and @key{TAB} all
+stand for themselves when seen in this text, or in an init file
+(@pxref{Readline Init File}).
+If your keyboard lacks a @key{LFD} key, typing @key{C-j} will
+produce the desired character.
+The @key{RET} key may be labeled @key{Return} or @key{Enter} on
+some keyboards.
+
+@node Readline Interaction
+@section Readline Interaction
+@cindex interaction, readline
+
+Often during an interactive session you type in a long line of text,
+only to notice that the first word on the line is misspelled.  The
+Readline library gives you a set of commands for manipulating the text
+as you type it in, allowing you to just fix your typo, and not forcing
+you to retype the majority of the line.  Using these editing commands,
+you move the cursor to the place that needs correction, and delete or
+insert the text of the corrections.  Then, when you are satisfied with
+the line, you simply press @key{RET}.  You do not have to be at the
+end of the line to press @key{RET}; the entire line is accepted
+regardless of the location of the cursor within the line.
+
+@menu
+* Readline Bare Essentials::   The least you need to know about Readline.
+* Readline Movement Commands:: Moving about the input line.
+* Readline Killing Commands::  How to delete text, and how to get it back!
+* Readline Arguments::         Giving numeric arguments to commands.
+* Searching::                  Searching through previous lines.
+@end menu
+
+@node Readline Bare Essentials
+@subsection Readline Bare Essentials
+@cindex notation, readline
+@cindex command editing
+@cindex editing command lines
+
+In order to enter characters into the line, simply type them.  The typed
+character appears where the cursor was, and then the cursor moves one
+space to the right.  If you mistype a character, you can use your
+erase character to back up and delete the mistyped character.
+
+Sometimes you may mistype a character, and
+not notice the error until you have typed several other characters.  In
+that case, you can type @kbd{C-b} to move the cursor to the left, and then
+correct your mistake.  Afterwards, you can move the cursor to the right
+with @kbd{C-f}.
+
+When you add text in the middle of a line, you will notice that characters
+to the right of the cursor are `pushed over' to make room for the text
+that you have inserted.  Likewise, when you delete text behind the cursor,
+characters to the right of the cursor are `pulled back' to fill in the
+blank space created by the removal of the text.  A list of the bare
+essentials for editing the text of an input line follows.
+
+@table @asis
+@item @kbd{C-b}
+Move back one character.
+@item @kbd{C-f}
+Move forward one character.
+@item @key{DEL} or @key{Backspace}
+Delete the character to the left of the cursor.
+@item @kbd{C-d}
+Delete the character underneath the cursor.
+@item @w{Printing characters}
+Insert the character into the line at the cursor.
+@item @kbd{C-_} or @kbd{C-x C-u}
+Undo the last editing command.  You can undo all the way back to an
+empty line.
+@end table
+
+@noindent
+(Depending on your configuration, the @key{Backspace} key be set to
+delete the character to the left of the cursor and the @key{DEL} key set
+to delete the character underneath the cursor, like @kbd{C-d}, rather
+than the character to the left of the cursor.)
+
+@node Readline Movement Commands
+@subsection Readline Movement Commands
+
+
+The above table describes the most basic keystrokes that you need
+in order to do editing of the input line.  For your convenience, many
+other commands have been added in addition to @kbd{C-b}, @kbd{C-f},
+@kbd{C-d}, and @key{DEL}.  Here are some commands for moving more rapidly
+about the line.
+
+@table @kbd
+@item C-a
+Move to the start of the line.
+@item C-e
+Move to the end of the line.
+@item M-f
+Move forward a word, where a word is composed of letters and digits.
+@item M-b
+Move backward a word.
+@item C-l
+Clear the screen, reprinting the current line at the top.
+@end table
+
+Notice how @kbd{C-f} moves forward a character, while @kbd{M-f} moves
+forward a word.  It is a loose convention that control keystrokes
+operate on characters while meta keystrokes operate on words.
+
+@node Readline Killing Commands
+@subsection Readline Killing Commands
+
+@cindex killing text
+@cindex yanking text
+
+@dfn{Killing} text means to delete the text from the line, but to save
+it away for later use, usually by @dfn{yanking} (re-inserting)
+it back into the line.
+(`Cut' and `paste' are more recent jargon for `kill' and `yank'.)
+
+If the description for a command says that it `kills' text, then you can
+be sure that you can get the text back in a different (or the same)
+place later.
+
+When you use a kill command, the text is saved in a @dfn{kill-ring}.
+Any number of consecutive kills save all of the killed text together, so
+that when you yank it back, you get it all.  The kill
+ring is not line specific; the text that you killed on a previously
+typed line is available to be yanked back later, when you are typing
+another line.
+@cindex kill ring
+
+Here is the list of commands for killing text.
+
+@table @kbd
+@item C-k
+Kill the text from the current cursor position to the end of the line.
+
+@item M-d
+Kill from the cursor to the end of the current word, or, if between
+words, to the end of the next word.
+Word boundaries are the same as those used by @kbd{M-f}.
+
+@item M-@key{DEL}
+Kill from the cursor the start of the current word, or, if between
+words, to the start of the previous word.
+Word boundaries are the same as those used by @kbd{M-b}.
+
+@item C-w
+Kill from the cursor to the previous whitespace.  This is different than
+@kbd{M-@key{DEL}} because the word boundaries differ.
+
+@end table
+
+Here is how to @dfn{yank} the text back into the line.  Yanking
+means to copy the most-recently-killed text from the kill buffer.
+
+@table @kbd
+@item C-y
+Yank the most recently killed text back into the buffer at the cursor.
+
+@item M-y
+Rotate the kill-ring, and yank the new top.  You can only do this if
+the prior command is @kbd{C-y} or @kbd{M-y}.
+@end table
+
+@node Readline Arguments
+@subsection Readline Arguments
+
+You can pass numeric arguments to Readline commands.  Sometimes the
+argument acts as a repeat count, other times it is the @i{sign} of the
+argument that is significant.  If you pass a negative argument to a
+command which normally acts in a forward direction, that command will
+act in a backward direction.  For example, to kill text back to the
+start of the line, you might type @samp{M-- C-k}.
+
+The general way to pass numeric arguments to a command is to type meta
+digits before the command.  If the first `digit' typed is a minus
+sign (@samp{-}), then the sign of the argument will be negative.  Once
+you have typed one meta digit to get the argument started, you can type
+the remainder of the digits, and then the command.  For example, to give
+the @kbd{C-d} command an argument of 10, you could type @samp{M-1 0 C-d},
+which will delete the next ten characters on the input line.
+
+@node Searching
+@subsection Searching for Commands in the History
+
+Readline provides commands for searching through the command history
+@ifset BashFeatures
+(@pxref{Bash History Facilities})
+@end ifset
+for lines containing a specified string.
+There are two search modes:  @dfn{incremental} and @dfn{non-incremental}.
+
+Incremental searches begin before the user has finished typing the
+search string.
+As each character of the search string is typed, Readline displays
+the next entry from the history matching the string typed so far.
+An incremental search requires only as many characters as needed to
+find the desired history entry.
+To search backward in the history for a particular string, type
+@kbd{C-r}.  Typing @kbd{C-s} searches forward through the history.
+The characters present in the value of the @code{isearch-terminators} variable
+are used to terminate an incremental search.
+If that variable has not been assigned a value, the @key{ESC} and
+@kbd{C-J} characters will terminate an incremental search.
+@kbd{C-g} will abort an incremental search and restore the original line.
+When the search is terminated, the history entry containing the
+search string becomes the current line.
+
+To find other matching entries in the history list, type @kbd{C-r} or
+@kbd{C-s} as appropriate.
+This will search backward or forward in the history for the next
+entry matching the search string typed so far.
+Any other key sequence bound to a Readline command will terminate
+the search and execute that command.
+For instance, a @key{RET} will terminate the search and accept
+the line, thereby executing the command from the history list.
+A movement command will terminate the search, make the last line found
+the current line, and begin editing.
+
+Readline remembers the last incremental search string.  If two
+@kbd{C-r}s are typed without any intervening characters defining a new
+search string, any remembered search string is used.
+
+Non-incremental searches read the entire search string before starting
+to search for matching history lines.  The search string may be
+typed by the user or be part of the contents of the current line.
+
+@node Readline Init File
+@section Readline Init File
+@cindex initialization file, readline
+
+Although the Readline library comes with a set of Emacs-like
+keybindings installed by default, it is possible to use a different set
+of keybindings.
+Any user can customize programs that use Readline by putting
+commands in an @dfn{inputrc} file, conventionally in his home directory.
+The name of this
+@ifset BashFeatures
+file is taken from the value of the shell variable @env{INPUTRC}.  If
+@end ifset
+@ifclear BashFeatures
+file is taken from the value of the environment variable @env{INPUTRC}.  If
+@end ifclear
+that variable is unset, the default is @file{~/.inputrc}.  If that
+file does not exist or cannot be read, the ultimate default is
+@file{/etc/inputrc}.
+
+When a program which uses the Readline library starts up, the
+init file is read, and the key bindings are set.
+
+In addition, the @code{C-x C-r} command re-reads this init file, thus
+incorporating any changes that you might have made to it.
+
+@menu
+* Readline Init File Syntax::  Syntax for the commands in the inputrc file.
+
+* Conditional Init Constructs::        Conditional key bindings in the inputrc file.
+
+* Sample Init File::           An example inputrc file.
+@end menu
+
+@node Readline Init File Syntax
+@subsection Readline Init File Syntax
+
+There are only a few basic constructs allowed in the
+Readline init file.  Blank lines are ignored.
+Lines beginning with a @samp{#} are comments.
+Lines beginning with a @samp{$} indicate conditional
+constructs (@pxref{Conditional Init Constructs}).  Other lines
+denote variable settings and key bindings.
+
+@table @asis
+@item Variable Settings
+You can modify the run-time behavior of Readline by
+altering the values of variables in Readline
+using the @code{set} command within the init file.
+The syntax is simple:
+
+@example
+set @var{variable} @var{value}
+@end example
+
+@noindent
+Here, for example, is how to
+change from the default Emacs-like key binding to use
+@code{vi} line editing commands:
+
+@example
+set editing-mode vi
+@end example
+
+Variable names and values, where appropriate, are recognized without regard
+to case.  Unrecognized variable names are ignored.
+
+Boolean variables (those that can be set to on or off) are set to on if
+the value is null or empty, @var{on} (case-insensitive), or 1.  Any other
+value results in the variable being set to off.
+
+@ifset BashFeatures
+The @w{@code{bind -V}} command lists the current Readline variable names
+and values.  @xref{Bash Builtins}.
+@end ifset
+
+A great deal of run-time behavior is changeable with the following
+variables.
+
+@cindex variables, readline
+@table @code
+
+@item bell-style
+@vindex bell-style
+Controls what happens when Readline wants to ring the terminal bell.
+If set to @samp{none}, Readline never rings the bell.  If set to
+@samp{visible}, Readline uses a visible bell if one is available.
+If set to @samp{audible} (the default), Readline attempts to ring
+the terminal's bell.
+
+@item bind-tty-special-chars
+@vindex bind-tty-special-chars
+If set to @samp{on}, Readline attempts to bind the control characters  
+treated specially by the kernel's terminal driver to their Readline
+equivalents.
+
+@item comment-begin
+@vindex comment-begin
+The string to insert at the beginning of the line when the
+@code{insert-comment} command is executed.  The default value
+is @code{"#"}.
+
+@item completion-ignore-case
+If set to @samp{on}, Readline performs filename matching and completion
+in a case-insensitive fashion.
+The default value is @samp{off}.
+
+@item completion-query-items
+@vindex completion-query-items
+The number of possible completions that determines when the user is
+asked whether the list of possibilities should be displayed.
+If the number of possible completions is greater than this value,
+Readline will ask the user whether or not he wishes to view
+them; otherwise, they are simply listed.
+This variable must be set to an integer value greater than or equal to 0.
+A negative value means Readline should never ask.
+The default limit is @code{100}.
+
+@item convert-meta
+@vindex convert-meta
+If set to @samp{on}, Readline will convert characters with the
+eighth bit set to an @sc{ascii} key sequence by stripping the eighth
+bit and prefixing an @key{ESC} character, converting them to a
+meta-prefixed key sequence.  The default value is @samp{on}.
+
+@item disable-completion
+@vindex disable-completion
+If set to @samp{On}, Readline will inhibit word completion.
+Completion  characters will be inserted into the line as if they had
+been mapped to @code{self-insert}.  The default is @samp{off}.
+
+@item editing-mode
+@vindex editing-mode
+The @code{editing-mode} variable controls which default set of
+key bindings is used.  By default, Readline starts up in Emacs editing
+mode, where the keystrokes are most similar to Emacs.  This variable can be
+set to either @samp{emacs} or @samp{vi}.
+
+@item enable-keypad
+@vindex enable-keypad
+When set to @samp{on}, Readline will try to enable the application
+keypad when it is called.  Some systems need this to enable the
+arrow keys.  The default is @samp{off}.
+
+@item expand-tilde
+@vindex expand-tilde
+If set to @samp{on}, tilde expansion is performed when Readline
+attempts word completion.  The default is @samp{off}.
+
+@item history-preserve-point
+@vindex history-preserve-point
+If set to @samp{on}, the history code attempts to place point at the
+same location on each history line retrieved with @code{previous-history}
+or @code{next-history}.  The default is @samp{off}.
+
+@item horizontal-scroll-mode
+@vindex horizontal-scroll-mode
+This variable can be set to either @samp{on} or @samp{off}.  Setting it
+to @samp{on} means that the text of the lines being edited will scroll
+horizontally on a single screen line when they are longer than the width
+of the screen, instead of wrapping onto a new screen line.  By default,
+this variable is set to @samp{off}.
+
+@item input-meta
+@vindex input-meta
+@vindex meta-flag
+If set to @samp{on}, Readline will enable eight-bit input (it
+will not clear the eighth bit in the characters it reads),
+regardless of what the terminal claims it can support.  The
+default value is @samp{off}.  The name @code{meta-flag} is a
+synonym for this variable.
+
+@item isearch-terminators
+@vindex isearch-terminators
+The string of characters that should terminate an incremental search without
+subsequently executing the character as a command (@pxref{Searching}).
+If this variable has not been given a value, the characters @key{ESC} and
+@kbd{C-J} will terminate an incremental search.
+
+@item keymap
+@vindex keymap
+Sets Readline's idea of the current keymap for key binding commands.
+Acceptable @code{keymap} names are
+@code{emacs},
+@code{emacs-standard},
+@code{emacs-meta},
+@code{emacs-ctlx},
+@code{vi},
+@code{vi-move},
+@code{vi-command}, and
+@code{vi-insert}.
+@code{vi} is equivalent to @code{vi-command}; @code{emacs} is
+equivalent to @code{emacs-standard}.  The default value is @code{emacs}.
+The value of the @code{editing-mode} variable also affects the
+default keymap.
+
+@item mark-directories
+If set to @samp{on}, completed directory names have a slash
+appended.  The default is @samp{on}.
+
+@item mark-modified-lines
+@vindex mark-modified-lines
+This variable, when set to @samp{on}, causes Readline to display an
+asterisk (@samp{*}) at the start of history lines which have been modified.
+This variable is @samp{off} by default.
+
+@item mark-symlinked-directories
+@vindex mark-symlinked-directories
+If set to @samp{on}, completed names which are symbolic links
+to directories have a slash appended (subject to the value of
+@code{mark-directories}).
+The default is @samp{off}.
+
+@item match-hidden-files
+@vindex match-hidden-files
+This variable, when set to @samp{on}, causes Readline to match files whose
+names begin with a @samp{.} (hidden files) when performing filename
+completion, unless the leading @samp{.} is
+supplied by the user in the filename to be completed.
+This variable is @samp{on} by default.
+
+@item output-meta
+@vindex output-meta
+If set to @samp{on}, Readline will display characters with the
+eighth bit set directly rather than as a meta-prefixed escape
+sequence.  The default is @samp{off}.
+
+@item page-completions
+@vindex page-completions
+If set to @samp{on}, Readline uses an internal @code{more}-like pager
+to display a screenful of possible completions at a time.
+This variable is @samp{on} by default.
+
+@item print-completions-horizontally
+If set to @samp{on}, Readline will display completions with matches
+sorted horizontally in alphabetical order, rather than down the screen.
+The default is @samp{off}.
+
+@item show-all-if-ambiguous
+@vindex show-all-if-ambiguous
+This alters the default behavior of the completion functions.  If
+set to @samp{on}, 
+words which have more than one possible completion cause the
+matches to be listed immediately instead of ringing the bell.
+The default value is @samp{off}.
+
+@item show-all-if-unmodified
+@vindex show-all-if-unmodified
+This alters the default behavior of the completion functions in
+a fashion similar to @var{show-all-if-ambiguous}.
+If set to @samp{on}, 
+words which have more than one possible completion without any
+possible partial completion (the possible completions don't share
+a common prefix) cause the matches to be listed immediately instead
+of ringing the bell.
+The default value is @samp{off}.
+
+@item visible-stats
+@vindex visible-stats
+If set to @samp{on}, a character denoting a file's type
+is appended to the filename when listing possible
+completions.  The default is @samp{off}.
+
+@end table
+
+@item Key Bindings
+The syntax for controlling key bindings in the init file is
+simple.  First you need to find the name of the command that you
+want to change.  The following sections contain tables of the command
+name, the default keybinding, if any, and a short description of what
+the command does.
+
+Once you know the name of the command, simply place on a line
+in the init file the name of the key
+you wish to bind the command to, a colon, and then the name of the
+command.
+There can be no space between the key name and the colon -- that will be
+interpreted as part of the key name.
+The name of the key can be expressed in different ways, depending on
+what you find most comfortable.
+
+In addition to command names, readline allows keys to be bound
+to a string that is inserted when the key is pressed (a @var{macro}).
+
+@ifset BashFeatures
+The @w{@code{bind -p}} command displays Readline function names and
+bindings in a format that can put directly into an initialization file.
+@xref{Bash Builtins}.
+@end ifset
+
+@table @asis
+@item @w{@var{keyname}: @var{function-name} or @var{macro}}
+@var{keyname} is the name of a key spelled out in English.  For example:
+@example
+Control-u: universal-argument
+Meta-Rubout: backward-kill-word
+Control-o: "> output"
+@end example
+
+In the above example, @kbd{C-u} is bound to the function
+@code{universal-argument},
+@kbd{M-DEL} is bound to the function @code{backward-kill-word}, and
+@kbd{C-o} is bound to run the macro
+expressed on the right hand side (that is, to insert the text
+@samp{> output} into the line).
+
+A number of symbolic character names are recognized while
+processing this key binding syntax:
+@var{DEL},
+@var{ESC},
+@var{ESCAPE},
+@var{LFD},
+@var{NEWLINE},
+@var{RET},
+@var{RETURN},
+@var{RUBOUT},
+@var{SPACE},
+@var{SPC},
+and
+@var{TAB}.
+
+@item @w{"@var{keyseq}": @var{function-name} or @var{macro}}
+@var{keyseq} differs from @var{keyname} above in that strings
+denoting an entire key sequence can be specified, by placing
+the key sequence in double quotes.  Some @sc{gnu} Emacs style key
+escapes can be used, as in the following example, but the
+special character names are not recognized.
+
+@example
+"\C-u": universal-argument
+"\C-x\C-r": re-read-init-file
+"\e[11~": "Function Key 1"
+@end example
+
+In the above example, @kbd{C-u} is again bound to the function
+@code{universal-argument} (just as it was in the first example),
+@samp{@kbd{C-x} @kbd{C-r}} is bound to the function @code{re-read-init-file},
+and @samp{@key{ESC} @key{[} @key{1} @key{1} @key{~}} is bound to insert
+the text @samp{Function Key 1}.
+
+@end table
+
+The following @sc{gnu} Emacs style escape sequences are available when
+specifying key sequences:
+
+@table @code
+@item @kbd{\C-}
+control prefix
+@item @kbd{\M-}
+meta prefix
+@item @kbd{\e}
+an escape character
+@item @kbd{\\}
+backslash
+@item @kbd{\"}
+@key{"}, a double quotation mark
+@item @kbd{\'}
+@key{'}, a single quote or apostrophe
+@end table
+
+In addition to the @sc{gnu} Emacs style escape sequences, a second
+set of backslash escapes is available:
+
+@table @code
+@item \a
+alert (bell)
+@item \b
+backspace
+@item \d
+delete
+@item \f
+form feed
+@item \n
+newline
+@item \r
+carriage return
+@item \t
+horizontal tab
+@item \v
+vertical tab
+@item \@var{nnn}
+the eight-bit character whose value is the octal value @var{nnn}
+(one to three digits)
+@item \x@var{HH}
+the eight-bit character whose value is the hexadecimal value @var{HH}
+(one or two hex digits)
+@end table
+
+When entering the text of a macro, single or double quotes must
+be used to indicate a macro definition.
+Unquoted text is assumed to be a function name.
+In the macro body, the backslash escapes described above are expanded.
+Backslash will quote any other character in the macro text,
+including @samp{"} and @samp{'}.
+For example, the following binding will make @samp{@kbd{C-x} \}
+insert a single @samp{\} into the line:
+@example
+"\C-x\\": "\\"
+@end example
+
+@end table
+
+@node Conditional Init Constructs
+@subsection Conditional Init Constructs
+
+Readline implements a facility similar in spirit to the conditional
+compilation features of the C preprocessor which allows key
+bindings and variable settings to be performed as the result
+of tests.  There are four parser directives used.
+
+@table @code
+@item $if
+The @code{$if} construct allows bindings to be made based on the
+editing mode, the terminal being used, or the application using
+Readline.  The text of the test extends to the end of the line;
+no characters are required to isolate it.
+
+@table @code
+@item mode
+The @code{mode=} form of the @code{$if} directive is used to test
+whether Readline is in @code{emacs} or @code{vi} mode.
+This may be used in conjunction
+with the @samp{set keymap} command, for instance, to set bindings in
+the @code{emacs-standard} and @code{emacs-ctlx} keymaps only if
+Readline is starting out in @code{emacs} mode.
+
+@item term
+The @code{term=} form may be used to include terminal-specific
+key bindings, perhaps to bind the key sequences output by the
+terminal's function keys.  The word on the right side of the
+@samp{=} is tested against both the full name of the terminal and
+the portion of the terminal name before the first @samp{-}.  This
+allows @code{sun} to match both @code{sun} and @code{sun-cmd},
+for instance.
+
+@item application
+The @var{application} construct is used to include
+application-specific settings.  Each program using the Readline
+library sets the @var{application name}, and you can test for
+a particular value. 
+This could be used to bind key sequences to functions useful for
+a specific program.  For instance, the following command adds a
+key sequence that quotes the current or previous word in Bash:
+@example
+$if Bash
+# Quote the current or previous word
+"\C-xq": "\eb\"\ef\""
+$endif
+@end example
+@end table
+
+@item $endif
+This command, as seen in the previous example, terminates an
+@code{$if} command.
+
+@item $else
+Commands in this branch of the @code{$if} directive are executed if
+the test fails.
+
+@item $include
+This directive takes a single filename as an argument and reads commands
+and bindings from that file.
+For example, the following directive reads from @file{/etc/inputrc}:
+@example
+$include /etc/inputrc
+@end example
+@end table
+
+@node Sample Init File
+@subsection Sample Init File
+
+Here is an example of an @var{inputrc} file.  This illustrates key
+binding, variable assignment, and conditional syntax.
+
+@example
+@page
+# This file controls the behaviour of line input editing for
+# programs that use the GNU Readline library.  Existing
+# programs include FTP, Bash, and GDB.
+#
+# You can re-read the inputrc file with C-x C-r.
+# Lines beginning with '#' are comments.
+#
+# First, include any systemwide bindings and variable
+# assignments from /etc/Inputrc
+$include /etc/Inputrc
+
+#
+# Set various bindings for emacs mode.
+
+set editing-mode emacs 
+
+$if mode=emacs
+
+Meta-Control-h:        backward-kill-word      Text after the function name is ignored
+
+#
+# Arrow keys in keypad mode
+#
+#"\M-OD":        backward-char
+#"\M-OC":        forward-char
+#"\M-OA":        previous-history
+#"\M-OB":        next-history
+#
+# Arrow keys in ANSI mode
+#
+"\M-[D":        backward-char
+"\M-[C":        forward-char
+"\M-[A":        previous-history
+"\M-[B":        next-history
+#
+# Arrow keys in 8 bit keypad mode
+#
+#"\M-\C-OD":       backward-char
+#"\M-\C-OC":       forward-char
+#"\M-\C-OA":       previous-history
+#"\M-\C-OB":       next-history
+#
+# Arrow keys in 8 bit ANSI mode
+#
+#"\M-\C-[D":       backward-char
+#"\M-\C-[C":       forward-char
+#"\M-\C-[A":       previous-history
+#"\M-\C-[B":       next-history
+
+C-q: quoted-insert
+
+$endif
+
+# An old-style binding.  This happens to be the default.
+TAB: complete
+
+# Macros that are convenient for shell interaction
+$if Bash
+# edit the path
+"\C-xp": "PATH=$@{PATH@}\e\C-e\C-a\ef\C-f"
+# prepare to type a quoted word --
+# insert open and close double quotes
+# and move to just after the open quote
+"\C-x\"": "\"\"\C-b"
+# insert a backslash (testing backslash escapes
+# in sequences and macros)
+"\C-x\\": "\\"
+# Quote the current or previous word
+"\C-xq": "\eb\"\ef\""
+# Add a binding to refresh the line, which is unbound
+"\C-xr": redraw-current-line
+# Edit variable on current line.
+"\M-\C-v": "\C-a\C-k$\C-y\M-\C-e\C-a\C-y="
+$endif
+
+# use a visible bell if one is available
+set bell-style visible
+
+# don't strip characters to 7 bits when reading
+set input-meta on
+
+# allow iso-latin1 characters to be inserted rather
+# than converted to prefix-meta sequences
+set convert-meta off
+
+# display characters with the eighth bit set directly
+# rather than as meta-prefixed characters
+set output-meta on
+
+# if there are more than 150 possible completions for
+# a word, ask the user if he wants to see all of them
+set completion-query-items 150
+
+# For FTP
+$if Ftp
+"\C-xg": "get \M-?"
+"\C-xt": "put \M-?"
+"\M-.": yank-last-arg
+$endif
+@end example
+
+@node Bindable Readline Commands
+@section Bindable Readline Commands
+
+@menu
+* Commands For Moving::                Moving about the line.
+* Commands For History::       Getting at previous lines.
+* Commands For Text::          Commands for changing text.
+* Commands For Killing::       Commands for killing and yanking.
+* Numeric Arguments::          Specifying numeric arguments, repeat counts.
+* Commands For Completion::    Getting Readline to do the typing for you.
+* Keyboard Macros::            Saving and re-executing typed characters
+* Miscellaneous Commands::     Other miscellaneous commands.
+@end menu
+
+This section describes Readline commands that may be bound to key
+sequences.
+@ifset BashFeatures
+You can list your key bindings by executing
+@w{@code{bind -P}} or, for a more terse format, suitable for an
+@var{inputrc} file, @w{@code{bind -p}}.  (@xref{Bash Builtins}.)
+@end ifset
+Command names without an accompanying key sequence are unbound by default.
+
+In the following descriptions, @dfn{point} refers to the current cursor
+position, and @dfn{mark} refers to a cursor position saved by the
+@code{set-mark} command.
+The text between the point and mark is referred to as the @dfn{region}.
+
+@node Commands For Moving
+@subsection Commands For Moving
+@ftable @code
+@item beginning-of-line (C-a)
+Move to the start of the current line.
+
+@item end-of-line (C-e)
+Move to the end of the line.
+
+@item forward-char (C-f)
+Move forward a character.
+
+@item backward-char (C-b)
+Move back a character.
+
+@item forward-word (M-f)
+Move forward to the end of the next word.  Words are composed of
+letters and digits.
+
+@item backward-word (M-b)
+Move back to the start of the current or previous word.  Words are
+composed of letters and digits.
+
+@item clear-screen (C-l)
+Clear the screen and redraw the current line,
+leaving the current line at the top of the screen.
+
+@item redraw-current-line ()
+Refresh the current line.  By default, this is unbound.
+
+@end ftable
+
+@node Commands For History
+@subsection Commands For Manipulating The History
+
+@ftable @code
+@item accept-line (Newline or Return)
+@ifset BashFeatures
+Accept the line regardless of where the cursor is.
+If this line is
+non-empty, add it to the history list according to the setting of
+the @env{HISTCONTROL} and @env{HISTIGNORE} variables.
+If this line is a modified history line, then restore the history line
+to its original state.
+@end ifset
+@ifclear BashFeatures
+Accept the line regardless of where the cursor is.
+If this line is
+non-empty, it may be added to the history list for future recall with
+@code{add_history()}.
+If this line is a modified history line, the history line is restored
+to its original state.
+@end ifclear
+
+@item previous-history (C-p)
+Move `back' through the history list, fetching the previous command.
+
+@item next-history (C-n)
+Move `forward' through the history list, fetching the next command.
+
+@item beginning-of-history (M-<)
+Move to the first line in the history.
+
+@item end-of-history (M->)
+Move to the end of the input history, i.e., the line currently
+being entered.
+
+@item reverse-search-history (C-r)
+Search backward starting at the current line and moving `up' through
+the history as necessary.  This is an incremental search.
+
+@item forward-search-history (C-s)
+Search forward starting at the current line and moving `down' through
+the the history as necessary.  This is an incremental search.
+
+@item non-incremental-reverse-search-history (M-p)
+Search backward starting at the current line and moving `up'
+through the history as necessary using a non-incremental search
+for a string supplied by the user.
+
+@item non-incremental-forward-search-history (M-n)
+Search forward starting at the current line and moving `down'
+through the the history as necessary using a non-incremental search
+for a string supplied by the user.
+
+@item history-search-forward ()
+Search forward through the history for the string of characters
+between the start of the current line and the point.
+This is a non-incremental search.
+By default, this command is unbound.
+
+@item history-search-backward ()
+Search backward through the history for the string of characters
+between the start of the current line and the point.  This
+is a non-incremental search.  By default, this command is unbound.
+
+@item yank-nth-arg (M-C-y)
+Insert the first argument to the previous command (usually
+the second word on the previous line) at point.
+With an argument @var{n},
+insert the @var{n}th word from the previous command (the words
+in the previous command begin with word 0).  A negative argument
+inserts the @var{n}th word from the end of the previous command.
+Once the argument @var{n} is computed, the argument is extracted
+as if the @samp{!@var{n}} history expansion had been specified.
+
+@item yank-last-arg (M-. or M-_)
+Insert last argument to the previous command (the last word of the
+previous history entry).  With an
+argument, behave exactly like @code{yank-nth-arg}.
+Successive calls to @code{yank-last-arg} move back through the history
+list, inserting the last argument of each line in turn.
+The history expansion facilities are used to extract the last argument,
+as if the @samp{!$} history expansion had been specified.
+
+@end ftable
+
+@node Commands For Text
+@subsection Commands For Changing Text
+
+@ftable @code
+@item delete-char (C-d)
+Delete the character at point.  If point is at the
+beginning of the line, there are no characters in the line, and
+the last character typed was not bound to @code{delete-char}, then
+return @sc{eof}.
+
+@item backward-delete-char (Rubout)
+Delete the character behind the cursor.  A numeric argument means
+to kill the characters instead of deleting them.
+
+@item forward-backward-delete-char ()
+Delete the character under the cursor, unless the cursor is at the
+end of the line, in which case the character behind the cursor is
+deleted.  By default, this is not bound to a key.
+
+@item quoted-insert (C-q or C-v)
+Add the next character typed to the line verbatim.  This is
+how to insert key sequences like @kbd{C-q}, for example.
+
+@ifclear BashFeatures
+@item tab-insert (M-@key{TAB})
+Insert a tab character.
+@end ifclear
+
+@item self-insert (a, b, A, 1, !, @dots{})
+Insert yourself.
+
+@item transpose-chars (C-t)
+Drag the character before the cursor forward over
+the character at the cursor, moving the
+cursor forward as well.  If the insertion point
+is at the end of the line, then this
+transposes the last two characters of the line.
+Negative arguments have no effect.
+
+@item transpose-words (M-t)
+Drag the word before point past the word after point,
+moving point past that word as well.
+If the insertion point is at the end of the line, this transposes
+the last two words on the line.
+
+@item upcase-word (M-u)
+Uppercase the current (or following) word.  With a negative argument,
+uppercase the previous word, but do not move the cursor.
+
+@item downcase-word (M-l)
+Lowercase the current (or following) word.  With a negative argument,
+lowercase the previous word, but do not move the cursor.
+
+@item capitalize-word (M-c)
+Capitalize the current (or following) word.  With a negative argument,
+capitalize the previous word, but do not move the cursor.
+
+@item overwrite-mode ()
+Toggle overwrite mode.  With an explicit positive numeric argument,
+switches to overwrite mode.  With an explicit non-positive numeric
+argument, switches to insert mode.  This command affects only
+@code{emacs} mode; @code{vi} mode does overwrite differently.
+Each call to @code{readline()} starts in insert mode.
+
+In overwrite mode, characters bound to @code{self-insert} replace
+the text at point rather than pushing the text to the right.
+Characters bound to @code{backward-delete-char} replace the character
+before point with a space.
+
+By default, this command is unbound.
+
+@end ftable
+
+@node Commands For Killing
+@subsection Killing And Yanking
+
+@ftable @code
+
+@item kill-line (C-k)
+Kill the text from point to the end of the line.
+
+@item backward-kill-line (C-x Rubout)
+Kill backward to the beginning of the line.
+
+@item unix-line-discard (C-u)
+Kill backward from the cursor to the beginning of the current line.
+
+@item kill-whole-line ()
+Kill all characters on the current line, no matter where point is.
+By default, this is unbound.
+
+@item kill-word (M-d)
+Kill from point to the end of the current word, or if between
+words, to the end of the next word.
+Word boundaries are the same as @code{forward-word}.
+
+@item backward-kill-word (M-@key{DEL})
+Kill the word behind point.
+Word boundaries are the same as @code{backward-word}.
+
+@item unix-word-rubout (C-w)
+Kill the word behind point, using white space as a word boundary.
+The killed text is saved on the kill-ring.
+
+@item unix-filename-rubout ()
+Kill the word behind point, using white space and the slash character
+as the word boundaries.
+The killed text is saved on the kill-ring.
+
+@item delete-horizontal-space ()
+Delete all spaces and tabs around point.  By default, this is unbound.
+
+@item kill-region ()
+Kill the text in the current region.
+By default, this command is unbound.
+
+@item copy-region-as-kill ()
+Copy the text in the region to the kill buffer, so it can be yanked
+right away.  By default, this command is unbound.
+
+@item copy-backward-word ()
+Copy the word before point to the kill buffer.
+The word boundaries are the same as @code{backward-word}.
+By default, this command is unbound.
+
+@item copy-forward-word ()
+Copy the word following point to the kill buffer.
+The word boundaries are the same as @code{forward-word}.
+By default, this command is unbound.
+
+@item yank (C-y)
+Yank the top of the kill ring into the buffer at point.
+
+@item yank-pop (M-y)
+Rotate the kill-ring, and yank the new top.  You can only do this if
+the prior command is @code{yank} or @code{yank-pop}.
+@end ftable
+
+@node Numeric Arguments
+@subsection Specifying Numeric Arguments
+@ftable @code
+
+@item digit-argument (@kbd{M-0}, @kbd{M-1}, @dots{} @kbd{M--})
+Add this digit to the argument already accumulating, or start a new
+argument.  @kbd{M--} starts a negative argument.
+
+@item universal-argument ()
+This is another way to specify an argument.
+If this command is followed by one or more digits, optionally with a
+leading minus sign, those digits define the argument.
+If the command is followed by digits, executing @code{universal-argument}
+again ends the numeric argument, but is otherwise ignored.
+As a special case, if this command is immediately followed by a
+character that is neither a digit or minus sign, the argument count
+for the next command is multiplied by four.
+The argument count is initially one, so executing this function the
+first time makes the argument count four, a second time makes the
+argument count sixteen, and so on.
+By default, this is not bound to a key.
+@end ftable
+
+@node Commands For Completion
+@subsection Letting Readline Type For You
+
+@ftable @code
+@item complete (@key{TAB})
+Attempt to perform completion on the text before point.
+The actual completion performed is application-specific.
+@ifset BashFeatures
+Bash attempts completion treating the text as a variable (if the
+text begins with @samp{$}), username (if the text begins with
+@samp{~}), hostname (if the text begins with @samp{@@}), or
+command (including aliases and functions) in turn.  If none 
+of these produces a match, filename completion is attempted.
+@end ifset
+@ifclear BashFeatures
+The default is filename completion.
+@end ifclear
+
+@item possible-completions (M-?)
+List the possible completions of the text before point.
+
+@item insert-completions (M-*)
+Insert all completions of the text before point that would have
+been generated by @code{possible-completions}.
+
+@item menu-complete ()
+Similar to @code{complete}, but replaces the word to be completed
+with a single match from the list of possible completions.
+Repeated execution of @code{menu-complete} steps through the list
+of possible completions, inserting each match in turn.
+At the end of the list of completions, the bell is rung
+(subject to the setting of @code{bell-style})
+and the original text is restored.
+An argument of @var{n} moves @var{n} positions forward in the list
+of matches; a negative argument may be used to move backward
+through the list.
+This command is intended to be bound to @key{TAB}, but is unbound
+by default.
+
+@item delete-char-or-list ()
+Deletes the character under the cursor if not at the beginning or
+end of the line (like @code{delete-char}).
+If at the end of the line, behaves identically to
+@code{possible-completions}.
+This command is unbound by default.
+
+@ifset BashFeatures
+@item complete-filename (M-/)
+Attempt filename completion on the text before point.
+
+@item possible-filename-completions (C-x /)
+List the possible completions of the text before point,
+treating it as a filename.
+
+@item complete-username (M-~)
+Attempt completion on the text before point, treating
+it as a username.
+
+@item possible-username-completions (C-x ~)
+List the possible completions of the text before point,
+treating it as a username.
+
+@item complete-variable (M-$)
+Attempt completion on the text before point, treating
+it as a shell variable.
+
+@item possible-variable-completions (C-x $)
+List the possible completions of the text before point,
+treating it as a shell variable.
+
+@item complete-hostname (M-@@)
+Attempt completion on the text before point, treating
+it as a hostname.
+
+@item possible-hostname-completions (C-x @@)
+List the possible completions of the text before point,
+treating it as a hostname.
+
+@item complete-command (M-!)
+Attempt completion on the text before point, treating
+it as a command name.  Command completion attempts to
+match the text against aliases, reserved words, shell
+functions, shell builtins, and finally executable filenames,
+in that order.
+
+@item possible-command-completions (C-x !)
+List the possible completions of the text before point,
+treating it as a command name.
+
+@item dynamic-complete-history (M-@key{TAB})
+Attempt completion on the text before point, comparing
+the text against lines from the history list for possible
+completion matches.
+
+@item complete-into-braces (M-@{)
+Perform filename completion and insert the list of possible completions
+enclosed within braces so the list is available to the shell
+(@pxref{Brace Expansion}).
+
+@end ifset
+@end ftable
+
+@node Keyboard Macros
+@subsection Keyboard Macros
+@ftable @code
+
+@item start-kbd-macro (C-x ()
+Begin saving the characters typed into the current keyboard macro.
+
+@item end-kbd-macro (C-x ))
+Stop saving the characters typed into the current keyboard macro
+and save the definition.
+
+@item call-last-kbd-macro (C-x e)
+Re-execute the last keyboard macro defined, by making the characters
+in the macro appear as if typed at the keyboard.
+
+@end ftable
+
+@node Miscellaneous Commands
+@subsection Some Miscellaneous Commands
+@ftable @code
+
+@item re-read-init-file (C-x C-r)
+Read in the contents of the @var{inputrc} file, and incorporate
+any bindings or variable assignments found there.
+
+@item abort (C-g)
+Abort the current editing command and
+ring the terminal's bell (subject to the setting of
+@code{bell-style}).
+
+@item do-uppercase-version (M-a, M-b, M-@var{x}, @dots{})
+If the metafied character @var{x} is lowercase, run the command
+that is bound to the corresponding uppercase character.
+
+@item prefix-meta (@key{ESC})
+Metafy the next character typed.  This is for keyboards
+without a meta key.  Typing @samp{@key{ESC} f} is equivalent to typing
+@kbd{M-f}.
+
+@item undo (C-_ or C-x C-u)
+Incremental undo, separately remembered for each line.
+
+@item revert-line (M-r)
+Undo all changes made to this line.  This is like executing the @code{undo}
+command enough times to get back to the beginning.
+
+@ifset BashFeatures
+@item tilde-expand (M-&)
+@end ifset
+@ifclear BashFeatures
+@item tilde-expand (M-~)
+@end ifclear
+Perform tilde expansion on the current word.
+
+@item set-mark (C-@@)
+Set the mark to the point.  If a
+numeric argument is supplied, the mark is set to that position.
+
+@item exchange-point-and-mark (C-x C-x)
+Swap the point with the mark.  The current cursor position is set to
+the saved position, and the old cursor position is saved as the mark.
+
+@item character-search (C-])
+A character is read and point is moved to the next occurrence of that
+character.  A negative count searches for previous occurrences.
+
+@item character-search-backward (M-C-])
+A character is read and point is moved to the previous occurrence
+of that character.  A negative count searches for subsequent
+occurrences.
+
+@item insert-comment (M-#)
+Without a numeric argument, the value of the @code{comment-begin}
+variable is inserted at the beginning of the current line.
+If a numeric argument is supplied, this command acts as a toggle:  if
+the characters at the beginning of the line do not match the value
+of @code{comment-begin}, the value is inserted, otherwise
+the characters in @code{comment-begin} are deleted from the beginning of
+the line.
+In either case, the line is accepted as if a newline had been typed.
+@ifset BashFeatures
+The default value of @code{comment-begin} causes this command
+to make the current line a shell comment.
+If a numeric argument causes the comment character to be removed, the line
+will be executed by the shell.
+@end ifset
+
+@item dump-functions ()
+Print all of the functions and their key bindings to the
+Readline output stream.  If a numeric argument is supplied,
+the output is formatted in such a way that it can be made part
+of an @var{inputrc} file.  This command is unbound by default.
+
+@item dump-variables ()
+Print all of the settable variables and their values to the
+Readline output stream.  If a numeric argument is supplied,
+the output is formatted in such a way that it can be made part
+of an @var{inputrc} file.  This command is unbound by default.
+
+@item dump-macros ()
+Print all of the Readline key sequences bound to macros and the
+strings they output.  If a numeric argument is supplied,
+the output is formatted in such a way that it can be made part
+of an @var{inputrc} file.  This command is unbound by default.
+
+@ifset BashFeatures
+@item glob-complete-word (M-g)
+The word before point is treated as a pattern for pathname expansion,
+with an asterisk implicitly appended.  This pattern is used to
+generate a list of matching file names for possible completions.
+
+@item glob-expand-word (C-x *)
+The word before point is treated as a pattern for pathname expansion,
+and the list of matching file names is inserted, replacing the word.
+If a numeric argument is supplied, a @samp{*} is appended before
+pathname expansion.
+
+@item glob-list-expansions (C-x g)
+The list of expansions that would have been generated by
+@code{glob-expand-word} is displayed, and the line is redrawn.
+If a numeric argument is supplied, a @samp{*} is appended before
+pathname expansion.
+
+@item display-shell-version (C-x C-v)
+Display version information about the current instance of Bash.
+
+@item shell-expand-line (M-C-e)
+Expand the line as the shell does.
+This performs alias and history expansion as well as all of the shell
+word expansions (@pxref{Shell Expansions}).
+
+@item history-expand-line (M-^)
+Perform history expansion on the current line.
+
+@item magic-space ()
+Perform history expansion on the current line and insert a space
+(@pxref{History Interaction}).
+
+@item alias-expand-line ()
+Perform alias expansion on the current line (@pxref{Aliases}).
+
+@item history-and-alias-expand-line ()
+Perform history and alias expansion on the current line.
+
+@item insert-last-argument (M-. or M-_)
+A synonym for @code{yank-last-arg}.
+
+@item operate-and-get-next (C-o)
+Accept the current line for execution and fetch the next line
+relative to the current line from the history for editing.  Any
+argument is ignored.
+
+@item edit-and-execute-command (C-xC-e)
+Invoke an editor on the current command line, and execute the result as shell
+commands.
+Bash attempts to invoke
+@code{$VISUAL}, @code{$EDITOR}, and @code{emacs}
+as the editor, in that order.
+
+@end ifset
+
+@ifclear BashFeatures
+@item emacs-editing-mode (C-e)
+When in @code{vi} command mode, this causes a switch to @code{emacs}
+editing mode.
+
+@item vi-editing-mode (M-C-j)
+When in @code{emacs} editing mode, this causes a switch to @code{vi}
+editing mode.
+
+@end ifclear
+
+@end ftable
+
+@node Readline vi Mode
+@section Readline vi Mode
+
+While the Readline library does not have a full set of @code{vi}
+editing functions, it does contain enough to allow simple editing
+of the line.  The Readline @code{vi} mode behaves as specified in
+the @sc{posix} 1003.2 standard.
+
+@ifset BashFeatures
+In order to switch interactively between @code{emacs} and @code{vi}
+editing modes, use the @samp{set -o emacs} and @samp{set -o vi}
+commands (@pxref{The Set Builtin}).
+@end ifset
+@ifclear BashFeatures
+In order to switch interactively between @code{emacs} and @code{vi}
+editing modes, use the command @kbd{M-C-j} (bound to emacs-editing-mode
+when in @code{vi} mode and to vi-editing-mode in @code{emacs} mode).
+@end ifclear
+The Readline default is @code{emacs} mode.
+
+When you enter a line in @code{vi} mode, you are already placed in
+`insertion' mode, as if you had typed an @samp{i}.  Pressing @key{ESC}
+switches you into `command' mode, where you can edit the text of the
+line with the standard @code{vi} movement keys, move to previous
+history lines with @samp{k} and subsequent lines with @samp{j}, and
+so forth.
+
+@ifset BashFeatures
+@node Programmable Completion
+@section Programmable Completion
+@cindex programmable completion
+
+When word completion is attempted for an argument to a command for
+which a completion specification (a @var{compspec}) has been defined
+using the @code{complete} builtin (@pxref{Programmable Completion Builtins}),
+the programmable completion facilities are invoked. 
+
+First, the command name is identified.
+If a compspec has been defined for that command, the
+compspec is used to generate the list of possible completions for the word.
+If the command word is a full pathname, a compspec for the full
+pathname is searched for first.
+If no compspec is found for the full pathname, an attempt is made to
+find a compspec for the portion following the final slash.
+
+Once a compspec has been found, it is used to generate the list of
+matching words.
+If a compspec is not found, the default Bash completion
+described above (@pxref{Commands For Completion}) is performed.
+
+First, the actions specified by the compspec are used.
+Only matches which are prefixed by the word being completed are
+returned.
+When the @option{-f} or @option{-d} option is used for filename or
+directory name completion, the shell variable @env{FIGNORE} is
+used to filter the matches.
+@xref{Bash Variables}, for a description of @env{FIGNORE}.
+
+Any completions specified by a filename expansion pattern to the
+@option{-G} option are generated next.
+The words generated by the pattern need not match the word being completed.
+The @env{GLOBIGNORE} shell variable is not used to filter the matches,
+but the @env{FIGNORE} shell variable is used.
+
+Next, the string specified as the argument to the @option{-W} option
+is considered.
+The string is first split using the characters in the @env{IFS}
+special variable as delimiters.
+Shell quoting is honored.
+Each word is then expanded using
+brace expansion, tilde expansion, parameter and variable expansion,
+command substitution, and arithmetic expansion,
+as described above (@pxref{Shell Expansions}).
+The results are split using the rules described above
+(@pxref{Word Splitting}).
+The results of the expansion are prefix-matched against the word being
+completed, and the matching words become the possible completions.
+
+After these matches have been generated, any shell function or command
+specified with the @option{-F} and @option{-C} options is invoked.
+When the command or function is invoked, the @env{COMP_LINE} and
+@env{COMP_POINT} variables are assigned values as described above
+(@pxref{Bash Variables}).
+If a shell function is being invoked, the @env{COMP_WORDS} and
+@env{COMP_CWORD} variables are also set.
+When the function or command is invoked, the first argument is the
+name of the command whose arguments are being completed, the
+second argument is the word being completed, and the third argument
+is the word preceding the word being completed on the current command line.
+No filtering of the generated completions against the word being completed
+is performed; the function or command has complete freedom in generating
+the matches.
+
+Any function specified with @option{-F} is invoked first.
+The function may use any of the shell facilities, including the
+@code{compgen} builtin described below
+(@pxref{Programmable Completion Builtins}), to generate the matches.
+It must put the possible completions in the @env{COMPREPLY} array
+variable.
+
+Next, any command specified with the @option{-C} option is invoked
+in an environment equivalent to command substitution.
+It should print a list of completions, one per line, to
+the standard output.
+Backslash may be used to escape a newline, if necessary.
+
+After all of the possible completions are generated, any filter
+specified with the @option{-X} option is applied to the list.
+The filter is a pattern as used for pathname expansion; a @samp{&}
+in the pattern is replaced with the text of the word being completed.
+A literal @samp{&} may be escaped with a backslash; the backslash
+is removed before attempting a match.
+Any completion that matches the pattern will be removed from the list.
+A leading @samp{!} negates the pattern; in this case any completion
+not matching the pattern will be removed.
+
+Finally, any prefix and suffix specified with the @option{-P} and @option{-S}
+options are added to each member of the completion list, and the result is
+returned to the Readline completion code as the list of possible
+completions.
+
+If the previously-applied actions do not generate any matches, and the
+@option{-o dirnames} option was supplied to @code{complete} when the
+compspec was defined, directory name completion is attempted. 
+
+If the @option{-o plusdirs} option was supplied to @code{complete} when
+the compspec was defined, directory name completion is attempted and any
+matches are added to the results of the other actions.
+
+By default, if a compspec is found, whatever it generates is returned to
+the completion code as the full set of possible completions.
+The default Bash completions are not attempted, and the Readline default
+of filename completion is disabled.
+If the @option{-o bashdefault} option was supplied to @code{complete} when
+the compspec was defined, the default Bash completions are attempted
+if the compspec generates no matches.
+If the @option{-o default} option was supplied to @code{complete} when the
+compspec was defined, Readline's default completion will be performed
+if the compspec (and, if attempted, the default Bash completions)
+generate no matches.
+
+When a compspec indicates that directory name completion is desired,
+the programmable completion functions force Readline to append a slash
+to completed names which are symbolic links to directories, subject to
+the value of the @var{mark-directories} Readline variable, regardless
+of the setting of the @var{mark-symlinked-directories} Readline variable.
+
+@node Programmable Completion Builtins
+@section Programmable Completion Builtins
+@cindex completion builtins
+
+Two builtin commands are available to manipulate the programmable completion
+facilities.
+
+@table @code
+@item compgen
+@btindex compgen
+@example
+@code{compgen [@var{option}] [@var{word}]}
+@end example
+
+Generate possible completion matches for @var{word} according to
+the @var{option}s, which may be any option accepted by the
+@code{complete}
+builtin with the exception of @option{-p} and @option{-r}, and write
+the matches to the standard output.
+When using the @option{-F} or @option{-C} options, the various shell variables
+set by the programmable completion facilities, while available, will not
+have useful values.
+
+The matches will be generated in the same way as if the programmable
+completion code had generated them directly from a completion specification
+with the same flags.
+If @var{word} is specified, only those completions matching @var{word}
+will be displayed.
+
+The return value is true unless an invalid option is supplied, or no
+matches were generated.
+
+@item complete
+@btindex complete
+@example
+@code{complete [-abcdefgjksuv] [-o @var{comp-option}] [-A @var{action}] [-G @var{globpat}] [-W @var{wordlist}]
+[-P @var{prefix}] [-S @var{suffix}] [-X @var{filterpat}] [-F @var{function}]
+[-C @var{command}] @var{name} [@var{name} @dots{}]}
+@code{complete -pr [@var{name} @dots{}]}
+@end example
+
+Specify how arguments to each @var{name} should be completed.
+If the @option{-p} option is supplied, or if no options are supplied, existing
+completion specifications are printed in a way that allows them to be
+reused as input.
+The @option{-r} option removes a completion specification for
+each @var{name}, or, if no @var{name}s are supplied, all
+completion specifications.
+
+The process of applying these completion specifications when word completion
+is attempted is described above (@pxref{Programmable Completion}).
+
+Other options, if specified, have the following meanings.
+The arguments to the @option{-G}, @option{-W}, and @option{-X} options
+(and, if necessary, the @option{-P} and @option{-S} options)
+should be quoted to protect them from expansion before the
+@code{complete} builtin is invoked.
+
+
+@table @code
+@item -o @var{comp-option}
+The @var{comp-option} controls several aspects of the compspec's behavior
+beyond the simple generation of completions.
+@var{comp-option} may be one of: 
+
+@table @code
+
+@item bashdefault
+Perform the rest of the default Bash completions if the compspec
+generates no matches.
+
+@item default
+Use Readline's default filename completion if the compspec generates
+no matches.
+
+@item dirnames
+Perform directory name completion if the compspec generates no matches.
+
+@item filenames
+Tell Readline that the compspec generates filenames, so it can perform any
+filename-specific processing (like adding a slash to directory names or
+suppressing trailing spaces).  This option is intended to be used with
+shell functions specified with @option{-F}.
+
+@item nospace
+Tell Readline not to append a space (the default) to words completed at
+the end of the line.
+
+@item plusdirs
+After any matches defined by the compspec are generated, 
+directory name completion is attempted and any
+matches are added to the results of the other actions.
+
+@end table
+
+@item -A @var{action}
+The @var{action} may be one of the following to generate a list of possible
+completions:
+
+@table @code
+@item alias
+Alias names.  May also be specified as @option{-a}.
+
+@item arrayvar
+Array variable names.
+
+@item binding
+Readline key binding names (@pxref{Bindable Readline Commands}).
+
+@item builtin
+Names of shell builtin commands.  May also be specified as @option{-b}.
+
+@item command
+Command names.  May also be specified as @option{-c}.
+
+@item directory
+Directory names.  May also be specified as @option{-d}.
+
+@item disabled
+Names of disabled shell builtins.
+
+@item enabled
+Names of enabled shell builtins.
+
+@item export
+Names of exported shell variables.  May also be specified as @option{-e}.
+
+@item file
+File names.  May also be specified as @option{-f}.
+
+@item function
+Names of shell functions.
+
+@item group
+Group names.  May also be specified as @option{-g}.
+
+@item helptopic
+Help topics as accepted by the @code{help} builtin (@pxref{Bash Builtins}).
+
+@item hostname
+Hostnames, as taken from the file specified by the
+@env{HOSTFILE} shell variable (@pxref{Bash Variables}).
+
+@item job
+Job names, if job control is active.  May also be specified as @option{-j}.
+
+@item keyword
+Shell reserved words.  May also be specified as @option{-k}.
+
+@item running
+Names of running jobs, if job control is active.
+
+@item service
+Service names.  May also be specified as @option{-s}.
+
+@item setopt
+Valid arguments for the @option{-o} option to the @code{set} builtin
+(@pxref{The Set Builtin}).
+
+@item shopt
+Shell option names as accepted by the @code{shopt} builtin
+(@pxref{Bash Builtins}).
+
+@item signal
+Signal names.
+
+@item stopped
+Names of stopped jobs, if job control is active.
+
+@item user
+User names.  May also be specified as @option{-u}.
+
+@item variable
+Names of all shell variables.  May also be specified as @option{-v}.
+@end table
+
+@item -G @var{globpat}
+The filename expansion pattern @var{globpat} is expanded to generate
+the possible completions.
+
+@item -W @var{wordlist}
+The @var{wordlist} is split using the characters in the
+@env{IFS} special variable as delimiters, and each resultant word
+is expanded.
+The possible completions are the members of the resultant list which
+match the word being completed.
+
+@item -C @var{command}
+@var{command} is executed in a subshell environment, and its output is
+used as the possible completions.
+
+@item -F @var{function}
+The shell function @var{function} is executed in the current shell
+environment.
+When it finishes, the possible completions are retrieved from the value
+of the @env{COMPREPLY} array variable.
+
+@item -X @var{filterpat}
+@var{filterpat} is a pattern as used for filename expansion.
+It is applied to the list of possible completions generated by the
+preceding options and arguments, and each completion matching
+@var{filterpat} is removed from the list.
+A leading @samp{!} in @var{filterpat} negates the pattern; in this
+case, any completion not matching @var{filterpat} is removed.
+
+@item -P @var{prefix}
+@var{prefix} is added at the beginning of each possible completion
+after all other options have been applied.
+
+@item -S @var{suffix}
+@var{suffix} is appended to each possible completion
+after all other options have been applied.
+@end table
+
+The return value is true unless an invalid option is supplied, an option
+other than @option{-p} or @option{-r} is supplied without a @var{name}
+argument, an attempt is made to remove a completion specification for
+a @var{name} for which no specification exists, or
+an error occurs adding a completion specification.
+
+@end table
+@end ifset
diff --git a/doc/rluserman.dvi b/doc/rluserman.dvi
new file mode 100644 (file)
index 0000000..bbac041
Binary files /dev/null and b/doc/rluserman.dvi differ
diff --git a/doc/rluserman.html b/doc/rluserman.html
new file mode 100644 (file)
index 0000000..a102195
--- /dev/null
@@ -0,0 +1,2800 @@
+<HTML>
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<!-- Created on July, 6  2006 by texi2html 1.64 -->
+<!-- 
+Written by: Lionel Cons <Lionel.Cons@cern.ch> (original author)
+            Karl Berry  <karl@freefriends.org>
+            Olaf Bachmann <obachman@mathematik.uni-kl.de>
+            and many others.
+Maintained by: Olaf Bachmann <obachman@mathematik.uni-kl.de>
+Send bugs and suggestions to <texi2html@mathematik.uni-kl.de>
+-->
+<HEAD>
+<TITLE>GNU Readline Library: </TITLE>
+
+<META NAME="description" CONTENT="GNU Readline Library: ">
+<META NAME="keywords" CONTENT="GNU Readline Library: ">
+<META NAME="resource-type" CONTENT="document">
+<META NAME="distribution" CONTENT="global">
+<META NAME="Generator" CONTENT="texi2html 1.64">
+
+</HEAD>
+
+<BODY LANG="" BGCOLOR="#FFFFFF" TEXT="#000000" LINK="#0000FF" VLINK="#800080" ALINK="#FF0000">
+
+<A NAME="SEC_Top"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H1>GNU Readline Library</H1></P><P>
+
+This document describes the end user interface of the GNU Readline Library,
+a utility which aids in the consistency of user interface across discrete
+programs which provide a command line interface.
+</P><P>
+
+<BLOCKQUOTE><TABLE BORDER=0 CELLSPACING=0> 
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="rluserman.html#SEC1">1. Command Line Editing</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">GNU Readline User's Manual.</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="rluserman.html#SEC23">A. Copying This Manual</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP"></TD></TR>
+</TABLE></BLOCKQUOTE>
+<P>
+
+<HR SIZE=1>
+<A NAME="SEC1"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC_Top"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC2"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[ &lt;&lt; ]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC_Top"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC23"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<A NAME="Command Line Editing"></A>
+<H1> 1. Command Line Editing </H1>
+<!--docid::SEC1::-->
+<P>
+
+This chapter describes the basic features of the GNU
+command line editing interface.
+</P><P>
+
+<BLOCKQUOTE><TABLE BORDER=0 CELLSPACING=0> 
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="rluserman.html#SEC2">1.1 Introduction to Line Editing</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Notation used in this text.</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="rluserman.html#SEC3">1.2 Readline Interaction</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">The minimum set of commands for editing a line.</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="rluserman.html#SEC9">1.3 Readline Init File</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Customizing Readline from a user's view.</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="rluserman.html#SEC13">1.4 Bindable Readline Commands</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">A description of most of the Readline commands
+                               available for binding</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="rluserman.html#SEC22">1.5 Readline vi Mode</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">A short description of how to make Readline
+                               behave like the vi editor.</TD></TR>
+</TABLE></BLOCKQUOTE>
+<P>
+
+<A NAME="Introduction and Notation"></A>
+<HR SIZE="6">
+<A NAME="SEC2"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC1"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC3"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[ &lt;&lt; ]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC1"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC23"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H2> 1.1 Introduction to Line Editing </H2>
+<!--docid::SEC2::-->
+<P>
+
+The following paragraphs describe the notation used to represent
+keystrokes.
+</P><P>
+
+The text <KBD>C-k</KBD> is read as `Control-K' and describes the character
+produced when the <KBD>k</KBD> key is pressed while the Control key
+is depressed.
+</P><P>
+
+The text <KBD>M-k</KBD> is read as `Meta-K' and describes the character
+produced when the Meta key (if you have one) is depressed, and the <KBD>k</KBD>
+key is pressed.
+The Meta key is labeled <KBD>ALT</KBD> on many keyboards.
+On keyboards with two keys labeled <KBD>ALT</KBD> (usually to either side of
+the space bar), the <KBD>ALT</KBD> on the left side is generally set to
+work as a Meta key.
+The <KBD>ALT</KBD> key on the right may also be configured to work as a
+Meta key or may be configured as some other modifier, such as a
+Compose key for typing accented characters.
+</P><P>
+
+If you do not have a Meta or <KBD>ALT</KBD> key, or another key working as
+a Meta key, the identical keystroke can be generated by typing <KBD>ESC</KBD>
+<EM>first</EM>, and then typing <KBD>k</KBD>.
+Either process is known as <EM>metafying</EM> the <KBD>k</KBD> key.
+</P><P>
+
+The text <KBD>M-C-k</KBD> is read as `Meta-Control-k' and describes the
+character produced by <EM>metafying</EM> <KBD>C-k</KBD>.
+</P><P>
+
+In addition, several keys have their own names.  Specifically,
+<KBD>DEL</KBD>, <KBD>ESC</KBD>, <KBD>LFD</KBD>, <KBD>SPC</KBD>, <KBD>RET</KBD>, and <KBD>TAB</KBD> all
+stand for themselves when seen in this text, or in an init file
+(see section <A HREF="rluserman.html#SEC9">1.3 Readline Init File</A>).
+If your keyboard lacks a <KBD>LFD</KBD> key, typing <KBD>C-j</KBD> will
+produce the desired character.
+The <KBD>RET</KBD> key may be labeled <KBD>Return</KBD> or <KBD>Enter</KBD> on
+some keyboards.
+</P><P>
+
+<A NAME="Readline Interaction"></A>
+<HR SIZE="6">
+<A NAME="SEC3"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC2"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC4"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC9"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC1"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC9"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H2> 1.2 Readline Interaction </H2>
+<!--docid::SEC3::-->
+<P>
+
+Often during an interactive session you type in a long line of text,
+only to notice that the first word on the line is misspelled.  The
+Readline library gives you a set of commands for manipulating the text
+as you type it in, allowing you to just fix your typo, and not forcing
+you to retype the majority of the line.  Using these editing commands,
+you move the cursor to the place that needs correction, and delete or
+insert the text of the corrections.  Then, when you are satisfied with
+the line, you simply press <KBD>RET</KBD>.  You do not have to be at the
+end of the line to press <KBD>RET</KBD>; the entire line is accepted
+regardless of the location of the cursor within the line.
+</P><P>
+
+<BLOCKQUOTE><TABLE BORDER=0 CELLSPACING=0> 
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="rluserman.html#SEC4">1.2.1 Readline Bare Essentials</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">The least you need to know about Readline.</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="rluserman.html#SEC5">1.2.2 Readline Movement Commands</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Moving about the input line.</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="rluserman.html#SEC6">1.2.3 Readline Killing Commands</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">How to delete text, and how to get it back!</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="rluserman.html#SEC7">1.2.4 Readline Arguments</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Giving numeric arguments to commands.</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="rluserman.html#SEC8">1.2.5 Searching for Commands in the History</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Searching through previous lines.</TD></TR>
+</TABLE></BLOCKQUOTE>
+<P>
+
+<A NAME="Readline Bare Essentials"></A>
+<HR SIZE="6">
+<A NAME="SEC4"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC3"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC5"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC9"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC3"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC9"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> 1.2.1 Readline Bare Essentials </H3>
+<!--docid::SEC4::-->
+<P>
+
+In order to enter characters into the line, simply type them.  The typed
+character appears where the cursor was, and then the cursor moves one
+space to the right.  If you mistype a character, you can use your
+erase character to back up and delete the mistyped character.
+</P><P>
+
+Sometimes you may mistype a character, and
+not notice the error until you have typed several other characters.  In
+that case, you can type <KBD>C-b</KBD> to move the cursor to the left, and then
+correct your mistake.  Afterwards, you can move the cursor to the right
+with <KBD>C-f</KBD>.
+</P><P>
+
+When you add text in the middle of a line, you will notice that characters
+to the right of the cursor are `pushed over' to make room for the text
+that you have inserted.  Likewise, when you delete text behind the cursor,
+characters to the right of the cursor are `pulled back' to fill in the
+blank space created by the removal of the text.  A list of the bare
+essentials for editing the text of an input line follows.
+</P><P>
+
+<DL COMPACT>
+<DT><KBD>C-b</KBD>
+<DD>Move back one character.
+<DT><KBD>C-f</KBD>
+<DD>Move forward one character.
+<DT><KBD>DEL</KBD> or <KBD>Backspace</KBD>
+<DD>Delete the character to the left of the cursor.
+<DT><KBD>C-d</KBD>
+<DD>Delete the character underneath the cursor.
+<DT>Printing characters
+<DD>Insert the character into the line at the cursor.
+<DT><KBD>C-_</KBD> or <KBD>C-x C-u</KBD>
+<DD>Undo the last editing command.  You can undo all the way back to an
+empty line.
+</DL>
+<P>
+
+(Depending on your configuration, the <KBD>Backspace</KBD> key be set to
+delete the character to the left of the cursor and the <KBD>DEL</KBD> key set
+to delete the character underneath the cursor, like <KBD>C-d</KBD>, rather
+than the character to the left of the cursor.)
+</P><P>
+
+<A NAME="Readline Movement Commands"></A>
+<HR SIZE="6">
+<A NAME="SEC5"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC4"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC6"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC6"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC3"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC9"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> 1.2.2 Readline Movement Commands </H3>
+<!--docid::SEC5::-->
+<P>
+
+The above table describes the most basic keystrokes that you need
+in order to do editing of the input line.  For your convenience, many
+other commands have been added in addition to <KBD>C-b</KBD>, <KBD>C-f</KBD>,
+<KBD>C-d</KBD>, and <KBD>DEL</KBD>.  Here are some commands for moving more rapidly
+about the line.
+</P><P>
+
+<DL COMPACT>
+<DT><KBD>C-a</KBD>
+<DD>Move to the start of the line.
+<DT><KBD>C-e</KBD>
+<DD>Move to the end of the line.
+<DT><KBD>M-f</KBD>
+<DD>Move forward a word, where a word is composed of letters and digits.
+<DT><KBD>M-b</KBD>
+<DD>Move backward a word.
+<DT><KBD>C-l</KBD>
+<DD>Clear the screen, reprinting the current line at the top.
+</DL>
+<P>
+
+Notice how <KBD>C-f</KBD> moves forward a character, while <KBD>M-f</KBD> moves
+forward a word.  It is a loose convention that control keystrokes
+operate on characters while meta keystrokes operate on words.
+</P><P>
+
+<A NAME="Readline Killing Commands"></A>
+<HR SIZE="6">
+<A NAME="SEC6"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC5"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC7"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC7"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC3"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC9"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> 1.2.3 Readline Killing Commands </H3>
+<!--docid::SEC6::-->
+<P>
+
+<A NAME="IDX1"></A>
+<A NAME="IDX2"></A>
+</P><P>
+
+<EM>Killing</EM> text means to delete the text from the line, but to save
+it away for later use, usually by <EM>yanking</EM> (re-inserting)
+it back into the line.
+(`Cut' and `paste' are more recent jargon for `kill' and `yank'.)
+</P><P>
+
+If the description for a command says that it `kills' text, then you can
+be sure that you can get the text back in a different (or the same)
+place later.
+</P><P>
+
+When you use a kill command, the text is saved in a <EM>kill-ring</EM>.
+Any number of consecutive kills save all of the killed text together, so
+that when you yank it back, you get it all.  The kill
+ring is not line specific; the text that you killed on a previously
+typed line is available to be yanked back later, when you are typing
+another line.
+<A NAME="IDX3"></A>
+</P><P>
+
+Here is the list of commands for killing text.
+</P><P>
+
+<DL COMPACT>
+<DT><KBD>C-k</KBD>
+<DD>Kill the text from the current cursor position to the end of the line.
+<P>
+
+<DT><KBD>M-d</KBD>
+<DD>Kill from the cursor to the end of the current word, or, if between
+words, to the end of the next word.
+Word boundaries are the same as those used by <KBD>M-f</KBD>.
+<P>
+
+<DT><KBD>M-<KBD>DEL</KBD></KBD>
+<DD>Kill from the cursor the start of the current word, or, if between
+words, to the start of the previous word.
+Word boundaries are the same as those used by <KBD>M-b</KBD>.
+<P>
+
+<DT><KBD>C-w</KBD>
+<DD>Kill from the cursor to the previous whitespace.  This is different than
+<KBD>M-<KBD>DEL</KBD></KBD> because the word boundaries differ.
+<P>
+
+</DL>
+<P>
+
+Here is how to <EM>yank</EM> the text back into the line.  Yanking
+means to copy the most-recently-killed text from the kill buffer.
+</P><P>
+
+<DL COMPACT>
+<DT><KBD>C-y</KBD>
+<DD>Yank the most recently killed text back into the buffer at the cursor.
+<P>
+
+<DT><KBD>M-y</KBD>
+<DD>Rotate the kill-ring, and yank the new top.  You can only do this if
+the prior command is <KBD>C-y</KBD> or <KBD>M-y</KBD>.
+</DL>
+<P>
+
+<A NAME="Readline Arguments"></A>
+<HR SIZE="6">
+<A NAME="SEC7"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC6"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC8"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC8"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC3"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC9"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> 1.2.4 Readline Arguments </H3>
+<!--docid::SEC7::-->
+<P>
+
+You can pass numeric arguments to Readline commands.  Sometimes the
+argument acts as a repeat count, other times it is the <I>sign</I> of the
+argument that is significant.  If you pass a negative argument to a
+command which normally acts in a forward direction, that command will
+act in a backward direction.  For example, to kill text back to the
+start of the line, you might type <SAMP>`M-- C-k'</SAMP>.
+</P><P>
+
+The general way to pass numeric arguments to a command is to type meta
+digits before the command.  If the first `digit' typed is a minus
+sign (<SAMP>`-'</SAMP>), then the sign of the argument will be negative.  Once
+you have typed one meta digit to get the argument started, you can type
+the remainder of the digits, and then the command.  For example, to give
+the <KBD>C-d</KBD> command an argument of 10, you could type <SAMP>`M-1 0 C-d'</SAMP>,
+which will delete the next ten characters on the input line.
+</P><P>
+
+<A NAME="Searching"></A>
+<HR SIZE="6">
+<A NAME="SEC8"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC7"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC9"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC9"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC3"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC9"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> 1.2.5 Searching for Commands in the History </H3>
+<!--docid::SEC8::-->
+<P>
+
+Readline provides commands for searching through the command history
+for lines containing a specified string.
+There are two search modes:  <EM>incremental</EM> and <EM>non-incremental</EM>.
+</P><P>
+
+Incremental searches begin before the user has finished typing the
+search string.
+As each character of the search string is typed, Readline displays
+the next entry from the history matching the string typed so far.
+An incremental search requires only as many characters as needed to
+find the desired history entry.
+To search backward in the history for a particular string, type
+<KBD>C-r</KBD>.  Typing <KBD>C-s</KBD> searches forward through the history.
+The characters present in the value of the <CODE>isearch-terminators</CODE> variable
+are used to terminate an incremental search.
+If that variable has not been assigned a value, the <KBD>ESC</KBD> and
+<KBD>C-J</KBD> characters will terminate an incremental search.
+<KBD>C-g</KBD> will abort an incremental search and restore the original line.
+When the search is terminated, the history entry containing the
+search string becomes the current line.
+</P><P>
+
+To find other matching entries in the history list, type <KBD>C-r</KBD> or
+<KBD>C-s</KBD> as appropriate.
+This will search backward or forward in the history for the next
+entry matching the search string typed so far.
+Any other key sequence bound to a Readline command will terminate
+the search and execute that command.
+For instance, a <KBD>RET</KBD> will terminate the search and accept
+the line, thereby executing the command from the history list.
+A movement command will terminate the search, make the last line found
+the current line, and begin editing.
+</P><P>
+
+Readline remembers the last incremental search string.  If two
+<KBD>C-r</KBD>s are typed without any intervening characters defining a new
+search string, any remembered search string is used.
+</P><P>
+
+Non-incremental searches read the entire search string before starting
+to search for matching history lines.  The search string may be
+typed by the user or be part of the contents of the current line.
+</P><P>
+
+<A NAME="Readline Init File"></A>
+<HR SIZE="6">
+<A NAME="SEC9"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC8"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC10"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC13"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC1"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC13"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H2> 1.3 Readline Init File </H2>
+<!--docid::SEC9::-->
+<P>
+
+Although the Readline library comes with a set of Emacs-like
+keybindings installed by default, it is possible to use a different set
+of keybindings.
+Any user can customize programs that use Readline by putting
+commands in an <EM>inputrc</EM> file, conventionally in his home directory.
+The name of this
+file is taken from the value of the environment variable <CODE>INPUTRC</CODE>.  If
+that variable is unset, the default is <TT>`~/.inputrc'</TT>.  If that
+file does not exist or cannot be read, the ultimate default is
+<TT>`/etc/inputrc'</TT>.
+</P><P>
+
+When a program which uses the Readline library starts up, the
+init file is read, and the key bindings are set.
+</P><P>
+
+In addition, the <CODE>C-x C-r</CODE> command re-reads this init file, thus
+incorporating any changes that you might have made to it.
+</P><P>
+
+<BLOCKQUOTE><TABLE BORDER=0 CELLSPACING=0> 
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="rluserman.html#SEC10">1.3.1 Readline Init File Syntax</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Syntax for the commands in the inputrc file.</TD></TR>
+</TABLE>
+
+<br>
+<TABLE BORDER=0 CELLSPACING=0>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="rluserman.html#SEC11">1.3.2 Conditional Init Constructs</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Conditional key bindings in the inputrc file.</TD></TR>
+</TABLE>
+
+<br>
+<TABLE BORDER=0 CELLSPACING=0>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="rluserman.html#SEC12">1.3.3 Sample Init File</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">An example inputrc file.</TD></TR>
+</TABLE></BLOCKQUOTE>
+<P>
+
+<A NAME="Readline Init File Syntax"></A>
+<HR SIZE="6">
+<A NAME="SEC10"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC9"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC11"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC13"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC9"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC13"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> 1.3.1 Readline Init File Syntax </H3>
+<!--docid::SEC10::-->
+<P>
+
+There are only a few basic constructs allowed in the
+Readline init file.  Blank lines are ignored.
+Lines beginning with a <SAMP>`#'</SAMP> are comments.
+Lines beginning with a <SAMP>`$'</SAMP> indicate conditional
+constructs (see section <A HREF="rluserman.html#SEC11">1.3.2 Conditional Init Constructs</A>).  Other lines
+denote variable settings and key bindings.
+</P><P>
+
+<DL COMPACT>
+<DT>Variable Settings
+<DD>You can modify the run-time behavior of Readline by
+altering the values of variables in Readline
+using the <CODE>set</CODE> command within the init file.
+The syntax is simple:
+<P>
+
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>set <VAR>variable</VAR> <VAR>value</VAR>
+</pre></td></tr></table></P><P>
+
+Here, for example, is how to
+change from the default Emacs-like key binding to use
+<CODE>vi</CODE> line editing commands:
+</P><P>
+
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>set editing-mode vi
+</pre></td></tr></table></P><P>
+
+Variable names and values, where appropriate, are recognized without regard
+to case.  Unrecognized variable names are ignored.
+</P><P>
+
+Boolean variables (those that can be set to on or off) are set to on if
+the value is null or empty, <VAR>on</VAR> (case-insensitive), or 1.  Any other
+value results in the variable being set to off.
+</P><P>
+
+A great deal of run-time behavior is changeable with the following
+variables.
+</P><P>
+
+<A NAME="IDX4"></A>
+<DL COMPACT>
+
+<DT><CODE>bell-style</CODE>
+<DD><A NAME="IDX5"></A>
+Controls what happens when Readline wants to ring the terminal bell.
+If set to <SAMP>`none'</SAMP>, Readline never rings the bell.  If set to
+<SAMP>`visible'</SAMP>, Readline uses a visible bell if one is available.
+If set to <SAMP>`audible'</SAMP> (the default), Readline attempts to ring
+the terminal's bell.
+<P>
+
+<DT><CODE>bind-tty-special-chars</CODE>
+<DD><A NAME="IDX6"></A>
+If set to <SAMP>`on'</SAMP>, Readline attempts to bind the control characters  
+treated specially by the kernel's terminal driver to their Readline
+equivalents.
+<P>
+
+<DT><CODE>comment-begin</CODE>
+<DD><A NAME="IDX7"></A>
+The string to insert at the beginning of the line when the
+<CODE>insert-comment</CODE> command is executed.  The default value
+is <CODE>"#"</CODE>.
+<P>
+
+<DT><CODE>completion-ignore-case</CODE>
+<DD>If set to <SAMP>`on'</SAMP>, Readline performs filename matching and completion
+in a case-insensitive fashion.
+The default value is <SAMP>`off'</SAMP>.
+<P>
+
+<DT><CODE>completion-query-items</CODE>
+<DD><A NAME="IDX8"></A>
+The number of possible completions that determines when the user is
+asked whether the list of possibilities should be displayed.
+If the number of possible completions is greater than this value,
+Readline will ask the user whether or not he wishes to view
+them; otherwise, they are simply listed.
+This variable must be set to an integer value greater than or equal to 0.
+A negative value means Readline should never ask.
+The default limit is <CODE>100</CODE>.
+<P>
+
+<DT><CODE>convert-meta</CODE>
+<DD><A NAME="IDX9"></A>
+If set to <SAMP>`on'</SAMP>, Readline will convert characters with the
+eighth bit set to an ASCII key sequence by stripping the eighth
+bit and prefixing an <KBD>ESC</KBD> character, converting them to a
+meta-prefixed key sequence.  The default value is <SAMP>`on'</SAMP>.
+<P>
+
+<DT><CODE>disable-completion</CODE>
+<DD><A NAME="IDX10"></A>
+If set to <SAMP>`On'</SAMP>, Readline will inhibit word completion.
+Completion  characters will be inserted into the line as if they had
+been mapped to <CODE>self-insert</CODE>.  The default is <SAMP>`off'</SAMP>.
+<P>
+
+<DT><CODE>editing-mode</CODE>
+<DD><A NAME="IDX11"></A>
+The <CODE>editing-mode</CODE> variable controls which default set of
+key bindings is used.  By default, Readline starts up in Emacs editing
+mode, where the keystrokes are most similar to Emacs.  This variable can be
+set to either <SAMP>`emacs'</SAMP> or <SAMP>`vi'</SAMP>.
+<P>
+
+<DT><CODE>enable-keypad</CODE>
+<DD><A NAME="IDX12"></A>
+When set to <SAMP>`on'</SAMP>, Readline will try to enable the application
+keypad when it is called.  Some systems need this to enable the
+arrow keys.  The default is <SAMP>`off'</SAMP>.
+<P>
+
+<DT><CODE>expand-tilde</CODE>
+<DD><A NAME="IDX13"></A>
+If set to <SAMP>`on'</SAMP>, tilde expansion is performed when Readline
+attempts word completion.  The default is <SAMP>`off'</SAMP>.
+<P>
+
+<DT><CODE>history-preserve-point</CODE>
+<DD><A NAME="IDX14"></A>
+If set to <SAMP>`on'</SAMP>, the history code attempts to place point at the
+same location on each history line retrieved with <CODE>previous-history</CODE>
+or <CODE>next-history</CODE>.  The default is <SAMP>`off'</SAMP>.
+<P>
+
+<DT><CODE>horizontal-scroll-mode</CODE>
+<DD><A NAME="IDX15"></A>
+This variable can be set to either <SAMP>`on'</SAMP> or <SAMP>`off'</SAMP>.  Setting it
+to <SAMP>`on'</SAMP> means that the text of the lines being edited will scroll
+horizontally on a single screen line when they are longer than the width
+of the screen, instead of wrapping onto a new screen line.  By default,
+this variable is set to <SAMP>`off'</SAMP>.
+<P>
+
+<DT><CODE>input-meta</CODE>
+<DD><A NAME="IDX16"></A>
+<A NAME="IDX17"></A>
+If set to <SAMP>`on'</SAMP>, Readline will enable eight-bit input (it
+will not clear the eighth bit in the characters it reads),
+regardless of what the terminal claims it can support.  The
+default value is <SAMP>`off'</SAMP>.  The name <CODE>meta-flag</CODE> is a
+synonym for this variable.
+<P>
+
+<DT><CODE>isearch-terminators</CODE>
+<DD><A NAME="IDX18"></A>
+The string of characters that should terminate an incremental search without
+subsequently executing the character as a command (see section <A HREF="rluserman.html#SEC8">1.2.5 Searching for Commands in the History</A>).
+If this variable has not been given a value, the characters <KBD>ESC</KBD> and
+<KBD>C-J</KBD> will terminate an incremental search.
+<P>
+
+<DT><CODE>keymap</CODE>
+<DD><A NAME="IDX19"></A>
+Sets Readline's idea of the current keymap for key binding commands.
+Acceptable <CODE>keymap</CODE> names are
+<CODE>emacs</CODE>,
+<CODE>emacs-standard</CODE>,
+<CODE>emacs-meta</CODE>,
+<CODE>emacs-ctlx</CODE>,
+<CODE>vi</CODE>,
+<CODE>vi-move</CODE>,
+<CODE>vi-command</CODE>, and
+<CODE>vi-insert</CODE>.
+<CODE>vi</CODE> is equivalent to <CODE>vi-command</CODE>; <CODE>emacs</CODE> is
+equivalent to <CODE>emacs-standard</CODE>.  The default value is <CODE>emacs</CODE>.
+The value of the <CODE>editing-mode</CODE> variable also affects the
+default keymap.
+<P>
+
+<DT><CODE>mark-directories</CODE>
+<DD>If set to <SAMP>`on'</SAMP>, completed directory names have a slash
+appended.  The default is <SAMP>`on'</SAMP>.
+<P>
+
+<DT><CODE>mark-modified-lines</CODE>
+<DD><A NAME="IDX20"></A>
+This variable, when set to <SAMP>`on'</SAMP>, causes Readline to display an
+asterisk (<SAMP>`*'</SAMP>) at the start of history lines which have been modified.
+This variable is <SAMP>`off'</SAMP> by default.
+<P>
+
+<DT><CODE>mark-symlinked-directories</CODE>
+<DD><A NAME="IDX21"></A>
+If set to <SAMP>`on'</SAMP>, completed names which are symbolic links
+to directories have a slash appended (subject to the value of
+<CODE>mark-directories</CODE>).
+The default is <SAMP>`off'</SAMP>.
+<P>
+
+<DT><CODE>match-hidden-files</CODE>
+<DD><A NAME="IDX22"></A>
+This variable, when set to <SAMP>`on'</SAMP>, causes Readline to match files whose
+names begin with a <SAMP>`.'</SAMP> (hidden files) when performing filename
+completion, unless the leading <SAMP>`.'</SAMP> is
+supplied by the user in the filename to be completed.
+This variable is <SAMP>`on'</SAMP> by default.
+<P>
+
+<DT><CODE>output-meta</CODE>
+<DD><A NAME="IDX23"></A>
+If set to <SAMP>`on'</SAMP>, Readline will display characters with the
+eighth bit set directly rather than as a meta-prefixed escape
+sequence.  The default is <SAMP>`off'</SAMP>.
+<P>
+
+<DT><CODE>page-completions</CODE>
+<DD><A NAME="IDX24"></A>
+If set to <SAMP>`on'</SAMP>, Readline uses an internal <CODE>more</CODE>-like pager
+to display a screenful of possible completions at a time.
+This variable is <SAMP>`on'</SAMP> by default.
+<P>
+
+<DT><CODE>print-completions-horizontally</CODE>
+<DD>If set to <SAMP>`on'</SAMP>, Readline will display completions with matches
+sorted horizontally in alphabetical order, rather than down the screen.
+The default is <SAMP>`off'</SAMP>.
+<P>
+
+<DT><CODE>show-all-if-ambiguous</CODE>
+<DD><A NAME="IDX25"></A>
+This alters the default behavior of the completion functions.  If
+set to <SAMP>`on'</SAMP>, 
+words which have more than one possible completion cause the
+matches to be listed immediately instead of ringing the bell.
+The default value is <SAMP>`off'</SAMP>.
+<P>
+
+<DT><CODE>show-all-if-unmodified</CODE>
+<DD><A NAME="IDX26"></A>
+This alters the default behavior of the completion functions in
+a fashion similar to <VAR>show-all-if-ambiguous</VAR>.
+If set to <SAMP>`on'</SAMP>, 
+words which have more than one possible completion without any
+possible partial completion (the possible completions don't share
+a common prefix) cause the matches to be listed immediately instead
+of ringing the bell.
+The default value is <SAMP>`off'</SAMP>.
+<P>
+
+<DT><CODE>visible-stats</CODE>
+<DD><A NAME="IDX27"></A>
+If set to <SAMP>`on'</SAMP>, a character denoting a file's type
+is appended to the filename when listing possible
+completions.  The default is <SAMP>`off'</SAMP>.
+<P>
+
+</DL>
+<P>
+
+<DT>Key Bindings
+<DD>The syntax for controlling key bindings in the init file is
+simple.  First you need to find the name of the command that you
+want to change.  The following sections contain tables of the command
+name, the default keybinding, if any, and a short description of what
+the command does.
+<P>
+
+Once you know the name of the command, simply place on a line
+in the init file the name of the key
+you wish to bind the command to, a colon, and then the name of the
+command.
+There can be no space between the key name and the colon -- that will be
+interpreted as part of the key name.
+The name of the key can be expressed in different ways, depending on
+what you find most comfortable.
+</P><P>
+
+In addition to command names, readline allows keys to be bound
+to a string that is inserted when the key is pressed (a <VAR>macro</VAR>).
+</P><P>
+
+<DL COMPACT>
+<DT><VAR>keyname</VAR>: <VAR>function-name</VAR> or <VAR>macro</VAR>
+<DD><VAR>keyname</VAR> is the name of a key spelled out in English.  For example:
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>Control-u: universal-argument
+Meta-Rubout: backward-kill-word
+Control-o: "&#62; output"
+</pre></td></tr></table><P>
+
+In the above example, <KBD>C-u</KBD> is bound to the function
+<CODE>universal-argument</CODE>,
+<KBD>M-DEL</KBD> is bound to the function <CODE>backward-kill-word</CODE>, and
+<KBD>C-o</KBD> is bound to run the macro
+expressed on the right hand side (that is, to insert the text
+<SAMP>`&#62; output'</SAMP> into the line).
+</P><P>
+
+A number of symbolic character names are recognized while
+processing this key binding syntax:
+<VAR>DEL</VAR>,
+<VAR>ESC</VAR>,
+<VAR>ESCAPE</VAR>,
+<VAR>LFD</VAR>,
+<VAR>NEWLINE</VAR>,
+<VAR>RET</VAR>,
+<VAR>RETURN</VAR>,
+<VAR>RUBOUT</VAR>,
+<VAR>SPACE</VAR>,
+<VAR>SPC</VAR>,
+and
+<VAR>TAB</VAR>.
+</P><P>
+
+<DT>"<VAR>keyseq</VAR>": <VAR>function-name</VAR> or <VAR>macro</VAR>
+<DD><VAR>keyseq</VAR> differs from <VAR>keyname</VAR> above in that strings
+denoting an entire key sequence can be specified, by placing
+the key sequence in double quotes.  Some GNU Emacs style key
+escapes can be used, as in the following example, but the
+special character names are not recognized.
+<P>
+
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>"\C-u": universal-argument
+"\C-x\C-r": re-read-init-file
+"\e[11~": "Function Key 1"
+</pre></td></tr></table></P><P>
+
+In the above example, <KBD>C-u</KBD> is again bound to the function
+<CODE>universal-argument</CODE> (just as it was in the first example),
+<SAMP>`<KBD>C-x</KBD> <KBD>C-r</KBD>'</SAMP> is bound to the function <CODE>re-read-init-file</CODE>,
+and <SAMP>`<KBD>ESC</KBD> <KBD>[</KBD> <KBD>1</KBD> <KBD>1</KBD> <KBD>~</KBD>'</SAMP> is bound to insert
+the text <SAMP>`Function Key 1'</SAMP>.
+</P><P>
+
+</DL>
+<P>
+
+The following GNU Emacs style escape sequences are available when
+specifying key sequences:
+</P><P>
+
+<DL COMPACT>
+<DT><CODE><KBD>\C-</KBD></CODE>
+<DD>control prefix
+<DT><CODE><KBD>\M-</KBD></CODE>
+<DD>meta prefix
+<DT><CODE><KBD>\e</KBD></CODE>
+<DD>an escape character
+<DT><CODE><KBD>\\</KBD></CODE>
+<DD>backslash
+<DT><CODE><KBD>\"</KBD></CODE>
+<DD><KBD>"</KBD>, a double quotation mark
+<DT><CODE><KBD>\'</KBD></CODE>
+<DD><KBD>'</KBD>, a single quote or apostrophe
+</DL>
+<P>
+
+In addition to the GNU Emacs style escape sequences, a second
+set of backslash escapes is available:
+</P><P>
+
+<DL COMPACT>
+<DT><CODE>\a</CODE>
+<DD>alert (bell)
+<DT><CODE>\b</CODE>
+<DD>backspace
+<DT><CODE>\d</CODE>
+<DD>delete
+<DT><CODE>\f</CODE>
+<DD>form feed
+<DT><CODE>\n</CODE>
+<DD>newline
+<DT><CODE>\r</CODE>
+<DD>carriage return
+<DT><CODE>\t</CODE>
+<DD>horizontal tab
+<DT><CODE>\v</CODE>
+<DD>vertical tab
+<DT><CODE>\<VAR>nnn</VAR></CODE>
+<DD>the eight-bit character whose value is the octal value <VAR>nnn</VAR>
+(one to three digits)
+<DT><CODE>\x<VAR>HH</VAR></CODE>
+<DD>the eight-bit character whose value is the hexadecimal value <VAR>HH</VAR>
+(one or two hex digits)
+</DL>
+<P>
+
+When entering the text of a macro, single or double quotes must
+be used to indicate a macro definition.
+Unquoted text is assumed to be a function name.
+In the macro body, the backslash escapes described above are expanded.
+Backslash will quote any other character in the macro text,
+including <SAMP>`"'</SAMP> and <SAMP>`''</SAMP>.
+For example, the following binding will make <SAMP>`<KBD>C-x</KBD> \'</SAMP>
+insert a single <SAMP>`\'</SAMP> into the line:
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>"\C-x\\": "\\"
+</pre></td></tr></table></P><P>
+
+</DL>
+<P>
+
+<A NAME="Conditional Init Constructs"></A>
+<HR SIZE="6">
+<A NAME="SEC11"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC10"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC12"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC12"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC9"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC13"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> 1.3.2 Conditional Init Constructs </H3>
+<!--docid::SEC11::-->
+<P>
+
+Readline implements a facility similar in spirit to the conditional
+compilation features of the C preprocessor which allows key
+bindings and variable settings to be performed as the result
+of tests.  There are four parser directives used.
+</P><P>
+
+<DL COMPACT>
+<DT><CODE>$if</CODE>
+<DD>The <CODE>$if</CODE> construct allows bindings to be made based on the
+editing mode, the terminal being used, or the application using
+Readline.  The text of the test extends to the end of the line;
+no characters are required to isolate it.
+<P>
+
+<DL COMPACT>
+<DT><CODE>mode</CODE>
+<DD>The <CODE>mode=</CODE> form of the <CODE>$if</CODE> directive is used to test
+whether Readline is in <CODE>emacs</CODE> or <CODE>vi</CODE> mode.
+This may be used in conjunction
+with the <SAMP>`set keymap'</SAMP> command, for instance, to set bindings in
+the <CODE>emacs-standard</CODE> and <CODE>emacs-ctlx</CODE> keymaps only if
+Readline is starting out in <CODE>emacs</CODE> mode.
+<P>
+
+<DT><CODE>term</CODE>
+<DD>The <CODE>term=</CODE> form may be used to include terminal-specific
+key bindings, perhaps to bind the key sequences output by the
+terminal's function keys.  The word on the right side of the
+<SAMP>`='</SAMP> is tested against both the full name of the terminal and
+the portion of the terminal name before the first <SAMP>`-'</SAMP>.  This
+allows <CODE>sun</CODE> to match both <CODE>sun</CODE> and <CODE>sun-cmd</CODE>,
+for instance.
+<P>
+
+<DT><CODE>application</CODE>
+<DD>The <VAR>application</VAR> construct is used to include
+application-specific settings.  Each program using the Readline
+library sets the <VAR>application name</VAR>, and you can test for
+a particular value. 
+This could be used to bind key sequences to functions useful for
+a specific program.  For instance, the following command adds a
+key sequence that quotes the current or previous word in Bash:
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>$if Bash
+# Quote the current or previous word
+"\C-xq": "\eb\"\ef\""
+$endif
+</pre></td></tr></table></DL>
+<P>
+
+<DT><CODE>$endif</CODE>
+<DD>This command, as seen in the previous example, terminates an
+<CODE>$if</CODE> command.
+<P>
+
+<DT><CODE>$else</CODE>
+<DD>Commands in this branch of the <CODE>$if</CODE> directive are executed if
+the test fails.
+<P>
+
+<DT><CODE>$include</CODE>
+<DD>This directive takes a single filename as an argument and reads commands
+and bindings from that file.
+For example, the following directive reads from <TT>`/etc/inputrc'</TT>:
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>$include /etc/inputrc
+</pre></td></tr></table></DL>
+<P>
+
+<A NAME="Sample Init File"></A>
+<HR SIZE="6">
+<A NAME="SEC12"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC11"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC13"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC13"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC9"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC13"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> 1.3.3 Sample Init File </H3>
+<!--docid::SEC12::-->
+<P>
+
+Here is an example of an <VAR>inputrc</VAR> file.  This illustrates key
+binding, variable assignment, and conditional syntax.
+</P><P>
+
+<TABLE><tr><td>&nbsp;</td><td class=example><pre># This file controls the behaviour of line input editing for
+# programs that use the GNU Readline library.  Existing
+# programs include FTP, Bash, and GDB.
+#
+# You can re-read the inputrc file with C-x C-r.
+# Lines beginning with '#' are comments.
+#
+# First, include any systemwide bindings and variable
+# assignments from /etc/Inputrc
+$include /etc/Inputrc
+
+#
+# Set various bindings for emacs mode.
+
+set editing-mode emacs 
+
+$if mode=emacs
+
+Meta-Control-h:        backward-kill-word      Text after the function name is ignored
+
+#
+# Arrow keys in keypad mode
+#
+#"\M-OD":        backward-char
+#"\M-OC":        forward-char
+#"\M-OA":        previous-history
+#"\M-OB":        next-history
+#
+# Arrow keys in ANSI mode
+#
+"\M-[D":        backward-char
+"\M-[C":        forward-char
+"\M-[A":        previous-history
+"\M-[B":        next-history
+#
+# Arrow keys in 8 bit keypad mode
+#
+#"\M-\C-OD":       backward-char
+#"\M-\C-OC":       forward-char
+#"\M-\C-OA":       previous-history
+#"\M-\C-OB":       next-history
+#
+# Arrow keys in 8 bit ANSI mode
+#
+#"\M-\C-[D":       backward-char
+#"\M-\C-[C":       forward-char
+#"\M-\C-[A":       previous-history
+#"\M-\C-[B":       next-history
+
+C-q: quoted-insert
+
+$endif
+
+# An old-style binding.  This happens to be the default.
+TAB: complete
+
+# Macros that are convenient for shell interaction
+$if Bash
+# edit the path
+"\C-xp": "PATH=${PATH}\e\C-e\C-a\ef\C-f"
+# prepare to type a quoted word --
+# insert open and close double quotes
+# and move to just after the open quote
+"\C-x\"": "\"\"\C-b"
+# insert a backslash (testing backslash escapes
+# in sequences and macros)
+"\C-x\\": "\\"
+# Quote the current or previous word
+"\C-xq": "\eb\"\ef\""
+# Add a binding to refresh the line, which is unbound
+"\C-xr": redraw-current-line
+# Edit variable on current line.
+"\M-\C-v": "\C-a\C-k$\C-y\M-\C-e\C-a\C-y="
+$endif
+
+# use a visible bell if one is available
+set bell-style visible
+
+# don't strip characters to 7 bits when reading
+set input-meta on
+
+# allow iso-latin1 characters to be inserted rather
+# than converted to prefix-meta sequences
+set convert-meta off
+
+# display characters with the eighth bit set directly
+# rather than as meta-prefixed characters
+set output-meta on
+
+# if there are more than 150 possible completions for
+# a word, ask the user if he wants to see all of them
+set completion-query-items 150
+
+# For FTP
+$if Ftp
+"\C-xg": "get \M-?"
+"\C-xt": "put \M-?"
+"\M-.": yank-last-arg
+$endif
+</pre></td></tr></table></P><P>
+
+<A NAME="Bindable Readline Commands"></A>
+<HR SIZE="6">
+<A NAME="SEC13"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC12"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC14"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC22"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC1"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC22"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H2> 1.4 Bindable Readline Commands </H2>
+<!--docid::SEC13::-->
+<P>
+
+<BLOCKQUOTE><TABLE BORDER=0 CELLSPACING=0> 
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="rluserman.html#SEC14">1.4.1 Commands For Moving</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Moving about the line.</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="rluserman.html#SEC15">1.4.2 Commands For Manipulating The History</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Getting at previous lines.</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="rluserman.html#SEC16">1.4.3 Commands For Changing Text</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Commands for changing text.</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="rluserman.html#SEC17">1.4.4 Killing And Yanking</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Commands for killing and yanking.</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="rluserman.html#SEC18">1.4.5 Specifying Numeric Arguments</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Specifying numeric arguments, repeat counts.</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="rluserman.html#SEC19">1.4.6 Letting Readline Type For You</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Getting Readline to do the typing for you.</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="rluserman.html#SEC20">1.4.7 Keyboard Macros</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Saving and re-executing typed characters</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="rluserman.html#SEC21">1.4.8 Some Miscellaneous Commands</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Other miscellaneous commands.</TD></TR>
+</TABLE></BLOCKQUOTE>
+<P>
+
+This section describes Readline commands that may be bound to key
+sequences.
+Command names without an accompanying key sequence are unbound by default.
+</P><P>
+
+In the following descriptions, <EM>point</EM> refers to the current cursor
+position, and <EM>mark</EM> refers to a cursor position saved by the
+<CODE>set-mark</CODE> command.
+The text between the point and mark is referred to as the <EM>region</EM>.
+</P><P>
+
+<A NAME="Commands For Moving"></A>
+<HR SIZE="6">
+<A NAME="SEC14"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC13"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC15"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC22"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC13"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC22"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> 1.4.1 Commands For Moving </H3>
+<!--docid::SEC14::-->
+<DL COMPACT>
+<A NAME="IDX28"></A>
+<DT><CODE>beginning-of-line (C-a)</CODE>
+<DD><A NAME="IDX29"></A>
+Move to the start of the current line.
+<P>
+
+<A NAME="IDX30"></A>
+<DT><CODE>end-of-line (C-e)</CODE>
+<DD><A NAME="IDX31"></A>
+Move to the end of the line.
+<P>
+
+<A NAME="IDX32"></A>
+<DT><CODE>forward-char (C-f)</CODE>
+<DD><A NAME="IDX33"></A>
+Move forward a character.
+<P>
+
+<A NAME="IDX34"></A>
+<DT><CODE>backward-char (C-b)</CODE>
+<DD><A NAME="IDX35"></A>
+Move back a character.
+<P>
+
+<A NAME="IDX36"></A>
+<DT><CODE>forward-word (M-f)</CODE>
+<DD><A NAME="IDX37"></A>
+Move forward to the end of the next word.  Words are composed of
+letters and digits.
+<P>
+
+<A NAME="IDX38"></A>
+<DT><CODE>backward-word (M-b)</CODE>
+<DD><A NAME="IDX39"></A>
+Move back to the start of the current or previous word.  Words are
+composed of letters and digits.
+<P>
+
+<A NAME="IDX40"></A>
+<DT><CODE>clear-screen (C-l)</CODE>
+<DD><A NAME="IDX41"></A>
+Clear the screen and redraw the current line,
+leaving the current line at the top of the screen.
+<P>
+
+<A NAME="IDX42"></A>
+<DT><CODE>redraw-current-line ()</CODE>
+<DD><A NAME="IDX43"></A>
+Refresh the current line.  By default, this is unbound.
+<P>
+
+</DL>
+<P>
+
+<A NAME="Commands For History"></A>
+<HR SIZE="6">
+<A NAME="SEC15"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC14"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC16"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC16"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC13"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC22"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> 1.4.2 Commands For Manipulating The History </H3>
+<!--docid::SEC15::-->
+<P>
+
+<DL COMPACT>
+<A NAME="IDX44"></A>
+<DT><CODE>accept-line (Newline or Return)</CODE>
+<DD><A NAME="IDX45"></A>
+Accept the line regardless of where the cursor is.
+If this line is
+non-empty, it may be added to the history list for future recall with
+<CODE>add_history()</CODE>.
+If this line is a modified history line, the history line is restored
+to its original state.
+<P>
+
+<A NAME="IDX46"></A>
+<DT><CODE>previous-history (C-p)</CODE>
+<DD><A NAME="IDX47"></A>
+Move `back' through the history list, fetching the previous command.
+<P>
+
+<A NAME="IDX48"></A>
+<DT><CODE>next-history (C-n)</CODE>
+<DD><A NAME="IDX49"></A>
+Move `forward' through the history list, fetching the next command.
+<P>
+
+<A NAME="IDX50"></A>
+<DT><CODE>beginning-of-history (M-&#60;)</CODE>
+<DD><A NAME="IDX51"></A>
+Move to the first line in the history.
+<P>
+
+<A NAME="IDX52"></A>
+<DT><CODE>end-of-history (M-&#62;)</CODE>
+<DD><A NAME="IDX53"></A>
+Move to the end of the input history, i.e., the line currently
+being entered.
+<P>
+
+<A NAME="IDX54"></A>
+<DT><CODE>reverse-search-history (C-r)</CODE>
+<DD><A NAME="IDX55"></A>
+Search backward starting at the current line and moving `up' through
+the history as necessary.  This is an incremental search.
+<P>
+
+<A NAME="IDX56"></A>
+<DT><CODE>forward-search-history (C-s)</CODE>
+<DD><A NAME="IDX57"></A>
+Search forward starting at the current line and moving `down' through
+the the history as necessary.  This is an incremental search.
+<P>
+
+<A NAME="IDX58"></A>
+<DT><CODE>non-incremental-reverse-search-history (M-p)</CODE>
+<DD><A NAME="IDX59"></A>
+Search backward starting at the current line and moving `up'
+through the history as necessary using a non-incremental search
+for a string supplied by the user.
+<P>
+
+<A NAME="IDX60"></A>
+<DT><CODE>non-incremental-forward-search-history (M-n)</CODE>
+<DD><A NAME="IDX61"></A>
+Search forward starting at the current line and moving `down'
+through the the history as necessary using a non-incremental search
+for a string supplied by the user.
+<P>
+
+<A NAME="IDX62"></A>
+<DT><CODE>history-search-forward ()</CODE>
+<DD><A NAME="IDX63"></A>
+Search forward through the history for the string of characters
+between the start of the current line and the point.
+This is a non-incremental search.
+By default, this command is unbound.
+<P>
+
+<A NAME="IDX64"></A>
+<DT><CODE>history-search-backward ()</CODE>
+<DD><A NAME="IDX65"></A>
+Search backward through the history for the string of characters
+between the start of the current line and the point.  This
+is a non-incremental search.  By default, this command is unbound.
+<P>
+
+<A NAME="IDX66"></A>
+<DT><CODE>yank-nth-arg (M-C-y)</CODE>
+<DD><A NAME="IDX67"></A>
+Insert the first argument to the previous command (usually
+the second word on the previous line) at point.
+With an argument <VAR>n</VAR>,
+insert the <VAR>n</VAR>th word from the previous command (the words
+in the previous command begin with word 0).  A negative argument
+inserts the <VAR>n</VAR>th word from the end of the previous command.
+Once the argument <VAR>n</VAR> is computed, the argument is extracted
+as if the <SAMP>`!<VAR>n</VAR>'</SAMP> history expansion had been specified.
+<P>
+
+<A NAME="IDX68"></A>
+<DT><CODE>yank-last-arg (M-. or M-_)</CODE>
+<DD><A NAME="IDX69"></A>
+Insert last argument to the previous command (the last word of the
+previous history entry).  With an
+argument, behave exactly like <CODE>yank-nth-arg</CODE>.
+Successive calls to <CODE>yank-last-arg</CODE> move back through the history
+list, inserting the last argument of each line in turn.
+The history expansion facilities are used to extract the last argument,
+as if the <SAMP>`!$'</SAMP> history expansion had been specified.
+<P>
+
+</DL>
+<P>
+
+<A NAME="Commands For Text"></A>
+<HR SIZE="6">
+<A NAME="SEC16"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC15"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC17"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC17"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC13"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC22"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> 1.4.3 Commands For Changing Text </H3>
+<!--docid::SEC16::-->
+<P>
+
+<DL COMPACT>
+<A NAME="IDX70"></A>
+<DT><CODE>delete-char (C-d)</CODE>
+<DD><A NAME="IDX71"></A>
+Delete the character at point.  If point is at the
+beginning of the line, there are no characters in the line, and
+the last character typed was not bound to <CODE>delete-char</CODE>, then
+return EOF.
+<P>
+
+<A NAME="IDX72"></A>
+<DT><CODE>backward-delete-char (Rubout)</CODE>
+<DD><A NAME="IDX73"></A>
+Delete the character behind the cursor.  A numeric argument means
+to kill the characters instead of deleting them.
+<P>
+
+<A NAME="IDX74"></A>
+<DT><CODE>forward-backward-delete-char ()</CODE>
+<DD><A NAME="IDX75"></A>
+Delete the character under the cursor, unless the cursor is at the
+end of the line, in which case the character behind the cursor is
+deleted.  By default, this is not bound to a key.
+<P>
+
+<A NAME="IDX76"></A>
+<DT><CODE>quoted-insert (C-q or C-v)</CODE>
+<DD><A NAME="IDX77"></A>
+Add the next character typed to the line verbatim.  This is
+how to insert key sequences like <KBD>C-q</KBD>, for example.
+<P>
+
+<A NAME="IDX78"></A>
+<DT><CODE>tab-insert (M-<KBD>TAB</KBD>)</CODE>
+<DD><A NAME="IDX79"></A>
+Insert a tab character.
+<P>
+
+<A NAME="IDX80"></A>
+<DT><CODE>self-insert (a, b, A, 1, !, <small>...</small>)</CODE>
+<DD><A NAME="IDX81"></A>
+Insert yourself.
+<P>
+
+<A NAME="IDX82"></A>
+<DT><CODE>transpose-chars (C-t)</CODE>
+<DD><A NAME="IDX83"></A>
+Drag the character before the cursor forward over
+the character at the cursor, moving the
+cursor forward as well.  If the insertion point
+is at the end of the line, then this
+transposes the last two characters of the line.
+Negative arguments have no effect.
+<P>
+
+<A NAME="IDX84"></A>
+<DT><CODE>transpose-words (M-t)</CODE>
+<DD><A NAME="IDX85"></A>
+Drag the word before point past the word after point,
+moving point past that word as well.
+If the insertion point is at the end of the line, this transposes
+the last two words on the line.
+<P>
+
+<A NAME="IDX86"></A>
+<DT><CODE>upcase-word (M-u)</CODE>
+<DD><A NAME="IDX87"></A>
+Uppercase the current (or following) word.  With a negative argument,
+uppercase the previous word, but do not move the cursor.
+<P>
+
+<A NAME="IDX88"></A>
+<DT><CODE>downcase-word (M-l)</CODE>
+<DD><A NAME="IDX89"></A>
+Lowercase the current (or following) word.  With a negative argument,
+lowercase the previous word, but do not move the cursor.
+<P>
+
+<A NAME="IDX90"></A>
+<DT><CODE>capitalize-word (M-c)</CODE>
+<DD><A NAME="IDX91"></A>
+Capitalize the current (or following) word.  With a negative argument,
+capitalize the previous word, but do not move the cursor.
+<P>
+
+<A NAME="IDX92"></A>
+<DT><CODE>overwrite-mode ()</CODE>
+<DD><A NAME="IDX93"></A>
+Toggle overwrite mode.  With an explicit positive numeric argument,
+switches to overwrite mode.  With an explicit non-positive numeric
+argument, switches to insert mode.  This command affects only
+<CODE>emacs</CODE> mode; <CODE>vi</CODE> mode does overwrite differently.
+Each call to <CODE>readline()</CODE> starts in insert mode.
+<P>
+
+In overwrite mode, characters bound to <CODE>self-insert</CODE> replace
+the text at point rather than pushing the text to the right.
+Characters bound to <CODE>backward-delete-char</CODE> replace the character
+before point with a space.
+</P><P>
+
+By default, this command is unbound.
+</P><P>
+
+</DL>
+<P>
+
+<A NAME="Commands For Killing"></A>
+<HR SIZE="6">
+<A NAME="SEC17"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC16"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC18"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC18"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC13"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC22"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> 1.4.4 Killing And Yanking </H3>
+<!--docid::SEC17::-->
+<P>
+
+<DL COMPACT>
+
+<A NAME="IDX94"></A>
+<DT><CODE>kill-line (C-k)</CODE>
+<DD><A NAME="IDX95"></A>
+Kill the text from point to the end of the line.
+<P>
+
+<A NAME="IDX96"></A>
+<DT><CODE>backward-kill-line (C-x Rubout)</CODE>
+<DD><A NAME="IDX97"></A>
+Kill backward to the beginning of the line.
+<P>
+
+<A NAME="IDX98"></A>
+<DT><CODE>unix-line-discard (C-u)</CODE>
+<DD><A NAME="IDX99"></A>
+Kill backward from the cursor to the beginning of the current line.
+<P>
+
+<A NAME="IDX100"></A>
+<DT><CODE>kill-whole-line ()</CODE>
+<DD><A NAME="IDX101"></A>
+Kill all characters on the current line, no matter where point is.
+By default, this is unbound.
+<P>
+
+<A NAME="IDX102"></A>
+<DT><CODE>kill-word (M-d)</CODE>
+<DD><A NAME="IDX103"></A>
+Kill from point to the end of the current word, or if between
+words, to the end of the next word.
+Word boundaries are the same as <CODE>forward-word</CODE>.
+<P>
+
+<A NAME="IDX104"></A>
+<DT><CODE>backward-kill-word (M-<KBD>DEL</KBD>)</CODE>
+<DD><A NAME="IDX105"></A>
+Kill the word behind point.
+Word boundaries are the same as <CODE>backward-word</CODE>.
+<P>
+
+<A NAME="IDX106"></A>
+<DT><CODE>unix-word-rubout (C-w)</CODE>
+<DD><A NAME="IDX107"></A>
+Kill the word behind point, using white space as a word boundary.
+The killed text is saved on the kill-ring.
+<P>
+
+<A NAME="IDX108"></A>
+<DT><CODE>unix-filename-rubout ()</CODE>
+<DD><A NAME="IDX109"></A>
+Kill the word behind point, using white space and the slash character
+as the word boundaries.
+The killed text is saved on the kill-ring.
+<P>
+
+<A NAME="IDX110"></A>
+<DT><CODE>delete-horizontal-space ()</CODE>
+<DD><A NAME="IDX111"></A>
+Delete all spaces and tabs around point.  By default, this is unbound.
+<P>
+
+<A NAME="IDX112"></A>
+<DT><CODE>kill-region ()</CODE>
+<DD><A NAME="IDX113"></A>
+Kill the text in the current region.
+By default, this command is unbound.
+<P>
+
+<A NAME="IDX114"></A>
+<DT><CODE>copy-region-as-kill ()</CODE>
+<DD><A NAME="IDX115"></A>
+Copy the text in the region to the kill buffer, so it can be yanked
+right away.  By default, this command is unbound.
+<P>
+
+<A NAME="IDX116"></A>
+<DT><CODE>copy-backward-word ()</CODE>
+<DD><A NAME="IDX117"></A>
+Copy the word before point to the kill buffer.
+The word boundaries are the same as <CODE>backward-word</CODE>.
+By default, this command is unbound.
+<P>
+
+<A NAME="IDX118"></A>
+<DT><CODE>copy-forward-word ()</CODE>
+<DD><A NAME="IDX119"></A>
+Copy the word following point to the kill buffer.
+The word boundaries are the same as <CODE>forward-word</CODE>.
+By default, this command is unbound.
+<P>
+
+<A NAME="IDX120"></A>
+<DT><CODE>yank (C-y)</CODE>
+<DD><A NAME="IDX121"></A>
+Yank the top of the kill ring into the buffer at point.
+<P>
+
+<A NAME="IDX122"></A>
+<DT><CODE>yank-pop (M-y)</CODE>
+<DD><A NAME="IDX123"></A>
+Rotate the kill-ring, and yank the new top.  You can only do this if
+the prior command is <CODE>yank</CODE> or <CODE>yank-pop</CODE>.
+</DL>
+<P>
+
+<A NAME="Numeric Arguments"></A>
+<HR SIZE="6">
+<A NAME="SEC18"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC17"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC19"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC19"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC13"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC22"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> 1.4.5 Specifying Numeric Arguments </H3>
+<!--docid::SEC18::-->
+<DL COMPACT>
+
+<A NAME="IDX124"></A>
+<DT><CODE>digit-argument (<KBD>M-0</KBD>, <KBD>M-1</KBD>, <small>...</small> <KBD>M--</KBD>)</CODE>
+<DD><A NAME="IDX125"></A>
+Add this digit to the argument already accumulating, or start a new
+argument.  <KBD>M--</KBD> starts a negative argument.
+<P>
+
+<A NAME="IDX126"></A>
+<DT><CODE>universal-argument ()</CODE>
+<DD><A NAME="IDX127"></A>
+This is another way to specify an argument.
+If this command is followed by one or more digits, optionally with a
+leading minus sign, those digits define the argument.
+If the command is followed by digits, executing <CODE>universal-argument</CODE>
+again ends the numeric argument, but is otherwise ignored.
+As a special case, if this command is immediately followed by a
+character that is neither a digit or minus sign, the argument count
+for the next command is multiplied by four.
+The argument count is initially one, so executing this function the
+first time makes the argument count four, a second time makes the
+argument count sixteen, and so on.
+By default, this is not bound to a key.
+</DL>
+<P>
+
+<A NAME="Commands For Completion"></A>
+<HR SIZE="6">
+<A NAME="SEC19"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC18"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC20"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC20"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC13"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC22"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> 1.4.6 Letting Readline Type For You </H3>
+<!--docid::SEC19::-->
+<P>
+
+<DL COMPACT>
+<A NAME="IDX128"></A>
+<DT><CODE>complete (<KBD>TAB</KBD>)</CODE>
+<DD><A NAME="IDX129"></A>
+Attempt to perform completion on the text before point.
+The actual completion performed is application-specific.
+The default is filename completion.
+<P>
+
+<A NAME="IDX130"></A>
+<DT><CODE>possible-completions (M-?)</CODE>
+<DD><A NAME="IDX131"></A>
+List the possible completions of the text before point.
+<P>
+
+<A NAME="IDX132"></A>
+<DT><CODE>insert-completions (M-*)</CODE>
+<DD><A NAME="IDX133"></A>
+Insert all completions of the text before point that would have
+been generated by <CODE>possible-completions</CODE>.
+<P>
+
+<A NAME="IDX134"></A>
+<DT><CODE>menu-complete ()</CODE>
+<DD><A NAME="IDX135"></A>
+Similar to <CODE>complete</CODE>, but replaces the word to be completed
+with a single match from the list of possible completions.
+Repeated execution of <CODE>menu-complete</CODE> steps through the list
+of possible completions, inserting each match in turn.
+At the end of the list of completions, the bell is rung
+(subject to the setting of <CODE>bell-style</CODE>)
+and the original text is restored.
+An argument of <VAR>n</VAR> moves <VAR>n</VAR> positions forward in the list
+of matches; a negative argument may be used to move backward
+through the list.
+This command is intended to be bound to <KBD>TAB</KBD>, but is unbound
+by default.
+<P>
+
+<A NAME="IDX136"></A>
+<DT><CODE>delete-char-or-list ()</CODE>
+<DD><A NAME="IDX137"></A>
+Deletes the character under the cursor if not at the beginning or
+end of the line (like <CODE>delete-char</CODE>).
+If at the end of the line, behaves identically to
+<CODE>possible-completions</CODE>.
+This command is unbound by default.
+<P>
+
+</DL>
+<P>
+
+<A NAME="Keyboard Macros"></A>
+<HR SIZE="6">
+<A NAME="SEC20"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC19"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC21"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC21"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC13"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC22"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> 1.4.7 Keyboard Macros </H3>
+<!--docid::SEC20::-->
+<DL COMPACT>
+
+<A NAME="IDX138"></A>
+<DT><CODE>start-kbd-macro (C-x ()</CODE>
+<DD><A NAME="IDX139"></A>
+Begin saving the characters typed into the current keyboard macro.
+<P>
+
+<A NAME="IDX140"></A>
+<DT><CODE>end-kbd-macro (C-x ))</CODE>
+<DD><A NAME="IDX141"></A>
+Stop saving the characters typed into the current keyboard macro
+and save the definition.
+<P>
+
+<A NAME="IDX142"></A>
+<DT><CODE>call-last-kbd-macro (C-x e)</CODE>
+<DD><A NAME="IDX143"></A>
+Re-execute the last keyboard macro defined, by making the characters
+in the macro appear as if typed at the keyboard.
+<P>
+
+</DL>
+<P>
+
+<A NAME="Miscellaneous Commands"></A>
+<HR SIZE="6">
+<A NAME="SEC21"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC20"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC22"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC22"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC13"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC22"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> 1.4.8 Some Miscellaneous Commands </H3>
+<!--docid::SEC21::-->
+<DL COMPACT>
+
+<A NAME="IDX144"></A>
+<DT><CODE>re-read-init-file (C-x C-r)</CODE>
+<DD><A NAME="IDX145"></A>
+Read in the contents of the <VAR>inputrc</VAR> file, and incorporate
+any bindings or variable assignments found there.
+<P>
+
+<A NAME="IDX146"></A>
+<DT><CODE>abort (C-g)</CODE>
+<DD><A NAME="IDX147"></A>
+Abort the current editing command and
+ring the terminal's bell (subject to the setting of
+<CODE>bell-style</CODE>).
+<P>
+
+<A NAME="IDX148"></A>
+<DT><CODE>do-uppercase-version (M-a, M-b, M-<VAR>x</VAR>, <small>...</small>)</CODE>
+<DD><A NAME="IDX149"></A>
+If the metafied character <VAR>x</VAR> is lowercase, run the command
+that is bound to the corresponding uppercase character.
+<P>
+
+<A NAME="IDX150"></A>
+<DT><CODE>prefix-meta (<KBD>ESC</KBD>)</CODE>
+<DD><A NAME="IDX151"></A>
+Metafy the next character typed.  This is for keyboards
+without a meta key.  Typing <SAMP>`<KBD>ESC</KBD> f'</SAMP> is equivalent to typing
+<KBD>M-f</KBD>.
+<P>
+
+<A NAME="IDX152"></A>
+<DT><CODE>undo (C-_ or C-x C-u)</CODE>
+<DD><A NAME="IDX153"></A>
+Incremental undo, separately remembered for each line.
+<P>
+
+<A NAME="IDX154"></A>
+<DT><CODE>revert-line (M-r)</CODE>
+<DD><A NAME="IDX155"></A>
+Undo all changes made to this line.  This is like executing the <CODE>undo</CODE>
+command enough times to get back to the beginning.
+<P>
+
+<A NAME="IDX156"></A>
+<DT><CODE>tilde-expand (M-~)</CODE>
+<DD><A NAME="IDX157"></A>
+Perform tilde expansion on the current word.
+<P>
+
+<A NAME="IDX158"></A>
+<DT><CODE>set-mark (C-@)</CODE>
+<DD><A NAME="IDX159"></A>
+Set the mark to the point.  If a
+numeric argument is supplied, the mark is set to that position.
+<P>
+
+<A NAME="IDX160"></A>
+<DT><CODE>exchange-point-and-mark (C-x C-x)</CODE>
+<DD><A NAME="IDX161"></A>
+Swap the point with the mark.  The current cursor position is set to
+the saved position, and the old cursor position is saved as the mark.
+<P>
+
+<A NAME="IDX162"></A>
+<DT><CODE>character-search (C-])</CODE>
+<DD><A NAME="IDX163"></A>
+A character is read and point is moved to the next occurrence of that
+character.  A negative count searches for previous occurrences.
+<P>
+
+<A NAME="IDX164"></A>
+<DT><CODE>character-search-backward (M-C-])</CODE>
+<DD><A NAME="IDX165"></A>
+A character is read and point is moved to the previous occurrence
+of that character.  A negative count searches for subsequent
+occurrences.
+<P>
+
+<A NAME="IDX166"></A>
+<DT><CODE>insert-comment (M-#)</CODE>
+<DD><A NAME="IDX167"></A>
+Without a numeric argument, the value of the <CODE>comment-begin</CODE>
+variable is inserted at the beginning of the current line.
+If a numeric argument is supplied, this command acts as a toggle:  if
+the characters at the beginning of the line do not match the value
+of <CODE>comment-begin</CODE>, the value is inserted, otherwise
+the characters in <CODE>comment-begin</CODE> are deleted from the beginning of
+the line.
+In either case, the line is accepted as if a newline had been typed.
+<P>
+
+<A NAME="IDX168"></A>
+<DT><CODE>dump-functions ()</CODE>
+<DD><A NAME="IDX169"></A>
+Print all of the functions and their key bindings to the
+Readline output stream.  If a numeric argument is supplied,
+the output is formatted in such a way that it can be made part
+of an <VAR>inputrc</VAR> file.  This command is unbound by default.
+<P>
+
+<A NAME="IDX170"></A>
+<DT><CODE>dump-variables ()</CODE>
+<DD><A NAME="IDX171"></A>
+Print all of the settable variables and their values to the
+Readline output stream.  If a numeric argument is supplied,
+the output is formatted in such a way that it can be made part
+of an <VAR>inputrc</VAR> file.  This command is unbound by default.
+<P>
+
+<A NAME="IDX172"></A>
+<DT><CODE>dump-macros ()</CODE>
+<DD><A NAME="IDX173"></A>
+Print all of the Readline key sequences bound to macros and the
+strings they output.  If a numeric argument is supplied,
+the output is formatted in such a way that it can be made part
+of an <VAR>inputrc</VAR> file.  This command is unbound by default.
+<P>
+
+<A NAME="IDX174"></A>
+<DT><CODE>emacs-editing-mode (C-e)</CODE>
+<DD><A NAME="IDX175"></A>
+When in <CODE>vi</CODE> command mode, this causes a switch to <CODE>emacs</CODE>
+editing mode.
+<P>
+
+<A NAME="IDX176"></A>
+<DT><CODE>vi-editing-mode (M-C-j)</CODE>
+<DD><A NAME="IDX177"></A>
+When in <CODE>emacs</CODE> editing mode, this causes a switch to <CODE>vi</CODE>
+editing mode.
+<P>
+
+</DL>
+<P>
+
+<A NAME="Readline vi Mode"></A>
+<HR SIZE="6">
+<A NAME="SEC22"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC21"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC23"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[ &lt;&lt; ]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC1"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC23"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H2> 1.5 Readline vi Mode </H2>
+<!--docid::SEC22::-->
+<P>
+
+While the Readline library does not have a full set of <CODE>vi</CODE>
+editing functions, it does contain enough to allow simple editing
+of the line.  The Readline <CODE>vi</CODE> mode behaves as specified in
+the POSIX 1003.2 standard.
+</P><P>
+
+In order to switch interactively between <CODE>emacs</CODE> and <CODE>vi</CODE>
+editing modes, use the command <KBD>M-C-j</KBD> (bound to emacs-editing-mode
+when in <CODE>vi</CODE> mode and to vi-editing-mode in <CODE>emacs</CODE> mode).
+The Readline default is <CODE>emacs</CODE> mode.
+</P><P>
+
+When you enter a line in <CODE>vi</CODE> mode, you are already placed in
+`insertion' mode, as if you had typed an <SAMP>`i'</SAMP>.  Pressing <KBD>ESC</KBD>
+switches you into `command' mode, where you can edit the text of the
+line with the standard <CODE>vi</CODE> movement keys, move to previous
+history lines with <SAMP>`k'</SAMP> and subsequent lines with <SAMP>`j'</SAMP>, and
+so forth.
+</P><P>
+
+<A NAME="Copying This Manual"></A>
+<HR SIZE="6">
+<A NAME="SEC23"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC22"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC24"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC1"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC_Top"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[ &gt;&gt; ]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H1> A. Copying This Manual </H1>
+<!--docid::SEC23::-->
+<P>
+
+<BLOCKQUOTE><TABLE BORDER=0 CELLSPACING=0> 
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="rluserman.html#SEC24">A.1 GNU Free Documentation License</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">License for copying this manual.</TD></TR>
+</TABLE></BLOCKQUOTE>
+<P>
+
+<A NAME="GNU Free Documentation License"></A>
+<HR SIZE="6">
+<A NAME="SEC24"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC23"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC25"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC23"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC23"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[ &gt;&gt; ]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H2> A.1 GNU Free Documentation License </H2>
+<!--docid::SEC24::-->
+<P>
+
+<A NAME="IDX178"></A>
+<center>
+ Version 1.2, November 2002
+</center>
+</P><P>
+
+<TABLE><tr><td>&nbsp;</td><td class=display><pre style="font-family: serif">Copyright (C) 2000,2001,2002 Free Software Foundation, Inc.
+59 Temple Place, Suite 330, Boston, MA  02111-1307, USA
+
+Everyone is permitted to copy and distribute verbatim copies
+of this license document, but changing it is not allowed.
+</pre></td></tr></table></P><P>
+
+<OL>
+<LI>
+PREAMBLE
+<P>
+
+The purpose of this License is to make a manual, textbook, or other
+functional and useful document <EM>free</EM> in the sense of freedom: to
+assure everyone the effective freedom to copy and redistribute it,
+with or without modifying it, either commercially or noncommercially.
+Secondarily, this License preserves for the author and publisher a way
+to get credit for their work, while not being considered responsible
+for modifications made by others.
+</P><P>
+
+This License is a kind of "copyleft", which means that derivative
+works of the document must themselves be free in the same sense.  It
+complements the GNU General Public License, which is a copyleft
+license designed for free software.
+</P><P>
+
+We have designed this License in order to use it for manuals for free
+software, because free software needs free documentation: a free
+program should come with manuals providing the same freedoms that the
+software does.  But this License is not limited to software manuals;
+it can be used for any textual work, regardless of subject matter or
+whether it is published as a printed book.  We recommend this License
+principally for works whose purpose is instruction or reference.
+</P><P>
+
+<LI>
+APPLICABILITY AND DEFINITIONS
+<P>
+
+This License applies to any manual or other work, in any medium, that
+contains a notice placed by the copyright holder saying it can be
+distributed under the terms of this License.  Such a notice grants a
+world-wide, royalty-free license, unlimited in duration, to use that
+work under the conditions stated herein.  The "Document", below,
+refers to any such manual or work.  Any member of the public is a
+licensee, and is addressed as "you".  You accept the license if you
+copy, modify or distribute the work in a way requiring permission
+under copyright law.
+</P><P>
+
+A "Modified Version" of the Document means any work containing the
+Document or a portion of it, either copied verbatim, or with
+modifications and/or translated into another language.
+</P><P>
+
+A "Secondary Section" is a named appendix or a front-matter section
+of the Document that deals exclusively with the relationship of the
+publishers or authors of the Document to the Document's overall
+subject (or to related matters) and contains nothing that could fall
+directly within that overall subject.  (Thus, if the Document is in
+part a textbook of mathematics, a Secondary Section may not explain
+any mathematics.)  The relationship could be a matter of historical
+connection with the subject or with related matters, or of legal,
+commercial, philosophical, ethical or political position regarding
+them.
+</P><P>
+
+The "Invariant Sections" are certain Secondary Sections whose titles
+are designated, as being those of Invariant Sections, in the notice
+that says that the Document is released under this License.  If a
+section does not fit the above definition of Secondary then it is not
+allowed to be designated as Invariant.  The Document may contain zero
+Invariant Sections.  If the Document does not identify any Invariant
+Sections then there are none.
+</P><P>
+
+The "Cover Texts" are certain short passages of text that are listed,
+as Front-Cover Texts or Back-Cover Texts, in the notice that says that
+the Document is released under this License.  A Front-Cover Text may
+be at most 5 words, and a Back-Cover Text may be at most 25 words.
+</P><P>
+
+A "Transparent" copy of the Document means a machine-readable copy,
+represented in a format whose specification is available to the
+general public, that is suitable for revising the document
+straightforwardly with generic text editors or (for images composed of
+pixels) generic paint programs or (for drawings) some widely available
+drawing editor, and that is suitable for input to text formatters or
+for automatic translation to a variety of formats suitable for input
+to text formatters.  A copy made in an otherwise Transparent file
+format whose markup, or absence of markup, has been arranged to thwart
+or discourage subsequent modification by readers is not Transparent.
+An image format is not Transparent if used for any substantial amount
+of text.  A copy that is not "Transparent" is called "Opaque".
+</P><P>
+
+Examples of suitable formats for Transparent copies include plain
+ASCII without markup, Texinfo input format, LaTeX input
+format, <FONT SIZE="-1">SGML</FONT> or <FONT SIZE="-1">XML</FONT> using a publicly available
+<FONT SIZE="-1">DTD</FONT>, and standard-conforming simple <FONT SIZE="-1">HTML</FONT>,
+PostScript or <FONT SIZE="-1">PDF</FONT> designed for human modification.  Examples
+of transparent image formats include <FONT SIZE="-1">PNG</FONT>, <FONT SIZE="-1">XCF</FONT> and
+<FONT SIZE="-1">JPG</FONT>.  Opaque formats include proprietary formats that can be
+read and edited only by proprietary word processors, <FONT SIZE="-1">SGML</FONT> or
+<FONT SIZE="-1">XML</FONT> for which the <FONT SIZE="-1">DTD</FONT> and/or processing tools are
+not generally available, and the machine-generated <FONT SIZE="-1">HTML</FONT>,
+PostScript or <FONT SIZE="-1">PDF</FONT> produced by some word processors for
+output purposes only.
+</P><P>
+
+The "Title Page" means, for a printed book, the title page itself,
+plus such following pages as are needed to hold, legibly, the material
+this License requires to appear in the title page.  For works in
+formats which do not have any title page as such, "Title Page" means
+the text near the most prominent appearance of the work's title,
+preceding the beginning of the body of the text.
+</P><P>
+
+A section "Entitled XYZ" means a named subunit of the Document whose
+title either is precisely XYZ or contains XYZ in parentheses following
+text that translates XYZ in another language.  (Here XYZ stands for a
+specific section name mentioned below, such as "Acknowledgements",
+"Dedications", "Endorsements", or "History".)  To "Preserve the Title"
+of such a section when you modify the Document means that it remains a
+section "Entitled XYZ" according to this definition.
+</P><P>
+
+The Document may include Warranty Disclaimers next to the notice which
+states that this License applies to the Document.  These Warranty
+Disclaimers are considered to be included by reference in this
+License, but only as regards disclaiming warranties: any other
+implication that these Warranty Disclaimers may have is void and has
+no effect on the meaning of this License.
+</P><P>
+
+<LI>
+VERBATIM COPYING
+<P>
+
+You may copy and distribute the Document in any medium, either
+commercially or noncommercially, provided that this License, the
+copyright notices, and the license notice saying this License applies
+to the Document are reproduced in all copies, and that you add no other
+conditions whatsoever to those of this License.  You may not use
+technical measures to obstruct or control the reading or further
+copying of the copies you make or distribute.  However, you may accept
+compensation in exchange for copies.  If you distribute a large enough
+number of copies you must also follow the conditions in section 3.
+</P><P>
+
+You may also lend copies, under the same conditions stated above, and
+you may publicly display copies.
+</P><P>
+
+<LI>
+COPYING IN QUANTITY
+<P>
+
+If you publish printed copies (or copies in media that commonly have
+printed covers) of the Document, numbering more than 100, and the
+Document's license notice requires Cover Texts, you must enclose the
+copies in covers that carry, clearly and legibly, all these Cover
+Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on
+the back cover.  Both covers must also clearly and legibly identify
+you as the publisher of these copies.  The front cover must present
+the full title with all words of the title equally prominent and
+visible.  You may add other material on the covers in addition.
+Copying with changes limited to the covers, as long as they preserve
+the title of the Document and satisfy these conditions, can be treated
+as verbatim copying in other respects.
+</P><P>
+
+If the required texts for either cover are too voluminous to fit
+legibly, you should put the first ones listed (as many as fit
+reasonably) on the actual cover, and continue the rest onto adjacent
+pages.
+</P><P>
+
+If you publish or distribute Opaque copies of the Document numbering
+more than 100, you must either include a machine-readable Transparent
+copy along with each Opaque copy, or state in or with each Opaque copy
+a computer-network location from which the general network-using
+public has access to download using public-standard network protocols
+a complete Transparent copy of the Document, free of added material.
+If you use the latter option, you must take reasonably prudent steps,
+when you begin distribution of Opaque copies in quantity, to ensure
+that this Transparent copy will remain thus accessible at the stated
+location until at least one year after the last time you distribute an
+Opaque copy (directly or through your agents or retailers) of that
+edition to the public.
+</P><P>
+
+It is requested, but not required, that you contact the authors of the
+Document well before redistributing any large number of copies, to give
+them a chance to provide you with an updated version of the Document.
+</P><P>
+
+<LI>
+MODIFICATIONS
+<P>
+
+You may copy and distribute a Modified Version of the Document under
+the conditions of sections 2 and 3 above, provided that you release
+the Modified Version under precisely this License, with the Modified
+Version filling the role of the Document, thus licensing distribution
+and modification of the Modified Version to whoever possesses a copy
+of it.  In addition, you must do these things in the Modified Version:
+</P><P>
+
+<OL>
+<LI>
+Use in the Title Page (and on the covers, if any) a title distinct
+from that of the Document, and from those of previous versions
+(which should, if there were any, be listed in the History section
+of the Document).  You may use the same title as a previous version
+if the original publisher of that version gives permission.
+<P>
+
+<LI>
+List on the Title Page, as authors, one or more persons or entities
+responsible for authorship of the modifications in the Modified
+Version, together with at least five of the principal authors of the
+Document (all of its principal authors, if it has fewer than five),
+unless they release you from this requirement.
+<P>
+
+<LI>
+State on the Title page the name of the publisher of the
+Modified Version, as the publisher.
+<P>
+
+<LI>
+Preserve all the copyright notices of the Document.
+<P>
+
+<LI>
+Add an appropriate copyright notice for your modifications
+adjacent to the other copyright notices.
+<P>
+
+<LI>
+Include, immediately after the copyright notices, a license notice
+giving the public permission to use the Modified Version under the
+terms of this License, in the form shown in the Addendum below.
+<P>
+
+<LI>
+Preserve in that license notice the full lists of Invariant Sections
+and required Cover Texts given in the Document's license notice.
+<P>
+
+<LI>
+Include an unaltered copy of this License.
+<P>
+
+<LI>
+Preserve the section Entitled "History", Preserve its Title, and add
+to it an item stating at least the title, year, new authors, and
+publisher of the Modified Version as given on the Title Page.  If
+there is no section Entitled "History" in the Document, create one
+stating the title, year, authors, and publisher of the Document as
+given on its Title Page, then add an item describing the Modified
+Version as stated in the previous sentence.
+<P>
+
+<LI>
+Preserve the network location, if any, given in the Document for
+public access to a Transparent copy of the Document, and likewise
+the network locations given in the Document for previous versions
+it was based on.  These may be placed in the "History" section.
+You may omit a network location for a work that was published at
+least four years before the Document itself, or if the original
+publisher of the version it refers to gives permission.
+<P>
+
+<LI>
+For any section Entitled "Acknowledgements" or "Dedications", Preserve
+the Title of the section, and preserve in the section all the
+substance and tone of each of the contributor acknowledgements and/or
+dedications given therein.
+<P>
+
+<LI>
+Preserve all the Invariant Sections of the Document,
+unaltered in their text and in their titles.  Section numbers
+or the equivalent are not considered part of the section titles.
+<P>
+
+<LI>
+Delete any section Entitled "Endorsements".  Such a section
+may not be included in the Modified Version.
+<P>
+
+<LI>
+Do not retitle any existing section to be Entitled "Endorsements" or
+to conflict in title with any Invariant Section.
+<P>
+
+<LI>
+Preserve any Warranty Disclaimers.
+</OL>
+<P>
+
+If the Modified Version includes new front-matter sections or
+appendices that qualify as Secondary Sections and contain no material
+copied from the Document, you may at your option designate some or all
+of these sections as invariant.  To do this, add their titles to the
+list of Invariant Sections in the Modified Version's license notice.
+These titles must be distinct from any other section titles.
+</P><P>
+
+You may add a section Entitled "Endorsements", provided it contains
+nothing but endorsements of your Modified Version by various
+parties--for example, statements of peer review or that the text has
+been approved by an organization as the authoritative definition of a
+standard.
+</P><P>
+
+You may add a passage of up to five words as a Front-Cover Text, and a
+passage of up to 25 words as a Back-Cover Text, to the end of the list
+of Cover Texts in the Modified Version.  Only one passage of
+Front-Cover Text and one of Back-Cover Text may be added by (or
+through arrangements made by) any one entity.  If the Document already
+includes a cover text for the same cover, previously added by you or
+by arrangement made by the same entity you are acting on behalf of,
+you may not add another; but you may replace the old one, on explicit
+permission from the previous publisher that added the old one.
+</P><P>
+
+The author(s) and publisher(s) of the Document do not by this License
+give permission to use their names for publicity for or to assert or
+imply endorsement of any Modified Version.
+</P><P>
+
+<LI>
+COMBINING DOCUMENTS
+<P>
+
+You may combine the Document with other documents released under this
+License, under the terms defined in section 4 above for modified
+versions, provided that you include in the combination all of the
+Invariant Sections of all of the original documents, unmodified, and
+list them all as Invariant Sections of your combined work in its
+license notice, and that you preserve all their Warranty Disclaimers.
+</P><P>
+
+The combined work need only contain one copy of this License, and
+multiple identical Invariant Sections may be replaced with a single
+copy.  If there are multiple Invariant Sections with the same name but
+different contents, make the title of each such section unique by
+adding at the end of it, in parentheses, the name of the original
+author or publisher of that section if known, or else a unique number.
+Make the same adjustment to the section titles in the list of
+Invariant Sections in the license notice of the combined work.
+</P><P>
+
+In the combination, you must combine any sections Entitled "History"
+in the various original documents, forming one section Entitled
+"History"; likewise combine any sections Entitled "Acknowledgements",
+and any sections Entitled "Dedications".  You must delete all
+sections Entitled "Endorsements."
+</P><P>
+
+<LI>
+COLLECTIONS OF DOCUMENTS
+<P>
+
+You may make a collection consisting of the Document and other documents
+released under this License, and replace the individual copies of this
+License in the various documents with a single copy that is included in
+the collection, provided that you follow the rules of this License for
+verbatim copying of each of the documents in all other respects.
+</P><P>
+
+You may extract a single document from such a collection, and distribute
+it individually under this License, provided you insert a copy of this
+License into the extracted document, and follow this License in all
+other respects regarding verbatim copying of that document.
+</P><P>
+
+<LI>
+AGGREGATION WITH INDEPENDENT WORKS
+<P>
+
+A compilation of the Document or its derivatives with other separate
+and independent documents or works, in or on a volume of a storage or
+distribution medium, is called an "aggregate" if the copyright
+resulting from the compilation is not used to limit the legal rights
+of the compilation's users beyond what the individual works permit.
+When the Document is included an aggregate, this License does not
+apply to the other works in the aggregate which are not themselves
+derivative works of the Document.
+</P><P>
+
+If the Cover Text requirement of section 3 is applicable to these
+copies of the Document, then if the Document is less than one half of
+the entire aggregate, the Document's Cover Texts may be placed on
+covers that bracket the Document within the aggregate, or the
+electronic equivalent of covers if the Document is in electronic form.
+Otherwise they must appear on printed covers that bracket the whole
+aggregate.
+</P><P>
+
+<LI>
+TRANSLATION
+<P>
+
+Translation is considered a kind of modification, so you may
+distribute translations of the Document under the terms of section 4.
+Replacing Invariant Sections with translations requires special
+permission from their copyright holders, but you may include
+translations of some or all Invariant Sections in addition to the
+original versions of these Invariant Sections.  You may include a
+translation of this License, and all the license notices in the
+Document, and any Warranty Disclaimers, provided that you also include
+the original English version of this License and the original versions
+of those notices and disclaimers.  In case of a disagreement between
+the translation and the original version of this License or a notice
+or disclaimer, the original version will prevail.
+</P><P>
+
+If a section in the Document is Entitled "Acknowledgements",
+"Dedications", or "History", the requirement (section 4) to Preserve
+its Title (section 1) will typically require changing the actual
+title.
+</P><P>
+
+<LI>
+TERMINATION
+<P>
+
+You may not copy, modify, sublicense, or distribute the Document except
+as expressly provided for under this License.  Any other attempt to
+copy, modify, sublicense or distribute the Document is void, and will
+automatically terminate your rights under this License.  However,
+parties who have received copies, or rights, from you under this
+License will not have their licenses terminated so long as such
+parties remain in full compliance.
+</P><P>
+
+<LI>
+FUTURE REVISIONS OF THIS LICENSE
+<P>
+
+The Free Software Foundation may publish new, revised versions
+of the GNU Free Documentation License from time to time.  Such new
+versions will be similar in spirit to the present version, but may
+differ in detail to address new problems or concerns.  See
+<A HREF="http://www.gnu.org/copyleft/">http://www.gnu.org/copyleft/</A>.
+</P><P>
+
+Each version of the License is given a distinguishing version number.
+If the Document specifies that a particular numbered version of this
+License "or any later version" applies to it, you have the option of
+following the terms and conditions either of that specified version or
+of any later version that has been published (not as a draft) by the
+Free Software Foundation.  If the Document does not specify a version
+number of this License, you may choose any version ever published (not
+as a draft) by the Free Software Foundation.
+</OL>
+<P>
+
+<HR SIZE="6">
+<A NAME="SEC25"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC24"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[ &gt; ]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC23"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC24"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[ &gt;&gt; ]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> A.1.1 ADDENDUM: How to use this License for your documents </H3>
+<!--docid::SEC25::-->
+<P>
+
+To use this License in a document you have written, include a copy of
+the License in the document and put the following copyright and
+license notices just after the title page:
+</P><P>
+
+<TABLE><tr><td>&nbsp;</td><td class=smallexample><FONT SIZE=-1><pre>  Copyright (C)  <VAR>year</VAR>  <VAR>your name</VAR>.
+  Permission is granted to copy, distribute and/or modify this document
+  under the terms of the GNU Free Documentation License, Version 1.2
+  or any later version published by the Free Software Foundation;
+  with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.
+  A copy of the license is included in the section entitled ``GNU
+  Free Documentation License''.
+</FONT></pre></td></tr></table></P><P>
+
+If you have Invariant Sections, Front-Cover Texts and Back-Cover Texts,
+replace the "with...Texts." line with this:
+</P><P>
+
+<TABLE><tr><td>&nbsp;</td><td class=smallexample><FONT SIZE=-1><pre>    with the Invariant Sections being <VAR>list their titles</VAR>, with
+    the Front-Cover Texts being <VAR>list</VAR>, and with the Back-Cover Texts
+    being <VAR>list</VAR>.
+</FONT></pre></td></tr></table></P><P>
+
+If you have Invariant Sections without Cover Texts, or some other
+combination of the three, merge those two alternatives to suit the
+situation.
+</P><P>
+
+If your document contains nontrivial examples of program code, we
+recommend releasing these examples in parallel under your choice of
+free software license, such as the GNU General Public License,
+to permit their use in free software.
+</P><P>
+
+<HR SIZE="6">
+<A NAME="SEC_Contents"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H1>Table of Contents</H1>
+<UL>
+<A NAME="TOC1" HREF="rluserman.html#SEC1">1. Command Line Editing</A>
+<BR>
+<UL>
+<A NAME="TOC2" HREF="rluserman.html#SEC2">1.1 Introduction to Line Editing</A>
+<BR>
+<A NAME="TOC3" HREF="rluserman.html#SEC3">1.2 Readline Interaction</A>
+<BR>
+<UL>
+<A NAME="TOC4" HREF="rluserman.html#SEC4">1.2.1 Readline Bare Essentials</A>
+<BR>
+<A NAME="TOC5" HREF="rluserman.html#SEC5">1.2.2 Readline Movement Commands</A>
+<BR>
+<A NAME="TOC6" HREF="rluserman.html#SEC6">1.2.3 Readline Killing Commands</A>
+<BR>
+<A NAME="TOC7" HREF="rluserman.html#SEC7">1.2.4 Readline Arguments</A>
+<BR>
+<A NAME="TOC8" HREF="rluserman.html#SEC8">1.2.5 Searching for Commands in the History</A>
+<BR>
+</UL>
+<A NAME="TOC9" HREF="rluserman.html#SEC9">1.3 Readline Init File</A>
+<BR>
+<UL>
+<A NAME="TOC10" HREF="rluserman.html#SEC10">1.3.1 Readline Init File Syntax</A>
+<BR>
+<A NAME="TOC11" HREF="rluserman.html#SEC11">1.3.2 Conditional Init Constructs</A>
+<BR>
+<A NAME="TOC12" HREF="rluserman.html#SEC12">1.3.3 Sample Init File</A>
+<BR>
+</UL>
+<A NAME="TOC13" HREF="rluserman.html#SEC13">1.4 Bindable Readline Commands</A>
+<BR>
+<UL>
+<A NAME="TOC14" HREF="rluserman.html#SEC14">1.4.1 Commands For Moving</A>
+<BR>
+<A NAME="TOC15" HREF="rluserman.html#SEC15">1.4.2 Commands For Manipulating The History</A>
+<BR>
+<A NAME="TOC16" HREF="rluserman.html#SEC16">1.4.3 Commands For Changing Text</A>
+<BR>
+<A NAME="TOC17" HREF="rluserman.html#SEC17">1.4.4 Killing And Yanking</A>
+<BR>
+<A NAME="TOC18" HREF="rluserman.html#SEC18">1.4.5 Specifying Numeric Arguments</A>
+<BR>
+<A NAME="TOC19" HREF="rluserman.html#SEC19">1.4.6 Letting Readline Type For You</A>
+<BR>
+<A NAME="TOC20" HREF="rluserman.html#SEC20">1.4.7 Keyboard Macros</A>
+<BR>
+<A NAME="TOC21" HREF="rluserman.html#SEC21">1.4.8 Some Miscellaneous Commands</A>
+<BR>
+</UL>
+<A NAME="TOC22" HREF="rluserman.html#SEC22">1.5 Readline vi Mode</A>
+<BR>
+</UL>
+<A NAME="TOC23" HREF="rluserman.html#SEC23">A. Copying This Manual</A>
+<BR>
+<UL>
+<A NAME="TOC24" HREF="rluserman.html#SEC24">A.1 GNU Free Documentation License</A>
+<BR>
+<UL>
+<A NAME="TOC25" HREF="rluserman.html#SEC25">A.1.1 ADDENDUM: How to use this License for your documents</A>
+<BR>
+</UL>
+</UL>
+</UL>
+<HR SIZE=1>
+<A NAME="SEC_OVERVIEW"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H1>Short Table of Contents</H1>
+<BLOCKQUOTE>
+<A NAME="TOC1" HREF="rluserman.html#SEC1">1. Command Line Editing</A>
+<BR>
+<A NAME="TOC23" HREF="rluserman.html#SEC23">A. Copying This Manual</A>
+<BR>
+
+</BLOCKQUOTE>
+<HR SIZE=1>
+<A NAME="SEC_About"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H1>About this document</H1>
+This document was generated by <I>Chet Ramey</I> on <I>July, 6  2006</I>
+using <A HREF="http://www.mathematik.uni-kl.de/~obachman/Texi2html
+"><I>texi2html</I></A>
+<P></P>  
+The buttons in the navigation panels have the following meaning:
+<P></P>
+<table border = "1">
+<TR>
+<TH> Button </TH>
+<TH> Name </TH>
+<TH> Go to </TH>
+<TH> From 1.2.3 go to</TH>
+</TR>
+<TR>
+<TD ALIGN="CENTER">
+ [ &lt; ] </TD>
+<TD ALIGN="CENTER">
+Back
+</TD>
+<TD>
+previous section in reading order
+</TD>
+<TD>
+1.2.2
+</TD>
+</TR>
+<TR>
+<TD ALIGN="CENTER">
+ [ &gt; ] </TD>
+<TD ALIGN="CENTER">
+Forward
+</TD>
+<TD>
+next section in reading order
+</TD>
+<TD>
+1.2.4
+</TD>
+</TR>
+<TR>
+<TD ALIGN="CENTER">
+ [ &lt;&lt; ] </TD>
+<TD ALIGN="CENTER">
+FastBack
+</TD>
+<TD>
+previous or up-and-previous section 
+</TD>
+<TD>
+1.1
+</TD>
+</TR>
+<TR>
+<TD ALIGN="CENTER">
+ [ Up ] </TD>
+<TD ALIGN="CENTER">
+Up
+</TD>
+<TD>
+up section
+</TD>
+<TD>
+1.2
+</TD>
+</TR>
+<TR>
+<TD ALIGN="CENTER">
+ [ &gt;&gt; ] </TD>
+<TD ALIGN="CENTER">
+FastForward
+</TD>
+<TD>
+next or up-and-next section
+</TD>
+<TD>
+1.3
+</TD>
+</TR>
+<TR>
+<TD ALIGN="CENTER">
+ [Top] </TD>
+<TD ALIGN="CENTER">
+Top
+</TD>
+<TD>
+cover (top) of document
+</TD>
+<TD>
+ &nbsp; 
+</TD>
+</TR>
+<TR>
+<TD ALIGN="CENTER">
+ [Contents] </TD>
+<TD ALIGN="CENTER">
+Contents
+</TD>
+<TD>
+table of contents
+</TD>
+<TD>
+ &nbsp; 
+</TD>
+</TR>
+<TR>
+<TD ALIGN="CENTER">
+ [Index] </TD>
+<TD ALIGN="CENTER">
+Index
+</TD>
+<TD>
+concept index
+</TD>
+<TD>
+ &nbsp; 
+</TD>
+</TR>
+<TR>
+<TD ALIGN="CENTER">
+ [ ? ] </TD>
+<TD ALIGN="CENTER">
+About
+</TD>
+<TD>
+this page
+</TD>
+<TD>
+ &nbsp; 
+</TD>
+</TR>
+</TABLE>
+<P></P>
+where the <STRONG> Example </STRONG> assumes that the current position 
+is at <STRONG> Subsubsection One-Two-Three </STRONG> of a document of 
+the following structure:
+<UL>
+<LI> 1. Section One  </LI>
+<UL>
+<LI>1.1 Subsection One-One</LI>
+<UL>
+<LI> ... </LI>
+</UL>
+<LI>1.2 Subsection One-Two</LI>
+<UL>
+<LI>1.2.1 Subsubsection One-Two-One
+</LI><LI>1.2.2 Subsubsection One-Two-Two
+</LI><LI>1.2.3 Subsubsection One-Two-Three &nbsp; &nbsp; <STRONG>
+&lt;== Current Position </STRONG>
+</LI><LI>1.2.4 Subsubsection One-Two-Four
+</LI></UL>
+<LI>1.3 Subsection One-Three</LI>
+<UL>
+<LI> ... </LI>
+</UL>
+<LI>1.4 Subsection One-Four</LI>
+</UL>
+</UL>
+
+<HR SIZE=1>
+<BR>  
+<FONT SIZE="-1">
+This document was generated
+by <I>Chet Ramey</I> on <I>July, 6  2006</I>
+using <A HREF="http://www.mathematik.uni-kl.de/~obachman/Texi2html
+"><I>texi2html</I></A>
+
+</BODY>
+</HTML>
diff --git a/doc/rluserman.info b/doc/rluserman.info
new file mode 100644 (file)
index 0000000..10bbc3d
--- /dev/null
@@ -0,0 +1,1748 @@
+This is rluserman.info, produced by makeinfo version 4.7 from
+/Users/chet/src/bash/readline-src/doc/rluserman.texi.
+
+   This manual describes the end user interface of the GNU Readline
+Library (version 5.2, 26 April 2006), a library which aids in the
+consistency of user interface across discrete programs which provide a
+command line interface.
+
+   Copyright (C) 1988-2006 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.
+
+     Permission is granted to copy, distribute and/or modify this
+     document under the terms of the GNU Free Documentation License,
+     Version 1.2 or any later version published by the Free Software
+     Foundation; with no Invariant Sections, with the Front-Cover texts
+     being "A GNU Manual," and with the Back-Cover Texts as in (a)
+     below.  A copy of the license is included in the section entitled
+     "GNU Free Documentation License."
+
+     (a) The FSF's Back-Cover Text is: "You have freedom to copy and
+     modify this GNU Manual, like GNU software.  Copies published by
+     the Free Software Foundation raise funds for GNU development."
+
+INFO-DIR-SECTION Libraries
+START-INFO-DIR-ENTRY
+* RLuserman: (rluserman).       The GNU readline library User's Manual.
+END-INFO-DIR-ENTRY
+
+\1f
+File: rluserman.info,  Node: Top,  Next: Command Line Editing,  Up: (dir)
+
+GNU Readline Library
+********************
+
+This document describes the end user interface of the GNU Readline
+Library, a utility which aids in the consistency of user interface
+across discrete programs which provide a command line interface.
+
+* Menu:
+
+* Command Line Editing::          GNU Readline User's Manual.
+* Copying This Manual::                Copying This Manual.
+
+\1f
+File: rluserman.info,  Node: Command Line Editing,  Next: Copying This Manual,  Prev: Top,  Up: Top
+
+1 Command Line Editing
+**********************
+
+This chapter describes the basic features of the GNU command line
+editing interface.
+
+* Menu:
+
+* Introduction and Notation::  Notation used in this text.
+* Readline Interaction::       The minimum set of commands for editing a line.
+* Readline Init File::         Customizing Readline from a user's view.
+* Bindable Readline Commands:: A description of most of the Readline commands
+                               available for binding
+* Readline vi Mode::           A short description of how to make Readline
+                               behave like the vi editor.
+
+\1f
+File: rluserman.info,  Node: Introduction and Notation,  Next: Readline Interaction,  Up: Command Line Editing
+
+1.1 Introduction to Line Editing
+================================
+
+The following paragraphs describe the notation used to represent
+keystrokes.
+
+   The text `C-k' is read as `Control-K' and describes the character
+produced when the <k> key is pressed while the Control key is depressed.
+
+   The text `M-k' is read as `Meta-K' and describes the character
+produced when the Meta key (if you have one) is depressed, and the <k>
+key is pressed.  The Meta key is labeled <ALT> on many keyboards.  On
+keyboards with two keys labeled <ALT> (usually to either side of the
+space bar), the <ALT> on the left side is generally set to work as a
+Meta key.  The <ALT> key on the right may also be configured to work as
+a Meta key or may be configured as some other modifier, such as a
+Compose key for typing accented characters.
+
+   If you do not have a Meta or <ALT> key, or another key working as a
+Meta key, the identical keystroke can be generated by typing <ESC>
+_first_, and then typing <k>.  Either process is known as "metafying"
+the <k> key.
+
+   The text `M-C-k' is read as `Meta-Control-k' and describes the
+character produced by "metafying" `C-k'.
+
+   In addition, several keys have their own names.  Specifically,
+<DEL>, <ESC>, <LFD>, <SPC>, <RET>, and <TAB> all stand for themselves
+when seen in this text, or in an init file (*note Readline Init File::).
+If your keyboard lacks a <LFD> key, typing <C-j> will produce the
+desired character.  The <RET> key may be labeled <Return> or <Enter> on
+some keyboards.
+
+\1f
+File: rluserman.info,  Node: Readline Interaction,  Next: Readline Init File,  Prev: Introduction and Notation,  Up: Command Line Editing
+
+1.2 Readline Interaction
+========================
+
+Often during an interactive session you type in a long line of text,
+only to notice that the first word on the line is misspelled.  The
+Readline library gives you a set of commands for manipulating the text
+as you type it in, allowing you to just fix your typo, and not forcing
+you to retype the majority of the line.  Using these editing commands,
+you move the cursor to the place that needs correction, and delete or
+insert the text of the corrections.  Then, when you are satisfied with
+the line, you simply press <RET>.  You do not have to be at the end of
+the line to press <RET>; the entire line is accepted regardless of the
+location of the cursor within the line.
+
+* Menu:
+
+* Readline Bare Essentials::   The least you need to know about Readline.
+* Readline Movement Commands:: Moving about the input line.
+* Readline Killing Commands::  How to delete text, and how to get it back!
+* Readline Arguments::         Giving numeric arguments to commands.
+* Searching::                  Searching through previous lines.
+
+\1f
+File: rluserman.info,  Node: Readline Bare Essentials,  Next: Readline Movement Commands,  Up: Readline Interaction
+
+1.2.1 Readline Bare Essentials
+------------------------------
+
+In order to enter characters into the line, simply type them.  The typed
+character appears where the cursor was, and then the cursor moves one
+space to the right.  If you mistype a character, you can use your erase
+character to back up and delete the mistyped character.
+
+   Sometimes you may mistype a character, and not notice the error
+until you have typed several other characters.  In that case, you can
+type `C-b' to move the cursor to the left, and then correct your
+mistake.  Afterwards, you can move the cursor to the right with `C-f'.
+
+   When you add text in the middle of a line, you will notice that
+characters to the right of the cursor are `pushed over' to make room
+for the text that you have inserted.  Likewise, when you delete text
+behind the cursor, characters to the right of the cursor are `pulled
+back' to fill in the blank space created by the removal of the text.  A
+list of the bare essentials for editing the text of an input line
+follows.
+
+`C-b'
+     Move back one character.
+
+`C-f'
+     Move forward one character.
+
+<DEL> or <Backspace>
+     Delete the character to the left of the cursor.
+
+`C-d'
+     Delete the character underneath the cursor.
+
+Printing characters
+     Insert the character into the line at the cursor.
+
+`C-_' or `C-x C-u'
+     Undo the last editing command.  You can undo all the way back to an
+     empty line.
+
+(Depending on your configuration, the <Backspace> key be set to delete
+the character to the left of the cursor and the <DEL> key set to delete
+the character underneath the cursor, like `C-d', rather than the
+character to the left of the cursor.)
+
+\1f
+File: rluserman.info,  Node: Readline Movement Commands,  Next: Readline Killing Commands,  Prev: Readline Bare Essentials,  Up: Readline Interaction
+
+1.2.2 Readline Movement Commands
+--------------------------------
+
+The above table describes the most basic keystrokes that you need in
+order to do editing of the input line.  For your convenience, many
+other commands have been added in addition to `C-b', `C-f', `C-d', and
+<DEL>.  Here are some commands for moving more rapidly about the line.
+
+`C-a'
+     Move to the start of the line.
+
+`C-e'
+     Move to the end of the line.
+
+`M-f'
+     Move forward a word, where a word is composed of letters and
+     digits.
+
+`M-b'
+     Move backward a word.
+
+`C-l'
+     Clear the screen, reprinting the current line at the top.
+
+   Notice how `C-f' moves forward a character, while `M-f' moves
+forward a word.  It is a loose convention that control keystrokes
+operate on characters while meta keystrokes operate on words.
+
+\1f
+File: rluserman.info,  Node: Readline Killing Commands,  Next: Readline Arguments,  Prev: Readline Movement Commands,  Up: Readline Interaction
+
+1.2.3 Readline Killing Commands
+-------------------------------
+
+"Killing" text means to delete the text from the line, but to save it
+away for later use, usually by "yanking" (re-inserting) it back into
+the line.  (`Cut' and `paste' are more recent jargon for `kill' and
+`yank'.)
+
+   If the description for a command says that it `kills' text, then you
+can be sure that you can get the text back in a different (or the same)
+place later.
+
+   When you use a kill command, the text is saved in a "kill-ring".
+Any number of consecutive kills save all of the killed text together, so
+that when you yank it back, you get it all.  The kill ring is not line
+specific; the text that you killed on a previously typed line is
+available to be yanked back later, when you are typing another line.  
+
+   Here is the list of commands for killing text.
+
+`C-k'
+     Kill the text from the current cursor position to the end of the
+     line.
+
+`M-d'
+     Kill from the cursor to the end of the current word, or, if between
+     words, to the end of the next word.  Word boundaries are the same
+     as those used by `M-f'.
+
+`M-<DEL>'
+     Kill from the cursor the start of the current word, or, if between
+     words, to the start of the previous word.  Word boundaries are the
+     same as those used by `M-b'.
+
+`C-w'
+     Kill from the cursor to the previous whitespace.  This is
+     different than `M-<DEL>' because the word boundaries differ.
+
+
+   Here is how to "yank" the text back into the line.  Yanking means to
+copy the most-recently-killed text from the kill buffer.
+
+`C-y'
+     Yank the most recently killed text back into the buffer at the
+     cursor.
+
+`M-y'
+     Rotate the kill-ring, and yank the new top.  You can only do this
+     if the prior command is `C-y' or `M-y'.
+
+\1f
+File: rluserman.info,  Node: Readline Arguments,  Next: Searching,  Prev: Readline Killing Commands,  Up: Readline Interaction
+
+1.2.4 Readline Arguments
+------------------------
+
+You can pass numeric arguments to Readline commands.  Sometimes the
+argument acts as a repeat count, other times it is the sign of the
+argument that is significant.  If you pass a negative argument to a
+command which normally acts in a forward direction, that command will
+act in a backward direction.  For example, to kill text back to the
+start of the line, you might type `M-- C-k'.
+
+   The general way to pass numeric arguments to a command is to type
+meta digits before the command.  If the first `digit' typed is a minus
+sign (`-'), then the sign of the argument will be negative.  Once you
+have typed one meta digit to get the argument started, you can type the
+remainder of the digits, and then the command.  For example, to give
+the `C-d' command an argument of 10, you could type `M-1 0 C-d', which
+will delete the next ten characters on the input line.
+
+\1f
+File: rluserman.info,  Node: Searching,  Prev: Readline Arguments,  Up: Readline Interaction
+
+1.2.5 Searching for Commands in the History
+-------------------------------------------
+
+Readline provides commands for searching through the command history
+for lines containing a specified string.  There are two search modes:
+"incremental" and "non-incremental".
+
+   Incremental searches begin before the user has finished typing the
+search string.  As each character of the search string is typed,
+Readline displays the next entry from the history matching the string
+typed so far.  An incremental search requires only as many characters
+as needed to find the desired history entry.  To search backward in the
+history for a particular string, type `C-r'.  Typing `C-s' searches
+forward through the history.  The characters present in the value of
+the `isearch-terminators' variable are used to terminate an incremental
+search.  If that variable has not been assigned a value, the <ESC> and
+`C-J' characters will terminate an incremental search.  `C-g' will
+abort an incremental search and restore the original line.  When the
+search is terminated, the history entry containing the search string
+becomes the current line.
+
+   To find other matching entries in the history list, type `C-r' or
+`C-s' as appropriate.  This will search backward or forward in the
+history for the next entry matching the search string typed so far.
+Any other key sequence bound to a Readline command will terminate the
+search and execute that command.  For instance, a <RET> will terminate
+the search and accept the line, thereby executing the command from the
+history list.  A movement command will terminate the search, make the
+last line found the current line, and begin editing.
+
+   Readline remembers the last incremental search string.  If two
+`C-r's are typed without any intervening characters defining a new
+search string, any remembered search string is used.
+
+   Non-incremental searches read the entire search string before
+starting to search for matching history lines.  The search string may be
+typed by the user or be part of the contents of the current line.
+
+\1f
+File: rluserman.info,  Node: Readline Init File,  Next: Bindable Readline Commands,  Prev: Readline Interaction,  Up: Command Line Editing
+
+1.3 Readline Init File
+======================
+
+Although the Readline library comes with a set of Emacs-like
+keybindings installed by default, it is possible to use a different set
+of keybindings.  Any user can customize programs that use Readline by
+putting commands in an "inputrc" file, conventionally in his home
+directory.  The name of this file is taken from the value of the
+environment variable `INPUTRC'.  If that variable is unset, the default
+is `~/.inputrc'.  If that file does not exist or cannot be read, the
+ultimate default is `/etc/inputrc'.
+
+   When a program which uses the Readline library starts up, the init
+file is read, and the key bindings are set.
+
+   In addition, the `C-x C-r' command re-reads this init file, thus
+incorporating any changes that you might have made to it.
+
+* Menu:
+
+* Readline Init File Syntax::  Syntax for the commands in the inputrc file.
+
+* Conditional Init Constructs::        Conditional key bindings in the inputrc file.
+
+* Sample Init File::           An example inputrc file.
+
+\1f
+File: rluserman.info,  Node: Readline Init File Syntax,  Next: Conditional Init Constructs,  Up: Readline Init File
+
+1.3.1 Readline Init File Syntax
+-------------------------------
+
+There are only a few basic constructs allowed in the Readline init
+file.  Blank lines are ignored.  Lines beginning with a `#' are
+comments.  Lines beginning with a `$' indicate conditional constructs
+(*note Conditional Init Constructs::).  Other lines denote variable
+settings and key bindings.
+
+Variable Settings
+     You can modify the run-time behavior of Readline by altering the
+     values of variables in Readline using the `set' command within the
+     init file.  The syntax is simple:
+
+          set VARIABLE VALUE
+
+     Here, for example, is how to change from the default Emacs-like
+     key binding to use `vi' line editing commands:
+
+          set editing-mode vi
+
+     Variable names and values, where appropriate, are recognized
+     without regard to case.  Unrecognized variable names are ignored.
+
+     Boolean variables (those that can be set to on or off) are set to
+     on if the value is null or empty, ON (case-insensitive), or 1.
+     Any other value results in the variable being set to off.
+
+     A great deal of run-time behavior is changeable with the following
+     variables.
+
+    `bell-style'
+          Controls what happens when Readline wants to ring the
+          terminal bell.  If set to `none', Readline never rings the
+          bell.  If set to `visible', Readline uses a visible bell if
+          one is available.  If set to `audible' (the default),
+          Readline attempts to ring the terminal's bell.
+
+    `bind-tty-special-chars'
+          If set to `on', Readline attempts to bind the control
+          characters treated specially by the kernel's terminal driver
+          to their Readline equivalents.
+
+    `comment-begin'
+          The string to insert at the beginning of the line when the
+          `insert-comment' command is executed.  The default value is
+          `"#"'.
+
+    `completion-ignore-case'
+          If set to `on', Readline performs filename matching and
+          completion in a case-insensitive fashion.  The default value
+          is `off'.
+
+    `completion-query-items'
+          The number of possible completions that determines when the
+          user is asked whether the list of possibilities should be
+          displayed.  If the number of possible completions is greater
+          than this value, Readline will ask the user whether or not he
+          wishes to view them; otherwise, they are simply listed.  This
+          variable must be set to an integer value greater than or
+          equal to 0.  A negative value means Readline should never ask.
+          The default limit is `100'.
+
+    `convert-meta'
+          If set to `on', Readline will convert characters with the
+          eighth bit set to an ASCII key sequence by stripping the
+          eighth bit and prefixing an <ESC> character, converting them
+          to a meta-prefixed key sequence.  The default value is `on'.
+
+    `disable-completion'
+          If set to `On', Readline will inhibit word completion.
+          Completion  characters will be inserted into the line as if
+          they had been mapped to `self-insert'.  The default is `off'.
+
+    `editing-mode'
+          The `editing-mode' variable controls which default set of key
+          bindings is used.  By default, Readline starts up in Emacs
+          editing mode, where the keystrokes are most similar to Emacs.
+          This variable can be set to either `emacs' or `vi'.
+
+    `enable-keypad'
+          When set to `on', Readline will try to enable the application
+          keypad when it is called.  Some systems need this to enable
+          the arrow keys.  The default is `off'.
+
+    `expand-tilde'
+          If set to `on', tilde expansion is performed when Readline
+          attempts word completion.  The default is `off'.
+
+    `history-preserve-point'
+          If set to `on', the history code attempts to place point at
+          the same location on each history line retrieved with
+          `previous-history' or `next-history'.  The default is `off'.
+
+    `horizontal-scroll-mode'
+          This variable can be set to either `on' or `off'.  Setting it
+          to `on' means that the text of the lines being edited will
+          scroll horizontally on a single screen line when they are
+          longer than the width of the screen, instead of wrapping onto
+          a new screen line.  By default, this variable is set to `off'.
+
+    `input-meta'
+          If set to `on', Readline will enable eight-bit input (it will
+          not clear the eighth bit in the characters it reads),
+          regardless of what the terminal claims it can support.  The
+          default value is `off'.  The name `meta-flag' is a synonym
+          for this variable.
+
+    `isearch-terminators'
+          The string of characters that should terminate an incremental
+          search without subsequently executing the character as a
+          command (*note Searching::).  If this variable has not been
+          given a value, the characters <ESC> and `C-J' will terminate
+          an incremental search.
+
+    `keymap'
+          Sets Readline's idea of the current keymap for key binding
+          commands.  Acceptable `keymap' names are `emacs',
+          `emacs-standard', `emacs-meta', `emacs-ctlx', `vi', `vi-move',
+          `vi-command', and `vi-insert'.  `vi' is equivalent to
+          `vi-command'; `emacs' is equivalent to `emacs-standard'.  The
+          default value is `emacs'.  The value of the `editing-mode'
+          variable also affects the default keymap.
+
+    `mark-directories'
+          If set to `on', completed directory names have a slash
+          appended.  The default is `on'.
+
+    `mark-modified-lines'
+          This variable, when set to `on', causes Readline to display an
+          asterisk (`*') at the start of history lines which have been
+          modified.  This variable is `off' by default.
+
+    `mark-symlinked-directories'
+          If set to `on', completed names which are symbolic links to
+          directories have a slash appended (subject to the value of
+          `mark-directories').  The default is `off'.
+
+    `match-hidden-files'
+          This variable, when set to `on', causes Readline to match
+          files whose names begin with a `.' (hidden files) when
+          performing filename completion, unless the leading `.' is
+          supplied by the user in the filename to be completed.  This
+          variable is `on' by default.
+
+    `output-meta'
+          If set to `on', Readline will display characters with the
+          eighth bit set directly rather than as a meta-prefixed escape
+          sequence.  The default is `off'.
+
+    `page-completions'
+          If set to `on', Readline uses an internal `more'-like pager
+          to display a screenful of possible completions at a time.
+          This variable is `on' by default.
+
+    `print-completions-horizontally'
+          If set to `on', Readline will display completions with matches
+          sorted horizontally in alphabetical order, rather than down
+          the screen.  The default is `off'.
+
+    `show-all-if-ambiguous'
+          This alters the default behavior of the completion functions.
+          If set to `on', words which have more than one possible
+          completion cause the matches to be listed immediately instead
+          of ringing the bell.  The default value is `off'.
+
+    `show-all-if-unmodified'
+          This alters the default behavior of the completion functions
+          in a fashion similar to SHOW-ALL-IF-AMBIGUOUS.  If set to
+          `on', words which have more than one possible completion
+          without any possible partial completion (the possible
+          completions don't share a common prefix) cause the matches to
+          be listed immediately instead of ringing the bell.  The
+          default value is `off'.
+
+    `visible-stats'
+          If set to `on', a character denoting a file's type is
+          appended to the filename when listing possible completions.
+          The default is `off'.
+
+
+Key Bindings
+     The syntax for controlling key bindings in the init file is
+     simple.  First you need to find the name of the command that you
+     want to change.  The following sections contain tables of the
+     command name, the default keybinding, if any, and a short
+     description of what the command does.
+
+     Once you know the name of the command, simply place on a line in
+     the init file the name of the key you wish to bind the command to,
+     a colon, and then the name of the command.  There can be no space
+     between the key name and the colon - that will be interpreted as
+     part of the key name.  The name of the key can be expressed in
+     different ways, depending on what you find most comfortable.
+
+     In addition to command names, readline allows keys to be bound to
+     a string that is inserted when the key is pressed (a MACRO).
+
+    KEYNAME: FUNCTION-NAME or MACRO
+          KEYNAME is the name of a key spelled out in English.  For
+          example:
+               Control-u: universal-argument
+               Meta-Rubout: backward-kill-word
+               Control-o: "> output"
+
+          In the above example, `C-u' is bound to the function
+          `universal-argument', `M-DEL' is bound to the function
+          `backward-kill-word', and `C-o' is bound to run the macro
+          expressed on the right hand side (that is, to insert the text
+          `> output' into the line).
+
+          A number of symbolic character names are recognized while
+          processing this key binding syntax: DEL, ESC, ESCAPE, LFD,
+          NEWLINE, RET, RETURN, RUBOUT, SPACE, SPC, and TAB.
+
+    "KEYSEQ": FUNCTION-NAME or MACRO
+          KEYSEQ differs from KEYNAME above in that strings denoting an
+          entire key sequence can be specified, by placing the key
+          sequence in double quotes.  Some GNU Emacs style key escapes
+          can be used, as in the following example, but the special
+          character names are not recognized.
+
+               "\C-u": universal-argument
+               "\C-x\C-r": re-read-init-file
+               "\e[11~": "Function Key 1"
+
+          In the above example, `C-u' is again bound to the function
+          `universal-argument' (just as it was in the first example),
+          `C-x C-r' is bound to the function `re-read-init-file', and
+          `<ESC> <[> <1> <1> <~>' is bound to insert the text `Function
+          Key 1'.
+
+
+     The following GNU Emacs style escape sequences are available when
+     specifying key sequences:
+
+    `\C-'
+          control prefix
+
+    `\M-'
+          meta prefix
+
+    `\e'
+          an escape character
+
+    `\\'
+          backslash
+
+    `\"'
+          <">, a double quotation mark
+
+    `\''
+          <'>, a single quote or apostrophe
+
+     In addition to the GNU Emacs style escape sequences, a second set
+     of backslash escapes is available:
+
+    `\a'
+          alert (bell)
+
+    `\b'
+          backspace
+
+    `\d'
+          delete
+
+    `\f'
+          form feed
+
+    `\n'
+          newline
+
+    `\r'
+          carriage return
+
+    `\t'
+          horizontal tab
+
+    `\v'
+          vertical tab
+
+    `\NNN'
+          the eight-bit character whose value is the octal value NNN
+          (one to three digits)
+
+    `\xHH'
+          the eight-bit character whose value is the hexadecimal value
+          HH (one or two hex digits)
+
+     When entering the text of a macro, single or double quotes must be
+     used to indicate a macro definition.  Unquoted text is assumed to
+     be a function name.  In the macro body, the backslash escapes
+     described above are expanded.  Backslash will quote any other
+     character in the macro text, including `"' and `''.  For example,
+     the following binding will make `C-x \' insert a single `\' into
+     the line:
+          "\C-x\\": "\\"
+
+
+\1f
+File: rluserman.info,  Node: Conditional Init Constructs,  Next: Sample Init File,  Prev: Readline Init File Syntax,  Up: Readline Init File
+
+1.3.2 Conditional Init Constructs
+---------------------------------
+
+Readline implements a facility similar in spirit to the conditional
+compilation features of the C preprocessor which allows key bindings
+and variable settings to be performed as the result of tests.  There
+are four parser directives used.
+
+`$if'
+     The `$if' construct allows bindings to be made based on the
+     editing mode, the terminal being used, or the application using
+     Readline.  The text of the test extends to the end of the line; no
+     characters are required to isolate it.
+
+    `mode'
+          The `mode=' form of the `$if' directive is used to test
+          whether Readline is in `emacs' or `vi' mode.  This may be
+          used in conjunction with the `set keymap' command, for
+          instance, to set bindings in the `emacs-standard' and
+          `emacs-ctlx' keymaps only if Readline is starting out in
+          `emacs' mode.
+
+    `term'
+          The `term=' form may be used to include terminal-specific key
+          bindings, perhaps to bind the key sequences output by the
+          terminal's function keys.  The word on the right side of the
+          `=' is tested against both the full name of the terminal and
+          the portion of the terminal name before the first `-'.  This
+          allows `sun' to match both `sun' and `sun-cmd', for instance.
+
+    `application'
+          The APPLICATION construct is used to include
+          application-specific settings.  Each program using the
+          Readline library sets the APPLICATION NAME, and you can test
+          for a particular value.  This could be used to bind key
+          sequences to functions useful for a specific program.  For
+          instance, the following command adds a key sequence that
+          quotes the current or previous word in Bash:
+               $if Bash
+               # Quote the current or previous word
+               "\C-xq": "\eb\"\ef\""
+               $endif
+
+`$endif'
+     This command, as seen in the previous example, terminates an `$if'
+     command.
+
+`$else'
+     Commands in this branch of the `$if' directive are executed if the
+     test fails.
+
+`$include'
+     This directive takes a single filename as an argument and reads
+     commands and bindings from that file.  For example, the following
+     directive reads from `/etc/inputrc':
+          $include /etc/inputrc
+
+\1f
+File: rluserman.info,  Node: Sample Init File,  Prev: Conditional Init Constructs,  Up: Readline Init File
+
+1.3.3 Sample Init File
+----------------------
+
+Here is an example of an INPUTRC file.  This illustrates key binding,
+variable assignment, and conditional syntax.
+
+
+     # This file controls the behaviour of line input editing for
+     # programs that use the GNU Readline library.  Existing
+     # programs include FTP, Bash, and GDB.
+     #
+     # You can re-read the inputrc file with C-x C-r.
+     # Lines beginning with '#' are comments.
+     #
+     # First, include any systemwide bindings and variable
+     # assignments from /etc/Inputrc
+     $include /etc/Inputrc
+
+     #
+     # Set various bindings for emacs mode.
+
+     set editing-mode emacs
+
+     $if mode=emacs
+
+     Meta-Control-h:   backward-kill-word      Text after the function name is ignored
+
+     #
+     # Arrow keys in keypad mode
+     #
+     #"\M-OD":        backward-char
+     #"\M-OC":        forward-char
+     #"\M-OA":        previous-history
+     #"\M-OB":        next-history
+     #
+     # Arrow keys in ANSI mode
+     #
+     "\M-[D":        backward-char
+     "\M-[C":        forward-char
+     "\M-[A":        previous-history
+     "\M-[B":        next-history
+     #
+     # Arrow keys in 8 bit keypad mode
+     #
+     #"\M-\C-OD":       backward-char
+     #"\M-\C-OC":       forward-char
+     #"\M-\C-OA":       previous-history
+     #"\M-\C-OB":       next-history
+     #
+     # Arrow keys in 8 bit ANSI mode
+     #
+     #"\M-\C-[D":       backward-char
+     #"\M-\C-[C":       forward-char
+     #"\M-\C-[A":       previous-history
+     #"\M-\C-[B":       next-history
+
+     C-q: quoted-insert
+
+     $endif
+
+     # An old-style binding.  This happens to be the default.
+     TAB: complete
+
+     # Macros that are convenient for shell interaction
+     $if Bash
+     # edit the path
+     "\C-xp": "PATH=${PATH}\e\C-e\C-a\ef\C-f"
+     # prepare to type a quoted word --
+     # insert open and close double quotes
+     # and move to just after the open quote
+     "\C-x\"": "\"\"\C-b"
+     # insert a backslash (testing backslash escapes
+     # in sequences and macros)
+     "\C-x\\": "\\"
+     # Quote the current or previous word
+     "\C-xq": "\eb\"\ef\""
+     # Add a binding to refresh the line, which is unbound
+     "\C-xr": redraw-current-line
+     # Edit variable on current line.
+     "\M-\C-v": "\C-a\C-k$\C-y\M-\C-e\C-a\C-y="
+     $endif
+
+     # use a visible bell if one is available
+     set bell-style visible
+
+     # don't strip characters to 7 bits when reading
+     set input-meta on
+
+     # allow iso-latin1 characters to be inserted rather
+     # than converted to prefix-meta sequences
+     set convert-meta off
+
+     # display characters with the eighth bit set directly
+     # rather than as meta-prefixed characters
+     set output-meta on
+
+     # if there are more than 150 possible completions for
+     # a word, ask the user if he wants to see all of them
+     set completion-query-items 150
+
+     # For FTP
+     $if Ftp
+     "\C-xg": "get \M-?"
+     "\C-xt": "put \M-?"
+     "\M-.": yank-last-arg
+     $endif
+
+\1f
+File: rluserman.info,  Node: Bindable Readline Commands,  Next: Readline vi Mode,  Prev: Readline Init File,  Up: Command Line Editing
+
+1.4 Bindable Readline Commands
+==============================
+
+* Menu:
+
+* Commands For Moving::                Moving about the line.
+* Commands For History::       Getting at previous lines.
+* Commands For Text::          Commands for changing text.
+* Commands For Killing::       Commands for killing and yanking.
+* Numeric Arguments::          Specifying numeric arguments, repeat counts.
+* Commands For Completion::    Getting Readline to do the typing for you.
+* Keyboard Macros::            Saving and re-executing typed characters
+* Miscellaneous Commands::     Other miscellaneous commands.
+
+   This section describes Readline commands that may be bound to key
+sequences.  Command names without an accompanying key sequence are
+unbound by default.
+
+   In the following descriptions, "point" refers to the current cursor
+position, and "mark" refers to a cursor position saved by the
+`set-mark' command.  The text between the point and mark is referred to
+as the "region".
+
+\1f
+File: rluserman.info,  Node: Commands For Moving,  Next: Commands For History,  Up: Bindable Readline Commands
+
+1.4.1 Commands For Moving
+-------------------------
+
+`beginning-of-line (C-a)'
+     Move to the start of the current line.
+
+`end-of-line (C-e)'
+     Move to the end of the line.
+
+`forward-char (C-f)'
+     Move forward a character.
+
+`backward-char (C-b)'
+     Move back a character.
+
+`forward-word (M-f)'
+     Move forward to the end of the next word.  Words are composed of
+     letters and digits.
+
+`backward-word (M-b)'
+     Move back to the start of the current or previous word.  Words are
+     composed of letters and digits.
+
+`clear-screen (C-l)'
+     Clear the screen and redraw the current line, leaving the current
+     line at the top of the screen.
+
+`redraw-current-line ()'
+     Refresh the current line.  By default, this is unbound.
+
+
+\1f
+File: rluserman.info,  Node: Commands For History,  Next: Commands For Text,  Prev: Commands For Moving,  Up: Bindable Readline Commands
+
+1.4.2 Commands For Manipulating The History
+-------------------------------------------
+
+`accept-line (Newline or Return)'
+     Accept the line regardless of where the cursor is.  If this line is
+     non-empty, it may be added to the history list for future recall
+     with `add_history()'.  If this line is a modified history line,
+     the history line is restored to its original state.
+
+`previous-history (C-p)'
+     Move `back' through the history list, fetching the previous
+     command.
+
+`next-history (C-n)'
+     Move `forward' through the history list, fetching the next command.
+
+`beginning-of-history (M-<)'
+     Move to the first line in the history.
+
+`end-of-history (M->)'
+     Move to the end of the input history, i.e., the line currently
+     being entered.
+
+`reverse-search-history (C-r)'
+     Search backward starting at the current line and moving `up'
+     through the history as necessary.  This is an incremental search.
+
+`forward-search-history (C-s)'
+     Search forward starting at the current line and moving `down'
+     through the the history as necessary.  This is an incremental
+     search.
+
+`non-incremental-reverse-search-history (M-p)'
+     Search backward starting at the current line and moving `up'
+     through the history as necessary using a non-incremental search
+     for a string supplied by the user.
+
+`non-incremental-forward-search-history (M-n)'
+     Search forward starting at the current line and moving `down'
+     through the the history as necessary using a non-incremental search
+     for a string supplied by the user.
+
+`history-search-forward ()'
+     Search forward through the history for the string of characters
+     between the start of the current line and the point.  This is a
+     non-incremental search.  By default, this command is unbound.
+
+`history-search-backward ()'
+     Search backward through the history for the string of characters
+     between the start of the current line and the point.  This is a
+     non-incremental search.  By default, this command is unbound.
+
+`yank-nth-arg (M-C-y)'
+     Insert the first argument to the previous command (usually the
+     second word on the previous line) at point.  With an argument N,
+     insert the Nth word from the previous command (the words in the
+     previous command begin with word 0).  A negative argument inserts
+     the Nth word from the end of the previous command.  Once the
+     argument N is computed, the argument is extracted as if the `!N'
+     history expansion had been specified.
+
+`yank-last-arg (M-. or M-_)'
+     Insert last argument to the previous command (the last word of the
+     previous history entry).  With an argument, behave exactly like
+     `yank-nth-arg'.  Successive calls to `yank-last-arg' move back
+     through the history list, inserting the last argument of each line
+     in turn.  The history expansion facilities are used to extract the
+     last argument, as if the `!$' history expansion had been specified.
+
+
+\1f
+File: rluserman.info,  Node: Commands For Text,  Next: Commands For Killing,  Prev: Commands For History,  Up: Bindable Readline Commands
+
+1.4.3 Commands For Changing Text
+--------------------------------
+
+`delete-char (C-d)'
+     Delete the character at point.  If point is at the beginning of
+     the line, there are no characters in the line, and the last
+     character typed was not bound to `delete-char', then return EOF.
+
+`backward-delete-char (Rubout)'
+     Delete the character behind the cursor.  A numeric argument means
+     to kill the characters instead of deleting them.
+
+`forward-backward-delete-char ()'
+     Delete the character under the cursor, unless the cursor is at the
+     end of the line, in which case the character behind the cursor is
+     deleted.  By default, this is not bound to a key.
+
+`quoted-insert (C-q or C-v)'
+     Add the next character typed to the line verbatim.  This is how to
+     insert key sequences like `C-q', for example.
+
+`tab-insert (M-<TAB>)'
+     Insert a tab character.
+
+`self-insert (a, b, A, 1, !, ...)'
+     Insert yourself.
+
+`transpose-chars (C-t)'
+     Drag the character before the cursor forward over the character at
+     the cursor, moving the cursor forward as well.  If the insertion
+     point is at the end of the line, then this transposes the last two
+     characters of the line.  Negative arguments have no effect.
+
+`transpose-words (M-t)'
+     Drag the word before point past the word after point, moving point
+     past that word as well.  If the insertion point is at the end of
+     the line, this transposes the last two words on the line.
+
+`upcase-word (M-u)'
+     Uppercase the current (or following) word.  With a negative
+     argument, uppercase the previous word, but do not move the cursor.
+
+`downcase-word (M-l)'
+     Lowercase the current (or following) word.  With a negative
+     argument, lowercase the previous word, but do not move the cursor.
+
+`capitalize-word (M-c)'
+     Capitalize the current (or following) word.  With a negative
+     argument, capitalize the previous word, but do not move the cursor.
+
+`overwrite-mode ()'
+     Toggle overwrite mode.  With an explicit positive numeric argument,
+     switches to overwrite mode.  With an explicit non-positive numeric
+     argument, switches to insert mode.  This command affects only
+     `emacs' mode; `vi' mode does overwrite differently.  Each call to
+     `readline()' starts in insert mode.
+
+     In overwrite mode, characters bound to `self-insert' replace the
+     text at point rather than pushing the text to the right.
+     Characters bound to `backward-delete-char' replace the character
+     before point with a space.
+
+     By default, this command is unbound.
+
+
+\1f
+File: rluserman.info,  Node: Commands For Killing,  Next: Numeric Arguments,  Prev: Commands For Text,  Up: Bindable Readline Commands
+
+1.4.4 Killing And Yanking
+-------------------------
+
+`kill-line (C-k)'
+     Kill the text from point to the end of the line.
+
+`backward-kill-line (C-x Rubout)'
+     Kill backward to the beginning of the line.
+
+`unix-line-discard (C-u)'
+     Kill backward from the cursor to the beginning of the current line.
+
+`kill-whole-line ()'
+     Kill all characters on the current line, no matter where point is.
+     By default, this is unbound.
+
+`kill-word (M-d)'
+     Kill from point to the end of the current word, or if between
+     words, to the end of the next word.  Word boundaries are the same
+     as `forward-word'.
+
+`backward-kill-word (M-<DEL>)'
+     Kill the word behind point.  Word boundaries are the same as
+     `backward-word'.
+
+`unix-word-rubout (C-w)'
+     Kill the word behind point, using white space as a word boundary.
+     The killed text is saved on the kill-ring.
+
+`unix-filename-rubout ()'
+     Kill the word behind point, using white space and the slash
+     character as the word boundaries.  The killed text is saved on the
+     kill-ring.
+
+`delete-horizontal-space ()'
+     Delete all spaces and tabs around point.  By default, this is
+     unbound.
+
+`kill-region ()'
+     Kill the text in the current region.  By default, this command is
+     unbound.
+
+`copy-region-as-kill ()'
+     Copy the text in the region to the kill buffer, so it can be yanked
+     right away.  By default, this command is unbound.
+
+`copy-backward-word ()'
+     Copy the word before point to the kill buffer.  The word
+     boundaries are the same as `backward-word'.  By default, this
+     command is unbound.
+
+`copy-forward-word ()'
+     Copy the word following point to the kill buffer.  The word
+     boundaries are the same as `forward-word'.  By default, this
+     command is unbound.
+
+`yank (C-y)'
+     Yank the top of the kill ring into the buffer at point.
+
+`yank-pop (M-y)'
+     Rotate the kill-ring, and yank the new top.  You can only do this
+     if the prior command is `yank' or `yank-pop'.
+
+\1f
+File: rluserman.info,  Node: Numeric Arguments,  Next: Commands For Completion,  Prev: Commands For Killing,  Up: Bindable Readline Commands
+
+1.4.5 Specifying Numeric Arguments
+----------------------------------
+
+`digit-argument (M-0, M-1, ... M--)'
+     Add this digit to the argument already accumulating, or start a new
+     argument.  `M--' starts a negative argument.
+
+`universal-argument ()'
+     This is another way to specify an argument.  If this command is
+     followed by one or more digits, optionally with a leading minus
+     sign, those digits define the argument.  If the command is
+     followed by digits, executing `universal-argument' again ends the
+     numeric argument, but is otherwise ignored.  As a special case, if
+     this command is immediately followed by a character that is
+     neither a digit or minus sign, the argument count for the next
+     command is multiplied by four.  The argument count is initially
+     one, so executing this function the first time makes the argument
+     count four, a second time makes the argument count sixteen, and so
+     on.  By default, this is not bound to a key.
+
+\1f
+File: rluserman.info,  Node: Commands For Completion,  Next: Keyboard Macros,  Prev: Numeric Arguments,  Up: Bindable Readline Commands
+
+1.4.6 Letting Readline Type For You
+-----------------------------------
+
+`complete (<TAB>)'
+     Attempt to perform completion on the text before point.  The
+     actual completion performed is application-specific.  The default
+     is filename completion.
+
+`possible-completions (M-?)'
+     List the possible completions of the text before point.
+
+`insert-completions (M-*)'
+     Insert all completions of the text before point that would have
+     been generated by `possible-completions'.
+
+`menu-complete ()'
+     Similar to `complete', but replaces the word to be completed with
+     a single match from the list of possible completions.  Repeated
+     execution of `menu-complete' steps through the list of possible
+     completions, inserting each match in turn.  At the end of the list
+     of completions, the bell is rung (subject to the setting of
+     `bell-style') and the original text is restored.  An argument of N
+     moves N positions forward in the list of matches; a negative
+     argument may be used to move backward through the list.  This
+     command is intended to be bound to <TAB>, but is unbound by
+     default.
+
+`delete-char-or-list ()'
+     Deletes the character under the cursor if not at the beginning or
+     end of the line (like `delete-char').  If at the end of the line,
+     behaves identically to `possible-completions'.  This command is
+     unbound by default.
+
+
+\1f
+File: rluserman.info,  Node: Keyboard Macros,  Next: Miscellaneous Commands,  Prev: Commands For Completion,  Up: Bindable Readline Commands
+
+1.4.7 Keyboard Macros
+---------------------
+
+`start-kbd-macro (C-x ()'
+     Begin saving the characters typed into the current keyboard macro.
+
+`end-kbd-macro (C-x ))'
+     Stop saving the characters typed into the current keyboard macro
+     and save the definition.
+
+`call-last-kbd-macro (C-x e)'
+     Re-execute the last keyboard macro defined, by making the
+     characters in the macro appear as if typed at the keyboard.
+
+
+\1f
+File: rluserman.info,  Node: Miscellaneous Commands,  Prev: Keyboard Macros,  Up: Bindable Readline Commands
+
+1.4.8 Some Miscellaneous Commands
+---------------------------------
+
+`re-read-init-file (C-x C-r)'
+     Read in the contents of the INPUTRC file, and incorporate any
+     bindings or variable assignments found there.
+
+`abort (C-g)'
+     Abort the current editing command and ring the terminal's bell
+     (subject to the setting of `bell-style').
+
+`do-uppercase-version (M-a, M-b, M-X, ...)'
+     If the metafied character X is lowercase, run the command that is
+     bound to the corresponding uppercase character.
+
+`prefix-meta (<ESC>)'
+     Metafy the next character typed.  This is for keyboards without a
+     meta key.  Typing `<ESC> f' is equivalent to typing `M-f'.
+
+`undo (C-_ or C-x C-u)'
+     Incremental undo, separately remembered for each line.
+
+`revert-line (M-r)'
+     Undo all changes made to this line.  This is like executing the
+     `undo' command enough times to get back to the beginning.
+
+`tilde-expand (M-~)'
+     Perform tilde expansion on the current word.
+
+`set-mark (C-@)'
+     Set the mark to the point.  If a numeric argument is supplied, the
+     mark is set to that position.
+
+`exchange-point-and-mark (C-x C-x)'
+     Swap the point with the mark.  The current cursor position is set
+     to the saved position, and the old cursor position is saved as the
+     mark.
+
+`character-search (C-])'
+     A character is read and point is moved to the next occurrence of
+     that character.  A negative count searches for previous
+     occurrences.
+
+`character-search-backward (M-C-])'
+     A character is read and point is moved to the previous occurrence
+     of that character.  A negative count searches for subsequent
+     occurrences.
+
+`insert-comment (M-#)'
+     Without a numeric argument, the value of the `comment-begin'
+     variable is inserted at the beginning of the current line.  If a
+     numeric argument is supplied, this command acts as a toggle:  if
+     the characters at the beginning of the line do not match the value
+     of `comment-begin', the value is inserted, otherwise the
+     characters in `comment-begin' are deleted from the beginning of
+     the line.  In either case, the line is accepted as if a newline
+     had been typed.
+
+`dump-functions ()'
+     Print all of the functions and their key bindings to the Readline
+     output stream.  If a numeric argument is supplied, the output is
+     formatted in such a way that it can be made part of an INPUTRC
+     file.  This command is unbound by default.
+
+`dump-variables ()'
+     Print all of the settable variables and their values to the
+     Readline output stream.  If a numeric argument is supplied, the
+     output is formatted in such a way that it can be made part of an
+     INPUTRC file.  This command is unbound by default.
+
+`dump-macros ()'
+     Print all of the Readline key sequences bound to macros and the
+     strings they output.  If a numeric argument is supplied, the
+     output is formatted in such a way that it can be made part of an
+     INPUTRC file.  This command is unbound by default.
+
+`emacs-editing-mode (C-e)'
+     When in `vi' command mode, this causes a switch to `emacs' editing
+     mode.
+
+`vi-editing-mode (M-C-j)'
+     When in `emacs' editing mode, this causes a switch to `vi' editing
+     mode.
+
+
+\1f
+File: rluserman.info,  Node: Readline vi Mode,  Prev: Bindable Readline Commands,  Up: Command Line Editing
+
+1.5 Readline vi Mode
+====================
+
+While the Readline library does not have a full set of `vi' editing
+functions, it does contain enough to allow simple editing of the line.
+The Readline `vi' mode behaves as specified in the POSIX 1003.2
+standard.
+
+   In order to switch interactively between `emacs' and `vi' editing
+modes, use the command `M-C-j' (bound to emacs-editing-mode when in
+`vi' mode and to vi-editing-mode in `emacs' mode).  The Readline
+default is `emacs' mode.
+
+   When you enter a line in `vi' mode, you are already placed in
+`insertion' mode, as if you had typed an `i'.  Pressing <ESC> switches
+you into `command' mode, where you can edit the text of the line with
+the standard `vi' movement keys, move to previous history lines with
+`k' and subsequent lines with `j', and so forth.
+
+\1f
+File: rluserman.info,  Node: Copying This Manual,  Prev: Command Line Editing,  Up: Top
+
+Appendix A Copying This Manual
+******************************
+
+* Menu:
+
+* GNU Free Documentation License::     License for copying this manual.
+
+\1f
+File: rluserman.info,  Node: GNU Free Documentation License,  Up: Copying This Manual
+
+A.1 GNU Free Documentation License
+==================================
+
+                      Version 1.2, November 2002
+
+     Copyright (C) 2000,2001,2002 Free Software Foundation, Inc.
+     59 Temple Place, Suite 330, Boston, MA  02111-1307, USA
+
+     Everyone is permitted to copy and distribute verbatim copies
+     of this license document, but changing it is not allowed.
+
+  0. PREAMBLE
+
+     The purpose of this License is to make a manual, textbook, or other
+     functional and useful document "free" in the sense of freedom: to
+     assure everyone the effective freedom to copy and redistribute it,
+     with or without modifying it, either commercially or
+     noncommercially.  Secondarily, this License preserves for the
+     author and publisher a way to get credit for their work, while not
+     being considered responsible for modifications made by others.
+
+     This License is a kind of "copyleft", which means that derivative
+     works of the document must themselves be free in the same sense.
+     It complements the GNU General Public License, which is a copyleft
+     license designed for free software.
+
+     We have designed this License in order to use it for manuals for
+     free software, because free software needs free documentation: a
+     free program should come with manuals providing the same freedoms
+     that the software does.  But this License is not limited to
+     software manuals; it can be used for any textual work, regardless
+     of subject matter or whether it is published as a printed book.
+     We recommend this License principally for works whose purpose is
+     instruction or reference.
+
+  1. APPLICABILITY AND DEFINITIONS
+
+     This License applies to any manual or other work, in any medium,
+     that contains a notice placed by the copyright holder saying it
+     can be distributed under the terms of this License.  Such a notice
+     grants a world-wide, royalty-free license, unlimited in duration,
+     to use that work under the conditions stated herein.  The
+     "Document", below, refers to any such manual or work.  Any member
+     of the public is a licensee, and is addressed as "you".  You
+     accept the license if you copy, modify or distribute the work in a
+     way requiring permission under copyright law.
+
+     A "Modified Version" of the Document means any work containing the
+     Document or a portion of it, either copied verbatim, or with
+     modifications and/or translated into another language.
+
+     A "Secondary Section" is a named appendix or a front-matter section
+     of the Document that deals exclusively with the relationship of the
+     publishers or authors of the Document to the Document's overall
+     subject (or to related matters) and contains nothing that could
+     fall directly within that overall subject.  (Thus, if the Document
+     is in part a textbook of mathematics, a Secondary Section may not
+     explain any mathematics.)  The relationship could be a matter of
+     historical connection with the subject or with related matters, or
+     of legal, commercial, philosophical, ethical or political position
+     regarding them.
+
+     The "Invariant Sections" are certain Secondary Sections whose
+     titles are designated, as being those of Invariant Sections, in
+     the notice that says that the Document is released under this
+     License.  If a section does not fit the above definition of
+     Secondary then it is not allowed to be designated as Invariant.
+     The Document may contain zero Invariant Sections.  If the Document
+     does not identify any Invariant Sections then there are none.
+
+     The "Cover Texts" are certain short passages of text that are
+     listed, as Front-Cover Texts or Back-Cover Texts, in the notice
+     that says that the Document is released under this License.  A
+     Front-Cover Text may be at most 5 words, and a Back-Cover Text may
+     be at most 25 words.
+
+     A "Transparent" copy of the Document means a machine-readable copy,
+     represented in a format whose specification is available to the
+     general public, that is suitable for revising the document
+     straightforwardly with generic text editors or (for images
+     composed of pixels) generic paint programs or (for drawings) some
+     widely available drawing editor, and that is suitable for input to
+     text formatters or for automatic translation to a variety of
+     formats suitable for input to text formatters.  A copy made in an
+     otherwise Transparent file format whose markup, or absence of
+     markup, has been arranged to thwart or discourage subsequent
+     modification by readers is not Transparent.  An image format is
+     not Transparent if used for any substantial amount of text.  A
+     copy that is not "Transparent" is called "Opaque".
+
+     Examples of suitable formats for Transparent copies include plain
+     ASCII without markup, Texinfo input format, LaTeX input format,
+     SGML or XML using a publicly available DTD, and
+     standard-conforming simple HTML, PostScript or PDF designed for
+     human modification.  Examples of transparent image formats include
+     PNG, XCF and JPG.  Opaque formats include proprietary formats that
+     can be read and edited only by proprietary word processors, SGML or
+     XML for which the DTD and/or processing tools are not generally
+     available, and the machine-generated HTML, PostScript or PDF
+     produced by some word processors for output purposes only.
+
+     The "Title Page" means, for a printed book, the title page itself,
+     plus such following pages as are needed to hold, legibly, the
+     material this License requires to appear in the title page.  For
+     works in formats which do not have any title page as such, "Title
+     Page" means the text near the most prominent appearance of the
+     work's title, preceding the beginning of the body of the text.
+
+     A section "Entitled XYZ" means a named subunit of the Document
+     whose title either is precisely XYZ or contains XYZ in parentheses
+     following text that translates XYZ in another language.  (Here XYZ
+     stands for a specific section name mentioned below, such as
+     "Acknowledgements", "Dedications", "Endorsements", or "History".)
+     To "Preserve the Title" of such a section when you modify the
+     Document means that it remains a section "Entitled XYZ" according
+     to this definition.
+
+     The Document may include Warranty Disclaimers next to the notice
+     which states that this License applies to the Document.  These
+     Warranty Disclaimers are considered to be included by reference in
+     this License, but only as regards disclaiming warranties: any other
+     implication that these Warranty Disclaimers may have is void and
+     has no effect on the meaning of this License.
+
+  2. VERBATIM COPYING
+
+     You may copy and distribute the Document in any medium, either
+     commercially or noncommercially, provided that this License, the
+     copyright notices, and the license notice saying this License
+     applies to the Document are reproduced in all copies, and that you
+     add no other conditions whatsoever to those of this License.  You
+     may not use technical measures to obstruct or control the reading
+     or further copying of the copies you make or distribute.  However,
+     you may accept compensation in exchange for copies.  If you
+     distribute a large enough number of copies you must also follow
+     the conditions in section 3.
+
+     You may also lend copies, under the same conditions stated above,
+     and you may publicly display copies.
+
+  3. COPYING IN QUANTITY
+
+     If you publish printed copies (or copies in media that commonly
+     have printed covers) of the Document, numbering more than 100, and
+     the Document's license notice requires Cover Texts, you must
+     enclose the copies in covers that carry, clearly and legibly, all
+     these Cover Texts: Front-Cover Texts on the front cover, and
+     Back-Cover Texts on the back cover.  Both covers must also clearly
+     and legibly identify you as the publisher of these copies.  The
+     front cover must present the full title with all words of the
+     title equally prominent and visible.  You may add other material
+     on the covers in addition.  Copying with changes limited to the
+     covers, as long as they preserve the title of the Document and
+     satisfy these conditions, can be treated as verbatim copying in
+     other respects.
+
+     If the required texts for either cover are too voluminous to fit
+     legibly, you should put the first ones listed (as many as fit
+     reasonably) on the actual cover, and continue the rest onto
+     adjacent pages.
+
+     If you publish or distribute Opaque copies of the Document
+     numbering more than 100, you must either include a
+     machine-readable Transparent copy along with each Opaque copy, or
+     state in or with each Opaque copy a computer-network location from
+     which the general network-using public has access to download
+     using public-standard network protocols a complete Transparent
+     copy of the Document, free of added material.  If you use the
+     latter option, you must take reasonably prudent steps, when you
+     begin distribution of Opaque copies in quantity, to ensure that
+     this Transparent copy will remain thus accessible at the stated
+     location until at least one year after the last time you
+     distribute an Opaque copy (directly or through your agents or
+     retailers) of that edition to the public.
+
+     It is requested, but not required, that you contact the authors of
+     the Document well before redistributing any large number of
+     copies, to give them a chance to provide you with an updated
+     version of the Document.
+
+  4. MODIFICATIONS
+
+     You may copy and distribute a Modified Version of the Document
+     under the conditions of sections 2 and 3 above, provided that you
+     release the Modified Version under precisely this License, with
+     the Modified Version filling the role of the Document, thus
+     licensing distribution and modification of the Modified Version to
+     whoever possesses a copy of it.  In addition, you must do these
+     things in the Modified Version:
+
+       A. Use in the Title Page (and on the covers, if any) a title
+          distinct from that of the Document, and from those of
+          previous versions (which should, if there were any, be listed
+          in the History section of the Document).  You may use the
+          same title as a previous version if the original publisher of
+          that version gives permission.
+
+       B. List on the Title Page, as authors, one or more persons or
+          entities responsible for authorship of the modifications in
+          the Modified Version, together with at least five of the
+          principal authors of the Document (all of its principal
+          authors, if it has fewer than five), unless they release you
+          from this requirement.
+
+       C. State on the Title page the name of the publisher of the
+          Modified Version, as the publisher.
+
+       D. Preserve all the copyright notices of the Document.
+
+       E. Add an appropriate copyright notice for your modifications
+          adjacent to the other copyright notices.
+
+       F. Include, immediately after the copyright notices, a license
+          notice giving the public permission to use the Modified
+          Version under the terms of this License, in the form shown in
+          the Addendum below.
+
+       G. Preserve in that license notice the full lists of Invariant
+          Sections and required Cover Texts given in the Document's
+          license notice.
+
+       H. Include an unaltered copy of this License.
+
+       I. Preserve the section Entitled "History", Preserve its Title,
+          and add to it an item stating at least the title, year, new
+          authors, and publisher of the Modified Version as given on
+          the Title Page.  If there is no section Entitled "History" in
+          the Document, create one stating the title, year, authors,
+          and publisher of the Document as given on its Title Page,
+          then add an item describing the Modified Version as stated in
+          the previous sentence.
+
+       J. Preserve the network location, if any, given in the Document
+          for public access to a Transparent copy of the Document, and
+          likewise the network locations given in the Document for
+          previous versions it was based on.  These may be placed in
+          the "History" section.  You may omit a network location for a
+          work that was published at least four years before the
+          Document itself, or if the original publisher of the version
+          it refers to gives permission.
+
+       K. For any section Entitled "Acknowledgements" or "Dedications",
+          Preserve the Title of the section, and preserve in the
+          section all the substance and tone of each of the contributor
+          acknowledgements and/or dedications given therein.
+
+       L. Preserve all the Invariant Sections of the Document,
+          unaltered in their text and in their titles.  Section numbers
+          or the equivalent are not considered part of the section
+          titles.
+
+       M. Delete any section Entitled "Endorsements".  Such a section
+          may not be included in the Modified Version.
+
+       N. Do not retitle any existing section to be Entitled
+          "Endorsements" or to conflict in title with any Invariant
+          Section.
+
+       O. Preserve any Warranty Disclaimers.
+
+     If the Modified Version includes new front-matter sections or
+     appendices that qualify as Secondary Sections and contain no
+     material copied from the Document, you may at your option
+     designate some or all of these sections as invariant.  To do this,
+     add their titles to the list of Invariant Sections in the Modified
+     Version's license notice.  These titles must be distinct from any
+     other section titles.
+
+     You may add a section Entitled "Endorsements", provided it contains
+     nothing but endorsements of your Modified Version by various
+     parties--for example, statements of peer review or that the text
+     has been approved by an organization as the authoritative
+     definition of a standard.
+
+     You may add a passage of up to five words as a Front-Cover Text,
+     and a passage of up to 25 words as a Back-Cover Text, to the end
+     of the list of Cover Texts in the Modified Version.  Only one
+     passage of Front-Cover Text and one of Back-Cover Text may be
+     added by (or through arrangements made by) any one entity.  If the
+     Document already includes a cover text for the same cover,
+     previously added by you or by arrangement made by the same entity
+     you are acting on behalf of, you may not add another; but you may
+     replace the old one, on explicit permission from the previous
+     publisher that added the old one.
+
+     The author(s) and publisher(s) of the Document do not by this
+     License give permission to use their names for publicity for or to
+     assert or imply endorsement of any Modified Version.
+
+  5. COMBINING DOCUMENTS
+
+     You may combine the Document with other documents released under
+     this License, under the terms defined in section 4 above for
+     modified versions, provided that you include in the combination
+     all of the Invariant Sections of all of the original documents,
+     unmodified, and list them all as Invariant Sections of your
+     combined work in its license notice, and that you preserve all
+     their Warranty Disclaimers.
+
+     The combined work need only contain one copy of this License, and
+     multiple identical Invariant Sections may be replaced with a single
+     copy.  If there are multiple Invariant Sections with the same name
+     but different contents, make the title of each such section unique
+     by adding at the end of it, in parentheses, the name of the
+     original author or publisher of that section if known, or else a
+     unique number.  Make the same adjustment to the section titles in
+     the list of Invariant Sections in the license notice of the
+     combined work.
+
+     In the combination, you must combine any sections Entitled
+     "History" in the various original documents, forming one section
+     Entitled "History"; likewise combine any sections Entitled
+     "Acknowledgements", and any sections Entitled "Dedications".  You
+     must delete all sections Entitled "Endorsements."
+
+  6. COLLECTIONS OF DOCUMENTS
+
+     You may make a collection consisting of the Document and other
+     documents released under this License, and replace the individual
+     copies of this License in the various documents with a single copy
+     that is included in the collection, provided that you follow the
+     rules of this License for verbatim copying of each of the
+     documents in all other respects.
+
+     You may extract a single document from such a collection, and
+     distribute it individually under this License, provided you insert
+     a copy of this License into the extracted document, and follow
+     this License in all other respects regarding verbatim copying of
+     that document.
+
+  7. AGGREGATION WITH INDEPENDENT WORKS
+
+     A compilation of the Document or its derivatives with other
+     separate and independent documents or works, in or on a volume of
+     a storage or distribution medium, is called an "aggregate" if the
+     copyright resulting from the compilation is not used to limit the
+     legal rights of the compilation's users beyond what the individual
+     works permit.  When the Document is included an aggregate, this
+     License does not apply to the other works in the aggregate which
+     are not themselves derivative works of the Document.
+
+     If the Cover Text requirement of section 3 is applicable to these
+     copies of the Document, then if the Document is less than one half
+     of the entire aggregate, the Document's Cover Texts may be placed
+     on covers that bracket the Document within the aggregate, or the
+     electronic equivalent of covers if the Document is in electronic
+     form.  Otherwise they must appear on printed covers that bracket
+     the whole aggregate.
+
+  8. TRANSLATION
+
+     Translation is considered a kind of modification, so you may
+     distribute translations of the Document under the terms of section
+     4.  Replacing Invariant Sections with translations requires special
+     permission from their copyright holders, but you may include
+     translations of some or all Invariant Sections in addition to the
+     original versions of these Invariant Sections.  You may include a
+     translation of this License, and all the license notices in the
+     Document, and any Warranty Disclaimers, provided that you also
+     include the original English version of this License and the
+     original versions of those notices and disclaimers.  In case of a
+     disagreement between the translation and the original version of
+     this License or a notice or disclaimer, the original version will
+     prevail.
+
+     If a section in the Document is Entitled "Acknowledgements",
+     "Dedications", or "History", the requirement (section 4) to
+     Preserve its Title (section 1) will typically require changing the
+     actual title.
+
+  9. TERMINATION
+
+     You may not copy, modify, sublicense, or distribute the Document
+     except as expressly provided for under this License.  Any other
+     attempt to copy, modify, sublicense or distribute the Document is
+     void, and will automatically terminate your rights under this
+     License.  However, parties who have received copies, or rights,
+     from you under this License will not have their licenses
+     terminated so long as such parties remain in full compliance.
+
+ 10. FUTURE REVISIONS OF THIS LICENSE
+
+     The Free Software Foundation may publish new, revised versions of
+     the GNU Free Documentation License from time to time.  Such new
+     versions will be similar in spirit to the present version, but may
+     differ in detail to address new problems or concerns.  See
+     `http://www.gnu.org/copyleft/'.
+
+     Each version of the License is given a distinguishing version
+     number.  If the Document specifies that a particular numbered
+     version of this License "or any later version" applies to it, you
+     have the option of following the terms and conditions either of
+     that specified version or of any later version that has been
+     published (not as a draft) by the Free Software Foundation.  If
+     the Document does not specify a version number of this License,
+     you may choose any version ever published (not as a draft) by the
+     Free Software Foundation.
+
+A.1.1 ADDENDUM: How to use this License for your documents
+----------------------------------------------------------
+
+To use this License in a document you have written, include a copy of
+the License in the document and put the following copyright and license
+notices just after the title page:
+
+       Copyright (C)  YEAR  YOUR NAME.
+       Permission is granted to copy, distribute and/or modify this document
+       under the terms of the GNU Free Documentation License, Version 1.2
+       or any later version published by the Free Software Foundation;
+       with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.
+       A copy of the license is included in the section entitled ``GNU
+       Free Documentation License''.
+
+   If you have Invariant Sections, Front-Cover Texts and Back-Cover
+Texts, replace the "with...Texts." line with this:
+
+         with the Invariant Sections being LIST THEIR TITLES, with
+         the Front-Cover Texts being LIST, and with the Back-Cover Texts
+         being LIST.
+
+   If you have Invariant Sections without Cover Texts, or some other
+combination of the three, merge those two alternatives to suit the
+situation.
+
+   If your document contains nontrivial examples of program code, we
+recommend releasing these examples in parallel under your choice of
+free software license, such as the GNU General Public License, to
+permit their use in free software.
+
+
+\1f
+Tag Table:
+Node: Top\7f1373
+Node: Command Line Editing\7f1805
+Node: Introduction and Notation\7f2448
+Node: Readline Interaction\7f4072
+Node: Readline Bare Essentials\7f5265
+Node: Readline Movement Commands\7f7056
+Node: Readline Killing Commands\7f8023
+Node: Readline Arguments\7f9945
+Node: Searching\7f10991
+Node: Readline Init File\7f13144
+Node: Readline Init File Syntax\7f14299
+Node: Conditional Init Constructs\7f26350
+Node: Sample Init File\7f28885
+Node: Bindable Readline Commands\7f32004
+Node: Commands For Moving\7f33063
+Node: Commands For History\7f33926
+Node: Commands For Text\7f37052
+Node: Commands For Killing\7f39780
+Node: Numeric Arguments\7f41924
+Node: Commands For Completion\7f43065
+Node: Keyboard Macros\7f44611
+Node: Miscellaneous Commands\7f45184
+Node: Readline vi Mode\7f48547
+Node: Copying This Manual\7f49468
+Node: GNU Free Documentation License\7f49700
+\1f
+End Tag Table
diff --git a/doc/rluserman.pdf b/doc/rluserman.pdf
new file mode 100644 (file)
index 0000000..4a2184b
Binary files /dev/null and b/doc/rluserman.pdf differ
diff --git a/doc/rluserman.ps b/doc/rluserman.ps
new file mode 100644 (file)
index 0000000..74fe0df
--- /dev/null
@@ -0,0 +1,4957 @@
+%!PS-Adobe-2.0
+%%Creator: dvips(k) 5.92b Copyright 2002 Radical Eye Software
+%%Title: rluserman.dvi
+%%Pages: 32
+%%PageOrder: Ascend
+%%BoundingBox: 0 0 612 792
+%%DocumentFonts: CMBX12 CMR10 CMTT10 CMSY10 CMBXTI10 CMTI10 CMCSC10
+%%+ CMSLTT10 CMSY9 CMR8 CMSL10 CMTT9
+%%EndComments
+%DVIPSWebPage: (www.radicaleye.com)
+%DVIPSCommandLine: dvips -D 600 -t letter -o rluserman.ps rluserman.dvi
+%DVIPSParameters: dpi=600, compressed
+%DVIPSSource:  TeX output 2006.07.06:0935
+%%BeginProcSet: texc.pro
+%!
+/TeXDict 300 dict def TeXDict begin/N{def}def/B{bind def}N/S{exch}N/X{S
+N}B/A{dup}B/TR{translate}N/isls false N/vsize 11 72 mul N/hsize 8.5 72
+mul N/landplus90{false}def/@rigin{isls{[0 landplus90{1 -1}{-1 1}ifelse 0
+0 0]concat}if 72 Resolution div 72 VResolution div neg scale isls{
+landplus90{VResolution 72 div vsize mul 0 exch}{Resolution -72 div hsize
+mul 0}ifelse TR}if Resolution VResolution vsize -72 div 1 add mul TR[
+matrix currentmatrix{A A round sub abs 0.00001 lt{round}if}forall round
+exch round exch]setmatrix}N/@landscape{/isls true N}B/@manualfeed{
+statusdict/manualfeed true put}B/@copies{/#copies X}B/FMat[1 0 0 -1 0 0]
+N/FBB[0 0 0 0]N/nn 0 N/IEn 0 N/ctr 0 N/df-tail{/nn 8 dict N nn begin
+/FontType 3 N/FontMatrix fntrx N/FontBBox FBB N string/base X array
+/BitMaps X/BuildChar{CharBuilder}N/Encoding IEn N end A{/foo setfont}2
+array copy cvx N load 0 nn put/ctr 0 N[}B/sf 0 N/df{/sf 1 N/fntrx FMat N
+df-tail}B/dfs{div/sf X/fntrx[sf 0 0 sf neg 0 0]N df-tail}B/E{pop nn A
+definefont setfont}B/Cw{Cd A length 5 sub get}B/Ch{Cd A length 4 sub get
+}B/Cx{128 Cd A length 3 sub get sub}B/Cy{Cd A length 2 sub get 127 sub}
+B/Cdx{Cd A length 1 sub get}B/Ci{Cd A type/stringtype ne{ctr get/ctr ctr
+1 add N}if}B/id 0 N/rw 0 N/rc 0 N/gp 0 N/cp 0 N/G 0 N/CharBuilder{save 3
+1 roll S A/base get 2 index get S/BitMaps get S get/Cd X pop/ctr 0 N Cdx
+0 Cx Cy Ch sub Cx Cw add Cy setcachedevice Cw Ch true[1 0 0 -1 -.1 Cx
+sub Cy .1 sub]/id Ci N/rw Cw 7 add 8 idiv string N/rc 0 N/gp 0 N/cp 0 N{
+rc 0 ne{rc 1 sub/rc X rw}{G}ifelse}imagemask restore}B/G{{id gp get/gp
+gp 1 add N A 18 mod S 18 idiv pl S get exec}loop}B/adv{cp add/cp X}B
+/chg{rw cp id gp 4 index getinterval putinterval A gp add/gp X adv}B/nd{
+/cp 0 N rw exit}B/lsh{rw cp 2 copy get A 0 eq{pop 1}{A 255 eq{pop 254}{
+A A add 255 and S 1 and or}ifelse}ifelse put 1 adv}B/rsh{rw cp 2 copy
+get A 0 eq{pop 128}{A 255 eq{pop 127}{A 2 idiv S 128 and or}ifelse}
+ifelse put 1 adv}B/clr{rw cp 2 index string putinterval adv}B/set{rw cp
+fillstr 0 4 index getinterval putinterval adv}B/fillstr 18 string 0 1 17
+{2 copy 255 put pop}for N/pl[{adv 1 chg}{adv 1 chg nd}{1 add chg}{1 add
+chg nd}{adv lsh}{adv lsh nd}{adv rsh}{adv rsh nd}{1 add adv}{/rc X nd}{
+1 add set}{1 add clr}{adv 2 chg}{adv 2 chg nd}{pop nd}]A{bind pop}
+forall N/D{/cc X A type/stringtype ne{]}if nn/base get cc ctr put nn
+/BitMaps get S ctr S sf 1 ne{A A length 1 sub A 2 index S get sf div put
+}if put/ctr ctr 1 add N}B/I{cc 1 add D}B/bop{userdict/bop-hook known{
+bop-hook}if/SI save N @rigin 0 0 moveto/V matrix currentmatrix A 1 get A
+mul exch 0 get A mul add .99 lt{/QV}{/RV}ifelse load def pop pop}N/eop{
+SI restore userdict/eop-hook known{eop-hook}if showpage}N/@start{
+userdict/start-hook known{start-hook}if pop/VResolution X/Resolution X
+1000 div/DVImag X/IEn 256 array N 2 string 0 1 255{IEn S A 360 add 36 4
+index cvrs cvn put}for pop 65781.76 div/vsize X 65781.76 div/hsize X}N
+/p{show}N/RMat[1 0 0 -1 0 0]N/BDot 260 string N/Rx 0 N/Ry 0 N/V{}B/RV/v{
+/Ry X/Rx X V}B statusdict begin/product where{pop false[(Display)(NeXT)
+(LaserWriter 16/600)]{A length product length le{A length product exch 0
+exch getinterval eq{pop true exit}if}{pop}ifelse}forall}{false}ifelse
+end{{gsave TR -.1 .1 TR 1 1 scale Rx Ry false RMat{BDot}imagemask
+grestore}}{{gsave TR -.1 .1 TR Rx Ry scale 1 1 false RMat{BDot}
+imagemask grestore}}ifelse B/QV{gsave newpath transform round exch round
+exch itransform moveto Rx 0 rlineto 0 Ry neg rlineto Rx neg 0 rlineto
+fill grestore}B/a{moveto}B/delta 0 N/tail{A/delta X 0 rmoveto}B/M{S p
+delta add tail}B/b{S p tail}B/c{-4 M}B/d{-3 M}B/e{-2 M}B/f{-1 M}B/g{0 M}
+B/h{1 M}B/i{2 M}B/j{3 M}B/k{4 M}B/w{0 rmoveto}B/l{p -4 w}B/m{p -3 w}B/n{
+p -2 w}B/o{p -1 w}B/q{p 1 w}B/r{p 2 w}B/s{p 3 w}B/t{p 4 w}B/x{0 S
+rmoveto}B/y{3 2 roll p a}B/bos{/SS save N}B/eos{SS restore}B end
+
+%%EndProcSet
+%%BeginProcSet: f7b6d320.enc
+% Thomas Esser, Dec 2002. public domain
+%
+% Encoding for:
+%     cmb10 cmbx10 cmbx12 cmbx5 cmbx6 cmbx7 cmbx8 cmbx9 cmbxsl10
+%     cmdunh10 cmr10 cmr12 cmr17cmr6 cmr7 cmr8 cmr9 cmsl10 cmsl12 cmsl8
+%     cmsl9 cmss10cmss12 cmss17 cmss8 cmss9 cmssbx10 cmssdc10 cmssi10
+%     cmssi12 cmssi17 cmssi8cmssi9 cmssq8 cmssqi8 cmvtt10
+%
+/TeXf7b6d320Encoding [
+/Gamma /Delta /Theta /Lambda /Xi /Pi /Sigma /Upsilon /Phi /Psi /Omega
+/ff /fi /fl /ffi /ffl /dotlessi /dotlessj /grave /acute /caron /breve
+/macron /ring /cedilla /germandbls /ae /oe /oslash /AE /OE /Oslash
+/suppress /exclam /quotedblright /numbersign /dollar /percent /ampersand
+/quoteright /parenleft /parenright /asterisk /plus /comma /hyphen
+/period /slash /zero /one /two /three /four /five /six /seven /eight
+/nine /colon /semicolon /exclamdown /equal /questiondown /question /at
+/A /B /C /D /E /F /G /H /I /J /K /L /M /N /O /P /Q /R /S /T /U /V /W /X
+/Y /Z /bracketleft /quotedblleft /bracketright /circumflex /dotaccent
+/quoteleft /a /b /c /d /e /f /g /h /i /j /k /l /m /n /o /p /q /r /s /t /u
+/v /w /x /y /z /endash /emdash /hungarumlaut /tilde /dieresis /suppress
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /space
+/Gamma /Delta /Theta /Lambda /Xi /Pi /Sigma /Upsilon /Phi /Psi /.notdef
+/.notdef /Omega /ff /fi /fl /ffi /ffl /dotlessi /dotlessj /grave /acute
+/caron /breve /macron /ring /cedilla /germandbls /ae /oe /oslash /AE
+/OE /Oslash /suppress /dieresis /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+] def
+
+%%EndProcSet
+%%BeginProcSet: 09fbbfac.enc
+% Thomas Esser, Dec 2002. public domain
+%
+% Encoding for:
+%     cmsltt10 cmtt10 cmtt12 cmtt8 cmtt9
+/TeX09fbbfacEncoding [
+/Gamma /Delta /Theta /Lambda /Xi /Pi /Sigma /Upsilon /Phi /Psi
+/Omega /arrowup /arrowdown /quotesingle /exclamdown /questiondown
+/dotlessi /dotlessj /grave /acute /caron /breve /macron /ring /cedilla
+/germandbls /ae /oe /oslash /AE /OE /Oslash /visiblespace /exclam
+/quotedbl /numbersign /dollar /percent /ampersand /quoteright /parenleft
+/parenright /asterisk /plus /comma /hyphen /period /slash /zero /one
+/two /three /four /five /six /seven /eight /nine /colon /semicolon /less
+/equal /greater /question /at /A /B /C /D /E /F /G /H /I /J /K /L /M /N
+/O /P /Q /R /S /T /U /V /W /X /Y /Z /bracketleft /backslash /bracketright
+/asciicircum /underscore /quoteleft /a /b /c /d /e /f /g /h /i /j /k /l
+/m /n /o /p /q /r /s /t /u /v /w /x /y /z /braceleft /bar /braceright
+/asciitilde /dieresis /visiblespace /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /space /Gamma /Delta /Theta /Lambda /Xi /Pi
+/Sigma /Upsilon /Phi /Psi /.notdef /.notdef /Omega /arrowup /arrowdown
+/quotesingle /exclamdown /questiondown /dotlessi /dotlessj /grave /acute
+/caron /breve /macron /ring /cedilla /germandbls /ae /oe /oslash /AE
+/OE /Oslash /visiblespace /dieresis /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+] def
+
+%%EndProcSet
+%%BeginProcSet: bbad153f.enc
+% Thomas Esser, Dec 2002. public domain
+%
+% Encoding for:
+%     cmsy10 cmsy5 cmsy6 cmsy7 cmsy8 cmsy9
+%
+/TeXbbad153fEncoding [
+/minus /periodcentered /multiply /asteriskmath /divide /diamondmath
+/plusminus /minusplus /circleplus /circleminus /circlemultiply
+/circledivide /circledot /circlecopyrt /openbullet /bullet
+/equivasymptotic /equivalence /reflexsubset /reflexsuperset /lessequal
+/greaterequal /precedesequal /followsequal /similar /approxequal
+/propersubset /propersuperset /lessmuch /greatermuch /precedes /follows
+/arrowleft /arrowright /arrowup /arrowdown /arrowboth /arrownortheast
+/arrowsoutheast /similarequal /arrowdblleft /arrowdblright /arrowdblup
+/arrowdbldown /arrowdblboth /arrownorthwest /arrowsouthwest /proportional
+/prime /infinity /element /owner /triangle /triangleinv /negationslash
+/mapsto /universal /existential /logicalnot /emptyset /Rfractur /Ifractur
+/latticetop /perpendicular /aleph /A /B /C /D /E /F /G /H /I /J /K
+/L /M /N /O /P /Q /R /S /T /U /V /W /X /Y /Z /union /intersection
+/unionmulti /logicaland /logicalor /turnstileleft /turnstileright
+/floorleft /floorright /ceilingleft /ceilingright /braceleft /braceright
+/angbracketleft /angbracketright /bar /bardbl /arrowbothv /arrowdblbothv
+/backslash /wreathproduct /radical /coproduct /nabla /integral
+/unionsq /intersectionsq /subsetsqequal /supersetsqequal /section
+/dagger /daggerdbl /paragraph /club /diamond /heart /spade /arrowleft
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/minus /periodcentered /multiply /asteriskmath /divide /diamondmath
+/plusminus /minusplus /circleplus /circleminus /.notdef /.notdef
+/circlemultiply /circledivide /circledot /circlecopyrt /openbullet
+/bullet /equivasymptotic /equivalence /reflexsubset /reflexsuperset
+/lessequal /greaterequal /precedesequal /followsequal /similar
+/approxequal /propersubset /propersuperset /lessmuch /greatermuch
+/precedes /follows /arrowleft /spade /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+] def
+
+%%EndProcSet
+%%BeginProcSet: 74afc74c.enc
+% Thomas Esser, Dec 2002. public domain
+%
+% Encoding for:
+%     cmbxti10 cmff10 cmfi10 cmfib8 cmti10 cmti12 cmti7 cmti8cmti9 cmu10
+%
+/TeX74afc74cEncoding [
+/Gamma /Delta /Theta /Lambda /Xi /Pi /Sigma /Upsilon /Phi /Psi /Omega
+/ff /fi /fl /ffi /ffl /dotlessi /dotlessj /grave /acute /caron /breve
+/macron /ring /cedilla /germandbls /ae /oe /oslash /AE /OE /Oslash
+/suppress /exclam /quotedblright /numbersign /sterling /percent
+/ampersand /quoteright /parenleft /parenright /asterisk /plus /comma
+/hyphen /period /slash /zero /one /two /three /four /five /six /seven
+/eight /nine /colon /semicolon /exclamdown /equal /questiondown /question
+/at /A /B /C /D /E /F /G /H /I /J /K /L /M /N /O /P /Q /R /S /T /U /V /W
+/X /Y /Z /bracketleft /quotedblleft /bracketright /circumflex /dotaccent
+/quoteleft /a /b /c /d /e /f /g /h /i /j /k /l /m /n /o /p /q /r /s /t /u
+/v /w /x /y /z /endash /emdash /hungarumlaut /tilde /dieresis /suppress
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /space
+/Gamma /Delta /Theta /Lambda /Xi /Pi /Sigma /Upsilon /Phi /Psi /.notdef
+/.notdef /Omega /ff /fi /fl /ffi /ffl /dotlessi /dotlessj /grave /acute
+/caron /breve /macron /ring /cedilla /germandbls /ae /oe /oslash /AE
+/OE /Oslash /suppress /dieresis /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+] def
+
+%%EndProcSet
+%%BeginProcSet: 0ef0afca.enc
+% Thomas Esser, Dec 2002. public domain
+%
+% Encoding for:
+%     cmr5
+%
+/TeX0ef0afcaEncoding [
+/Gamma /Delta /Theta /Lambda /Xi /Pi /Sigma /Upsilon /Phi /Psi /Omega
+/arrowup /arrowdown /quotesingle /exclamdown /questiondown /dotlessi
+/dotlessj /grave /acute /caron /breve /macron /ring /cedilla /germandbls
+/ae /oe /oslash /AE /OE /Oslash /suppress /exclam /quotedblright
+/numbersign /dollar /percent /ampersand /quoteright /parenleft
+/parenright /asterisk /plus /comma /hyphen /period /slash /zero /one
+/two /three /four /five /six /seven /eight /nine /colon /semicolon
+/less /equal /greater /question /at /A /B /C /D /E /F /G /H /I /J /K
+/L /M /N /O /P /Q /R /S /T /U /V /W /X /Y /Z /bracketleft /quotedblleft
+/bracketright /circumflex /dotaccent /quoteleft /a /b /c /d /e /f /g /h
+/i /j /k /l /m /n /o /p /q /r /s /t /u /v /w /x /y /z /endash /emdash
+/hungarumlaut /tilde /dieresis /suppress /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /space /Gamma /Delta /Theta /Lambda
+/Xi /Pi /Sigma /Upsilon /Phi /Psi /.notdef /.notdef /Omega /arrowup
+/arrowdown /quotesingle /exclamdown /questiondown /dotlessi /dotlessj
+/grave /acute /caron /breve /macron /ring /cedilla /germandbls /ae /oe
+/oslash /AE /OE /Oslash /suppress /dieresis /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+] def
+
+%%EndProcSet
+%%BeginProcSet: texps.pro
+%!
+TeXDict begin/rf{findfont dup length 1 add dict begin{1 index/FID ne 2
+index/UniqueID ne and{def}{pop pop}ifelse}forall[1 index 0 6 -1 roll
+exec 0 exch 5 -1 roll VResolution Resolution div mul neg 0 0]FontType 0
+ne{/Metrics exch def dict begin Encoding{exch dup type/integertype ne{
+pop pop 1 sub dup 0 le{pop}{[}ifelse}{FontMatrix 0 get div Metrics 0 get
+div def}ifelse}forall Metrics/Metrics currentdict end def}{{1 index type
+/nametype eq{exit}if exch pop}loop}ifelse[2 index currentdict end
+definefont 3 -1 roll makefont/setfont cvx]cvx def}def/ObliqueSlant{dup
+sin S cos div neg}B/SlantFont{4 index mul add}def/ExtendFont{3 -1 roll
+mul exch}def/ReEncodeFont{CharStrings rcheck{/Encoding false def dup[
+exch{dup CharStrings exch known not{pop/.notdef/Encoding true def}if}
+forall Encoding{]exch pop}{cleartomark}ifelse}if/Encoding exch def}def
+end
+
+%%EndProcSet
+%%BeginFont: CMSLTT10
+%!PS-AdobeFont-1.1: CMSLTT10 1.0
+%%CreationDate: 1991 Aug 20 16:41:43
+% Copyright (C) 1997 American Mathematical Society. All Rights Reserved.
+11 dict begin
+/FontInfo 7 dict dup begin
+/version (1.0) readonly def
+/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def
+/FullName (CMSLTT10) readonly def
+/FamilyName (Computer Modern) readonly def
+/Weight (Medium) readonly def
+/ItalicAngle -9.46 def
+/isFixedPitch true def
+end readonly def
+/FontName /CMSLTT10 def
+/PaintType 0 def
+/FontType 1 def
+/FontMatrix [0.001 0 0 0.001 0 0] readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 0 /.notdef put
+readonly def
+/FontBBox{-20 -233 617 696}readonly def
+/UniqueID 5000800 def
+currentdict end
+currentfile eexec
+D9D66F633B846A97B686A97E45A3D0AA0528A405DF15F03DB1C3DA8B850431F8
+0E5F73DAC973450D1ED0530313057E971FC7E7CA88E61DA6DB9A5CD61F0F76CB
+4DE9105D0627B8DDF51A655098229920CF429CDAFC3F7788C95E7AB30E84F840
+8CED52E98DB4CFF161D2E62B0D28CB8B0AC82E7A8D2C007953BAFB3056D66079
+8064956E257D31C13509FB81A250D9E875C77A4E91CC49E9FB3C0718B2F691D4
+B4A64F351F4DD68133DED7629B0D96E5124584A16FD2AC7A3EB244A934FF059F
+ED7297B0505F3C2994AD66A3CA5D2728B034DE94B64A8AFAF341601BD4DB5858
+C9950A8BB9C598B8960609F48116ABA8C007190AF0ED335EB5BF61BA6871FA5F
+EAB5A26AEB5C7C352EB80799CEB983F19EEFA801093F62086AADD0B80BB6580F
+2CF61B1390FA56DFA1A0B61C58DEF96BA767A8A37EA44730783C600706606C60
+4EE74EA99B7C0F8E2525C8847F3D31907C3C483EFA98F6C416B6B2C343DE6370
+52FAE423008D086A76A1FFB327CC7FD84B1C66B203A4F41582F4599A82F8362D
+38108452EACCC937FFC4F3ABBFE3628DF51367DA6BA3F6826FC6522D6AC5E8EA
+00BAD300FFB6DEDAB93237704202BACD030AA824B1E97C0AFE17FCE8C75F4FA0
+B8A74329A6CF1788C7EB34DA7307411E9AD7ED8D6582884456E06E033B4FFE7D
+CD4DD8B06AD01340CCCFBC382C18CA451E4C886B01D082FF8CC5793F4727C3DF
+B52B4F1A242F31D1EB79D1E39A1D4FD13D6C5E2A42AD4B4D1CC4EE7BA0E5F80F
+802E5AB57EA15F4DE44D82AC408AA86D4BF58EF967FBC6497BBC7F017C0598AE
+32CF865DFFF0FC7FF9E6DCE9B5F2F4C7491AC674F46E8E7660452CE0A77C1EE8
+00DE382ABED85350033F8ECB97398E4E0A75D4877A107F6A909D0C76D14F9A96
+8A6CFDE3FD9D79B6FD82693A9F354BD2ECF30C6D99F7AC522F8D6C93EA214F7B
+3D0ED77F042ACDE9414264C0698E86398562E2C640DEBBA0734AB4C3ACE3907D
+CC79E6B2C6C3C3F9B01526E8CD98237D4A9B403FF8CE3132222FA60C196A19BC
+A2393AE6935C0F8B67FC1D1A12A45ED5F28B5D6A266A3ECAA5BC3429F2B2FFDD
+70F50A94CACA6AA6B2215B41EA683DF13679E9C950276294B15370256F17E3E8
+5FB8B575E7D4A3FC9BD8A5FAE6FCA53DF678F37701E83F18F1E116E901A39DCB
+C05CF72BFAF7FD8CC6A63A23C1CFC064EF32F3F67EE47B4209A5F83A5B2681C7
+8349B0C686E9D9844242C28DEC5E33DF480418F784EF676681D52ED234561B62
+4B7896DEC847A783789BFA4159279438404D596C9E6789B5C63C749AF0C3FBB3
+AADFC022B8682FD21F13460FE480C6B8CC1FB4EAC8E7AAFDCFDAD39508EF9B61
+BBCC73F90FB40E94EAC04892831753F15E06F77399F8ADB508F411A89A0399B4
+240C28E4DDDA98B9E771FE6AA0E2C8DE04DDA8AE54BD1A90DAFC1B0B66964F3E
+31475DBBC3D3BA2CA2C3D55D91917F6E496EFBCD5CBC46A27DB7E3FD229DE5AE
+A194E4B767F933C434D204BB080A5C24805A23E477BCFF6D19DB22FAFFEB97CA
+5445129773D40A43537F15EE90CC399EF58C31253BBC0177D05A1DBF23EB26D0
+159FA4D20E5E5B04A125FFF85CD1154B20BC5BFBA18F87670A2BF1A32A696A70
+4E82EBEC804D798202DAF537B468B5880FCAC75BDCFBF65FE6EBB93A1309D343
+09CCF1B81155761809E4ABA53CC9BF8D3FEC5602A6F3561CF2AF6D0A35B8876A
+8BE4CCBCB2DE4E4D07F50F9C5F831C499ADC35827F7F7BE7E1E0CE1BF2E3578E
+FA292C0CFCA10329156FC79BE3D80225794DE7062B8CE232355007F53F9184BA
+93F2C8F0EC8FD88F01397E1EC2ADBAA889C003AE4847BD08FBD9673C4B4D20D7
+53D0FD11FE4DE30AF01AF0141573DEB0B054DE244035E6161962D9BA836D42B9
+8B8006A40E357E28859D867052CE7DAA86F32641C1764A51F631CBA3FC206667
+81863B28C5BEE78C574F1946253D192C50CED9746B01CF4BEDDB5AB7492E36B0
+FDDB90206C5410551EA2F44E427B6A254FB2E965932DFA8A4465B509276CDAF3
+CFE6FC9963F801813A03D434B74273BC4FBA6FFB8545A10B453F8AC8086DA9CB
+49A701C500FD3D1577A215026EEB1AD2616223CC65E34CA84D1BAB896EE60C08
+7708BB0E5FFAC9EE1A24F72F03C13B8A275264CE267728084388365FF79B895C
+B65A33011BBEB2356016786F62EBCE765891CCEBC5A57453AA1AE771147D23C5
+7E289B67C94A4C7DBB3520A7E5BA938DDDE360FF69484CC4F31D57271BE2D19F
+7E689DD8373EC2CF7E3874711F3E3EDEEB09435AA0909418AD76074944C06BC6
+10C087339F57A1C828E1DCAC8B6F7D1F94A25133D72E68BA0C15586C997581B5
+957F59D0445D39E0F8226D4C621E9B12256EB583A7EE4A5EBD15B3E6BC9F6687
+28735EC4962332DEAD2D2A28714FB8F606B358E3E9ABC868E169E3FCEA409A48
+6998A5F444CE13F65F3F9D4B2A90CF483346348E4E6B4868C442C83726634EA4
+D4917AC8ED021012707DFC72926B58917264925482CA53A2BB96E2FC58A6083E
+4D7193E39B0B20EA7BC306FFBD70D434795176E77DC76C9643560472AC2718E2
+9A70D6973D0903263D1DEC1E82752CAC7AC2EC5442D9151BF459C27D96A28096
+42ADFD3D9FAA7A42A2EBE9CA3D7DC90AD0A6BA1B9F5224FBE0051352176DA443
+039B52443A0031BCD66485F49B55D7DBF4F4EB7E4A87DCF7A1F3F345EF85DA6D
+30CA6E389FC39930850B63E8EF3523AE1FF188DE5E26766C160A2F1631E1846D
+6DAEF695D585909E1F9A85C551B864046B534FDE0A35E54ACB3EDCF34A87CCC7
+C6073D2761CF74B07D154A4C560F5595A87250E3549E3706A402F3CC879AB051
+796A168E1197187ECF09AC42398AE4085F4C70EFDF98C387C232E3C323C6C496
+5EA1A799D2EC3E9E6C8060ACFFEB714FBBF8210D285D871A40DE8C39DF37FE1F
+241491B1B483A0B7D95DEA6E211954DCF49DA353F4A71CD9E0D144E84CE4A426
+8558F4B2BC06A7D44C961B6ADABA9759D1FF06DCFDE125D0947BC6982C375891
+72762550A44639B5E5E19EBD541848342C060714443D5E96537E1A214E9843F0
+5321B2479DFEE8DD1836B48CDDD5A117E20032334F18267B7323BCEDE5896BFC
+F0D91FA4B1AD0C4E38D9906ABD7009FB69A77CD280BF9BF43772371975CA6145
+A96F562D335A5B4D1366F728243C521B01D9008E655890AACABA0C45DCB1F45E
+BB6CABA51B1D31EA51637D0EE279B49257EE30B587E17DFF959E000AAA048D31
+F998B857205295CBE7177CDF44CC9BDA33CBC918B0AE72187BBB0BC23696F7AB
+1BB5A7D3705FE0579F20707008CD2A88D110343AA8B827A5EE6118F5D846F250
+6FDBC37270FB344E37B33F5F6DF16920CE3518BD459A8349CB87F8D9A61F36B8
+B1D26717D4BD4B8E76E283489718D38C66D0B4473D577F373F9A938705E0C620
+CD56F9B105C4E65B56E55CDD6893B3441F8B215C17E35E3EE4E734AF17C48895
+CE02A9B55C7738B8836EFEBE12AC9E6488CE6C828F2422EFBFDB4EBE80FD6E61
+0D0B85F1DFF9B8F319B0B696E90F60312506934F212454E10C673DF013C6F913
+E60BD6301A9AAB7DAFE5D6193731260024AFA425D46B4BEBD55133A3BB27B27E
+8837C39FFF999C01E9A3EB8905D2FFD482348BC97C07E7B2256CA33303322A5B
+587B1FF198422716A4577CE681B120C4D074EA2B3C275646B853360FC134D674
+0CF1007077B35E3A1D100A3C620BA005BB9F80444DC927E6AAC738DE5B3F87EE
+190B2FF31CE1B1A0AD34C19B28DE21136462A3591002EDB5CBDC06E09326733A
+8498626848549F36B077DFB2A2FCCBB775BAFC2C46BA20811049B7AF4F34C009
+71468C3641D8ED8616C21D1DC90E21A72AFE14B5F5718A42F11F46F2C3CF3FFA
+992DAAA3A3BC90073B3E2765C75F05A5EBDE85F37826131DCE2967089E8F7E69
+F16B41BCFB8914BF2F0B806CB35B133564224C0C9C1D6E3032D276D5464873D9
+0D17CC512E5CFAB6570D61E8D023D2CFE020212DB7B0FBF3D324FA5B3AFE7951
+E8382B7A8FDEBBACAE4B02CDD3D1791C79A78B9D49F20FD6F22B7E55CE36836E
+31A5B619B305CDDC722F6AC84CBC0D49835647204BDABCFF59D9F3B5EA22D533
+F316DD5EFC59A7F645AEE0BCDC07193111510563159EF684A739CE67EEB77638
+54F0C3D4E1A54801F4887BAD58EEDA68539B2A43B5B5D79369F74035966F07E1
+3FFD43FFF05F7EBA48DB0F988F34A44A0B15B028508868EFEA89F22C61DBA74C
+E04F9DBFD28DEC1EBC536587EF7A8DDD7B0ADAF459C0F22C24DC2D8C797C14B5
+9370504500422265C0AEFA2A8C367AD89ABC057E4B6043D991EA59564C1ABD06
+6C6E9147806C79DEA43EB8B7D0560DEB9C81766B9D79608A91D7AB606A7CD6C6
+276BF4F7E294BD0D0D3F94B321434B1A9CD4206E3146B3CE1113D62E7791BD79
+9AE322A997557EDC27045FA4521AB379253C27A4A234662FB4F73AE398C4C9E0
+2D4B3E7EF5F1E5BEEA50FE62B8AC0D42C131FD507D6D1735FD79F8223516E84E
+755930A2E30B80E63A6B24CD4244584BF7E93083EE46EFD9CD19A71A4B8453AB
+233710DC0AE68FAB2B1D9E3A17DE97AE09935E0056589BB7B3AFF3672B406CD8
+E914F786600C5B7AC4E8C57BB65B580A02BE8491E0D8E5817A99C4695E1D3A27
+12E5F7A945BFDB67E2CA285C3ABE5C15C870530F588E0B8686A4C551941BB2C4
+9E9A8DA9A4D4834E09A78F824F60A84C4A84B6C5748BA8D752D0CAB8CABDA89D
+8E21E4FC69C5994E3E100967DBFFA4D2E12BB0E73ED53EA1AD925855DA1A77BA
+1231422722DA75174ADD0F0BD549B6BD08114D32BB6E728DC5DBE05CC0FB960B
+F1D35253BA31654C6E6DD306285953AA681E9E1414D5F23CBF08E29A5B38F69D
+99C6E44DA0C42FB260F1E6D4E947215A0FF41F756177180D3754737C0BF59083
+C47C302D87268AAED752370EFDBC276D0AD59C5A75CA13B292437DA5A90B1713
+723728166637A3C4805B4A2BA8CA1F20B4FD331043FB69331E485BF48025BE08
+6369DBD8FAF526B08E633223D011E1E81BE662D98BD64917F09BA1F4277BA164
+4611705F5ADD316341366D3BF8CAB85A21C88F54792D05EAB91D985A557B4C99
+0BD3B4C020F20C860A6ED0E8CAD870045D69BC434F345EE42830FFCF7468CAF3
+93BD5666598D5CA7ADEC208006B7CF38AFA1A0BE24190E283841B9A5FD0696C2
+CB6FB04BE6108AB9E4CD3F772D78D7468EB761444A5B7FC8995D53880BF2616C
+522EEA33E0F27A5AA1EA25347FD12A1A95F11CF2F3625D56CF8A9FA23A4EC609
+035CD02CA0934BF6CE80DF59E1B60849B9B4A58C11E83D03BEA42A1A4AC10893
+4B92D0B99362180E29AFF2ACF9E0C99A156725071758399F318D720E37FB73DE
+9C5958CC9471C424B5F8E0C76FE28193D2C6514D0EACFEDAB7B76B713BC3AE3D
+57DA9D62396F7A7675CDBD164CE3320EC81A1ACE77EF63CC8FDD466564B8171F
+2157EC631437182AFC083A1B29C223FA944A54930A41824F76E35E5FEF17A836
+4440E9BB793DCDA897B938696458A3BD9C3DED24C2C638C3603939AF44DB144E
+5BCA51A7D729DFBE26E0884B22C0C4E3131AB82CDA170474168D89124A65B0BA
+91523CD1D67475C9D43CB7525451A27B62723867F123003A99B98F2C3C2A482F
+68FB4C42547AA6C4B9B1C8A4259A8A27305A2F0B147BBE39264F510142668128
+FE6610D8D748A20B9F75D48C3692FBFA1EBFE73A3279BD4C38DBDBA0CD429439
+F3C0FE231D0F381D369A1E356917184A4DE9CBB64F400C28B41DFD35F9F74FC1
+57F46400574ECE064CA9AAEA8D70A61F5BE95B5FDFECF87E04D4C45AC7D441A5
+88E6CF0C447DFC832179C012B46B19A7B2542EE40727DED27E08417639D6FDF7
+901CA1AF7385704E7EDF49D8A9AC990CE68A8898B02D618F8700D04426A5692F
+24640B4311C917D9D0B86E45D9D43B99DC81836AE454C14242D107BCE8E4B989
+D8CAA8C401A56CFA611923072B72EF56284AE467BB8E2B04AF81D1C968321611
+B4D1A07B8E2CD4ADA29A8DBE695BCB6F022C8C53E9F0210A0D08F9A531FBAF0A
+902E31DA6B2A3EC290F1A0EB4A5FA4FD504530AF768C15E3EB857849824EE965
+94E2F1974A60615DEDEBC4F4D8D70CA6A4385A45ECEBAC78C945ABFA42B90EA1
+17C59E615272A91488161C2B7B23A8B1F2C7119A49EB7226BEEB3A4C7CDB67DF
+11F945CF22FFED4DDCDDE1E9AD88C63A6A271883F9104CD7F596AA77CCACA8B9
+D5D772A3C0ABDE3F7BBFFD678744DB7540FBF0BDC9D00A0C7E9170A127D21C72
+4B81D78F949773598921A5D3F756CF5823ECE57613DDBEE58F3428BD29BFAC3F
+1EA57663472AEAAD48260EAC5912FC7273F102D1217BF43D6E52CFA93A991B74
+8C6489D7ABD79227C82F85E06D736602AFF3F497C64644DF79F460569F2C3BA2
+250D48D0C0EF5B4A3668BEDD804CD134A0E26FCA4BF071FEA9EB46D5AA52D66B
+4F954E3AB2BA1EA71EB9BE254AD0C5C39A408AF4D287AA24C533BE9BFC0853AC
+C31C43D8C419F5CD294ED38E56645A31FE4AB2C60D4486493ED8199461483F82
+EBDF44F1792BB87CE851105BF44213B35EA812CE967FBAF7304703315F2D126F
+12460B0EB045BC8E196C7816B105259BFDE8C8EC49A751B0DBD7367C0661EA7D
+1A79053C371DE08C233E1774998F8C86F78E4FF7E9239524A784509254D65002
+F9BE0D2A40488E0BE2DE6F336BB7337750F57F94B20764111594B2EAC17391ED
+3C20C8F3277E1E431D55893EA0CAB659ADBC502D85B75DE299044985575C09D6
+C2D275221C738B967F1C92E73FE4E43353845D74B103D6B57B442DDAB3A46B7A
+EF6E776D82B5B9873EF5B3AA77A18FA7069429441BB791123974281B720E6EB2
+6472549EB921883170FCFE289C00A159EAE56B9A8515482CBD5161B70B643718
+92D7BB3FC8E9E45F3635B242BD08FBD958C297205ED7FC812B7B70F65E979BA5
+73E7A7A348FB656843988DA4518F13814A14C336A4F2A610B5D9AD65CE1135F3
+3ACB2594B4204A0A852841F6D3EC52B4262AF8FD7B1E7A860105C85CB95D94D5
+C3BA8374B1DA93F493A25920058409C83B7529FFA6B3FFE79D7EA6F57E2E12F2
+A210EF27BF52F1A366C1B193821BD775FC92335B42854C7C11B253A653A74A7B
+D213A63B69BD0B1FFB4DFBAEBD66C1096C6F2C9B065B5F20E9B02478D1CB8595
+0F68DADA125FA3EB8B7602E94A31750DFCCDED8759E4D87110D7F7B05EC9604E
+364A9BE1D94E15B807C74E2ADC03047EE296179FD4F2C8BA93122598435D2D5F
+D3C824E327629F16631BEA2FEABEA5F49E5A9C4AE2F44D5390CE0628A6915660
+C177B8F431D31410DC7709D57275C7FC45F5EB14F71132FB3BC77C2A7B2EE446
+CEE143193419B97A5B25D1756FA017E17848159CB5FF55E5D240B4E01C83161D
+F3DC8D5D72000BDFE5F53F037CAF57994ACC60FF66417D6B5B6C9287323E201E
+A13DB21DCAE0AFBD2149E8620B22EC21144BFAED02E1B16980897218538DE59C
+E9B8009A4E0708802905AFDB35CC605097EB8CC6C48C73243364F184861B11D5
+070EBA71620C255AE2FBF270941222C302E8F0DA166423B88C3854C352B9E792
+ECD12B40F0B0A5A334695B6DC4360B0476E7993730524AB92DC9F8A74DBEA699
+F9F2C31D4DA3F4426595E729F9B7C88E7B46CC3172168F00EF3F60458D5475A0
+F1B42CDDD171E7E8C98C620CB5548F7CEB4E5BB758C197A09CCB3893D3117350
+F42328EAEB3F0034419A838D5ADCA8483BDF72F02E8821CFADC50E9A09A616E7
+4CE5E6CF698C3F919FD0110F5BFCA55E98753C67168AA91EFCDC2A4AB4CC6C18
+1DA72667621CD578C1E449F0E660B35F43244F09DE26C4ED62360AC69C8F8DAF
+DA76554E6E0F012CA451F0B946462FC564B1AEAB508EBD2B1A1E43D1E7136DB7
+8173F6C2D2837F0FBCA8864AB719C09898108A4273ADD74721F47AFB2850E12B
+CF897301AAA1432DEC0080B2D555BE3C4CE6E652C4806066CB2C19262F219291
+EBB6206B25A12120B1FB077E4638D675B3C50DE867E2C69D9B6BCA9394CA8B5F
+AA2D002D9FB8ECEFA144DBD51905024AB54D6EC3F82A0D625AFBBEEEF6C854F2
+7344A10BE1C8CA785D8C3B2DE606D00D19CFDBE7BF781AA177E651EB07705E1C
+2DD4A54DBB0ABBF1B57A1BA564FE5A9B12E39E346A387E05C4C3986D9CA23C2B
+B2E6A3B4CFD3AD177FC5366B55F11CE924691A1B4DF73830A44E67D750DACBEF
+1893527DABFB8970C3D8ADA24918158142D3EC5730F9202A7B9F61C4FFF4B09C
+C09DE278B71CA6A061396C3671D3F48E85D1E958E7AE94C0706B90B6906C7587
+CE5DC4A9EF4882C314CC987BCAD4A789A09E4D51F370DE4D4484652836363966
+C80CEDEA41FA816AD86C2D792B5B8D04489DE99F06B3C5CC0110C9F24BA5E95A
+E2D78D7FCAFB013BD160BADF4CF2D89F37EEAD80702E440CA21997CA213B96AA
+531A385C254518FD23F710EE0573E86499DFCAF6F038D74C9E617446DA8EF87F
+0861C3BB2FDF70EE95BAA0BD6728E9B4D9381C2B33E17D17BA54AA45DBDB8413
+CE1589C3E63AD7217F9C6B44FDBCAD121D3219A978EA2DBA90A27CF814B313DC
+58C578DF4381F5235499009FEB3CA7D0B4EB8F0839602341D676CD827449D24A
+D9E8223C40B5D34B0846BD9615090EAE3CB77D0B8725A3BD5B0A46558BDA5868
+3A00194345114644BD144EA11F49478FF77E259534791C200B0F98B2DDFF2106
+BB10EDDEBDEA6910C4B897B2BC1791DA
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+%%EndFont 
+%%BeginFont: CMTT9
+%!PS-AdobeFont-1.1: CMTT9 1.0
+%%CreationDate: 1991 Aug 20 16:46:24
+% Copyright (C) 1997 American Mathematical Society. All Rights Reserved.
+11 dict begin
+/FontInfo 7 dict dup begin
+/version (1.0) readonly def
+/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def
+/FullName (CMTT9) readonly def
+/FamilyName (Computer Modern) readonly def
+/Weight (Medium) readonly def
+/ItalicAngle 0 def
+/isFixedPitch true def
+end readonly def
+/FontName /CMTT9 def
+/PaintType 0 def
+/FontType 1 def
+/FontMatrix [0.001 0 0 0.001 0 0] readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 0 /.notdef put
+readonly def
+/FontBBox{-6 -233 542 698}readonly def
+/UniqueID 5000831 def
+currentdict end
+currentfile eexec
+D9D66F633B846A97B686A97E45A3D0AA052A014267B7904EB3C0D3BD0B83D891
+016CA6CA4B712ADEB258FAAB9A130EE605E61F77FC1B738ABC7C51CD46EF8171
+9098D5FEE67660E69A7AB91B58F29A4D79E57022F783EB0FBBB6D4F4EC35014F
+D2DECBA99459A4C59DF0C6EBA150284454E707DC2100C15B76B4C19B84363758
+469A6C558785B226332152109871A9883487DD7710949204DDCF837E6A8708B8
+2BDBF16FBC7512FAA308A093FE5F00F963068B8232429ED8B7CF6A3D879A2D1E
+2931CE5F5D18C658602059F07BE66E6EFC9239D7AB2FB8A4CBD41675B8ECF279
+650C29E53B14AC0E392A664848C1844B1CECBB2D5CFB72D0916B675C9A9A1E35
+F12696A6F628473C604A95376468E06E295AD6F76CEB939D94113532050B9D5A
+D2F41A9EFB9424D986612313B89EFE9C8A71313340B248F6853B1EDBF02B7F9E
+F447220FE131D7D54CFB8AA1281DBAEA73E665BACB1F164552CC0CEDB63BD4B1
+4A9AE8AC6FA02242DBE8DA46B64B6BFC11762F0784F216FC8B9120D688D1705A
+438B14F5E5DEAF2A98408B3B64620DE3732A4DAE6D08D5D97E34C75DAE19EABD
+BA0796165C1151BCBFB1DF8D29A63A8300DBDB9E3323CB82D0337598B83F4F2B
+A97CF5196D4D1CEC1EDB8966E548C0D9C194C932319610FB43EA1B86322FE641
+AB48770FF13BD475A7267E142388563D1A400419C585B22A9886074687BEDF74
+D905BE8EE440BA2ABF28EAB673399B7F129B9729DD5564C681954621903B84BB
+CAF89AC5ADB2932472DF29ADA2BDBDB4D05F65F28F5F4C529613D61858E0074A
+082A852710A62A147C966F2B85B51B0BE85F11D2057C66FDD61F6C5755367980
+9F4DE680601D4DA41B46F8D2148450000413C27AA39B586B74B977B25F0FD3C0
+4BA1EBFAFDBEC531EA13DFBD6700E53818CE04D23886B8AE75DCC36BCD3189B1
+0D55FAE27D0D126E82AEF31D7B5DF27E58C30BB0867D6D7AC1DA9EFB8A2DF095
+B5B934A68EE122DA0A83B36C952431586B957990206194E89339048AA6EE4C53
+703763505ED57C494DD907D0EEA04F6B1D4C8F3BA778F4E7AA832AAB4D75F024
+61E91C6D25FD6823CB24FC863D3836C77A7D349AFA8525388E252386788B28B5
+E463F5448C9A287140C4F5FBE612C8F2C2749196D12097233794F702BE49897A
+6DB52147CE35CFED4CC9F38BF3C4AA917D990F007357194F51FF6B77E97C5208
+AE6CB3AC6AF0B5DFD252847C5F1793F5896655EC8D617DFA7FFD9CD861631156
+D178F8C3B2045AE1B4D702708822F2238A29934A870273858FDDD2B9CC74EB9A
+4F610646943F34ACF7707568F66F7CD9F3293060431C2A7AD92904FDD44E8079
+80D54755DFA1FFA2A42C954AC6DE1CBB7BD95B11999FA46F57C467CC5E4ABC3D
+965925F0572DC4368E8D5F5777A11255BFFF91E833F42339775D1BAB2137B328
+59666E88912D609777309A032B3725AC11BF5CF5EC760438BE5303A48DF475FE
+BB57771CB82751F8AE79B3D72CB9B65B192D21E1E3388AC0C9500E132F4017D2
+B6A8BFF48342C94359DCA32D9CE12D6C30011EDA9E28A57A854482FDEA0B6D15
+4574BAD94C43538D87E8DD1FA03AF5FD965C473EF1371A3F125592A0094BE7EE
+CAA3E94F48E86E66D203F3AED59CE58AA1EFE006A136D55545B506172CA14C70
+6452DD81DBC1B3721922DDCF2DF6914E354FBBE00D3CBFE8A0AB309FCC3B8B6A
+6F9F858984D90E731C80F9B050F48E670CA19D05F5D77441E15F304666154B53
+CBAE581CE6091CAC6485522E795B76C9FC509705F3EB4EF36B7CDF757A509617
+D116D7B97C1A3B7334AEF807C23F9F1B150C895E12F73265E5578C24CCBFD2F6
+3BEF1311E0E015D354F3D18BD4BA1757D95C9C583CD60057385A8BE4D14A730C
+BA4DC18D4494D7E765A4CE24E17125FCBECA981F4C2CB4A360B6441A6DB73363
+44F62B470EBD387F1918A814A7B268623F7ADE9229AD314BFA0EC784071190A4
+99FB32985881E32FAD162E8EFFEB6B33E646F97FA94B2AA53F869AA563E519A4
+2EE643CB14B64AD6FC75125203E17826E81F352F5AAA616505D10F7F123EF3E3
+8BC7C41FDE75F110629B87ECC42A3CF2A13308A737D994DBDF999E7496F9B78D
+01BC7889B7BCC46A95887C4C5C34A2BF484068B2B5A40FB408FA8A2F6BE6C3E4
+672116535B37825FDDE04CB8B873D9C022955F4AD86D33E836264BD2B918E053
+077B62508B1E19989B0F34364074CA7185651F8B4A09EFB08E1EAE76D1A7704A
+CD2F19AF79339F10290C2CDD0D22E434D10B94911E89AE5A6D1EC446A6E10158
+B94ADF5D2256345D3E12FC412EB146A3FA8D1057C2FDF8936ACF6CAB616DBCD8
+7F68597110890808D8A7B8B0DB4EF58D94CE66621E6AE94F767FBB379A8C1FC7
+BB3F5CEDA10DA42A7426629946D82358B47E112F8DC90390C0022058250322FE
+01381959BCD7C9F82D72E117DD401194B71956E6FB62D6EF6A6E3E99734014E9
+718714505F1C323A5AEECC3D8A4BD0DC8087B05B2359359BDE1A404FB222BC2B
+7A2611E334F40434920D29EDE60A8CCB855B119095EE13D4F466AC051FC9AAFA
+0EEFB05894E81302698CB995B05DB1457FC4429C7B007F1F68C316F825BBEC7E
+D26D8F263145FF277F33B0F0A233E979DC55E3716EB74CE4A8AF17C95F898AD7
+FA00B3078DF01971B86BA81B12C34DB36DD717715636FBF4B0C3A98627637832
+F2656939434A36884CB5B87BF60BB1D33BBCFF921A453B951E554591968CF8B6
+7CF75C2074E99E3E74A617B349627F87149A39AEA2667C6BCA08FD8167FE20DC
+558D5421F0FF41DD537FDC57F927370DC9ACFE931F25C88194565242013F50A4
+936A04B07476B1C95641CDF0803AA856C03E75EF26AEAB5297DCE8E1F208FC5D
+B67F71B1385557B46E871E5B80C325F7B6C794469E8406BFDF7D062E8B997BC6
+B92CAD7DDD04237DFD5486E365DA9482291FBA96476C2788AD7F22C041E541D9
+970530FD20AA6DFDD5DE2906D086377099DBA4D248B16BB210F415B9BFC19573
+8B4C4F0595CD6FBC4E56A0048BCDC7E89EFEECB9336847FAB9CDBD4C63DFE80E
+4EFD0D137420220645580D04AC8B6AF55BE073E557BFD5539C727C5FFB608C24
+2FDBB2668141B864074B52A94ABCDFFA1BE05F0BA690BA42FD08302B2293D3B6
+4323B03DF9D140B5C81FC4330BD45738562BB2E1E0D5C9F2588EE6BD7EF1CBCB
+6E2847E0EFA21E81B2A25A683B0547DE37AA98BB7D77252496738BD7DF46C732
+805BD61643B31BCEB0338BAC90AC0E9F33EC31DD606BB6DDE8A0262E8BD9975C
+3F69DE26DD0180BDEB0AEFBD02A7065432B7EAA4B8F44570A42D47932F2E4E69
+47FFB773E8DB38845002A35243055A7ACDDD444950786B2F8D3D846B2F21E029
+88FECCF0D29C2343C8D2BBF09228144FE75885C45C1CC2DBC39C17690541F268
+749D0FD2CC5F6DBEF25F5C650DBDADB4D94FAA7F6DEDD4CCFC65FF115915C565
+8E2D6900F67A33E21AB6B1205355C17307033433B608B0C59B02A2D159D7D640
+E84FE1888929C108BF5A8EAF5B097E9B68A0D7249E6AF02E6EEE19504DBB8AA3
+DDAD7267F4C658875E484EA03E24A9E22AF8A202DF0A2B7F1DF90E3A4BB3E9CB
+D92F5B829FE88A8F1FA809A7BEA85D4915E0B148F0B7528EB103CF60C8D5BF53
+8166666637E869CC89C2263CC907DDFA754BBB0E88E85CFD5DC22C94AE4E07F1
+75FE51AAB02173C813149A6E3EC7A945D0EE44AD13500CC9E95F994EE84EA4C3
+66E32C90288C7FF17DB07A4390F62060539B4FAEC6FA2EB1EEF37CA3147C70E6
+23334C31F11621B2FCB989F49CA4EF99FB3BEE46269C4AC0B0DF38BF2BBE406C
+B8FB866A8EF77549D0AF03E506014F6C5638234110044A8CDD9AD95F32D4F188
+6CEB563B2579316097A2322CD5C1B53C9353A9883AB6B5605714BD32CFD06C58
+AF805671082037A0F1A9B60FAF8B019563ED7F4EEB43D4C9F0DD2F0579DAE7C7
+E0AEEA4A6E82F016D2760C8C52969333A0897457364815014A8DCC5130AE239D
+D222DBF08605B5FF6F3AA2E5ABAEE8D83C06F2F554ABA6CF1E8B1C32AB3BFA9D
+C4BA7E94DBB28D580E9AEB12A7C44B2D92677A857C726EE9A104BAEC8BF31CD1
+9E16E35284837AA729B3F33D2F2796C641C3EEA45B9A7B55907650F73C1B0569
+903596F1E38909D4693D73A51A7AF674FF7E054C4EC4B2FAE8714ACE3B1D45C5
+7F38CA444C753D8EEA1599125E36FEC9C98A1EF3C7F79FCC249228D176BB5A14
+169A79ED3CFE76B37C363736E085E963F7094E83B19C8D311E6CCE8B42854E13
+11171AADC38B1CEBD6F60CC24C14EDFAC5E85F923B6FE66EEBA89D328504F512
+DA21686DE738CD3BDABFDC749D6F1293382C559566B5F17883144D7792D9E537
+F223067E95862EF03FB9422C0EB90AD1A92FD7EB633B5BDB580CF6BEB9A8D08A
+1272160934EE2B9E51E9A1A6D4FD9AE946D21E9FE7991C966F91B74994A8746B
+AFE34642CCB1B32187B8BEAF6E3ACFE324A367E7D3DA9678FBB2F0D608B7D498
+32B003D4B64A544BD7E549804266ED89D31021A5636B7F479924446E5014C052
+DDC648CEC64CB0E35348A445CB6E0A6D28E58B93972B01F18D213B9B73ADEAF1
+18CD31B3E2467D4CA65DBDA1A3BA92A2089990DE5224E35464606FAAEDCAC303
+E7E5FCD78CA15E8B0EA13A445C24811A9FD37AA854B81E6A536A9F4FFAE0C1C6
+7F7123A6BA0AD4A6DB880EDBC0C0827433826FDD3DD6967F197484F605A97B5A
+AFD236CA0996020A580DE7DFB71A8B1A046BB9287E82FEED2B40A69F60BD7C01
+12ACC976ED18CC315B1ADE4271271C96679A18DE3244F8CEF43FD8D0BB06028E
+5F007FEC31F2188CB98E29D243FBB182C5DB35F7609762C74E8BB66B7CCFD846
+6636989D2DC29ADD6C559E54EE9B1F15B944070E5E6500CFA1D1C3AFDB329A0C
+C95F565C439B1BE06436B9105EDBBF82AFE991FD456288ACCA35CE1ED930F2F4
+26976A2B8EAC3BB69222D25D13A077F65A1406DE955A842C976826B29398E078
+A9A896DC9FD9A1FDDBDB51F5F00A77D01B827A9CD1CCB81D358218C8BBB14259
+CF7A2D1520342BA34CC967A7DA2AAC7C64D6944A2462981D12AA0C3E6F74CC62
+443C03B799735ED747088BD2E5E51D31A3691C709000B7C131546418C4159AB8
+BAB4C13B24391FE6A573EA07C344FE64E03D12D35F991309FB56DDC12B3405A1
+187A8729ED8E52D4DD7796C90F024A20722698B6C3BB05FAF2C9A3337F206E2B
+E4FFCA57B8CCA2CF867AE0F9DF70226CAAB27C984AE342FD66D644C0423F6446
+9DA63F726A0398B465468A24A25FF742604A6DA47FEC0C665B5C1B5DA830295A
+442CFC8AD5784CD77209272203C21A33BE0505E5C0A73109F44F4011458196FE
+645B5ECDEE8101ECD08413036AA4CCA495FDE60FF3ECFE458ACD0D2E676A9E14
+F1FE485370EABEEDB0E963874291064107E9356FF9ADE67D0EAE96890B9990E3
+ECD36CB7A002F4AE56C772421396E267A83847596105C7A44CFD63F685098A98
+EBB582D5A709FE04B00A7B391865F69143217C0BA450697CA2ACECB98D325F21
+C54BF4CE5C46A552BDC899ACAFD41393F4FF02B1FA52463566957EDD7087E7C3
+8A5F2634200B2787A20170F7CBC3D9DBA2CC7FB9DE07F5A185FAAF21C82E8286
+BF376D348DC0A23FF953690CA25795781817B3129CE3EC01E6696BC93EB37D38
+0CF92C9B1762F849EFE96578318F46C0AE96E9BB2EC9AEC24095A1FDF34ADF4B
+C04F13EED27A0AF8F4CAEA7CE61AF2FD165CAA2110015D4EA46CE4F2EA795C77
+BA7F3FE7B1CA253BEFEF75EC71E529D4B11967D2948D0AED058AB8E3A5C59BED
+627E102A8F4B59396833CA7B1CA154DD8EE4D657B561F668BE5783EEAD7C31AE
+73A42A84F483E5B999DE1B7A627C3FC57A48AB6A619BC1895EA91BC48F1A649E
+A01FA8E0A763181D05CF487EA044635F03DCBBF6ACBD17E5C836B276825E6AFE
+4F84FD8A37255BB4ED193662D900A06CD9B00834F251F38C5920A5286B08310F
+59F98D4E967760134DBA30663B661ECCD2CC94B73CEFAD0BFD88E270D0C00109
+AF4F73B0A629107BC951DB46695B32FD4F2A88657F024682E1B48933784A805B
+A1E2606DDB7C037CDE81C4E9CC78EC6174F94A8A709352A77245FFEF77D25127
+028ECCBEDAD43890BB93BC0E50A1974CF341A6C2B5B8DA3A2904DB66060265BD
+B76897F8074353B9B4FFAA62A063352B05C89948473B7937B009D38356F6CFFB
+2F248CD61E92C32912AD133033497C7B31B282939B84DC896546FB78A5B9E265
+127E0E558E0E9BAFE59DE05BFB7A8228F680443B4D6BB12183CE70FD61774D24
+C11D787FD82B0CBDBC152F1BC51096A0C039B9AFFAE1129C0FFF8FC6BCE2172E
+8F3BA32C1D1EEB1771824DC03242474CB5F1354CD2FF980C009BF41204CB5AD8
+F3C2D7A88E219CC92BAE8DD464A445C8A7EC22B309E36B14E55A487EF9A39C30
+543ED96C21E86B16A6B82B8E0D3A6C95A1E6DEA2B81E756311ED895DE5F66352
+F771E6B3DBFEAFEEB11CBFE70D6ABDBE7A3882ED3A3E4D71A96010EE4975CED1
+F5D59C749B71AD76F75B7D1C652B4EF2FE348FC0CB3012AC63FC0A9EFA6A4BB8
+354A6CDE0C3289F6AEAB6F704DB7DE9FA74C2C640AD4435E23F75C719D3901C5
+D882265847C6BDC085B96C9CE7115B601DE61926F2C57EAC3D66192214E85AB7
+5F582F475D40E1AEDE50080DF68A6C08F856DBA303FCDADFE2C1C1CE1FC47A6F
+602EB0CB950D92AB2507B9F1E0C34A88AC5444CF4D2A67ECCEA80D11D6FDF087
+B7EC6E38981AA47EFE6D4AEA5EE85F0972E1A73E33670075C391D0D53324C3AF
+9464D44A29379B2DF734527A0BAC7E9A99CDCDE1BF17008F550AA77C4C6E62C1
+D11B88AEBDB2515ACE094227103C12F96BAF7CFE24722FC9F31E22A856934A5D
+704C868CDB64192690549AEB22599034FED2AA24A5EFD211547C033F46DE72A4
+48FBF3FF10DDF6E7479492C6F2F6AE8BA099706255F9C8CAF643FAD38CA50B58
+E1939EBC0C5646F07EE886C5C944B455F68C2E180F1D710096F1DEE3F3744248
+9EDAE22B8CA17FDFB290E651A2701568E89B8CDB31EA8AABAEC0902C4CBE6495
+E08D9DF60B708B03A06D616CAF22D3D57447096614AA86B4C658ADE36298D882
+F049733E2FBC90D231D7577D26D7191ABD22E1638726182BD65A592C53C87966
+44BB12CCCE5C725142A79E5238D9C66BCB576C17F2455845B0707020B6F7605C
+BDEAC1065CDFEB4F38A3091BFFC7A9FFE8F045D7FA929EC4C50235B8C54DC2CE
+BCD3C02FAAB0590804FB27DB9EC1BDB36B650C73F47FC931391B9022EFAFFB0C
+24011BC101D4D1C24F65C93FBBBCC40EECFF18958917AD7D9206E9101EE5BC42
+57935BFADA884F7BD68356C640E08EC8D919B600EA8ADB39B52437F3432308DB
+3660076F7718520DC43E4F468D14FC80DE47604BBD60DBD2E61A08EF0BAA5D04
+DC3153AEE166AE8AD0CDBF07ADFA16CE542F014E72556928E0A0C54407F1F9F9
+903B0A4C9DF49CC2D3C0B63E067C208412AA95E91714A40AF7A164F15A61AFBD
+56D389A455B8FDCBB845C1D2256BF78B9A5EC6C72A86186166F2F11A1D60BEFF
+C3D62A39CF841E1C386FFD20B2A07B1C677FF21D757E6A84039FBA4D8AD1F403
+C5AAFEF35E73F22F886D6E6477D1DDB779BF4E1C9748E7EC54E933A38E973499
+48B01E95A95C47024F541BFE55C474F4928E7907B04C0F02937D7E43FF899673
+B6139A251BA976D8C3DDFCE8F765692AD10EA49F0B0ADF74D32289138BAA0AAD
+26CFF512EA9AA4FC5BF33A30B45C0AD2C965DE7B2EAA463BB6959D0BB22CC72C
+F9151C0347016164F7462C4AA8306DF6CFD595A8981B8A8F4FA7C7D47ABBA083
+CB6C9389BFCA410727C7E5AD03501D1EB4E597F1E7D322FD4409CFE1684A88F1
+DE9A665889D8FF7ACBE38DB9A0E50DDF0DA896B8AB4E0D6E9B34E27AFF82FF90
+959CF474A820F5AAC0A6FEBB8458A257D7FF5F681BEF169CD19BDC5784178A8A
+12584EFE77035842D21B3C2E8949C56A5C1A9819C686D55288CC204E8EFBD615
+324E2A11755B27BF32177AAA70F4D01AA251DF804E40C6E0B1E9ECE846D03B85
+04466365BA5296784601323E37BA936745E4124DC4EA11DE9BCC91770ABEE465
+74057B938AF2E274C95E89F02C05FC31B1E2E30A71FCD4F80C2A0C0A7E534DD8
+DA59C06E68B43A2ABAF24018FCB6C1B31F50D8E91F940B75723F4CFBB366AC50
+DCA82E5653ACC4E5A7EDD686F890918274A106F360EB87BCC27C2D835416E2B4
+CCE5E160F086EF17D94143024E11B909658DFD541DD5AB7D6564695DC73E612B
+81A673F3FEF09E230861D9D69A6F57F1608FF3018F36DA3550EB26D3C682F6D2
+A79DD5D61AE3CC93B444ECDAD5B7EA65123FA440F33B571ABE86FB1B7862A78C
+A4F2468D18EE362665B727070918802C8EA3768DCBE084ACEE8EC46C6219C600
+587B951E654593A02A55BE2BA54A74984B75570A816E3BE8AF9FBEA0636966FF
+21A43F97BD9D992E505EF289B36B0B735B99C9346BB2D9B0E0A8DB534232E909
+5ACFA7947CB51377ACADBE38FD67128BD05664F06A1D5E695C9A8D55E63F8655
+23FF5621368040388F47269519F98EA63F09766B356085747B30DBE70923983A
+87AE3E85BEC8E286352E33D2D0C628E42040E3873DE3ACDA3623E8E6022494BB
+746DCE68EAE2CA088DF76809E56AD22762D565D2E6D73E94210DD1A6B764314D
+EDF8316156746283C7C65A1F18ACC4ECDD3F8B288D4D668F103C81CAF8E5ACCC
+01AE44593582DC4FE623006D2D289CC2ACD59D794A8A4184C031D2CD79743B52
+D25082FC542BCAF7A14AFBE6F8B08171C074B06AF9CE9D854B300CBB44317B5B
+2F890D642E16ABE144EE8FC96A00579C3D205E3E67250D9D97E9284396443030
+CAF310778C67EFAEF3D47436E697865C18D6D1B0B5A0D0F46D6DBF676A7DF0E0
+C6FD35C376A855DF52B51E82021C681F47BDD6A34973D4BDDB718FC43F16E1EA
+0897B49D97B6F90075BF28EA0844A4E7FA10170CEBCCA20237DFBE1E071530BE
+F6FD83FF046C465575CB793CD5F632A2836E66799CFB786700D1260C65F7447F
+42B7CD141245B723970942C0FB3D9D351BC8E06438A0811140C6CC0A3F093FD0
+85819BD0C648D8EEB4D3AEF31936A85C7CC5C975D954C02A7703EFF0A3F63A0B
+118332CD91E706594A9A44E50504AEF5E71F7733728A3CFE399B0E3B14315330
+F929DC0B23CFFE39EC90E45D4F75A5ADC691814140AFF8CA420C5A5B6EF58E55
+322943C976319B16F835D8018B77324BCFC00F5317F14C3C695F4E653824306F
+CC159B9993BE887428ED0DB7F6471226293D13227538AAD9F761361CE9218A2E
+0961425B97CE18217C0DA298A96ADA6460DEC77961C853700C9FAB6A2932578F
+69234DC3930E401CB7CCC9AA0256835EC28856B92C728D0CD8FD8F357EB69FD2
+28CEF8415C7E33375C183B6233B363723F63000243EDDBEAFD00E64BBDBBE515
+422F368B229170DA37D60D3E3DC2AAF8790C922F95B6DD2704FDBC7781099ABC
+C46C590EA1D80F718C030A68F94B544916B3B41078077E5DDBDAB5D9ABAF1E8A
+602AE5ADECBAE6438B58DBEB3F1C7A5820F6162DB79E650BFF1AAA0BA5EDB8FD
+DD620A6B43FA34B23AA86ED30416D5AE8849EF2FD85D2FD65D40FA41B401A786
+09CE2907D1B4E6859E363BDA759A6614DE124BD0416A23F3939EB0958E7F96CC
+316AE79DF7BE418277815F39DDE41B62BDBD3BD411CADE04073354790A17DF44
+E83A9D8D25D6739E11481A89E0551C383DFE28AC7370B8382DCC0DCCC96B11A6
+A4B418CA0ED782C21E8A329C8C29BF746F259BD551B7C22236DA6FD78367B51D
+2E21471B89C57E910D2697AF88EEE54BC29132A9F3D6FBE34ABD72B65F8E452C
+AD3BDE991FB60607214EB8884E04AFEB781272BE8E8443106004F7FC46C45176
+86FC103F6C0F80DD7145F01F3CAF6E64AC12F089CAEA744E640CF8816614DDD5
+647D94B97C6996E3A0206FF03011769973A157CA10FA3231747F497D822B6295
+F5D76144AB7CFCA4E206D0C2FEE03BB8263C044886790AB91C57A386317DD25E
+7B992E1A4C56BB0BE1759C5261D91FDDE70EFD84CE3864988DB641F6359460EE
+E32175EAEB08B0EAE04E4547FB5097EB0ED36B938953BD5F5DB215F7539E800E
+25FA5B4DC4A8A618C4AA896ED46523F6D6876EBC783C9DC00A817BC857B762E4
+B5BDCA5764CA6DEA14E31C22269A3241E8033591AF7DC82BAC722B3580D4B6A6
+5250A7C5DFBB2D677A0C15278C93E480210504FD17FBC4A4F49243F7C94CDCBB
+DE8EEE03B699CDB33FB45938BFBC6FE6D04D8CAA88FDF0274AF9AE69DF4BDF5A
+5D458CA363E064D6ECBDC346CB9B22D88B85155FD636B43CB5844003DC168E7A
+AD1CF958D74C256091BB3492FD0563FA123BD9EA61E5483DEDA7AB76B0198027
+389D271264C57148F86D07B8284FE00CE9A61C7CAEA15B7255
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+%%EndFont 
+%%BeginFont: CMBX12
+%!PS-AdobeFont-1.1: CMBX12 1.0
+%%CreationDate: 1991 Aug 20 16:34:54
+% Copyright (C) 1997 American Mathematical Society. All Rights Reserved.
+11 dict begin
+/FontInfo 7 dict dup begin
+/version (1.0) readonly def
+/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def
+/FullName (CMBX12) readonly def
+/FamilyName (Computer Modern) readonly def
+/Weight (Bold) readonly def
+/ItalicAngle 0 def
+/isFixedPitch false def
+end readonly def
+/FontName /CMBX12 def
+/PaintType 0 def
+/FontType 1 def
+/FontMatrix [0.001 0 0 0.001 0 0] readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 0 /.notdef put
+readonly def
+/FontBBox{-53 -251 1139 750}readonly def
+/UniqueID 5000769 def
+currentdict end
+currentfile eexec
+D9D66F633B846A97B686A97E45A3D0AA052A014267B7904EB3C0D3BD0B83D891
+016CA6CA4B712ADEB258FAAB9A130EE605E61F77FC1B738ABC7C51CD46EF8171
+9098D5FEE67660E69A7AB91B58F29A4D79E57022F783EB0FBBB6D4F4EC35014F
+D2DECBA99459A4C59DF0C6EBA150284454E707DC2100C15B76B4C19B84363758
+469A6C558785B226332152109871A9883487DD7710949204DDCF837E6A8708B8
+2BDBF16FBC7512FAA308A093FE5F0364CD5660F74BEE96790DE35AFA90CCF712
+B1805DA88AE375A04D99598EADFC625BDC1F9C315B6CF28C9BD427F32C745C99
+AEBE70DAAED49EA45AF94F081934AA47894A370D698ABABDA4215500B190AF26
+7FCFB7DDA2BC68605A4EF61ECCA3D61C684B47FFB5887A3BEDE0B4D30E8EBABF
+20980C23312618EB0EAF289B2924FF4A334B85D98FD68545FDADB47F991E7390
+B10EE86A46A5AF8866C010225024D5E5862D49DEB5D8ECCB95D94283C50A363D
+68A49071445610F03CE3600945118A6BC0B3AA4593104E727261C68C4A47F809
+D77E4CF27B3681F6B6F3AC498E45361BF9E01FAF5527F5E3CC790D3084674B3E
+26296F3E03321B5C555D2458578A89E72D3166A3C5D740B3ABB127CF420C316D
+F957873DA04CF0DB25A73574A4DE2E4F2D5D4E8E0B430654CF7F341A1BDB3E26
+77C194764EAD58C585F49EF10843FE020F9FDFD9008D660DE50B9BD7A2A87299
+BC319E66D781101BB956E30643A19B93C8967E1AE4719F300BFE5866F0D6DA5E
+C55E171A24D3B707EFA325D47F473764E99BC8B1108D815CF2ACADFA6C4663E8
+30855D673CE98AB78F5F829F7FA226AB57F07B3E7D4E7CE30ED3B7EB0D3035C5
+148DA8D9FA34483414FDA8E3DC9E6C479E3EEE9A11A0547FC9085FA4631AD19C
+E936E0598E3197207FA7BB6E55CFD5EF72AEC12D9A9675241C7A71316B2E148D
+E2A1732B3627109EA446CB320EBBE2E78281CDF0890E2E72B6711335857F1E23
+337C75E729701E93D5BEC0630CDC7F4E957233EC09F917E5CA703C7E93841598
+0E73843FC6619DE017C8473A6D1B2BE5142DEBA285B98FA1CC5E64D2ADB981E6
+472971848451A245DDF6AA3B8225E9AC8E4630B0FF32D679EC27ACAD85C6394E
+A6F71023B660EE883D8B676837E9EBA4E42BA8F365433A900F1DC3A9F0E88A26
+3318B32500F76B1038FA6122C2AF6261B025BDD519D349966A067FB190E26763
+A5C6B1AEA2A47EAB8EB272BAE2EE33A622E85A7BDB149A6C7C3BDDFB840280EB
+3099FD3BC4081E2426D68C12D6D360F1EF8FEC18E227A4D43CC27E05ABCBA6DE
+A980A2228625FD33C772C6DB7F803DC69A967891E8D28BA667D8B04CA8A788D7
+C7C5D84B37DD98CCCD946655A12B8B5F9C3B590A001F1EFAE13F739F45C8C6B4
+257C6AA4D133412B2F9E25226E2E9CA4A3C4D31884E143A6207CCC7644C7C30E
+C870AE94C8DAA632A8B3FB90E4A67ABFDE4904E8417CD16EE5D8BDC5483E80AD
+4DE4AB6F0FE123427DB32A8BE5E0BDAFC6281D56CD83997354829EFA338991AB
+0F4ED89C6941BA491B68D608301AE9E608C34A9A035DC3E86CDB4A64EE6F4629
+315A91184FCBDFD727AF7F9A9EDB604A1A13DAFC7C46A730E8CFFFC3FFFB1E89
+9A06F637911BE1BA30E4FBF5A0C5F504004672E5609BBDA6D6308606EB8752FE
+AAD27C809B4F0DC9E5B834433115EACC92A17E214C5341A5C7D42375816F5083
+9E29261577500737B690F0D73EADFDCED50E6482414481F24216C2E7DB0677A3
+991EC0F265B919B8651C16CBB83B6016DCF8071C6E3A8D627BC4416109CCE5F8
+EA954C91C2918D804CA758C5F70551CDB5886FCC4785DEE80412A6CCDF7CE64A
+3328A3D3F38393DB98C4D02F36E0E162C161160BF721AB1947FA3B8C7AE170E9
+61AE9F8B46766E2FCE33DCE39622C4525B4F48B58C2BFEA8E96C5637785713E6
+5D550881BA5DDFDBBE0EA786C8DE9375B694ABCFDEEE060FD93620FA2FA7C80C
+CAAC497C0433736D80221CA7C96B72E2494F1B3CAEB1FD27F83682F04DAA0A3E
+DF102513E3303337E028040AB7B4117037B72AAD9A1E491B705F67361A557B57
+FE15839A3B1664CCFCC8589E2F144E7FE28E3DB055A7AF6B3C329010C2AE8FE5
+D6C32C3DB0A2FED004AF13C6C7884D921DEF0C55C5E8EFD765299C95F7869119
+DEBD617AC908DA15C2665B025BC4D5FE081B2F842C3965F2207A05E21BDAFBB2
+8B8B7018EA48AD4823695C944AA76189F8D3AF3459E1EEBFA9442AA9B845FA25
+3BDB2D6842EC70AE87EFF1A0A241D19BC3349A9F04C5A25C966D2350DDCF5C0C
+1F707723956D01B3EF7B09C7A37081AEDD0DF85D1E4392A73EEC493C85B8F1FC
+C59B1B2A1B91CB642D968B09D4178D36300E85B5E2CED0C18392DC2D498ACF2B
+45A1ADA07CFA3C0F3EDFA7B39B1F8442144C4EEA714A67CAC59A76B78C25F6BA
+49712594A8C82D3199083C9237A69B55678013A886FA4A6E5296071361E4B780
+467CA1EB1838818552E1E03256AD14E0AE84CF2034DC139ABB2D29BE20EFFB21
+4338D4CE010F1BB45767F72088554BD33BEE2AF94ACB6CE894AAAD575F2BD390
+9F6D3DDF9BA8A4EA17244774F2648C9F60464136B6382485626854EBAFC4A2F2
+996399BF2F97C7381BC50057040537F19967890E69691B6BAFC04608DF8DAE15
+EA853EC865E3A88E16276DBB11983BBFF5FBC013AAE53FDFFC0F884A82AE0701
+FBC6B117EF3A45B6959E93D0F811A85243DC3FB13219CD14106B12608CD7336B
+CD26EE6F3A13AD6EAFF464ABBFE54515FF2C44D27EEAD7FDAE9CC5BBBC71F7F2
+6B0F21E1D28B7562BE8A81E0B942467AB3AD918209A02C85048149633794F3EC
+9A4170F3994042671B63BBA3D7E1562EE494BCF10A46B5305D9AF0EDACDD6D9F
+B31FB080C264278AC82C9683EA626A191AACCEBB88E2CE31FBD5D0A7A32C90C9
+03C17D842450976AF1FD86B29CAE0ED6104E017723B18B849344A92E348C8AFB
+53DDBB08E31AB5F82283DD8EE248E691C1FE0CD9E2E57FC66D42856393B83207
+AF58C7265445940B8CF8C3A9F6356FA06255CFF230298068D0C0B51173C10B95
+90134D7CD4F54BBDB4F9FA66FE4855DAA0CB58962DC9EEF28931766F866A1F15
+0A80FE86DD8B38343A03BD67489B7A1D08A28B5E776405DC35A11D4EC08822F5
+DD00FA83DFC9EFC62217E5DCBB775AD0EDC26FFE1EE275E496B92A6E0FAEB92C
+6ECFE9E4F778ED08D0F2BE1571D988424DE1B50A8BB534748FF1ECB464C9A085
+206EEE7A0DE7CC4D5335A40AC51106CD3FC6D75A5E400CA9A0BB610F677D1816
+1BC717F63E3FB497800684E212F8DC5047B00E0F8EDAFBD5D3F1ECEB1F951B23
+C18E0CC93DE2B369B21950C4DF4981DC69725872081E9C1B4556779428603DFE
+1339BB8F5569E649CCAFD9F354344782498B8755D881B07E9C0FE50ACF956141
+6E4A36301DA057C7078D52FFB8D213D3E9086F91BE387CFB33C7744950F62C97
+1589728691863E297CF0894E6C69B3C2981664F69F095933762BFBAA6D5DDD1C
+DD1D090F0C4381B28F07E61403AB616858A86E9BB765D09B30B28277EFFF409C
+FC8009CB393B3AE2D2890A808CFEAA804FFE8C42C0E05C67959E5A23D4B2D3D6
+7CF35FA9650B37A25EC2853E9259AE291DFCFEE4822B9DC9F68EC86A1312283A
+9A789FD180C3ED673D706352785AAF7E8DF79EB323C769DD86E78FEF1D074FC7
+F501DC0D268040A74C54752A5FB0648BBD0A7D3A594C2DB890145C6B74ED5FC2
+D41466AF4F10D74E161BC5EA1C274D222AAD86F1C0EA9D51F6CB7D5FE1A6FCA1
+BA0DDEE4588814A09E5794E6BB1994F7E5CD35E3649601CE6466C8157C87377F
+3D096CCBAC9DB3B66BA616BCE5B8D44062AC65236F294C199017CBFB8BD6505B
+AA7A22D146DD002D36772C4F5162D109227CA4B92E9EE314E43B52174C593F79
+C532E1B4C5E72CD0872DC9891FDC532CD5774EFB23F82FA10B6449FC05EEE066
+2D083C30C5F288B452FBFD5BEA23B7A19EE07083CBCA87A2503B6AC0FFF65497
+6929F65E9E88B6388A84408CDCEB2874BDC72D06B033B886F448948AF3F9E581
+C4EDB3DBF7C4F22FCAA0C54B3C9CBFF77235D5E8F6CB55B48CCC5B7EE1F56358
+25B9E72DDEF7598FF08036634989CB8A416205A8A9532E2F3071A8921B2CCD4C
+370B29DB1D9406BEEE4C93C2022E3075D4D5A94292212EAA9E260ECED28A438D
+2CD8711837287D130D76A5132C8E6E09DC1AAFA65CE31C376A7DF9062AA3E3E5
+F7AC561729F9D3FC358DA3CE1D296662ACCCD3AB2779F13C8FEB5E2F0566C1DA
+9269FAF2CFF44AD65F18BD6ACE9608898139AD229F73B4C1A310890BE0775C52
+A51486A8D721E0BA5E6C2126EADFCDE9AC9CF25EC0CBAD7208C921933EF4765E
+EC4172C9E2DCD6711D770085A752283C785124317DBD66DCA7384FE9764A7CDC
+A4109FC5278C13E2646034478D6A1781FDAF21D9CD3104A2261C412E9072B617
+65294BF1E3E1994BE3670A0A51E4C8AB05B18E337808A386E1FA85C3FA4E9108
+3ADFFE6AE72E28CBC0A8DF3BFED6777390591D1261F774444885730A5B3E6C67
+5CCC8CF984129C4408BB0EB714EB4DFDCF5F8EEF9F4872518F54EB58987CEA33
+F4C2241CCAFDF2566DD874D6050C094A7969BD831EDE4E40B138824196B460AB
+15E6014BA2311D103ACF26DB9CB79CAB968943F4873D92370D367FFA082C93B4
+B4461D199ABA8129AFFFDCD69E98F5C27E1F849EF22FF0FF625D561EBC90F182
+8271DCC654627C1035B5DA0E0BD56830AC185520533EE701638D74FA392403D6
+24A9350C7A695186F896D514AA511063B2B668D8E7C1DAD8EFAD88B78B90986B
+93F59E3F3375CC2F5A84C17D43857455404193CFE58DCD7CB725C71B24844B46
+8C63970C22366756B6B0CF8AF0F5F78080CC6B1E96207E232918719B23329EC0
+0171C78C0E5DEAE224C9FCADFB6A5AAEF93DB384F44C35B5CAE6FB41736B0DD7
+77DCDB5C06CE91E862327056CA27BB2D512AC904295188EDF9DBFEBE4175F55B
+37A3CDFB2E84A9EBF74761A345363A7F10F3E99DE38D1F3B9BBE32B28588B40A
+9D8A5267B485E38C489ECC00B4C81B92DC72B5C7051448766FF9D1FAC49A7BBF
+28E672021BA5CAA75CFEDC9A2439D47D0936DD4E7D870ED4B4F4FB7A85EB21FA
+AE2A93065233AB5256BC1B97DCDADFEEE49B4317EDA13FA14F6F5B0516535981
+046AA626A560CE8ACBF67EF302115944EEA6C17E6FC19EAAF1E46231F9B8607F
+B6B1CFF13E0F2B8CB7258151CDEACB85FE82DE96F72347E6349AFA9F4DAEB0A4
+AF8D5D14E2F34C4A9C51AB1989DE4C4B164D356C30302C77053ADC1CDB5A55A2
+A20957CC440FDECF7D32C208E3F2840D37D65E817D1F677C812CD16B67933CC5
+F3DA679DC7B150CD17BF41F89687EC6B4FB201FFB8B819C5B990BD7CE655A4F8
+DF77295082E3087AA86DAC4C16B145E85ED81D45A504E39389DD1EF62E7C5432
+B66D9BA1F8E2FF7D85F83DDF43FD9AAE7E60AFF215A22F79BF128CA5019EF7AE
+7DA8501754C0D1FDF05FD87E32E4FC3F1A4A681A7CA04237B072BF59FBBB75C8
+69F6837210B528BDD8F9E9788946458347161F55D26B52AAD431606632884829
+B3B9B60191C15E89FA1F20E9CF10A1158EB130E937E79EEAF943B747AA3A3554
+01F3C8F2A7195C32A85BF892753C0AF336ABFDB001C178D00631084D35257355
+44413849A5D963EDD74F7BFE9A9EAE9B7BDE07F3CBAA5B9998F792C6F4BA0055
+3406E4839974EFF70C3774E63E317636594CCA6C14A3772CF8B4032281B76F77
+33E1034E27BF474F0968F299C17DD2C2B8A0EA3ACD5201598B41518B14CB7092
+D79F08BE6870DBF673F60F816C69F440F112035C6BD22126CB013AA67492D9F2
+126970A7A8A0F058BF7588AB4D8BD180B8CF063623AAFDD7879E98EABE7019F7
+FD0F80D4002C7258F53E3EA9B8887D9D5794A7B3423200143FCF2DB62DFFB0D4
+B58C2C91A112924AF820541F7C4D85857926245E47EE4D1A08F9CBEFA442A8B9
+46028B56C398406BFAA30BD67421C96E096E870416A6C2B7E0A2F4A61294CFB1
+568EF5C36C6F91EEFECD67671213BBC7878455DB996EA4177790E5CE860A6A1F
+38B82FE2BFA86436ED46E60BDD900B4674358CBAFF643901AEA043F330790F9D
+E5257D95ECD588145CA9CE752EECCBFAE874AEEFFD9EA12A334FB63D6DC6B0CD
+E0B86A4889736F24BBEEF7FD381AE7C4A3337BB08C650B2A8B7C89CF13D9B620
+C5149075325CEBEEF152A4409F53A3AA3EC9ADBFEF6A16C7CC4671CDEC51006F
+E5C543189EF555778D3581D735880162627CED42B13E4F2FEE33C419AA518884
+E2DFB6D6F1C9759B260E7346814DC0A7A001F33A6372F945D060222DA5D7A57B
+440CF0C215F125B9D327FBF3742C7F74A850FE6BAE73CA89B17A598CBB738AC4
+564AC942698A45A9F81008164DD56A6497751C55F1BF3D1F90851DD8E2F8C43B
+542EEF57CB577FC9733C254D44E9A1CAA3102503031F638E68A59BAE6AC1C7BC
+3A34C7D84AD76D55C7B096F6AD59E94BCC1674FA04CBC0E549C968A814632C46
+C632C393FAE776A024C3262DCF08347C4ED40D259ED7B0DA5E89B688B3F35E02
+6015A9303964EA2D5F4AA60ED1A39BABCBEA725E3504741B5E36D9E63E248F05
+A908DCA18AE5D6ADED8026CDC356D70EAD9BC7690B632752079C0C45098DF5DB
+0E3D771E61D21B20B0360530DE3A32279D16DDB6B16EA1631979CEC0065E1B28
+3C4D59FECD235B616737229EEF4F35814A51D66E2119F6EAAC11BC90A26FC3F2
+804357330EF1763CD4B456B179D133533DCB37AC701CF7E8E0BC088A154FF096
+CB67B3FAF7E2580BD4AA600CE885F7BBB02327093C1FC596AB60981141031792
+EBF76D709C573F7202BC8F8C5F19876671062C7A3F13FEB3E1BC9B4D20B0D1A2
+D1CCCD0D8AAC6490BB3D412F3DD0740BFEFE8C9EB8D8303957D68688DCA33166
+6CB2E1E15CF38094933FF947E357D9759F240006B6B64A8B8BA46A6E43D4D26E
+7A54531E3A3A900FC427887043367A14D88D5D85CC010193DAB07C2D4914DD8B
+8BC94F066A8680337453DCFC19207627515CD5B3FFD2A5C6EB109B503B353CD9
+03BE5110D30C2356D9F751A4D777425ABBBEE997A0C37809989410B5988AE768
+8F1F6E76709C1DAF36C91CB44D3DFC812D289D2F470DEE365D2F3D3A8375CD7B
+28DDF31CE000B7F885DB7286E06975EA1ECF72006765EABA9F75EE34D138E941
+80EC363FDE8B122621A1C18124202F274345C2D2DB2E7075541860DD2531A66F
+71386B3387C2788E5F0BC9CC472CAF6A8F7BBE0A0B004D85A7A5BFA067EBE167
+C5B672A4DE0DF0A39467094774E472854E19EFB3D743ECEB342180E5A97A9254
+44FA677D4440CDC88101A4113CBBE7931433D7FC85AC2FB59AEE3175F22D9270
+1813D82E1608629C5D62E5344D672B8604E7206ABFC39F00A66100E4D560D7D7
+ED8FCF0368E48F3F8551B8CF1D8011C079E20F93A37840D969583A12F4632E63
+8273C351C4803F0E1E99AEB36D69E7DB704365791F4208139FFF42CC0C355812
+9AED12F62F6F61087D7550CDF95A5DEBD271F415CB72A13010A792F81D0A78DB
+E7E03325A4832848112CF0F4DE539A06FBDDB6CA46B78E59DAA89D061F39463C
+44B80A9B8283CFEA9C258D2F2CADEB36BD58C5DA2EE26D4E08F39C48E0204E64
+536E8078BC73D3EF26D9D249F20628784E3C8CC40A54B2C25555473CF727D387
+9D3F2D4BD0CDB02F41F597DC51B74D078271F71806E48EBCDE350040F8B76174
+3D4E6C8202ADD34E5B7319733EF19BEBA4BD57011A60C954FA1ACA3B14CD28FE
+7BE9B4062277F681EA3F10AC9F9835B5FACBE7B918F2C93049B3F23CE9D99E51
+B1295363F246128C2923F8A7859FCCBB211B7426B3B19658FAD95E3467B89165
+630A85BD1542B5AEE76C7D6EF46FCC2C933407ED1FD864C9116F2F1F3CA39BC8
+32C0DB66A7E31B9C17BA34EAF0C64FE043D7FC8B512C8A79AA3374A78DC6D558
+602AC803FA2833118F5EF378A54F70A14B6DCC65CFC0760870E829176BFCC9D7
+F9F6B3219BF6835B42EFE93141C72CEBD230657B1CDF41F74DAB153694FA2FBC
+039FE701EE119540F6E7C7F7B5A303A6CF48696495B902A8EBAEDB378BF291DE
+1D9BBE8F9F82C20EFA58EB948CF5D8EDE0F1C18484534CCF51BCF65CFC833C27
+0DA24723ADA64769F7A9756B57409B3A8D0417CF7379AFC924D683B05BE96319
+4595214CC1203744C828F37B4A03F0345A3A28C87733D1A8D80F8E09C2E43A7E
+AEA179623A29B4DC070B700D3EAC2B00555DC2ED46C834D80690A64E14A8DEF9
+17F06944A47B8C800F25CBD3FC4AE700CFC30459755D57EDBEB3AB92A62F5744
+B5D19C2B6E5EA782440088C609979595F13299AD237A00CFCD8B05A1569395EC
+8D152AD848EAD77EBE4DD9F43E6A6320299823872D2095B90D65FCC36C3A28C6
+81C54FA91BDC185A6A4DDF63F76D68C79052D4B73A5DB18C5D867E69A446F4AF
+7768F227B3B85D336EA06C78535D44AC8C862BE38E135477FF0E13DFA18D957A
+5C576AE1D3290C6C79B7D95C201D1FDE254D9EB2494B3EAC175EAA43AFFFA682
+0C0A0FC25E362525154D9A0E869E2591C885E2FF480AF885B115956A5197DD9C
+D206EE00C4742D4AC78B80A6B7B3503050093C7E4E00685CBDD042E9DF3A416B
+250584D8849B7DE26A378BDD8199BA91295C7081F563D65D8A768A936F3FC310
+A98915827CD8F40AA0DEE30A63B2CB9FA1FDB58B1C7DA3F0F1AFFAA6226A13A4
+56A1FCC427844A3BA1EACCA1964E9293D3EC2AABD04E5963F5E3B1144B0796C1
+A12FB28FA42F6D68C4811582A79A341F84343DBE17B6299F538C89919C618260
+CF0D632AD2F14235BEE555BF5F70BDF168AFB7DE2433424C4124B9FC314B5F37
+8679077441C0FC4F8B2D8E4F13243AA1952E8B5A3A035328EE7C8C09800B531E
+0F70026C7E68189D7C94BE0BDAA917ECCA799E1405CF618FC6CB26053DACF36D
+DFC3ACA8EB6D20F2BC5E679D61505D23047A7C93EDB79034C2829ED267E82A82
+49BD89672F310A69B949AA35FD8CBF3CDB387C48646F81F51B909B3B86A8CF51
+1FA1637F574722576198D8AECD2CD9185481FFEFC722D929B573E1FD54B7B8E8
+CBC86FF89C45548CB06014E68CDECAADB8369B39A2ACEF79D964FAF4D821E4F6
+EF6810D72718708E1E64CE6936E58A4DC928D3E9E4AA5FCF04BB2E27353DA3C9
+7E84D43E59307E078013700155356B5F134F1D5FEB290C6EBF21DDB7E46CB54A
+5E6D4FB62C00950B02741D5344E0C265211BB6F6C55E83C27348F8D6D2761DC1
+2098A0B68DBC1C5CE163A21ED18BDFC84144E364FCEAE6A9243609DBD1B4363E
+877F2E26AF42F34E13B6C2E1E485C8BB9C7F1391122A682B9E9D5F00868EA0F2
+8080D7EEAF14E89DFCC25942E8BB917A5DEE2246DDE18F485667B2430056AF40
+524E708DCDB14DA6EA1269AF4BA225AB7BD49C86EE3B9AEBA2C8B1530A8D72FB
+7FF7602257F185DC18F8C41765CEA7BD9C054DD0CAE1C7E725D2D8D9F0195516
+555596010C69833A45506984745E6321F2C7218C07828F2D52D9A54D042B0673
+9EC77314B4877225EEF527056982395EBEB7BE86DB016ABF99C941914BB8F89E
+BAB0FBD6D390D2AACB75E4A1C0E81BF8918579E91BDCDF21DAEBA4A3B7F1A144
+C603DB6B498B5639BA86FDB53E381D3BD62BE5FA1127DAC61852A980D26A6794
+D1534DAA3240798581929CED645AC2D5B0B64850B1B4CCDEB7F8E5116990D862
+430A4C5A282AA682FA09EE612E6912405EE9B7A1AD2F329A0068CFD84E3114C0
+895DC2A112F482DE127F4825FD0C0B1A38A548596431E23099DD454A7BD9EEEF
+24DDF1E299A3C0AF869AD77DB0382A32AF58542903E9E773CB7A2847C0598855
+C372BCB4BAFB7AEC7276AEB101602415D50C021A3144CAC78EF339CAC4713A34
+20C435062AA9AD9088B3F72CF88D541B8A2914A2144D4E3BAAF8FBC29ED32C52
+EA0A4B8CE949610FE35D78D1A1195D64EE01AF77418C9D49FD7F3DC2D6B6AC03
+0712C54E2ECDF64319343C5A544AEA526EC66F956117FF7C7DB4B171F6ECCA9F
+02DC60EFEA273E3EA814B810BB44BE1A2A9FCC6126DD9312F55095D09891ACE0
+42839B6E743F729BFCF055EFEF6B49395B39A9D937AD3DD6DDC133AA88421EC1
+38118D5339EE09008149BE8D2CBD7D522595D53F0A7FCFFB00D61FFA185F653F
+0765F9C61C732E1B6EA5FD070DDC048C1F9864A31886C0E68BA6616A34D3FF27
+49922B75F719EDD3A2C083C973C5A5756016393AFB68D0E8759628170B0641E7
+7B851DCBA6090DEB21F6B805EB66234E6BA5A3D1FECE2721648747568E01D01F
+60F0147F20EE9EFAA3A5C6EFA8B72203836467EE18382EDD8723ADAC84C7AB5E
+ED8774E3A3A94CD5D6806A93CEF48CF1B50EC9B387B40C2A29F0543DC9F70425
+1C18913567DD72E7811B907FE0AB9149AE3540ED2C51B6EEC62A08BB66B29C90
+7D09797FD3EE73E9E6047DB4A02A70B974F0C1F65E94D6817F9963A8E669B036
+0ED7655B15DA44DC802AF0F667EEE2C9A0BCBD3353F6BB5DBFB3B6EEDD712274
+2DFCE6BD0253A9F42CCA1A3DE7C49D39F1FB313FBC823D21CC2B598BF4D5FA4E
+9BFA1E4DE80D12182C38F424C271F8BBCDF82253E448A59719A13E80E3DFB1DC
+B0A3E4540043FDED9EC93A66287149B751883044F673492E625F4B09F79236E9
+CD69ABE887FFE13FC076DE57C84023C77673D69E2016A8343DCB2C60CF457A85
+086C8B6602F7F1885E1C21891BA9046E0396707B7E6C28CD4383ACE90D189077
+312C10E3E5E72BD1971148429565D3E87FA4CE5D3ACAF4F8D942CF7D6265E11E
+0AE49A2DCC9A25536F272EE9E49779B158A4212F060395EBB011FF00A86070D6
+5B25B9A7028C12B7423F50F7C6B42316DA90A769B9AF0A954AB962CD8889CC11
+41CA39142313F4B953B79261D7F0BFDAD9F07C17E8B82A5E0CEE6CBC357D6E28
+6CDE8C65EF662E95B9E3B86B97DA7FBFEC49766808FBB0A8DC78B81DCB8332D0
+E47303767CC0122F4C7FB3C8749A995E72AB1D31572D4D3F688F685C32171295
+A71B398B524E50C59C64F3E8AC9EE15D7122A3689DCD293D7BE7E7D42E508150
+31A359793D72EC27ED3F367F9777587CAB3BEFE14DC2888E1F43B828618DBD02
+88B10C7EB71DA8818CE5407101D00C4E457E53A2FEC98707F407EA519BF1D45D
+9C4184939FDA36445FA204D572FA795D9FF4FB7797D50FD67931007A73FAE4C7
+234A28CAE7EBEA14B545EF35C08FE94D5D75463B8FC02ECEEECB9D65B418F2BE
+B7C6AE5C12943265ED0258F9B06E7120A59575F0DFCAA167AC38A306F7C67875
+5A8AC63E125DD07BB43909A3C6DB9D28DB0B89B2C76A007670A22403FD8D47B5
+AF8FFBF331374F803A164A0A52EF5F4380F30BB4D81C892C46A5E75F6B10DC44
+FFD825A545C957EB39F4662A5C313D2A4609E680B46BE4C1F6EE4C0DD44C9DE5
+9B03436297794A81473D9A5E4665420C6A392E98E62258155F63F5F4C43638E5
+60FFA20829DF6056B10D647F1EB2CB956A3208D6BF939A646700958F2E2DEDEE
+DA5259D90360BD586FA73F0DC23DDF7640578BBB4F8ED37D19C5AD282DF493E7
+5E1CEE7F172221CB588EB3EFB4C2F1F6889C65EA47242250B28E67C86FD054AA
+946335046D1D686849FCC3A6E1E3142BA920303B1B0884648CCC03BA7C288F3F
+000304F1BD486DDDA1D6B03E6FC5F8D98A0702ED31E043C40CB6F8FAD751CA59
+EE49D32A26A70D96AC1D18F1FF57F22F0DF11C7A7596AC01814BE9F8569BBEC4
+80072664548BBB66EB0AECD471408284E98A297D15505E8A09A4A18687B0292E
+683095D5868329B4D1BC6D44D8ECCE3E0CBE1BE8EEB80BC8CC72DE4B8AE3F4E9
+C946BD645857CFA918545309318A9064DBF3E706909E1BA3B05082CA9BE71186
+99F9E5723FA347879A8DF1B90AA81920F4784CB2B812B0666C5143FA24DB3128
+B6DC3ABA582941AD2D087063F470E120DA9410F8C219CF0FCE60996175F85FE1
+B89BD179F58D75440D7354410B03BD566AE2E5EC520B9E3452A6A71FAFFA5C28
+8AADDB077561CA7429AEB1F6864C06E5707962D4A1993D445A587FC5BC497739
+237635C313B9A65D1A6B53B129439D42C31373AAA8F7D687A4F988D7C82D4C81
+932A09B76C29A27716BCD438D4D08BA2B467FE0E2C3B50E82DC04A4B0E351B26
+2C3D421BA2C7403A5D587C62DAA65899DCDA98BDF2BE0554AEA617CFAA1298BC
+1420CDE9EA38C1EA87DCA25E25F6BB1E6279258A96BCFDED6BB2F98BE47354CB
+FAA54B69E2E74E8B7D09F7E43E3101CC7133B51159B971D566FF27B6F4EFDB38
+86C3CA1D5F2CD03D0DD7024F6CE4FA5C8F3298F4C3E58F086DD2F7B0DA9CE34C
+B0477FC7AD5C1A4ED5B94EA6E145C0FD195736527C9A2727655E134CF5EC08E5
+C0ACC6BBE2D09FD95EFC123A77D1428765CCB7F8A8529205CC4E1EE8AB4BF3BD
+66448CAF34110D7A84EAD50BC8D60CB3C37A86DC0045F5F3B87F08ED2D4AE659
+94A75FA7F021997AD683FFF284CDC8A5D2F0AFE9827F6E28BE008EB1F773B7C0
+B161996761142A37673674F1A6B0AF2C5AE6B981FFA447F1C4016CDCFEEE533F
+A95296CB5B6D53F76F3F39F01ED4552FB98B24177E385B26B180E6586A63E815
+E45E2FD4C49E9F8E0238CA0701071C2B65580E0477683257F5167F5AA91051D5
+90D70DD37239
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+%%EndFont 
+%%BeginFont: CMSL10
+%!PS-AdobeFont-1.1: CMSL10 1.0
+%%CreationDate: 1991 Aug 20 16:40:20
+% Copyright (C) 1997 American Mathematical Society. All Rights Reserved.
+11 dict begin
+/FontInfo 7 dict dup begin
+/version (1.0) readonly def
+/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def
+/FullName (CMSL10) readonly def
+/FamilyName (Computer Modern) readonly def
+/Weight (Medium) readonly def
+/ItalicAngle -9.46 def
+/isFixedPitch false def
+end readonly def
+/FontName /CMSL10 def
+/PaintType 0 def
+/FontType 1 def
+/FontMatrix [0.001 0 0 0.001 0 0] readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 0 /.notdef put
+readonly def
+/FontBBox{-62 -250 1123 750}readonly def
+/UniqueID 5000798 def
+currentdict end
+currentfile eexec
+D9D66F633B846A97B686A97E45A3D0AA0529731C99A784CCBE85B4993B2EEBDE
+3B12D472B7CF54651EF21185116A69AB1096ED4BAD2F646635E019B6417CC77B
+532F85D811C70D1429A19A5307EF63EB5C5E02C89FC6C20F6D9D89E7D91FE470
+B72BEFDA23F5DF76BE05AF4CE93137A219ED8A04A9D7D6FDF37E6B7FCDE0D90B
+986423E5960A5D9FBB4C956556E8DF90CBFAEC476FA36FD9A5C8175C9AF513FE
+D919C2DDD26BDC0D99398B9F4D03D5993DFC0930297866E1CD0A319B6B1FD958
+9429B9D40924DC059325D9D4CC0344F3F997A99E6CC0676735EBCD685AAC9142
+08DAFEC78BB41AFC2F1C219910BDF41D6279284EF600B69776CA15BC8A34347C
+30783C52AFA60FBE3E353E2AE354CF87B558776A22C776C7A0B5AB5CE1F941EF
+C2D9CAC37294BF407A671F10E4743BF842143F4F7DFEE643BA3BBD8BB9E3F24A
+BCCF7F0ADF8BA500620C81033EAE8C4EF2C1DEF13AC575F1B3BBB66F093D3B78
+5412B82B67FFA087AF57182B2230F9F2137180CA58A7D9B2C822FF04BE6CD01D
+43B2CA7058C7B953F6D9B5D6E91ECBAA5CDE1159B0E59C83DBAD96D6C8C8BAB1
+374EF652D10C0F3EE7104472C98DD3572AAF2D45A70BF7061447E21EE3C3BF23
+DF39C2D1B35B42CD5297BEBE6BC94F7C9DC6E61EC67E4F677256FED9064BD3E4
+B51A71B1D27CA4E5AA9E1D8080E6DAB5310711EEF87C40859FA935B19524AE83
+63B163FA8397BDFF443227FEDF7DB27DC35D89FB1C5E435DA0619A5C88AFC73B
+89A2DF5E767C5B536BC7167A840A0C32BD57A14DE69A7D0D819AC36FF32F908A
+5070F32983BB007437E3500799DF5E0AD3710A4C0000F0098D5BE99F2EB9C1C2
+C444FD9552D0DCA098A94B3BF176F511CEE13DB7EFFAED7C47B5ADCF8D4700F5
+7A5FD1B49560969BF5C44F3749370663A04776F749DDD7B50674D93254426C4B
+EFE264BEE7810EC93784B7C01A7F29EFD92547E13A2C7851A2E709FBD5B87850
+4A44F08F56A542DBE072D2FBC58D9E6468E1AB858DC35240E30D31C7AC13D6C5
+7D2BB634BEE96FA0E10F842B11A789F72A333DD6DDCB1BC23227EBC406E50B40
+30AF0C48E6359AB0C46898CDAF1118E46BFF8B00F54EACBC2AC262AB898C42B9
+2E080C10DE923C18AF86D75FCFFAAC63768D4F985185710865FA3225EF531068
+487FB30531B1C2A4B4AB83F8C1494E6D72B1F6A012E10A2A4ED6658E5B081DCA
+1A3FA683903F4354E3F6808212A7B2765AE1F7BFBA912B153A0C7051A50BC080
+C9DFC891A623F1F8EC6223CB3B1F2F7CA0C0E1922A3BD031801B31F970493F3A
+9954C467A04D1D826C9C17155D6D441F123FA232B0908F15EFD9BDB4B8D53E0D
+0ABD89C56213BB393753AA61EA26272566D164A8BCCD6331AA9F20393FEBF998
+E8EE3A54FB522C5ED971A45428116679B75E438CD522CE02F372141B456394F1
+D3D9B8B226AD7911D9B71F419E6B4EA2680F41EF3835715528C2338652222CF5
+07EB1831C27272592E0D7FE16F87710F2C50AB7C4F10626F7203D68FF23CC4D7
+B81B3922914942AC520B3183603EF0198C0A10957302E97A907F8CA7D499B85D
+1F849566DA34D8690ADE3A4DAF7A97E1BF2C2CC784F97F4313DD69F9F06255E4
+B15E5FF86E48FC4644A59BD7D396B64EC5DB796D909A75711742C6706229DD25
+D775B208B14D7E2C129AB980CF9359AE105504F77BFB4ACE3649995C8C5234F9
+0D312AD195458F9F751C62901AB81EADB1762D31C769D55E9FCDC64A7EE3C59A
+A13401859F5EF336EDF438E85B8E7E0EE5127B59ADED11E4075657A5E7111067
+50243C97F57BB93CE988C547F4370BFCB852D4571A3F24D0DDD387F8C366F031
+1C8188B7502BBF0DE92C5E1A2425ECF70E4F8CFF80E60680903871D565CB9B73
+12AAF237EECF3F6A4DB19FAE884D02436B2A4CFAA75B7C0787AC2C4FFE2A0CEA
+522EA455BB048CAD8C89A42361C81475EEB3C2AD1C4104C3CAB9E94C1C932A40
+6B6A582FB7CB0C7776630D3266665A275A9AA25939B6ECD5EDB28A301EA5C475
+C9BF1E6A1841D887358166BD353C506BC26D813DDF90271698E84BFFD2D71FE6
+39F6BCDFD90D5127F385BFD9C0588CB64A2D6EC213FC46DD481B990F022F42DB
+7CCBA22C48489FAF12E89524E9990C5BB71D6A8DBECDB453D4D85D3BD7BBF72F
+33D40A451DED6AA8AC14A6AEA2E0C2B300F96DF9E94ED2CE865224C5E8DFDE38
+BCF426323F00E47B62726021CE7991089BA2327C8356C32267EBA52AD586CF82
+E9A7B46857CCF56CA461B902183012FDF684C649F656CFC2284B5B7C315FAECC
+AB4E9F43EBBB945DB6E0EFD7ED536D672830F7B588592504BA5D9AC1DCFAA3E6
+94DDB28C5BDDCF3B88C6AF36DA732C2F8128AC6C6363D2AC2D62912F5736DF85
+20F2F403D712BD25932EFDD1158AD393676F41CA17F624619FC8D45F6A3A7754
+5ED156AD3BB137B036E5ABC5638260E6EEA46372771AFE123F331B4C9B2CEDB2
+C3F2196245EA2C5CC76800F336259FC8BEF686AEB4F3B1EC48BD2BF903985988
+5554AE3D7D810E2C12A6667BBB93F5CFDB223D1594E37D680CF0EC6A49F2F13B
+590B9376A0597EAE084EC0742B17C52D0214E634764CBC2289B072A7D7BF7E42
+E21F3F33DBB9B3F0DBEE1D9B4830F3893A80A6374ECD4A265D13C2950BFD73F9
+ED3867FD35A5156DA284BDD6D0540FE242E72EB708480240F876C66739EB8500
+1285AC4CCB214850B45FBE616160EF568F3F7E2A905D3D7B97B04429DC4E6E3A
+0CDB03A0238DA527F0E53F72ACA15149AA4BC4245B13BD2458B46C286C8FB1AF
+F2B8536B90A608E857B522230D32CFBD0677650DF1F48E419634A288D5120D87
+AF8648593973A460DF22B9DAB20966754EBA97A8ACA98C1F95C6C2B74E390536
+3FD20B0AADE98306888F17B41822B5FB6C7C0A9E6D7B2F6B4AC4387A645F6620
+0A24144292CF6DC22C80CC7CB653D804A33025DCD98D2856ACFBF6B5004205D6
+1AB0AA4C3AA1701897501C53291787DF77700F153E3F3FE9AF8CF7C27D371B74
+DCE77974D266CD81CCAEFF573083BCD7FBDCF9030D08D9A903D4F302471D08EB
+7A4C9A356821D436F9D612FD574ECD6FE5CAB70A1E732538BE79F53AA7FBD568
+F6CC89149DB8BB9B7427E8894DA272513251336D74D7FCB5D8B7F895667DE628
+7888E5E1EE45019B86966913C5C81ED6531649E4AC3277AF8732D51B1A0F26D3
+30DE8E8F8575F1D13348F08D76EB61275C5BC636A81A462A65E23D56C5487157
+68693587B3505F4FCE2AFEDA2E10BD7461C276BBA43DEC9271AB4F814915414F
+F7537E32A5A53B636754F1DA3F3E14DE5D18D7D57332C2F83E70D9D39450FADF
+A6D705C4A394E0DF31BD26C1130700579B61E2FC30A10ABB11098EE70506C68A
+1A1B03AEE61C841063A9ACF4A64B44B1168527B7DA12A00DECC26E9122384782
+6A8D34002A244F5BFE9D26A9ECECFDB475FFF537351BB0CF5400814B3B0083E4
+6C83B60EBE0C106125A5D95CA52857847E7E3EBF983FC00F2026E51BDD81D015
+09DF78C69D2D842009E05CBD4CBC40E1B52929E73F01922E8416C3A8DCE65673
+06D8BC8A6F08C4AF791D0154666D7945CC0904247399C216752EF57113DA6AFB
+86463D3E5820EF7F73B6459E160BD79B509BCFD02E6346F42A69B43ACCF56334
+71B053140539FDC4F1DA19CAF0691D6F81C21BAFC0B173FE185FA352E7DB9008
+AAB5F0E00BF6DB69CFAF548F51DCED2B737949C20CEDCB5A2DEB72A9BCE98B24
+3610D1CB43A1368044F7DB21215BB899AB3BD138D0DEA278F27FF808F37CE15B
+E3976C5A54C69D54EA7D5BB5E9785D8064C44DC4BDDA4F4B8B1AB4450C6468B1
+B2BEF80BE3329BDC0AD7D12F53C4AF12E248CAD37C709982DD1C256AC8B548EF
+9B2CECA35089376E92731458C5BC0DE099F17950D6F04522093D2B7BB5ACFBD3
+993A0D4254A9C70820A5D894035A8850E449DE7ED7912273F19BAE6244EC1EF4
+AC66BAF2950ACD6714252DB1A0DBB64FEB0E65F32DC52F541219D73EBB3B66B8
+A2CFCC124B4710CA9F0D734057E658040A42D1724E5F6E3DFCD83DE7BAD51FCC
+B70D8025C343242D7176F5D733DF6D439A33DA3834CAD95DC7C992FA6797F572
+FEE1DA81A9DB18F47C780F06AD6CEC736305AA41F8BA41A0F1153E8283BD1E17
+FCD9C2AA203F3835C9328FEF20459E58C595745F872DE784E8547AC485531D81
+EB2636D7D630F28D83B9F0A77CC9CA5DD2FFDACA4B178D961D08D2A18FF05D0C
+0F7CEAE2CA6DB6E11D0CD966E496B2D234F253AE97DABD9F55220EBF886B6DA0
+D60108BCC2AFE066BCBF51E69514EDF5528ADF86CC9534A6BDE291D6BEFA20A7
+F293FBFFA1C0F4A37F92C064D5F3B0623575D1002C6F70CAD0608A67E2840827
+4E9E45AE544ECD99B9DC909BEC3A45C8279A3A971BB17870FF93BD3C1ED35D3D
+E11F99DCEDB6FFF77FEC6DE3734B3607D4D49DB7DBFEA7E3BD4E9906B7F99FBC
+55309B394046AD63F2E59D568113C109D9CF04DCD2B1B0C15F71763F6C531B2C
+83B7E96E0DB04952A9241E71B75DBA88C19109C4ABD60FF7DE9B23E991F14A63
+8827593DBB7E248992E302D6C4AB51B665FA7F66520D67F15E9A221324AF89AE
+8C67B418D06A6B4B6128B149F8069DF7CBE3DA963B110442724A9E16BA691D72
+F3613865CB566D7B3B22F19292C7F39F70BA29D9EBA147B0A72D4F7FB6D07944
+33721F94B04FF9507E82DB7C2E5682A2441610C70D9D8672F3F31ACD9BB583A9
+D1585B5D2D5229A1C99F8CCD16B6CA6C1AD5FCB0254D64EBCC72867CE6C9EEDF
+BDC5538AB3E02C835C2A135D8712307A338880EA270661CFB8E03EC3944D8247
+2CF9CD961C3C0B6CF8FDD8C3AADF769FD19E357142C793D0FBC6D5CBD69D9ECA
+AE8A3F266932466EEE0DD3D32E9913BF8699F2014D1442DC5BF61A3449A6D366
+1B7F4AF08B5DF7072048C4A2DB7E527259AD046C2AC08A202D3741801C6768E9
+3465CAF7CFD73C50C019C7E60C14510FDC51832DDA6FFE385A596F69CCD153D5
+3AB08D09BD5C3AB6BB5908E460921921281F8CF6700E66BFAE45F547DA7E109A
+2526164AD366CCE796A18E73DDC09F0E0E3B480D27E2049661E435564020935C
+EBDF2079886FEEA8B84226936A59F4419F4D10045509C17A8602AFD588080586
+ADDCC0B401D1600247CC2C9A482482883192A4EACD89D3E37D475B7067275175
+399CB330DA1B148686CBF57D8A8EB10AE7DEBBF437EDF24E2ED1968F0C03B91E
+45EA897ACD82550C2316D49017655061D0D92A21FE8B23B23A895CE16DC9528C
+7624F3D349982CCE20ED8DF66446742B1DA0945D87BDE9905865BE3CE8A7B41F
+03066CFE9FE10C2A84751CBADBED2BD074450E130548D58A07FD4119160A081E
+987F4CF71B68DFE39A6DB5562E6368ED7D2A67165EB605E4F7B50073B822C7BB
+5568F8434880D1835090D0F0737B0726E661623A2971F6AFB2BA86C82051F794
+1035D35D34FE0071AA2BFC13ADEF981B63BF6F647422A2DDDFEB9900FFA8DB91
+06A08010A9428D1C52CB2636BEF03605BA3F148851CA6262B4963BABBD015FEE
+2A6F888BC9D19917C5DE5F730725D03E95B951B2DB240A74883123D40CD2788E
+3F22D9F517664D4E20AECA03AD05F6481176E37B5E68383D070A9EE5CD5578F6
+713F5720EE1BDBC20242BAE097C55605A9BE333FC2A67DEF096A6EF03723D702
+562A8031828B4A22B06C4B31626BAA2E90DB509E1FEBD522F2F288FA4075873E
+2C2769DF4942DF150032010767DA0984A2EA10FFC05D5AFFC654C16B4EDC812D
+EB8DA97B59B28583D7C7C5981A704B25886EA32D2094006AD52CE372D211A51D
+D34E86C0ACCB53966B3E4BA9793DABF6E0AEF06757BB30C141982E55017DB1F2
+A9A0BF2751B1C03E276690146B5A6D5A664D74D597EE88545DC5132C61ED4EDB
+51B4743C6C9777CBF428C4FEEBDA8D860D33121DECA25792BA03125B3A8BCB82
+8D33D87B5F0AF0DDB979A79240BE8B99285E8CA00D80570457BA6154B711D5F4
+613F0F48C6778264C938B08BDC0416510D0A17684593996690B86A4F5FF2438A
+1377231FF3B1E27E279BF7CEE12DA82B6E7C45B86CC5EB311211BF7AE6B51A51
+F84E990B2405C9EE8F9F3490008B9E6977B1820A13FA829507D9C6B9B1CB5EF7
+BDC181FDEE7C1A8E48B48BE985A036B153A6A486084B82AD3E72F919BBC149AB
+FD4346DDE9C577315A7A8C498BEA3C5C4744B9E35BCC7449F98568794D9E4F8C
+F1A6FC967F6EFDBDE2D3BA012F12771843637DBC36CD96DCFD211A702E316152
+E9B7A792F94C50DB2CEF650588CF1BD3A612227B09BE1FCC99EEA4DB9266001D
+DE800C3DFCF92F1BC2CECAFEBD6E0FFF8CFB71D644CBD75EDE2470B25DBF4382
+183DFCF9AE2B6E9DE049E17FD7CB5D5E75F69D2A5E1B456AED863F862AEFACF0
+B9A18BA25125934D99E1D68832376640271D9BF3BDE78191C286A1EA5EB52684
+3EB6EC3D1DCF031584113B0EC8BFD77A85969C11032745A8138F0C0E46ECE1B8
+A14D8FAAA919955A7D476E956DD11556EBBF0A093B5493E631BFB38DAC211615
+EDE56ADEBD3EDF75BD1BD87A90F273D4D0E221A1458552A0414A82FA53239798
+85BAE93A73DFA0C78B10F726E3D8DF94BBFA3FBC98817851DD701C778EEE1557
+26499A30C842BC1A194A764F995AA7043F7F91065A2380C846393C7CA6B9274B
+B15C45F7FC74D449769F20A7C57049AA4925158DFDB916872120333C998C496F
+73731B7B055F642EFE27DABE4C3A9411929F78C4AD869FA00E6CB649AD915206
+138C6EDD92F116E34EEC551E7ED1279C454F41E815484AEA44E5CCE017269AB2
+6430C6C3EB0589A247C163315DEE3BD11525FBE7F17490306CD1D9E68F574AA6
+37A1459E4C44F1B7963A7726357F42CBB30E5C2C4558EDB9A5BC066CEE26F18C
+63C0B37113A4481EF346C46EB5160CDFA6F8CABA14422FDBAD2C21E91F697CBD
+A2E38CC8E4B64A00E4A4A046EB1C10310EFC9249DB8303FF599CBA910DE000C7
+5BF7229CF4F475198971421DF4C7D0BF565537497E3E701E7DAFB766E722FEDE
+3EFBCA1D24776F14E988CF494CBF99B58CAE07BE36D678305AA742A4622EF268
+5F44347F7312730FFE21993C15E15188DBA3B137B997B7F0DBB323CE9B244ED5
+3409C50DE3F798AE64B703C8160BB009B40A05A6173240FDE6C9B01476D20E83
+3F9108DAA1AB3BAC0EAE04549DB2F8A7AC7FA78FA81A448F6549596BF6667947
+48326A07281D2EE40BAA1252C79FEABD510D72D53F45CF25BF7BE5858926A465
+C71CCA6927EFB422B8C23C0BD6FEFEB66FA1375B0B8C772CEE1C7C72D6DDD5F5
+7702E88ED8BA354A889A171C1304106BB08012428B5A792F9C94B8C43B6F2090
+37CDB8793C95F2310222BFCC7E1A66AF164D524F49D54A206A2E31AFD481F751
+CB4981B6916D0C624657909761348FA49DFECB3E40C22B3768D1949126EED61F
+6336803CE8329861202E2E44BDA2000286C2BD8E915CF155E27D22C53453FFF8
+46B15E1A6FB0B360BF3CEF320293A0CAE1F37A9C1123EC78B94999D8DAF0CC4C
+A69F129B1206A0CD5CE5C4C3F701B335C2CE6372A8A2E6E07A5D95C10E8D1E1A
+FFC85AB9D4D3E5A956E8116D3732001F444BBF29C59AD4BACA82D0BF6C143FCB
+E9898A6596FB71747723DA5E1F3BDD041238FBF91DDABC81CA4FC9CBFF5DE5F4
+058710E5246B8469EC1B97965D2E809DAAEEEA9DA2DAFC83672989E2A798FDC3
+A731DC25D33BA638C90CFC36250AB855E25F873981C1C134DE9E40F45CFBE0AE
+1656638D45537D94ABA65A99A66AECEC7854514DB7D2EF752B0265A0EA1E503F
+125B18BE0E1F2537F4B98DCBAA19F820088AA18752C806B74FF9E65E3F2F66C6
+ABA7B44EC7729000A951C5D470B0FDDE2D774F82D34E766069C3D242AAFCE6ED
+1E68D95FA3E18770A99040289DF75F4604CB036A67AE7D158D0A07FBBA7B64F6
+6B1F750191AC9F2291A2439DD398434D84F91C4D0ED3B457E53C7B5D8E730716
+6DB507367FC947C7DFF700504E7B5001FB683ED86B75D7326E16F40ECF8ED7E0
+76ED443BEC5337DC2A776776A0C266670378E9134EB595AE449D0D48F9BCAD81
+7147F6B3203DFD0A38227376F0696D0ADEC9BC7F06B66DFD8116FD51982019BB
+F463F6BE6563D173085A1C2A777621801FFC3220F459C77BD1302C1F6BD834B3
+742FDB9BCFB1342931DDE4CF94CD2E9F7A443A67268232853803BF62913B5BD0
+0AD7F4AEF1BBBF89961BA4282D227B1969050802DBC9A788C00E1580C4FA9A71
+ACEA2700E5A71D327345FD65F329177BF2BC1CB7111C6B46ACC4F5795B0C9AA1
+34B39915FB16EF49BCC0F3D2DA4D33F7EDD1E5707B0FF5DAAC677D2DE279A7BF
+D034EF78D146789A2D4BD929F59CD9F208236D6FD4895BCEB920A2316B520B28
+87EAC2F6889F9B53103BC5B959444884CA28D37738298600CACB58C5ABE97F0D
+D49C2C684A46B04D628A28D519BF0917E1A691921A227403D4D0C219F33CD495
+E15C5720BB584D770343520D00C15BE696642AE43B035737E29C4356BEC12269
+5B3E6D14F37011DA04B724299159BB62AE708644099CD6EB298CA66D1C0DE25E
+BB2D83615F3EE99542F0C6C82C9106F9E8284828353D5DBB4B525781F288E9EE
+C208F9355958794D41EB1350FFB308094A68C09F2E2F8CBC77385B7337A4DB71
+A37149024FCDFD6DA887243F71F48101B70665F850BA7F733EF90407BBA8CF8C
+52ECA8D93406BC12800CF57F1DC12B355A10483AE4ECE41F9EEA5840672423E2
+1D75F2306012063AF3CE75677BCAF8F048756C3D3170E256C2F863BD1E0B78E8
+6ABB9F135BD4F0EA2216B631A392B2A0064CF9166FC9A73EB7142440821029EC
+A31BD024C4262BA37BFA3FC5527772604547E09EAD0B23B7CA97FF613B340347
+D7233CEE647221C363F0F534D934CD179DE2BEA2A508DFD1313BA51136C7944B
+7253C1AFF379611C58D41EF51EF55297129294D9FC25F593E2092E83F4346A2C
+2A5E7FD1AC5823E2FDA0222D4FB31B16CA235005530012EF7DF63A7E1AC6AD24
+0629EBA16DB9943399C88201C10DA43C158D5CEF40821F3C7474846DC44A2803
+321F258F5D553D03F5B171A722CBCE7AFD8FE2F4E29B0FCF35EBF0D5ACC1A7C1
+E25934498D044430F545111A7E371F7E3A521661A47B9D525D81350305653D33
+C35E4231BC182DB7C5E9E3FBFA93D6F29C6A714F2E8D7FF27518245F05B13FE7
+12D77D9677E551F80A65F0D058BAC7E0036BEB3DCB6425D19D9AE6347C0F008D
+177F55FE1D89D4FE6ADD4CE00084B944E8F249B421D3D2778198A5AE996DCFE4
+F6BDAD4D1581BC25BCC621C07DA2C8027DBD0211E975F80A0FC73D42C1FA335F
+96573E9C69F023200B0FD6CE61797A88DCAE042B4C82CB3CF74309A392DEB8CF
+0054009E777DF45B649ABD9E549E61D66439A66FDE06CAA712EAE20EA2233E05
+D4BFC80600F8E1C4EA899874CD019D4E514CF8945E022B3F0288F7C89BD9B32B
+F683AA7BE2EDFF16C851A82CA15DC2E9A9FCC3297FFF9117522BD9741201BA93
+F471535EED70599310B05569A4241755A25D080F99F1704321708C6A4AEB60D0
+70AACAEF1675C67086021CCC3AD12979280F8999CCA21DD006462C83B88E98C9
+C785171F08636A58004A2609F4B6E58719215DF7EEABE2E9E2A33D7E38E4036A
+A48FB0EE221C10668B482E9422BF3753ADB09FEAE829E35FC8004958C576AE86
+FAF18B1BC2B15E15955661E262D6D7190744DB9105151F2DF569DF2FA2153377
+0D5B1DC947C08EB11951D5CBFB941F1892F2AD72AB54333468C0B5967A1BE22D
+2CF668465ED282FD7B3826D0BFCBE569D543EA0BC146865AB50FBE4A4800E8E3
+3E86A443F3D786BDE8FB2FB0313D8623E7895E1FE1EF78835444269AC3B55AC3
+352D7946E6032A32A86DE3F7E315AA09DB7D677EAB2B327C9A63F8FE89603707
+EFE8704ADB66CA6FAF412EB99AFE47C73CCFE17A6C6CD994E542EA044FD48A8C
+84D4EA0BC1CE5C2F997232869F0F2A3D206DCB6DAFA49ACCEDDECBC380C73592
+FD44AFBEE9392DC921CC31E8F9181AE15DCFDAD134346E25492BAB25AD450EF4
+BA0FC540E9A26744147BDD9D187B6C1CE6768086894C05017B5A70629C3F24E4
+CADB7D762E9B4168F5340D10DA9EA293889BE0590FB91EFBFE73D51348E505B9
+37A517756A19D1C720566407306BD1A97144C6FB8A9F50386D09321399C0A8B7
+BA893A54C2F514984ED7D95F3F555862A60A6A02881EECF007A59FD8BC7A05F6
+55064C5FE3EF5BA371413125EB92025F144AF939965FF75A59D9D2E154261A5A
+2FA9BA49716889B4202149988B1BF84F64AFE278E079C06F6E177AD07011A258
+FEF05A860299FDCA8AF7D6264C4881601C1E30B29A82CFC7C6D4AAB7883210EC
+2E9C5E1A1F4340CF1419E015B09B5F7E26024B40383F710C534D721C74C2D5F2
+FCBE7B48928C31D2086D769646222FC2C382C72404BB3C5461D55004B27180E8
+E82BD7C3CC78C6F220798058F15776288493570D177E250005449A6E0310957E
+F45B7D859026A071FFFFEA238915639A98B5C79FB693C37F43E4838FA8E4A8C9
+7F5EDE1DC63014DC81F7620C8A2119E8E5828B8D175FF91B87FE1F68DC817E91
+FF01989160665315034669B45A59BFC2F6E17D151476058FC8B4F0E2E2018ABA
+053085E4B95E8674E9738AE36295FC923D8F058ECA7467736609B738806DA807
+847D2F92D02E0597BBB24B0F28D6BA9D281B0635079662ACDE0293BBB8698B58
+A80F23EAA8BFC44262F260D932223131B47F3D94218CFB21DAC1908B6A31AC7E
+FAABBC90A3C3C3394D86ADF67D227D8CEE1876B2E343923017B1703635D3AE9E
+9DB6DC06E52745795255065A5321D22CDC5EC2B2B9F824C23E409B8ECC6B4490
+3D0EA2CC23BCB3CA8A60958541695F97F2D940223BA42C3B49844B628225ADCA
+6930D5783B6FA6EC5E472BA243C0FFA71AA738825EE334975A364548853F824F
+9D5149EB346E8F2D074F4715B29764F114AC0DD2B777C170AF827B157D02C2CF
+199D61FB4566D74CF4FC7B31CF5D3C2353117E7B39233E4B84B98C4535FFAD79
+8FE8593B490B484EC730B9CA552A45388103E8AAFE7E62A86C8B24A642C8BAD3
+C9919FA9619CB718AACCCB0F07945D336BA8CC7478DE959DD738441DEC374E9F
+79D2B328211873D480E5CD0ACD94AE8F57FF0E0E3B235FEB865F680A0C817A16
+7D795B8ED5CD3B5EBCBCF748DB6BC52BEFF719714E9B93C5A0800E380542DB76
+4B12A2580D76CF3996B61FCE2C5C34D06487FF1595628E977D3EBC395C6BEE24
+5EFF7388468EE52154F1030AE786DFAE691564EFDD81BF390B9DDCF1F84BC16F
+DB2E2BC4ECF193352B3C6B4BE06025BC43D0A97856D66661B80C460FA48BCB8A
+F7E7BE633E1CC52EDE7EF01258A3693D8746574B0AEC82A2618856B0B5CA131E
+B6D624ACE129E935D8C3674715D542AF4F0084B0D7C993E2B0691BB1FEFBB735
+0C0802658BF289C32EFD28BA582941B6552ABD8E03A4651AAA797475898BF848
+01BE7FEDF3CCBD26C235BC02C6F907DBD964ADDFCD1A5B0FCD45FBCD6AA6D940
+6B955CD5DCE4CFED6DE9AED7019A44EEEE1D64771F934A56C18BD5714E1E6CE8
+A39CA252042D8174B1CC1A93810BE59DD9F203A7D9075FB74FDB5CAD7B12C1D6
+1475E3C78D29D96D84030F5175074C436415A1E6AD9FA26E4C3F9C9F318AEA82
+E98B6B507FE1FCEB57E57FA712DC259C43A1121685948BFE52398DEB4E472CFF
+C09DC6C20B0D6415BBD93B3F5FA82C03B7F3E7268F9C1CD8F8A7214FD78AC592
+8391A6FB967ABD42A63ADA78B700FCFC4817C4ACE54D8EE4FEB20490B5667469
+3B105470A08E956A71389CAFBF2E96AB9D445AAC58F5597990B0FB65A8306355
+37921A387625F7BF046E9D4D11A18F6FF8E664FC1326E9AD1E4E7696D17A4AE3
+F2767EEF4968983FB8DFD7F731D2065593488D21D2CE61DD0F106E0CA36C7616
+376464D5847B3CAF77B257C6A3D6805C154EB81B614E9DE2D314E8664F3F2928
+7DBBBE43A95B071CF577FC1D4700514C0FA042ED08AA4FEEBCECC59B730A686A
+75072DBE884EECB3B6056A56A7EFF016290E52CD4E6926D0E631D454AA21CDB1
+9B355ADD5AF08D01F58A0EBF61D137CA9DEEDD270DB62FE952B457D65AE2A9F7
+70BD2AFCAF5F02F24B3B1AB9A257137CE6AD6C8415BFFDD7EF318EDA8F16C04B
+92F3BFFCE429051D035726DDBB9BE7560BD44294D6B5AB3D2D470563F9221728
+25327CE19D7E770536AFA9806E0AE707BAE02B2F1D86D102EFE83389CE027FF4
+432C4117D6C8D253C17B49871015CBA55BD6046119D7A956693B2F32A4DBD2C5
+7501EF1C8A277A4FD42347F07CDFD37EC54FA6AFB26742671D66EB4A746DBE28
+791B6E63C25111FEA59E1A0F239A2E041148E2773A491E01DB47D67611F40C4B
+3C862975C0A379DA1D15EF87A840008E02305455E6E13847
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+%%EndFont 
+%%BeginFont: CMR8
+%!PS-AdobeFont-1.1: CMR8 1.0
+%%CreationDate: 1991 Aug 20 16:39:40
+% Copyright (C) 1997 American Mathematical Society. All Rights Reserved.
+11 dict begin
+/FontInfo 7 dict dup begin
+/version (1.0) readonly def
+/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def
+/FullName (CMR8) readonly def
+/FamilyName (Computer Modern) readonly def
+/Weight (Medium) readonly def
+/ItalicAngle 0 def
+/isFixedPitch false def
+end readonly def
+/FontName /CMR8 def
+/PaintType 0 def
+/FontType 1 def
+/FontMatrix [0.001 0 0 0.001 0 0] readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 0 /.notdef put
+readonly def
+/FontBBox{-36 -250 1070 750}readonly def
+/UniqueID 5000791 def
+currentdict end
+currentfile eexec
+D9D66F633B846A97B686A97E45A3D0AA052A014267B7904EB3C0D3BD0B83D891
+016CA6CA4B712ADEB258FAAB9A130EE605E61F77FC1B738ABC7C51CD46EF8171
+9098D5FEE67660E69A7AB91B58F29A4D79E57022F783EB0FBBB6D4F4EC35014F
+D2DECBA99459A4C59DF0C6EBA150284454E707DC2100C15B76B4C19B84363758
+469A6C558785B226332152109871A9883487DD7710949204DDCF837E6A8708B8
+2BDBF16FBC7512FAA308A093FE5CF4E9D2405B169CD5365D6ECED5D768D66D6C
+68618B8C482B341F8CA38E9BB9BAFCFAAD9C2F3FD033B62690986ED43D9C9361
+3645B82392D5CAE11A7CB49D7E2E82DCD485CBA1772CE422BB1D7283AD675B65
+48A7EA0069A883EC1DAA3E1F9ECE7586D6CF0A128CD557C7E5D7AA3EA97EBAD3
+9619D1BFCF4A6D64768741EDEA0A5B0EFBBF347CDCBE2E03D756967A16B613DB
+0FC45FA2A3312E0C46A5FD0466AB097C58FFEEC40601B8395E52775D0AFCD7DB
+8AB317333110531E5C44A4CB4B5ACD571A1A60960B15E450948A5EEA14DD330F
+EA209265DB8E1A1FC80DCD3860323FD26C113B041A88C88A21655878680A4466
+FA10403D24BB97152A49B842C180E4D258C9D48F21D057782D90623116830BA3
+9902B3C5F2F2DD01433B0D7099C07DBDE268D0FFED5169BCD03D48B2F058AD62
+D8678C626DC7A3F352152C99BA963EF95F8AD11DB8B0D351210A17E4C2C55AD8
+9EB64172935D3C20A398F3EEEEC31551966A7438EF3FEE422C6D4E05337620D5
+ACC7B52BED984BFAAD36EF9D20748B05D07BE4414A63975125D272FAD83F76E6
+10FFF8363014BE526D580873C5A42B70FA911EC7B86905F13AFE55EB0273F582
+83158793B8CC296B8DE1DCCF1250FD57CB0E035C7EDA3B0092ED940D37A05493
+2EC54E09B984FCA4AB7D2EA182BCF1263AA244B07EC0EA912A2BCC6CA6105B29
+044005DDBEAF88E0F05541BBD233977A447B469F013D8535A9D7023CC0FB7B49
+A95CD2B6F18935C37F49E9A73E97A8602C5C26EE13D7A04A188336FCAB4CDEE0
+23DE9D803FD6E8D846B3F729BD36137E834E016242CD2F7BF048959DD45AD413
+19B985D05E5D422F3D0968375EA6A90FBEBF8B42B15F15280469D69629C08A42
+1C298CC027CC288B9C984239ABB96B6A891C1360D08F9ECC22202861E4CE9B39
+8BF6B05F0B97F8FDED86BDA32D9EE6204BEE321529D58F28F7A9B3D04A4469E2
+775A8B43DF5350CA25E95F1794CEA94B99AA02F3498C608E6277595DFEC6CC7C
+965B69856CB2AFCAA52F66F5A019C999A1C79906EADED8AB0A185F84F5FC544F
+B289E583A8AB4726F9538F4DDEA903CC1E623DC5EC25CD02353A4C9A63CCB7B3
+483A481AD7220714EED8EA179FD74724C7D1F7032527E25A43FB59367B10F3F9
+4BC23E2AD9F5744EB954C8A0086C0ED51450A8EE7DCA2BC27081C4F49FEFCFC0
+DE75DFA3E620747E85ED0F66EC590FE6CE40D08497B52B89FDD0EF6B1D4C0A8E
+FB12E7A909CA56C9A44DAE837CFB4515412DA996C9E3A430D48B20671F04448C
+51A14CB5E9B2565D33A0C0992D9456F3272776BAB972E4AD37CD9538F78BE951
+9A5898C0E3F68EBE589967254EC4E10B6010E386ECF44C742D37C64502DCB250
+E9CCD2AF341A18836489360B950DAB980CB0621155E647B6DE953A6DB1AF51B1
+31375114FB8E6AC909DF17A7362DA2ADAB0DF9ABF040426957B6264BA0DF2B48
+1AEAD8B9068A3E5A4D85166392CD12ED01738931E5683E83EE999C08C54AD19D
+FAE794A00EDFFB4F430DFF757CC2163DE77D79C3F0ECDF5D42A1B079729E276B
+DC2691D6B29EB3C37824D4A5C7A452C10C98E38FBD2437BB29CB8964ECB475F1
+3DF9D1EC2F4723CFC914DF067470AB81C22F69FF0A615F693C0BF7084FF67DE4
+741E765B47E222EFEF6DDCBCC5BB5EA3FE507959AA9CA4FF0CEB615938095738
+AE8107FB11FD1C35A85721CAF2FF491E90F4F15B4A8F8CBD72EAC28909FBD231
+B0A45D94469D2C03CC351E5C4127CD2334F94A1EE91FAF19DFAD50D49DDCA165
+1CC936EAC431720FEEEC3184C1578EC4E9C6084EF6C6A30A327A455DE14E72F2
+0ADF4A1DC4232577BA25B75DAFA460FC1E018DF361AA3A8874EB6B445F973459
+83E3C1D441BCF8A100C22DD2B94DF2E3EB57C2C792A2C789137911DC67926D62
+2848C29EC41A771243F46D48FC17133E004F9DA9202364E74773A22999E03437
+1D34277B9724E78020DFE394298E990132C6647546B2F95CC2B336C40A335EAE
+85E5CE36670AA9E28C37E43AE4D5CDBE11352105A1A23B2B781A88EAE094B83F
+D9FA26C3F500B5BA7E08758777F11A110679044B09CE57B64D1EA9BD4BCB4E71
+E15E27D15A83FC12ACE44971B199C9ECF06F20DBF062B6654DC6E15DAAED262B
+D645A7B0B9F6A4159201A1650DDD4F74EC78F5EC876A1F58F351BD3AAD7C46B9
+076F73EC8972CE1DA144C78E629FA13B34AF57913B2101A4A236DDF2FCFF1834
+1C24D8360B9D8A24CE3AD889967CDE59D26511EE57B2C06F05AA04788E1231E2
+854E0A2EE1A5CC34B44547D9EBF87FBC6D1B9E0E5C0323D1BC82EE7358F247FF
+6EC3C4F7817F405F91B5AA3FAD663BA2F7E28FC7B50427449B942D0A3820D2C1
+A10EBEBAB909EC5072E37106156859B98B0EAFAEFB8E13A4EB6A1E004B525C69
+DDE72B04661C425A7E03FE440008695D45934CB6192B6A30A5CA8A3FC61D1EA1
+CC2E1F17EA42F6A562E063C2E66B90189D123E6570A485D5019BEABD9C39F639
+6601DA48143C88488B0484E823A382172B3133384336F5369928B5161B7AE927
+710CB575FD233FC0908DC203D3B9A8ADAA0F454054BD29B037F3FBE0AB0F5A50
+A3B80660E06E62CB7306FE8612909E8DF7A1CB7B39B77524CC7472B3964C7C21
+7F59E69BEB0EFB64AD1F79C38D246CB63F61BB31DAA2BCCEAFBC1F418F2B6DF0
+292B5F8A4763BD8BBAD841D0A08D3145064510D427C5978470067ED239D81F6B
+0A10477AC233C934CEA58FA051E7F1D915CCA135A0658BA7736574DEE0887216
+CA99343D134715DBD2A5C46B3BD995A4B106DFE5A24347DFE38A14CBBAE8DBF4
+F8B7F782BA8FC181C3F8FB1DEC2C706D7DCCCD97EE254FAE1A9FC6B2466C04AF
+626E2A59C8B4E96FFF0DDA9872209084296276E54C5E8BB93E043BD9C9A36AED
+2C3E82BCBECEEB0C2DE7356F71235D9CF94EFDD4098B0DA80ADEC47ADA99A946
+B79DCE7274C6DC92757550B7FBF608886D3196206A3ACAAC643395C000541E5D
+19C9EBC62BE7AF3F3F81BBCB0476BE81B2083E8802DF643E0E4A8C873D17BDA3
+76141A6F8C990869A3DCD7AB7F46C701DC92ABDF4AD9F38F01D2005415C1BADA
+9832C0888E5926C5344B85F4830C17FC928A585CC745DC25A7CEF3B4D41C6680
+219EAF65CADA5524F5FB1F09343CC28AED8FB7A164C25F9CC5E8FC6180D08D88
+509A93BF0AC28ABF2B9C27D5707C4F0188E843E3E8DC73A58D74B4D88525F699
+5B98C71A6982D6DBB65B105B2D6E65E8171D915D8A1BBD89BB160C96F478D61C
+EC0FBEEB9AF29705CCD13061097953825DA7354112DD72F1AAF30EBF508A5A02
+6C7680AC7583974BF6A82F4AB9F35260EACEC1C9036C12C88B28B3C2467E4FDD
+A22FF5FE59355DD4BFD849B5AC6C9F52DC51A3B8A4CD1AA7491E785B0DF81C1E
+33B610B2F1B3595C0D82B86789D548A92C20F5177B17C35A961F858D7DF0CE07
+CF9A957E2FE826F2C6ACE69A2082EEFD86D932C9C3574160AF7784CFA05C1EB1
+A881D7AFEB71668F1DEDA3F8055640E7CB2E7DD23139FDD37373FC6DFEA85C22
+B59330D72D6331B8A1D28A9B3D2172A177AE5CF0D22D28A1911F9F3FA700D355
+F84230610E2B79A735889C5CC591347AC17F9E65C03C0A1CDA2CEF75CF01D6C7
+C6D5F727258F499B09B0A042A97F7ACDDD7B188A5B917E3D7E7A411A0AC84F59
+B96A7DC581B81019168C31F7E5F6EB8211F1F44B785391D41E89565385D15D9F
+66FB6986A66B2460B4C8229E244A322ED81FEBCA8E2827E4A5E54236E33A788D
+0A06625F92AA6347A73A477A6A37292BDBF2DF42D5FDB1027DCBC8E481147AB3
+7779E5EF008A67808490E7904DFC740E38BC185CF0C8F0C9002606D31764AE5D
+FC5F6E9C330D43ECA95380B988084074E8C268FDFA357F7045B7603DFFC5B0BD
+01B257B0A754A14A565FA0D8C89CF7C4C9FB69445ACF7ABEDBEEC24C87E89889
+61DAF3144291D4A8E7ABB3CA95F9E89AE84649419A20ACFE872E8BF81C523626
+6CC14EDFE5565FA25E65290EC272E2DCE660A916D60C07C4C9CFBF539C7B5497
+C55F8FA22CC53374F6E07374A73B0F6F68FC0376703B6E73B319312448DD1CB1
+962E16A84A3873A322E7B3C737B42E18D53B02BE9EDB07D21663D0ED6443538A
+276EC167D6DE7B94625C6254FB5555DA81B5D6CC92191D15C002F813A73E19A4
+A7C63106EB5C5EA7BD9E1FF3D4C3BFB6265C48AB48CC4A3FBA55B0D2D8795D55
+484F3E387BB56602B8C2EC4D04A8E123AD02422D1FA04809A7F2884957E9DAD7
+EDE67F91D63FD0D73D89D9BB9126B5DF3C1C09CFC81A7C60CF6463ABA6197D2E
+CC1E8339E2F5A26569838E66E7024DE8BF50BFFA3F1E6A923D363DAFE4751B48
+D5ED2CD68C5C8F248CA0C0A9B9CE506BE17B4044FE73003395274498928E081C
+450385B2F2D9FBF91871109F137E52CCA8035C9B30D3419901F342AAB26F874E
+449F214DD406C210DCC35EA89E6A0397E5AB4725586EA12B8C10F41D292F9140
+115A57DFF19496AD04C0D9A640F7AA25E9E22A05B23C7A6FBCC115E3DAC7A34E
+BCE9EC19AE54BCA3A7FEA7AA0C23B24870FBCD9BB15AB17F7002CC33ECD6F0EC
+4D43607C98126E7FF7A59EA187F3DEF3B6B1A174926B2D0CED8159B3741C0F67
+A16AACD009847CAFAD44B338D2A4F3148D6CA437A8F7709AB4D29EFC4A37C256
+5A3A52282ED1B5114C14045D2A3806C8A7DB6854EF7E158DB4CD6C4F84A46047
+098F6158763C0049A17CFADB12AA198B74E7AB62805556BD9DB8424A1037136B
+5AE30853446E67EE01770DC8153A906FC71DE0D8C85B86DDD62E6951B77E1709
+900338A3CB40515E0636185392979B2BE52FEAC763930A99019C675FBFB94041
+DC09D119540CE689EF7C3ABA5D62573F6E4559B44F3F8AE1C3D04540525A10F6
+501588CF0897D767C84E00896EE7CEF9FE832E772AFEAC08B1700F8F54056E19
+F05D44DA94063E497FA35C720A6EEBB2156BC1D91E68101C366AA5BC68CDC2BF
+90CB15EB12AE0F234B370EFC0B4A23C4E503EAF5529A032838C87F51FA806214
+41BF8EDBF22C89F8905D4C8F7260B2269180C6E3127ED31ABD878D74EA7BDE87
+F597D440AE923A58AB02D27E349CA7CC043B946D89D81C8AE4264863989AB2AE
+5061880897F46E6CF9519548AC8A01431C746C482F4B4C6166788D372CE9C997
+E233DF9597857AF04E493EAFCE780FD229D04F4FA02CE51ACF4BD4CE1917F19D
+12C4B25B1A3575F0B41317EEA24DE1BEFDB1BC3AFD5F61E512238726E8E3A31A
+8B2F3BE79948C8B1B6CA815AEFE34B90DB93B7282C775D1FE88632A41B4FCBD2
+A05A9A04968293E79A8FE18892B806179790119BA3FE378B2AC882295A25C7FB
+59C0F458CB0FA4B103153A2AA534C24ED96976843EA8B30E30E6DB279426C24F
+DB7D8ADC3FAEDDE6F204824C5ED8A31E10FA0B8DAD46E1BDC4E80436148D1134
+09D08C56667DE58A1E78DA8103A4E9D6ED7DEACF7561BF0C85039468226296AC
+861156CB0F0FF2FEC76D2A32E7E49C48F06A95D61A2FE40F135634BCB99FE538
+1F8492A5CEAC9CD4AC76533C237259E077AF4F1F26B3D1B0EC473CD56D3BAA8B
+CDDAE26E7CEFBED818C1DD83AB0142EBB928E6FBC0697FD81B7A73B5CA05A16F
+11EC2428A8A77674D63707F0C91D78EC64F8D5F648199904AFCB27DFB49FC8B4
+CBFC4869BC0A2FCFC7AB259DDF59A941CF4A1D4AD4F451CD7FBDB168FF72038B
+F1578D89C8F938FF72D408753AD113114460BEB902B7A0EC4F37A6FE3117E4CB
+625A664D7FC480E986681C7E3055036ADB8546EAC44B5F12CB4001039A9DE56F
+A61D523DE1B0F83609E46E38CFE4146049420154A9C7C75622032404970B674D
+4F79BC99A5F3F720A45709338E8C6A529257281CC880C8C77CDD0F7E6B495D67
+AB139E3DA9CCC3C99306C3CE9B0E53D77B1A009A261B8A22B789BB67934EE7F3
+A1CA8C2170082F18903F335085FE5219EB3CD0ED4DC01C9A45426C26046219F5
+3CA60CADB58F6ADE1FEAB848184067C6ABFC365553E20960EDF70DC319FF9574
+654155F8AEFD9864A839EF5E0327291C8784AA2DADD37665FD8A2D70066411CA
+C88205E79FF0E2C2FEED0661FFD3736A81A26AEF35599A7463B9F036D6B22AF5
+A6B0C9254F72BECE010800BB32100A745954D96F9A273D5BAC6658B5433BAA80
+22B18397514F4C3DA8D0AFE9ECF437788CF11071BEDBFA9D5FCE42FB0896FFC9
+629971DF9C78E9C40B065C909971202797E90387D12835DF3D305370094E9B37
+4D294623FD09CFDEE5CA6F75827A69303D30026AB518BE812F021C7B25AAFE70
+6485201252BE6AD4F19F33A18844904890003E57A763FCA21B0744BDEE1473E0
+CDD16D4A0A20DDC9B9CCD3E7146C95696FBAD1D1426C6EFF8733219106B56B58
+42DFF423398F878930F85DA3245F6E248E98674144209F1DEFC9BB3D80F4425E
+F6CF06E89522871DAC2865
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+%%EndFont 
+%%BeginFont: CMSY9
+%!PS-AdobeFont-1.1: CMSY9 1.0
+%%CreationDate: 1991 Aug 15 07:22:27
+% Copyright (C) 1997 American Mathematical Society. All Rights Reserved.
+11 dict begin
+/FontInfo 7 dict dup begin
+/version (1.0) readonly def
+/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def
+/FullName (CMSY9) readonly def
+/FamilyName (Computer Modern) readonly def
+/Weight (Medium) readonly def
+/ItalicAngle -14.035 def
+/isFixedPitch false def
+end readonly def
+/FontName /CMSY9 def
+/PaintType 0 def
+/FontType 1 def
+/FontMatrix [0.001 0 0 0.001 0 0] readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 0 /.notdef put
+readonly def
+/FontBBox{-30 -958 1146 777}readonly def
+/UniqueID 5000819 def
+currentdict end
+currentfile eexec
+D9D66F633B846A97B686A97E45A3D0AA052F09F9C8ADE9D907C058B87E9B6964
+7D53359E51216774A4EAA1E2B58EC3176BD1184A633B951372B4198D4E8C5EF4
+A213ACB58AA0A658908035BF2ED8531779838A960DFE2B27EA49C37156989C85
+E21B3ABF72E39A89232CD9F4237FC80C9E64E8425AA3BEF7DED60B122A52922A
+221A37D9A807DD01161779DDE7D31FF2B87F97C73D63EECDDA4C49501773468A
+27D1663E0B62F461F6E40A5D6676D0037D33F24E2FAC2B0009AD3C8350CDF8CC
+65BCA87979C36D14CB552E9A985E48BE4E88ECA16DF418749AF04FDD2B0E1380
+D281BB2476BB45FF30946B247DFD7F57305FA87E50CA338121C71CDFDF927A9C
+77FF14CB4A1D6D80356FB1171ED38C37702350497B44E42CE31DB2F493807DAA
+15B887C671199A54C4C1294BC520F5538C15556BC43C9F62342B121C6DCD6C5F
+491DA47FF360201EE21C08A781ED0589A6DF91B99FE118B9B29E4F068672E52F
+1A06C514D91C4C937D4E642503392B1CD1BF5AF0BCA28EBD840AD76CC39AD7AA
+CF2C05711374F7849708E1106F88737C9AA60612D384CA8C173FF1031EBF6EA4
+176136DE1B9F29E40E82680A2CFFDC24DA05853307F1D1F6537D061EBCBCC5AE
+E6316380ECD8E63ACBEA9FD1FC28949366850AAABCBC9552CAB2CA3BB934C8A2
+14C9DFADE24D9214858B1D42B2171DB18A475AF78868C2549F19555AAB07F586
+58B28541C74E14F28B68DA42A9D46C031CBD74FC09BFEAA3AC1DDC68B7B71B81
+6003C9C6AC8EDDDC046D247A2B8AFA63A3B1BA1F12AE0B4DD07327F0138BF470
+4630E4B5DA55C194F454EE2E872E0ABE6B879DF2E87CF81F75D79F458F7D3F81
+FDB76C15EEC4125D18685E1D8591C54C0B0D069E2ED73434617B9D30E64457E6
+1542E4630E848948FF2747D5C31B9C314AE108931003DB9F76644DB43D245499
+2D28E8452E50B1945E13A5DE2A8B93523D3671D1C7ED07EAB6FFB559E5A1F828
+B22D2FAF349B40C3B31FE806595F67C5E75260514F456FA0013668D948619514
+0EFFC35C1AA131AF8578A254AE62CA75A6631489C78CCE633A3B302BFACB
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+%%EndFont 
+%%BeginFont: CMCSC10
+%!PS-AdobeFont-1.1: CMCSC10 1.0
+%%CreationDate: 1991 Aug 18 17:46:49
+% Copyright (C) 1997 American Mathematical Society. All Rights Reserved.
+11 dict begin
+/FontInfo 7 dict dup begin
+/version (1.0) readonly def
+/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def
+/FullName (CMCSC10) readonly def
+/FamilyName (Computer Modern) readonly def
+/Weight (Medium) readonly def
+/ItalicAngle 0 def
+/isFixedPitch false def
+end readonly def
+/FontName /CMCSC10 def
+/PaintType 0 def
+/FontType 1 def
+/FontMatrix [0.001 0 0 0.001 0 0] readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 0 /.notdef put
+readonly def
+/FontBBox{14 -250 1077 750}readonly def
+/UniqueID 5000772 def
+currentdict end
+currentfile eexec
+D9D66F633B846A97B686A97E45A3D0AA0529731C99A784CCBE85B4993B2EEBDE
+3B12D472B7CF54651EF21185116A69AB1096ED4BAD2F646635E019B6417CC77B
+532F85D811C70D1429A19A5307EF63EB5C5E02C89FC6C20F6D9D89E7D91FE470
+B72BEFDA23F5DF76BE05AF4CE93137A219ED8A04A9D7D6FDF37E6B7FCDE0D90B
+986423E5960A5D9FBB4C956556E8DF90CBFAEC476FA36FD9A5C8175C9AF513FE
+D919C2DDD26BDC0D99398B9F4D03D5993DFC0930297866E1CD0A30EB76029337
+900ECFB1390CA5C0C3A04528044F266BA17BE487C79B94FAC6D6484684C5BFEA
+87BCCC77D40AD11552035E95E3007126418ED49B68468B38A14E88E68A267B98
+076F1C9769A5AFBC285E5B158EAC9F926F1D6C0B8F1D57D9C31D25AE27123518
+9D2CD92E5689E0213089BD268DA5E47525CB8EABAA4B78A15AEA34705889AB3A
+FFB8953B5B3482E52BFA0940630ADF8C0AC2177D907324299EE980E850F203CD
+B627962F43D5A678C44243CDE97853BDC6AB45FD5C09AD274DAF89929F583CC9
+CCC24BDFC68B92111055ABA5F26D2DC67C70906F71C2957701D65AE746A60C30
+40E6CB24B97FCDAD0487AE38A201FBF0E41BABD2181981A71940F1E707F91E5D
+C8CA50CB16D8702D188E56D014D92F76CE0B52ABDB9110E32438D2BBF3E6A40B
+7B005F10BB437812CAC6ED2996F7606DC962C4FDE207FF322782C343DF44CEC5
+FF06A55C630C20E9AE1B0D1C5673753C43BA0767D65D1B451CC6380D8BB3C4DC
+81E8FD8AA79BE993218686F29D3CD925566DD587F541A0DA1B1CC3BCEA2E6C7D
+5E1016F6917A871F1BBAD96AF9E867735017119A381FCF33EB2D3E1E7093FD90
+CDB0CED4818CFD9E201A03430CEC713620BE0D3254158931FB657C6877C1B3D2
+24030F377820DA58F4B95CFE645109F3F1B80DB5FACFD7D05AE2909EEFCF95AD
+9CB286C8B6C075CA2267C101B736139863186C193E31085E7C9FD88EF8BBECE3
+933542C85309013325B4BBFE9A5B606780C8580ABDA2F5D0064EBFC23939B307
+08568C3B7F5F053BF367DEBA349FABB9F760C44D100BDEEFBB01F27BFC61FCD9
+3BA0C4AE0FF4F03CDB67A59BF0FA3EF565B71B6B46567F47386A37B73DC3EA3C
+83D600659CBE5CFDC9B84CE11D659D83352F5B6E9FF599E0E25244709CF94999
+F4490F79C766FA55136CD85D8BF793202FDD810A61844BCB7ADC5736C338B72E
+F6B6EACF402E22501162C7B985CABBE5CD653BD4BC882F3CDA306B8D82F8C256
+D66F86BB8D800556AD53683E35812ED61470F11E8444F0A97CA096FA37EE63A3
+BBABA37D240549D95D6FAA5EDE9867EE2CFED7EF929B833EADEFB9E4E9DB19D9
+2A013D3884F1A17AEB95D189CED0F4C80FFAE18F71733697202DDC4ACE91E6B4
+600332FB49F953444AA7005E65DA787EE3953EA2B0B928726553C7EC1309C5FD
+7B0B7AAC5BD4E2535866540043F5F6815D7171AC447EF63D8B79471B41F50C94
+7F405419204A80C33463AB00205F51545C7C6C723505DF68238D2591C25B7627
+7FC0F4A215B2F8F225A11763A97BC2AC25E060ACC4D3D6D3DE9065A8A2197F78
+EC0CDC9AB6036F8E6E83D0D099E78029C5A755C00A5F24B5F6EC435558707430
+C6C966526F7ABB1CD635BAF4BFD9904282239A224EDAD8330344A1796FB18580
+965F34F885F28CAFBD5519411FC833A319F8265B8E9A97AE064B1364B9A5A3A3
+C59E19620A53F82B108D9C48FD240A5252D2ACDBF4498973E31C9FF3AD4D943D
+01A6F9DEDC0060E9AA8EC38DFBEEB5A63DA4A6FC9981F3ED71818C4F3BBCDD6B
+4652824691C369D1052801AE761EC8CAB9EF46C6F820F88874B1ABB8FB907C14
+03C8990FD8106C3DC14882C3F651BB89B9E479B7ACBB958E39CE4279F8173F2C
+50369D3EC79B5679E8D3BC42B40C896B2A73180E94302FFE0AA5A6D6066CEC3C
+116115189CB0FE5B0700E898D624CC772E932B4ECEC87AB7DF9B71471ED7CBAC
+B8BA84825E9B2F69040D31CCDD677BEA51C6B718E2D1B86F718E3E4F05F1FA1B
+5B1426412EC3539F5499D3F31C78CA1F8C72F2E7674286A9F9B20871A0C76CE8
+E89CA4111EF6628FEA6FBE7D20853111EBC40167181B8B5D97391502C960AD15
+596D6B0D81F3B3E92A2386D378BC5B236BC35941963E587A08EC126F7EEEA860
+89CB644FAC8E77EACED049D7EE276760AAAD684E68D0126C7D22F180A132F942
+5F68A03E7EF07C70B50DC802FAA05BCF9E2EF3FF8B3D3F7C5963C4DFBEB9D11D
+899AB25979042DE940F02561249269A038B76EBC29ECCFA0D44C055319F4792C
+2B7B4CC47AEC4C83A349F0F3B281BF62B62DA0FB0D8F24A8CE1F73024815A802
+E08B9BFD14ABD611C7A9F764C5F91AAB5BAF2A2E46FC269495B2366129E3DB47
+D09E707549900C0D1578FE601E8EB803CA6BB80CC5A488F9B7F1D923DB5D06E3
+BF1E03DBADA701639A21B9CDB67BA8BF62D308DB4C460DAF18D4622AC03912B2
+4D904D416FB927600B42F271DE15F7286E52E53DAD4F2CEFC545845E1B7AFF3D
+8B25FDBB6E7215769E4225DD284F6D37C785FDB0C7DF182B54C443100EC58DFE
+18164FE653B9E5977148A6BF77BD089EEB8286024A719DB721F5D9EFC46E1DB5
+DDEA3CD883169686F0534B35EC91BB2BA6971F9FF44E8691A9D8C8E8C0262A6B
+F20B1497174C8A8FF6B3AF1323C59CBA4E3489BD8527FEA652B404AB552DBAAB
+F5FBC44D7BCDE495895A50516C6E9A10BB8691DBAB29506D703167134D567F83
+951418F611CE7323659EE60EACC8000F6BB0F7440C65BE980D82752CC3823169
+D2C934514CAB71FCD8C8FCE139BA03DB6BC7B9557E7B0BDC14681FF3370ED2EB
+A1B9C315C03528AA381ECD389EB53833074668FDA5DA2282E7E4433FF7B94457
+C3AA2874BFF73FB21A55441D3DD11489B5E0A4E8946D3F273EDF5A845587A422
+1915696A0D1B7C8CBCE3D3031A69DB3101AE7F547628BFF38D8E383DA16B52F0
+3D42676AB459769F2BD50C8F3CE7A6DC0430AC385636087783E98E6A4582291A
+F34E3F6120E5E2282C765E97F8A99EB922BE98FEFEB86587C63E9B10399F00AF
+CDABAFAD8A1EE367149C4618582BC85DE5D57FE6B7E8254E8B9ABFB9F4AB8635
+74A449F2AEC35A84ADF4ECA4940AA2AF136DA60EB8797EA726763974376893CE
+8F799E1F75FC012D4A41BD5A9A766CF23BE98CA3D31DDEC59F26E9E6531A3BD6
+3F4DEC954168D0CE948329C0DFC1F212F781C31F84484EBE4ABEA55923C9FBDE
+34BE6DC02B1A9E0EA6AC9F0D0710B0E88AB7E6D87534522D98EB39B41DF9D960
+CEA4A65D6311C0AAA6E189399222ED5B2F1728C7218E45E49923445FCD858633
+C8019929170C50BDF8411822AB2759A3CB38908E1CD5598DD89F68DF0B905204
+030F15C16AD938DB3389026234AF4B069B9EDED52215AA2B21AC72D505F1EB58
+88EA6D61E815EBD83D1BA7A6DED6F45A8F6AE0039AD41C88C4049299C1BEBDFB
+A464C2F55EC061926DB93DFCFE19A33F9EDA3971FF1681FC001AD37407FAACC4
+56CBA2C45031ABFB1E96E5AE1F7E4645FB6AD13702453FB79AAE8EF6B5D6CA9D
+1B3A37D4E80E9ACE57BF6249E3D1DF36945D9493FBF83AF7BB9F038AE96D364D
+73C2120587CC6AE260329F0786BEE3F282ACF41FD7DE5BF8E7DCFC3DB19E09B3
+85CDFFC5D9608B27F6ABAB2A0CD25FAE183D06E7E55C002B3A9200632DD9D964
+E8109EAC946C4C272006CDBD6CD8C2EDB0BCCEB7C5C25C9B6C7D881794533508
+2029A936DA935A17802F2EB438B5425CEFB51CEC94A7AB7A1558F0B132F57DB5
+ABE34B5ED234DB394D5764816730714AE3AFED28FF069789CD75B70CB7ED1C7B
+1D9F547BF6223C89F97C62D1DB03221A7984620DAF68EBEB934E2C1EF4E99038
+0BC9DBB60B893F8078480F5BAB81A981F849FBB8B6E9E64589D4BC777A493B08
+570577F541BCA84CB0AAFAD4DEFECE229C7E507EE332EF7C2335E6DC0EB71F79
+38EF17EDE68309834527EF9EF92C61922E5621184D850A97437332FB6CD40123
+C56153CAD67A63654221BDD5F3D04EB25D370A3CEF597D5EC664831DE2DF99F8
+CF42B7E665850C30610E9347AF7A8B2D2F6754E2C8807CA049253949E63C0C9C
+68FCE32046493B2E9E1622AC65F30AD17CBF3984F2DAE2B6D115D08A23B0B2E8
+C0568E23543E93C7480C9D73A7062B12F70F0A556FD197B92ACA0FD60D157236
+FAD51D36A8B8D1E81C768A88B2E9676E453F89231DE805877EF9A71B1AE80699
+1CD0C463EC1596B32B985DBFA9725AB31D23C40012B48BCA5D992961C1FED5EB
+BEFBCA7952AE46892A1DBB8C25DAD22CAE4159CC9B9CFD26BC91EA9E4A8E50B3
+6B04B3C75398E4B3038BA8DF88C51404E52EA5E9BD6E87F35F37296BFBE0BEE1
+07289BAC29B72510F6DE0219B636008F9D506249FED3D58B33CB47F9754089D8
+477B55E61B0FBFC7164B40B2FEA4E45F9966FD7BDD758B24BDE96D7E8FC5EED8
+9FB91D03A510EC8D2063C914E227497A4252C00554D745D35C7E2E59D4A03B9D
+66E72D62597C1FFB8F9A5889C1766E6701788E8383A0F9287CCD75E72EFF20BC
+702B606314BAF95676FB696302D25F1B1BF9417046A37D53858D2B8A5A3FFEE8
+FBC245D6F93DFA01460F98147E2D159D09C62E76B67E51383976C7CE861D4041
+075394791016B1EFB6429B4FB930792939820AC1C553F2B3E6691E09F0632689
+F59A1A8838AD3F8F758C0B79D5DE4BEE864633264BAF10EEE0E6D501A5EE9EEC
+3750CD6C91FB9F7E679A0B02885E8437764797BCC0613905B9CDEA87918D9E31
+EC63F4F1464DEDE470C527174B079979085BC03430CCAC7A92F7DF83DA2DECE2
+D770949B3F3FC1012C1EE7531E8637533507AFB20869F1323EB98406D8631E5D
+EDDDEF57DAE60EDB26BF66DAB185616D4245D0FA92A314F3995E8C7261443165
+A81E250357D84A0642395D09A017E324A381048D8A9AC7D42F7D1DC471252E26
+DCFC25EAABE8C12E59045C0BC2F790C8C71A7BB6C0FAF914940BB78310C38A52
+74A6A3D3B19382171B8E7AF8A9CAE10512E942D928A52F10D4134FB66C60A915
+FB663A6BE31AB27F6F7AF2F121FB6BF1AB79C76EEA3BBDCA392F4EE64DF93EC4
+AF5D2528E66ECA77E134EC3D4368E0AD8055D782D5BCE2E43F5830F34AD1D64B
+9797DF1416046326290DCEDF3EA07175381A8C1D268B5A6E7C7C864AF59EE9A7
+1E1042EE5F23D303DB1B0A940D7C40950B4F7C60A78AE637
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+%%EndFont 
+%%BeginFont: CMTI10
+%!PS-AdobeFont-1.1: CMTI10 1.00B
+%%CreationDate: 1992 Feb 19 19:56:16
+% Copyright (C) 1997 American Mathematical Society. All Rights Reserved.
+11 dict begin
+/FontInfo 7 dict dup begin
+/version (1.00B) readonly def
+/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def
+/FullName (CMTI10) readonly def
+/FamilyName (Computer Modern) readonly def
+/Weight (Medium) readonly def
+/ItalicAngle -14.04 def
+/isFixedPitch false def
+end readonly def
+/FontName /CMTI10 def
+/PaintType 0 def
+/FontType 1 def
+/FontMatrix [0.001 0 0 0.001 0 0] readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 0 /.notdef put
+readonly def
+/FontBBox{-163 -250 1146 969}readonly def
+/UniqueID 5000828 def
+currentdict end
+currentfile eexec
+D9D66F633B846A97B686A97E45A3D0AA0529731C99A784CCBE85B4993B2EEBDE
+3B12D472B7CF54651EF21185116A69AB1096ED4BAD2F646635E019B6417CC77B
+532F85D811C70D1429A19A5307EF63EB5C5E02C89FC6C20F6D9D89E7D91FE470
+B72BEFDA23F5DF76BE05AF4CE93137A219ED8A04A9D7D6FDF37E6B7FCDE0D90B
+986423E5960A5D9FBB4C956556E8DF90CBFAEC476FA36FD9A5C8175C9AF513FE
+D919C2DDD26BDC0D99398B9F4D03D5993DFC0930297866E1CD0A319B6B1FD958
+9E3948FFB0B4E70F212EC976D65099D84E0D37A7A771C3101D6AD26A0513378F
+21EC3643079EECE0C9AB54B4772E5DCA82D0D4ACC7F42FB493AA04A3BF4A1BD6
+06ECE186315DBE9CFDCB1A0303E8D3E83027CD3AFA8F0BD466A8E8CA0E7164CF
+55B332FAD43482748DD4A1CB3F40CB1F5E67192B8216A0D8FE30F9F05BF016F5
+B5CC130A4B0796EE065495422FBA55BEE9BFD99D04464D987AC4D237C208FA86
+0B112E55CE7B3782A34BC22E3DE31755D9AFF19E490C8E43B85E17ECE87FA8B9
+1485831624D24F37C39BF9972D74E6EC4784727AC00B9C4A3AD3DA1C22BD6961
+7E0ADAF55422F22ACA5E4DCD4DF9FCD187A566B7FB661D0530454D0DD6C6C50A
+7A3875C6CBF8EC7769F32A1F3F7FC1C072BADEC97794D4E90E0035282A170402
+356E5A9CD9ABD80AC4342A5283E458A7269252F4541CBB6452B39ED54D336D0B
+19928E9CD1AB26AD83EB209E2EC75011A2643813053B5DBB0246097C4821B5F2
+C92554E9140BE35B2DBFCD98809A8EC9FC910FDE9E0D86457C70ACB056EBF90F
+244DC0A5BBD455E15D6E3180311D52CF50B0BF7D0A7F64F3A1821E0AEDBC2E7B
+AEB549FE1D51088C153799C6E089B5D5D65E1C4E2D2B430CDF1FFA23CCB25D95
+5C43C8942435D0AAA3D9055FF808F2C3C887A3C469BBD98F026D0A59E26BA9F9
+C2144CFE49A9AD892D4D31764F0AE3A10644AE3966B0A790684B14D11FA49785
+EC5565D2B2E584CBFD85125F3FAC133338DE35361943DCE9AF05FCF2840CE512
+998D42CBEC52B57B79DD63F00985881E8463396ADA47189A94DDF951A78866F0
+B8A3D9197E39335277EF2294308DA70065D910943A34F7D5F2090FB4AA42ED70
+CBA469A9F64B95A6FBA4BC89DBC93765E3AE4723162DF3F9D6BDE77DD5870ADE
+C8900D6346957B84C3CE88A8F9A12D46B8FCA50DF4433B0B8AED6A63B3DA102B
+6DF94E62408E24154BAAC66B2B249C695BC0FA37A28699D9C0F3EE94AA32E3C5
+8F8D7F803B5D25014D43A353D719B14B247A87898A960DF68C0C0BAF70C83917
+6E9F7B3ACC64DBAEF3FDCD3A80C0AB907EE342E543D607556CBE5A9089B86D1D
+E768F27D74A613F3ABF883222A8596B542EBF54E9DCE327B5682AEE5F6BCC38A
+2A052EC4018AE3189DC1963BA39ACDED8F0C60C83F8873FBBF0302010956C520
+A7F3F8ECD0F177EDF5F4D5522C5984A3678FF32EEEB570B69C142AB89467641F
+917155D646DAF3352E27BF2AA0746E062E48532256AF364EFC0F0AAE376E624E
+9AD3584A518EC3FAF11CCE2A784CACFA20E5CC2C563F050108E5A31F24C3CAAD
+39530C986207419E06D062C04A796866A389937AE12ED688151DFAFF76CFD9AA
+3DADB718D5F830EA5375F84DF1B5E19FEA8EF52D1331E2BF8DD5BD46823BECC6
+EFD148B90FE1EA1C926BA53E29006669CD65F2B8FCF8777C8A08C4129AEF556F
+823B417C1EC60D4D21DDF63AF64FF17AE30B25E7056D40A9D0B4EC3CBEE5AA29
+9F5325AB65F2D0430631AEA89CFFB2226A629CCAF7531010DFA691A870B11EF9
+9C2A14F7B974FE6AEA62166984E6BC9BFEBE3043876197DB36A0681E77916977
+A02E621F35ED732834D4DF8CAFFB0A66CCD1A00F744C3D7942A56B2CEDDC4A39
+6C401F31825A8F6A6B701F8A936C6239A46F05EDDC26EF113D85A2735ABCC8CE
+3A610C9CAB64105D274753360D39279E773A5275721816E6E90029081F401732
+3E3454BAB1BDF5764E24775007201E9E1F1B4637ACDAE0C1CF1F9D4E9E138FEA
+3475AACFBD9577A7642DE946E674104CDA673214C5C471F0428A288C3EF70F77
+1588D718076816F0285AFF8B99B7E67C15F9A2D1713AAA308517A5BE32B913E5
+5B79654AFF3B1477BB62E0A2ABC19A8B8630F1DEE1CEFB1B0DFF8B7AB7A2F83B
+5034ABB0A2ADD6EE05A65A4AE3B10532294636722DA7050502ED45183CD9B6E8
+46962E396F3651909C0834A863A42CD67F8B2B728116C04215A66C8AA2E9B544
+CC29B88F87E3F0B1D90EB59B1D1DF8527639B04E26968CB432D00467BEBB6425
+BE3259999F836D20FC9A1AC63128F6FBF55DB8A5548EB9E005EA2704B3890DDA
+E1E13B526436C48CB86DDAAE2DAE2A44F6C4DA89423A78E2BE66B1DB4644F89D
+5595DB6DE697477049B8BB9B70ADD0A8B98EF241F29D13931D766FD7828477CC
+43552BA4730645EA9DF1C81454B8A249DE76A2E8149151E06A913A3CD6AD003D
+07596F163982A0B61332B160F6326B8B6AB35165911756703A7FA51DE3F501F5
+452A332D0BEA905E2CA286A8D89180EA19F7F9A3EFBB039E2F6B094E28B2F250
+29498F6247C39B03A584931B476385536EB5B6EC4AD830A03342B04903E507EE
+8E8FD5077875C4F796982EF26EACC99723DF26B5BB679A6E09C02A8EC4B19B40
+D8C2580B4498138FF17D83E27B09A7CD31444E0ACD690FD079DCA6B96D302AC2
+1BD12425B5C7B1E4F342D6B8BF9F8BCD7FD798D711A171E585F98362E3C1E099
+3BBA3D27AE611A8FDA9BAD5A3A5626B394676E6EE9BC512E49051A20C1C68366
+B68E65CA1CA19AA94B9255163C0239A1FDA8E13B6552967E6631447CD24FCA8B
+CD13CEA20CE893439B2DA75CA3F6F045C717F4E77ABF30EFDA7A6D5AAB19B574
+F4D9F6067A9DF203AD7F413BEE2D6A181C30072A0984D7403FDE31D2C67AEFE5
+70F4C9A72111808B5FBAF3FA5942DFB78A4873C7DC2F3124B1480D54830A87C3
+41B7E2C93075D463D4F5387355BCEF0FC770DF544B64D57A6462FA93B392F764
+684AF3002D6553E550BEE1D3D19FDF7E52FDD1C844F28E259B94A70333A6F691
+B3FAB06CBBFA69239700BFADF0DCA7B045EC531329B7F2428AE94C525FF6D2F0
+C31BD8BCB343E515E26E370BC857B6C1611B51884E468777D40C10631DACA065
+D35B0C058863E32E406F467029B99359116E1E27ED260DDFC920358BE0D55434
+890BF7EC1AF88BCCEE677B6A2E187E9D95F2ACCD8FE60ACDC09E3FD9A86171D2
+76B3A03012676CAE235860BF1BD6D036F8F12C13005F02B4386D345DC369A46D
+0237009413968E46C9C7316E3DEFB1DD5BD26D6F3BEA477C00D78BC2BAED119E
+372A67B5EAFCDD31DDC76E0925EB049432B306F0EB8350215B532360227170A0
+42C352ECA9023B67371472D74334F658C7B72F3DCDB7C2C7B4151634DF7B9ED8
+54E890487FCDA8D6205AA6778654F1FF87373C4DB6D56B51BF3B92A28C1968A1
+61C3266C66D5D2DFA341AEEBC12B1F5FDA92E58B721DE0714F53ECA05B15D7D2
+61C3EDBA7C1A2E0AAAD90035A5789B9B893BE52B734551707A92337FBDB8FBBB
+CB4D2CFC01E733C5ABB75632D92A204716BC1ACC31CA8F905597F35668AE6D5C
+54AB11DEC823F3F6B1F8FF744F454F2D5083157939A3FF1614D091862D6F9DC6
+38B007C3B968EBF674E224E1E20046E15AF1DAA96471A61114B9C5BB4E876808
+630B4F79AC2B85B1D0DF587DACBD9A55FCF2B05CF4769547E5B793BA86E7B150
+253D1547EBD10FD4529B6FE7ADE487B9736445B32BFE539BDFFADF3CDABBF446
+
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+%%EndFont 
+%%BeginFont: CMBXTI10
+%!PS-AdobeFont-1.1: CMBXTI10 1.0
+%%CreationDate: 1991 Aug 18 17:46:30
+% Copyright (C) 1997 American Mathematical Society. All Rights Reserved.
+11 dict begin
+/FontInfo 7 dict dup begin
+/version (1.0) readonly def
+/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def
+/FullName (CMBXTI10) readonly def
+/FamilyName (Computer Modern) readonly def
+/Weight (Bold) readonly def
+/ItalicAngle -14.04 def
+/isFixedPitch false def
+end readonly def
+/FontName /CMBXTI10 def
+/PaintType 0 def
+/FontType 1 def
+/FontMatrix [0.001 0 0 0.001 0 0] readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 0 /.notdef put
+readonly def
+/FontBBox{-29 -250 1274 754}readonly def
+/UniqueID 5000771 def
+currentdict end
+currentfile eexec
+D9D66F633B846A97B686A97E45A3D0AA0529731C99A784CCBE85B4993B2EEBDE
+3B12D472B7CF54651EF21185116A69AB1096ED4BAD2F646635E019B6417CC77B
+532F85D811C70D1429A19A5307EF63EB5C5E02C89FC6C20F6D9D89E7D91FE470
+B72BEFDA23F5DF76BE05AF4CE93137A219ED8A04A9D7D6FDF37E6B7FCDE0D90B
+986423E5960A5D9FBB4C956556E8DF90CBFAEC476FA36FD9A5C8175C9AF513FE
+D919C2DDD26BDC0D99398B9F4D004B836D34E88C20EEB527CE1124209388A2DF
+E27A8DF298A2693A9D529916AA0B2176E6ED237F69D84A8FEEB36861D1847207
+BE2BD61C6A412FFFEDFF13AFEC32AC7735BCCE5965F5966418A62ECB99112AB3
+3BC938EC590FF6922659125EB67E260BF02885E49BA6019E696D33F0B53606A2
+F515E0C45F323311613A94B838491BAB9FE230C5CC79D22925E3D882799F2707
+C32975A494F0F9513E4D8332E7E54470D9721FBD345CDBB48286F2F19CC6D66E
+BB631DD6476A509167A49CA525A72CA50E82C1D08C2B372DB54C5949C753B632
+2009B761EB90492ACD3CBE6A35CE1B66F3BC4D8DC36827CE4261A703328451D1
+879438479917C1647772999171DCCF1491A1C9086E0C6393506768F8757BD81D
+141C46EB9BF507EEC29962A0072B6C5D8C8588F3D68886CD2606DD3BD2FECCEF
+63245494E93EEA12AAFB06110E54ADC444C7E7619627A48A464394E5DE06EB46
+4C76A2FF010318BBE48B3776C826A265C66515717F7F2E943C60EBAB23D96B5B
+FD514A1C4E79BB3D3D2DEB936F90CD3FABF7B09FF7F564AB5CF4AF6A40E869FD
+395885A88F4A138B3CA6943A2D430BBE43D91F7F17621CAF52FB7161DA3B2003
+82244FB6EE792DCA1722C03392C296C029A2DCC5BAAB3EA03F8DEB039DC83AE1
+763AAB84776A2CCFFAE9EAF0BFDAE417E8BE682D237FFEDAF224AC09C9665019
+165CE32F5349E857177D94AD6396570932E1657ADE4D3FF57A3419946CCD210E
+57E5A1D91CF708395942527D127606350924D71BC21C6F969288B1C8CA3404ED
+E6219985F7301A20621368F74747EAD38990A4C9F2B62913B8FDB93657409FF5
+178DAA7C97C35EAFA47778CE03E863303582D8A9900EF4F8DA879DED54BACD7A
+4A50C18AA2ED906FC4DC073B1E6CA1E3855AD5B7698EF4A96B77DBE19A12382A
+CFA8717DE230CB6182F2250885B8E90AC42A66484A7B527061B223A6D1CC72D4
+890359E7E04690BFFA99FAB5CC9999F0873A9DBE49E33F79E483FAD72313DF9A
+7B7D926461988C23CCE9F71AB7BB63BDB2B10B3F78176380AFFC154825C9BDCE
+82303FBFC3B59E070438984C28D12E8655BBBF049125BF56DD2B0DE8C0450E55
+82832DA59EBEB001AAD86F2317460DD7ED264611B9043614221ECF
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+%%EndFont 
+%%BeginFont: CMSY10
+%!PS-AdobeFont-1.1: CMSY10 1.0
+%%CreationDate: 1991 Aug 15 07:20:57
+% Copyright (C) 1997 American Mathematical Society. All Rights Reserved.
+11 dict begin
+/FontInfo 7 dict dup begin
+/version (1.0) readonly def
+/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def
+/FullName (CMSY10) readonly def
+/FamilyName (Computer Modern) readonly def
+/Weight (Medium) readonly def
+/ItalicAngle -14.035 def
+/isFixedPitch false def
+end readonly def
+/FontName /CMSY10 def
+/PaintType 0 def
+/FontType 1 def
+/FontMatrix [0.001 0 0 0.001 0 0] readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 0 /.notdef put
+readonly def
+/FontBBox{-29 -960 1116 775}readonly def
+/UniqueID 5000820 def
+currentdict end
+currentfile eexec
+D9D66F633B846A97B686A97E45A3D0AA052F09F9C8ADE9D907C058B87E9B6964
+7D53359E51216774A4EAA1E2B58EC3176BD1184A633B951372B4198D4E8C5EF4
+A213ACB58AA0A658908035BF2ED8531779838A960DFE2B27EA49C37156989C85
+E21B3ABF72E39A89232CD9F4237FC80C9E64E8425AA3BEF7DED60B122A52922A
+221A37D9A807DD01161779DDE7D31FF2B87F97C73D63EECDDA4C49501773468A
+27D1663E0B62F461F6E40A5D6676D1D12B51E641C1D4E8E2771864FC104F8CBF
+5B78EC1D88228725F1C453A678F58A7E1B7BD7CA700717D288EB8DA1F57C4F09
+0ABF1D42C5DDD0C384C7E22F8F8047BE1D4C1CC8E33368FB1AC82B4E96146730
+DE3302B2E6B819CB6AE455B1AF3187FFE8071AA57EF8A6616B9CB7941D44EC7A
+71A7BB3DF755178D7D2E4BB69859EFA4BBC30BD6BB1531133FD4D9438FF99F09
+4ECC068A324D75B5F696B8688EEB2F17E5ED34CCD6D047A4E3806D000C199D7C
+515DB70A8D4F6146FE068DC1E5DE8BC5703711DA090312BA3FC00A08C453C609
+C627A8BFEF75B4DEFAF34B44B356A516B765AFCDD3F5475B1F928731D09D2170
+B97E40F12CCEDF4F6BB3756C4734F6E98D74B7E942A954B1BAAB83D4AD727FF6
+DF6DC50B2223BCB5568A73A112E4860AD490554E64E780073FF3399CB4688D33
+9E8829667CD6EAEF25E0C7D2D44F2BBFA40E999325F9561514844221B50BC8FC
+4C7AD68CA7220D69125C2AF06849A3E068D18733276F0C0A6A2936D3C2C87CDE
+59CD1AF148C44F85784A5DAD569F5FF53C061056C067CE29AEF1E3BD1FD8B0B8
+71A0A638CDAC6AEEDBD5337D4683C084BB60B1859E600F59CB4E19C5FC5C6327
+EC544A68134496A9BD0B87D83AF6FDA3CB62FBF0B54FACE1F0E6A2D84B467AFF
+0F62DB
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+%%EndFont 
+%%BeginFont: CMTT10
+%!PS-AdobeFont-1.1: CMTT10 1.00B
+%%CreationDate: 1992 Apr 26 10:42:42
+% Copyright (C) 1997 American Mathematical Society. All Rights Reserved.
+11 dict begin
+/FontInfo 7 dict dup begin
+/version (1.00B) readonly def
+/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def
+/FullName (CMTT10) readonly def
+/FamilyName (Computer Modern) readonly def
+/Weight (Medium) readonly def
+/ItalicAngle 0 def
+/isFixedPitch true def
+end readonly def
+/FontName /CMTT10 def
+/PaintType 0 def
+/FontType 1 def
+/FontMatrix [0.001 0 0 0.001 0 0] readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 0 /.notdef put
+readonly def
+/FontBBox{-4 -235 731 800}readonly def
+/UniqueID 5000832 def
+currentdict end
+currentfile eexec
+D9D66F633B846A97B686A97E45A3D0AA052A014267B7904EB3C0D3BD0B83D891
+016CA6CA4B712ADEB258FAAB9A130EE605E61F77FC1B738ABC7C51CD46EF8171
+9098D5FEE67660E69A7AB91B58F29A4D79E57022F783EB0FBBB6D4F4EC35014F
+D2DECBA99459A4C59DF0C6EBA150284454E707DC2100C15B76B4C19B84363758
+469A6C558785B226332152109871A9883487DD7710949204DDCF837E6A8708B8
+2BDBF16FBC7512FAA308A093FE5F00F963068B8232429ED8B7CF6A3D879A2D19
+38DD5C4467F9DD8C5D1A2000B3A6BF2F25629BAEC199AE8BD4BA6ED9BBF7DABF
+D0E153BAB1C17900D4FCE209622ACD19E7C74C2807D0397357ED07AB460D5204
+EB3A45B7AC4D106B7303AD8348853032A745F417943F9B4FED652B835AA49727
+A8B4117AFF1D4BCE831EB510B6851796D0BE6982B76620CB3CE0C22CACDD4593
+F244C14EEC0E5A7C4AC42392F81C01BC4257FE12AF33F4BFEA9108FF11CF9714
+4DD6EC70A2C4C1E4F328A1EB25E43525FB1E16C07E28CC359DF61F426B7D41EA
+6A0C84DD63275395A503AAE908E1C82D389FD12A21E86999799E7F24A994472E
+A10EAE77096709BE0D11AAD24A30D96E15A51D720AFB3B10D2E0AC8DC1A1204B
+E8725E00D7E3A96F9978BC19377034D93D080C4391E579C34FF9FC2379CB119F
+1E5BBEA91AE20F343C6420BE1E2BD0636B04FCCC0BEE0DC2D56D66F06DB22438
+452822CBEAF03EE9EAA8398F276EC0D92A7FB978C17805DB2F4A7DFBA56FD6AF
+8670EB364F01DE8FCAFBAF657D68C3A03112915736CEABAA8BA5C0AC25288369
+5D49BD891FABEFE8699A0AE3ED85B48ACB22229E15623399C93DE7D935734ADA
+DA7A1462C111D44AD53EA35B57E5D0B5FC0B481820E43222DB8EFCD5D30E15F9
+BA304FA879392EE0BCC0E1A61E74B3A1FC3A3D170218D7244580C7AA0DC65D19
+741FA5FE6F8CBF60250ACC27454BBF0897CA4B909C83A56672958752ED4B5E79
+E18660764F155E86F09EFA9F7685F2F5027EC85A775287B30E2069DE4E4D5712
+E7D033481A53A2702BA7542C71062173039030CF28D8B9C63B5596A9B42B33E7
+D922944A38713383D3648A4AF160A3B0C8F3379BA4372BE2E7EA49AABA75AEEE
+C5DDE1D8BF68483C3D21271280ABB91D54CC819680322EAB72E1250A760BC8DA
+726405EFE420635B5B7F0B48752C06083E92BDE06401C42A2C528C8A60381227
+CEBEF0C9440DC034DAD9C19FB27A350233112B0A339366B7373CE058456E0E1F
+139936F6CC9B50441C2F5994977426AD7DC8C717E737F8C201EA55AD94908336
+FFE9568C0E6EF3202D8CD7B7A6CC203EC601F9A7E2A4395ABA3406503DECAC56
+B03219CEBD0E465EA0F635F26D984F5942E4FB186AB874F3E74CC2F2E378BD83
+57CD1B63C9DE9963587B7457D56024D95645ADE0D95DEA748A6ECC6809C2A7E8
+6A568F83BFB184B31349A771DD72ED3FFE8D16E3138EC49EC6D7524E611331C6
+DB2E16059C9A12512C7208E3B30F04273E20BAF41EF8C96BA4B17F31572BDD15
+3FB7D15CE31684D721083208D7698A31D07160927C9A7CF8B7EBE81A83C0BD46
+9CA06245FDA37F0F2DF7948A20D121660A73E079F4ABDD8F90367BDBBA323957
+062438FF3B28A3880380CDC76A055096D30FABA4AECAF238ABC2513F089A6C4D
+67EA0050A34F5DBE5FE32D9E75E67F4C87AD8115DBFC00124DB4D3F4CB62CA02
+59BFE46E90DE9ED306D6CDC51005C233BD39F41B264E2892AD23E8F93C8C61A0
+B5C5CC1021411DAB515039DCAC06E1FAEFA259E6AB07135CBB345E90E2BD64AE
+37B9A46934BEB383D3AB1787A2656FCCEA6467ECC2582807E7DED181C53829A7
+1818C3FB17567D81D1A833E0559798D06163781D7895C31B1D81CC439AD51CA0
+5E33E96253064B684F3261EF86AA8452B32E9C5907153BBD692BF8BD4AC45E3D
+7161488C716CEFAA695877B03781F64840D49C9C1BCE9D5E759BF1812712F2EE
+054A34F2153AD6C953E795B6F40AFAB115C5FCDD1864A85C1AEF5DAF40337068
+08730BA7AC580213881F8AF1F76FC830EC76BE4CE6E090A1F91618595AB6D1FB
+A885D04A4E73C9C7A923D813275810DD2B2A3AB4FAE4BDA24FC170A4BCF46E05
+572529A19B09E5ADEAADD071EAC20C5DA884C7D414F5AC5206E87E53989B7378
+BADCEEC6FCDD4B4EA03EA994FDF6A80A2E232B1A007B7554471FC1DA24901896
+9CA84283A02FA1D9176026BC1529147F19D07521A4997B70258FFC03821EED0C
+D44BC9C2E67C3CD9971954C58BF1775D61115B75E26AFCC3B7CE6E5ECB8CCDFB
+640DE440334737D63F539385F83BBF603B631AB2F750DBAE707F5D008591A05E
+9D532C165FA35B580D690138463047F77F10FD4FDC8F724367545C0F5B6AF978
+B6AFA49624EC2AEBCB2D19E9652CC920EEE40ACB479E99C7B615DD7300225276
+D45A24AA2A607E5C90C1835AA562597FBBD42465DB1AF4867E8A1A750F1E462E
+D2615B3A9E2AE194DB25B21527307997F12B45F442817D221773CF53AB0063A0
+4B188C90FC3C03EE095014485F988D8663C0EC7E1C7B99FA1CC791DD44C7CECA
+600806FE76707EB7D9355A1CF21C4325E2C83651A6FD8399C79CEE9816A4BB2F
+FC454A4A800E96D4E964627ECB39A108D418DAA5B57E6C0A3F191BE83A4B4BC7
+48A4B83F4EA66B0E2F6AF0F99FBBC9BD5A53B06967B36222AC42F2F25664E39D
+5BBB794C37EEF11E43949250AF8F207CAF47DC0E02E93F9B41C9C11BBD7146C0
+C8994D6927D054BBE65A85AB565027CC9581619D26BF75C397AA56BE2A8DE89C
+7A0E4B8E05D6A74092C5625E59BA23F65F1404A17A9DC4843A08B58234AD7592
+7BD68D345385E2B005F2B983FFCEDCE78417C904E181F3B6CF8E5CF236F23611
+D9CBE545AA643C7D1B28EBFBD2E1171057A3C8FDB9D7DABF20558C7ADE8A6B3A
+FF9878B26EDA16B0F9DA421281F849A44C76D117F4AB566FE241B0A6CCAFE2BB
+9A6436322D1CC54CFB602C0466B70565F9A7F9370BDB1C70F0C33E529CC280F2
+3C8E23EB2C0D25829496B005E711F5BA8E4680EB3CDF115E4D0F89C4B5DE8842
+12CC80649077D5B844B61BF557D316A59513F58FECE657F2A7EF3B0D320E4C33
+B4877334EFC38A29352B0240EE736EDF805C434ACAA59F32204DE64B85CF3D65
+24F0AEACE2F703252AC9A3FCB2F628928CFAA788221C41B6AC639655E39188D7
+A8118CE6697A20F3FBDA3564355DA3DE10EDDDD22BFF4690630E99A77C663AF1
+5D38A0827E81D805507A1260ABA8374501A2CB4F07E2354B2DB7E77921B6DC57
+926415E85A35379E6A0016993926231AB1DE35178E16839574A97E50DE7C1179
+0946A61E65BE962E7AB2A584F8972A2E3CF319EE4C59B82DFF6CBFDCEE8004C6
+1B7BCD417103A82B34665045DAD49A228E9A3F63F1194B952B67F89C32E68814
+705CA69F88EDEF44916D40C22C16F58BEA7A0082D4A579B7562319750BB14BEF
+0CFB256E9EA333F3AEBEDA8665E67809576D7F1892260E43C764963B70FEEBA4
+1EBAA29B62BC37AFC35AA6BF57E504ED00650B4EC61A82B6A26EE97D71FDA25E
+1358E3BDE969F1B4D04009D55D1B19DB3C8BD1671280394A19D90893347C92D0
+E4D5EABBC0E5ECB168D32491C0CBA1379E12F1E6E160290115C60706AE8C3355
+A88DDB64EC5CC2FA7539E37CCF6941F66C3275273D38DE8C370034D89BB92D1A
+B965CEE8D92E4BC4A2733E61B8C766EE4E8C5F5670DDA0CFBD8D2C76B1F9F174
+23B97C475C8B9CA7EF89A2BE521F8BC3B8C8B3AF782AF6B1EB86EEE7A64C4314
+F1E2801D117BF864C72F04BFBBA8D47535772CFBE2EE0F14D699AA33FA7D3EA2
+8AD0718637E0C3027DA0B4EA7F3CB852811E620836A18C70283DC59D90F28CD1
+C6A8668A33304BA0B01C7AEAAC07DF77EF7D21A60CED0347A0C763572CC62DB8
+6F471ECC67B78D065762D99B540F2B45BDE96D18DD1F21B52EF54C3FA1F59C08
+E919E78EFF5EA634394A90131E66165B2F5657D4650B7B716CEC85F70EF33260
+72789B321F587D277D458B6EED9010B8C29B8FD82BEB1990A0C7EAF5A763FDF0
+F3AF986BDBCB86834412CA0929D98AB3FF21D401E9A6E816587F4F98BBBF78A5
+95DFE08D14A7B4B922A49AF62B6F1852F01A593975A06878D34A3925F1650CFF
+A8232E51F57565371E0D28303F6240D95D3D948C0A2E27DC60EC9159502709E0
+CEAFE520F27409FE135DE680EB730F3F558F36079EB4189E4750B46154AC9B70
+13CA2182E44A20F4CFD8FB7F8E2FB368233040997C0E5659DE1E0619EF05CBDC
+1D2363243BD573BA0A80BCADA2DEEFAE08A83CFADEBEE198C34F76ABE83FA5C2
+F05C1B86A1E1171071975C56CB4C7C0EA35D8449F6D2948F38DE52E67E136311
+51D137A1A58C1098336E57B1FC0A17067CD6689206E12E3AFC15E3577C10CC6A
+82D177CB016609881AB665B0B5F6A1A3A9488F3C01E834D91B38DD6BF1B2B044
+837ECA3D07B8B512B4394E28B24B7477D710C8B0CEBB46F703EE77D5E56BEFDD
+1F19BB594C69802B39DB67169EC082340A20EC63382EA62A93310E58C201ED68
+D805355BA00FB8695160EC7CD16F3208E69C32BD6A0A965D0EBF2C8F4D54B096
+A82C5571064EED0F461F5A6A88F1A81A30CC9F9C8FC6CB464EB348261A5483EE
+1CF21254D894FBED7C83867CA3868DD97A273411FF8BC1DE955FA12BCD72C16B
+B5C7F36967FC770FC35C8B8E8C91C2045B1EABCDB0ADFE148E173503195BA1B2
+435323775EC6E37099C6ED935DD7E3737AD6F112D9890019F9B949C6B20185BA
+75E892A5481CC5F8F63E0ED8ADA4E501B451F6E491FB7326539C369A3A0790F0
+2F32ED0E882AF2D05F786E2F65531DCE206DFDFE1A477C71A97CDA763E33F864
+78CF67C33B0FC431BD601225ED92B2B986832A94362A9AB4D49F3FA46A82DC3A
+58EFEE09DE84EC7B7246160B867A8507A6BB985261A20F4EDD2D764429084294
+C185B5EDF9F60C4C15BB718C2732AD751549006A5B359C03C15CC605591700A2
+603B101F6A6D1F9BE767D7BB0C1454BF78274CD777525C2966A4C396A3598838
+D0C417953CC8B46A560DD721B2938E8FE23ED056DDCD5DC371983BBDDFC76DA7
+FD598F62B0433936305BC861EA69A4E32B417AB2E9049ABCC46C4345F9669741
+8A0357D30D35D3EBD33CD11D021F5BEDDEC8E62ABC7F356E1C6FD7E1AE402AB5
+C0D624F0E5CBA67779F2460E2808F3ACB78164D8C1F23058C7F3E364ACA8BB30
+49F58FE6DA46AD4241D62EDC34099D29DBE9CBC13907D51374F757C907AC9D3E
+113B7DBFF94040600E03D24728D49FBC5E5BFEB7F179C27EA0D6CE7197701703
+44B7A2B3ABAE0EED765B9C57E28612316B9B6D56CEBAECC05D478AB41C685641
+D12AE8A5AF427FA4E4C75E0221B0E2271F3A49BE14C3B97E36E80D8A77D45BEC
+C09D87DEB41CC5C1112410901ADA51B2F0852C5FF9CBADB47946B3DED2B6C3BD
+264BAF27319ED478EB6A3146C0E50E186FD80E7858675481F9DF4A4BC5015AE3
+4E05A1BECAD22851660E20507E7D600AB1CE3C1AA48BFC5F050ECF2AE550856E
+4B99C1D665A6A7FA28A9C329073A478EE162499032FB51E4B3D5830EDAF10623
+DD8D478FA68B06420C29F484BB8DE89763AA12B685462B56D6945401BD0AD7ED
+0590DF4EACB677982F261448D1D35C72A1BD8D2FD85393CF57E33AACAB30A809
+B092DF30CA7F7E7B80E423009DE411182E63A73D6D14BD0E47CF571E5440FF1A
+D8AEA199831A918E485EF589A422BB7A4F6A2CF5EAFC028277F28016693DD955
+D0B2B171C1803C7FF2BEBFB96DF72A4256F40CA88A27B7C174826DF26BE0E9F4
+52742FB8ED72D10EBC3378C3D4F75DD787684AAC74055930E53AA52DB9212C27
+514134DABBD2C488B047460AC2E9E3468671A716D790EDCBCA4158B48D590D69
+6852E057D4CA5116BC532420BC32950BA2900C8E641D63951163C34CC89C644C
+54AD91CDC59660B4AAF0700AC478222387F3DC5E249C62E4433D3C6DC997EEF9
+45784FF75384D73CA044F7A6B1ECC5F1202C2C7DBE5DD4ACD5E8D7CF5A057D58
+0BAD218558F76ECC99251B11D2FB92487FD6D7A3AA8F16FBF489A046487C8001
+64A8FD9C2D0373BB751188335332516C2F999BBED75DC6AD90CE3971706180F9
+55D8D457BF68CAE5F0BCF71EDB20B02A5A2EC92CAD3B971E9F5854BC5ACD0B5F
+DE882EB372814DA4E91EFC31FD0DA662AAAA1A69EED664ABB5E418A19A459625
+E12E85E52FCD8ACE314947162767E89D9F150BAB26CF80123938D8CDD901CC42
+BC72035A3A5EC261111A576106798BCE708FCC8EE214F2946813D955535B65C7
+FF875911B2242E7042AB34CC8A722637D8F324C6FDDB25D9DB2FD2C666244F39
+74541C5C716DCB61CAD8423C8B3402D6C6E003200A4883C213E8580734F41451
+18ECB1AF8FF6505FE28D5DB6BC742BFF13C229813196277DD6499B9D0313EA3C
+2F44DD9CDA19E20898D6B74A93FABC51BFDD49B5F4998A273C31468BB89BE757
+BDAE0DA6BD022AAA2F0584C916F7C837F0E0883F6B94823180F9FF55EDE706D1
+21CDCC806D00BA61D4A4AE33029B4F640E9D8226B8BC0670C5E6DF2EB062DE71
+2C57FFDD35CF8502B07A52B52D6D14886A010B5567185B790207D5214ECAFC0A
+0A55803E08C9BA4B8D002C7310D22F256B8232DE47B30A131720AC4870E4B85B
+6F56F74FC851E5709E914E6E46793748CB758DEBF3ADB83DE06EDD7EE36C7A21
+01A5355221898484015CEF9F9EF6F66803DA073C38CB4406BB738F57D1AA4E8B
+6002E213E26A1F3206E8B10B7AF2FB5CDFA840891CD12C816E7EB41D1A7EF62C
+D92D51C085EDA95874333A1ED73F63386D5A9AF817F7E94DC3BC489A36730800
+8DADACACB5CB2749D8E5F8389F93C1B596242C2B9317E26533414367AE8739FB
+3C7097058371BFA929594E972CD18837C892DCDDB4384DD2133622BD0E48B1F4
+3426A7EC61CF550A6CE1BF747B7FD53DDFC95CBC5F50112B97CFEC1406816763
+B2321D3B3A9168FAA4D888BD4CEEF539B4DE1810F77C0201FD5151270D8FA365
+6D58734CDEFB41A6F0F26BCB78F83A189A91B7982F5C16973E407A50BFEE424B
+AF4F1956EB06FD15BDED6C6A10F7CDEE426FDFA4B03D15BFB1CBB5919EF8DCF3
+FD3D7CA45C2DD173060FCC4AD5EAF86B1966A449B2BD255759B16D0BBDC3EB32
+9B0A9C7CA05D6D5232BB0441D182E52895FB7BFAEA92FA1DB585C78A8EAF1DD0
+13AE43CFBB182EA0ABFAD44FF4EFA5D3BFFB53945A7D36AB480645046F8A032B
+12DD38DAE64C6A6B628BEFE7E3A60FE551E7AB07A65F3C57D4BFCE9A8B5BF8AA
+F754FEA7EB86867029836D9EB89E75E154E34814E86036E279DE57BD2DB024F9
+EAE8E0DB7A36D6E01484AE6A42560189A24269CFC2EFFE3FAD0F200411D75591
+52F7FEECAF445BB88C3989B0E095C6C50A74F66221A16D990C5EABE9C2E979C9
+7A71EF59C049DAA808A09955BB8E5D3F5A266F552A9C97FBB969F87348A87CE0
+79BF91312198EC39246CFB3F30EE757AFE025B54C5880A6DCB85F67A36DE92B0
+8791F5955BEEBA9EAA842005D2A1078016D7ABE4E350553A2777E050E769A7EB
+2E91FDB7BA1D89306D0D0CB2089DC7CB2E6E8587E71A96B8DA4DD6281E20C1B1
+5F09FA228F6B99518815C0CD67795991006DF4EC59C62F083F11513434C0B469
+0F899EE4DE7481E18EDD0FD4808F0E29179EDCE6A85A87081F060AB738A0B834
+CDC1F889127395EBC582D8EB68391D779D4F25AD0E38945D53A836733F9B4B6C
+8874506F34DA3F1BE2999FDCF0D830A01CA0511605EBBA9F5002B2F0065ECC89
+9231086688B187E0742C2745CF291313FE6C95B2A8F09F38686B9CD8F15A3BD9
+683139DCA0CB799A8BBD4DEC071D17119B80C1B15D9AA564187F46DB9DC5C885
+05D4CF7593FEED08AE35852F6F233B8A3888E1029F5F60E39891A7CA92196429
+645CC8545C24A0EF4B71F86266F1C03D578D66662C560B54F219052433C99E20
+C7476D5BB198568B6282908A6B972589FD9DF13B291FAA6BF80AA07EBAE0DADB
+2A5C290163EE73C4F159DB4465797447517183D3016560167789B3FB8DDF3680
+0AD0D46B59B05BD0F8E291A970F856C9797AFE19FE207F124D65A987E6BAA0C3
+9824D499C3A9E0EBFCED03B7E8AC0EEB7EC4B26487A864E8514F91A4B993BF0A
+D2DBAE348926515E92CAAB6950B867701101DA64B59DA1246441399AD08E8926
+D49440109403612C41427CB4C3450CA80EB07D8674AD84F7899AB32A18C3351A
+1645ADBCE41C2B7BF5CFB9376F38F865FB980B94C042AF0D1D8476FC567E7114
+CB300784A257F39D85CC8EA614EA0C48AD378BF4DF1A2767E6842234389AB724
+60AB73BC51F84542B59A5DB53B664D181AC5A1A5CFF2F3971CD910F5E5A5CD38
+D09CEC52616232E8E20C4255EBCAAEF1F9192F10EBFB34AB54C8D5B8D36B579A
+5421CBAE787A0655FFACF05AD8E8E8F689B36064F058BBB26D0E6454C703B39C
+F795FECBA78C88842B44842049E90883A88039633D876ABFE54202F35BD9F9D3
+70A3E0C31AA08CF8A8966D1FCADCB91EBC5FDC24ECC9CAB104828A931F338C4E
+AE87AE252D0F3403E14600B4FA5CD4CEE37DF8C7A901444F70E3EEBB2C4137C6
+9E3EC4FB00D1313C6EC1C2BC5380F3434CF5F2635D424DA21E6316EA75FBA5CF
+7EC2CE9631201BEDF7D7982D476ACCABBC5A452B0C1C76A00B1B6AD23001C1A3
+C494E6B82B98EED261F19255CAB52A09448FDE4E523E89F2B2773863EFDBF526
+F6415FD6DF91BCFC3D93E95EBC6A53D3AB8EED7563939DFD84BF364798E656AE
+FF4D41430D9FCE65BD2F85125E5E42C1193D0235108E6312C7B97C1FEB7FCD6A
+3D79F70BE07093FDE9DC099B282F3B7F2A41C67FE72E86EC7818DD66BCE93E46
+DD9AEB93A25FB47AC96DEEAFD80BBC7114DA109FCAE205B1D08A3AD8641A400F
+F2B471D677402C2B3890EA01F971C511FB4DF6F5AF9C68FA87E44977072A29CD
+4257AB3F7EC5B6804C20D4B127F02832FDD5666AC4FDD2C0005649CC6E4F914A
+9196BE5AC7D85D4767796CB01542EFDFBFD1E51C9C415371E4A5F3D68BE2536F
+F8EDBAE2521FCFC34A4274497638D4B9B39C14CD6E31C95F32A2CDC9F78917F7
+0C004ABA38A32EFF4DA64623A454C9755A43047355D0F187A779275B00FE5764
+30E1208D1E12CF6D908D84758F236BA6185333B56AFCB2C1B4677A7B6642D4FE
+E229F34ECAC2C9DE021B051C5E7D6DECF456D161EF9E3888C38E7F477CDEFC01
+97920D696B2722340A5951953B2BDDF103C6D0C690CD04445F241CD531C81838
+ECA1A02C4ED91032106D142AA4B899ACBB21177D905B42D04A280C0B61A0F8CD
+B510DFC46E922E8FEFFF31EE58AC1BE7AF1C70D2BF11727FF8C66D628695067E
+E6EABBA97AA5A75F955FD9E9A1B21E71A8078418766FC4AF8431B4E7C674A6F8
+4E82447B81F15D6703074BE8A13BF13399722CA91E136A552E9764333F41FD8E
+2DABA04817F8DE361C2E7BC23E9A963DECE999A6CBBEC7DE08652A8888AA1137
+EE0A0E4032A4B400C9A2488A55D8E25166A8E9805CC80E7D6C2D1E7C071C2E9B
+F2E652536A4591576D99BF1DD118244BA09A8255CEBBD18FEE5C0175D4177524
+9309626DE05FF0144BE9F2EB05FB51CE924EDC4A5C6376C758A7138BEFAF9BAD
+C89BC9834A8DF3790256119864AE0652E92FDAAE5A132557910C307C8C0C3FDE
+EE3E0C17D32CB28B6A21B8DC6ED6525F8D25EE0270704828DB9006F514EFB75D
+0671DD3B138DCFB01156B43D5B775B78AA95CF109628F5FC501927741031E60A
+D46466203CFA84D9A8EF065C43101E8FE1BA60E82E01A9CA67D7329B93A11260
+4CE84119FA0CD0E41EA3B645CA3F06059E7895526876F7C2110264C84B7681ED
+0784F82E6A160B7D3A6C520E430452B18DE47224A861D1CD872433844D7BEC16
+514AA67319F17771D796C88C2A928514D4907A1E58FBC561EE444292AB0A4759
+F809BE67A4EA7F152BA841FF3C838B9725F8F89C5EF28802C586A542131F9B93
+DF668AF74A34287FD1914BCCC8B3D2C698A8109D21BFAF245274BA33AA71D9C8
+531695BB46EA91917C40FF37F46A2A69D0AD619CF7EAE936FA1EF33CB85FFF35
+A9E78CEA2C74AC6148E612E880A58DD4FE573D6A10A0EEECA7E5DFC219E89E0D
+90843757F05759785D04F6F3E7DA269888170A90488097B5A3DD1B61CF3B618D
+05C68B2940DE15065AF933A83BB9145629BB3759B49F7C86D70E5282B52D3CC0
+331FE4C8208DA7005C2E44E683E24FD0188655DA87D01C8313FB35AC1EE14448
+B1681BD5ED81F7CA640248552B7A3EFB65ACA6DC132D09BE6B608E439A9DD0AB
+ADF752BAA226A75986D226714DA5F1AD47B8BEAC12E7E32A0992CDC54CC054B5
+4287D8531E25C390CD8293776D82149E60597DAE8B2E6D332D04AD39A8786E38
+6045D1417B3E88BE4467A0BBB146C04632E5C0B7693B0BFA5512101462605402
+E089EEAEBA41666BA74FC026C200A6DCDC7781DD9A3D184C71CABDCF53CDDDBB
+84A4926F982FA96E3A14FC3ECDAD8D9C1851CADE2BB68F88E736B4F6231366E2
+D31364FF60950EE333B36A0F02A35A355B4271C4A6B067C979E440BFF3FC69FB
+CE0998138FBE60ACB07A24261DC334C900BB422328D3EEB99B8D01FBEED832D0
+2D44948433DE5A22F0701447E03E7E6280273B87BC477C8C90AABA2883C2155E
+F130A10ABB57C94E43AEE5D9D65DA7D816C3289A2FC470215F4F9C42699E52E4
+D3FAD53FE861435C255B887D7AA50176BD2E93418BD0D53BB0F86D267207282C
+41E2AD75BF872A2FA4C39A9DF160244E592FD344BDB3BA471DD7A8EF658605D5
+51223D007026DB71F97D9AC1AB7955015C9A4C4317E9F9E219B77E2C46F97741
+78ADE503EFEAD4243473D329B84C60BB96ED07D171C49D2801762C40EA7BD7C3
+B216A1401727CB6E7E7233B23CFCDE2C3D62462FF15AB69568A0BAA15E10FC2C
+C33EC5E22A4FFE258E73B59D28BE7AC90A9DE63D329353B165087D8B58194815
+9BD0A3A335E7DAC0C49B880C7D85A242D5D562F2AB1087E1A46DD94F895B074B
+F632CC49C3765B417D6CA0DC7A355C672EA4F91DFB751B468FED48090BEB0232
+0959CE3E6E40C197DF33C03DE81999F0435D46E6225EAD2226438A0E19458BE5
+579699FBEA9BE41F3D997DC4CFF1C7591289617BC2F2AA7B3A895F025E2137EF
+B9FA6565C04E516228C59DE70340C275670404E519409BC8BAA33B2802992DA3
+A721FE0B5717181621A0161811DEAB802897A06B807B2035297A7A419D3D0998
+B30D68F6B4D586FF370A0EDED183A45ECF4C517B786A67E15FFE4B6A83CA0C8B
+6F9A740281F668009D1918BB427D1B34C7355EC2D4833778CF284A21A753EEED
+664A4F84173CEA11870081F1628850457EB8AD54823C01DF2D15A1CF4B33E0A7
+4B3F3310011E6625CBBBB8E775A650F0E0631F8897988BC2EFEECB8876B48DAB
+156CFD14BBD7BDF14489A025703DACEE33A25C9D9E552FC10EB121BD990A093A
+D9BDB0334A8396E6B58E9C9285F88FB9E4E990E347F532AF0827D9F0970FCC93
+6D17A43BF518CDE57DDDC9FA18381304AC09C7E255F76D26447A1217C70258DE
+6D3078E3128216FFC5EC01A82BE8D3958300065A227F77D236B6067222E8CFD6
+208EE7ED58446D94989279689241038F67A891614078D312E5F90783906578A2
+C818ACE8990471741AD58A7CF126C552AB44027B6AADC2501AFA286B5D65C7A5
+B6463E73BC9E888A0B231351F9A90E5991C4F0E2920107B3D966ECDE01763FFD
+DF9D0635327242732B6AE089A3D7FDE1742A7D74BD0749684602447B490BE0EF
+E01BBA07497B817CF0F73D4D2F14A1B29505311D52ED90F0812EEE440D815B14
+CE44F3BCD5EA5B822073A775C137A59DEED383F80C16CF859D8187335220FB73
+217A045C39B0C3C6661A4D536880DDE06366F403F27DD632BF659435E2411A08
+C30016C471B4206531776F98DCCDF313E62F08E93EEC8FADA4C6B5EB22D5D832
+FBB0DE8BCE851FE3D6D70504242B2E720F74AE49F0DE3CFF787E9CCD3D1502FE
+1622E86CBF9088F3B65E844145C879B2CE74AE24FDE843B657F9B8876DAF23DF
+81F133F5AB4652331126F0ABF1C2CA21127CC1062C06D1C430A12740DE92A00C
+B95A50696164F5AE380C643BBC7E4982881F17BCC8F9A8E3B5E38E6F4E32419B
+19CD0D69F986F5D80B7620E42509FF0A3E4EF0D7826E543D0D8D80F3D3C0A699
+4B5CDD02272D224A0B02CBADB71524EBBA68FB57FE024A54B9DD7A74BB6BA892
+EC5241A5C20D5BDA591AFE863BFD64B63F02C77B74EC2AD5D39589AAE2245F0C
+90AB09FB11A832F0791FB9FD8F892ADAAFB519BD8EE3756E6A5E1FE67735C694
+08E7996275F52F4AFDB24FD73E8F5C1B34296D4F41CF111FF08E88E3AF691122
+F196D4DEC545F68C76A68E4DE57C2CC706D0EB631367F288A4077044979D9E5F
+9EEE710C2130FA491D114A742D3C0EA68D50AA44B88C66EFC1F281AB320F2C8C
+800B1A4A4708B96CCFBC1B4726787096D3018AA87B2DC422E563BC4751D30E2E
+63554771794D0F4F055C20F20ED3CC9E20ADF726A6C5E84D7743B5F0FA99A0EE
+4958B8D53948E195ADDB8B8E4F40E387B36C14806025A5D96DB4F6B9ECAF177A
+1A0492B360759EF671DD4616E25746919511057F40FE14F69E4F4BD67BF11EAE
+E89026AC1DED805FF27846D642EAFC51E37C8E94C6B4141170988E314D8988F2
+00D56A9D1A89D3EAE006C604060B43F328A08DCA73991776A314C20441FAA4FE
+077CA7F6ED2FE421E90E83ECEBBEB42187DB5D3EB5003A27D69DE33C56AFCB9B
+25BAFF5F4F03E8CE5AB1A619B5973FF9FA4F0AC0DD867F7C0682609FFD7F10F3
+B7E6ADF7A62368DDC8E4CA4CEE3DDD15F02281672E41FD6C2FBB00E08EB201D3
+233E7AF3718BB51996C5EAA6B848E1076A825D8C5B0CCA4A2852A6C9352137B7
+D40F18FAFD9085155798496DE75F33E972B040B6197692E3E6D43CBFBE9FE71B
+700B062083A2099E74D90F3E05D60AC091D0EA1B4C17F383ECEF98D6A50B1D91
+A82741FD6D9AFEE053B38B7CE59DD5F2782B5B360CFF78A09DC6C2093FF58127
+CD74355F7FB083746618FF6B61ED1E12E07582FEE7C78195C625BC7E90262C52
+8FC10144B4B6F99303ADDD66CCC93ABB0387E1E61C90CEFFCE16DD8CE4F6B6B4
+4F7ADBB0111456B7C2DAA99C5FF8B04FFA77DBC0D8063796296D8B8700544437
+0897BA71750E947209330045EC9DFAA919E64BCB8F1B56985D15DBA491E8E2EA
+14FC8B31CD552DC96FA440AE98D04954D3E7E5BDA0681FA27F32F9BFD5D4C365
+128BBC8AF47FAE2039F90D0F30D3DCC141B99DDA8151E0DB243E6210A1835CF1
+7154C96DBC2C723A7576580747AA18452EC87ECC2F55F41935C8FEB80A690351
+5D3F3E67970FA93DBBD626A519EFFF4756B33641F56F7D16B7712FD09C726572
+0932166A7BAADA3B47E725D74564A155E0BC1CF8E5BC05F2D4970ADF60BFF161
+01F6E31EF577F8FB7560B2CDF775834A2DEB6B337D096EC2BDF113ACF27E2A79
+6E670C2F1739206DF052D43619D20461E52DFEEFD7A7A7F31690B71EF062EF31
+C9FF3205FDBD1A2A3DEA550BD3B6373C59F4CE5CB845F9C6297FE5641EB90231
+D4F6A2F919164779CD527F1C142AD7E47A63ABC26DACAC5C278EF4AB6B4121CF
+793443E1E171870E95A2ABE098CE0A147CD373660BB20BF4ADADEFF4642FA1C7
+398796EA9FF642270D6176ABF5DFF5BB002C2C01A9C42DC3FBA1453B6632AD67
+A7EAC9074CD11D2CD46675DA0F910CB13BF42A155DFA30FE582D4FB19C6D45B1
+2F3C92947A8A2B26B81CC97421A1F5946C42171675F0A19464758E0D64A9D324
+3E3C45CE9E556FC942572D4508485E9543239F26C084D0D659D5B301928F014D
+D8574A69D9046A2A4FBA6C993341C118E0AA7366CBC7C45EF717D6233B9D3F19
+C46ED705D06962E80383E102896587999E2A9F04F020348A0EE5EE61054810C0
+26C53DFD608E885B6F2F2E2AB9E8FD67E6057D42440102D5CE2AA06982B16A3A
+6A9284F59E13EFD3EA8A5B1679864E055A8783FE74E4B2A28C5B968401836C83
+0B94AD89084B0A31B577E1CCF157851885E41FE7FF0D5D218EAECEE2D2130A32
+2FEDEDEC8B9F9223CA33A47B8CE042DD7BD35B5B24BB9F115F5D5204BCC0857F
+CE329655D72CAE8C8E15F53740727441F8B2855126BBE70F144E989C327173AB
+6996AEDAC678F5BDD16A92C2837C4EFCDCF43804BD2A145DD54170B0941BCE81
+A17771E520388AC4D0E22D6084BAA83F1F4EB1D8B2E0CB84954EDDC8E9B3A616
+ED3A91CEDDB972848E83E3AC3ECE3BA865BEC7C96A4586955682E4680B4C2364
+8054ED58647C18A3CDB8AF5C736C1E5036CB7A09CAEBBC6FA47B698DDF0AC81B
+2407B47FE67EB74B7DDAEC1AA8F0327BB005D4E375150D8FC69444FDB6D7B68C
+39CABE4C7A0FC3CD161843EEFB1A3003F109C7F187781E19CB060054FEFA21D4
+C9778A937812E8F06DD70C56424D57B4441A8D118769587B1E49F090CD179081
+3C33AA3309F3CBC69108104C7F68BA89C8C1D503507DE3A2FD2C81491DB1D511
+9876EB1AD7E66FCCC675DA4BF25F150BD3D0F622AD73C6C805F3DA6B265CBAE1
+83AEDFF42461D63EA338502AE6261988068E1C52E5EFC5BE1D0E017C2AB7FF2F
+B27E42A4A7D8CE86CB6F36F7C218CB880230EA737CC971E8D70825C7520E5E33
+C2110E3E26F51D30B8F058228E5D2C45966D9107725141908E74BBB213339E7D
+7437EECEAEBAC39BAD6A5595EF66E6B4BCE2C565596B0FC5069CFC1CF8B39600
+EF3B2BA9222991BEE9C55D4434AD761684DA2B61EA399A2B53A2D2E89CEFB6B9
+D3606854873444F53CE1A2230E3836B1DD652464551AB8ECB94CDD297C2AC906
+35B980680E12A891D6F39DBB7DCADF853394CF46FECCF0C80D8FD0A82009256B
+22926139A5CF6A06FFE6F4EF6D1843436DA4F3F2ECB504D3C91961DCB8F78ADF
+6A8D05D40225E125F7ACE0530B28BD86BEE2499AA4B62FB53329AEF6D66B1428
+6731C3E6A5AF5926F9D407E9999FCBF9580627F25AAE06DD34BDA8CBA179634C
+8558B9E23E3CDE30053F8763BC64CF595B25E8CDCEBE15915E791E7387A2F979
+20A0EACC18A38055AAF917E6C768981BFD94380D7C33EB04086236ED74FB3B50
+56B9892412BCA67DCDD27CC508CC94AD51F7FEE2D6133BB310293BA9E36DEC27
+E014283EBB9A46DA887CAEC8B98E64F9A4441D254DFB203D7897FEA54E8B6A95
+2F2D00B75E4AB45881DC1361C37AC1031AB89F280929DFB9FA92BCD87E065F50
+7D0FFF1309AD49D259D59AFA825F892EE7FB303DE51AED493436B5B0BADC8941
+D5AF414E47B3D949C5411A47E5872731E797B385AA807D2D6651A78E45A998DC
+21DD8B1F94370ED46CF165915E884537DD1B64489BDE456028592EF0C6041E59
+DC634B564B96B3A5861497DBEA1F6F06EBC125E74C94BB85022343A2BBB7B725
+C2AE27BA791FA69EEFF1B0DD3BC5B80B7CF56B52729BAE6E54810AC9D00C29B9
+C9455F039CB5EDAABA887F8598EB390D5D28AD387F429321A8D5FAF61BD8DCA8
+A25ACC7130C80D9EFEF633D47BA80022AA9CF477EC073D2FC3CBC4D685CBD238
+28E9E89BE648DEA20B1467FCFC4838141BC6ABFC046C5A80C250663637CB356A
+B58080178FCF7B78E552415D071D11625081AF4708E78D843737B7357E638DA9
+501BCEF113EE961C84339E91202E5E2AC57BE8C636141F03A9CE8E97C7C8F374
+6AFA335DCE0B6B68C7D94C1B6D0C73DFF832580B2D1B1193427578DDC1895DC7
+1A9D8B9CE3157FFD118CF111BA33F1FBD445DBEBC1D7CDA5713858CF4CDA224F
+38201BE52F2947D08F028378E787A2837AAFB1EB738EBEF4EBF2B34BCA1F0526
+8295CBC517E30CE49B86F196C26D982FFE650BC2B276583D716D1DCAF24267E7
+A551006687684174D71D920D7C1E2FA12A7C8F6B5CD4E77942D6A96A112070A8
+BCB56BCBEF93A1CE255984B93E92AA8854690A8AE7D416450869534787FDCC5C
+23AAE383E05AA31581E3F2F31531A41F516DFFCCA33BD147F100CE8C11D3D3C4
+CAB8E10DF7425F2FB07B105F60BBCB8F7429201180B4ADBBF92B992038394E5F
+346A7D4B3C12CD9A2A50884D1A465BCC81EDA8D081108DFF1D8BE67BC9C39812
+12B65A712D3ACD7527976CFE1276BEFF410D08043FA52A3EB2C6E363D5E86D24
+3D464A688F9482A7937D9F6F468B2ACAD117378FC99D98238AE59DBC628C2EDD
+04B9D0A1199A8979BDC68D0B820C22E65937CE89170483FDF9C4B3BD8B17DA90
+377561E6D1F40ADC6549A5FD336DB23AB4852E4B696DD1DF77D9C0F70F61335A
+811EC0B0D8D9C3C37CD98A906F5A2B4489C29DF8F47FD4D3E8961458135F6AA6
+77EDB4F176F23CC16D18FEC0B3911F6C75AC0909D42974887641F376E5B3EBE3
+B20B18FF22225F0C21F795D202B5F942547F427617618993AAA2B32A817F6572
+69B1FE76FACD292337F7F1432236C168A0F0D51CC6507CA9D7C8F77C784C50DE
+BD2DB783C82D68EBA9943D389E442D231DDB44F37C185B7957B623E2196CDE38
+7BBE1072868E5D91D6EF1F06BCAC2469686B7155FA86710AF9513641E0F8E260
+464C85B44E51A7C3FB93F99465D4668F996643EB238E3E550610246E00216666
+A49A3FDD0CAA12DAD03A3F6222E97CF41FAD4AC3687CE9311C742E1E7B4988E6
+F6CD130CC8187873CD106317C2217E590710FEE707DA5F2DCA5D913344E2E499
+74D0D0C519DFB8B734EE6CBDA83B09AAD538CCECFB665FF3187EF0F649EFF80C
+4498A585716BCB9EEB79CE45FC74A25D59F9F254C0F1901A655FF43F72BEE91B
+123E2CC86388FAE4E2B00C53B6137C649650D097763816B60ABD8ED1DE810EF4
+F1A080341F88874B09C1B0693653566681BB35553CD0BF07EC5322228555D459
+AC9C0E77D320C0AFB57FAC1525347AE502D6862897B7CBB9C35B7799D18EFF32
+6DE271A2C8D8B7C0929E69477A77F37858ABC14BCE690230AF617BF8AB621689
+D2C9676B355C672EA4FF369617DD0D36845DB212AB7E35FA521F8F2309228F8A
+A8C47A01259D8E4B7AC730D853357689F0654969C4FF6E8CB5331710735672AB
+CFE17A87DC58953C778736AE0CC5DB0D7CFE41AF06EF6DE0CF11B025D85999C1
+AF52A405F3081103D5A219ED332444BAB77D418B6080A7A4A932000009A60745
+AF4239B9E19485FF61A1FF624621718A798C370AE385F6F30CB522ABD981278D
+A771E952399ABFA74DB1E7505ED748DF4A794333C135AEEA368AE4FB80280565
+09BCEBC737FA30D660117415EBF6D883CCE0B9B52562424D2B874B1B70787222
+BD13ED345A6CB186F1B3686561D4E757758DE9E3A0B3287635BDDC69A3A33F27
+5BD1C166309961307C4C3FDA4D8BDE6E08D03B941FDC40105FFF53226742613F
+A43AF882FD2D142187D698B81571374A3EA501F6E6750261D2AF3C737532FA87
+7988FFAFA6A95706BB79E6D01A8114E48DC93BE207CA1037D83881F29591DE1C
+AF9098347780DC77F393469C7012C42D31A1D9CE4AE2FAD4E3948E2A50AAAE30
+292BAFA6F980DFA687FFBF8F72B4A0DA16671AD2CFD65DC351D3FE3AF51D666D
+3E0D56B5DE2A0AF4C432243E37BCA75428F6DDF078ED501F9190D1B13085EE00
+C65067368012314DD1CFC7BC946F626F8C1339A7922FE1FE7A69ECB6DD695FDD
+1D988652EE8707D2909C5D8E0CE9B4998CDD755044450F314D760CE3128CB512
+F852E26DF056F7B5E3A2A54DDAAF6351193DD4BA2923EF40D6388324AA7913A8
+49B4EAB2E6E552DE7829C0CC6FD60C0F9109411B9EDCC8ECE40E96422F0A871A
+8B2EBC60F3D77F9F25802CCEBA7418E8C1B9D9B9D64503F96CAC529082AAE772
+2B0A0A7E
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+%%EndFont 
+%%BeginFont: CMR10
+%!PS-AdobeFont-1.1: CMR10 1.00B
+%%CreationDate: 1992 Feb 19 19:54:52
+% Copyright (C) 1997 American Mathematical Society. All Rights Reserved.
+11 dict begin
+/FontInfo 7 dict dup begin
+/version (1.00B) readonly def
+/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def
+/FullName (CMR10) readonly def
+/FamilyName (Computer Modern) readonly def
+/Weight (Medium) readonly def
+/ItalicAngle 0 def
+/isFixedPitch false def
+end readonly def
+/FontName /CMR10 def
+/PaintType 0 def
+/FontType 1 def
+/FontMatrix [0.001 0 0 0.001 0 0] readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 0 /.notdef put
+readonly def
+/FontBBox{-251 -250 1009 969}readonly def
+/UniqueID 5000793 def
+currentdict end
+currentfile eexec
+D9D66F633B846A97B686A97E45A3D0AA052A014267B7904EB3C0D3BD0B83D891
+016CA6CA4B712ADEB258FAAB9A130EE605E61F77FC1B738ABC7C51CD46EF8171
+9098D5FEE67660E69A7AB91B58F29A4D79E57022F783EB0FBBB6D4F4EC35014F
+D2DECBA99459A4C59DF0C6EBA150284454E707DC2100C15B76B4C19B84363758
+469A6C558785B226332152109871A9883487DD7710949204DDCF837E6A8708B8
+2BDBF16FBC7512FAA308A093FE5CF7158F1163BC1F3352E22A1452E73FECA8A4
+87100FB1FFC4C8AF409B2067537220E605DA0852CA49839E1386AF9D7A1A455F
+D1F017CE45884D76EF2CB9BC5821FD25365DDEA6E45F332B5F68A44AD8A530F0
+92A36FAC8D27F9087AFEEA2096F839A2BC4B937F24E080EF7C0F9374A18D565C
+295A05210DB96A23175AC59A9BD0147A310EF49C551A417E0A22703F94FF7B75
+409A5D417DA6730A69E310FA6A4229FC7E4F620B0FC4C63C50E99E179EB51E4C
+4BC45217722F1E8E40F1E1428E792EAFE05C5A50D38C52114DFCD24D54027CBF
+2512DD116F0463DE4052A7AD53B641A27E81E481947884CE35661B49153FA19E
+0A2A860C7B61558671303DE6AE06A80E4E450E17067676E6BBB42A9A24ACBC3E
+B0CA7B7A3BFEA84FED39CCFB6D545BB2BCC49E5E16976407AB9D94556CD4F008
+24EF579B6800B6DC3AAF840B3FC6822872368E3B4274DD06CA36AF8F6346C11B
+43C772CC242F3B212C4BD7018D71A1A74C9A94ED0093A5FB6557F4E0751047AF
+D72098ECA301B8AE68110F983796E581F106144951DF5B750432A230FDA3B575
+5A38B5E7972AABC12306A01A99FCF8189D71B8DBF49550BAEA9CF1B97CBFC7CC
+96498ECC938B1A1710B670657DE923A659DB8757147B140A48067328E7E3F9C3
+7D1888B284904301450CE0BC15EEEA00E48CCD6388F3FC3BEFD8D9C400015B65
+0F2F536D035626B1FF0A69D732C7A1836D635C30C06BED4327737029E5BA5830
+B9E88A4024C3326AD2F34F47B54739B48825AD6699F7D117EA4C4AEC4440BF6D
+AA0099DEFD326235965C63647921828BF269ECC87A2B1C8CAD6C78B6E561B007
+97BE2BC7CA32B4534075F6491BE959D1F635463E71679E527F4F456F774B2AF8
+FEF3D8C63B2F8B99FE0F73BA44B3CF15A613471EA3C7A1CD783D3EB41F4ACEE5
+20759B6A4C4466E2D80EF7C7866BAD06E5DF0434D2C607FC82C9EBD4D8902EE4
+0A7617C3AEACCB7CCE00319D0677AA6DB7E0250B51908F90A32C4175B6BFB279
+024EAE1B04D721A6C54FD62484F8949B2CE9B87D9CEE04DFF82BF14931B3CA03
+AA5F701B6F80BBCDF2C427C40A51597F0B1BFA25EDD7CE0EAF2EC676BF0059B7
+15DD5462BA30DE78A08DD533DC0E8D85F9DAFC5FD842F417265427E0F1B71834
+D2BF6EFAC3CCC40D3EF3B2E2080F148441BA45E5D0C0F7D8416730AF4BE4FC93
+1E965594E0364F0D4F1EC48004CEBDDAFB1F0EE0A8222358EAC0F62E6BFA3C9F
+46875EB4C999219B91E6147A49A668505667030CDF3495682B79C0F614AAEE68
+D976EFCDCB04127C0D7325A2211E49CD316935A0B472D1F9FFC68F7FBEBC7582
+036CB393016193A9783DD08D647E89C5BA4EFC8701BCCB6A5C027C4FA8644C06
+251B9E33FFEBB1B84AC4D4B148205C8CA7AF5EF97F2788EFB0B71473AD0F5EB4
+FC43F46602C53E53F5A6D1E445439F65967C51EAB636178FA377DB2DDE5FEF41
+9E91F3BEBCFBD3B4EBB510A0DF7F4D19C6552BC98F10E25612B1396020D7836F
+A3D3C865661DB276E428F09F048A916B4F07D8FD01AC1942A3CA342B0E531BF2
+3E9A7AF265ACE1585E331A8F8B5AE06FF085C1F349215581FC7D68D16395D934
+79B3BD866A4BF33913DEB54B4D00ED5EFF3313FBD1C5E6AC430567872BD935F2
+AF1A3F892266CEAC15DEF43BCB83DB075A69EAD7D2EA53303F65E04C5673411D
+EDFB32156120099AC210E623BADDF2991F96813AFBC1126DF53A0A776AF7D61A
+6B42225A5AAC1B0AFDDB59C5922143A156EED76E3E1ED01ECC6ED9F61B5711DC
+C5709EF5A3CED45628AC1728DFE98F07389777E04A7E407E3B007017C96F6EE7
+D0FCC0426C4D734A0B108FD2BEB48FFB6D107C5AB8EBC3584F13A40E5508AD9D
+5A081286BFCE1D5DAF5F3D86515244B4D0D77AF9820A93B7C90420FF4B8D634C
+2C5697E3E04802E2CD7B9AB8368F1A9DC214CF893AFC7BA3A8DC24B0E549E106
+F04530708DD03367D8501655B1501645F17E547C1C948DEA7A4814F22E2A1D55
+5AF16C55D6BB4EE9929C9CEE82C4D6A16D70D17AFBBC6551BB2C9D8B69F5DAE2
+5DF6C2187ACEB119EE6087BAF5E79340D115C53E710CC7E4C771F43ADE91D2E1
+1AEF7BB2E6C9ABED010A835514EEB6C9A2C93396FA12E8CD0B2F9045587E51D2
+7E059224A889B3E7620E57AB6CACFD769898B3955661824DD4AFCB9A7B218DF9
+F84B369F52E246723C7D0B26C145DA0AF81C83DAA091143FBBBD2A414114E34C
+7C994D8401119D5A46856367EE3FBBBB32155A00E5314641288A6E1FCE47F385
+71C2F7A7602F777C11884DEFEFA560333458DD227E63F3FE68A762CAB0A7308A
+FC59C9B293233DFA257E5D10BD5F12B7652C45C4C50F14F17E59A758BD7355EE
+A89B1EC954B86642B87F814F936577429C467BC8E97A481ED15E2633AD73830B
+DDE3DE50E1EC439204C7FE350C69494823725920719D613907163AD63FE83C6D
+1CB6DA81A6C816C747542CA09493306B44A7DCE934B877DD356F38D07D3E0355
+CB149BE6ED646E84DB9DB61859F6FC45BCE13EE42458D1991AC34AAE6EA72320
+3EC6346C38CA87107618ED3C46C331623D8FAACC6CF9292B8F1B407806A0D480
+8F51A5BC97F6B15807F95CA9DC14C0F5FF3AF1881346AF82F65F0C9AC200DD03
+CD20E0C06E8AA4FA8B225DAA01BF6F07ED8B9C9577F5A565755A71A40D2A453B
+AEAAB4599F617CFEB0B809856CE021E25399D38570ACF8354798FDC2DA24F0A9
+3AE098F5EB8C400569A5D4178354CCE780B8CDCA570E6051F21ADDAFFE775A26
+F9222A6DEE1BB669795728FE4DC07114AB6A8067C56D909BAB80358F39B257C5
+779834A4261613C8F2EFD82F20C9AE15E072BD78D60D77EAB14430DC51BCAC86
+DD91D1654E340719EF37A8B7C6AC8471C16680FB0FB7ABCAA8555A292AEAD439
+4C6BA6BAFB0B19F9DE59745E45D0B67C1D4DE80CFEA538A2551037E0CE7E8D57
+C10AF598A2E9F8A5F67D793D2A228E7A1ACAFDC75420318FEA23286A45CE9C45
+EA34C3E15634BE1FAA50EABD04E94F6D47CA2B78F2B129C94579D24946A8BF07
+8E870456AD04FB3D0549B59D1CABEE60F9759BA2BC06E068D2DEDDEFD8B2788E
+92CBF4B44E04781BC17A58A0A3BA1CFC463145593170F06FB4DDB90460256DBE
+572A290F44973D09EABC8D7665E1D18E1B8F5EE44985B498B6E662B87DD610ED
+CBFDFFD33F0A0C95765E24A7D071269FF7FA2D47942FBAEAAE065B7DF4A9EAC1
+FD58D7C302F9D15A2ED0969168E2FC4A021C521FC7D9C53ED3DC1A0F9AC63862
+AB2396C14CF8552EB0A8C067AB163FE0DA20E3AE1C7881AD6DB0E1D615F7F2EC
+1184C69A430487B861F5CBC52F27C53E1588AAD6FD43CE2C0EA490B257C4A36E
+06E21AA6EAB94938E002FA80E1B1295C1322A207C5A87EC49669AA2FF054BB4B
+B64B622FEAEE05CC84835178C4DA9DAD113D5C6BA75830CFCAA2077A071069A5
+258AC7E801FEA6778FB7EA7507470AD0AB6BB49210858477F53A831F9CE5CEF8
+B519C07786D0551A22E3EEB5230098FB06B390FAB4C73F0D3D03EB4890C03329
+5A0B9C67F1E16B0E1A9D4389DE67F6A950F322ADA03433E71E1DD8D4E416D9E8
+CC55EFAAE6C94CCF24980BAE71CE23916DDB17DE1E412CA5CFED25AC13109246
+A26A8F568DDC73538ECDD2BB41B9B5B020F0F1D36C8F414C24566F8F9E1352F3
+38A5D47FF00D91F43069137BAA659301C2A1EBA1AC6623DA8773643A29E498E2
+33C33DA49C290B5719BAA7E9CD8D00C803624BE63EB0100D6D093E3A1A86D653
+A3CAE4459EC25EE9D59D4AFF27CD3FE4BE831C0C31EAF27F364247114E896CD1
+6395D9516ECF3DA7D9A6B4F36245021C9CD6C332182441B79365164B1E40C5DB
+9E4B5A69DB4AD7D79979E6013435C7D70BB7E910B75F28449CFAD0443645DF30
+5AE363FD581271F587E53FA6DB88B28FE6B80F8A5CD58BE57B6B386896BF7A4A
+D1A36057CB2CC346697B21A5CAAE37A68E62BA46568F0CEC8EABCA7D1A08E7FC
+72622305F10E7BECD696DB80A170CB09BC5E27BE68733943C72A163C88485457
+D47FEA6B5D20982E5713DB5C4E499DE5DE8C2090F3006242516349955D8D7857
+0DB51BFFF42BCB28DDBEA8C2AB5431DCD10DDF05F0B59D00F65BECAD61ACCE82
+1454C36AFF83685C530C8E3A5016665E2A50287558A44E43BE485C96E3DC24E1
+8B291399BD9C9D105377497D085FE5F9037B984104E915DB9E76DDA3BD5A83CC
+ECB3DB2A2E14B90760C207F2D53D9389EA03AC1F5A6AC61E1F538DAB42800822
+BBB425E322947A26F51B3E81D2B3D0CF214D2410BE2B0F12CD978C1943A025E9
+C9E5B403936A6B7928966EEE19504D9F7994861A4A73BB3A63719DE764BE9182
+494E70BFAAC3C26CF422727BA3A2660F1B2394CD361886FDB734AA49614F4C61
+565831EA21D56CCFF58F29F2EBDB513E9D3601F405B94FC7F5FCBA22CC3E47B6
+5F71C0768FA87DA0BA8F5390C0EBB0EF2242FC8FA3AC0C3108F6772237BFEFD8
+61F3DBAB78F70D8801A2F4C615D86D011537BCB2B5ADF4A13EDF0C8BFBBBCA0C
+2C0A139999ADE8FD695D2954C79A86D885E70CD72EAEF05430AEF1A15C9F1771
+F10BC3B8C9EF931147E5EDD3EB5C8F459077AA3407829FA8092F61A909A6B67F
+B6AFC3F35F065420DD6CE2E0FE0227B06A203F334EB8B7EE4C6F27C394B86EE5
+75D6200E98B1F37F1A977B8E92BDF6C4532879A6EC1D68BE998EF2B57C50F06E
+5F30DCFAB85B51ACD1B127161A73E0BD1DA354F3025B3F92C054031D03ACF16A
+158B45606BE9E306B633061654527B904E99D6D8FC61D7D1CC69D18D94D977D4
+402BAE1BC49DD45F8772709A4F148476F9302E38BBF6F6843FC56CDFCF7F74F9
+983100F8FF980CA805AC80511BDEDA1138F12733EF1FCB50D0F60EC06D6BE1B0
+9F908DDB1278340BC780A31752A809A0B6651C5B3E5E0F2017F092849B1162BF
+2188145EEDDCD96CDF5C00AC05385492038EB2F10358D853509706635412F19B
+DA6041053C8F41970BCEDF162C1347DEDE920819734B47FD99CD38E1BEF7A7E8
+8150B295BA78BB5EEB055571F49B848E5A85175DD39DDA6364B7BD0C9C3FC42D
+EFB45AC4E52351213740B3CE676A43DBFD4D04B1691D5EEAC147DA471A3D7A00
+93CC624819D3BE17DE9D8F07FAEE4F54EDCDEB4134D9F39C3BC33857BC8A08BD
+82E23B5564415A3410CDF25ED8C3D443A0F5A9CCE3D75C5AD55DD3DD28EEC633
+82882118F09251A0DCC8349AFCA61603ABC621894DA5C1BF308399A9CCB8283B
+6F54E096CE3F2D3C11373E5356570403B418B84B06FBEE27B63D8B678FA39186
+81605E6B09B02037FC124776DAD7AE3EDF993C064EAC0DD678E13D8D78F74DC5
+22BDD780DDE77AEF1C2E2CD2239EBA6A9E8E9AF9F4F4605ABDCF22902055AB90
+3C5CECEE9B92B52EDAD5D29C3FA6964A7A7A2EECD8F9EAE1CC81D9825E8411DF
+058A838F2C335860FB3B063C824FD45825ED5481B9320FF99B60F17ED8A1C1CB
+A7E12EEF35A40266C7DE2E1DEC31AADE7626C5FC57DF545933F602F283A27D9F
+0E2C77A1BD5394944566497E01CACAF62542EC93D16CD80D4647435B6C905A31
+B94C5CC9F43D6492BB70A5E8867C7B0F58D75240B496DEBFA6DB94D8CA775A7E
+53237BB081D1A189124E6880B6D964867804BA33E0BFA961A562836F7FA1E98F
+EE78ACCF16B330473D69D52D011AB174EB440746ABAC7DD7D9AABA70ED2891D2
+47E2AB24669280D11FD453BBE591642A3FCE09EBCAF62F8E27FF0782216E6E87
+AFC464F2316DDBFF0B6736D42577AD10754C6936B6EAFB18AB6AA3AFB316B179
+B19A0561A157E90035FD26B8FDC72C2892C94957D3257C38F8B1BF14CC7C6AEB
+6FA1C4AC6F22C627BDB1CE6AC63D656D5E7410F7E516813CA3BC9EF02EE8ED4F
+B02D57B303875A7F3E1B8176892C2149C39060E2AAB5C4DEEE429B7AE36CCF51
+997C547147B3CB8DAF1E8C8B160F00A869E5FE90F8302E081307F4C92EE0B374
+EFD848E3F943E04245B6393060B126C7E2A2728F9878D7CCE3DA74525AF11C66
+3BBA0749AEEFD5B190A4A0A729784D15665A8150FDE7A8EA5CC4CF0092B2AB09
+CF8659711E84D057DEFFF2696BBB20E16D9E4B1D4D4EAF69F3BF07644B90C94F
+D11E9CF3E66CD3368E808DF69DEB6C6A3233A88D558BE5037ED5B42EDA0070DA
+3D29F04CBFF58BE922CF4C8F9688A20EA7CB644B080D2C01A2715A69D3D8B7D9
+5C0914DD83C9490E465DF0EF013B6473BC28E937C6E13A2F08CCC8B6F35544F5
+9F79AA89481CD0AAD87C6CA2391BB69A39B090208EFE1A0FF5BEC74923193F6E
+B2AED1DCDF644351089CD7460AC4987789B2D92D851E3F58B41BFD281D717863
+5CEC8AEA5CB14F52F6EA6F5156F08A1CED2312CDBD2B18BF01FE503AB86DA440
+F892BAF54438A5FA847DC0FC7121F2EB829DD00D2DF2BE54EDCC42187840D8B4
+1CE8DF33B574EF36701E2873D5824C37C6BD7DA4AC7BE64D12A21FF2A23CB9B4
+1C6FFA7D8B927745000345B5AAC5825D89E617FFC97B6C7FDE0509DE3FC6F2E2
+1508278734B33F4550D4F565B0A23C2615B49BD17B6741E086DFD50E1E6CE979
+558741605E2A314C325BC4216C2F0F809F492B1898431AC7AB4579E76A3A0F63
+E8CADD4AED7CC6C56AA12867A43CB25187686ADBD4591DD35638F5C79C961085
+BBCF38D48E756C295A0FA4E59BC1CFAEE016686A8F91CC56E37E4A8312F39837
+09A926B3713EBCCD1D82DF9DFF36C0C024975F531B42E7F61D830E2FB51BAE2D
+9A05BE87E8F052E748F8B4201C8869A64BBBD42CA4974E230E59CE541EC0C743
+7292203798D2E11AEF67156FEA12C22964785FEB4CFF473A710A5D7F97A07A40
+D5E9A182D7A96A083823DBF8B1726E8B71F0D751D506DFBC20EDD53A0368D098
+59453D360568B76B5168254027AB71D2480C63D486E855050B1F480BEDE9B4E8
+3379C0B539E33AF2E286C2A02A5D73148114F88898D7C01F408844CA50574D1D
+2B513E63ED04011F179512384C647100C1870937BBA5F404E80B6C8BBA52F6FB
+DAD5343B530919E5AE54E0C859591769580B82911BDF290777B825E417D4EFB2
+FA60EED5786B27E3109CBCCE391B855ED46262FC16A663E63E9A19CAA6C6F58A
+72AECBF5234E25B5C49D143F1084F0B571BB424A1952AB4B26366ACF83A29BEF
+75D9307731FCD44EEF157A59117360402DC446F9B58388AD66AD88B8C82631FE
+31E99E3158C25D152EF626EE76B2AAFECA33CC0B9A571C7253D3AB32DCCC1A2C
+11DED910482250F8A84E0C55FB76264A1C4F434CDD85A347B1DF702C8347CF3C
+5461B2F76AE34887964985AEAC9B7ACF13700B60B7C1446ECA269B2E5146AA31
+0F0556C5435B68B92274A4E5B554B0B7A163E15F8D4A0391F1389C3D7BAC8EC7
+A1AEE0C8C79ECD8F6C2A6011BB0FB966134FD1F75C32F515F63F6A5C15323304
+EB0F0C267F5FA8FF55D2E4D64F5184320756B78F8C043B10D267A548EB1E0CD8
+04E106687542C3231D1E8C157A9BBBB053ACA2FC0DE6413D52360CFF6ADA686B
+F2676FCD629ADFFFFE6F818EF61E5E90B2A077790B2B06E0BC1E0B9163982691
+2EC03BC185E8114DBB76298230FE8B82BFB09FE562A0D96C696784D365CAECE3
+A89A1643257B0298449320C35F91980B364D7E589DD82D69C8379B33CEEF951E
+851250D66FFA0F664D6C2A8F61F2C97E925A46547FB698321FC84CD623CC7C94
+223D2B874D39A65264E9B45EE4646BB830F2F62F8B7F391BF70CC3A9C099B7C2
+559F46ADB70B967DBA1B74300C79738BCEE6FCB3C6D9BE839A22D8C7F4930376
+82D2CA6DA3AA63ADAE47FEF0F0812A6E8D6CE62C60181E71DDA511DF008C38B7
+6741FE1D1FDB1244D04809C4DAFACD75070C10CC0937B7FBA274F64252654907
+7BFCDCB0A8095D5BA8687C93BBD90B2AA3085C047DCB8A095640310E0ED49B31
+93DD65DB30F49E3CC07AF9FD1A6EFC7D5DEE306121CF7442C0ED5A1EB49DADBD
+5A0AE4F838C46C78DDE83BAD2AA31EE6E6DD7405970CF09FA9EB5DC00889EC81
+0E42612CD085D64C74C0784C04257F0E708DD74A8D8C06F8845C2B2966FA2358
+4D5DDD2157A00C184E11300D34097737B1CB714CC71070FB05F7385CCABFECDD
+A035DBF8F2FD9B67F7402BA8F589A5AD61A5476178B404188FB908D591E4948B
+FD39377D0AEF18B82D001514B03A123F7FDD63812FD45D62EC971E93EFE90BD3
+9496C49174F0EF0F513C2BA16F6A6507968C5199519BA9D713DEE4D0C2D427C4
+078F347B5120552E2556A42E0FC37BFC7FE8181F17A01B449CF71E093695BFA2
+D53857C0E3DB972244943B67A07D5AF4FE7F6E04C8033EBD20EB55C38AFF58B0
+D04FF4AC82937A650818A480F2A40ABC3F4A26B7F4C17CDF1A7B056EA67E0D29
+01BDBF1DE76DD59523DDFBF39774AD9E4A04CFF23CE673197C6A17015449D65C
+45C56079351A5A16ED030E96D24A755B2C14B6B925D8C30A16B77981B92D2171
+1E77C0C11DBF9ADEFFA03178411F841A109EC7DC45C4C8E133725B7ADF0DA136
+4A46840677A020BE6897A9FD9AB322F27AD0B55B5500D2B48B71D4AAEFB10774
+8553F99DFCB01FC07508200B9367E6C8145D7F1248335E90D32D9E528C4B955E
+B8DEA684A010BF454070B7DAA128C0BDF6AD29810C4CCE310A30080AD36E7799
+9FD52B074E044EE02FA248087EF3D690FD6DA1AB501CCA44D132049479919EC1
+9401487835D2CAF0A89FDFFF635EFA444E8098D4CE6E2C892482F45D002C28EA
+8879170E7A34FD6AEFF140B1EA77C009F30E60B2857609EF8345A0F20F8085AD
+5E78AF3F6EE20F363468B49FC735FF32AC6382F638006B83FC283AB7ECEB0DC7
+0B67505FD5F97105EA4BA11B18AECCA6E5D7EA36C538401F16832183A17BCAF6
+BFB047542E014E2941BE29F8747E6DD07AB13B374AFA63ECA73D4134FD950C03
+DA939E892C35543DB6AE960A18D57490686E0F758061AEE74D40BBEAC328A905
+7A29FEB1EB40ECF45593C6B2829445541DB58D0E8697CCA09C47D6C86B730015
+8E920228398E492FF70A3DB13248033A61DB5542B8327797951A89317C96E68A
+5EF8784D8848222DEF31FE30A9F9E4C12D42D0DE930898DC4446509988E39196
+792F97BFC9A60C717D78D8901C5190899165A1389835DE21EA49EE01B584787B
+8849FDF0146111811047FBC3ABFFE2307E16518093AADA08DF73FDE6227D2BE0
+5DF2071FAB4F7E825B563B3059F8615DA305F51AA2B9906F1516040BD883DEE3
+922D1D905EC34D3F0400CE2492E93BDFEDD8F3230838EB248C0CEFB5ECF929DF
+D707A953953722436BEA6F5DA51A56F7668CD083E9CD7FCC8B736EF8B08442C8
+AC1AFF6DA974FE5E50D1694B3D07B2E47C0238801E7528C04C967023698E5B1B
+23DB992777B22E7448697F2B78A20B98B78A79635104930A408C18C7E6B1577F
+425F2073EE5E17A8998A38DEA4BB12834B6E842835BC711BBBB04B371CC8E532
+2490A6431876346A3A263683C153D77A5BB9B32E3D91B952172DD05C38F72F3F
+A5140DF292545E31C25B27E2791205641375EC542589D61290504CD73B560B2B
+0C2A8AE31CAACCE8BAED61AC04652F2E0977BE269D860034C429B0164585B658
+29EB62078B9B802B4E214FBE0198A76F5C9CDF072D3C3675583E44130306B5D7
+7D2F147BA926C70749525B60374CF6763E273F30F2532469BF6A7A3965E26046
+EA9E93F7D393F8EC2C021987D33A9AB30930764D1534AF53E361EA65B2B64B9B
+4E93768EA25ABF534761CF567552B0B6D52C8C53BCF5E3414A0B653FF21C8F65
+2C6132916466A286C7E498A2897C237AD5568FEBA57B72C7A87A416035CC03BC
+D1EB9DACE25516AFB3A6B6CAE2C70665002FE2DF14C2850662E43C5F05252031
+BBD84960EE0A86C8410082F441B8B594E001133C4D9DFAD9B4F38BC878C29AEC
+5EDDAA290F7FD74C9228995E107A975C70A7A37EF8E01856E978F284F1BB1453
+A44320130DAF09D7064D9867D27A55E3425F5D25B99F553C9202EE42FE8D3AD2
+6C1D34416C520E0483CC2B87ED9D9F39E563A9A0DC421C04B3B9CA8582DADC5D
+323DBCAA108F28E8F11DDB3D0F0B10D4A62C93FF9E2CED79214641160DFE8447
+93ACC0D72E8D30DFA0E368DE8E56C566D7E15E559C409EA8D913BBB18E4BBA89
+3246FD9DAACAC4C5DA87EF5B9A91D10F10D7252F7531FCBC343ECD3D2B674982
+8F0BE87B3E1CA86112FF617A8E63BA92175913CC403038265C5E35621001B6AF
+EBA934372CB68E99920797A6B154557FAA7C3C696A15EC66348E209BDF87943C
+A9F4281847F5C3C8F340C80240F1A93916880670C350B3A9E651EBA7E62F5D50
+9BE78BCDE8E0599FCB7FD9874E87E957D1117CEEC67A63B8862278E015856F2C
+E31898E7FA1436AF76FF20AF5A7E5BBAB5C23E8C0E66C975A290AB6EECC07F04
+C8A37224EBA5D046C7746168EC081B93E0EED2DA80D9754050617DA4CBD3D5AB
+C9C57C0FA2767E7FD633288652C3C4A2C8095D9E8E2A18C887B4D765B2578215
+64EE4227B2A8B3990DE2E0A4361E0C05B145837D58C4BA15CBAB0E79221759F4
+F17BB5097988872A957479DE4734BE905DDE5B8DB9A31FB9C235114974520D2C
+CB6D6284C199A880217364EDEB160F5FB7FC762819E4509FD20E27A5F865EECD
+B893551A9ED16D5E809B49B9AC67763CB67F877EC21D8E2B8A0D06E9936E84B3
+A6181D5831D67A8F2A466A71F5A4DCEF0DD7387CD5B248F2D5981A9F63D8A260
+88B568E1773B13256E440FACF2DE1041CB99397F8B4CDC8CC87447FA6FA0D670
+5B99D0BC94ECB1AD7BAB0DCC66D278E256CC3689DD3B2F036A6A3DCC8FA77FCB
+0A88AB3A3D50C245AAE20ACCEE7ADCD9FC5C9FD53B405F0FAB220385F7D92011
+E527BC0789261AAE6197377DC5BBC9F5BAE3683700F85C63C0DC59B02BF8B65A
+800DE3BB27A3E75A87F6A550C787F67B1430369268BB61CF5FA66D8F5221543F
+2CEE65CAC0BC2996F73B71783E5BB43B030C90A5FB13CD66BC659A3AC2E897C4
+500CA657F16F70759F0DA8D712F4E94BAFD3DBA866DFA8D7310A44F240522200
+C8F14C7CBF9BBC33276B623C746F7D0A4D76AB13E39DA19E1308EED0A388A23F
+D9336D3532151A416C720052128793385DF6B68D3BDDAADF8F7FFB53260B81DB
+321B33EB566593E390158B80DC631545A66C3CC2BDDB61446A6298D884389303
+E2E55D64F430F35271060417EA4350B783041A7607D44DA3452D304797C03864
+DE4CA134F33471E959A74DE4A8403BD5A1A381BE22221ADF76F0B71F29C7DE1C
+9FD94E0F158182F6DE7689A96C555D2D9F1FF664111F56B147B650BCA6FA1FAD
+9ECA4488EA201C8BB72F63BDDFBE7239F13C46C492F320B4F06F34A668F657C5
+CDD4FC447C67E1BAC54C99666DAA9E96ABC836BDF0980239245D48227C14E811
+FEA8C345C2BEE84300C746016F98893E12D296C64C2119208E4C203A8EABDFB6
+699EC1F750DB57FCBC535E0929123F36A0113E6CDAC09149CE5865B9B1DAB041
+A74C6EB8EF0E8FDD6DED8C67B849324EAB11FA732BA2EF27E11190027F657912
+31A49FDF69D97032A07C66B79FE3F39594FD7DD3BB4570A90747E908D0121A05
+27D12831D23C466F31E31C5B3CC636880DEB158BB4A2AC34114299987E9F8F53
+B0A28EEFC3A259F49CBAD20BD7BB4ACB07726033CB8ADF88E7FE0A0DBFDB10B6
+21669AE4942A298072C72522D34E16987ABB7FF0236EF31B00EF6094024AED38
+CF83EA391CA265E5C6B8B63CE728CBF008756D4F1CF35E0E39B7B17A0608FC37
+78CB7864BA7EE90401AC2CDBFE9AAE8E3F726B41DA0BBFD7E503BC01ECDDE23D
+15A1954FCAE479BC85DF88D0044F2403A75F26276D16F8F125BBA3D166DAE700
+8F0C3A51CDB950B603FC44DCEE18028B36282DA5D7C4CC9C79EF2C879A86A1AF
+467CAA95AF247AC7EC18B7282E5A9863473871C679368C9438FE626962BA0D02
+AB329F7F03BA30FBC62A855DCEC3C4099A003F8D6F6FC94D5B7FF9DA05331BE9
+21B06F9CD00C1E2C5F694307ED8D81D474E70BDED837C8973AF6405115C85E57
+7D64640D85C0FA0FED12BDC55DCA2285DF9DA4F9E48361C00AF5F61C57E4E1C9
+60FC8DEA6C2EFF9654CD220D626CBE75E183368BB8B093FC64BF13B90F935756
+F87FC508F719472F96A7E9732C2B8100354A59C88BD82BD12E485EA7680EC9A7
+FFE0A6636C8D0A423D0432561649BA335E8BACBC5126BB4F796EFCE6DF8B00F7
+01DB1C7FB57D15AFC69470774A735CFD876711AE3AF1EF970A1FE154927A0A00
+A68D4CA6899CE12A1A26CF5393446B436F40D5A47238C053F3248C5929C2B5FA
+EA441400AD4B928537A636AB45FEE4F298DCEA28FD29641C41E51926C2FA4F12
+BB1187C4F050FCD171A9EF0954EEADFD2807956D09CD6EE2A4F4B88B54F3BF6E
+653A02FCC95A3BDCE0A0FD9F3F6E74222A52E2D424857E9A4973104842E1C308
+215467C9F5F9943126BA74589C900B74CD8FCBE53DD73FC9063A5B4BFB708DD5
+B8E30211679F57FBC99D651918A04071C6163EC8205AA0BF84BAF8CE8B05193E
+DC677B30A87722E97F961F3F7024FDD5E0A54A30855E8B7A27715DD055F396F4
+E3DA37B23D51C0430D159EAE4116ADEAE6CCC19669593DB3EAFA37E960D63B0D
+34E00C124CA2A621A4D13E2EECE188BD060714E0A5D38EDB57D0FE37E01A3166
+9DAE1B44103702832F003CDC90632C47720FB444223824A893172441238C11DA
+87D57D945EFE864C0FAF9DB4019041D5BCA4B7CABAEE9264F7D0664089252A10
+142B31D8ACEB1D9C8A46A1EAD878C189BC82179911717C4D6DE3A4DDDB117D94
+851A5F735F8F64F6343B92C0C697963DEDC4FECF1D6ABC5276D6156A40C4E53C
+93559EC3E3518A3CFAA0E4F1B296E9CDCCE30FF6D429A927F85980F3A424A719
+050EE1E6DDAA47E6705E996A65E1F805333B9728F4E9E7C8B3B3E29AA68D95C9
+124F5036334D202E1E4A520F47FAEA47FD2AA761E99029365E00447F13FAD190
+DEC04F8356327345FDEB37C79E467BFF87218A40217598D40965C5E06ED0F93D
+AA40CC9445A2649F9D6D8C90FAEA395733E71F8ADE555E2166892B3FCF84C749
+268430344C7E70ED90C9858A74428382BE6E04D39174C1A52FD6727CCEDF3FA4
+55083E08ACE62339128CB8687F00C8DEAD4B7C7F2176154C5A2D2A854B72E3FC
+9EA3320B701637A137EBC3C819CB06F372B543C0E929BFF3383DF0C4B093589A
+40417511C97C3CAB64C88C26743683534320F8CD312E9B48E5683E4E05FC1A22
+7CA3CF17F181D1B581FBAD827964CE1F911F6C48CD868A9F6F1250215C1BE545
+48F29F82CF164AC3376AC9CE8485D2DEE18D515F12726E501AB86E2A904AC445
+5B3859CE24028493A520F8118834427341C7167FDC4731449E9080400929C0E0
+97328ACBC1CAED6C5042AC37E84F5A122DBBF261049BE6D7AB0E688CFA9E457D
+DCB4004DE6E5EF19D57409062F918C6FB0F09B434F30C8E609A11071BCB2B5DA
+A22F9AEA81C48989A244E8BE97BA8CF9A09E9611D47A9F77948B3FF43CE6F378
+71BB181A69867B6E6E01725992C9DD2FA6EE02107375D0C5876FCE49A3E1F3B1
+6A15DFF1BF3DB92ED9162BD4A36AEB4F3FF40E7E71B2B81FC4E372C941243F90
+C959651A8F98C0441B854097EFA8D66FC76FFD29CE9E786AFA3AF08B5C83660D
+7FE132D95866BEEE0E475F04367343112880F80DF8532D14D8EE4991858B0CFC
+2974C53D70C60BA9C6707307699397C30EE5044208F391809C2B7884D74C77EE
+52A34E2D9EBED8C9AD77F8EAF56676AF405E9A162D5970AD68959AA0C01AFDB2
+AF2E7641A58B894E5EE279E723C7BEC3ABD82D5C1BA27F68394652E942E47061
+C2C8B460209A3D141F23E97AEB68872AA946B5D8C65FBB792A8F9A456B755A95
+18434B1A9CD425243A2056307B26386E64BDA30500018C74B38D9CC6BFC7D87E
+52BAEF36B97B8C41FA46F38B4D37813EE37584E5B36FE9DDBECC8C6BF6646194
+59BF4AB637100456713A84BD505FBE9833956C028AD7C521E8C5BDA9E7088760
+1DEB596FFB35100C01D7EB2660A048F2F6AF924CA0A7C1FEE2987A590D9D5C11
+B0F7B5DECD35F54B4CCFCC7BF8370B7A3184A91ED8B963CF9D180CBC7BD83339
+66866C3B335DFDAB771A7C476650F6AA7925E12B2223EA09E7D2BF80E584298E
+3B114466520D713D3D14D73CCE9BF05DB6870D48564C12CAED2A003BCD295E3B
+0872B5FF1896822188C70CD5D25A039C49D49453AD7D379EA749A3FD3B119D1C
+68E98559EEACF0E6BE1DA9D4BEA3A827BCD4BC75AE6013EF1402F744624FFC00
+C17DD16B4E1C44B8B0FA8791FBAA3C3B6E60561523BBF45357BE6A550302D720
+11DDC010C02178E35528C3D6A40078C6ED2E0AE8F1E9C14D9769C3BE991FBC2C
+3F615E83420B9CF206A6B3C9DC5415BDE571BC3B9444BFD5269092D0EC2791C1
+2FCFDE8CACBC5729582143F36DA9CE6D36C5C66854FCE9C29F3189AEB11694B8
+08873FE32E8292FD57B9CE6E4F6B1DC76FEA98EFEBFCED91001B7FC2A78211B1
+F30DD80DF6F6973211A5D76E000D4F73DD012C62E760732C8D2A94FE6404165A
+513EAAE7958D8E80D47F8E4CCAA1C8822944ED82CDDF945E3C990F075CD530D2
+45E0143743A9310C6E493C5E8D4C6D2672C1834AAF7D570C53347AAB358B217A
+65C336328D667D6CEA6BB97EE648EDD4AB856BF8736E036B559A2BB0D476CF60
+F559841C95C1D8DC962F85E63B2C19D55B106D93B896D87D10B1AA94E36433F7
+17EFB0655E5119BA27D08E75DB75DC2895E922EA7463EE9D5FD7E2DA9B0D10D1
+9F31FF30539C079965DA102B2B61E026BF4F425AF25203F62C6606C904C35A3A
+F766B098EED1991E893128512DF0F35E2C0C196601889B6380CAC542BDAFEC17
+11C265A9C773BD7AFF7483FFACDCEA528E66DEB207D5AD57DB3D2CB955A14B1C
+75190E70CE5B650B021757BC64C5D45FA12239041ED5374147540F7E1E06ACCA
+B06DE83B2FF3CAEA93CBC27D37AFDC748881BEDC30BE2118F542ABC14C6F58F0
+A9D6E9FE325657A14462B4D67BF2EB05E5458B120821A75EA86D102DDB92E9CC
+9DF84F5905A7A3A011C8A7A62F556BB2712AE28CE5AA49295717B08727FC6BA8
+E06C6ABAD51FA0AD08E1821C547C599B4134D6DA36E10A6679425C2E6C56BB5C
+CD56CF0CF5069400F9396411AE4F4BF55988646FDFF2290935252C290153044C
+E30C6FFE0A623A697A5EA25C34FBEE0A9D429B88D1512C21E55CFC5715F76027
+1F863D57EA37AD55F910E131A7A7F7C52F4CCAE4434F300461F77305EAEDE26E
+A782B9FE2D4DADF5044F4B912B09B0AF19EDD486C433D682914650AA408C965F
+2CE16EA10005C4F63E23C5E26939C04FBE91C6C021989AB11BC1E9BAEC5ED9A2
+43F8A29BEC53480EE5841392FC2A89CB596589BE8F2F63A56B17B053C2189EDB
+1372F17B54C2CED7D1701AB04395AF3B36DA19D6B2316ADC443E068CEF52477B
+369B931C69579CCF750BB165D6BEF4205CAA35014EA9A678E4891AC0B9B28110
+D9436F71FFD26EB44053A0DC8A846CC31F1B42096CFD3CD3EF42628517FCAFF7
+FC7B26526B9CADEB536A0B583988637177F5A38370643DC4902AD7C65389676B
+2AC2E025A6BDFE6728151DD4C639847C47F00281B382CFBB9FD0833315A7B381
+03327EE5C2E7B4E107EF3685481B63676B0081BE25A5366BD5BC5E06CAC15A60
+25A2EBBB8C9FF37B73E75253EE0CECDDB404779EA69D2332EBFEE235808DE06D
+66BFE466BC0306A120701FE469606DC96BBB1549AD053D06840D530DC1928FB0
+2D8AFA1129EB725B62982248437715E44ED3C0BE04951EC65ACF23F433AF7067
+60FF11CC949E4B5E1F5C8143B8DACEBB520A490AE110F2E0148D10F2B7B9D7D8
+9B445CDCE2A80240DD31A57FBCBB1C99652E4CEEEFC56ED9A4A02A87BAF808D2
+F2F3413A885F57548170B80E001BA0BDC645F3D55BF251EAEB93141359C10BBF
+69FA01583A539E5A76D55EF88B9249487EEED62396103F854F573F91C04FC363
+B3AF64C1244BB7563E4E4837AADFB652BF189D3AC0A8454FA57CE6FF252EAED5
+E3EE3714BB613DD8BDC6128C13A0E8E0CCF2AEEF10063E32FAB2E54918FBEF3E
+1986208B7986F4084768DE289A4AF319C863FD5CF564A72EB7F437DB8DA6DA80
+D33DA28F7987F9C86547904B0F49F351D18F705C4A178B468ED43E179C43C276
+26E5054AA42CC7B5B00FC14C61C25B11A9D5A5DB3B1806F60248CBAEC06C068C
+ECC0AA85F07856F5F73C0AD13308E6FF55C6C7649B96FD3E4B291B9188ABF764
+34610CE0A73EFC9E52357A2BECB4E6ABCC3C5EF8B1350CE3B1907A104690C865
+4D6FB2A1293B00533867EECBF8B1831B753DDE5C683153533A89FC6E3FC0700B
+61CB7C10C37800B8DF5A40732F17322F4464E7057166C966F1BFDA555129648F
+CFD85AD185410961C086CD5B6FA08619FC943100369C186BA5F3E5D2D4B00CF7
+CE3D23D6166F5F2AA31B0B4CFE98CF190841F69AEFF503E7E49838E4BEB81E0E
+9DC3104632B0FB4A6A04D87D02E9C15AA4F046D39B670F5E37827EF6DA926CA2
+3686FC4E27F14D5755B9312D947096C5EB2F1277DB6E843A168261C4E36F36ED
+98B4825791F6335BB8397DB9B5A3C0561621CA93B143AC978B6549AAC5AA047D
+63F39B84E353120DB184F52CAA1E2CCE76F15AFC6CB7F3C507B2944B354E182B
+225E43C25A92C6396C9CDBDDC93E8F5FA2ECB9B9399CA05CA7CCBEC2A9CE968A
+D089CD94001FBD5F8B1E4060B6B55A7DCCF5B1972E3B532C98C555B000CD28AD
+D93033AAA45346EAD38E49B3CD0F272B5CC2609A26677761131815F64753C5A9
+CC335864E866D94ACFB45EFB67692F31C126B256B4112ABCE4C6EC415AE492AF
+B68C14AF756ACA050F179E2DC1144A744C12121F92E3985962791540BD21B304
+864BEE24C5DF20BE89A70E0D4B797338364993D66A1FE2232ADB3D1374111A63
+DCA4B98912B7E3A6E35A457185418835A5B9675C53752B8D5F53E9C01E0F6E77
+51A6350D29C04E22BA5897CCCB579DD5F90FC8482307030DBB6E8561BADFD1F1
+5FC063DEFE5178BCC1A5F4DE534704AE0E43BD1535A12CCDB14AA1D0C74B641D
+658DAACF0059A434EE6282078C1E80F85A34C3228F5F7FF83F89603613B84478
+EE02C184414F84FE7970785ECC2EDDCAAD88FF94E70D3DA9D4747F95080A3C1A
+2EEDFAF5D4ADE27B99436F2E22E18EC8D061E3DD90EC70948BD50D1EE2C8C4E3
+A0D988D36146419C05EDBA0DA61FC95218CFEED1FCBCC91F419FAE7B43D4077B
+44C025532B9AEF5C2D00F08FD4B0CC118222EA16039E16B2B21674F66AB6CD6F
+6E1F1F54DACC75DD1734EF3318D1364F840E10B44842EA2D710D2A36F3528458
+2C68D67B737B90617D3598125CC89EEC39851131EDD077DDFA9CFCD9DD7FBBF9
+DB8470B9E0DCAB56428F1508E3BDE08CB9F91630BE44D6729AB44D3F9CC25BD0
+5358EA6386EF07D8FAA843A187A9FDE319AE69E85801E6901D6CA87D8CFB171B
+FB248FF2EEF1C6AC56D9A36D648348385ADB4B8A7D614794D8F422972A9D4C80
+3F8E33F1B2FC23C480B27E3388B19FE3544AC9461525199447BE809A04714F7C
+F3E80752A16AFEB451720ED3F5DBDAAB5E4B118ACCA148ACB99AE24DC09523E0
+BFA40A88965E69C047E7F00C8A01A0588EB3B47E99293C9284599DBDD099D52A
+A0C2033D88BAE5984261681C024174906F98B99466F38D0DC29337F69B14D3F3
+50843FCBEEFD2BDB556068FD7FC654F087886E1CB17FA2279C3986A3966611C7
+DE7EC1CB51937AF2501369166E96A4DD0B124BEC75588C348B22DADE47B6BAD7
+D1F7C5AC2122B02CFD2218D962C305B2953F7B6D36E4316450A8DCE29866EDB8
+5D3B93CF031A439C48BC55A217BD7A6617E09F5677DC5986AECE3EF80FD633BF
+56D49E21D1E672027461FAD4858BAEAF550D408E71FB357886DCA559931B5149
+8CFFA9C48713600FF392D880B1002C70EA2085E64E217453F873BCC05E5F7CEE
+E5DE1C0ACC95275D4DD32E55147E507150FB2607DDB5E6D3A54F89B3CFB40232
+0D6F40457D714A60AF7DE113F9A0A2DD661FB351B58DF3B626754DCF3D51701F
+BF8B731A4A8F3A143F6782C5F0ACEF6F0774A7C07BC4554C28F2F2D080EC9183
+CD210B3E29032E28F01FA1C16832671DD1699DF342EF00452C34B2779BEC9124
+3C64C978950398237F1AA8D66A3A39A0D7088B271C054A9143D65ACDC3E1F0C7
+7E9F868F07083F55A6386337793D9E8EF88E6CB1FE850F0116B2E1088E1DF2C7
+4AC396C84CF0F35E635140E7A6A19E5E39902A2B52499071247BC39266519B64
+52F027A9EF68DA6F805C47C5B6ECC0A9ED5DB79CB1901AF8CAD2F7B9CE609BD9
+3EC6057888FA4D0AAC5B0DEF146124789E8B6903BB4EF9C05A4EF964EDEB91C1
+4CC2614FCB772D3C72B6DC4D056F185FF3C9F7C96018FBFBD40A636C33810DB4
+47FC8CBDC9962A72404AF156B17D69CBAD1F07B4E75CF402F68097E7588D78BD
+3C9DD1122ED7916C4C56D908F84B2218450E35209DE1A30E71B416898AFB1F3F
+25242B70EE33FCDBD00C2A103A3590AE3B63C5900696365B0F018B80618D0F72
+EB994FD8DCFDDA7EA3CACCF393872EFF39BAEEC6BEDEA67D03AE98F2249E84F3
+6ED37EE5E993EB96F282D0270C794F2FE622434EE5C99C8677B572D1FCE4EC13
+A1B171193307A7C8A81DED947154D90E58E2BF5281C56892201F6C8D287DDCC0
+11AB85EC27554BE0040FD227E027F74847B16D6BA060F75208D12CCE7FA44044
+A08917508036BEAF1D9B9D940C1CDB2298793700F940333A98BCD90147DCF127
+C6B99F4BF49EE656CADA2F4C7EA905A755879E7F692F4F39ADF6EAB7AEABC171
+2A72D147F1CDC0C864B12EE0816399FA7D125CAF57AF89A440D25333D568845F
+B4D6B8EBC58A521073BFBB6D9F860980767343CADF8414D5EC167D9C7BC40B5C
+97FBDD69B3DAC25E87C4D167F376472AD826A4EA0511278C8D9DD9E47F687108
+7C53C4721AEA016627E47487C871A6A6B1FA52CA703169AD6C785415CF63E06F
+CCC95C2FC29097A3F114B5BFE53D0D0D15AAAE7A81211510A28B8DDD2E9D3F5F
+9585367A2FE0E43F1CAAC3BF4D89BF38CD362B57667F97E202289EE40ACD4E76
+247E1C2BB25F65F2BF20745FE3A19CD048228ACC97CB8F66EEDE564758535AF8
+3DECCA4F5251099F649C7F296C068A69EC6EC2ABB93876CF4DB6C9D1B924570A
+5124C65A88FEC62E1DAA87BF2F22F179033EFE247A114ED8753A12F642B32D96
+7EF019414141E494C1A98B7396EDF2427C235EBE37B47A8CB2D6A9F1947A52EB
+D437C9354185B43A4AC299C20AC267FA110508FA24DF66E2EF53A781B0000D06
+2B3589A4E8FC4277A956BC7EF8CAF57FE644C44198499F566DC3843EE31E17A1
+E63B14A615A3B89AD5F16B34EFE495493112F536ABA91750DDB8FD1F558BC74B
+199FF3A48D9BD0DE21B54E3387805AD1B9F105E511569AD44D1191207557AAE5
+CDD74D81C65FC06598248A72A91E9865E736FEB8526E1532620BFEFD7CDBA684
+70F0EAACDB044A1FC37BF155BC61500A207BA16200F7A7EF5C98F7C0BA0CE63D
+DAAF59F0FD04BE25E822AC796F52829BB0048393AADDD343D25734A256C6CA04
+F3F5F041264034247668EBF3C859103930B3B08C595BF890CA60C1E429233A39
+E996C06BE6EB32CD6A1560BB6378C435A1736AFDAE01C0A13F37B8E9C3334DC3
+C385AF8FE1AAE8ABB777EC8555DE3E74A433D47217F9D05CC291D9936CB04652
+9E3DC449849E4E8A012E8DF58F8DB4D3B042445DB2A5F3E98B2005746950F402
+A22085D5DDC5FEF15D8D38DDBC6E5F8261506E3C508EFF3B7C08C1EE8E4B1349
+A845343908E5B9F93CA25ECE6AF6F3AACF4BF3350C703C582842F59CEEE1025A
+406082C780B92205B359155B095CCE851DFE85D83D6842238E0E15DE2DA0BCC9
+F03921E124EE06E5A282DF6F82B2ADD92D0BA0ADB809BBEEAF5DDF399B26A608
+7E89D51E25EC5E70277FA6A96C4F786BA1BB8478A975989F4014887BC73F16E7
+335179472B4B623F160CE46ACFA8CC210652093E8361DE1735A2AD37D923A906
+838167A8060DC4B749F6B62381ADB5B8932502DC3FB47236FD7837172F22FFF1
+2C33897F244B9873F88A29F222299D7E08F79D07FEE3E4ED09F5F9DD29E9E7CE
+450FAC5DDFD241F896AF6680B45011D095CACD10C395966A9C6DA794EF0E81DE
+68298ED97FAFBE0ACE1430713BF604E55CBD770F5B120828AF486B25776581AF
+F6D733602666FEA868B6AE2818B77E7FD71F06A4EE3CB15D19DDF679DEAF17EF
+E0DF14CDDA21C09B4A6FB966CFF6F8B58C042A7F0BD75DBB6DB7EB81C1C134DE
+D84BCF8E507600DFA6D5AB32E9A27BF4DB8EDB419C4D94C6B934B1FD9462E7F9
+CFBAFEF8FCB7D86FFDED8A7470A0A4D8113FE70EA8DE74E19C5F5ADC4B01D4C1
+B27E1393D3449B1285D6F0F0A9041B936A41C3218941B33D3472F46DDA0DEC84
+A0339B5218CBE53DE3516774BA6DEA013C9FB3039BF4DA71BD5D6A5C5CA415C8
+
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+%%EndFont 
+TeXDict begin 40258431 52099146 1000 600 600 (rluserman.dvi)
+@start /Fa 134[39 3[39 39 39 39 2[39 39 39 39 2[39 39
+2[39 3[39 97[{ TeX09fbbfacEncoding ReEncodeFont }13 74.7198
+/CMSLTT10 rf /Fb 134[39 39 39 39 39 39 39 39 1[39 39
+39 39 39 39 1[39 39 39 39 39 39 39 39 39 39 9[39 39 39
+39 2[39 1[39 1[39 2[39 1[39 39 1[39 39 39 39 5[39 8[39
+39 1[39 39 39 39 2[39 39 39 39[{ TeX09fbbfacEncoding ReEncodeFont }48
+74.7198 /CMTT9 rf /Fc 134[65 65 89 65 68 48 48 50 1[68
+61 68 102 34 65 1[34 68 61 37 56 68 55 68 60 7[93 3[94
+85 68 92 3[96 116 74 96 1[46 96 1[77 81 94 89 87 93 6[34
+1[61 61 61 61 61 61 61 61 2[34 46[{ TeXf7b6d320Encoding ReEncodeFont }
+50 109.091 /CMBX12 rf /Fd 134[48 48 66 1[51 35 36 36
+48 51 45 51 76 25 48 1[25 51 45 28 40 1[40 51 45 9[93
+1[68 66 51 67 1[62 71 68 1[57 71 1[33 68 1[59 62 69 66
+64 68 19[30 45[{ TeXf7b6d320Encoding ReEncodeFont }41
+90.9091 /CMSL10 rf /Fe 138[39 27 28 28 1[39 1[39 2[37
+22 4[31 1[31 1[35 5[20 6[51 39 52 1[48 3[44 5[46 48 54
+51 50 53 15[35 3[24 5[20 39[{ TeXf7b6d320Encoding ReEncodeFont }26
+66.4176 /CMR8 rf /Ff 150[30 30 104[{ TeXbbad153fEncoding ReEncodeFont }
+2 74.7198 /CMSY9 rf /Fg 134[48 48 48 48 48 1[48 48 48
+1[48 48 1[48 48 48 48 1[48 48 48 48 1[48 48 1[48 2[48
+14[48 48 1[48 1[48 2[48 48 48 17[48 48 2[48 5[48 39[{
+ TeX09fbbfacEncoding ReEncodeFont }33 90.9091 /CMSLTT10
+rf /Fh 135[56 2[56 54 42 2[51 58 56 68 47 1[39 27 56
+58 49 51 57 54 1[56 97[{ TeX0ef0afcaEncoding ReEncodeFont }18
+90.9091 /CMCSC10 rf /Fi 139[30 37 38 3[51 4[28 1[42 56[28
+33[51 12[{ TeX74afc74cEncoding ReEncodeFont }8 90.9091
+/CMTI10 rf /Fj 209[43 46[{ TeX74afc74cEncoding ReEncodeFont }1
+119.552 /CMBXTI10 rf /Fk 134[85 85 2[90 63 64 2[90 81
+90 134 45 2[45 90 81 49 74 90 1[90 78 12[112 6[153 97
+6[106 1[117 1[122 15[81 49[{ TeXf7b6d320Encoding ReEncodeFont }25
+143.462 /CMBX12 rf /Fl 242[91 13[{ TeXbbad153fEncoding ReEncodeFont }1
+90.9091 /CMSY10 rf /Fm 134[71 71 97 71 75 52 53 55 1[75
+67 75 112 37 2[37 75 67 41 61 75 60 75 65 9[139 1[103
+94 75 100 3[105 128 81 2[50 1[106 85 88 103 97 96 102
+11[67 67 67 67 67 2[37 1[37 44[{ TeXf7b6d320Encoding ReEncodeFont }45
+119.552 /CMBX12 rf /Fn 129[48 48 1[48 48 48 48 48 48
+48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48
+48 48 48 1[48 1[48 48 48 1[48 3[48 48 48 48 48 48 48
+48 48 48 48 1[48 48 48 48 48 48 48 48 48 48 48 48 48
+48 1[48 1[48 48 1[48 3[48 48 48 48 48 48 1[48 48 48 48
+2[48 48 48 48 33[{ TeX09fbbfacEncoding ReEncodeFont }77
+90.9091 /CMTT10 rf /Fo 131[91 45 40 48 48 66 48 51 35
+36 36 48 51 45 51 76 25 48 28 25 51 45 28 40 51 40 51
+45 25 2[25 45 25 56 68 68 93 68 68 66 51 67 71 62 71
+68 83 57 71 47 33 68 71 59 62 69 66 64 68 5[25 25 45
+45 45 45 45 45 45 45 45 45 45 25 30 25 2[35 35 25 4[45
+20[51 51 53 11[{ TeXf7b6d320Encoding ReEncodeFont }81
+90.9091 /CMR10 rf /Fp 134[102 4[75 76 79 3[108 1[54 2[54
+2[59 88 108 86 108 94 11[149 2[144 3[151 1[116 2[72 1[152
+71[{ TeXf7b6d320Encoding ReEncodeFont }19 172.154 /CMBX12
+rf end
+%%EndProlog
+%%BeginSetup
+%%Feature: *Resolution 600dpi
+TeXDict begin
+%%BeginPaperSize: Letter
+letter
+%%EndPaperSize
+ end
+%%EndSetup
+%%Page: 1 1
+TeXDict begin 1 0 bop 150 1318 a Fp(GNU)65 b(Readline)g(Library)g(User)
+g(In)-5 b(terface)p 150 1418 3600 34 v 1873 1515 a Fo(Edition)30
+b(5.2,)i(for)e Fn(Readline)e(Library)h Fo(V)-8 b(ersion)31
+b(5.2.)3333 1623 y(April)f(2006)150 4935 y Fm(Chet)45
+b(Ramey)-11 b(,)46 b(Case)g(W)-11 b(estern)46 b(Reserv)l(e)g(Univ)l
+(ersit)l(y)150 5068 y(Brian)f(F)-11 b(o)l(x,)45 b(F)-11
+b(ree)45 b(Soft)l(w)l(are)h(F)-11 b(oundation)p 150 5141
+3600 17 v eop end
+%%Page: 2 2
+TeXDict begin 2 1 bop 150 3024 a Fo(This)29 b(man)m(ual)g(describ)s(es)
+g(the)h(end)e(user)h(in)m(terface)i(of)f(the)f(GNU)h(Readline)g
+(Library)f(\(v)m(ersion)h(5.2,)h(26)150 3133 y(April)22
+b(2006\),)27 b(a)c(library)f(whic)m(h)h(aids)g(in)f(the)h(consistency)g
+(of)g(user)f(in)m(terface)j(across)e(discrete)g(programs)150
+3243 y(whic)m(h)30 b(pro)m(vide)h(a)f(command)g(line)h(in)m(terface.)
+150 3377 y(Cop)m(yrigh)m(t)602 3374 y(c)577 3377 y Fl(\015)f
+Fo(1988-2006)k(F)-8 b(ree)32 b(Soft)m(w)m(are)f(F)-8
+b(oundation,)32 b(Inc.)150 3512 y(P)m(ermission)g(is)h(gran)m(ted)g(to)
+f(mak)m(e)i(and)d(distribute)h(v)m(erbatim)h(copies)g(of)f(this)g(man)m
+(ual)h(pro)m(vided)f(the)150 3621 y(cop)m(yrigh)m(t)g(notice)f(and)f
+(this)g(p)s(ermission)g(notice)h(are)g(preserv)m(ed)f(on)h(all)g
+(copies.)390 3756 y(P)m(ermission)k(is)h(gran)m(ted)f(to)h(cop)m(y)-8
+b(,)38 b(distribute)d(and/or)g(mo)s(dify)f(this)h(do)s(cumen)m(t)g
+(under)390 3866 y(the)j(terms)g(of)g(the)g(GNU)h(F)-8
+b(ree)39 b(Do)s(cumen)m(tation)h(License,)g(V)-8 b(ersion)39
+b(1.2)g(or)f(an)m(y)g(later)390 3975 y(v)m(ersion)28
+b(published)d(b)m(y)j(the)f(F)-8 b(ree)29 b(Soft)m(w)m(are)f(F)-8
+b(oundation;)30 b(with)d(no)g(In)m(v)-5 b(arian)m(t)28
+b(Sections,)390 4085 y(with)i(the)h(F)-8 b(ron)m(t-Co)m(v)m(er)33
+b(texts)e(b)s(eing)g(\\A)g(GNU)g(Man)m(ual,")h(and)e(with)g(the)h(Bac)m
+(k-Co)m(v)m(er)390 4194 y(T)-8 b(exts)33 b(as)g(in)f(\(a\))h(b)s(elo)m
+(w.)47 b(A)33 b(cop)m(y)g(of)f(the)h(license)g(is)g(included)e(in)h
+(the)h(section)g(en)m(titled)390 4304 y(\\GNU)e(F)-8
+b(ree)32 b(Do)s(cumen)m(tation)g(License.")390 4438 y(\(a\))39
+b(The)f(FSF's)g(Bac)m(k-Co)m(v)m(er)j(T)-8 b(ext)39 b(is:)56
+b(\\Y)-8 b(ou)39 b(ha)m(v)m(e)g(freedom)f(to)h(cop)m(y)f(and)g(mo)s
+(dify)390 4548 y(this)32 b(GNU)i(Man)m(ual,)g(lik)m(e)g(GNU)f(soft)m(w)
+m(are.)49 b(Copies)32 b(published)f(b)m(y)h(the)h(F)-8
+b(ree)34 b(Soft)m(w)m(are)390 4658 y(F)-8 b(oundation)31
+b(raise)g(funds)d(for)j(GNU)g(dev)m(elopmen)m(t.")150
+4902 y(Published)e(b)m(y)h(the)h(F)-8 b(ree)31 b(Soft)m(w)m(are)h(F)-8
+b(oundation)150 5011 y(59)31 b(T)-8 b(emple)31 b(Place,)h(Suite)e(330,)
+150 5121 y(Boston,)i(MA)e(02111-1307)150 5230 y(USA)p
+eop end
+%%Page: -1 3
+TeXDict begin -1 2 bop 3725 -116 a Fo(i)150 299 y Fk(T)-13
+b(able)53 b(of)h(Con)l(ten)l(ts)150 641 y Fm(1)135 b(Command)45
+b(Line)g(Editing)40 b Fj(.)20 b(.)f(.)g(.)h(.)f(.)h(.)f(.)h(.)f(.)g(.)h
+(.)f(.)h(.)f(.)h(.)f(.)g(.)h(.)f(.)84 b Fm(1)449 778
+y Fo(1.1)92 b(In)m(tro)s(duction)30 b(to)h(Line)f(Editing)25
+b Fi(.)16 b(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)55
+b Fo(1)449 888 y(1.2)92 b(Readline)31 b(In)m(teraction)16
+b Fi(.)h(.)e(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
+g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)46 b Fo(1)748 997 y(1.2.1)93 b(Readline)31
+b(Bare)g(Essen)m(tials)c Fi(.)15 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)56
+b Fo(1)748 1107 y(1.2.2)93 b(Readline)31 b(Mo)m(v)m(emen)m(t)h
+(Commands)14 b Fi(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)44 b Fo(2)748 1216 y(1.2.3)93 b(Readline)31
+b(Killing)g(Commands)22 b Fi(.)13 b(.)i(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)51 b Fo(2)748
+1326 y(1.2.4)93 b(Readline)31 b(Argumen)m(ts)25 b Fi(.)15
+b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)55 b Fo(3)748
+1435 y(1.2.5)93 b(Searc)m(hing)30 b(for)h(Commands)e(in)h(the)g
+(History)d Fi(.)15 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)56
+b Fo(3)449 1545 y(1.3)92 b(Readline)31 b(Init)f(File)g
+Fi(.)15 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
+g(.)g(.)g(.)g(.)g(.)58 b Fo(4)748 1655 y(1.3.1)93 b(Readline)31
+b(Init)f(File)h(Syn)m(tax)13 b Fi(.)j(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)43
+b Fo(4)748 1764 y(1.3.2)93 b(Conditional)30 b(Init)h(Constructs)9
+b Fi(.)14 b(.)h(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)39 b Fo(9)748 1874 y(1.3.3)93
+b(Sample)30 b(Init)g(File)21 b Fi(.)c(.)e(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
+g(.)g(.)g(.)g(.)51 b Fo(10)449 1983 y(1.4)92 b(Bindable)31
+b(Readline)g(Commands)12 b Fi(.)i(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)41
+b Fo(13)748 2093 y(1.4.1)93 b(Commands)29 b(F)-8 b(or)31
+b(Mo)m(ving)d Fi(.)15 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)56 b Fo(13)748
+2203 y(1.4.2)93 b(Commands)29 b(F)-8 b(or)31 b(Manipulating)g(The)f
+(History)18 b Fi(.)e(.)f(.)g(.)g(.)g(.)g(.)47 b Fo(13)748
+2312 y(1.4.3)93 b(Commands)29 b(F)-8 b(or)31 b(Changing)f(T)-8
+b(ext)30 b Fi(.)15 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
+g(.)h(.)f(.)58 b Fo(14)748 2422 y(1.4.4)93 b(Killing)31
+b(And)e(Y)-8 b(anking)17 b Fi(.)f(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)46
+b Fo(16)748 2531 y(1.4.5)93 b(Sp)s(ecifying)29 b(Numeric)i(Argumen)m
+(ts)25 b Fi(.)15 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)54 b Fo(17)748 2641 y(1.4.6)93 b(Letting)31
+b(Readline)g(T)m(yp)s(e)f(F)-8 b(or)31 b(Y)-8 b(ou)19
+b Fi(.)d(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
+49 b Fo(17)748 2751 y(1.4.7)93 b(Keyb)s(oard)29 b(Macros)11
+b Fi(.)17 b(.)e(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)41
+b Fo(17)748 2860 y(1.4.8)93 b(Some)30 b(Miscellaneous)i(Commands)13
+b Fi(.)h(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)
+42 b Fo(18)449 2970 y(1.5)92 b(Readline)31 b(vi)f(Mo)s(de)d
+Fi(.)15 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
+g(.)g(.)g(.)g(.)56 b Fo(19)150 3212 y Fm(App)t(endix)44
+b(A)99 b(Cop)l(ying)46 b(This)e(Man)l(ual)29 b Fj(.)20
+b(.)g(.)f(.)h(.)f(.)g(.)h(.)f(.)h(.)f(.)74 b Fm(21)449
+3349 y Fo(A.1)92 b(GNU)31 b(F)-8 b(ree)31 b(Do)s(cumen)m(tation)h
+(License)c Fi(.)15 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
+g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)56 b Fo(21)748 3459 y(A.1.1)92
+b(ADDENDUM:)33 b(Ho)m(w)e(to)g(use)f(this)g(License)h(for)g(y)m(our)930
+3568 y(do)s(cumen)m(ts)c Fi(.)15 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
+g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)57 b Fo(27)p
+eop end
+%%Page: -2 4
+TeXDict begin -2 3 bop 150 -116 a Fo(ii)2640 b(GNU)31
+b(Readline)g(Library)p eop end
+%%Page: 1 5
+TeXDict begin 1 4 bop 150 -116 a Fo(Chapter)30 b(1:)41
+b(Command)29 b(Line)i(Editing)2153 b(1)150 299 y Fk(1)80
+b(Command)54 b(Line)f(Editing)275 511 y Fo(This)29 b(c)m(hapter)i
+(describ)s(es)f(the)g(basic)h(features)g(of)f(the)h Fh(gnu)f
+Fo(command)g(line)h(editing)g(in)m(terface.)150 755 y
+Fm(1.1)68 b(In)l(tro)t(duction)45 b(to)g(Line)h(Editing)275
+995 y Fo(The)29 b(follo)m(wing)j(paragraphs)e(describ)s(e)g(the)g
+(notation)i(used)d(to)j(represen)m(t)e(k)m(eystrok)m(es.)275
+1125 y(The)i(text)j Fg(C-k)d Fo(is)i(read)f(as)h(`Con)m(trol-K')g(and)f
+(describ)s(es)g(the)g(c)m(haracter)i(pro)s(duced)d(when)g(the)3663
+1122 y Ff(h)p 3687 1069 38 4 v 3687 1125 a Fe(k)p 3687
+1140 V 3720 1122 a Ff(i)150 1235 y Fo(k)m(ey)f(is)g(pressed)e(while)h
+(the)h(Con)m(trol)g(k)m(ey)g(is)g(depressed.)275 1365
+y(The)g(text)i Fg(M-k)e Fo(is)h(read)f(as)i(`Meta-K')g(and)f(describ)s
+(es)f(the)h(c)m(haracter)h(pro)s(duced)e(when)f(the)i(Meta)150
+1474 y(k)m(ey)d(\(if)g(y)m(ou)g(ha)m(v)m(e)g(one\))g(is)g(depressed,)f
+(and)f(the)1859 1471 y Ff(h)p 1883 1418 V 1883 1474 a
+Fe(k)p 1883 1490 V 1916 1471 a Ff(i)1974 1474 y Fo(k)m(ey)j(is)e
+(pressed.)39 b(The)28 b(Meta)i(k)m(ey)f(is)g(lab)s(eled)3558
+1471 y Ff(h)p 3582 1418 143 4 v 3582 1474 a Fe(AL)-6
+b(T)p 3582 1490 V 3720 1471 a Ff(i)150 1584 y Fo(on)26
+b(man)m(y)g(k)m(eyb)s(oards.)39 b(On)26 b(k)m(eyb)s(oards)g(with)g(t)m
+(w)m(o)h(k)m(eys)g(lab)s(eled)2425 1581 y Ff(h)p 2450
+1528 V 2450 1584 a Fe(AL)-6 b(T)p 2450 1599 V 2587 1581
+a Ff(i)2643 1584 y Fo(\(usually)27 b(to)g(either)f(side)g(of)h(the)150
+1693 y(space)32 b(bar\),)g(the)775 1690 y Ff(h)p 799
+1637 V 799 1693 a Fe(AL)-6 b(T)p 799 1709 V 937 1690
+a Ff(i)998 1693 y Fo(on)32 b(the)f(left)h(side)g(is)f(generally)i(set)e
+(to)i(w)m(ork)e(as)h(a)f(Meta)i(k)m(ey)-8 b(.)45 b(The)3393
+1690 y Ff(h)p 3417 1637 V 3417 1693 a Fe(AL)-6 b(T)p
+3417 1709 V 3555 1690 a Ff(i)3616 1693 y Fo(k)m(ey)150
+1803 y(on)33 b(the)h(righ)m(t)g(ma)m(y)g(also)g(b)s(e)f(con\014gured)f
+(to)i(w)m(ork)g(as)g(a)f(Meta)i(k)m(ey)f(or)g(ma)m(y)g(b)s(e)e
+(con\014gured)h(as)h(some)150 1913 y(other)d(mo)s(di\014er,)e(suc)m(h)h
+(as)h(a)g(Comp)s(ose)f(k)m(ey)h(for)f(t)m(yping)h(accen)m(ted)h(c)m
+(haracters.)275 2043 y(If)21 b(y)m(ou)h(do)g(not)g(ha)m(v)m(e)h(a)f
+(Meta)h(or)1388 2040 y Ff(h)p 1412 1987 V 1412 2043 a
+Fe(AL)-6 b(T)p 1412 2058 V 1550 2040 a Ff(i)1601 2043
+y Fo(k)m(ey)e(,)25 b(or)d(another)g(k)m(ey)h(w)m(orking)f(as)g(a)g
+(Meta)h(k)m(ey)-8 b(,)25 b(the)d(iden)m(tical)150 2152
+y(k)m(eystrok)m(e)i(can)f(b)s(e)f(generated)i(b)m(y)e(t)m(yping)1619
+2149 y Ff(h)p 1643 2096 139 4 v 1643 2152 a Fe(ESC)p
+1643 2168 V 1777 2149 a Ff(i)1829 2152 y Fi(\014rst)p
+Fo(,)j(and)d(then)g(t)m(yping)2678 2149 y Ff(h)p 2703
+2096 38 4 v 2703 2152 a Fe(k)p 2703 2168 V 2736 2149
+a Ff(i)2765 2152 y Fo(.)38 b(Either)23 b(pro)s(cess)f(is)g(kno)m(wn)150
+2262 y(as)31 b Fd(metafying)39 b Fo(the)850 2259 y Ff(h)p
+874 2206 V 874 2262 a Fe(k)p 874 2277 V 907 2259 a Ff(i)968
+2262 y Fo(k)m(ey)-8 b(.)275 2392 y(The)39 b(text)j Fg(M-C-k)d
+Fo(is)h(read)g(as)h(`Meta-Con)m(trol-k')j(and)39 b(describ)s(es)h(the)g
+(c)m(haracter)i(pro)s(duced)d(b)m(y)150 2501 y Fd(metafying)g
+Fg(C-k)p Fo(.)275 2632 y(In)d(addition,)j(sev)m(eral)f(k)m(eys)f(ha)m
+(v)m(e)h(their)f(o)m(wn)g(names.)60 b(Sp)s(eci\014cally)-8
+b(,)2768 2629 y Ff(h)p 2792 2576 146 4 v 2792 2632 a
+Fe(DEL)p 2792 2647 V 2934 2629 a Ff(i)2964 2632 y Fo(,)3028
+2629 y Ff(h)p 3052 2576 139 4 v 3052 2632 a Fe(ESC)p
+3052 2647 V 3186 2629 a Ff(i)3216 2632 y Fo(,)3279 2629
+y Ff(h)p 3303 2576 144 4 v 3303 2632 a Fe(LFD)p 3303
+2647 V 3443 2629 a Ff(i)3473 2632 y Fo(,)3537 2629 y
+Ff(h)p 3561 2576 139 4 v 3561 2632 a Fe(SPC)p 3561 2647
+V 3695 2629 a Ff(i)3725 2632 y Fo(,)150 2738 y Ff(h)p
+174 2685 151 4 v 174 2741 a Fe(RET)p 174 2757 V 321 2738
+a Ff(i)351 2741 y Fo(,)47 b(and)612 2738 y Ff(h)p 637
+2685 148 4 v 637 2741 a Fe(T)-6 b(AB)p 637 2757 V 780
+2738 a Ff(i)853 2741 y Fo(all)45 b(stand)e(for)g(themselv)m(es)i(when)d
+(seen)i(in)f(this)g(text,)48 b(or)43 b(in)g(an)h(init)f(\014le)h(\(see)
+150 2851 y(Section)c(1.3)f([Readline)h(Init)e(File],)43
+b(page)c(4\).)67 b(If)38 b(y)m(our)h(k)m(eyb)s(oard)f(lac)m(ks)i(a)2888
+2848 y Ff(h)p 2912 2795 144 4 v 2912 2851 a Fe(LFD)p
+2912 2866 V 3052 2848 a Ff(i)3121 2851 y Fo(k)m(ey)-8
+b(,)42 b(t)m(yping)3604 2848 y Ff(h)p 3628 2795 97 4
+v 3628 2851 a Fe(C-j)p 3628 2866 V 3720 2848 a Ff(i)150
+2960 y Fo(will)30 b(pro)s(duce)e(the)i(desired)f(c)m(haracter.)42
+b(The)1748 2957 y Ff(h)p 1772 2904 151 4 v 1772 2960
+a Fe(RET)p 1772 2976 V 1919 2957 a Ff(i)1978 2960 y Fo(k)m(ey)30
+b(ma)m(y)g(b)s(e)f(lab)s(eled)2770 2957 y Ff(h)p 2794
+2904 217 4 v 2794 2960 a Fe(Return)p 2794 2976 V 3007
+2957 a Ff(i)3066 2960 y Fo(or)3176 2957 y Ff(h)p 3201
+2904 172 4 v 3201 2960 a Fe(En)n(ter)p 3201 2976 V 3368
+2957 a Ff(i)3427 2960 y Fo(on)h(some)150 3070 y(k)m(eyb)s(oards.)150
+3314 y Fm(1.2)68 b(Readline)47 b(In)l(teraction)275 3554
+y Fo(Often)24 b(during)g(an)h(in)m(teractiv)m(e)j(session)e(y)m(ou)f(t)
+m(yp)s(e)h(in)f(a)g(long)h(line)f(of)h(text,)h(only)f(to)f(notice)i
+(that)f(the)150 3663 y(\014rst)32 b(w)m(ord)g(on)g(the)g(line)h(is)g
+(missp)s(elled.)46 b(The)32 b(Readline)h(library)f(giv)m(es)h(y)m(ou)g
+(a)g(set)g(of)f(commands)g(for)150 3773 y(manipulating)e(the)g(text)h
+(as)f(y)m(ou)g(t)m(yp)s(e)g(it)g(in,)g(allo)m(wing)h(y)m(ou)f(to)h
+(just)e(\014x)g(y)m(our)h(t)m(yp)s(o,)g(and)g(not)g(forcing)150
+3883 y(y)m(ou)e(to)h(ret)m(yp)s(e)g(the)f(ma)5 b(jorit)m(y)29
+b(of)f(the)h(line.)40 b(Using)28 b(these)h(editing)g(commands,)f(y)m
+(ou)h(mo)m(v)m(e)g(the)g(cursor)150 3992 y(to)35 b(the)f(place)i(that)e
+(needs)g(correction,)j(and)d(delete)h(or)f(insert)h(the)f(text)h(of)g
+(the)f(corrections.)54 b(Then,)150 4102 y(when)30 b(y)m(ou)i(are)f
+(satis\014ed)g(with)g(the)g(line,)h(y)m(ou)g(simply)e(press)2320
+4099 y Ff(h)p 2344 4046 151 4 v 2344 4102 a Fe(RET)p
+2344 4117 V 2491 4099 a Ff(i)2520 4102 y Fo(.)43 b(Y)-8
+b(ou)32 b(do)f(not)g(ha)m(v)m(e)i(to)e(b)s(e)g(at)h(the)150
+4211 y(end)j(of)h(the)g(line)g(to)h(press)1126 4208 y
+Ff(h)p 1150 4155 V 1150 4211 a Fe(RET)p 1150 4227 V 1297
+4208 a Ff(i)1327 4211 y Fo(;)h(the)e(en)m(tire)h(line)f(is)g(accepted)h
+(regardless)f(of)g(the)g(lo)s(cation)i(of)e(the)150 4321
+y(cursor)30 b(within)g(the)g(line.)150 4532 y Fc(1.2.1)63
+b(Readline)40 b(Bare)h(Essen)m(tials)275 4772 y Fo(In)22
+b(order)g(to)i(en)m(ter)g(c)m(haracters)g(in)m(to)g(the)g(line,)h
+(simply)d(t)m(yp)s(e)i(them.)38 b(The)22 b(t)m(yp)s(ed)h(c)m(haracter)i
+(app)s(ears)150 4881 y(where)32 b(the)h(cursor)e(w)m(as,)j(and)e(then)g
+(the)h(cursor)e(mo)m(v)m(es)j(one)f(space)g(to)g(the)g(righ)m(t.)47
+b(If)32 b(y)m(ou)h(mist)m(yp)s(e)g(a)150 4991 y(c)m(haracter,)f(y)m(ou)
+f(can)g(use)f(y)m(our)g(erase)h(c)m(haracter)h(to)f(bac)m(k)g(up)f(and)
+f(delete)j(the)f(mist)m(yp)s(ed)e(c)m(haracter.)275 5121
+y(Sometimes)i(y)m(ou)g(ma)m(y)h(mist)m(yp)s(e)e(a)i(c)m(haracter,)g
+(and)e(not)i(notice)g(the)f(error)f(un)m(til)h(y)m(ou)g(ha)m(v)m(e)h(t)
+m(yp)s(ed)150 5230 y(sev)m(eral)e(other)f(c)m(haracters.)42
+b(In)28 b(that)i(case,)g(y)m(ou)f(can)g(t)m(yp)s(e)h
+Fg(C-b)d Fo(to)j(mo)m(v)m(e)g(the)f(cursor)g(to)g(the)g(left,)i(and)150
+5340 y(then)f(correct)i(y)m(our)e(mistak)m(e.)42 b(Afterw)m(ards,)31
+b(y)m(ou)f(can)h(mo)m(v)m(e)h(the)e(cursor)g(to)h(the)g(righ)m(t)g
+(with)f Fg(C-f)p Fo(.)p eop end
+%%Page: 2 6
+TeXDict begin 2 5 bop 150 -116 a Fo(2)2645 b(GNU)31 b(Readline)g
+(Library)275 299 y(When)h(y)m(ou)h(add)f(text)h(in)f(the)h(middle)f(of)
+h(a)g(line,)h(y)m(ou)e(will)h(notice)h(that)f(c)m(haracters)h(to)g(the)
+e(righ)m(t)150 408 y(of)d(the)g(cursor)f(are)h(`pushed)e(o)m(v)m(er')j
+(to)g(mak)m(e)f(ro)s(om)g(for)f(the)h(text)h(that)f(y)m(ou)g(ha)m(v)m
+(e)h(inserted.)40 b(Lik)m(ewise,)150 518 y(when)d(y)m(ou)g(delete)i
+(text)g(b)s(ehind)c(the)j(cursor,)h(c)m(haracters)g(to)f(the)g(righ)m
+(t)g(of)g(the)g(cursor)e(are)i(`pulled)150 628 y(bac)m(k')24
+b(to)f(\014ll)g(in)f(the)h(blank)f(space)i(created)f(b)m(y)g(the)g
+(remo)m(v)-5 b(al)24 b(of)f(the)g(text.)39 b(A)23 b(list)g(of)g(the)g
+(bare)f(essen)m(tials)150 737 y(for)30 b(editing)h(the)g(text)g(of)g
+(an)f(input)f(line)i(follo)m(ws.)150 892 y Fg(C-b)336
+b Fo(Mo)m(v)m(e)32 b(bac)m(k)g(one)e(c)m(haracter.)150
+1048 y Fg(C-f)336 b Fo(Mo)m(v)m(e)32 b(forw)m(ard)e(one)h(c)m
+(haracter.)150 1200 y Ff(h)p 174 1147 146 4 v 174 1203
+a Fe(DEL)p 174 1218 V 316 1200 a Ff(i)376 1203 y Fo(or)487
+1200 y Ff(h)p 512 1147 317 4 v 512 1203 a Fe(Bac)n(kspace)p
+512 1218 V 824 1200 a Ff(i)630 1312 y Fo(Delete)i(the)d(c)m(haracter)i
+(to)f(the)g(left)g(of)f(the)h(cursor.)150 1467 y Fg(C-d)336
+b Fo(Delete)33 b(the)d(c)m(haracter)i(underneath)d(the)i(cursor.)150
+1622 y(Prin)m(ting)g(c)m(haracters)630 1732 y(Insert)f(the)g(c)m
+(haracter)i(in)m(to)g(the)e(line)h(at)g(the)g(cursor.)150
+1887 y Fg(C-_)e Fo(or)i Fg(C-x)e(C-u)630 1997 y Fo(Undo)k(the)h(last)g
+(editing)g(command.)50 b(Y)-8 b(ou)34 b(can)f(undo)g(all)h(the)f(w)m(a)
+m(y)i(bac)m(k)f(to)g(an)g(empt)m(y)630 2106 y(line.)150
+2262 y(\(Dep)s(ending)g(on)g(y)m(our)g(con\014guration,)h(the)1726
+2259 y Ff(h)p 1750 2205 V 1750 2262 a Fe(Bac)n(kspace)p
+1750 2277 V 2063 2259 a Ff(i)2127 2262 y Fo(k)m(ey)g(b)s(e)e(set)h(to)h
+(delete)g(the)f(c)m(haracter)i(to)f(the)150 2371 y(left)f(of)f(the)g
+(cursor)f(and)h(the)1192 2368 y Ff(h)p 1216 2315 146
+4 v 1216 2371 a Fe(DEL)p 1216 2386 V 1358 2368 a Ff(i)1421
+2371 y Fo(k)m(ey)g(set)h(to)g(delete)g(the)f(c)m(haracter)i(underneath)
+c(the)i(cursor,)h(lik)m(e)150 2481 y Fg(C-d)p Fo(,)c(rather)g(than)g
+(the)h(c)m(haracter)h(to)f(the)f(left)h(of)g(the)f(cursor.\))150
+2698 y Fc(1.2.2)63 b(Readline)40 b(Mo)m(v)m(emen)m(t)h(Commands)275
+2940 y Fo(The)25 b(ab)s(o)m(v)m(e)i(table)g(describ)s(es)f(the)g(most)h
+(basic)f(k)m(eystrok)m(es)i(that)f(y)m(ou)f(need)g(in)g(order)f(to)i
+(do)f(editing)150 3050 y(of)g(the)f(input)g(line.)39
+b(F)-8 b(or)27 b(y)m(our)e(con)m(v)m(enience,)k(man)m(y)c(other)h
+(commands)f(ha)m(v)m(e)i(b)s(een)e(added)g(in)g(addition)150
+3160 y(to)33 b Fg(C-b)p Fo(,)e Fg(C-f)p Fo(,)h Fg(C-d)p
+Fo(,)g(and)1043 3157 y Ff(h)p 1067 3104 V 1067 3160 a
+Fe(DEL)p 1067 3175 V 1209 3157 a Ff(i)1239 3160 y Fo(.)45
+b(Here)33 b(are)f(some)g(commands)g(for)g(mo)m(ving)h(more)f(rapidly)f
+(ab)s(out)h(the)150 3269 y(line.)150 3424 y Fg(C-a)336
+b Fo(Mo)m(v)m(e)32 b(to)g(the)e(start)h(of)g(the)f(line.)150
+3579 y Fg(C-e)336 b Fo(Mo)m(v)m(e)32 b(to)g(the)e(end)g(of)g(the)h
+(line.)150 3735 y Fg(M-f)336 b Fo(Mo)m(v)m(e)32 b(forw)m(ard)e(a)h(w)m
+(ord,)f(where)g(a)h(w)m(ord)f(is)g(comp)s(osed)g(of)h(letters)h(and)d
+(digits.)150 3890 y Fg(M-b)336 b Fo(Mo)m(v)m(e)32 b(bac)m(kw)m(ard)f(a)
+g(w)m(ord.)150 4045 y Fg(C-l)336 b Fo(Clear)31 b(the)f(screen,)h
+(reprin)m(ting)f(the)h(curren)m(t)f(line)h(at)g(the)f(top.)275
+4200 y(Notice)c(ho)m(w)f Fg(C-f)e Fo(mo)m(v)m(es)j(forw)m(ard)e(a)h(c)m
+(haracter,)j(while)d Fg(M-f)e Fo(mo)m(v)m(es)j(forw)m(ard)e(a)h(w)m
+(ord.)39 b(It)24 b(is)h(a)g(lo)s(ose)150 4310 y(con)m(v)m(en)m(tion)32
+b(that)f(con)m(trol)g(k)m(eystrok)m(es)h(op)s(erate)e(on)g(c)m
+(haracters)h(while)f(meta)h(k)m(eystrok)m(es)h(op)s(erate)e(on)150
+4419 y(w)m(ords.)150 4637 y Fc(1.2.3)63 b(Readline)40
+b(Killing)i(Commands)275 4879 y Fd(Killing)j Fo(text)39
+b(means)e(to)h(delete)g(the)g(text)g(from)f(the)g(line,)j(but)d(to)h
+(sa)m(v)m(e)h(it)e(a)m(w)m(a)m(y)j(for)d(later)h(use,)150
+4988 y(usually)c(b)m(y)g Fd(y)m(anking)42 b Fo(\(re-inserting\))35
+b(it)g(bac)m(k)g(in)m(to)g(the)f(line.)52 b(\(`Cut')35
+b(and)e(`paste')i(are)g(more)f(recen)m(t)150 5098 y(jargon)d(for)f
+(`kill')h(and)f(`y)m(ank'.\))275 5230 y(If)f(the)i(description)f(for)g
+(a)h(command)f(sa)m(ys)g(that)h(it)g(`kills')g(text,)h(then)e(y)m(ou)g
+(can)h(b)s(e)e(sure)h(that)h(y)m(ou)150 5340 y(can)g(get)g(the)g(text)g
+(bac)m(k)g(in)f(a)h(di\013eren)m(t)g(\(or)g(the)f(same\))h(place)h
+(later.)p eop end
+%%Page: 3 7
+TeXDict begin 3 6 bop 150 -116 a Fo(Chapter)30 b(1:)41
+b(Command)29 b(Line)i(Editing)2153 b(3)275 299 y(When)23
+b(y)m(ou)g(use)g(a)h(kill)g(command,)g(the)g(text)g(is)f(sa)m(v)m(ed)i
+(in)e(a)g Fd(kill-ring)p Fo(.)39 b(An)m(y)24 b(n)m(um)m(b)s(er)e(of)h
+(consecutiv)m(e)150 408 y(kills)31 b(sa)m(v)m(e)i(all)f(of)f(the)g
+(killed)h(text)g(together,)g(so)g(that)f(when)f(y)m(ou)h(y)m(ank)h(it)f
+(bac)m(k,)h(y)m(ou)g(get)g(it)f(all.)43 b(The)150 518
+y(kill)33 b(ring)f(is)g(not)h(line)g(sp)s(eci\014c;)g(the)g(text)g
+(that)g(y)m(ou)g(killed)f(on)h(a)f(previously)g(t)m(yp)s(ed)h(line)f
+(is)h(a)m(v)-5 b(ailable)150 628 y(to)31 b(b)s(e)f(y)m(ank)m(ed)h(bac)m
+(k)g(later,)h(when)d(y)m(ou)i(are)g(t)m(yping)f(another)h(line.)275
+760 y(Here)f(is)h(the)f(list)h(of)g(commands)f(for)g(killing)h(text.)
+150 916 y Fg(C-k)336 b Fo(Kill)31 b(the)f(text)i(from)e(the)g(curren)m
+(t)g(cursor)g(p)s(osition)h(to)g(the)f(end)g(of)g(the)h(line.)150
+1072 y Fg(M-d)336 b Fo(Kill)27 b(from)f(the)g(cursor)g(to)h(the)f(end)g
+(of)h(the)f(curren)m(t)g(w)m(ord,)h(or,)h(if)e(b)s(et)m(w)m(een)h(w)m
+(ords,)g(to)g(the)630 1182 y(end)j(of)g(the)h(next)f(w)m(ord.)41
+b(W)-8 b(ord)30 b(b)s(oundaries)f(are)i(the)g(same)f(as)h(those)g(used)
+f(b)m(y)g Fg(M-f)p Fo(.)150 1337 y Fg(M-)246 1334 y Ff(h)p
+270 1281 146 4 v 270 1337 a Fe(DEL)p 270 1353 V 411 1334
+a Ff(i)630 1337 y Fo(Kill)h(from)f(the)h(cursor)f(the)g(start)h(of)g
+(the)g(curren)m(t)f(w)m(ord,)h(or,)f(if)h(b)s(et)m(w)m(een)g(w)m(ords,)
+f(to)i(the)630 1447 y(start)39 b(of)f(the)h(previous)f(w)m(ord.)64
+b(W)-8 b(ord)39 b(b)s(oundaries)e(are)i(the)f(same)h(as)g(those)f(used)
+g(b)m(y)630 1557 y Fg(M-b)p Fo(.)150 1712 y Fg(C-w)336
+b Fo(Kill)32 b(from)e(the)i(cursor)e(to)i(the)g(previous)e(whitespace.)
+44 b(This)31 b(is)g(di\013eren)m(t)h(than)f Fg(M-)3555
+1709 y Ff(h)p 3578 1656 V 3578 1712 a Fe(DEL)p 3578 1728
+V 3720 1709 a Ff(i)630 1822 y Fo(b)s(ecause)f(the)h(w)m(ord)f(b)s
+(oundaries)f(di\013er.)275 1978 y(Here)42 b(is)f(ho)m(w)h(to)g
+Fd(y)m(ank)47 b Fo(the)42 b(text)g(bac)m(k)h(in)m(to)f(the)g(line.)74
+b(Y)-8 b(anking)43 b(means)e(to)h(cop)m(y)h(the)e(most-)150
+2087 y(recen)m(tly-killed)33 b(text)e(from)f(the)g(kill)i(bu\013er.)150
+2243 y Fg(C-y)336 b Fo(Y)-8 b(ank)31 b(the)f(most)h(recen)m(tly)h
+(killed)f(text)g(bac)m(k)g(in)m(to)h(the)e(bu\013er)g(at)h(the)f
+(cursor.)150 2399 y Fg(M-y)336 b Fo(Rotate)36 b(the)f(kill-ring,)i(and)
+d(y)m(ank)h(the)f(new)g(top.)54 b(Y)-8 b(ou)35 b(can)g(only)f(do)h
+(this)f(if)h(the)g(prior)630 2509 y(command)30 b(is)h
+Fg(C-y)e Fo(or)h Fg(M-y)p Fo(.)150 2727 y Fc(1.2.4)63
+b(Readline)40 b(Argumen)m(ts)275 2970 y Fo(Y)-8 b(ou)29
+b(can)h(pass)f(n)m(umeric)g(argumen)m(ts)g(to)h(Readline)g(commands.)40
+b(Sometimes)30 b(the)f(argumen)m(t)h(acts)150 3079 y(as)40
+b(a)h(rep)s(eat)f(coun)m(t,)j(other)e(times)f(it)h(is)f(the)g
+Fi(sign)47 b Fo(of)41 b(the)f(argumen)m(t)g(that)h(is)f(signi\014can)m
+(t.)71 b(If)40 b(y)m(ou)150 3189 y(pass)33 b(a)h(negativ)m(e)i(argumen)
+m(t)e(to)g(a)g(command)f(whic)m(h)g(normally)h(acts)g(in)f(a)h(forw)m
+(ard)f(direction,)i(that)150 3298 y(command)g(will)h(act)g(in)f(a)h
+(bac)m(kw)m(ard)f(direction.)57 b(F)-8 b(or)36 b(example,)h(to)f(kill)g
+(text)g(bac)m(k)g(to)g(the)g(start)g(of)150 3408 y(the)31
+b(line,)g(y)m(ou)f(migh)m(t)h(t)m(yp)s(e)g(`)p Fn(M--)f(C-k)p
+Fo('.)275 3541 y(The)d(general)i(w)m(a)m(y)h(to)e(pass)g(n)m(umeric)g
+(argumen)m(ts)h(to)g(a)f(command)g(is)g(to)h(t)m(yp)s(e)f(meta)i
+(digits)e(b)s(efore)150 3650 y(the)j(command.)42 b(If)30
+b(the)h(\014rst)f(`digit')i(t)m(yp)s(ed)f(is)g(a)g(min)m(us)f(sign)h
+(\(`)p Fn(-)p Fo('\),)h(then)f(the)g(sign)f(of)h(the)g(argumen)m(t)150
+3760 y(will)39 b(b)s(e)e(negativ)m(e.)66 b(Once)38 b(y)m(ou)h(ha)m(v)m
+(e)g(t)m(yp)s(ed)f(one)h(meta)g(digit)g(to)f(get)i(the)e(argumen)m(t)h
+(started,)i(y)m(ou)150 3869 y(can)29 b(t)m(yp)s(e)g(the)g(remainder)f
+(of)h(the)g(digits,)h(and)f(then)f(the)h(command.)40
+b(F)-8 b(or)30 b(example,)g(to)f(giv)m(e)i(the)e Fg(C-d)150
+3979 y Fo(command)37 b(an)g(argumen)m(t)h(of)g(10,)i(y)m(ou)e(could)f
+(t)m(yp)s(e)h(`)p Fn(M-1)29 b(0)h(C-d)p Fo(',)39 b(whic)m(h)e(will)h
+(delete)h(the)e(next)h(ten)150 4089 y(c)m(haracters)32
+b(on)e(the)h(input)e(line.)150 4307 y Fc(1.2.5)63 b(Searc)m(hing)40
+b(for)i(Commands)g(in)f(the)g(History)275 4550 y Fo(Readline)32
+b(pro)m(vides)h(commands)f(for)g(searc)m(hing)h(through)e(the)i
+(command)f(history)g(for)g(lines)g(con-)150 4659 y(taining)f(a)g(sp)s
+(eci\014ed)f(string.)40 b(There)30 b(are)h(t)m(w)m(o)h(searc)m(h)f(mo)s
+(des:)40 b Fd(incremen)m(tal)35 b Fo(and)30 b Fd(non-incremen)m(tal)p
+Fo(.)275 4792 y(Incremen)m(tal)c(searc)m(hes)h(b)s(egin)e(b)s(efore)g
+(the)h(user)f(has)h(\014nished)e(t)m(yping)i(the)g(searc)m(h)g(string.)
+39 b(As)26 b(eac)m(h)150 4902 y(c)m(haracter)37 b(of)e(the)h(searc)m(h)
+g(string)f(is)h(t)m(yp)s(ed,)g(Readline)g(displa)m(ys)g(the)f(next)h
+(en)m(try)g(from)e(the)i(history)150 5011 y(matc)m(hing)25
+b(the)f(string)g(t)m(yp)s(ed)g(so)g(far.)39 b(An)23 b(incremen)m(tal)j
+(searc)m(h)e(requires)g(only)g(as)g(man)m(y)g(c)m(haracters)i(as)150
+5121 y(needed)i(to)i(\014nd)d(the)i(desired)f(history)h(en)m(try)-8
+b(.)41 b(T)-8 b(o)29 b(searc)m(h)h(bac)m(kw)m(ard)f(in)f(the)h(history)
+g(for)f(a)i(particular)150 5230 y(string,)g(t)m(yp)s(e)f
+Fg(C-r)p Fo(.)40 b(T)m(yping)29 b Fg(C-s)g Fo(searc)m(hes)h(forw)m(ard)
+f(through)g(the)g(history)-8 b(.)41 b(The)29 b(c)m(haracters)i(presen)m
+(t)150 5340 y(in)38 b(the)g(v)-5 b(alue)38 b(of)g(the)g
+Fn(isearch-terminators)33 b Fo(v)-5 b(ariable)39 b(are)f(used)f(to)i
+(terminate)g(an)f(incremen)m(tal)p eop end
+%%Page: 4 8
+TeXDict begin 4 7 bop 150 -116 a Fo(4)2645 b(GNU)31 b(Readline)g
+(Library)150 299 y(searc)m(h.)63 b(If)38 b(that)g(v)-5
+b(ariable)38 b(has)g(not)g(b)s(een)f(assigned)h(a)g(v)-5
+b(alue,)40 b(the)2578 296 y Ff(h)p 2602 243 139 4 v 2602
+299 a Fe(ESC)p 2602 314 V 2736 296 a Ff(i)2804 299 y
+Fo(and)d Fg(C-J)f Fo(c)m(haracters)k(will)150 408 y(terminate)j(an)g
+(incremen)m(tal)g(searc)m(h.)78 b Fg(C-g)41 b Fo(will)i(ab)s(ort)f(an)g
+(incremen)m(tal)i(searc)m(h)f(and)f(restore)h(the)150
+518 y(original)30 b(line.)41 b(When)28 b(the)h(searc)m(h)h(is)f
+(terminated,)h(the)f(history)g(en)m(try)g(con)m(taining)h(the)f(searc)m
+(h)h(string)150 628 y(b)s(ecomes)h(the)f(curren)m(t)g(line.)275
+771 y(T)-8 b(o)31 b(\014nd)e(other)j(matc)m(hing)g(en)m(tries)g(in)e
+(the)h(history)g(list,)h(t)m(yp)s(e)g Fg(C-r)e Fo(or)h
+Fg(C-s)f Fo(as)h(appropriate.)43 b(This)150 880 y(will)26
+b(searc)m(h)h(bac)m(kw)m(ard)g(or)f(forw)m(ard)g(in)f(the)i(history)f
+(for)g(the)g(next)g(en)m(try)h(matc)m(hing)g(the)f(searc)m(h)h(string)
+150 990 y(t)m(yp)s(ed)37 b(so)h(far.)63 b(An)m(y)38 b(other)f(k)m(ey)i
+(sequence)f(b)s(ound)e(to)i(a)g(Readline)h(command)e(will)h(terminate)h
+(the)150 1100 y(searc)m(h)22 b(and)e(execute)j(that)e(command.)38
+b(F)-8 b(or)22 b(instance,)h(a)2127 1097 y Ff(h)p 2151
+1044 151 4 v 2151 1100 a Fe(RET)p 2151 1115 V 2298 1097
+a Ff(i)2349 1100 y Fo(will)e(terminate)h(the)f(searc)m(h)h(and)e
+(accept)150 1209 y(the)30 b(line,)g(thereb)m(y)f(executing)i(the)e
+(command)g(from)g(the)h(history)f(list.)41 b(A)29 b(mo)m(v)m(emen)m(t)j
+(command)d(will)150 1319 y(terminate)i(the)g(searc)m(h,)g(mak)m(e)h
+(the)e(last)h(line)g(found)e(the)i(curren)m(t)f(line,)h(and)f(b)s(egin)
+g(editing.)275 1462 y(Readline)35 b(remem)m(b)s(ers)f(the)h(last)h
+(incremen)m(tal)g(searc)m(h)f(string.)54 b(If)34 b(t)m(w)m(o)j
+Fg(C-r)p Fo(s)c(are)i(t)m(yp)s(ed)g(without)150 1571
+y(an)m(y)i(in)m(terv)m(ening)g(c)m(haracters)h(de\014ning)e(a)h(new)f
+(searc)m(h)h(string,)h(an)m(y)f(remem)m(b)s(ered)e(searc)m(h)i(string)g
+(is)150 1681 y(used.)275 1824 y(Non-incremen)m(tal)48
+b(searc)m(hes)g(read)e(the)h(en)m(tire)h(searc)m(h)f(string)g(b)s
+(efore)f(starting)h(to)h(searc)m(h)f(for)150 1934 y(matc)m(hing)d
+(history)e(lines.)78 b(The)42 b(searc)m(h)h(string)g(ma)m(y)g(b)s(e)f
+(t)m(yp)s(ed)g(b)m(y)g(the)h(user)f(or)h(b)s(e)f(part)g(of)h(the)150
+2043 y(con)m(ten)m(ts)32 b(of)f(the)f(curren)m(t)g(line.)150
+2322 y Fm(1.3)68 b(Readline)47 b(Init)e(File)275 2575
+y Fo(Although)g(the)g(Readline)h(library)e(comes)i(with)f(a)h(set)f(of)
+g(Emacs-lik)m(e)i(k)m(eybindings)e(installed)150 2685
+y(b)m(y)d(default,)i(it)f(is)e(p)s(ossible)g(to)i(use)e(a)h(di\013eren)
+m(t)g(set)g(of)g(k)m(eybindings.)74 b(An)m(y)42 b(user)f(can)h
+(customize)150 2794 y(programs)32 b(that)h(use)f(Readline)h(b)m(y)g
+(putting)f(commands)g(in)g(an)g Fd(inputrc)37 b Fo(\014le,)d(con)m(v)m
+(en)m(tionally)h(in)d(his)150 2904 y(home)h(directory)-8
+b(.)50 b(The)33 b(name)g(of)g(this)g(\014le)h(is)f(tak)m(en)h(from)f
+(the)g(v)-5 b(alue)34 b(of)f(the)g(en)m(vironmen)m(t)h(v)-5
+b(ariable)150 3014 y Fn(INPUTRC)p Fo(.)38 b(If)28 b(that)g(v)-5
+b(ariable)29 b(is)f(unset,)h(the)f(default)g(is)h(`)p
+Fn(~/.inputrc)p Fo('.)37 b(If)28 b(that)h(\014le)f(do)s(es)g(not)g
+(exist)h(or)150 3123 y(cannot)i(b)s(e)f(read,)g(the)h(ultimate)g
+(default)g(is)f(`)p Fn(/etc/inputrc)p Fo('.)275 3266
+y(When)f(a)h(program)f(whic)m(h)h(uses)f(the)h(Readline)g(library)f
+(starts)h(up,)f(the)h(init)g(\014le)f(is)h(read,)g(and)f(the)150
+3376 y(k)m(ey)i(bindings)e(are)i(set.)275 3519 y(In)26
+b(addition,)i(the)f Fn(C-x)i(C-r)d Fo(command)h(re-reads)g(this)f(init)
+h(\014le,)h(th)m(us)f(incorp)s(orating)g(an)m(y)g(c)m(hanges)150
+3629 y(that)k(y)m(ou)g(migh)m(t)g(ha)m(v)m(e)g(made)g(to)g(it.)150
+3870 y Fc(1.3.1)63 b(Readline)40 b(Init)h(File)g(Syn)m(tax)275
+4123 y Fo(There)33 b(are)h(only)g(a)g(few)f(basic)h(constructs)g(allo)m
+(w)m(ed)h(in)f(the)g(Readline)g(init)g(\014le.)51 b(Blank)34
+b(lines)g(are)150 4232 y(ignored.)72 b(Lines)41 b(b)s(eginning)f(with)h
+(a)g(`)p Fn(#)p Fo(')g(are)h(commen)m(ts.)73 b(Lines)41
+b(b)s(eginning)f(with)g(a)i(`)p Fn($)p Fo(')f(indicate)150
+4342 y(conditional)29 b(constructs)f(\(see)g(Section)h(1.3.2)g
+([Conditional)g(Init)e(Constructs],)i(page)f(9\).)41
+b(Other)27 b(lines)150 4452 y(denote)k(v)-5 b(ariable)31
+b(settings)g(and)f(k)m(ey)h(bindings.)150 4624 y(V)-8
+b(ariable)32 b(Settings)630 4734 y(Y)-8 b(ou)41 b(can)g(mo)s(dify)e
+(the)i(run-time)f(b)s(eha)m(vior)g(of)h(Readline)g(b)m(y)f(altering)h
+(the)g(v)-5 b(alues)41 b(of)630 4843 y(v)-5 b(ariables)34
+b(in)f(Readline)i(using)e(the)g Fn(set)g Fo(command)g(within)g(the)h
+(init)g(\014le.)50 b(The)33 b(syn)m(tax)630 4953 y(is)d(simple:)870
+5092 y Fn(set)47 b Fg(variable)56 b(value)630 5230 y
+Fo(Here,)29 b(for)e(example,)h(is)g(ho)m(w)f(to)h(c)m(hange)g(from)f
+(the)g(default)h(Emacs-lik)m(e)h(k)m(ey)f(binding)e(to)630
+5340 y(use)k Fn(vi)g Fo(line)h(editing)g(commands:)p
+eop end
+%%Page: 5 9
+TeXDict begin 5 8 bop 150 -116 a Fo(Chapter)30 b(1:)41
+b(Command)29 b(Line)i(Editing)2153 b(5)870 299 y Fn(set)47
+b(editing-mode)d(vi)630 432 y Fo(V)-8 b(ariable)36 b(names)f(and)g(v)-5
+b(alues,)36 b(where)f(appropriate,)h(are)g(recognized)g(without)f
+(regard)630 541 y(to)c(case.)42 b(Unrecognized)31 b(v)-5
+b(ariable)31 b(names)g(are)f(ignored.)630 674 y(Bo)s(olean)c(v)-5
+b(ariables)26 b(\(those)g(that)g(can)f(b)s(e)f(set)i(to)g(on)f(or)g
+(o\013)7 b(\))25 b(are)h(set)f(to)h(on)f(if)g(the)g(v)-5
+b(alue)26 b(is)630 783 y(n)m(ull)e(or)g(empt)m(y)-8 b(,)27
+b Fd(on)d Fo(\(case-insensitiv)m(e\),)29 b(or)24 b(1.)39
+b(An)m(y)25 b(other)f(v)-5 b(alue)25 b(results)f(in)g(the)g(v)-5
+b(ariable)630 893 y(b)s(eing)30 b(set)h(to)g(o\013.)630
+1026 y(A)f(great)i(deal)f(of)g(run-time)f(b)s(eha)m(vior)g(is)g(c)m
+(hangeable)j(with)d(the)g(follo)m(wing)i(v)-5 b(ariables.)630
+1181 y Fn(bell-style)1110 1291 y Fo(Con)m(trols)44 b(what)g(happ)s(ens)
+e(when)h(Readline)i(w)m(an)m(ts)f(to)h(ring)e(the)h(termi-)1110
+1401 y(nal)37 b(b)s(ell.)61 b(If)37 b(set)h(to)g(`)p
+Fn(none)p Fo(',)g(Readline)g(nev)m(er)g(rings)e(the)i(b)s(ell.)61
+b(If)36 b(set)i(to)1110 1510 y(`)p Fn(visible)p Fo(',)32
+b(Readline)i(uses)f(a)g(visible)g(b)s(ell)g(if)g(one)g(is)g(a)m(v)-5
+b(ailable.)51 b(If)33 b(set)g(to)1110 1620 y(`)p Fn(audible)p
+Fo(')j(\(the)i(default\),)i(Readline)e(attempts)g(to)h(ring)e(the)g
+(terminal's)1110 1729 y(b)s(ell.)630 1885 y Fn(bind-tty-special-chars)
+1110 1995 y Fo(If)45 b(set)h(to)f(`)p Fn(on)p Fo(',)50
+b(Readline)45 b(attempts)i(to)f(bind)d(the)j(con)m(trol)g(c)m
+(haracters)1110 2104 y(treated)36 b(sp)s(ecially)h(b)m(y)e(the)h(k)m
+(ernel's)g(terminal)g(driv)m(er)f(to)h(their)f(Readline)1110
+2214 y(equiv)-5 b(alen)m(ts.)630 2370 y Fn(comment-begin)1110
+2479 y Fo(The)29 b(string)g(to)h(insert)f(at)h(the)f(b)s(eginning)g(of)
+g(the)h(line)f(when)f(the)i Fn(insert-)1110 2589 y(comment)e
+Fo(command)j(is)f(executed.)42 b(The)29 b(default)i(v)-5
+b(alue)31 b(is)f Fn("#")p Fo(.)630 2744 y Fn(completion-ignore-case)
+1110 2854 y Fo(If)d(set)h(to)g(`)p Fn(on)p Fo(',)g(Readline)g(p)s
+(erforms)e(\014lename)h(matc)m(hing)i(and)e(completion)1110
+2964 y(in)j(a)h(case-insensitiv)m(e)i(fashion.)40 b(The)30
+b(default)h(v)-5 b(alue)30 b(is)h(`)p Fn(off)p Fo('.)630
+3119 y Fn(completion-query-items)1110 3229 y Fo(The)26
+b(n)m(um)m(b)s(er)f(of)h(p)s(ossible)g(completions)h(that)g(determines)
+f(when)f(the)i(user)1110 3339 y(is)i(ask)m(ed)h(whether)f(the)h(list)g
+(of)f(p)s(ossibilities)h(should)e(b)s(e)h(displa)m(y)m(ed.)41
+b(If)29 b(the)1110 3448 y(n)m(um)m(b)s(er)d(of)h(p)s(ossible)f
+(completions)i(is)f(greater)h(than)e(this)h(v)-5 b(alue,)28
+b(Readline)1110 3558 y(will)f(ask)g(the)f(user)g(whether)g(or)g(not)h
+(he)f(wishes)g(to)i(view)e(them;)i(otherwise,)1110 3667
+y(they)d(are)f(simply)g(listed.)40 b(This)23 b(v)-5 b(ariable)25
+b(m)m(ust)g(b)s(e)e(set)i(to)g(an)g(in)m(teger)g(v)-5
+b(alue)1110 3777 y(greater)26 b(than)f(or)f(equal)i(to)f(0.)40
+b(A)24 b(negativ)m(e)j(v)-5 b(alue)26 b(means)e(Readline)i(should)1110
+3886 y(nev)m(er)31 b(ask.)41 b(The)29 b(default)i(limit)g(is)g
+Fn(100)p Fo(.)630 4042 y Fn(convert-meta)1110 4152 y
+Fo(If)22 b(set)g(to)h(`)p Fn(on)p Fo(',)h(Readline)f(will)f(con)m(v)m
+(ert)i(c)m(haracters)f(with)f(the)g(eigh)m(th)h(bit)f(set)1110
+4261 y(to)g(an)f Fh(asci)r(i)g Fo(k)m(ey)h(sequence)g(b)m(y)f
+(stripping)f(the)i(eigh)m(th)g(bit)f(and)g(pre\014xing)f(an)1110
+4368 y Ff(h)p 1134 4315 139 4 v 1134 4371 a Fe(ESC)p
+1134 4386 V 1268 4368 a Ff(i)1332 4371 y Fo(c)m(haracter,)36
+b(con)m(v)m(erting)g(them)e(to)g(a)h(meta-pre\014xed)f(k)m(ey)g
+(sequence.)1110 4481 y(The)c(default)g(v)-5 b(alue)31
+b(is)g(`)p Fn(on)p Fo('.)630 4636 y Fn(disable-completion)1110
+4746 y Fo(If)36 b(set)h(to)h(`)p Fn(On)p Fo(',)g(Readline)f(will)g
+(inhibit)f(w)m(ord)h(completion.)60 b(Completion)1110
+4855 y(c)m(haracters)28 b(will)e(b)s(e)f(inserted)h(in)m(to)h(the)g
+(line)f(as)g(if)g(they)h(had)e(b)s(een)g(mapp)s(ed)1110
+4965 y(to)31 b Fn(self-insert)p Fo(.)38 b(The)30 b(default)g(is)h(`)p
+Fn(off)p Fo('.)630 5121 y Fn(editing-mode)1110 5230 y
+Fo(The)d Fn(editing-mode)e Fo(v)-5 b(ariable)29 b(con)m(trols)h(whic)m
+(h)e(default)h(set)h(of)e(k)m(ey)i(bind-)1110 5340 y(ings)25
+b(is)g(used.)38 b(By)26 b(default,)g(Readline)g(starts)f(up)f(in)h
+(Emacs)g(editing)h(mo)s(de,)p eop end
+%%Page: 6 10
+TeXDict begin 6 9 bop 150 -116 a Fo(6)2645 b(GNU)31 b(Readline)g
+(Library)1110 299 y(where)e(the)g(k)m(eystrok)m(es)i(are)e(most)h
+(similar)f(to)h(Emacs.)40 b(This)29 b(v)-5 b(ariable)30
+b(can)1110 408 y(b)s(e)g(set)h(to)g(either)g(`)p Fn(emacs)p
+Fo(')e(or)h(`)p Fn(vi)p Fo('.)630 567 y Fn(enable-keypad)1110
+676 y Fo(When)23 b(set)h(to)g(`)p Fn(on)p Fo(',)h(Readline)f(will)g
+(try)f(to)h(enable)g(the)f(application)i(k)m(eypad)1110
+786 y(when)h(it)h(is)f(called.)41 b(Some)27 b(systems)f(need)h(this)f
+(to)h(enable)g(the)g(arro)m(w)g(k)m(eys.)1110 896 y(The)j(default)g(is)
+h(`)p Fn(off)p Fo('.)630 1054 y Fn(expand-tilde)1110
+1163 y Fo(If)c(set)h(to)h(`)p Fn(on)p Fo(',)f(tilde)g(expansion)g(is)f
+(p)s(erformed)f(when)h(Readline)h(attempts)1110 1273
+y(w)m(ord)i(completion.)42 b(The)30 b(default)g(is)h(`)p
+Fn(off)p Fo('.)630 1431 y Fn(history-preserve-point)1110
+1541 y Fo(If)e(set)i(to)f(`)p Fn(on)p Fo(',)g(the)g(history)g(co)s(de)g
+(attempts)g(to)h(place)f(p)s(oin)m(t)g(at)h(the)f(same)1110
+1650 y(lo)s(cation)35 b(on)e(eac)m(h)i(history)e(line)h(retriev)m(ed)g
+(with)f Fn(previous-history)c Fo(or)1110 1760 y Fn(next-history)p
+Fo(.)37 b(The)30 b(default)h(is)f(`)p Fn(off)p Fo('.)630
+1918 y Fn(horizontal-scroll-mode)1110 2028 y Fo(This)35
+b(v)-5 b(ariable)37 b(can)f(b)s(e)f(set)h(to)h(either)f(`)p
+Fn(on)p Fo(')g(or)g(`)p Fn(off)p Fo('.)57 b(Setting)36
+b(it)g(to)h(`)p Fn(on)p Fo(')1110 2138 y(means)26 b(that)h(the)f(text)h
+(of)g(the)f(lines)g(b)s(eing)g(edited)h(will)f(scroll)h(horizon)m
+(tally)1110 2247 y(on)32 b(a)g(single)g(screen)g(line)g(when)e(they)i
+(are)g(longer)h(than)e(the)h(width)f(of)h(the)1110 2357
+y(screen,)27 b(instead)g(of)f(wrapping)f(on)m(to)i(a)f(new)g(screen)g
+(line.)39 b(By)27 b(default,)g(this)1110 2466 y(v)-5
+b(ariable)31 b(is)g(set)f(to)i(`)p Fn(off)p Fo('.)630
+2625 y Fn(input-meta)1110 2734 y Fo(If)f(set)g(to)h(`)p
+Fn(on)p Fo(',)g(Readline)g(will)f(enable)h(eigh)m(t-bit)h(input)d(\(it)
+i(will)f(not)h(clear)1110 2844 y(the)40 b(eigh)m(th)g(bit)g(in)f(the)h
+(c)m(haracters)h(it)f(reads\),)j(regardless)c(of)h(what)g(the)1110
+2953 y(terminal)g(claims)h(it)g(can)f(supp)s(ort.)68
+b(The)39 b(default)h(v)-5 b(alue)40 b(is)g(`)p Fn(off)p
+Fo('.)69 b(The)1110 3063 y(name)30 b Fn(meta-flag)e Fo(is)j(a)f(synon)m
+(ym)g(for)g(this)h(v)-5 b(ariable.)630 3221 y Fn(isearch-terminators)
+1110 3331 y Fo(The)51 b(string)h(of)g(c)m(haracters)h(that)f(should)e
+(terminate)j(an)f(incremen)m(tal)1110 3440 y(searc)m(h)25
+b(without)g(subsequen)m(tly)g(executing)h(the)f(c)m(haracter)h(as)f(a)g
+(command)1110 3550 y(\(see)45 b(Section)h(1.2.5)g([Searc)m(hing],)j
+(page)d(3\).)84 b(If)44 b(this)g(v)-5 b(ariable)45 b(has)g(not)1110
+3660 y(b)s(een)31 b(giv)m(en)h(a)g(v)-5 b(alue,)32 b(the)g(c)m
+(haracters)2494 3657 y Ff(h)p 2518 3604 139 4 v 2518
+3660 a Fe(ESC)p 2518 3675 V 2652 3657 a Ff(i)2713 3660
+y Fo(and)f Fg(C-J)g Fo(will)h(terminate)g(an)1110 3769
+y(incremen)m(tal)g(searc)m(h.)630 3927 y Fn(keymap)192
+b Fo(Sets)39 b(Readline's)g(idea)h(of)f(the)g(curren)m(t)f(k)m(eymap)h
+(for)g(k)m(ey)g(binding)f(com-)1110 4037 y(mands.)81
+b(Acceptable)47 b Fn(keymap)42 b Fo(names)i(are)h Fn(emacs)p
+Fo(,)i Fn(emacs-standard)p Fo(,)1110 4147 y Fn(emacs-meta)p
+Fo(,)99 b Fn(emacs-ctlx)p Fo(,)f Fn(vi)p Fo(,)j Fn(vi-move)p
+Fo(,)f Fn(vi-command)p Fo(,)f(and)1110 4256 y Fn(vi-insert)p
+Fo(.)64 b Fn(vi)38 b Fo(is)h(equiv)-5 b(alen)m(t)41 b(to)e
+Fn(vi-command)p Fo(;)i Fn(emacs)c Fo(is)i(equiv)-5 b(alen)m(t)1110
+4366 y(to)33 b Fn(emacs-standard)p Fo(.)41 b(The)31 b(default)h(v)-5
+b(alue)32 b(is)g Fn(emacs)p Fo(.)44 b(The)31 b(v)-5 b(alue)33
+b(of)f(the)1110 4475 y Fn(editing-mode)27 b Fo(v)-5 b(ariable)31
+b(also)h(a\013ects)f(the)g(default)f(k)m(eymap.)630 4634
+y Fn(mark-directories)1110 4743 y Fo(If)38 b(set)g(to)h(`)p
+Fn(on)p Fo(',)i(completed)e(directory)f(names)g(ha)m(v)m(e)i(a)e(slash)
+g(app)s(ended.)1110 4853 y(The)30 b(default)g(is)h(`)p
+Fn(on)p Fo('.)630 5011 y Fn(mark-modified-lines)1110
+5121 y Fo(This)k(v)-5 b(ariable,)38 b(when)d(set)h(to)h(`)p
+Fn(on)p Fo(',)g(causes)g(Readline)f(to)h(displa)m(y)f(an)f(as-)1110
+5230 y(terisk)f(\(`)p Fn(*)p Fo('\))h(at)f(the)g(start)g(of)g(history)g
+(lines)g(whic)m(h)f(ha)m(v)m(e)i(b)s(een)e(mo)s(di\014ed.)1110
+5340 y(This)d(v)-5 b(ariable)31 b(is)f(`)p Fn(off)p Fo(')g(b)m(y)g
+(default.)p eop end
+%%Page: 7 11
+TeXDict begin 7 10 bop 150 -116 a Fo(Chapter)30 b(1:)41
+b(Command)29 b(Line)i(Editing)2153 b(7)630 299 y Fn
+(mark-symlinked-directori)o(es)1110 408 y Fo(If)44 b(set)h(to)h(`)p
+Fn(on)p Fo(',)i(completed)e(names)f(whic)m(h)f(are)h(sym)m(b)s(olic)g
+(links)g(to)g(di-)1110 518 y(rectories)j(ha)m(v)m(e)f(a)g(slash)f(app)s
+(ended)e(\(sub)5 b(ject)47 b(to)g(the)f(v)-5 b(alue)47
+b(of)f Fn(mark-)1110 628 y(directories)p Fo(\).)38 b(The)30
+b(default)g(is)h(`)p Fn(off)p Fo('.)630 789 y Fn(match-hidden-files)
+1110 898 y Fo(This)21 b(v)-5 b(ariable,)25 b(when)d(set)g(to)h(`)p
+Fn(on)p Fo(',)h(causes)f(Readline)g(to)g(matc)m(h)g(\014les)f(whose)
+1110 1008 y(names)44 b(b)s(egin)g(with)g(a)g(`)p Fn(.)p
+Fo(')g(\(hidden)f(\014les\))i(when)e(p)s(erforming)g(\014lename)1110
+1118 y(completion,)j(unless)41 b(the)g(leading)h(`)p
+Fn(.)p Fo(')g(is)g(supplied)e(b)m(y)h(the)h(user)f(in)g(the)1110
+1227 y(\014lename)31 b(to)g(b)s(e)e(completed.)42 b(This)30
+b(v)-5 b(ariable)31 b(is)f(`)p Fn(on)p Fo(')h(b)m(y)f(default.)630
+1388 y Fn(output-meta)1110 1498 y Fo(If)35 b(set)h(to)g(`)p
+Fn(on)p Fo(',)h(Readline)f(will)g(displa)m(y)f(c)m(haracters)i(with)e
+(the)h(eigh)m(th)g(bit)1110 1608 y(set)h(directly)g(rather)f(than)g(as)
+h(a)g(meta-pre\014xed)f(escap)s(e)h(sequence.)59 b(The)1110
+1717 y(default)31 b(is)f(`)p Fn(off)p Fo('.)630 1878
+y Fn(page-completions)1110 1988 y Fo(If)j(set)i(to)f(`)p
+Fn(on)p Fo(',)h(Readline)g(uses)e(an)h(in)m(ternal)h
+Fn(more)p Fo(-lik)m(e)f(pager)g(to)h(displa)m(y)1110
+2097 y(a)e(screenful)f(of)g(p)s(ossible)g(completions)i(at)f(a)g(time.)
+47 b(This)31 b(v)-5 b(ariable)34 b(is)e(`)p Fn(on)p Fo(')1110
+2207 y(b)m(y)e(default.)630 2368 y Fn(print-completions-horizo)o(ntal)o
+(ly)1110 2478 y Fo(If)23 b(set)i(to)g(`)p Fn(on)p Fo(',)g(Readline)g
+(will)f(displa)m(y)g(completions)h(with)f(matc)m(hes)h(sorted)1110
+2587 y(horizon)m(tally)45 b(in)e(alphab)s(etical)i(order,)i(rather)c
+(than)g(do)m(wn)g(the)h(screen.)1110 2697 y(The)30 b(default)g(is)h(`)p
+Fn(off)p Fo('.)630 2858 y Fn(show-all-if-ambiguous)1110
+2968 y Fo(This)e(alters)i(the)f(default)g(b)s(eha)m(vior)g(of)g(the)h
+(completion)g(functions.)40 b(If)29 b(set)1110 3077 y(to)f(`)p
+Fn(on)p Fo(',)g(w)m(ords)f(whic)m(h)g(ha)m(v)m(e)i(more)f(than)f(one)h
+(p)s(ossible)f(completion)h(cause)1110 3187 y(the)39
+b(matc)m(hes)h(to)g(b)s(e)e(listed)h(immediately)i(instead)e(of)g
+(ringing)g(the)g(b)s(ell.)1110 3296 y(The)30 b(default)g(v)-5
+b(alue)31 b(is)g(`)p Fn(off)p Fo('.)630 3458 y Fn
+(show-all-if-unmodified)1110 3567 y Fo(This)38 b(alters)h(the)g
+(default)g(b)s(eha)m(vior)g(of)f(the)h(completion)h(functions)e(in)h(a)
+1110 3677 y(fashion)25 b(similar)h(to)g Fd(sho)m(w-all-if-am)m(biguous)
+p Fo(.)41 b(If)25 b(set)h(to)h(`)p Fn(on)p Fo(',)f(w)m(ords)f(whic)m(h)
+1110 3786 y(ha)m(v)m(e)32 b(more)f(than)f(one)i(p)s(ossible)e
+(completion)i(without)f(an)m(y)g(p)s(ossible)f(par-)1110
+3896 y(tial)43 b(completion)h(\(the)f(p)s(ossible)f(completions)h
+(don't)f(share)g(a)h(common)1110 4006 y(pre\014x\))30
+b(cause)g(the)h(matc)m(hes)g(to)g(b)s(e)f(listed)g(immediately)i
+(instead)e(of)h(ring-)1110 4115 y(ing)g(the)f(b)s(ell.)41
+b(The)30 b(default)g(v)-5 b(alue)31 b(is)f(`)p Fn(off)p
+Fo('.)630 4276 y Fn(visible-stats)1110 4386 y Fo(If)h(set)i(to)f(`)p
+Fn(on)p Fo(',)h(a)f(c)m(haracter)i(denoting)e(a)g(\014le's)g(t)m(yp)s
+(e)g(is)g(app)s(ended)e(to)j(the)1110 4495 y(\014lename)e(when)e
+(listing)i(p)s(ossible)f(completions.)42 b(The)30 b(default)g(is)h(`)p
+Fn(off)p Fo('.)150 4657 y(Key)f(Bindings)630 4766 y(The)41
+b(syn)m(tax)i(for)f(con)m(trolling)h(k)m(ey)g(bindings)e(in)h(the)g
+(init)g(\014le)g(is)g(simple.)75 b(First)43 b(y)m(ou)630
+4876 y(need)27 b(to)i(\014nd)d(the)i(name)f(of)h(the)g(command)f(that)i
+(y)m(ou)f(w)m(an)m(t)g(to)g(c)m(hange.)41 b(The)27 b(follo)m(wing)630
+4985 y(sections)37 b(con)m(tain)g(tables)g(of)f(the)g(command)f(name,)j
+(the)e(default)g(k)m(eybinding,)h(if)f(an)m(y)-8 b(,)630
+5095 y(and)30 b(a)h(short)f(description)g(of)h(what)f(the)g(command)h
+(do)s(es.)630 5230 y(Once)36 b(y)m(ou)g(kno)m(w)g(the)g(name)g(of)g
+(the)g(command,)h(simply)f(place)h(on)e(a)i(line)f(in)g(the)g(init)630
+5340 y(\014le)e(the)g(name)f(of)h(the)g(k)m(ey)g(y)m(ou)g(wish)f(to)h
+(bind)f(the)h(command)f(to,)i(a)f(colon,)i(and)d(then)p
+eop end
+%%Page: 8 12
+TeXDict begin 8 11 bop 150 -116 a Fo(8)2645 b(GNU)31
+b(Readline)g(Library)630 299 y(the)h(name)h(of)f(the)g(command.)46
+b(There)32 b(can)g(b)s(e)g(no)g(space)g(b)s(et)m(w)m(een)h(the)f(k)m
+(ey)h(name)g(and)630 408 y(the)41 b(colon)h({)f(that)g(will)g(b)s(e)g
+(in)m(terpreted)g(as)g(part)f(of)h(the)g(k)m(ey)h(name.)72
+b(The)40 b(name)h(of)630 518 y(the)35 b(k)m(ey)g(can)g(b)s(e)f
+(expressed)f(in)i(di\013eren)m(t)g(w)m(a)m(ys,)h(dep)s(ending)d(on)h
+(what)h(y)m(ou)g(\014nd)e(most)630 628 y(comfortable.)630
+763 y(In)i(addition)h(to)h(command)f(names,)i(readline)e(allo)m(ws)h(k)
+m(eys)g(to)g(b)s(e)e(b)s(ound)f(to)j(a)f(string)630 872
+y(that)31 b(is)f(inserted)h(when)e(the)i(k)m(ey)g(is)f(pressed)g(\(a)h
+Fd(macro)5 b Fo(\).)630 1032 y Fd(k)m(eyname)g Fo(:)42
+b Fd(function-name)35 b Fo(or)c Fd(macro)1110 1142 y(k)m(eyname)k
+Fo(is)29 b(the)f(name)h(of)g(a)g(k)m(ey)h(sp)s(elled)e(out)h(in)g
+(English.)39 b(F)-8 b(or)30 b(example:)1350 1277 y Fn(Control-u:)45
+b(universal-argument)1350 1386 y(Meta-Rubout:)f(backward-kill-word)1350
+1496 y(Control-o:)h(">)i(output")1110 1631 y Fo(In)38
+b(the)h(ab)s(o)m(v)m(e)h(example,)h Fg(C-u)d Fo(is)h(b)s(ound)d(to)k
+(the)e(function)h Fn(universal-)1110 1740 y(argument)p
+Fo(,)f Fg(M-DEL)e Fo(is)i(b)s(ound)e(to)i(the)g(function)g
+Fn(backward-kill-word)p Fo(,)1110 1850 y(and)g Fg(C-o)g
+Fo(is)h(b)s(ound)e(to)j(run)d(the)j(macro)f(expressed)g(on)f(the)i
+(righ)m(t)f(hand)1110 1960 y(side)30 b(\(that)i(is,)e(to)h(insert)g
+(the)f(text)i(`)p Fn(>)e(output)p Fo(')f(in)m(to)i(the)g(line\).)1110
+2094 y(A)37 b(n)m(um)m(b)s(er)f(of)h(sym)m(b)s(olic)g(c)m(haracter)i
+(names)e(are)g(recognized)h(while)f(pro-)1110 2204 y(cessing)24
+b(this)g(k)m(ey)g(binding)f(syn)m(tax:)37 b Fd(DEL)p
+Fo(,)24 b Fd(ESC)p Fo(,)f Fd(ESCAPE)p Fo(,)g Fd(LFD)p
+Fo(,)h Fd(NEW-)1110 2314 y(LINE)p Fo(,)30 b Fd(RET)p
+Fo(,)g Fd(RETURN)p Fo(,)h Fd(R)m(UBOUT)p Fo(,)g Fd(SP)-8
+b(A)m(CE)p Fo(,)30 b Fd(SPC)p Fo(,)g(and)f Fd(T)-8 b(AB)p
+Fo(.)630 2474 y Fn(")p Fd(k)m(eyseq)r Fn(")p Fo(:)41
+b Fd(function-name)36 b Fo(or)30 b Fd(macro)1110 2583
+y(k)m(eyseq)k Fo(di\013ers)d(from)f Fd(k)m(eyname)37
+b Fo(ab)s(o)m(v)m(e)32 b(in)f(that)h(strings)f(denoting)g(an)g(en-)1110
+2693 y(tire)j(k)m(ey)h(sequence)f(can)g(b)s(e)f(sp)s(eci\014ed,)h(b)m
+(y)f(placing)i(the)f(k)m(ey)g(sequence)g(in)1110 2803
+y(double)29 b(quotes.)41 b(Some)29 b Fh(gnu)h Fo(Emacs)f(st)m(yle)i(k)m
+(ey)f(escap)s(es)g(can)g(b)s(e)f(used,)g(as)1110 2912
+y(in)k(the)h(follo)m(wing)i(example,)f(but)e(the)h(sp)s(ecial)h(c)m
+(haracter)g(names)f(are)g(not)1110 3022 y(recognized.)1350
+3157 y Fn("\\C-u":)46 b(universal-argument)1350 3266
+y("\\C-x\\C-r":)f(re-read-init-file)1350 3376 y("\\e[11~":)g("Function)
+h(Key)g(1")1110 3511 y Fo(In)64 b(the)g(ab)s(o)m(v)m(e)i(example,)74
+b Fg(C-u)64 b Fo(is)g(again)i(b)s(ound)c(to)k(the)e(function)1110
+3620 y Fn(universal-argument)39 b Fo(\(just)k(as)h(it)g(w)m(as)g(in)g
+(the)f(\014rst)g(example\),)49 b(`)p Fg(C-x)1110 3730
+y(C-r)p Fo(')41 b(is)g(b)s(ound)e(to)j(the)f(function)g
+Fn(re-read-init-file)p Fo(,)e(and)i(`)3462 3727 y Ff(h)p
+3486 3674 139 4 v 3486 3730 a Fe(ESC)p 3486 3745 V 3620
+3727 a Ff(i)31 b(h)p 3705 3674 20 4 v 3705 3730 a Fe([)p
+3705 3746 V 3720 3727 a Ff(i)1110 3836 y(h)p 1134 3783
+36 4 v 1134 3839 a Fe(1)p 1134 3855 V 1165 3836 a Ff(i)f(h)p
+1250 3783 V 1250 3839 a Fe(1)p 1250 3855 V 1281 3836
+a Ff(i)g(h)p 1365 3783 48 4 v 1365 3839 a Fn(~)p 1365
+3855 V 1409 3836 a Ff(i)1438 3839 y Fo(')h(is)f(b)s(ound)f(to)i(insert)
+f(the)h(text)g(`)p Fn(Function)d(Key)i(1)p Fo('.)630
+4000 y(The)f(follo)m(wing)i Fh(gnu)f Fo(Emacs)g(st)m(yle)h(escap)s(e)f
+(sequences)g(are)g(a)m(v)-5 b(ailable)32 b(when)d(sp)s(ecifying)630
+4109 y(k)m(ey)i(sequences:)630 4269 y Fg(\\C-)336 b Fo(con)m(trol)32
+b(pre\014x)630 4430 y Fg(\\M-)336 b Fo(meta)31 b(pre\014x)630
+4590 y Fg(\\e)384 b Fo(an)30 b(escap)s(e)h(c)m(haracter)630
+4750 y Fg(\\\\)384 b Fo(bac)m(kslash)630 4910 y Fg(\\)p
+Fn(")1110 4907 y Ff(h)p 1134 4854 V 1134 4910 a Fn(")p
+1134 4925 V 1178 4907 a Ff(i)1208 4910 y Fo(,)30 b(a)h(double)f
+(quotation)h(mark)630 5070 y Fg(\\')1110 5067 y Ff(h)p
+1134 5014 20 4 v 1134 5070 a Fe(')p 1134 5086 V 1150
+5067 a Ff(i)1179 5070 y Fo(,)g(a)g(single)g(quote)g(or)f(ap)s(ostrophe)
+630 5230 y(In)d(addition)h(to)g(the)g Fh(gnu)f Fo(Emacs)h(st)m(yle)h
+(escap)s(e)f(sequences,)h(a)f(second)f(set)h(of)g(bac)m(kslash)630
+5340 y(escap)s(es)j(is)f(a)m(v)-5 b(ailable:)p eop end
+%%Page: 9 13
+TeXDict begin 9 12 bop 150 -116 a Fo(Chapter)30 b(1:)41
+b(Command)29 b(Line)i(Editing)2153 b(9)630 299 y Fn(\\a)384
+b Fo(alert)31 b(\(b)s(ell\))630 453 y Fn(\\b)384 b Fo(bac)m(kspace)630
+606 y Fn(\\d)g Fo(delete)630 760 y Fn(\\f)g Fo(form)30
+b(feed)630 914 y Fn(\\n)384 b Fo(newline)630 1067 y Fn(\\r)g
+Fo(carriage)32 b(return)630 1221 y Fn(\\t)384 b Fo(horizon)m(tal)32
+b(tab)630 1375 y Fn(\\v)384 b Fo(v)m(ertical)32 b(tab)630
+1528 y Fn(\\)p Fg(nnn)288 b Fo(the)35 b(eigh)m(t-bit)h(c)m(haracter)g
+(whose)e(v)-5 b(alue)35 b(is)g(the)f(o)s(ctal)i(v)-5
+b(alue)35 b Fd(nnn)e Fo(\(one)i(to)1110 1638 y(three)c(digits\))630
+1791 y Fn(\\x)p Fg(HH)288 b Fo(the)40 b(eigh)m(t-bit)h(c)m(haracter)g
+(whose)e(v)-5 b(alue)39 b(is)h(the)f(hexadecimal)i(v)-5
+b(alue)40 b Fd(HH)1110 1901 y Fo(\(one)31 b(or)f(t)m(w)m(o)i(hex)e
+(digits\))630 2055 y(When)37 b(en)m(tering)h(the)g(text)g(of)g(a)g
+(macro,)i(single)e(or)f(double)g(quotes)h(m)m(ust)f(b)s(e)g(used)f(to)
+630 2164 y(indicate)23 b(a)e(macro)h(de\014nition.)38
+b(Unquoted)21 b(text)i(is)e(assumed)g(to)h(b)s(e)f(a)h(function)f
+(name.)38 b(In)630 2274 y(the)22 b(macro)f(b)s(o)s(dy)-8
+b(,)23 b(the)e(bac)m(kslash)h(escap)s(es)g(describ)s(ed)e(ab)s(o)m(v)m
+(e)j(are)e(expanded.)37 b(Bac)m(kslash)630 2383 y(will)j(quote)h(an)m
+(y)f(other)g(c)m(haracter)i(in)d(the)i(macro)f(text,)k(including)39
+b(`)p Fn(")p Fo(')h(and)g(`)p Fn(')p Fo('.)69 b(F)-8
+b(or)630 2493 y(example,)28 b(the)e(follo)m(wing)h(binding)d(will)i
+(mak)m(e)h(`)p Fg(C-x)j Fn(\\)p Fo(')c(insert)f(a)h(single)h(`)p
+Fn(\\)p Fo(')f(in)m(to)g(the)g(line:)870 2625 y Fn("\\C-x\\\\":)45
+b("\\\\")150 2840 y Fc(1.3.2)63 b(Conditional)41 b(Init)g(Constructs)
+275 3081 y Fo(Readline)36 b(implemen)m(ts)f(a)h(facilit)m(y)i(similar)d
+(in)g(spirit)g(to)h(the)g(conditional)h(compilation)g(features)150
+3191 y(of)e(the)f(C)g(prepro)s(cessor)g(whic)m(h)g(allo)m(ws)i(k)m(ey)f
+(bindings)e(and)h(v)-5 b(ariable)35 b(settings)h(to)f(b)s(e)f(p)s
+(erformed)f(as)150 3301 y(the)e(result)f(of)g(tests.)42
+b(There)30 b(are)h(four)e(parser)h(directiv)m(es)i(used.)150
+3454 y Fn($if)336 b Fo(The)31 b Fn($if)f Fo(construct)i(allo)m(ws)h
+(bindings)d(to)i(b)s(e)e(made)i(based)f(on)g(the)g(editing)h(mo)s(de,)g
+(the)630 3564 y(terminal)39 b(b)s(eing)e(used,)j(or)e(the)g
+(application)h(using)f(Readline.)64 b(The)38 b(text)h(of)f(the)g(test)
+630 3673 y(extends)30 b(to)h(the)g(end)f(of)g(the)h(line;)g(no)f(c)m
+(haracters)i(are)f(required)e(to)i(isolate)i(it.)630
+3827 y Fn(mode)288 b Fo(The)20 b Fn(mode=)g Fo(form)g(of)h(the)g
+Fn($if)f Fo(directiv)m(e)j(is)e(used)f(to)h(test)h(whether)e(Readline)
+1110 3937 y(is)29 b(in)h Fn(emacs)e Fo(or)h Fn(vi)g Fo(mo)s(de.)40
+b(This)29 b(ma)m(y)h(b)s(e)e(used)h(in)g(conjunction)h(with)f(the)1110
+4046 y(`)p Fn(set)h(keymap)p Fo(')c(command,)i(for)f(instance,)i(to)f
+(set)g(bindings)f(in)g(the)h Fn(emacs-)1110 4156 y(standard)23
+b Fo(and)h Fn(emacs-ctlx)f Fo(k)m(eymaps)i(only)g(if)g(Readline)h(is)f
+(starting)h(out)1110 4266 y(in)k Fn(emacs)f Fo(mo)s(de.)630
+4419 y Fn(term)288 b Fo(The)26 b Fn(term=)g Fo(form)g(ma)m(y)i(b)s(e)e
+(used)g(to)i(include)f(terminal-sp)s(eci\014c)g(k)m(ey)h(bind-)1110
+4529 y(ings,)38 b(p)s(erhaps)c(to)j(bind)e(the)h(k)m(ey)h(sequences)f
+(output)g(b)m(y)g(the)g(terminal's)1110 4638 y(function)24
+b(k)m(eys.)39 b(The)23 b(w)m(ord)h(on)f(the)i(righ)m(t)f(side)g(of)g
+(the)g(`)p Fn(=)p Fo(')g(is)g(tested)h(against)1110 4748
+y(b)s(oth)k(the)h(full)g(name)g(of)g(the)g(terminal)h(and)e(the)i(p)s
+(ortion)e(of)h(the)g(terminal)1110 4858 y(name)k(b)s(efore)f(the)g
+(\014rst)g(`)p Fn(-)p Fo('.)50 b(This)33 b(allo)m(ws)i
+Fn(sun)e Fo(to)h(matc)m(h)g(b)s(oth)f Fn(sun)g Fo(and)1110
+4967 y Fn(sun-cmd)p Fo(,)c(for)h(instance.)630 5121 y
+Fn(application)1110 5230 y Fo(The)21 b Fd(application)j
+Fo(construct)e(is)g(used)f(to)i(include)f(application-sp)s(eci\014c)h
+(set-)1110 5340 y(tings.)39 b(Eac)m(h)26 b(program)e(using)g(the)h
+(Readline)g(library)g(sets)g(the)g Fd(application)p eop
+end
+%%Page: 10 14
+TeXDict begin 10 13 bop 150 -116 a Fo(10)2600 b(GNU)31
+b(Readline)g(Library)1110 299 y Fd(name)p Fo(,)25 b(and)e(y)m(ou)g(can)
+h(test)g(for)f(a)g(particular)h(v)-5 b(alue.)39 b(This)22
+b(could)h(b)s(e)g(used)f(to)1110 408 y(bind)32 b(k)m(ey)h(sequences)g
+(to)h(functions)e(useful)g(for)h(a)g(sp)s(eci\014c)f(program.)48
+b(F)-8 b(or)1110 518 y(instance,)35 b(the)e(follo)m(wing)h(command)f
+(adds)f(a)i(k)m(ey)f(sequence)h(that)f(quotes)1110 628
+y(the)e(curren)m(t)f(or)g(previous)g(w)m(ord)g(in)g(Bash:)1350
+762 y Fn($if)47 b(Bash)1350 872 y(#)g(Quote)g(the)g(current)f(or)h
+(previous)e(word)1350 981 y("\\C-xq":)h("\\eb\\"\\ef\\"")1350
+1091 y($endif)150 1250 y($endif)192 b Fo(This)29 b(command,)i(as)f
+(seen)h(in)f(the)g(previous)g(example,)h(terminates)g(an)g
+Fn($if)e Fo(command.)150 1410 y Fn($else)240 b Fo(Commands)29
+b(in)h(this)h(branc)m(h)e(of)i(the)f Fn($if)g Fo(directiv)m(e)i(are)f
+(executed)g(if)f(the)h(test)g(fails.)150 1569 y Fn($include)96
+b Fo(This)43 b(directiv)m(e)i(tak)m(es)g(a)e(single)i(\014lename)e(as)h
+(an)f(argumen)m(t)h(and)f(reads)g(commands)630 1679 y(and)38
+b(bindings)f(from)h(that)i(\014le.)65 b(F)-8 b(or)39
+b(example,)j(the)d(follo)m(wing)h(directiv)m(e)g(reads)e(from)630
+1788 y(`)p Fn(/etc/inputrc)p Fo(':)870 1923 y Fn($include)46
+b(/etc/inputrc)150 2147 y Fc(1.3.3)63 b(Sample)41 b(Init)g(File)275
+2391 y Fo(Here)31 b(is)f(an)g(example)i(of)e(an)g Fd(inputrc)35
+b Fo(\014le.)42 b(This)29 b(illustrates)j(k)m(ey)f(binding,)f(v)-5
+b(ariable)31 b(assignmen)m(t,)150 2501 y(and)f(conditional)h(syn)m
+(tax.)p eop end
+%%Page: 11 15
+TeXDict begin 11 14 bop 150 -116 a Fo(Chapter)30 b(1:)41
+b(Command)29 b(Line)i(Editing)2107 b(11)390 408 y Fn(#)47
+b(This)g(file)g(controls)e(the)i(behaviour)e(of)j(line)e(input)h
+(editing)e(for)390 518 y(#)i(programs)f(that)h(use)g(the)f(GNU)h
+(Readline)f(library.)93 b(Existing)390 628 y(#)47 b(programs)f(include)
+g(FTP,)g(Bash,)h(and)g(GDB.)390 737 y(#)390 847 y(#)g(You)g(can)g
+(re-read)f(the)h(inputrc)f(file)g(with)h(C-x)g(C-r.)390
+956 y(#)g(Lines)g(beginning)e(with)i('#')g(are)g(comments.)390
+1066 y(#)390 1176 y(#)g(First,)g(include)e(any)i(systemwide)e(bindings)
+h(and)h(variable)390 1285 y(#)g(assignments)e(from)i(/etc/Inputrc)390
+1395 y($include)f(/etc/Inputrc)390 1614 y(#)390 1724
+y(#)h(Set)g(various)f(bindings)g(for)h(emacs)f(mode.)390
+1943 y(set)h(editing-mode)d(emacs)390 2162 y($if)j(mode=emacs)390
+2381 y(Meta-Control-h:)91 b(backward-kill-word)43 b(Text)k(after)f(the)
+h(function)f(name)g(is)h(ignored)p 3971 2401 42 76 v
+390 2600 a(#)390 2710 y(#)g(Arrow)g(keys)f(in)i(keypad)e(mode)390
+2819 y(#)390 2929 y(#"\\M-OD":)379 b(backward-char)390
+3039 y(#"\\M-OC":)g(forward-char)390 3148 y(#"\\M-OA":)g
+(previous-history)390 3258 y(#"\\M-OB":)g(next-history)390
+3367 y(#)390 3477 y(#)47 b(Arrow)g(keys)f(in)i(ANSI)e(mode)390
+3587 y(#)390 3696 y("\\M-[D":)380 b(backward-char)390
+3806 y("\\M-[C":)g(forward-char)390 3915 y("\\M-[A":)g
+(previous-history)390 4025 y("\\M-[B":)g(next-history)390
+4134 y(#)390 4244 y(#)47 b(Arrow)g(keys)f(in)i(8)f(bit)g(keypad)f(mode)
+390 4354 y(#)390 4463 y(#"\\M-\\C-OD":)331 b(backward-char)390
+4573 y(#"\\M-\\C-OC":)g(forward-char)390 4682 y(#"\\M-\\C-OA":)g
+(previous-history)390 4792 y(#"\\M-\\C-OB":)g(next-history)390
+4902 y(#)390 5011 y(#)47 b(Arrow)g(keys)f(in)i(8)f(bit)g(ANSI)g(mode)
+390 5121 y(#)390 5230 y(#"\\M-\\C-[D":)331 b(backward-char)390
+5340 y(#"\\M-\\C-[C":)g(forward-char)p eop end
+%%Page: 12 16
+TeXDict begin 12 15 bop 150 -116 a Fo(12)2600 b(GNU)31
+b(Readline)g(Library)390 299 y Fn(#"\\M-\\C-[A":)331
+b(previous-history)390 408 y(#"\\M-\\C-[B":)g(next-history)390
+628 y(C-q:)47 b(quoted-insert)390 847 y($endif)390 1066
+y(#)g(An)h(old-style)d(binding.)93 b(This)47 b(happens)f(to)h(be)g(the)
+g(default.)390 1176 y(TAB:)g(complete)390 1395 y(#)g(Macros)g(that)f
+(are)h(convenient)e(for)i(shell)f(interaction)390 1504
+y($if)h(Bash)390 1614 y(#)g(edit)g(the)g(path)390 1724
+y("\\C-xp":)f("PATH=${PATH}\\e\\C-e\\C-a)o(\\ef)o(\\C-f)o(")390
+1833 y(#)h(prepare)f(to)h(type)g(a)h(quoted)e(word)g(--)390
+1943 y(#)h(insert)g(open)f(and)h(close)f(double)h(quotes)390
+2052 y(#)g(and)g(move)g(to)g(just)g(after)f(the)h(open)g(quote)390
+2162 y("\\C-x\\"":)e("\\"\\"\\C-b")390 2271 y(#)i(insert)g(a)g
+(backslash)e(\(testing)h(backslash)f(escapes)390 2381
+y(#)i(in)h(sequences)d(and)i(macros\))390 2491 y("\\C-x\\\\":)e("\\\\")
+390 2600 y(#)i(Quote)g(the)g(current)f(or)h(previous)e(word)390
+2710 y("\\C-xq":)h("\\eb\\"\\ef\\"")390 2819 y(#)h(Add)g(a)h(binding)e
+(to)h(refresh)f(the)h(line,)f(which)g(is)h(unbound)390
+2929 y("\\C-xr":)f(redraw-current-line)390 3039 y(#)h(Edit)g(variable)f
+(on)h(current)f(line.)390 3148 y("\\M-\\C-v":)f
+("\\C-a\\C-k$\\C-y\\M-\\C-e\\C-)o(a\\C-)o(y=")390 3258
+y($endif)390 3477 y(#)i(use)g(a)h(visible)e(bell)g(if)h(one)g(is)h
+(available)390 3587 y(set)f(bell-style)e(visible)390
+3806 y(#)i(don't)g(strip)f(characters)f(to)i(7)h(bits)e(when)h(reading)
+390 3915 y(set)g(input-meta)e(on)390 4134 y(#)i(allow)g(iso-latin1)e
+(characters)g(to)i(be)g(inserted)f(rather)390 4244 y(#)h(than)g
+(converted)e(to)j(prefix-meta)c(sequences)390 4354 y(set)j
+(convert-meta)d(off)390 4573 y(#)j(display)f(characters)f(with)i(the)g
+(eighth)f(bit)h(set)g(directly)390 4682 y(#)g(rather)g(than)f(as)h
+(meta-prefixed)e(characters)390 4792 y(set)i(output-meta)e(on)390
+5011 y(#)i(if)h(there)e(are)h(more)g(than)f(150)h(possible)f
+(completions)e(for)390 5121 y(#)j(a)h(word,)e(ask)h(the)g(user)g(if)g
+(he)g(wants)f(to)i(see)f(all)f(of)i(them)390 5230 y(set)f
+(completion-query-items)42 b(150)p eop end
+%%Page: 13 17
+TeXDict begin 13 16 bop 150 -116 a Fo(Chapter)30 b(1:)41
+b(Command)29 b(Line)i(Editing)2107 b(13)390 299 y Fn(#)47
+b(For)g(FTP)390 408 y($if)g(Ftp)390 518 y("\\C-xg":)f("get)g(\\M-?")390
+628 y("\\C-xt":)g("put)g(\\M-?")390 737 y("\\M-.":)g(yank-last-arg)390
+847 y($endif)150 1098 y Fm(1.4)68 b(Bindable)45 b(Readline)i(Commands)
+275 1340 y Fo(This)30 b(section)j(describ)s(es)d(Readline)i(commands)f
+(that)h(ma)m(y)g(b)s(e)f(b)s(ound)e(to)j(k)m(ey)g(sequences.)44
+b(Com-)150 1449 y(mand)30 b(names)g(without)g(an)g(accompan)m(ying)i(k)
+m(ey)g(sequence)e(are)h(un)m(b)s(ound)d(b)m(y)i(default.)275
+1582 y(In)25 b(the)h(follo)m(wing)i(descriptions,)f Fd(p)s(oin)m(t)h
+Fo(refers)e(to)h(the)f(curren)m(t)g(cursor)g(p)s(osition,)h(and)f
+Fd(mark)31 b Fo(refers)150 1691 y(to)40 b(a)f(cursor)f(p)s(osition)h
+(sa)m(v)m(ed)h(b)m(y)f(the)g Fn(set-mark)d Fo(command.)66
+b(The)38 b(text)i(b)s(et)m(w)m(een)g(the)f(p)s(oin)m(t)g(and)150
+1801 y(mark)30 b(is)h(referred)e(to)i(as)g(the)f Fd(region)p
+Fo(.)150 2018 y Fc(1.4.1)63 b(Commands)42 b(F)-10 b(or)41
+b(Mo)m(ving)150 2260 y Fn(beginning-of-line)26 b(\(C-a\))630
+2370 y Fo(Mo)m(v)m(e)32 b(to)g(the)e(start)h(of)g(the)f(curren)m(t)g
+(line.)150 2525 y Fn(end-of-line)d(\(C-e\))630 2635 y
+Fo(Mo)m(v)m(e)32 b(to)g(the)e(end)g(of)g(the)h(line.)150
+2790 y Fn(forward-char)c(\(C-f\))630 2899 y Fo(Mo)m(v)m(e)32
+b(forw)m(ard)e(a)h(c)m(haracter.)150 3054 y Fn(backward-char)c(\(C-b\))
+630 3164 y Fo(Mo)m(v)m(e)32 b(bac)m(k)g(a)e(c)m(haracter.)150
+3319 y Fn(forward-word)d(\(M-f\))630 3429 y Fo(Mo)m(v)m(e)32
+b(forw)m(ard)e(to)h(the)f(end)g(of)g(the)h(next)f(w)m(ord.)41
+b(W)-8 b(ords)30 b(are)h(comp)s(osed)f(of)g(letters)i(and)630
+3538 y(digits.)150 3693 y Fn(backward-word)27 b(\(M-b\))630
+3803 y Fo(Mo)m(v)m(e)36 b(bac)m(k)e(to)g(the)g(start)g(of)g(the)g
+(curren)m(t)f(or)g(previous)g(w)m(ord.)50 b(W)-8 b(ords)34
+b(are)g(comp)s(osed)630 3913 y(of)d(letters)g(and)f(digits.)150
+4068 y Fn(clear-screen)d(\(C-l\))630 4177 y Fo(Clear)g(the)g(screen)f
+(and)h(redra)m(w)f(the)h(curren)m(t)f(line,)i(lea)m(ving)g(the)f
+(curren)m(t)g(line)g(at)g(the)g(top)630 4287 y(of)k(the)f(screen.)150
+4442 y Fn(redraw-current-line)25 b(\(\))630 4552 y Fo(Refresh)30
+b(the)g(curren)m(t)h(line.)41 b(By)30 b(default,)h(this)f(is)h(un)m(b)s
+(ound.)150 4769 y Fc(1.4.2)63 b(Commands)42 b(F)-10 b(or)41
+b(Manipulating)h(The)f(History)150 5011 y Fn(accept-line)27
+b(\(Newline)h(or)i(Return\))630 5121 y Fo(Accept)36 b(the)g(line)f
+(regardless)h(of)f(where)g(the)g(cursor)g(is.)55 b(If)34
+b(this)h(line)h(is)f(non-empt)m(y)-8 b(,)37 b(it)630
+5230 y(ma)m(y)32 b(b)s(e)g(added)f(to)h(the)g(history)g(list)h(for)e
+(future)g(recall)j(with)d Fn(add_history\(\))p Fo(.)42
+b(If)31 b(this)630 5340 y(line)g(is)f(a)h(mo)s(di\014ed)e(history)h
+(line,)h(the)g(history)f(line)h(is)f(restored)h(to)g(its)g(original)g
+(state.)p eop end
+%%Page: 14 18
+TeXDict begin 14 17 bop 150 -116 a Fo(14)2600 b(GNU)31
+b(Readline)g(Library)150 299 y Fn(previous-history)26
+b(\(C-p\))630 408 y Fo(Mo)m(v)m(e)32 b(`bac)m(k')g(through)e(the)g
+(history)h(list,)g(fetc)m(hing)g(the)g(previous)f(command.)150
+556 y Fn(next-history)d(\(C-n\))630 666 y Fo(Mo)m(v)m(e)32
+b(`forw)m(ard')f(through)e(the)i(history)f(list,)i(fetc)m(hing)f(the)g
+(next)f(command.)150 814 y Fn(beginning-of-history)25
+b(\(M-<\))630 923 y Fo(Mo)m(v)m(e)32 b(to)g(the)e(\014rst)g(line)g(in)h
+(the)f(history)-8 b(.)150 1071 y Fn(end-of-history)26
+b(\(M->\))630 1181 y Fo(Mo)m(v)m(e)32 b(to)g(the)e(end)g(of)g(the)h
+(input)e(history)-8 b(,)31 b(i.e.,)h(the)f(line)f(curren)m(tly)h(b)s
+(eing)f(en)m(tered.)150 1329 y Fn(reverse-search-history)24
+b(\(C-r\))630 1438 y Fo(Searc)m(h)31 b(bac)m(kw)m(ard)h(starting)g(at)g
+(the)f(curren)m(t)g(line)g(and)g(mo)m(ving)h(`up')e(through)h(the)g
+(his-)630 1548 y(tory)g(as)f(necessary)-8 b(.)42 b(This)29
+b(is)i(an)f(incremen)m(tal)i(searc)m(h.)150 1696 y Fn
+(forward-search-history)24 b(\(C-s\))630 1805 y Fo(Searc)m(h)30
+b(forw)m(ard)f(starting)h(at)g(the)g(curren)m(t)f(line)h(and)f(mo)m
+(ving)h(`do)m(wn')f(through)g(the)h(the)630 1915 y(history)g(as)h
+(necessary)-8 b(.)41 b(This)30 b(is)g(an)h(incremen)m(tal)g(searc)m(h.)
+150 2063 y Fn(non-incremental-reverse-)o(sear)o(ch-h)o(ist)o(ory)24
+b(\(M-p\))630 2172 y Fo(Searc)m(h)31 b(bac)m(kw)m(ard)h(starting)g(at)g
+(the)f(curren)m(t)g(line)g(and)g(mo)m(ving)h(`up')e(through)h(the)g
+(his-)630 2282 y(tory)36 b(as)g(necessary)h(using)e(a)i(non-incremen)m
+(tal)g(searc)m(h)f(for)g(a)g(string)g(supplied)f(b)m(y)h(the)630
+2391 y(user.)150 2539 y Fn(non-incremental-forward-)o(sear)o(ch-h)o
+(ist)o(ory)24 b(\(M-n\))630 2649 y Fo(Searc)m(h)30 b(forw)m(ard)f
+(starting)h(at)g(the)g(curren)m(t)f(line)h(and)f(mo)m(ving)h(`do)m(wn')
+f(through)g(the)h(the)630 2758 y(history)d(as)f(necessary)i(using)e(a)h
+(non-incremen)m(tal)g(searc)m(h)h(for)e(a)h(string)g(supplied)e(b)m(y)i
+(the)630 2868 y(user.)150 3016 y Fn(history-search-forward)d(\(\))630
+3125 y Fo(Searc)m(h)42 b(forw)m(ard)f(through)f(the)i(history)f(for)g
+(the)h(string)f(of)h(c)m(haracters)h(b)s(et)m(w)m(een)f(the)630
+3235 y(start)36 b(of)f(the)g(curren)m(t)g(line)g(and)g(the)g(p)s(oin)m
+(t.)55 b(This)34 b(is)i(a)f(non-incremen)m(tal)h(searc)m(h.)56
+b(By)630 3345 y(default,)31 b(this)f(command)g(is)h(un)m(b)s(ound.)150
+3492 y Fn(history-search-backward)24 b(\(\))630 3602
+y Fo(Searc)m(h)35 b(bac)m(kw)m(ard)g(through)f(the)h(history)g(for)g
+(the)f(string)h(of)g(c)m(haracters)h(b)s(et)m(w)m(een)g(the)630
+3712 y(start)g(of)f(the)g(curren)m(t)g(line)g(and)g(the)g(p)s(oin)m(t.)
+55 b(This)34 b(is)i(a)f(non-incremen)m(tal)h(searc)m(h.)56
+b(By)630 3821 y(default,)31 b(this)f(command)g(is)h(un)m(b)s(ound.)150
+3969 y Fn(yank-nth-arg)c(\(M-C-y\))630 4079 y Fo(Insert)37
+b(the)g(\014rst)f(argumen)m(t)i(to)f(the)h(previous)e(command)h
+(\(usually)g(the)g(second)g(w)m(ord)630 4188 y(on)32
+b(the)g(previous)f(line\))i(at)f(p)s(oin)m(t.)46 b(With)32
+b(an)g(argumen)m(t)g Fd(n)p Fo(,)g(insert)g(the)g Fd(n)p
+Fo(th)f(w)m(ord)g(from)630 4298 y(the)k(previous)f(command)h(\(the)g(w)
+m(ords)g(in)f(the)h(previous)g(command)f(b)s(egin)h(with)f(w)m(ord)630
+4407 y(0\).)69 b(A)40 b(negativ)m(e)h(argumen)m(t)f(inserts)g(the)f
+Fd(n)p Fo(th)g(w)m(ord)g(from)g(the)h(end)f(of)h(the)f(previous)630
+4517 y(command.)48 b(Once)33 b(the)g(argumen)m(t)h Fd(n)e
+Fo(is)h(computed,)h(the)f(argumen)m(t)g(is)g(extracted)i(as)e(if)630
+4627 y(the)e(`)p Fn(!)p Fg(n)11 b Fo(')29 b(history)i(expansion)f(had)g
+(b)s(een)f(sp)s(eci\014ed.)150 4774 y Fn(yank-last-arg)e(\(M-.)i(or)h
+(M-_\))630 4884 y Fo(Insert)k(last)i(argumen)m(t)g(to)g(the)f(previous)
+f(command)h(\(the)h(last)f(w)m(ord)g(of)g(the)g(previous)630
+4994 y(history)c(en)m(try\).)41 b(With)31 b(an)g(argumen)m(t,)g(b)s
+(eha)m(v)m(e)g(exactly)i(lik)m(e)f Fn(yank-nth-arg)p
+Fo(.)38 b(Succes-)630 5103 y(siv)m(e)d(calls)h(to)f Fn(yank-last-arg)c
+Fo(mo)m(v)m(e)36 b(bac)m(k)g(through)d(the)i(history)g(list,)h
+(inserting)f(the)630 5213 y(last)d(argumen)m(t)f(of)g(eac)m(h)h(line)f
+(in)f(turn.)41 b(The)30 b(history)h(expansion)f(facilities)j(are)e
+(used)f(to)630 5322 y(extract)i(the)e(last)i(argumen)m(t,)f(as)f(if)h
+(the)f(`)p Fn(!$)p Fo(')g(history)h(expansion)f(had)g(b)s(een)f(sp)s
+(eci\014ed.)p eop end
+%%Page: 15 19
+TeXDict begin 15 18 bop 150 -116 a Fo(Chapter)30 b(1:)41
+b(Command)29 b(Line)i(Editing)2107 b(15)150 299 y Fc(1.4.3)63
+b(Commands)42 b(F)-10 b(or)41 b(Changing)g(T)-10 b(ext)150
+547 y Fn(delete-char)27 b(\(C-d\))630 656 y Fo(Delete)41
+b(the)e(c)m(haracter)i(at)e(p)s(oin)m(t.)66 b(If)39 b(p)s(oin)m(t)f(is)
+h(at)h(the)f(b)s(eginning)f(of)h(the)g(line,)j(there)630
+766 y(are)37 b(no)g(c)m(haracters)i(in)d(the)i(line,)h(and)d(the)h
+(last)h(c)m(haracter)h(t)m(yp)s(ed)e(w)m(as)g(not)g(b)s(ound)e(to)630
+875 y Fn(delete-char)p Fo(,)28 b(then)i(return)f Fh(eof)p
+Fo(.)150 1042 y Fn(backward-delete-char)c(\(Rubout\))630
+1152 y Fo(Delete)32 b(the)f(c)m(haracter)g(b)s(ehind)e(the)h(cursor.)40
+b(A)30 b(n)m(umeric)g(argumen)m(t)h(means)f(to)h(kill)g(the)630
+1261 y(c)m(haracters)h(instead)e(of)h(deleting)g(them.)150
+1428 y Fn(forward-backward-delete-)o(char)24 b(\(\))630
+1538 y Fo(Delete)40 b(the)f(c)m(haracter)h(under)c(the)j(cursor,)h
+(unless)d(the)i(cursor)e(is)h(at)h(the)g(end)e(of)i(the)630
+1647 y(line,)33 b(in)e(whic)m(h)g(case)i(the)f(c)m(haracter)h(b)s
+(ehind)d(the)i(cursor)f(is)g(deleted.)46 b(By)32 b(default,)g(this)630
+1757 y(is)e(not)h(b)s(ound)d(to)j(a)g(k)m(ey)-8 b(.)150
+1924 y Fn(quoted-insert)27 b(\(C-q)i(or)h(C-v\))630 2033
+y Fo(Add)j(the)i(next)f(c)m(haracter)i(t)m(yp)s(ed)e(to)h(the)f(line)h
+(v)m(erbatim.)53 b(This)33 b(is)i(ho)m(w)f(to)h(insert)f(k)m(ey)630
+2143 y(sequences)d(lik)m(e)g Fg(C-q)p Fo(,)f(for)g(example.)150
+2310 y Fn(tab-insert)e(\(M-)802 2307 y Ff(h)p 825 2254
+148 4 v 825 2310 a Fe(T)-6 b(AB)p 825 2325 V 969 2307
+a Ff(i)998 2310 y Fn(\))630 2419 y Fo(Insert)30 b(a)h(tab)f(c)m
+(haracter.)150 2586 y Fn(self-insert)d(\(a,)j(b,)g(A,)f(1,)h(!,)g(...)o
+(\))630 2696 y Fo(Insert)g(y)m(ourself.)150 2862 y Fn(transpose-chars)c
+(\(C-t\))630 2972 y Fo(Drag)33 b(the)f(c)m(haracter)h(b)s(efore)f(the)g
+(cursor)f(forw)m(ard)h(o)m(v)m(er)h(the)f(c)m(haracter)i(at)e(the)g
+(cursor,)630 3081 y(mo)m(ving)k(the)g(cursor)f(forw)m(ard)g(as)g(w)m
+(ell.)57 b(If)35 b(the)h(insertion)g(p)s(oin)m(t)f(is)g(at)i(the)e(end)
+g(of)h(the)630 3191 y(line,)24 b(then)e(this)g(transp)s(oses)f(the)h
+(last)h(t)m(w)m(o)g(c)m(haracters)g(of)f(the)h(line.)38
+b(Negativ)m(e)25 b(argumen)m(ts)630 3301 y(ha)m(v)m(e)32
+b(no)e(e\013ect.)150 3467 y Fn(transpose-words)c(\(M-t\))630
+3577 y Fo(Drag)33 b(the)g(w)m(ord)f(b)s(efore)g(p)s(oin)m(t)g(past)g
+(the)h(w)m(ord)f(after)g(p)s(oin)m(t,)i(mo)m(ving)f(p)s(oin)m(t)f(past)
+g(that)630 3687 y(w)m(ord)c(as)h(w)m(ell.)41 b(If)27
+b(the)i(insertion)f(p)s(oin)m(t)h(is)f(at)h(the)g(end)e(of)i(the)f
+(line,)i(this)e(transp)s(oses)g(the)630 3796 y(last)j(t)m(w)m(o)h(w)m
+(ords)e(on)g(the)h(line.)150 3963 y Fn(upcase-word)c(\(M-u\))630
+4073 y Fo(Upp)s(ercase)32 b(the)g(curren)m(t)g(\(or)g(follo)m(wing\))i
+(w)m(ord.)45 b(With)32 b(a)g(negativ)m(e)j(argumen)m(t,)e(upp)s(er-)630
+4182 y(case)e(the)g(previous)f(w)m(ord,)g(but)g(do)g(not)h(mo)m(v)m(e)h
+(the)e(cursor.)150 4349 y Fn(downcase-word)d(\(M-l\))630
+4458 y Fo(Lo)m(w)m(ercase)c(the)f(curren)m(t)f(\(or)h(follo)m(wing\))i
+(w)m(ord.)37 b(With)22 b(a)g(negativ)m(e)i(argumen)m(t,)g(lo)m(w)m
+(ercase)630 4568 y(the)31 b(previous)e(w)m(ord,)i(but)e(do)i(not)f(mo)m
+(v)m(e)i(the)f(cursor.)150 4735 y Fn(capitalize-word)26
+b(\(M-c\))630 4844 y Fo(Capitalize)d(the)f(curren)m(t)f(\(or)g(follo)m
+(wing\))i(w)m(ord.)38 b(With)21 b(a)h(negativ)m(e)h(argumen)m(t,)h
+(capitalize)630 4954 y(the)31 b(previous)e(w)m(ord,)i(but)e(do)i(not)f
+(mo)m(v)m(e)i(the)f(cursor.)150 5121 y Fn(overwrite-mode)26
+b(\(\))630 5230 y Fo(T)-8 b(oggle)35 b(o)m(v)m(erwrite)g(mo)s(de.)48
+b(With)33 b(an)g(explicit)h(p)s(ositiv)m(e)g(n)m(umeric)f(argumen)m(t,)
+h(switc)m(hes)630 5340 y(to)22 b(o)m(v)m(erwrite)i(mo)s(de.)37
+b(With)22 b(an)g(explicit)h(non-p)s(ositiv)m(e)f(n)m(umeric)g(argumen)m
+(t,)i(switc)m(hes)e(to)p eop end
+%%Page: 16 20
+TeXDict begin 16 19 bop 150 -116 a Fo(16)2600 b(GNU)31
+b(Readline)g(Library)630 299 y(insert)f(mo)s(de.)41 b(This)30
+b(command)h(a\013ects)h(only)e Fn(emacs)f Fo(mo)s(de;)i
+Fn(vi)f Fo(mo)s(de)g(do)s(es)g(o)m(v)m(erwrite)630 408
+y(di\013eren)m(tly)-8 b(.)42 b(Eac)m(h)31 b(call)h(to)f
+Fn(readline\(\))c Fo(starts)k(in)f(insert)g(mo)s(de.)630
+539 y(In)e(o)m(v)m(erwrite)j(mo)s(de,)e(c)m(haracters)i(b)s(ound)c(to)j
+Fn(self-insert)c Fo(replace)k(the)g(text)g(at)g(p)s(oin)m(t)630
+648 y(rather)41 b(than)h(pushing)e(the)i(text)g(to)g(the)g(righ)m(t.)75
+b(Characters)42 b(b)s(ound)d(to)j Fn(backward-)630 758
+y(delete-char)27 b Fo(replace)32 b(the)e(c)m(haracter)i(b)s(efore)e(p)s
+(oin)m(t)h(with)f(a)g(space.)630 888 y(By)h(default,)f(this)h(command)f
+(is)g(un)m(b)s(ound.)150 1099 y Fc(1.4.4)63 b(Killing)42
+b(And)e(Y)-10 b(anking)150 1339 y Fn(kill-line)28 b(\(C-k\))630
+1449 y Fo(Kill)j(the)f(text)i(from)e(p)s(oin)m(t)g(to)h(the)g(end)e(of)
+i(the)f(line.)150 1599 y Fn(backward-kill-line)25 b(\(C-x)30
+b(Rubout\))630 1709 y Fo(Kill)h(bac)m(kw)m(ard)g(to)g(the)f(b)s
+(eginning)g(of)g(the)h(line.)150 1860 y Fn(unix-line-discard)26
+b(\(C-u\))630 1969 y Fo(Kill)31 b(bac)m(kw)m(ard)g(from)e(the)i(cursor)
+f(to)h(the)f(b)s(eginning)g(of)h(the)f(curren)m(t)g(line.)150
+2120 y Fn(kill-whole-line)c(\(\))630 2230 y Fo(Kill)37
+b(all)g(c)m(haracters)h(on)f(the)f(curren)m(t)h(line,)h(no)f(matter)g
+(where)f(p)s(oin)m(t)h(is.)59 b(By)36 b(default,)630
+2339 y(this)30 b(is)h(un)m(b)s(ound.)150 2490 y Fn(kill-word)d(\(M-d\))
+630 2600 y Fo(Kill)i(from)f(p)s(oin)m(t)g(to)h(the)g(end)e(of)i(the)f
+(curren)m(t)h(w)m(ord,)f(or)g(if)h(b)s(et)m(w)m(een)g(w)m(ords,)f(to)h
+(the)g(end)630 2709 y(of)h(the)f(next)h(w)m(ord.)40 b(W)-8
+b(ord)31 b(b)s(oundaries)e(are)h(the)h(same)g(as)f Fn(forward-word)p
+Fo(.)150 2860 y Fn(backward-kill-word)25 b(\(M-)1183
+2857 y Ff(h)p 1207 2804 146 4 v 1207 2860 a Fe(DEL)p
+1207 2875 V 1348 2857 a Ff(i)1378 2860 y Fn(\))630 2970
+y Fo(Kill)k(the)g(w)m(ord)g(b)s(ehind)e(p)s(oin)m(t.)40
+b(W)-8 b(ord)29 b(b)s(oundaries)f(are)h(the)g(same)g(as)g
+Fn(backward-word)p Fo(.)150 3120 y Fn(unix-word-rubout)d(\(C-w\))630
+3230 y Fo(Kill)32 b(the)g(w)m(ord)f(b)s(ehind)f(p)s(oin)m(t,)i(using)f
+(white)h(space)g(as)g(a)g(w)m(ord)f(b)s(oundary)-8 b(.)43
+b(The)31 b(killed)630 3339 y(text)g(is)g(sa)m(v)m(ed)g(on)g(the)f
+(kill-ring.)150 3490 y Fn(unix-filename-rubout)25 b(\(\))630
+3600 y Fo(Kill)37 b(the)f(w)m(ord)g(b)s(ehind)f(p)s(oin)m(t,)j(using)e
+(white)g(space)h(and)f(the)g(slash)g(c)m(haracter)i(as)f(the)630
+3709 y(w)m(ord)30 b(b)s(oundaries.)39 b(The)30 b(killed)h(text)g(is)g
+(sa)m(v)m(ed)g(on)g(the)f(kill-ring.)150 3860 y Fn
+(delete-horizontal-space)24 b(\(\))630 3970 y Fo(Delete)33
+b(all)e(spaces)g(and)e(tabs)i(around)e(p)s(oin)m(t.)41
+b(By)31 b(default,)f(this)h(is)f(un)m(b)s(ound.)150 4121
+y Fn(kill-region)d(\(\))630 4230 y Fo(Kill)k(the)f(text)i(in)e(the)g
+(curren)m(t)h(region.)41 b(By)31 b(default,)f(this)h(command)f(is)g(un)
+m(b)s(ound.)150 4381 y Fn(copy-region-as-kill)25 b(\(\))630
+4490 y Fo(Cop)m(y)34 b(the)g(text)h(in)f(the)g(region)g(to)h(the)f
+(kill)h(bu\013er,)f(so)g(it)h(can)f(b)s(e)f(y)m(ank)m(ed)i(righ)m(t)f
+(a)m(w)m(a)m(y)-8 b(.)630 4600 y(By)31 b(default,)f(this)h(command)f
+(is)g(un)m(b)s(ound.)150 4751 y Fn(copy-backward-word)25
+b(\(\))630 4860 y Fo(Cop)m(y)38 b(the)h(w)m(ord)f(b)s(efore)g(p)s(oin)m
+(t)g(to)i(the)e(kill)h(bu\013er.)64 b(The)38 b(w)m(ord)g(b)s(oundaries)
+f(are)i(the)630 4970 y(same)31 b(as)f Fn(backward-word)p
+Fo(.)38 b(By)30 b(default,)h(this)f(command)g(is)h(un)m(b)s(ound.)150
+5121 y Fn(copy-forward-word)26 b(\(\))630 5230 y Fo(Cop)m(y)31
+b(the)g(w)m(ord)g(follo)m(wing)h(p)s(oin)m(t)f(to)h(the)f(kill)h
+(bu\013er.)42 b(The)30 b(w)m(ord)h(b)s(oundaries)e(are)j(the)630
+5340 y(same)f(as)f Fn(forward-word)p Fo(.)38 b(By)30
+b(default,)h(this)g(command)f(is)g(un)m(b)s(ound.)p eop
+end
+%%Page: 17 21
+TeXDict begin 17 20 bop 150 -116 a Fo(Chapter)30 b(1:)41
+b(Command)29 b(Line)i(Editing)2107 b(17)150 299 y Fn(yank)29
+b(\(C-y\))630 408 y Fo(Y)-8 b(ank)31 b(the)f(top)h(of)g(the)f(kill)h
+(ring)f(in)m(to)i(the)e(bu\013er)g(at)h(p)s(oin)m(t.)150
+552 y Fn(yank-pop)d(\(M-y\))630 661 y Fo(Rotate)36 b(the)f(kill-ring,)i
+(and)d(y)m(ank)h(the)f(new)g(top.)54 b(Y)-8 b(ou)35 b(can)g(only)f(do)h
+(this)f(if)h(the)g(prior)630 771 y(command)30 b(is)h
+Fn(yank)e Fo(or)h Fn(yank-pop)p Fo(.)150 971 y Fc(1.4.5)63
+b(Sp)s(ecifying)42 b(Numeric)f(Argumen)m(ts)150 1207
+y Fn(digit-argument)26 b(\()p Fg(M-0)p Fn(,)j Fg(M-1)p
+Fn(,)h(...)f Fg(M--)p Fn(\))630 1317 y Fo(Add)d(this)h(digit)g(to)h
+(the)f(argumen)m(t)g(already)h(accum)m(ulating,)h(or)e(start)h(a)f(new)
+f(argumen)m(t.)630 1427 y Fg(M--)j Fo(starts)i(a)g(negativ)m(e)i
+(argumen)m(t.)150 1570 y Fn(universal-argument)25 b(\(\))630
+1680 y Fo(This)g(is)g(another)h(w)m(a)m(y)g(to)h(sp)s(ecify)e(an)g
+(argumen)m(t.)40 b(If)25 b(this)g(command)h(is)f(follo)m(w)m(ed)i(b)m
+(y)f(one)630 1789 y(or)k(more)f(digits,)i(optionally)g(with)e(a)h
+(leading)h(min)m(us)e(sign,)h(those)g(digits)g(de\014ne)f(the)h(ar-)630
+1899 y(gumen)m(t.)41 b(If)28 b(the)i(command)f(is)g(follo)m(w)m(ed)h(b)
+m(y)f(digits,)i(executing)f Fn(universal-argument)630
+2008 y Fo(again)j(ends)e(the)h(n)m(umeric)f(argumen)m(t,)i(but)e(is)h
+(otherwise)g(ignored.)45 b(As)32 b(a)g(sp)s(ecial)h(case,)630
+2118 y(if)g(this)g(command)f(is)h(immediately)h(follo)m(w)m(ed)h(b)m(y)
+d(a)h(c)m(haracter)i(that)e(is)g(neither)g(a)g(digit)630
+2228 y(or)28 b(min)m(us)f(sign,)i(the)f(argumen)m(t)g(coun)m(t)h(for)e
+(the)i(next)f(command)f(is)h(m)m(ultiplied)h(b)m(y)e(four.)630
+2337 y(The)37 b(argumen)m(t)h(coun)m(t)f(is)h(initially)h(one,)g(so)f
+(executing)g(this)f(function)g(the)h(\014rst)e(time)630
+2447 y(mak)m(es)d(the)e(argumen)m(t)i(coun)m(t)f(four,)f(a)i(second)e
+(time)i(mak)m(es)f(the)g(argumen)m(t)g(coun)m(t)h(six-)630
+2556 y(teen,)e(and)f(so)h(on.)40 b(By)31 b(default,)g(this)f(is)g(not)h
+(b)s(ound)d(to)j(a)g(k)m(ey)-8 b(.)150 2757 y Fc(1.4.6)63
+b(Letting)40 b(Readline)h(T)m(yp)s(e)g(F)-10 b(or)42
+b(Y)-10 b(ou)150 2993 y Fn(complete)28 b(\()610 2990
+y Ff(h)p 634 2937 148 4 v 634 2993 a Fe(T)-6 b(AB)p 634
+3008 V 778 2990 a Ff(i)808 2993 y Fn(\))630 3102 y Fo(A)m(ttempt)24
+b(to)f(p)s(erform)e(completion)j(on)f(the)g(text)g(b)s(efore)f(p)s(oin)
+m(t.)39 b(The)22 b(actual)i(completion)630 3212 y(p)s(erformed)29
+b(is)h(application-sp)s(eci\014c.)42 b(The)30 b(default)h(is)f
+(\014lename)h(completion.)150 3355 y Fn(possible-completions)25
+b(\(M-?\))630 3465 y Fo(List)31 b(the)f(p)s(ossible)g(completions)i(of)
+e(the)h(text)g(b)s(efore)f(p)s(oin)m(t.)150 3608 y Fn
+(insert-completions)25 b(\(M-*\))630 3718 y Fo(Insert)30
+b(all)h(completions)h(of)f(the)g(text)g(b)s(efore)f(p)s(oin)m(t)h(that)
+g(w)m(ould)f(ha)m(v)m(e)i(b)s(een)e(generated)630 3827
+y(b)m(y)g Fn(possible-completions)p Fo(.)150 3971 y Fn(menu-complete)d
+(\(\))630 4080 y Fo(Similar)d(to)g Fn(complete)p Fo(,)f(but)h(replaces)
+g(the)g(w)m(ord)g(to)g(b)s(e)f(completed)i(with)e(a)i(single)f(matc)m
+(h)630 4190 y(from)37 b(the)h(list)h(of)f(p)s(ossible)f(completions.)64
+b(Rep)s(eated)39 b(execution)g(of)f Fn(menu-complete)630
+4300 y Fo(steps)i(through)g(the)g(list)h(of)f(p)s(ossible)g
+(completions,)k(inserting)c(eac)m(h)i(matc)m(h)f(in)f(turn.)630
+4409 y(A)m(t)e(the)f(end)f(of)h(the)g(list)g(of)g(completions,)i(the)e
+(b)s(ell)g(is)g(rung)f(\(sub)5 b(ject)36 b(to)i(the)f(setting)630
+4519 y(of)f Fn(bell-style)p Fo(\))e(and)h(the)h(original)i(text)f(is)f
+(restored.)57 b(An)36 b(argumen)m(t)h(of)f Fd(n)f Fo(mo)m(v)m(es)i
+Fd(n)630 4628 y Fo(p)s(ositions)e(forw)m(ard)f(in)g(the)h(list)h(of)e
+(matc)m(hes;)39 b(a)c(negativ)m(e)i(argumen)m(t)e(ma)m(y)g(b)s(e)f
+(used)g(to)630 4738 y(mo)m(v)m(e)40 b(bac)m(kw)m(ard)e(through)g(the)g
+(list.)65 b(This)38 b(command)g(is)g(in)m(tended)g(to)h(b)s(e)f(b)s
+(ound)e(to)630 4845 y Ff(h)p 654 4792 V 654 4848 a Fe(T)-6
+b(AB)p 654 4863 V 798 4845 a Ff(i)828 4848 y Fo(,)30
+b(but)g(is)g(un)m(b)s(ound)e(b)m(y)i(default.)150 4991
+y Fn(delete-char-or-list)25 b(\(\))630 5101 y Fo(Deletes)k(the)e(c)m
+(haracter)h(under)e(the)h(cursor)f(if)h(not)g(at)g(the)g(b)s(eginning)g
+(or)f(end)h(of)g(the)g(line)630 5210 y(\(lik)m(e)k Fn(delete-char)p
+Fo(\).)37 b(If)29 b(at)h(the)f(end)f(of)i(the)f(line,)h(b)s(eha)m(v)m
+(es)g(iden)m(tically)h(to)e Fn(possible-)630 5320 y(completions)p
+Fo(.)38 b(This)29 b(command)h(is)h(un)m(b)s(ound)d(b)m(y)i(default.)p
+eop end
+%%Page: 18 22
+TeXDict begin 18 21 bop 150 -116 a Fo(18)2600 b(GNU)31
+b(Readline)g(Library)150 299 y Fc(1.4.7)63 b(Keyb)s(oard)41
+b(Macros)150 545 y Fn(start-kbd-macro)26 b(\(C-x)j(\(\))630
+655 y Fo(Begin)i(sa)m(ving)h(the)e(c)m(haracters)i(t)m(yp)s(ed)e(in)m
+(to)h(the)g(curren)m(t)f(k)m(eyb)s(oard)g(macro.)150
+818 y Fn(end-kbd-macro)d(\(C-x)i(\)\))630 927 y Fo(Stop)e(sa)m(ving)h
+(the)g(c)m(haracters)g(t)m(yp)s(ed)f(in)m(to)i(the)e(curren)m(t)g(k)m
+(eyb)s(oard)g(macro)h(and)f(sa)m(v)m(e)i(the)630 1037
+y(de\014nition.)150 1200 y Fn(call-last-kbd-macro)c(\(C-x)k(e\))630
+1310 y Fo(Re-execute)37 b(the)e(last)h(k)m(eyb)s(oard)f(macro)h
+(de\014ned,)f(b)m(y)h(making)f(the)g(c)m(haracters)i(in)e(the)630
+1419 y(macro)c(app)s(ear)f(as)g(if)h(t)m(yp)s(ed)f(at)h(the)f(k)m(eyb)s
+(oard.)150 1651 y Fc(1.4.8)63 b(Some)41 b(Miscellaneous)i(Commands)150
+1898 y Fn(re-read-init-file)26 b(\(C-x)j(C-r\))630 2007
+y Fo(Read)22 b(in)g(the)g(con)m(ten)m(ts)h(of)f(the)g
+Fd(inputrc)27 b Fo(\014le,)d(and)d(incorp)s(orate)h(an)m(y)h(bindings)d
+(or)i(v)-5 b(ariable)630 2117 y(assignmen)m(ts)31 b(found)e(there.)150
+2280 y Fn(abort)g(\(C-g\))630 2390 y Fo(Ab)s(ort)d(the)h(curren)m(t)f
+(editing)h(command)f(and)g(ring)h(the)f(terminal's)h(b)s(ell)g(\(sub)5
+b(ject)26 b(to)i(the)630 2499 y(setting)j(of)g Fn(bell-style)p
+Fo(\).)150 2663 y Fn(do-uppercase-version)25 b(\(M-a,)k(M-b,)g(M-)p
+Fg(x)p Fn(,)g(...)o(\))630 2772 y Fo(If)e(the)h(meta\014ed)g(c)m
+(haracter)h Fd(x)34 b Fo(is)28 b(lo)m(w)m(ercase,)i(run)d(the)g
+(command)h(that)g(is)g(b)s(ound)d(to)k(the)630 2882 y(corresp)s(onding)
+g(upp)s(ercase)h(c)m(haracter.)150 3045 y Fn(prefix-meta)d(\()753
+3042 y Ff(h)p 777 2989 139 4 v 777 3045 a Fe(ESC)p 777
+3060 V 911 3042 a Ff(i)941 3045 y Fn(\))630 3155 y Fo(Metafy)39
+b(the)e(next)h(c)m(haracter)h(t)m(yp)s(ed.)62 b(This)37
+b(is)g(for)h(k)m(eyb)s(oards)f(without)g(a)h(meta)g(k)m(ey)-8
+b(.)630 3264 y(T)m(yping)30 b(`)968 3261 y Ff(h)p 993
+3208 V 993 3264 a Fe(ESC)p 993 3280 V 1127 3261 a Ff(i)1187
+3264 y Fn(f)p Fo(')g(is)g(equiv)-5 b(alen)m(t)32 b(to)f(t)m(yping)g
+Fg(M-f)p Fo(.)150 3428 y Fn(undo)e(\(C-_)g(or)h(C-x)g(C-u\))630
+3537 y Fo(Incremen)m(tal)h(undo,)f(separately)h(remem)m(b)s(ered)f(for)
+g(eac)m(h)i(line.)150 3700 y Fn(revert-line)27 b(\(M-r\))630
+3810 y Fo(Undo)33 b(all)h(c)m(hanges)g(made)f(to)h(this)f(line.)49
+b(This)32 b(is)h(lik)m(e)i(executing)f(the)f Fn(undo)f
+Fo(command)630 3920 y(enough)e(times)h(to)g(get)h(bac)m(k)f(to)g(the)f
+(b)s(eginning.)150 4083 y Fn(tilde-expand)d(\(M-~\))630
+4192 y Fo(P)m(erform)j(tilde)h(expansion)g(on)f(the)g(curren)m(t)h(w)m
+(ord.)150 4356 y Fn(set-mark)d(\(C-@\))630 4465 y Fo(Set)33
+b(the)g(mark)f(to)i(the)f(p)s(oin)m(t.)48 b(If)32 b(a)h(n)m(umeric)g
+(argumen)m(t)g(is)g(supplied,)f(the)h(mark)g(is)f(set)630
+4575 y(to)f(that)g(p)s(osition.)150 4738 y Fn(exchange-point-and-mark)
+24 b(\(C-x)29 b(C-x\))630 4848 y Fo(Sw)m(ap)i(the)g(p)s(oin)m(t)g(with)
+g(the)g(mark.)43 b(The)31 b(curren)m(t)g(cursor)f(p)s(osition)i(is)f
+(set)h(to)f(the)h(sa)m(v)m(ed)630 4957 y(p)s(osition,)f(and)e(the)i
+(old)g(cursor)e(p)s(osition)i(is)f(sa)m(v)m(ed)i(as)e(the)h(mark.)150
+5121 y Fn(character-search)26 b(\(C-]\))630 5230 y Fo(A)f(c)m(haracter)
+h(is)f(read)g(and)f(p)s(oin)m(t)h(is)g(mo)m(v)m(ed)h(to)g(the)f(next)g
+(o)s(ccurrence)g(of)g(that)g(c)m(haracter.)630 5340 y(A)30
+b(negativ)m(e)j(coun)m(t)e(searc)m(hes)g(for)f(previous)g(o)s
+(ccurrences.)p eop end
+%%Page: 19 23
+TeXDict begin 19 22 bop 150 -116 a Fo(Chapter)30 b(1:)41
+b(Command)29 b(Line)i(Editing)2107 b(19)150 299 y Fn
+(character-search-backwar)o(d)24 b(\(M-C-]\))630 408
+y Fo(A)45 b(c)m(haracter)h(is)f(read)g(and)f(p)s(oin)m(t)h(is)g(mo)m(v)
+m(ed)h(to)f(the)g(previous)f(o)s(ccurrence)h(of)g(that)630
+518 y(c)m(haracter.)d(A)31 b(negativ)m(e)h(coun)m(t)f(searc)m(hes)h
+(for)e(subsequen)m(t)f(o)s(ccurrences.)150 677 y Fn(insert-comment)d
+(\(M-#\))630 787 y Fo(Without)36 b(a)g(n)m(umeric)g(argumen)m(t,)h(the)
+f(v)-5 b(alue)36 b(of)g(the)g Fn(comment-begin)c Fo(v)-5
+b(ariable)36 b(is)g(in-)630 897 y(serted)c(at)g(the)g(b)s(eginning)f
+(of)h(the)f(curren)m(t)h(line.)45 b(If)31 b(a)h(n)m(umeric)f(argumen)m
+(t)h(is)g(supplied,)630 1006 y(this)k(command)h(acts)g(as)g(a)g
+(toggle:)55 b(if)37 b(the)f(c)m(haracters)i(at)g(the)e(b)s(eginning)g
+(of)h(the)g(line)630 1116 y(do)30 b(not)h(matc)m(h)h(the)f(v)-5
+b(alue)31 b(of)f Fn(comment-begin)p Fo(,)e(the)i(v)-5
+b(alue)31 b(is)g(inserted,)g(otherwise)g(the)630 1225
+y(c)m(haracters)42 b(in)d Fn(comment-begin)e Fo(are)j(deleted)h(from)f
+(the)g(b)s(eginning)g(of)g(the)g(line.)71 b(In)630 1335
+y(either)31 b(case,)h(the)e(line)h(is)f(accepted)i(as)f(if)f(a)h
+(newline)f(had)g(b)s(een)f(t)m(yp)s(ed.)150 1494 y Fn(dump-functions)d
+(\(\))630 1604 y Fo(Prin)m(t)g(all)i(of)e(the)h(functions)f(and)g
+(their)g(k)m(ey)h(bindings)e(to)j(the)e(Readline)h(output)f(stream.)630
+1714 y(If)31 b(a)h(n)m(umeric)g(argumen)m(t)g(is)g(supplied,)f(the)h
+(output)f(is)h(formatted)g(in)f(suc)m(h)h(a)g(w)m(a)m(y)g(that)630
+1823 y(it)f(can)g(b)s(e)e(made)i(part)f(of)g(an)h Fd(inputrc)k
+Fo(\014le.)41 b(This)29 b(command)h(is)h(un)m(b)s(ound)c(b)m(y)k
+(default.)150 1983 y Fn(dump-variables)26 b(\(\))630
+2092 y Fo(Prin)m(t)21 b(all)h(of)g(the)f(settable)i(v)-5
+b(ariables)22 b(and)f(their)g(v)-5 b(alues)22 b(to)g(the)f(Readline)h
+(output)f(stream.)630 2202 y(If)31 b(a)h(n)m(umeric)g(argumen)m(t)g(is)
+g(supplied,)f(the)h(output)f(is)h(formatted)g(in)f(suc)m(h)h(a)g(w)m(a)
+m(y)g(that)630 2311 y(it)f(can)g(b)s(e)e(made)i(part)f(of)g(an)h
+Fd(inputrc)k Fo(\014le.)41 b(This)29 b(command)h(is)h(un)m(b)s(ound)c
+(b)m(y)k(default.)150 2471 y Fn(dump-macros)c(\(\))630
+2580 y Fo(Prin)m(t)34 b(all)g(of)g(the)g(Readline)g(k)m(ey)h(sequences)
+f(b)s(ound)e(to)i(macros)g(and)f(the)h(strings)g(they)630
+2690 y(output.)53 b(If)35 b(a)g(n)m(umeric)f(argumen)m(t)i(is)e
+(supplied,)h(the)g(output)g(is)f(formatted)i(in)e(suc)m(h)h(a)630
+2800 y(w)m(a)m(y)c(that)g(it)f(can)g(b)s(e)g(made)g(part)f(of)i(an)e
+Fd(inputrc)35 b Fo(\014le.)41 b(This)29 b(command)h(is)g(un)m(b)s(ound)
+d(b)m(y)630 2909 y(default.)150 3068 y Fn(emacs-editing-mode)e(\(C-e\))
+630 3178 y Fo(When)30 b(in)g Fn(vi)g Fo(command)g(mo)s(de,)g(this)h
+(causes)f(a)h(switc)m(h)g(to)g Fn(emacs)e Fo(editing)i(mo)s(de.)150
+3337 y Fn(vi-editing-mode)26 b(\(M-C-j\))630 3447 y Fo(When)k(in)g
+Fn(emacs)f Fo(editing)i(mo)s(de,)f(this)h(causes)f(a)h(switc)m(h)g(to)g
+Fn(vi)f Fo(editing)h(mo)s(de.)150 3704 y Fm(1.5)68 b(Readline)47
+b(vi)e(Mo)t(de)275 3949 y Fo(While)24 b(the)g(Readline)g(library)f(do)s
+(es)h(not)g(ha)m(v)m(e)g(a)h(full)e(set)h(of)g Fn(vi)f
+Fo(editing)h(functions,)h(it)f(do)s(es)g(con)m(tain)150
+4058 y(enough)34 b(to)h(allo)m(w)g(simple)f(editing)h(of)f(the)g(line.)
+52 b(The)34 b(Readline)g Fn(vi)g Fo(mo)s(de)f(b)s(eha)m(v)m(es)i(as)f
+(sp)s(eci\014ed)f(in)150 4168 y(the)e Fh(posix)e Fo(1003.2)k(standard.)
+275 4302 y(In)28 b(order)g(to)i(switc)m(h)g(in)m(teractiv)m(ely)i(b)s
+(et)m(w)m(een)d Fn(emacs)f Fo(and)g Fn(vi)h Fo(editing)g(mo)s(des,)g
+(use)g(the)g(command)150 4412 y Fg(M-C-j)36 b Fo(\(b)s(ound)h(to)h
+(emacs-editing-mo)s(de)i(when)d(in)g Fn(vi)h Fo(mo)s(de)f(and)g(to)i
+(vi-editing-mo)s(de)g(in)e Fn(emacs)150 4521 y Fo(mo)s(de\).)k(The)30
+b(Readline)h(default)f(is)g Fn(emacs)f Fo(mo)s(de.)275
+4656 y(When)g(y)m(ou)i(en)m(ter)f(a)h(line)f(in)g Fn(vi)f
+Fo(mo)s(de,)h(y)m(ou)h(are)f(already)h(placed)f(in)g(`insertion')g(mo)s
+(de,)g(as)h(if)f(y)m(ou)150 4765 y(had)c(t)m(yp)s(ed)g(an)g(`)p
+Fn(i)p Fo('.)39 b(Pressing)1215 4762 y Ff(h)p 1239 4709
+139 4 v 1239 4765 a Fe(ESC)p 1239 4781 V 1373 4762 a
+Ff(i)1429 4765 y Fo(switc)m(hes)27 b(y)m(ou)g(in)m(to)g(`command')f(mo)
+s(de,)h(where)f(y)m(ou)h(can)f(edit)h(the)150 4875 y(text)35
+b(of)f(the)g(line)g(with)f(the)h(standard)f Fn(vi)g Fo(mo)m(v)m(emen)m
+(t)j(k)m(eys,)g(mo)m(v)m(e)f(to)f(previous)g(history)f(lines)h(with)150
+4985 y(`)p Fn(k)p Fo(')d(and)e(subsequen)m(t)h(lines)h(with)f(`)p
+Fn(j)p Fo(',)g(and)g(so)h(forth.)p eop end
+%%Page: 20 24
+TeXDict begin 20 23 bop 150 -116 a Fo(20)2600 b(GNU)31
+b(Readline)g(Library)p eop end
+%%Page: 21 25
+TeXDict begin 21 24 bop 150 -116 a Fo(App)s(endix)29
+b(A:)h(Cop)m(ying)h(This)f(Man)m(ual)2105 b(21)150 299
+y Fk(App)t(endix)52 b(A)40 b(Cop)l(ying)51 b(This)j(Man)l(ual)150
+690 y Fm(A.1)67 b(GNU)45 b(F)-11 b(ree)45 b(Do)t(cumen)l(tation)h
+(License)1396 909 y Fo(V)-8 b(ersion)31 b(1.2,)h(No)m(v)m(em)m(b)s(er)g
+(2002)390 1052 y(Cop)m(yrigh)m(t)842 1049 y(c)817 1052
+y Fl(\015)e Fo(2000,2001,2002)36 b(F)-8 b(ree)32 b(Soft)m(w)m(are)f(F)
+-8 b(oundation,)32 b(Inc.)390 1161 y(59)f(T)-8 b(emple)31
+b(Place,)h(Suite)e(330,)i(Boston,)g(MA)61 b(02111-1307,)35
+b(USA)390 1380 y(Ev)m(ery)m(one)c(is)g(p)s(ermitted)f(to)h(cop)m(y)g
+(and)f(distribute)g(v)m(erbatim)h(copies)390 1490 y(of)g(this)f
+(license)h(do)s(cumen)m(t,)g(but)e(c)m(hanging)j(it)f(is)f(not)h(allo)m
+(w)m(ed.)199 1632 y(0.)61 b(PREAMBLE)330 1770 y(The)37
+b(purp)s(ose)e(of)i(this)g(License)h(is)f(to)h(mak)m(e)g(a)g(man)m
+(ual,)h(textb)s(o)s(ok,)h(or)d(other)g(functional)h(and)330
+1880 y(useful)29 b(do)s(cumen)m(t)h Fd(free)36 b Fo(in)29
+b(the)i(sense)f(of)g(freedom:)41 b(to)31 b(assure)e(ev)m(ery)m(one)j
+(the)e(e\013ectiv)m(e)j(freedom)330 1990 y(to)f(cop)m(y)g(and)f
+(redistribute)g(it,)h(with)g(or)f(without)g(mo)s(difying)g(it,)i
+(either)f(commercially)h(or)e(non-)330 2099 y(commercially)-8
+b(.)56 b(Secondarily)-8 b(,)36 b(this)f(License)g(preserv)m(es)g(for)f
+(the)h(author)f(and)g(publisher)f(a)i(w)m(a)m(y)330 2209
+y(to)i(get)g(credit)g(for)f(their)g(w)m(ork,)i(while)e(not)g(b)s(eing)g
+(considered)g(resp)s(onsible)f(for)h(mo)s(di\014cations)330
+2318 y(made)30 b(b)m(y)h(others.)330 2457 y(This)22 b(License)i(is)f(a)
+h(kind)e(of)i(\\cop)m(yleft",)j(whic)m(h)c(means)g(that)h(deriv)-5
+b(ativ)m(e)24 b(w)m(orks)f(of)h(the)f(do)s(cumen)m(t)330
+2566 y(m)m(ust)34 b(themselv)m(es)h(b)s(e)e(free)h(in)g(the)g(same)g
+(sense.)51 b(It)34 b(complemen)m(ts)h(the)f(GNU)g(General)h(Public)330
+2676 y(License,)c(whic)m(h)f(is)h(a)f(cop)m(yleft)i(license)g(designed)
+e(for)g(free)h(soft)m(w)m(are.)330 2814 y(W)-8 b(e)31
+b(ha)m(v)m(e)f(designed)g(this)f(License)h(in)f(order)g(to)i(use)e(it)h
+(for)f(man)m(uals)h(for)f(free)h(soft)m(w)m(are,)h(b)s(ecause)330
+2924 y(free)42 b(soft)m(w)m(are)i(needs)e(free)g(do)s(cumen)m(tation:)
+65 b(a)42 b(free)h(program)f(should)f(come)i(with)f(man)m(uals)330
+3033 y(pro)m(viding)29 b(the)g(same)g(freedoms)f(that)i(the)f(soft)m(w)
+m(are)h(do)s(es.)40 b(But)29 b(this)f(License)i(is)f(not)g(limited)g
+(to)330 3143 y(soft)m(w)m(are)j(man)m(uals;)f(it)g(can)g(b)s(e)f(used)g
+(for)g(an)m(y)h(textual)h(w)m(ork,)f(regardless)g(of)g(sub)5
+b(ject)30 b(matter)i(or)330 3252 y(whether)f(it)h(is)f(published)f(as)i
+(a)f(prin)m(ted)g(b)s(o)s(ok.)44 b(W)-8 b(e)32 b(recommend)f(this)h
+(License)g(principally)f(for)330 3362 y(w)m(orks)f(whose)h(purp)s(ose)d
+(is)j(instruction)f(or)g(reference.)199 3500 y(1.)61
+b(APPLICABILITY)29 b(AND)j(DEFINITIONS)330 3639 y(This)39
+b(License)i(applies)f(to)g(an)m(y)h(man)m(ual)f(or)g(other)g(w)m(ork,)i
+(in)e(an)m(y)g(medium,)i(that)e(con)m(tains)i(a)330 3748
+y(notice)h(placed)f(b)m(y)f(the)h(cop)m(yrigh)m(t)h(holder)e(sa)m(ying)
+h(it)g(can)g(b)s(e)f(distributed)f(under)g(the)i(terms)330
+3858 y(of)c(this)f(License.)62 b(Suc)m(h)37 b(a)h(notice)h(gran)m(ts)f
+(a)g(w)m(orld-wide,)h(ro)m(y)m(alt)m(y-free)i(license,)f(unlimited)d
+(in)330 3967 y(duration,)49 b(to)d(use)f(that)g(w)m(ork)h(under)d(the)j
+(conditions)f(stated)h(herein.)85 b(The)45 b(\\Do)s(cumen)m(t",)330
+4077 y(b)s(elo)m(w,)29 b(refers)f(to)h(an)m(y)g(suc)m(h)f(man)m(ual)h
+(or)f(w)m(ork.)40 b(An)m(y)29 b(mem)m(b)s(er)e(of)i(the)f(public)g(is)g
+(a)h(licensee,)i(and)330 4187 y(is)25 b(addressed)f(as)h(\\y)m(ou".)40
+b(Y)-8 b(ou)26 b(accept)g(the)f(license)h(if)f(y)m(ou)h(cop)m(y)-8
+b(,)27 b(mo)s(dify)d(or)h(distribute)g(the)g(w)m(ork)330
+4296 y(in)30 b(a)h(w)m(a)m(y)g(requiring)f(p)s(ermission)f(under)g(cop)
+m(yrigh)m(t)j(la)m(w.)330 4435 y(A)i(\\Mo)s(di\014ed)f(V)-8
+b(ersion")35 b(of)f(the)g(Do)s(cumen)m(t)g(means)g(an)m(y)g(w)m(ork)f
+(con)m(taining)j(the)e(Do)s(cumen)m(t)g(or)330 4544 y(a)k(p)s(ortion)f
+(of)h(it,)i(either)e(copied)g(v)m(erbatim,)i(or)d(with)h(mo)s
+(di\014cations)f(and/or)h(translated)g(in)m(to)330 4654
+y(another)31 b(language.)330 4792 y(A)26 b(\\Secondary)g(Section")h(is)
+f(a)h(named)e(app)s(endix)f(or)i(a)h(fron)m(t-matter)g(section)g(of)f
+(the)g(Do)s(cumen)m(t)330 4902 y(that)c(deals)g(exclusiv)m(ely)h(with)e
+(the)g(relationship)h(of)f(the)h(publishers)d(or)i(authors)g(of)h(the)f
+(Do)s(cumen)m(t)330 5011 y(to)38 b(the)f(Do)s(cumen)m(t's)i(o)m(v)m
+(erall)g(sub)5 b(ject)37 b(\(or)h(to)g(related)g(matters\))g(and)f(con)
+m(tains)h(nothing)f(that)330 5121 y(could)j(fall)h(directly)g(within)f
+(that)h(o)m(v)m(erall)i(sub)5 b(ject.)70 b(\(Th)m(us,)42
+b(if)e(the)h(Do)s(cumen)m(t)g(is)f(in)g(part)h(a)330
+5230 y(textb)s(o)s(ok)24 b(of)g(mathematics,)j(a)d(Secondary)f(Section)
+h(ma)m(y)g(not)g(explain)g(an)m(y)g(mathematics.\))40
+b(The)330 5340 y(relationship)28 b(could)f(b)s(e)g(a)g(matter)i(of)e
+(historical)i(connection)f(with)f(the)h(sub)5 b(ject)27
+b(or)g(with)g(related)p eop end
+%%Page: 22 26
+TeXDict begin 22 25 bop 150 -116 a Fo(22)2600 b(GNU)31
+b(Readline)g(Library)330 299 y(matters,)38 b(or)d(of)h(legal,)i
+(commercial,)h(philosophical,)f(ethical)f(or)e(p)s(olitical)i(p)s
+(osition)f(regarding)330 408 y(them.)330 549 y(The)25
+b(\\In)m(v)-5 b(arian)m(t)27 b(Sections")g(are)f(certain)g(Secondary)g
+(Sections)g(whose)f(titles)i(are)f(designated,)i(as)330
+659 y(b)s(eing)e(those)h(of)g(In)m(v)-5 b(arian)m(t)27
+b(Sections,)i(in)d(the)h(notice)h(that)f(sa)m(ys)g(that)g(the)g(Do)s
+(cumen)m(t)g(is)g(released)330 769 y(under)f(this)i(License.)40
+b(If)27 b(a)h(section)h(do)s(es)f(not)f(\014t)h(the)g(ab)s(o)m(v)m(e)h
+(de\014nition)e(of)h(Secondary)f(then)h(it)g(is)330 878
+y(not)k(allo)m(w)m(ed)i(to)e(b)s(e)g(designated)g(as)g(In)m(v)-5
+b(arian)m(t.)46 b(The)31 b(Do)s(cumen)m(t)i(ma)m(y)f(con)m(tain)i(zero)
+e(In)m(v)-5 b(arian)m(t)330 988 y(Sections.)39 b(If)25
+b(the)f(Do)s(cumen)m(t)i(do)s(es)e(not)h(iden)m(tify)g(an)m(y)g(In)m(v)
+-5 b(arian)m(t)25 b(Sections)h(then)e(there)h(are)g(none.)330
+1129 y(The)36 b(\\Co)m(v)m(er)i(T)-8 b(exts")38 b(are)f(certain)g
+(short)g(passages)g(of)g(text)g(that)h(are)f(listed,)i(as)d(F)-8
+b(ron)m(t-Co)m(v)m(er)330 1238 y(T)g(exts)26 b(or)f(Bac)m(k-Co)m(v)m
+(er)j(T)-8 b(exts,)27 b(in)d(the)h(notice)i(that)e(sa)m(ys)h(that)g
+(the)f(Do)s(cumen)m(t)h(is)f(released)g(under)330 1348
+y(this)h(License.)40 b(A)25 b(F)-8 b(ron)m(t-Co)m(v)m(er)29
+b(T)-8 b(ext)26 b(ma)m(y)h(b)s(e)e(at)i(most)f(5)g(w)m(ords,)g(and)g(a)
+g(Bac)m(k-Co)m(v)m(er)j(T)-8 b(ext)26 b(ma)m(y)330 1457
+y(b)s(e)k(at)h(most)g(25)g(w)m(ords.)330 1598 y(A)36
+b(\\T)-8 b(ransparen)m(t")36 b(cop)m(y)g(of)g(the)f(Do)s(cumen)m(t)h
+(means)g(a)g(mac)m(hine-readable)h(cop)m(y)-8 b(,)38
+b(represen)m(ted)330 1708 y(in)d(a)h(format)g(whose)g(sp)s
+(eci\014cation)g(is)g(a)m(v)-5 b(ailable)38 b(to)f(the)f(general)g
+(public,)h(that)f(is)g(suitable)g(for)330 1817 y(revising)c(the)g(do)s
+(cumen)m(t)f(straigh)m(tforw)m(ardly)i(with)e(generic)i(text)g(editors)
+f(or)f(\(for)h(images)h(com-)330 1927 y(p)s(osed)23 b(of)h(pixels\))g
+(generic)h(pain)m(t)f(programs)g(or)f(\(for)h(dra)m(wings\))g(some)g
+(widely)g(a)m(v)-5 b(ailable)26 b(dra)m(wing)330 2037
+y(editor,)k(and)f(that)g(is)g(suitable)h(for)f(input)f(to)i(text)g
+(formatters)f(or)g(for)g(automatic)i(translation)f(to)330
+2146 y(a)d(v)-5 b(ariet)m(y)28 b(of)f(formats)g(suitable)h(for)e(input)
+g(to)i(text)g(formatters.)40 b(A)27 b(cop)m(y)g(made)g(in)g(an)g
+(otherwise)330 2256 y(T)-8 b(ransparen)m(t)37 b(\014le)h(format)g
+(whose)f(markup,)i(or)e(absence)h(of)g(markup,)g(has)g(b)s(een)f
+(arranged)g(to)330 2365 y(th)m(w)m(art)27 b(or)g(discourage)g
+(subsequen)m(t)f(mo)s(di\014cation)h(b)m(y)g(readers)f(is)g(not)h(T)-8
+b(ransparen)m(t.)39 b(An)27 b(image)330 2475 y(format)35
+b(is)f(not)h(T)-8 b(ransparen)m(t)34 b(if)g(used)g(for)g(an)m(y)g
+(substan)m(tial)h(amoun)m(t)g(of)g(text.)53 b(A)35 b(cop)m(y)g(that)g
+(is)330 2585 y(not)c(\\T)-8 b(ransparen)m(t")31 b(is)f(called)i
+(\\Opaque".)330 2725 y(Examples)53 b(of)g(suitable)h(formats)f(for)g(T)
+-8 b(ransparen)m(t)53 b(copies)h(include)f(plain)g Fh(asci)r(i)g
+Fo(without)330 2835 y(markup,)41 b(T)-8 b(exinfo)40 b(input)f(format,)j
+(LaT)1775 2855 y(E)1826 2835 y(X)d(input)g(format,)k
+Fh(sgml)c Fo(or)g Fh(xml)g Fo(using)g(a)h(publicly)330
+2945 y(a)m(v)-5 b(ailable)34 b Fh(dtd)p Fo(,)d(and)g
+(standard-conforming)g(simple)h Fh(html)p Fo(,)f(P)m(ostScript)h(or)f
+Fh(pdf)g Fo(designed)g(for)330 3054 y(h)m(uman)37 b(mo)s(di\014cation.)
+65 b(Examples)38 b(of)g(transparen)m(t)g(image)i(formats)e(include)g
+Fh(png)p Fo(,)i Fh(x)n(cf)e Fo(and)330 3164 y Fh(jpg)p
+Fo(.)63 b(Opaque)38 b(formats)g(include)g(proprietary)g(formats)g(that)
+h(can)f(b)s(e)g(read)g(and)f(edited)i(only)330 3273 y(b)m(y)g
+(proprietary)g(w)m(ord)g(pro)s(cessors,)j Fh(sgml)c Fo(or)i
+Fh(xml)e Fo(for)i(whic)m(h)f(the)g Fh(dtd)g Fo(and/or)g(pro)s(cessing)
+330 3383 y(to)s(ols)32 b(are)f(not)g(generally)h(a)m(v)-5
+b(ailable,)34 b(and)c(the)h(mac)m(hine-generated)i Fh(html)p
+Fo(,)d(P)m(ostScript)i(or)f Fh(pdf)330 3493 y Fo(pro)s(duced)e(b)m(y)h
+(some)h(w)m(ord)f(pro)s(cessors)g(for)g(output)g(purp)s(oses)e(only)-8
+b(.)330 3634 y(The)34 b(\\Title)h(P)m(age")i(means,)e(for)f(a)h(prin)m
+(ted)f(b)s(o)s(ok,)h(the)f(title)i(page)f(itself,)h(plus)e(suc)m(h)f
+(follo)m(wing)330 3743 y(pages)28 b(as)g(are)g(needed)g(to)g(hold,)g
+(legibly)-8 b(,)30 b(the)e(material)h(this)f(License)g(requires)f(to)h
+(app)s(ear)f(in)h(the)330 3853 y(title)g(page.)40 b(F)-8
+b(or)28 b(w)m(orks)e(in)g(formats)h(whic)m(h)g(do)f(not)h(ha)m(v)m(e)h
+(an)m(y)e(title)j(page)e(as)g(suc)m(h,)g(\\Title)h(P)m(age")330
+3962 y(means)j(the)f(text)i(near)e(the)h(most)g(prominen)m(t)g(app)s
+(earance)f(of)h(the)g(w)m(ork's)g(title,)h(preceding)f(the)330
+4072 y(b)s(eginning)f(of)g(the)h(b)s(o)s(dy)e(of)h(the)h(text.)330
+4213 y(A)f(section)h(\\En)m(titled)g(XYZ")f(means)f(a)h(named)g
+(subunit)e(of)h(the)h(Do)s(cumen)m(t)h(whose)e(title)i(either)330
+4322 y(is)d(precisely)g(XYZ)g(or)f(con)m(tains)i(XYZ)f(in)f(paren)m
+(theses)i(follo)m(wing)g(text)g(that)f(translates)h(XYZ)e(in)330
+4432 y(another)e(language.)40 b(\(Here)26 b(XYZ)f(stands)f(for)h(a)g
+(sp)s(eci\014c)g(section)h(name)f(men)m(tioned)h(b)s(elo)m(w,)g(suc)m
+(h)330 4542 y(as)i(\\Ac)m(kno)m(wledgemen)m(ts",)33 b(\\Dedications",)e
+(\\Endorsemen)m(ts",)e(or)f(\\History".\))42 b(T)-8 b(o)29
+b(\\Preserv)m(e)330 4651 y(the)34 b(Title")h(of)e(suc)m(h)h(a)g
+(section)g(when)f(y)m(ou)h(mo)s(dify)e(the)i(Do)s(cumen)m(t)h(means)e
+(that)h(it)g(remains)g(a)330 4761 y(section)e(\\En)m(titled)f(XYZ")g
+(according)g(to)g(this)g(de\014nition.)330 4902 y(The)c(Do)s(cumen)m(t)
+i(ma)m(y)f(include)f(W)-8 b(arran)m(t)m(y)30 b(Disclaimers)f(next)f(to)
+g(the)g(notice)h(whic)m(h)e(states)i(that)330 5011 y(this)34
+b(License)g(applies)g(to)h(the)f(Do)s(cumen)m(t.)52 b(These)33
+b(W)-8 b(arran)m(t)m(y)36 b(Disclaimers)f(are)g(considered)e(to)330
+5121 y(b)s(e)k(included)g(b)m(y)g(reference)h(in)g(this)f(License,)j
+(but)d(only)h(as)g(regards)f(disclaiming)i(w)m(arran)m(ties:)330
+5230 y(an)m(y)e(other)g(implication)i(that)e(these)g(W)-8
+b(arran)m(t)m(y)39 b(Disclaimers)f(ma)m(y)g(ha)m(v)m(e)g(is)f(v)m(oid)g
+(and)f(has)h(no)330 5340 y(e\013ect)32 b(on)e(the)h(meaning)f(of)h
+(this)f(License.)p eop end
+%%Page: 23 27
+TeXDict begin 23 26 bop 150 -116 a Fo(App)s(endix)29
+b(A:)h(Cop)m(ying)h(This)f(Man)m(ual)2105 b(23)199 299
+y(2.)61 b(VERBA)-8 b(TIM)31 b(COPYING)330 445 y(Y)-8
+b(ou)39 b(ma)m(y)f(cop)m(y)h(and)e(distribute)h(the)g(Do)s(cumen)m(t)h
+(in)f(an)m(y)g(medium,)h(either)g(commercially)h(or)330
+555 y(noncommercially)-8 b(,)48 b(pro)m(vided)42 b(that)h(this)f
+(License,)47 b(the)42 b(cop)m(yrigh)m(t)i(notices,)j(and)42
+b(the)h(license)330 664 y(notice)37 b(sa)m(ying)g(this)e(License)i
+(applies)e(to)i(the)f(Do)s(cumen)m(t)g(are)g(repro)s(duced)e(in)i(all)g
+(copies,)j(and)330 774 y(that)27 b(y)m(ou)g(add)f(no)h(other)f
+(conditions)h(whatso)s(ev)m(er)h(to)f(those)g(of)g(this)f(License.)40
+b(Y)-8 b(ou)27 b(ma)m(y)g(not)g(use)330 883 y(tec)m(hnical)35
+b(measures)d(to)i(obstruct)f(or)g(con)m(trol)h(the)f(reading)g(or)g
+(further)e(cop)m(ying)j(of)f(the)g(copies)330 993 y(y)m(ou)25
+b(mak)m(e)g(or)g(distribute.)38 b(Ho)m(w)m(ev)m(er,)28
+b(y)m(ou)d(ma)m(y)g(accept)h(comp)s(ensation)f(in)f(exc)m(hange)j(for)d
+(copies.)330 1103 y(If)32 b(y)m(ou)g(distribute)g(a)h(large)g(enough)f
+(n)m(um)m(b)s(er)f(of)h(copies)h(y)m(ou)f(m)m(ust)h(also)g(follo)m(w)g
+(the)f(conditions)330 1212 y(in)e(section)i(3.)330 1358
+y(Y)-8 b(ou)21 b(ma)m(y)h(also)f(lend)g(copies,)i(under)d(the)h(same)g
+(conditions)g(stated)h(ab)s(o)m(v)m(e,)i(and)c(y)m(ou)h(ma)m(y)g
+(publicly)330 1468 y(displa)m(y)31 b(copies.)199 1614
+y(3.)61 b(COPYING)30 b(IN)g(QUANTITY)330 1760 y(If)25
+b(y)m(ou)g(publish)f(prin)m(ted)g(copies)i(\(or)g(copies)g(in)f(media)g
+(that)h(commonly)g(ha)m(v)m(e)g(prin)m(ted)f(co)m(v)m(ers\))i(of)330
+1870 y(the)32 b(Do)s(cumen)m(t,)h(n)m(um)m(b)s(ering)e(more)h(than)f
+(100,)j(and)d(the)h(Do)s(cumen)m(t's)h(license)f(notice)h(requires)330
+1979 y(Co)m(v)m(er)i(T)-8 b(exts,)36 b(y)m(ou)f(m)m(ust)f(enclose)i
+(the)e(copies)h(in)f(co)m(v)m(ers)i(that)f(carry)-8 b(,)36
+b(clearly)f(and)f(legibly)-8 b(,)37 b(all)330 2089 y(these)j(Co)m(v)m
+(er)g(T)-8 b(exts:)59 b(F)-8 b(ron)m(t-Co)m(v)m(er)41
+b(T)-8 b(exts)40 b(on)f(the)g(fron)m(t)g(co)m(v)m(er,)44
+b(and)38 b(Bac)m(k-Co)m(v)m(er)k(T)-8 b(exts)40 b(on)330
+2198 y(the)29 b(bac)m(k)h(co)m(v)m(er.)42 b(Both)30 b(co)m(v)m(ers)h(m)
+m(ust)e(also)h(clearly)g(and)f(legibly)h(iden)m(tify)f(y)m(ou)h(as)f
+(the)h(publisher)330 2308 y(of)k(these)h(copies.)53 b(The)34
+b(fron)m(t)h(co)m(v)m(er)h(m)m(ust)e(presen)m(t)g(the)h(full)f(title)i
+(with)d(all)j(w)m(ords)d(of)i(the)f(title)330 2418 y(equally)e
+(prominen)m(t)e(and)g(visible.)43 b(Y)-8 b(ou)31 b(ma)m(y)g(add)g
+(other)g(material)h(on)f(the)g(co)m(v)m(ers)h(in)e(addition.)330
+2527 y(Cop)m(ying)36 b(with)g(c)m(hanges)h(limited)g(to)g(the)g(co)m(v)
+m(ers,)i(as)d(long)h(as)g(they)f(preserv)m(e)g(the)h(title)g(of)g(the)
+330 2637 y(Do)s(cumen)m(t)h(and)e(satisfy)i(these)f(conditions,)j(can)d
+(b)s(e)g(treated)h(as)f(v)m(erbatim)h(cop)m(ying)g(in)f(other)330
+2746 y(resp)s(ects.)330 2892 y(If)32 b(the)h(required)f(texts)i(for)e
+(either)h(co)m(v)m(er)i(are)e(to)s(o)g(v)m(oluminous)g(to)g(\014t)g
+(legibly)-8 b(,)35 b(y)m(ou)e(should)f(put)330 3002 y(the)h(\014rst)f
+(ones)h(listed)g(\(as)h(man)m(y)f(as)g(\014t)g(reasonably\))g(on)g(the)
+g(actual)h(co)m(v)m(er,)h(and)e(con)m(tin)m(ue)h(the)330
+3112 y(rest)d(on)m(to)g(adjacen)m(t)h(pages.)330 3258
+y(If)27 b(y)m(ou)g(publish)e(or)i(distribute)g(Opaque)f(copies)i(of)f
+(the)h(Do)s(cumen)m(t)f(n)m(um)m(b)s(ering)f(more)i(than)e(100,)330
+3367 y(y)m(ou)i(m)m(ust)g(either)h(include)e(a)i(mac)m(hine-readable)g
+(T)-8 b(ransparen)m(t)28 b(cop)m(y)h(along)g(with)e(eac)m(h)i(Opaque)
+330 3477 y(cop)m(y)-8 b(,)38 b(or)d(state)h(in)f(or)g(with)g(eac)m(h)h
+(Opaque)e(cop)m(y)i(a)g(computer-net)m(w)m(ork)g(lo)s(cation)h(from)d
+(whic)m(h)330 3587 y(the)24 b(general)i(net)m(w)m(ork-using)f(public)e
+(has)h(access)i(to)f(do)m(wnload)f(using)g(public-standard)f(net)m(w)m
+(ork)330 3696 y(proto)s(cols)40 b(a)f(complete)h(T)-8
+b(ransparen)m(t)39 b(cop)m(y)g(of)g(the)h(Do)s(cumen)m(t,)i(free)d(of)g
+(added)f(material.)67 b(If)330 3806 y(y)m(ou)39 b(use)g(the)g(latter)h
+(option,)h(y)m(ou)f(m)m(ust)e(tak)m(e)j(reasonably)e(pruden)m(t)e
+(steps,)k(when)d(y)m(ou)h(b)s(egin)330 3915 y(distribution)f(of)g
+(Opaque)g(copies)h(in)e(quan)m(tit)m(y)-8 b(,)43 b(to)38
+b(ensure)g(that)h(this)f(T)-8 b(ransparen)m(t)38 b(cop)m(y)h(will)330
+4025 y(remain)30 b(th)m(us)g(accessible)i(at)f(the)f(stated)h(lo)s
+(cation)h(un)m(til)e(at)h(least)h(one)e(y)m(ear)h(after)g(the)f(last)h
+(time)330 4134 y(y)m(ou)37 b(distribute)f(an)h(Opaque)f(cop)m(y)i
+(\(directly)g(or)e(through)g(y)m(our)h(agen)m(ts)h(or)f(retailers\))h
+(of)f(that)330 4244 y(edition)31 b(to)g(the)g(public.)330
+4390 y(It)k(is)f(requested,)i(but)e(not)h(required,)g(that)g(y)m(ou)g
+(con)m(tact)h(the)f(authors)f(of)h(the)g(Do)s(cumen)m(t)g(w)m(ell)330
+4500 y(b)s(efore)28 b(redistributing)g(an)m(y)h(large)h(n)m(um)m(b)s
+(er)d(of)i(copies,)h(to)f(giv)m(e)h(them)f(a)g(c)m(hance)h(to)f(pro)m
+(vide)g(y)m(ou)330 4609 y(with)h(an)g(up)s(dated)f(v)m(ersion)i(of)g
+(the)f(Do)s(cumen)m(t.)199 4755 y(4.)61 b(MODIFICA)-8
+b(TIONS)330 4902 y(Y)g(ou)26 b(ma)m(y)g(cop)m(y)g(and)f(distribute)g(a)
+h(Mo)s(di\014ed)f(V)-8 b(ersion)26 b(of)g(the)g(Do)s(cumen)m(t)g(under)
+e(the)h(conditions)330 5011 y(of)c(sections)h(2)g(and)e(3)h(ab)s(o)m(v)
+m(e,)k(pro)m(vided)20 b(that)i(y)m(ou)f(release)i(the)e(Mo)s(di\014ed)f
+(V)-8 b(ersion)22 b(under)d(precisely)330 5121 y(this)29
+b(License,)h(with)f(the)g(Mo)s(di\014ed)f(V)-8 b(ersion)30
+b(\014lling)f(the)g(role)h(of)f(the)g(Do)s(cumen)m(t,)h(th)m(us)f
+(licensing)330 5230 y(distribution)k(and)h(mo)s(di\014cation)g(of)h
+(the)f(Mo)s(di\014ed)f(V)-8 b(ersion)35 b(to)g(who)s(ev)m(er)f(p)s
+(ossesses)f(a)i(cop)m(y)g(of)330 5340 y(it.)41 b(In)30
+b(addition,)h(y)m(ou)f(m)m(ust)h(do)f(these)h(things)f(in)g(the)h(Mo)s
+(di\014ed)e(V)-8 b(ersion:)p eop end
+%%Page: 24 28
+TeXDict begin 24 27 bop 150 -116 a Fo(24)2600 b(GNU)31
+b(Readline)g(Library)357 299 y(A.)60 b(Use)33 b(in)f(the)h(Title)h(P)m
+(age)g(\(and)f(on)f(the)h(co)m(v)m(ers,)i(if)e(an)m(y\))g(a)g(title)h
+(distinct)f(from)g(that)g(of)g(the)510 408 y(Do)s(cumen)m(t,)j(and)d
+(from)g(those)i(of)f(previous)f(v)m(ersions)h(\(whic)m(h)g(should,)g
+(if)g(there)g(w)m(ere)g(an)m(y)-8 b(,)510 518 y(b)s(e)31
+b(listed)h(in)f(the)g(History)h(section)g(of)g(the)f(Do)s(cumen)m(t\).)
+45 b(Y)-8 b(ou)32 b(ma)m(y)g(use)f(the)g(same)h(title)h(as)510
+628 y(a)e(previous)f(v)m(ersion)g(if)h(the)f(original)i(publisher)d(of)
+h(that)h(v)m(ersion)g(giv)m(es)h(p)s(ermission.)360 758
+y(B.)61 b(List)31 b(on)f(the)h(Title)g(P)m(age,)i(as)d(authors,)h(one)g
+(or)f(more)h(p)s(ersons)e(or)h(en)m(tities)j(resp)s(onsible)c(for)510
+867 y(authorship)c(of)h(the)h(mo)s(di\014cations)f(in)g(the)g(Mo)s
+(di\014ed)f(V)-8 b(ersion,)28 b(together)g(with)d(at)i(least)h(\014v)m
+(e)510 977 y(of)c(the)g(principal)g(authors)f(of)i(the)f(Do)s(cumen)m
+(t)g(\(all)h(of)g(its)f(principal)g(authors,)h(if)f(it)g(has)g(few)m
+(er)510 1087 y(than)30 b(\014v)m(e\),)h(unless)f(they)h(release)g(y)m
+(ou)g(from)f(this)g(requiremen)m(t.)359 1217 y(C.)60
+b(State)32 b(on)e(the)h(Title)h(page)f(the)g(name)g(of)g(the)g
+(publisher)e(of)i(the)g(Mo)s(di\014ed)f(V)-8 b(ersion,)32
+b(as)f(the)510 1326 y(publisher.)355 1456 y(D.)61 b(Preserv)m(e)31
+b(all)g(the)g(cop)m(yrigh)m(t)h(notices)f(of)g(the)f(Do)s(cumen)m(t.)
+363 1587 y(E.)60 b(Add)30 b(an)i(appropriate)f(cop)m(yrigh)m(t)i
+(notice)f(for)g(y)m(our)f(mo)s(di\014cations)g(adjacen)m(t)i(to)f(the)g
+(other)510 1696 y(cop)m(yrigh)m(t)g(notices.)365 1826
+y(F.)61 b(Include,)28 b(immediately)h(after)f(the)h(cop)m(yrigh)m(t)g
+(notices,)h(a)e(license)h(notice)g(giving)g(the)f(public)510
+1936 y(p)s(ermission)23 b(to)j(use)e(the)g(Mo)s(di\014ed)g(V)-8
+b(ersion)25 b(under)e(the)i(terms)f(of)h(this)f(License,)j(in)d(the)g
+(form)510 2045 y(sho)m(wn)30 b(in)g(the)g(Addendum)f(b)s(elo)m(w.)353
+2176 y(G.)61 b(Preserv)m(e)23 b(in)g(that)g(license)h(notice)g(the)f
+(full)g(lists)g(of)g(In)m(v)-5 b(arian)m(t)23 b(Sections)h(and)e
+(required)g(Co)m(v)m(er)510 2285 y(T)-8 b(exts)31 b(giv)m(en)g(in)f
+(the)h(Do)s(cumen)m(t's)g(license)h(notice.)357 2415
+y(H.)60 b(Include)30 b(an)g(unaltered)g(cop)m(y)h(of)g(this)f(License.)
+392 2545 y(I.)60 b(Preserv)m(e)33 b(the)f(section)h(En)m(titled)g
+(\\History",)h(Preserv)m(e)f(its)f(Title,)i(and)d(add)h(to)h(it)f(an)g
+(item)510 2655 y(stating)d(at)g(least)g(the)g(title,)h(y)m(ear,)g(new)d
+(authors,)i(and)e(publisher)f(of)j(the)f(Mo)s(di\014ed)f(V)-8
+b(ersion)510 2765 y(as)32 b(giv)m(en)g(on)f(the)h(Title)g(P)m(age.)45
+b(If)31 b(there)h(is)f(no)g(section)i(En)m(titled)f(\\History")h(in)e
+(the)g(Do)s(cu-)510 2874 y(men)m(t,)37 b(create)f(one)f(stating)h(the)f
+(title,)i(y)m(ear,)g(authors,)f(and)e(publisher)f(of)i(the)g(Do)s
+(cumen)m(t)510 2984 y(as)h(giv)m(en)h(on)f(its)h(Title)g(P)m(age,)i
+(then)d(add)g(an)g(item)g(describing)g(the)g(Mo)s(di\014ed)g(V)-8
+b(ersion)37 b(as)510 3093 y(stated)31 b(in)f(the)h(previous)f(sen)m
+(tence.)378 3224 y(J.)60 b(Preserv)m(e)33 b(the)g(net)m(w)m(ork)g(lo)s
+(cation,)i(if)d(an)m(y)-8 b(,)34 b(giv)m(en)f(in)g(the)f(Do)s(cumen)m
+(t)h(for)g(public)e(access)j(to)510 3333 y(a)e(T)-8 b(ransparen)m(t)30
+b(cop)m(y)i(of)g(the)f(Do)s(cumen)m(t,)h(and)f(lik)m(ewise)h(the)g(net)
+m(w)m(ork)g(lo)s(cations)g(giv)m(en)g(in)510 3443 y(the)g(Do)s(cumen)m
+(t)g(for)g(previous)f(v)m(ersions)h(it)g(w)m(as)g(based)f(on.)45
+b(These)31 b(ma)m(y)h(b)s(e)f(placed)h(in)g(the)510 3552
+y(\\History")27 b(section.)40 b(Y)-8 b(ou)25 b(ma)m(y)h(omit)g(a)f(net)
+m(w)m(ork)h(lo)s(cation)g(for)f(a)h(w)m(ork)f(that)g(w)m(as)h
+(published)510 3662 y(at)36 b(least)h(four)e(y)m(ears)i(b)s(efore)e
+(the)h(Do)s(cumen)m(t)h(itself,)h(or)d(if)h(the)g(original)h(publisher)
+d(of)i(the)510 3771 y(v)m(ersion)31 b(it)g(refers)f(to)h(giv)m(es)h(p)s
+(ermission.)354 3902 y(K.)60 b(F)-8 b(or)24 b(an)m(y)h(section)f(En)m
+(titled)h(\\Ac)m(kno)m(wledgemen)m(ts")i(or)d(\\Dedications",)k
+(Preserv)m(e)c(the)g(Title)510 4011 y(of)j(the)f(section,)j(and)d
+(preserv)m(e)h(in)f(the)h(section)g(all)h(the)e(substance)h(and)f(tone)
+h(of)f(eac)m(h)i(of)f(the)510 4121 y(con)m(tributor)k(ac)m(kno)m
+(wledgemen)m(ts)i(and/or)d(dedications)h(giv)m(en)h(therein.)368
+4251 y(L.)60 b(Preserv)m(e)36 b(all)g(the)g(In)m(v)-5
+b(arian)m(t)36 b(Sections)g(of)f(the)h(Do)s(cumen)m(t,)h(unaltered)f
+(in)f(their)g(text)i(and)510 4361 y(in)f(their)g(titles.)58
+b(Section)37 b(n)m(um)m(b)s(ers)d(or)i(the)g(equiv)-5
+b(alen)m(t)38 b(are)e(not)g(considered)g(part)g(of)g(the)510
+4470 y(section)c(titles.)341 4600 y(M.)61 b(Delete)33
+b(an)m(y)e(section)h(En)m(titled)f(\\Endorsemen)m(ts".)42
+b(Suc)m(h)30 b(a)i(section)f(ma)m(y)h(not)f(b)s(e)f(included)510
+4710 y(in)g(the)h(Mo)s(di\014ed)e(V)-8 b(ersion.)357
+4840 y(N.)60 b(Do)29 b(not)g(retitle)h(an)m(y)e(existing)i(section)f
+(to)g(b)s(e)f(En)m(titled)h(\\Endorsemen)m(ts")g(or)f(to)h(con\015ict)g
+(in)510 4950 y(title)j(with)e(an)m(y)h(In)m(v)-5 b(arian)m(t)31
+b(Section.)354 5080 y(O.)60 b(Preserv)m(e)31 b(an)m(y)g(W)-8
+b(arran)m(t)m(y)32 b(Disclaimers.)330 5230 y(If)h(the)g(Mo)s(di\014ed)g
+(V)-8 b(ersion)34 b(includes)f(new)g(fron)m(t-matter)i(sections)f(or)f
+(app)s(endices)g(that)h(qualify)330 5340 y(as)28 b(Secondary)g
+(Sections)g(and)f(con)m(tain)j(no)d(material)j(copied)e(from)f(the)h
+(Do)s(cumen)m(t,)i(y)m(ou)e(ma)m(y)g(at)p eop end
+%%Page: 25 29
+TeXDict begin 25 28 bop 150 -116 a Fo(App)s(endix)29
+b(A:)h(Cop)m(ying)h(This)f(Man)m(ual)2105 b(25)330 299
+y(y)m(our)32 b(option)h(designate)h(some)e(or)h(all)g(of)f(these)h
+(sections)h(as)e(in)m(v)-5 b(arian)m(t.)48 b(T)-8 b(o)33
+b(do)f(this,)h(add)f(their)330 408 y(titles)37 b(to)f(the)f(list)h(of)g
+(In)m(v)-5 b(arian)m(t)36 b(Sections)g(in)f(the)h(Mo)s(di\014ed)f(V)-8
+b(ersion's)36 b(license)g(notice.)57 b(These)330 518
+y(titles)32 b(m)m(ust)e(b)s(e)g(distinct)h(from)e(an)m(y)i(other)g
+(section)g(titles.)330 650 y(Y)-8 b(ou)43 b(ma)m(y)g(add)f(a)g(section)
+i(En)m(titled)f(\\Endorsemen)m(ts",)j(pro)m(vided)c(it)h(con)m(tains)g
+(nothing)g(but)330 759 y(endorsemen)m(ts)30 b(of)g(y)m(our)f(Mo)s
+(di\014ed)g(V)-8 b(ersion)31 b(b)m(y)e(v)-5 b(arious)30
+b(parties|for)g(example,)g(statemen)m(ts)i(of)330 869
+y(p)s(eer)27 b(review)g(or)g(that)h(the)f(text)i(has)d(b)s(een)h(appro)
+m(v)m(ed)g(b)m(y)g(an)h(organization)h(as)e(the)h(authoritativ)m(e)330
+978 y(de\014nition)i(of)h(a)f(standard.)330 1110 y(Y)-8
+b(ou)29 b(ma)m(y)g(add)e(a)i(passage)g(of)g(up)e(to)i(\014v)m(e)g(w)m
+(ords)e(as)i(a)g(F)-8 b(ron)m(t-Co)m(v)m(er)30 b(T)-8
+b(ext,)30 b(and)e(a)g(passage)i(of)e(up)330 1219 y(to)g(25)g(w)m(ords)e
+(as)i(a)f(Bac)m(k-Co)m(v)m(er)j(T)-8 b(ext,)29 b(to)f(the)f(end)f(of)i
+(the)f(list)h(of)f(Co)m(v)m(er)h(T)-8 b(exts)27 b(in)g(the)h(Mo)s
+(di\014ed)330 1329 y(V)-8 b(ersion.)58 b(Only)35 b(one)h(passage)h(of)f
+(F)-8 b(ron)m(t-Co)m(v)m(er)38 b(T)-8 b(ext)36 b(and)g(one)g(of)g(Bac)m
+(k-Co)m(v)m(er)j(T)-8 b(ext)36 b(ma)m(y)h(b)s(e)330 1439
+y(added)27 b(b)m(y)g(\(or)h(through)f(arrangemen)m(ts)h(made)g(b)m(y\))
+g(an)m(y)g(one)f(en)m(tit)m(y)-8 b(.)42 b(If)27 b(the)h(Do)s(cumen)m(t)
+g(already)330 1548 y(includes)34 b(a)g(co)m(v)m(er)h(text)g(for)f(the)g
+(same)h(co)m(v)m(er,)h(previously)e(added)f(b)m(y)h(y)m(ou)g(or)g(b)m
+(y)g(arrangemen)m(t)330 1658 y(made)h(b)m(y)g(the)h(same)f(en)m(tit)m
+(y)i(y)m(ou)f(are)f(acting)i(on)e(b)s(ehalf)f(of,)j(y)m(ou)f(ma)m(y)g
+(not)f(add)g(another;)j(but)330 1767 y(y)m(ou)c(ma)m(y)h(replace)g(the)
+f(old)g(one,)i(on)e(explicit)h(p)s(ermission)e(from)g(the)i(previous)e
+(publisher)f(that)330 1877 y(added)e(the)g(old)h(one.)330
+2008 y(The)25 b(author\(s\))h(and)f(publisher\(s\))f(of)i(the)f(Do)s
+(cumen)m(t)h(do)g(not)f(b)m(y)h(this)f(License)h(giv)m(e)h(p)s
+(ermission)330 2118 y(to)k(use)f(their)g(names)h(for)f(publicit)m(y)g
+(for)h(or)f(to)h(assert)g(or)f(imply)g(endorsemen)m(t)g(of)h(an)m(y)g
+(Mo)s(di\014ed)330 2228 y(V)-8 b(ersion.)199 2359 y(5.)61
+b(COMBINING)31 b(DOCUMENTS)330 2491 y(Y)-8 b(ou)39 b(ma)m(y)g(com)m
+(bine)h(the)f(Do)s(cumen)m(t)g(with)g(other)f(do)s(cumen)m(ts)h
+(released)g(under)f(this)g(License,)330 2600 y(under)f(the)h(terms)g
+(de\014ned)f(in)h(section)h(4)g(ab)s(o)m(v)m(e)g(for)f(mo)s(di\014ed)f
+(v)m(ersions,)k(pro)m(vided)d(that)h(y)m(ou)330 2710
+y(include)25 b(in)g(the)g(com)m(bination)i(all)f(of)g(the)f(In)m(v)-5
+b(arian)m(t)26 b(Sections)g(of)g(all)g(of)f(the)h(original)g(do)s
+(cumen)m(ts,)330 2819 y(unmo)s(di\014ed,)g(and)g(list)h(them)g(all)g
+(as)g(In)m(v)-5 b(arian)m(t)28 b(Sections)f(of)g(y)m(our)g(com)m(bined)
+g(w)m(ork)f(in)h(its)g(license)330 2929 y(notice,)32
+b(and)e(that)h(y)m(ou)f(preserv)m(e)h(all)g(their)g(W)-8
+b(arran)m(t)m(y)32 b(Disclaimers.)330 3061 y(The)e(com)m(bined)g(w)m
+(ork)h(need)e(only)i(con)m(tain)g(one)g(cop)m(y)g(of)f(this)g(License,)
+i(and)d(m)m(ultiple)i(iden)m(tical)330 3170 y(In)m(v)-5
+b(arian)m(t)33 b(Sections)g(ma)m(y)g(b)s(e)f(replaced)h(with)f(a)h
+(single)g(cop)m(y)-8 b(.)48 b(If)32 b(there)h(are)g(m)m(ultiple)g(In)m
+(v)-5 b(arian)m(t)330 3280 y(Sections)27 b(with)g(the)g(same)g(name)g
+(but)f(di\013eren)m(t)h(con)m(ten)m(ts,)i(mak)m(e)f(the)f(title)h(of)f
+(eac)m(h)h(suc)m(h)f(section)330 3389 y(unique)33 b(b)m(y)h(adding)f
+(at)i(the)f(end)g(of)g(it,)h(in)f(paren)m(theses,)i(the)e(name)g(of)g
+(the)g(original)h(author)f(or)330 3499 y(publisher)23
+b(of)i(that)h(section)g(if)f(kno)m(wn,)h(or)f(else)h(a)f(unique)f(n)m
+(um)m(b)s(er.)38 b(Mak)m(e)26 b(the)g(same)f(adjustmen)m(t)330
+3608 y(to)g(the)g(section)g(titles)h(in)e(the)h(list)g(of)f(In)m(v)-5
+b(arian)m(t)26 b(Sections)f(in)f(the)g(license)i(notice)g(of)e(the)h
+(com)m(bined)330 3718 y(w)m(ork.)330 3850 y(In)41 b(the)g(com)m
+(bination,)46 b(y)m(ou)41 b(m)m(ust)g(com)m(bine)h(an)m(y)g(sections)g
+(En)m(titled)g(\\History")h(in)e(the)g(v)-5 b(ari-)330
+3959 y(ous)32 b(original)h(do)s(cumen)m(ts,)g(forming)f(one)g(section)h
+(En)m(titled)g(\\History";)i(lik)m(ewise)f(com)m(bine)f(an)m(y)330
+4069 y(sections)g(En)m(titled)f(\\Ac)m(kno)m(wledgemen)m(ts",)k(and)31
+b(an)m(y)h(sections)h(En)m(titled)g(\\Dedications".)47
+b(Y)-8 b(ou)330 4178 y(m)m(ust)30 b(delete)i(all)f(sections)h(En)m
+(titled)f(\\Endorsemen)m(ts.")199 4310 y(6.)61 b(COLLECTIONS)28
+b(OF)i(DOCUMENTS)330 4441 y(Y)-8 b(ou)32 b(ma)m(y)h(mak)m(e)g(a)f
+(collection)i(consisting)f(of)f(the)g(Do)s(cumen)m(t)g(and)g(other)g
+(do)s(cumen)m(ts)f(released)330 4551 y(under)41 b(this)h(License,)k
+(and)c(replace)h(the)g(individual)f(copies)h(of)f(this)g(License)h(in)f
+(the)h(v)-5 b(arious)330 4661 y(do)s(cumen)m(ts)42 b(with)g(a)h(single)
+g(cop)m(y)h(that)f(is)f(included)g(in)g(the)h(collection,)48
+b(pro)m(vided)42 b(that)i(y)m(ou)330 4770 y(follo)m(w)38
+b(the)g(rules)e(of)h(this)g(License)h(for)f(v)m(erbatim)h(cop)m(ying)g
+(of)f(eac)m(h)h(of)f(the)h(do)s(cumen)m(ts)e(in)h(all)330
+4880 y(other)31 b(resp)s(ects.)330 5011 y(Y)-8 b(ou)32
+b(ma)m(y)g(extract)h(a)f(single)g(do)s(cumen)m(t)f(from)g(suc)m(h)g(a)h
+(collection,)i(and)d(distribute)g(it)h(individu-)330
+5121 y(ally)k(under)d(this)i(License,)i(pro)m(vided)e(y)m(ou)g(insert)g
+(a)g(cop)m(y)h(of)f(this)g(License)g(in)m(to)h(the)g(extracted)330
+5230 y(do)s(cumen)m(t,)d(and)f(follo)m(w)i(this)e(License)h(in)g(all)g
+(other)g(resp)s(ects)f(regarding)h(v)m(erbatim)g(cop)m(ying)h(of)330
+5340 y(that)d(do)s(cumen)m(t.)p eop end
+%%Page: 26 30
+TeXDict begin 26 29 bop 150 -116 a Fo(26)2600 b(GNU)31
+b(Readline)g(Library)199 299 y(7.)61 b(A)m(GGREGA)-8
+b(TION)32 b(WITH)e(INDEPENDENT)h(W)m(ORKS)330 428 y(A)d(compilation)i
+(of)e(the)g(Do)s(cumen)m(t)h(or)f(its)g(deriv)-5 b(ativ)m(es)30
+b(with)d(other)i(separate)g(and)e(indep)s(enden)m(t)330
+538 y(do)s(cumen)m(ts)33 b(or)g(w)m(orks,)h(in)f(or)h(on)f(a)g(v)m
+(olume)h(of)g(a)f(storage)i(or)e(distribution)g(medium,)g(is)h(called)
+330 648 y(an)c(\\aggregate")k(if)c(the)g(cop)m(yrigh)m(t)i(resulting)e
+(from)f(the)i(compilation)g(is)f(not)h(used)e(to)i(limit)g(the)330
+757 y(legal)d(righ)m(ts)f(of)g(the)g(compilation's)h(users)e(b)s(ey)m
+(ond)g(what)g(the)h(individual)f(w)m(orks)g(p)s(ermit.)39
+b(When)330 867 y(the)28 b(Do)s(cumen)m(t)g(is)g(included)f(an)g
+(aggregate,)32 b(this)27 b(License)h(do)s(es)g(not)g(apply)f(to)h(the)g
+(other)g(w)m(orks)330 976 y(in)i(the)h(aggregate)i(whic)m(h)d(are)h
+(not)f(themselv)m(es)i(deriv)-5 b(ativ)m(e)32 b(w)m(orks)e(of)h(the)f
+(Do)s(cumen)m(t.)330 1106 y(If)22 b(the)h(Co)m(v)m(er)h(T)-8
+b(ext)23 b(requiremen)m(t)g(of)g(section)h(3)f(is)g(applicable)h(to)f
+(these)h(copies)f(of)g(the)g(Do)s(cumen)m(t,)330 1215
+y(then)f(if)g(the)h(Do)s(cumen)m(t)g(is)g(less)f(than)g(one)h(half)f
+(of)h(the)g(en)m(tire)g(aggregate,)k(the)c(Do)s(cumen)m(t's)g(Co)m(v)m
+(er)330 1325 y(T)-8 b(exts)27 b(ma)m(y)g(b)s(e)f(placed)h(on)g(co)m(v)m
+(ers)h(that)f(brac)m(k)m(et)h(the)f(Do)s(cumen)m(t)g(within)f(the)h
+(aggregate,)j(or)d(the)330 1435 y(electronic)37 b(equiv)-5
+b(alen)m(t)36 b(of)g(co)m(v)m(ers)g(if)f(the)g(Do)s(cumen)m(t)h(is)f
+(in)g(electronic)i(form.)54 b(Otherwise)35 b(they)330
+1544 y(m)m(ust)30 b(app)s(ear)g(on)g(prin)m(ted)g(co)m(v)m(ers)i(that)f
+(brac)m(k)m(et)h(the)f(whole)f(aggregate.)199 1674 y(8.)61
+b(TRANSLA)-8 b(TION)330 1803 y(T)g(ranslation)41 b(is)f(considered)f(a)
+i(kind)e(of)h(mo)s(di\014cation,)j(so)d(y)m(ou)g(ma)m(y)h(distribute)e
+(translations)330 1913 y(of)45 b(the)f(Do)s(cumen)m(t)h(under)e(the)h
+(terms)h(of)f(section)i(4.)83 b(Replacing)45 b(In)m(v)-5
+b(arian)m(t)45 b(Sections)g(with)330 2022 y(translations)h(requires)f
+(sp)s(ecial)h(p)s(ermission)f(from)g(their)g(cop)m(yrigh)m(t)i
+(holders,)i(but)c(y)m(ou)g(ma)m(y)330 2132 y(include)24
+b(translations)i(of)e(some)h(or)g(all)g(In)m(v)-5 b(arian)m(t)25
+b(Sections)g(in)f(addition)h(to)g(the)g(original)h(v)m(ersions)330
+2242 y(of)32 b(these)f(In)m(v)-5 b(arian)m(t)33 b(Sections.)44
+b(Y)-8 b(ou)32 b(ma)m(y)g(include)f(a)h(translation)g(of)g(this)f
+(License,)i(and)d(all)j(the)330 2351 y(license)42 b(notices)g(in)f(the)
+h(Do)s(cumen)m(t,)j(and)40 b(an)m(y)i(W)-8 b(arran)m(t)m(y)42
+b(Disclaimers,)k(pro)m(vided)41 b(that)h(y)m(ou)330 2461
+y(also)f(include)f(the)g(original)h(English)f(v)m(ersion)g(of)g(this)g
+(License)h(and)e(the)h(original)h(v)m(ersions)g(of)330
+2570 y(those)35 b(notices)g(and)e(disclaimers.)53 b(In)33
+b(case)i(of)g(a)f(disagreemen)m(t)h(b)s(et)m(w)m(een)g(the)f
+(translation)i(and)330 2680 y(the)f(original)i(v)m(ersion)e(of)h(this)f
+(License)h(or)f(a)g(notice)i(or)e(disclaimer,)i(the)f(original)g(v)m
+(ersion)g(will)330 2790 y(prev)-5 b(ail.)330 2919 y(If)28
+b(a)h(section)h(in)e(the)h(Do)s(cumen)m(t)h(is)e(En)m(titled)i(\\Ac)m
+(kno)m(wledgemen)m(ts",)i(\\Dedications",)g(or)d(\\His-)330
+3029 y(tory",)f(the)f(requiremen)m(t)f(\(section)i(4\))f(to)g(Preserv)m
+(e)g(its)f(Title)i(\(section)f(1\))g(will)g(t)m(ypically)h(require)330
+3138 y(c)m(hanging)j(the)g(actual)h(title.)199 3268 y(9.)61
+b(TERMINA)-8 b(TION)330 3397 y(Y)g(ou)30 b(ma)m(y)h(not)f(cop)m(y)-8
+b(,)31 b(mo)s(dify)-8 b(,)30 b(sublicense,)g(or)g(distribute)f(the)h
+(Do)s(cumen)m(t)g(except)h(as)f(expressly)330 3507 y(pro)m(vided)41
+b(for)h(under)e(this)i(License.)75 b(An)m(y)42 b(other)g(attempt)h(to)g
+(cop)m(y)-8 b(,)46 b(mo)s(dify)-8 b(,)44 b(sublicense)e(or)330
+3616 y(distribute)36 b(the)h(Do)s(cumen)m(t)g(is)g(v)m(oid,)i(and)d
+(will)h(automatically)i(terminate)f(y)m(our)e(righ)m(ts)h(under)330
+3726 y(this)28 b(License.)40 b(Ho)m(w)m(ev)m(er,)31 b(parties)d(who)f
+(ha)m(v)m(e)i(receiv)m(ed)g(copies,)h(or)d(righ)m(ts,)i(from)f(y)m(ou)g
+(under)e(this)330 3836 y(License)37 b(will)g(not)g(ha)m(v)m(e)h(their)f
+(licenses)g(terminated)h(so)f(long)g(as)g(suc)m(h)f(parties)h(remain)g
+(in)f(full)330 3945 y(compliance.)154 4075 y(10.)61 b(FUTURE)30
+b(REVISIONS)f(OF)i(THIS)e(LICENSE)330 4204 y(The)41 b(F)-8
+b(ree)43 b(Soft)m(w)m(are)f(F)-8 b(oundation)43 b(ma)m(y)f(publish)e
+(new,)k(revised)d(v)m(ersions)h(of)g(the)g(GNU)g(F)-8
+b(ree)330 4314 y(Do)s(cumen)m(tation)34 b(License)e(from)g(time)h(to)g
+(time.)46 b(Suc)m(h)31 b(new)h(v)m(ersions)g(will)h(b)s(e)e(similar)h
+(in)g(spirit)330 4423 y(to)j(the)g(presen)m(t)f(v)m(ersion,)i(but)e(ma)
+m(y)h(di\013er)f(in)g(detail)h(to)g(address)f(new)g(problems)f(or)i
+(concerns.)330 4533 y(See)c Fn(http://www.gnu.org/copy)o(left)o(/)p
+Fo(.)330 4663 y(Eac)m(h)f(v)m(ersion)g(of)g(the)f(License)h(is)g(giv)m
+(en)g(a)g(distinguishing)f(v)m(ersion)h(n)m(um)m(b)s(er.)39
+b(If)29 b(the)g(Do)s(cumen)m(t)330 4772 y(sp)s(eci\014es)45
+b(that)h(a)g(particular)f(n)m(um)m(b)s(ered)f(v)m(ersion)i(of)f(this)g
+(License)h(\\or)g(an)m(y)g(later)g(v)m(ersion")330 4882
+y(applies)33 b(to)g(it,)h(y)m(ou)e(ha)m(v)m(e)i(the)f(option)g(of)f
+(follo)m(wing)i(the)f(terms)f(and)g(conditions)h(either)g(of)f(that)330
+4991 y(sp)s(eci\014ed)37 b(v)m(ersion)i(or)e(of)h(an)m(y)h(later)g(v)m
+(ersion)f(that)g(has)g(b)s(een)f(published)f(\(not)j(as)f(a)g(draft\))g
+(b)m(y)330 5101 y(the)33 b(F)-8 b(ree)34 b(Soft)m(w)m(are)f(F)-8
+b(oundation.)49 b(If)32 b(the)h(Do)s(cumen)m(t)g(do)s(es)g(not)g(sp)s
+(ecify)f(a)h(v)m(ersion)g(n)m(um)m(b)s(er)f(of)330 5210
+y(this)i(License,)j(y)m(ou)d(ma)m(y)i(c)m(ho)s(ose)f(an)m(y)g(v)m
+(ersion)g(ev)m(er)g(published)e(\(not)i(as)g(a)f(draft\))h(b)m(y)f(the)
+h(F)-8 b(ree)330 5320 y(Soft)m(w)m(are)31 b(F)-8 b(oundation.)p
+eop end
+%%Page: 27 31
+TeXDict begin 27 30 bop 150 -116 a Fo(App)s(endix)29
+b(A:)h(Cop)m(ying)h(This)f(Man)m(ual)2105 b(27)150 299
+y Fc(A.1.1)62 b(ADDENDUM:)41 b(Ho)m(w)g(to)g(use)g(this)g(License)g
+(for)h(y)m(our)f(do)s(cumen)m(ts)275 543 y Fo(T)-8 b(o)27
+b(use)g(this)g(License)h(in)f(a)h(do)s(cumen)m(t)f(y)m(ou)h(ha)m(v)m(e)
+g(written,)g(include)f(a)h(cop)m(y)g(of)f(the)h(License)g(in)f(the)150
+653 y(do)s(cumen)m(t)j(and)g(put)g(the)g(follo)m(wing)i(cop)m(yrigh)m
+(t)g(and)e(license)h(notices)g(just)f(after)h(the)g(title)h(page:)468
+765 y Fb(Copyright)42 b(\(C\))79 b Fa(year)88 b(your)40
+b(name)p Fb(.)468 852 y(Permission)i(is)e(granted)g(to)g(copy,)h
+(distribute)g(and/or)g(modify)f(this)g(document)468 939
+y(under)h(the)f(terms)g(of)g(the)g(GNU)g(Free)g(Documentation)i
+(License,)f(Version)g(1.2)468 1026 y(or)f(any)g(later)g(version)h
+(published)h(by)d(the)h(Free)g(Software)h(Foundation;)468
+1113 y(with)g(no)e(Invariant)j(Sections,)f(no)f(Front-Cover)h(Texts,)g
+(and)f(no)f(Back-Cover)j(Texts.)468 1200 y(A)e(copy)g(of)g(the)g
+(license)g(is)g(included)h(in)f(the)g(section)h(entitled)g(``GNU)468
+1288 y(Free)g(Documentation)h(License''.)275 1410 y Fo(If)d(y)m(ou)h
+(ha)m(v)m(e)h(In)m(v)-5 b(arian)m(t)41 b(Sections,)i(F)-8
+b(ron)m(t-Co)m(v)m(er)42 b(T)-8 b(exts)41 b(and)e(Bac)m(k-Co)m(v)m(er)k
+(T)-8 b(exts,)43 b(replace)e(the)150 1520 y(\\with...T)-8
+b(exts.")43 b(line)30 b(with)h(this:)547 1632 y Fb(with)40
+b(the)g(Invariant)h(Sections)g(being)g Fa(list)f(their)g(titles)p
+Fb(,)h(with)547 1719 y(the)f(Front-Cover)i(Texts)e(being)g
+Fa(list)p Fb(,)h(and)f(with)g(the)g(Back-Cover)h(Texts)547
+1806 y(being)f Fa(list)p Fb(.)275 1929 y Fo(If)34 b(y)m(ou)i(ha)m(v)m
+(e)g(In)m(v)-5 b(arian)m(t)36 b(Sections)g(without)f(Co)m(v)m(er)h(T)-8
+b(exts,)38 b(or)d(some)g(other)h(com)m(bination)g(of)g(the)150
+2038 y(three,)31 b(merge)g(those)g(t)m(w)m(o)g(alternativ)m(es)i(to)e
+(suit)f(the)h(situation.)275 2173 y(If)23 b(y)m(our)h(do)s(cumen)m(t)f
+(con)m(tains)i(non)m(trivial)g(examples)g(of)f(program)f(co)s(de,)j(w)m
+(e)e(recommend)g(releasing)150 2283 y(these)44 b(examples)f(in)g
+(parallel)h(under)e(y)m(our)h(c)m(hoice)i(of)e(free)g(soft)m(w)m(are)h
+(license,)k(suc)m(h)43 b(as)g(the)g(GNU)150 2392 y(General)31
+b(Public)f(License,)i(to)f(p)s(ermit)e(their)i(use)f(in)g(free)g(soft)m
+(w)m(are.)p eop end
+%%Page: 28 32
+TeXDict begin 28 31 bop 150 -116 a Fo(28)2600 b(GNU)31
+b(Readline)g(Library)p eop end
+%%Trailer
+
+userdict /end-hook known{end-hook}if
+%%EOF
diff --git a/doc/rluserman.texi b/doc/rluserman.texi
new file mode 100644 (file)
index 0000000..086aa83
--- /dev/null
@@ -0,0 +1,88 @@
+\input texinfo    @c -*-texinfo-*-
+@comment %**start of header (This is for running Texinfo on a region.)
+@setfilename rluserman.info
+@settitle GNU Readline Library
+@comment %**end of header (This is for running Texinfo on a region.)
+
+@setchapternewpage odd
+
+@include version.texi
+
+@copying
+This manual describes the end user interface of the GNU Readline Library
+(version @value{VERSION}, @value{UPDATED}), a library which aids in the
+consistency of user interface across discrete programs which provide
+a command line interface.
+
+Copyright @copyright{} 1988-2006 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.
+
+@quotation
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.2 or
+any later version published by the Free Software Foundation; with no
+Invariant Sections, with the Front-Cover texts being ``A GNU Manual,''
+and with the Back-Cover Texts as in (a) below.  A copy of the license is
+included in the section entitled ``GNU Free Documentation License.''
+
+(a) The FSF's Back-Cover Text is: ``You have freedom to copy and modify
+this GNU Manual, like GNU software.  Copies published by the Free
+Software Foundation raise funds for GNU development.''
+@end quotation
+@end copying
+
+@dircategory Libraries
+@direntry
+* RLuserman: (rluserman).       The GNU readline library User's Manual.
+@end direntry
+
+@titlepage
+@title GNU Readline Library User Interface
+@subtitle Edition @value{EDITION}, for @code{Readline Library} Version @value{VERSION}.
+@subtitle @value{UPDATED-MONTH}
+@author Chet Ramey, Case Western Reserve University
+@author Brian Fox, Free Software Foundation
+
+@page
+@vskip 0pt plus 1filll
+@insertcopying
+
+@sp 1
+Published by the Free Software Foundation @*
+59 Temple Place, Suite 330, @*
+Boston, MA 02111-1307 @*
+USA @*
+
+@end titlepage
+
+@contents
+
+@ifnottex
+@node Top
+@top GNU Readline Library
+
+This document describes the end user interface of the GNU Readline Library,
+a utility which aids in the consistency of user interface across discrete
+programs which provide a command line interface.
+
+@menu
+* Command Line Editing::          GNU Readline User's Manual.
+* Copying This Manual::                Copying This Manual.
+@end menu
+@end ifnottex
+
+@include rluser.texi
+
+@node Copying This Manual
+@appendix Copying This Manual
+
+@menu
+* GNU Free Documentation License::     License for copying this manual.
+@end menu
+
+@include fdl.texi
+
+@bye
diff --git a/doc/texi2dvi b/doc/texi2dvi
new file mode 100755 (executable)
index 0000000..010b586
--- /dev/null
@@ -0,0 +1,660 @@
+#! /bin/sh
+# texi2dvi --- produce DVI (or PDF) files from Texinfo (or LaTeX) sources.
+# $Id: texi2dvi,v 1.14 2003/02/05 00:42:33 karl Exp $
+#
+# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2001,
+# 2002, 2003 Free Software Foundation, Inc.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, you can either send email to this
+# program's maintainer or write to: The Free Software Foundation,
+# Inc.; 59 Temple Place, Suite 330; Boston, MA 02111-1307, USA.
+#
+# Original author: Noah Friedman <friedman@gnu.org>.
+#
+# Please send bug reports, etc. to bug-texinfo@gnu.org.
+# If possible, please send a copy of the output of the script called with
+# the `--debug' option when making a bug report.
+
+# This string is expanded by rcs automatically when this file is checked out.
+rcs_revision='$Revision: 1.14 $'
+rcs_version=`set - $rcs_revision; echo $2`
+program=`echo $0 | sed -e 's!.*/!!'`
+version="texi2dvi (GNU Texinfo 4.5) $rcs_version
+
+Copyright (C) 2003 Free Software Foundation, Inc.
+There is NO warranty.  You may redistribute this software
+under the terms of the GNU General Public License.
+For more information about these matters, see the files named COPYING."
+
+usage="Usage: $program [OPTION]... FILE...
+
+Run each Texinfo or LaTeX FILE through TeX in turn until all
+cross-references are resolved, building all indices.  The directory
+containing each FILE is searched for included files.  The suffix of FILE
+is used to determine its language (LaTeX or Texinfo).
+
+Makeinfo is used to perform Texinfo macro expansion before running TeX
+when needed.
+
+Operation modes:
+  -b, --batch         no interaction
+  -c, --clean         remove all auxiliary files
+  -D, --debug         turn on shell debugging (set -x)
+  -h, --help          display this help and exit successfully
+  -o, --output=OFILE  leave output in OFILE (implies --clean);
+                      Only one input FILE may be specified in this case
+  -q, --quiet         no output unless errors (implies --batch)
+  -s, --silent        same as --quiet
+  -v, --version       display version information and exit successfully
+  -V, --verbose       report on what is done
+
+TeX tuning:
+  -@                   use @input instead of \input; for preloaded Texinfo
+  -e, -E, --expand     force macro expansion using makeinfo
+  -I DIR               search DIR for Texinfo files
+  -l, --language=LANG  specify the LANG of FILE (LaTeX or Texinfo)
+  -p, --pdf            use pdftex or pdflatex for processing
+  -t, --texinfo=CMD    insert CMD after @setfilename in copy of input file
+                       multiple values accumulate
+
+The values of the BIBTEX, LATEX (or PDFLATEX), MAKEINDEX, MAKEINFO,
+TEX (or PDFTEX), and TEXINDEX environment variables are used to run
+those commands, if they are set.
+
+Email bug reports to <bug-texinfo@gnu.org>,
+general questions and discussion to <help-texinfo@gnu.org>.
+Texinfo home page: http://www.gnu.org/software/texinfo/"
+
+# Initialize variables for option overriding and otherwise.
+# Don't use `unset' since old bourne shells don't have this command.
+# Instead, assign them an empty value.
+batch=false     # eval for batch mode
+clean=
+debug=
+escape='\'
+expand=         # t for expansion via makeinfo
+miincludes=     # makeinfo include path
+oformat=dvi
+oname=          # --output
+quiet=          # by default let the tools' message be displayed
+set_language=
+textra=
+tmpdir=${TMPDIR:-/tmp}/t2d$$  # avoid collisions on 8.3 filesystems.
+txincludes=     # TEXINPUTS extensions, with trailing colon
+txiprereq=19990129 # minimum texinfo.tex version to have macro expansion
+verbose=false   # echo for verbose mode
+
+orig_pwd=`pwd`
+
+# Systems which define $COMSPEC or $ComSpec use semicolons to separate
+# directories in TEXINPUTS.
+if test -n "$COMSPEC$ComSpec"; then
+  path_sep=";"
+else
+  path_sep=":"
+fi
+
+# Pacify verbose cds.
+CDPATH=${ZSH_VERSION+.}$path_sep
+
+# In case someone crazy insists on using grep -E.
+: ${EGREP=egrep}
+
+# Save this so we can construct a new TEXINPUTS path for each file.
+TEXINPUTS_orig="$TEXINPUTS"
+# Unfortunately makeindex does not read TEXINPUTS.
+INDEXSTYLE_orig="$INDEXSTYLE"
+export TEXINPUTS INDEXSTYLE
+
+# Push a token among the arguments that will be used to notice when we
+# ended options/arguments parsing.
+# Use "set dummy ...; shift" rather than 'set - ..." because on
+# Solaris set - turns off set -x (but keeps set -e).
+# Use ${1+"$@"} rather than "$@" because Digital Unix and Ultrix 4.3
+# still expand "$@" to a single argument (the empty string) rather
+# than nothing at all.
+arg_sep="$$--$$"
+set dummy ${1+"$@"} "$arg_sep"; shift
+
+# \f
+# Parse command line arguments.
+while test x"$1" != x"$arg_sep"; do
+
+  # Handle --option=value by splitting apart and putting back on argv.
+  case "$1" in
+    --*=*)
+      opt=`echo "$1" | sed -e 's/=.*//'`
+      val=`echo "$1" | sed -e 's/[^=]*=//'`
+      shift
+      set dummy "$opt" "$val" ${1+"$@"}; shift
+      ;;
+  esac
+
+  # This recognizes --quark as --quiet.  So what.
+  case "$1" in
+    -@ ) escape=@;;
+    # Silently and without documentation accept -b and --b[atch] as synonyms.
+    -b | --b*) batch=eval;;
+    -q | -s | --q* | --s*) quiet=t; batch=eval;;
+    -c | --c*) clean=t;;
+    -D | --d*) debug=t;;
+    -e | -E | --e*) expand=t;;
+    -h | --h*) echo "$usage"; exit 0;;
+    -I | --I*)
+      shift
+      miincludes="$miincludes -I $1"
+      txincludes="$txincludes$1$path_sep"
+      ;;
+    -l | --l*) shift; set_language=$1;;
+    -o | --o*)
+      shift
+      clean=t
+      case "$1" in
+        /* | ?:/*) oname=$1;;
+                *) oname="$orig_pwd/$1";;
+      esac;;
+    -p | --p*) oformat=pdf;;
+    -t | --t*) shift; textra="$textra\\
+$1";;
+    -v | --vers*) echo "$version"; exit 0;;
+    -V | --verb*) verbose=echo;;
+    --) # What remains are not options.
+      shift
+      while test x"$1" != x"$arg_sep"; do
+        set dummy ${1+"$@"} "$1"; shift
+        shift
+      done
+      break;;
+    -*)
+      echo "$0: Unknown or ambiguous option \`$1'." >&2
+      echo "$0: Try \`--help' for more information." >&2
+      exit 1;;
+    *) set dummy ${1+"$@"} "$1"; shift;;
+   esac
+   shift
+done
+# Pop the token
+shift
+
+# Interpret remaining command line args as filenames.
+case $# in
+ 0)
+  echo "$0: Missing file arguments." >&2
+  echo "$0: Try \`--help' for more information." >&2
+  exit 2
+  ;;
+ 1) ;;
+ *)
+  if test -n "$oname"; then
+    echo "$0: Can't use option \`--output' with more than one argument." >&2
+    exit 2
+  fi
+  ;;
+esac
+
+# Prepare the temporary directory.  Remove it at exit, unless debugging.
+if test -z "$debug"; then
+  trap "cd / && rm -rf $tmpdir" 0 1 2 15
+fi
+
+# Create the temporary directory with strict rights
+(umask 077 && mkdir $tmpdir) || exit 1
+
+# Prepare the tools we might need.  This may be extra work in some
+# cases, but improves the readibility of the script.
+utildir=$tmpdir/utils
+mkdir $utildir || exit 1
+
+# A sed script that preprocesses Texinfo sources in order to keep the
+# iftex sections only.  We want to remove non TeX sections, and
+# comment (with `@c texi2dvi') TeX sections so that makeinfo does not
+# try to parse them.  Nevertheless, while commenting TeX sections,
+# don't comment @macro/@end macro so that makeinfo does propagate
+# them.  Unfortunately makeinfo --iftex --no-ifhtml --no-ifinfo
+# doesn't work well enough (yet) to use that, so work around with sed.
+comment_iftex_sed=$utildir/comment.sed
+cat <<EOF >$comment_iftex_sed
+/^@tex/,/^@end tex/{
+  s/^/@c texi2dvi/
+}
+/^@iftex/,/^@end iftex/{
+  s/^/@c texi2dvi/
+  /^@c texi2dvi@macro/,/^@c texi2dvi@end macro/{
+    s/^@c texi2dvi//
+  }
+}
+/^@html/,/^@end html/{
+  s/^/@c (texi2dvi)/
+}
+/^@ifhtml/,/^@end ifhtml/{
+  s/^/@c (texi2dvi)/
+}
+/^@ifnottex/,/^@end ifnottex/{
+  s/^/@c (texi2dvi)/
+}
+/^@ifinfo/,/^@end ifinfo/{
+  /^@node/p
+  /^@menu/,/^@end menu/p
+  t
+  s/^/@c (texi2dvi)/
+}
+s/^@ifnotinfo/@c texi2dvi@ifnotinfo/
+s/^@end ifnotinfo/@c texi2dvi@end ifnotinfo/
+EOF
+# Uncommenting is simple: Remove any leading `@c texi2dvi'.
+uncomment_iftex_sed=$utildir/uncomment.sed
+cat <<EOF >$uncomment_iftex_sed
+s/^@c texi2dvi//
+EOF
+
+# A shell script that computes the list of xref files.
+# Takes the filename (without extension) of which we look for xref
+# files as argument.  The index files must be reported last.
+get_xref_files=$utildir/get_xref.sh
+cat <<\EOF >$get_xref_files
+#! /bin/sh
+
+# Get list of xref files (indexes, tables and lists).
+# Find all files having root filename with a two-letter extension,
+# saves the ones that are really Texinfo-related files.  .?o? catches
+# many files: .toc, .log, LaTeX tables and lists, FiXme's .lox, maybe more.
+for this_file in "$1".?o? "$1".aux "$1".?? "$1".idx; do
+  # If file is empty, skip it.
+  test -s "$this_file" || continue
+  # If the file is not suitable to be an index or xref file, don't
+  # process it.  The file can't be if its first character is not a
+  # backslash or single quote.
+  first_character=`sed -n '1s/^\(.\).*$/\1/p;q' $this_file`
+  if test "x$first_character" = "x\\" \
+     || test "x$first_character" = "x'"; then
+    xref_files="$xref_files ./$this_file"
+  fi
+done
+echo "$xref_files"
+EOF
+chmod 500 $get_xref_files
+
+# File descriptor usage:
+# 0 standard input
+# 1 standard output (--verbose messages)
+# 2 standard error
+# 3 some systems may open it to /dev/tty
+# 4 used on the Kubota Titan
+# 5 tools output (turned off by --quiet)
+
+# Tools' output.  If quiet, discard, else redirect to the message flow.
+if test "$quiet" = t; then
+  exec 5>/dev/null
+else
+  exec 5>&1
+fi
+
+# Enable tracing
+test "$debug" = t && set -x
+
+# \f
+# TeXify files.
+
+for command_line_filename in ${1+"$@"}; do
+  $verbose "Processing $command_line_filename ..."
+
+  # If the COMMAND_LINE_FILENAME is not absolute (e.g., --debug.tex),
+  # prepend `./' in order to avoid that the tools take it as an option.
+  echo "$command_line_filename" | $EGREP '^(/|[A-z]:/)' >/dev/null \
+  || command_line_filename="./$command_line_filename"
+
+  # See if the file exists.  If it doesn't we're in trouble since, even
+  # though the user may be able to reenter a valid filename at the tex
+  # prompt (assuming they're attending the terminal), this script won't
+  # be able to find the right xref files and so forth.
+  if test ! -r "$command_line_filename"; then
+    echo "$0: Could not read $command_line_filename, skipping." >&2
+    continue
+  fi
+
+  # Get the name of the current directory.  We want the full path
+  # because in clean mode we are in tmp, in which case a relative
+  # path has no meaning.
+  filename_dir=`echo $command_line_filename | sed 's!/[^/]*$!!;s!^$!.!'`
+  filename_dir=`cd "$filename_dir" >/dev/null && pwd`
+
+  # Strip directory part but leave extension.
+  filename_ext=`basename "$command_line_filename"`
+  # Strip extension.
+  filename_noext=`echo "$filename_ext" | sed 's/\.[^.]*$//'`
+  ext=`echo "$filename_ext" | sed 's/^.*\.//'`
+
+  # _src.  Use same basename since we want to generate aux files with
+  # the same basename as the manual.  If --expand, then output the
+  # macro-expanded file to here, else copy the original file.
+  tmpdir_src=$tmpdir/src
+  filename_src=$tmpdir_src/$filename_noext.$ext
+
+  # _xtr.  The file with the user's extra commands.
+  tmpdir_xtr=$tmpdir/xtr
+  filename_xtr=$tmpdir_xtr/$filename_noext.$ext
+
+  # _bak.  Copies of the previous xref files (another round is run if
+  # they differ from the new one).
+  tmpdir_bak=$tmpdir/bak
+
+  # Make all those directories and give up if we can't succeed.
+  mkdir $tmpdir_src $tmpdir_xtr $tmpdir_bak || exit 1
+
+  # Source file might include additional sources.
+  # We want `.:$orig_pwd' before anything else.  (We'll add `.:' later
+  # after all other directories have been turned into absolute paths.)
+  # `.' goes first to ensure that any old .aux, .cps,
+  # etc. files in ${directory} don't get used in preference to fresher
+  # files in `.'.  Include orig_pwd in case we are in clean mode, where
+  # we've cd'd to a temp directory.
+  common="$orig_pwd$path_sep$filename_dir$path_sep$txincludes"
+   TEXINPUTS="$common$TEXINPUTS_orig"
+  INDEXSTYLE="$common$INDEXSTYLE_orig"
+
+  # Convert relative paths to absolute paths, so we can run in another
+  # directory (e.g., in --clean mode, or during the macro-support
+  # detection.)
+  #
+  # Empty path components are meaningful to tex.  We rewrite them
+  # as `EMPTY' so they don't get lost when we split on $path_sep.
+   TEXINPUTS=`echo $TEXINPUTS  |sed 's/^:/EMPTY:/;s/:$/:EMPTY/;s/::/:EMPTY:/g'`
+  INDEXSTYLE=`echo $INDEXSTYLE |sed 's/^:/EMPTY:/;s/:$/:EMPTY/;s/::/:EMPTY:/g'`
+  save_IFS=$IFS
+  IFS=$path_sep
+  set x $TEXINPUTS; shift
+  TEXINPUTS=.
+  for dir
+  do
+    case $dir in
+      EMPTY)
+        TEXINPUTS=$TEXINPUTS$path_sep
+        ;;
+      [\\/]* | ?:[\\/]*)        # Absolute paths don't need to be expansed.
+        TEXINPUTS=$TEXINPUTS$path_sep$dir
+        ;;
+      *)
+        abs=`cd "$dir" && pwd` && TEXINPUTS=$TEXINPUTS$path_sep$abs
+        ;;
+    esac
+  done
+  set x $INDEXSTYLE; shift
+  INDEXSTYLE=.
+  for dir
+  do
+    case $dir in
+      EMPTY)
+        INDEXSTYLE=$INDEXSTYLE$path_sep
+        ;;
+      [\\/]* | ?:[\\/]*)        # Absolute paths don't need to be expansed.
+        INDEXSTYLE=$INDEXSTYLE$path_sep$dir
+        ;;
+      *)
+        abs=`cd "$dir" && pwd` && INDEXSTYLE=$INDEXSTYLE$path_sep$abs
+        ;;
+    esac
+  done
+  IFS=$save_IFS
+
+  # If the user explicitly specified the language, use that.
+  # Otherwise, if the first line is \input texinfo, assume it's texinfo.
+  # Otherwise, guess from the file extension.
+  if test -n "$set_language"; then
+    language=$set_language
+  elif sed 1q "$command_line_filename" | grep 'input texinfo' >/dev/null; then
+    language=texinfo
+  else
+    language=
+  fi
+
+  # Get the type of the file (latex or texinfo) from the given language
+  # we just guessed, or from the file extension if not set yet.
+  case ${language:-$filename_ext} in
+    [lL]a[tT]e[xX] | *.ltx | *.tex)
+      # Assume a LaTeX file.  LaTeX needs bibtex and uses latex for
+      # compilation.  No makeinfo.
+      bibtex=${BIBTEX:-bibtex}
+      makeinfo= # no point in running makeinfo on latex source.
+      texindex=${MAKEINDEX:-makeindex}
+      if test $oformat = dvi; then
+        tex=${LATEX:-latex}
+      else
+        tex=${PDFLATEX:-pdflatex}
+      fi
+      ;;
+
+    *)
+      # Assume a Texinfo file.  Texinfo files need makeinfo, texindex and tex.
+      bibtex=
+      texindex=${TEXINDEX:-texindex}
+      if test $oformat = dvi; then
+        tex=${TEX:-tex}
+      else
+        tex=${PDFTEX:-pdftex}
+      fi
+      # Unless required by the user, makeinfo expansion is wanted only
+      # if texinfo.tex is too old.
+      if test "$expand" = t; then
+        makeinfo=${MAKEINFO:-makeinfo}
+      else
+        # Check if texinfo.tex performs macro expansion by looking for
+        # its version.  The version is a date of the form YEAR-MO-DA.
+        # We don't need to use [0-9] to match the digits since anyway
+        # the comparison with $txiprereq, a number, will fail with non
+        # digits.
+        txiversion_tex=txiversion.tex
+        echo '\input texinfo.tex @bye' >$tmpdir/$txiversion_tex
+        # Run in the tmpdir to avoid leaving files.
+        eval `cd $tmpdir >/dev/null &&
+              $tex $txiversion_tex 2>/dev/null |
+              sed -n 's/^.*\[\(.*\)version \(....\)-\(..\)-\(..\).*$/txiformat=\1 txiversion="\2\3\4"/p'`
+        $verbose "texinfo.tex preloaded as \`$txiformat', version is \`$txiversion' ..."
+        if test "$txiprereq" -le "$txiversion" >/dev/null 2>&1; then
+          makeinfo=
+        else
+          makeinfo=${MAKEINFO:-makeinfo}
+        fi
+        # As long as we had to run TeX, offer the user this convenience
+        if test "$txiformat" = Texinfo; then
+          escape=@
+        fi
+      fi
+      ;;
+  esac
+
+  # Expand macro commands in the original source file using Makeinfo.
+  # Always use `end' footnote style, since the `separate' style
+  #   generates different output (arguably this is a bug in -E).
+  # Discard main info output, the user asked to run TeX, not makeinfo.
+  if test -n "$makeinfo"; then
+    $verbose "Macro-expanding $command_line_filename to $filename_src ..."
+    sed -f $comment_iftex_sed "$command_line_filename" \
+      | $makeinfo --footnote-style=end -I "$filename_dir" $miincludes \
+        -o /dev/null --macro-expand=- \
+      | sed -f $uncomment_iftex_sed >"$filename_src"
+    filename_input=$filename_src
+  fi
+
+  # If makeinfo failed (or was not even run), use the original file as input.
+  if test $? -ne 0 \
+     || test ! -r "$filename_src"; then
+    $verbose "Reverting to $command_line_filename ..."
+    filename_input=$filename_dir/$filename_ext
+  fi
+
+  # Used most commonly for @finalout, @smallbook, etc.
+  if test -n "$textra"; then
+    $verbose "Inserting extra commands: $textra"
+    sed '/^@setfilename/a\
+'"$textra" "$filename_input" >$filename_xtr
+    filename_input=$filename_xtr
+  fi
+
+  # If clean mode was specified, then move to the temporary directory.
+  if test "$clean" = t; then
+    $verbose "cd $tmpdir_src"
+    cd "$tmpdir_src" || exit 1
+  fi
+
+  while :; do # will break out of loop below
+    orig_xref_files=`$get_xref_files "$filename_noext"`
+
+    # Save copies of originals for later comparison.
+    if test -n "$orig_xref_files"; then
+      $verbose "Backing up xref files: `echo $orig_xref_files | sed 's|\./||g'`"
+      cp $orig_xref_files $tmpdir_bak
+    fi
+
+    # Run bibtex on current file.
+    # - If its input (AUX) exists.
+    # - If AUX contains both `\bibdata' and `\bibstyle'.
+    # - If some citations are missing (LOG contains `Citation').
+    #   or the LOG complains of a missing .bbl
+    #
+    # We run bibtex first, because I can see reasons for the indexes
+    # to change after bibtex is run, but I see no reason for the
+    # converse.
+    #
+    # Don't try to be too smart.  Running bibtex only if the bbl file
+    # exists and is older than the LaTeX file is wrong, since the
+    # document might include files that have changed.  Because there
+    # can be several AUX (if there are \include's), but a single LOG,
+    # looking for missing citations in LOG is easier, though we take
+    # the risk to match false messages.
+    if test -n "$bibtex" \
+       && test -r "$filename_noext.aux" \
+       && test -r "$filename_noext.log" \
+       && (grep '^\\bibdata[{]'  "$filename_noext.aux" \
+           && grep '^\\bibstyle[{]' "$filename_noext.aux" \
+           && (grep 'Warning:.*Citation.*undefined' "$filename_noext.log" \
+               || grep 'No file .*\.bbl\.' "$filename_noext.log")) \
+          >/dev/null 2>&1; \
+    then
+      $verbose "Running $bibtex $filename_noext ..."
+      if $bibtex "$filename_noext" >&5; then :; else
+        echo "$0: $bibtex exited with bad status, quitting." >&2
+        exit 1
+      fi
+    fi
+
+    # What we'll run texindex on -- exclude non-index files.
+    # Since we know index files are last, it is correct to remove everything
+    # before .aux and .?o?.  But don't really do <anything>o<anything>
+    # -- don't match whitespace as <anything>.
+    # Otherwise, if orig_xref_files contains something like
+    #   foo.xo foo.whatever
+    # the space after the o will get matched.
+    index_files=`echo "$orig_xref_files" \
+                 | sed "s!.*\.aux!!g;
+                        s!./$filename_noext\.[^ ]o[^ ]!!g;
+                        s/^[ ]*//;s/[ ]*$//"`
+    # Run texindex (or makeindex) on current index files.  If they
+    # already exist, and after running TeX a first time the index
+    # files don't change, then there's no reason to run TeX again.
+    # But we won't know that if the index files are out of date or
+    # nonexistent.
+    if test -n "$texindex" && test -n "$index_files"; then
+      $verbose "Running $texindex $index_files ..."
+      if $texindex $index_files 2>&5 1>&2; then :; else
+         echo "$0: $texindex exited with bad status, quitting." >&2
+         exit 1
+      fi
+    fi
+
+    # Finally, run TeX.
+    # Prevent $ESCAPE from being interpreted by the shell if it happens
+    # to be `/'.
+    $batch tex_args="\\${escape}nonstopmode\ \\${escape}input"
+    cmd="$tex $tex_args $filename_input"
+    $verbose "Running $cmd ..."
+    if $cmd >&5; then :; else
+      echo "$0: $tex exited with bad status, quitting." >&2
+      echo "$0: see $filename_noext.log for errors." >&2
+      test "$clean" = t \
+        && cp "$filename_noext.log" "$orig_pwd"
+      exit 1
+    fi
+
+
+    # Decide if looping again is needed.
+    finished=t
+
+    # LaTeX (and the package changebar) report in the LOG file if it
+    # should be rerun.  This is needed for files included from
+    # subdirs, since texi2dvi does not try to compare xref files in
+    # subdirs.  Performing xref files test is still good since LaTeX
+    # does not report changes in xref files.
+    if grep "Rerun to get" "$filename_noext.log" >/dev/null 2>&1; then
+      finished=
+    fi
+
+    # Check if xref files changed.
+    new_xref_files=`$get_xref_files "$filename_noext"`
+    $verbose "Original xref files = `echo $orig_xref_files | sed 's|\./||g'`"
+    $verbose "New xref files      = `echo $new_xref_files | sed 's|\./||g'`"
+
+    # If old and new lists don't at least have the same file list,
+    # then one file or another has definitely changed.
+    test "x$orig_xref_files" != "x$new_xref_files" && finished=
+
+    # File list is the same.  We must compare each file until we find
+    # a difference.
+    if test -n "$finished"; then
+      for this_file in $new_xref_files; do
+        $verbose "Comparing xref file `echo $this_file | sed 's|\./||g'` ..."
+        # cmp -s returns nonzero exit status if files differ.
+        if cmp -s "$this_file" "$tmpdir_bak/$this_file"; then :; else
+          # We only need to keep comparing until we find one that
+          # differs, because we'll have to run texindex & tex again no
+          # matter how many more there might be.
+          finished=
+          $verbose "xref file `echo $this_file | sed 's|\./||g'` differed ..."
+          test "$debug" = t && diff -c "$tmpdir_bak/$this_file" "$this_file"
+          break
+        fi
+      done
+    fi
+
+    # If finished, exit the loop, else rerun the loop.
+    test -n "$finished" && break
+  done
+
+  # If we were in clean mode, compilation was in a tmp directory.
+  # Copy the DVI (or PDF) file into the directory where the compilation
+  # has been done.  (The temp dir is about to get removed anyway.)
+  # We also return to the original directory so that
+  # - the next file is processed in correct conditions
+  # - the temporary file can be removed
+  if test -n "$clean"; then
+    if test -n "$oname"; then
+       dest=$oname
+    else
+       dest=$orig_pwd
+    fi
+    $verbose "Copying $oformat file from `pwd` to $dest"
+    cp -p "./$filename_noext.$oformat" "$dest"
+    cd / # in case $orig_pwd is on a different drive (for DOS)
+    cd $orig_pwd || exit 1
+  fi
+
+  # Remove temporary files.
+  if test "x$debug" = "x"; then
+    $verbose "Removing $tmpdir_src $tmpdir_xtr $tmpdir_bak ..."
+    cd /
+    rm -rf $tmpdir_src $tmpdir_xtr $tmpdir_bak
+  fi
+done
+
+$verbose "$0 done."
+exit 0 # exit successfully, not however we ended the loop.
diff --git a/doc/texi2html b/doc/texi2html
new file mode 100755 (executable)
index 0000000..bdb3bee
--- /dev/null
@@ -0,0 +1,5429 @@
+#! /usr/bin/perl
+'di ';
+'ig 00 ';
+#+##############################################################################
+#
+# texi2html: Program to transform Texinfo documents to HTML
+#
+#    Copyright (C) 1999, 2000  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 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 requires perl version 5 or higher
+require 5.0;
+
+#++##############################################################################
+#
+# NOTE FOR DEBUGGING THIS SCRIPT:
+# You can run 'perl texi2html.pl' directly, provided you have
+# the environment variable T2H_HOME set to the directory containing
+# the texi2html.init file
+#
+#--##############################################################################
+
+# CVS version:
+# $Id: texi2html.pl,v 1.55 2000/07/27 14:39:41 obachman Exp $
+
+# Homepage:
+$T2H_HOMEPAGE = <<EOT;
+http://www.mathematik.uni-kl.de/~obachman/Texi2html
+EOT
+
+# Authors:  
+$T2H_AUTHORS = <<EOT;
+Written by: Lionel Cons <Lionel.Cons\@cern.ch> (original author)
+            Karl Berry  <karl\@freefriends.org>
+            Olaf Bachmann <obachman\@mathematik.uni-kl.de>
+            and many others.
+Maintained by: Olaf Bachmann <obachman\@mathematik.uni-kl.de>
+Send bugs and suggestions to <texi2html\@mathematik.uni-kl.de>
+EOT
+
+# Version: set in configure.in
+$THISVERSION = '1.64';
+$THISPROG = "texi2html $THISVERSION";  # program name and version
+  
+# The man page for this program is included at the end of this file and can be
+# viewed using the command 'nroff -man texi2html'.
+
+# Identity:
+
+$T2H_TODAY = &pretty_date;             # like "20 September 1993"
+# the eval prevents this from breaking on system which do not have
+# a proper getpwuid implemented
+eval { ($T2H_USER = (getpwuid ($<))[6]) =~ s/,.*//;}; # Who am i
+
+#+++############################################################################
+#                                                                              #
+# Initialization                                                               #
+# Pasted content of File $(srcdir)/texi2html.init: Default initializations     # 
+#                                                                              #
+#---############################################################################
+
+# leave this within comments, and keep the require statement
+# This way, you can directly run texi2html.pl, if $ENV{T2H_HOME}/texi2html.init
+# exists.
+
+# 
+# -*-perl-*-
+######################################################################
+# File: texi2html.init
+#
+# Sets default values for command-line arguments and for various customizable
+# procedures
+#
+# A copy of this file is pasted into the beginning of texi2html by
+# 'make texi2html'
+#
+# Copy this file and make changes to it, if you like.
+# Afterwards, either, load it with command-line option -init_file <your_init_file>
+#
+# $Id: texi2html.init,v 1.34 2000/07/27 14:09:02 obachman Exp $
+
+######################################################################
+# stuff which can also be set by command-line options
+#
+#
+# Note: values set here, overwrite values set by the command-line
+# options before -init_file and might still be overwritten by
+# command-line arguments following the -init_file option
+#
+
+# T2H_OPTIONS is a hash whose keys are the (long) names of valid
+# command-line options and whose values are a hash with the following keys:
+# type    ==> one of !|=i|:i|=s|:s (see GetOpt::Long for more info)
+# linkage ==> ref to scalar, array, or subroutine (see GetOpt::Long for more info)
+# verbose ==> short description of option (displayed by -h)
+# noHelp  ==> if 1 -> for "not so important options": only print description on -h 1
+#                2 -> for obsolete options: only print description on -h 2
+
+$T2H_DEBUG = 0;
+$T2H_OPTIONS -> {debug} =
+{
+ type => '=i',
+ linkage => \$main::T2H_DEBUG,
+ verbose => 'output HTML with debuging information',
+};
+
+$T2H_DOCTYPE = '<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">'; 
+$T2H_OPTIONS -> {doctype} = 
+{
+ type => '=s',
+ linkage => \$main::T2H_DOCTYPE,
+ verbose => 'document type which is output in header of HTML files',
+ noHelp => 1
+};
+
+$T2H_CHECK = 0;
+$T2H_OPTIONS -> {check} =
+{
+ type => '!',
+ linkage => \$main::T2H_CHECK,
+ verbose => 'if set, only check files and output all things that may be Texinfo commands',
+ noHelp => 1
+};
+
+# -expand
+# if set to "tex" (or, "info") expand @iftex and @tex (or, @ifinfo) sections
+# else, neither expand @iftex, @tex, nor @ifinfo sections
+$T2H_EXPAND = "info";
+$T2H_OPTIONS -> {expand} = 
+{
+ type => '=s',
+ linkage => \$T2H_EXPAND,
+ verbose => 'Expand info|tex|none section of texinfo source',
+};
+
+# - glossary
+#if set, uses section named `Footnotes' for glossary
+$T2H_USE_GLOSSARY = 0;
+T2H_OPTIONS -> {glossary} =
+{
+ type => '!',
+ linkage => \$T2H_USE_GLOSSARY,
+ verbose => "if set, uses section named `Footnotes' for glossary",
+ noHelp  => 1,
+};
+
+
+# -invisible
+# $T2H_INVISIBLE_MARK is the text used to create invisible destination
+# anchors for index links (you can for instance use the invisible.xbm
+# file shipped with this program). This is a workaround for a known
+# bug of many WWW browsers, including netscape.
+# For me, it works fine without it -- on the contrary: if there, it
+# inserts space between headers and start of text (obachman 3/99)
+$T2H_INVISIBLE_MARK = '';
+# $T2H_INVISIBLE_MARK = '&#160;';
+$T2H_OPTIONS -> {invisible} =
+{
+ type => '=s',
+ linkage => \$T2H_INVISIBLE_MARK,
+ verbose => 'use text in invisble anchot',
+ noHelp  => 1,
+};
+
+# -iso
+# if set, ISO8879 characters are used for special symbols (like copyright, etc)
+$T2H_USE_ISO = 0;
+$T2H_OPTIONS -> {iso} =
+{
+ type => 'iso',
+ linkage => \$T2H_USE_ISO,
+ verbose => 'if set, ISO8879 characters are used for special symbols (like copyright, etc)',
+ noHelp => 1,
+};
+
+# -I
+# list directories where @include files are searched for (besides the
+# directory of the doc file) additional '-I' args add to this list
+@T2H_INCLUDE_DIRS = (".");
+$T2H_OPTIONS -> {I} =
+{
+ type => '=s',
+ linkage => \@T2H_INCLUDE_DIRS,
+ verbose => 'append $s to the @include search path',
+};
+
+# -top_file
+# uses file of this name for top-level file
+# extension is manipulated appropriately, if necessary.
+# If empty, <basename of document>.html is used
+# Typically, you would set this to "index.html".
+$T2H_TOP_FILE = '';
+$T2H_OPTIONS -> {top_file} =
+{
+ type => '=s',
+ linkage => \$T2H_TOP_FILE,
+ verbose => 'use $s as top file, instead of <docname>.html',
+};
+
+
+# -toc_file
+# uses file of this name for table of contents file
+# extension is manipulated appropriately, if necessary.
+# If empty, <basename of document>_toc.html is used
+$T2H_TOC_FILE = '';
+$T2H_OPTIONS -> {toc_file} =
+{
+ type => '=s',
+ linkage => \$T2H_TOC_FILE,
+ verbose => 'use $s as ToC file, instead of <docname>_toc.html',
+};
+
+# -frames
+# if set, output two additional files which use HTML 4.0 "frames".
+$T2H_FRAMES = 0;
+$T2H_OPTIONS -> {frames} =
+{
+ type => '!',
+ linkage => \$T2H_FRAMES,
+ verbose => 'output files which use HTML 4.0 frames (experimental)',
+ noHelp => 1,
+};
+
+
+# -menu | -nomenu
+# if set, show the Texinfo menus
+$T2H_SHOW_MENU = 1;
+$T2H_OPTIONS -> {menu} =
+{
+ type => '!',
+ linkage => \$T2H_SHOW_MENU,
+ verbose => 'ouput Texinfo menus',
+};
+
+# -number | -nonumber
+# if set, number sections and show section names and numbers in references 
+# and menus
+$T2H_NUMBER_SECTIONS = 1;
+$T2H_OPTIONS -> {number} =
+{
+ type => '!',
+ linkage => \$T2H_NUMBER_SECTIONS,
+ verbose => 'use numbered sections'
+};
+
+# if set, and T2H_NUMBER_SECTIONS is set, then use node names in menu
+# entries, instead of section names
+$T2H_NODE_NAME_IN_MENU = 0;
+
+# if set and menu entry equals menu descr, then do not print menu descr.
+# Likewise, if node name equals entry name, do not print entry name.
+$T2H_AVOID_MENU_REDUNDANCY = 1;
+
+# -split section|chapter|none 
+# if set to 'section' (resp. 'chapter') create one html file per (sub)section
+# (resp. chapter) and separate pages for Top, ToC, Overview, Index,
+# Glossary, About.
+# otherwise, create monolithic html file which contains whole document
+#$T2H_SPLIT = 'section';
+$T2H_SPLIT = '';
+$T2H_OPTIONS -> {split} =
+{
+ type => '=s',
+ linkage => \$T2H_SPLIT,
+ verbose => 'split document on section|chapter else no splitting',
+};
+
+# -section_navigation|-no-section_navigation
+# if set, then navigation panels are printed at the beginning of each section
+# and, possibly at the end (depending on whether or not there were more than 
+# $T2H_WORDS_IN_PAGE  words on page
+# This is most useful if you do not want to have section navigation 
+# on -split chapter
+$T2H_SECTION_NAVIGATION = 1;
+$T2H_OPTIONS -> {sec_nav} =
+{
+ type => '!',
+ linkage => \$T2H_SECTION_NAVIGATION,
+ verbose => 'output navigation panels for each section',
+};
+
+# -subdir
+# if set put result files in this directory
+# if not set result files are put into current directory
+#$T2H_SUBDIR = 'html';
+$T2H_SUBDIR = '';
+$T2H_OPTIONS -> {subdir} =
+{
+ type => '=s',
+ linkage => \$T2H_SUBDIR,
+ verbose => 'put HTML files in directory $s, instead of $cwd',
+};
+
+# -short_extn
+# If this is set all HTML file will have extension ".htm" instead of
+# ".html". This is helpful when shipping the document to PC systems.
+$T2H_SHORTEXTN = 0;
+$T2H_OPTIONS -> {short_ext} =
+{
+ type => '!',
+ linkage => \$T2H_SHORTEXTN,
+ verbose => 'use "htm" extension for output HTML files',
+};
+
+
+# -prefix
+# Set the output file prefix, prepended to all .html, .gif and .pl files.
+# By default, this is the basename of the document
+$T2H_PREFIX = '';
+$T2H_OPTIONS -> {prefix} =
+{
+ type => '=s',
+ linkage => \$T2H_PREFIX,
+ verbose => 'use as prefix for output files, instead of <docname>',
+};
+
+# -o filename
+# If set, generate monolithic document output html into $filename
+$T2H_OUT = '';
+$T2H_OPTIONS -> {out_file} =
+{
+ type => '=s',
+ linkage => sub {$main::T2H_OUT = @_[1]; $T2H_SPLIT = '';},
+ verbose => 'if set, all HTML output goes into file $s',
+};
+
+# -short_ref
+#if set cross-references are given without section numbers
+$T2H_SHORT_REF = '';
+$T2H_OPTIONS -> {short_ref} =
+{
+ type => '!',
+ linkage => \$T2H_SHORT_REF,
+ verbose => 'if set, references are without section numbers',
+};
+
+# -idx_sum
+# if value is set, then for each @prinindex $what
+# $docu_name_$what.idx is created which contains lines of the form
+# $key\t$ref sorted alphabetically (case matters)
+$T2H_IDX_SUMMARY = 0;
+$T2H_OPTIONS -> {idx_sum} =
+{
+ type => '!',
+ linkage => \$T2H_IDX_SUMMARY,
+ verbose => 'if set, also output index summary',
+ noHelp  => 1,
+};
+
+# -verbose
+# if set, chatter about what we are doing
+$T2H_VERBOSE = '';
+$T2H_OPTIONS -> {Verbose} =
+{
+ type => '!',
+ linkage => \$T2H_VERBOSE,
+ verbose => 'print progress info to stdout',
+};
+
+# -lang
+# For page titles use $T2H_WORDS->{$T2H_LANG}->{...} as title.
+# To add a new language, supply list of titles (see $T2H_WORDS below).
+# and use ISO 639 language codes (see e.g. perl module Locale-Codes-1.02 
+# for  definitions)
+# Default's to 'en' if not set or no @documentlanguage is specified
+$T2H_LANG = '';
+$T2H_OPTIONS -> {lang} =
+{
+ type => '=s',
+ linkage => sub {SetDocumentLanguage($_[1])},
+ verbose => 'use $s as document language (ISO 639 encoding)',
+};
+
+# -l2h
+# if set, uses latex2html for generation of math content 
+$T2H_L2H = '';
+$T2H_OPTIONS -> {l2h} =
+{
+ type => '!',
+ linkage => \$T2H_L2H,
+ verbose => 'if set, uses latex2html for @math and @tex',
+};
+
+######################
+# The following options are only relevant if $T2H_L2H is set
+#
+# -l2h_l2h
+# name/location of latex2html progam
+$T2H_L2H_L2H = "latex2html";
+$T2H_OPTIONS -> {l2h_l2h} =
+{
+ type => '=s',
+ linkage => \$T2H_L2H_L2H,
+ verbose => 'program to use for latex2html translation',
+ noHelp => 1,
+};
+
+# -l2h_skip
+# if set, skips actual call to latex2html tries to reuse previously generated 
+# content, instead
+$T2H_L2H_SKIP = '';
+$T2H_OPTIONS -> {l2h_skip} =
+{
+ type => '!',
+ linkage => \$T2H_L2H_SKIP,
+ verbose => 'if set, tries to reuse previously latex2html output',
+ noHelp => 1,
+};
+
+# -l2h_tmp
+# if set, l2h uses this directory for temporarary files. The path
+# leading to this directory may not contain a dot (i.e., a "."),
+# otherwise, l2h will fail
+$T2H_L2H_TMP = '';
+$T2H_OPTIONS -> {l2h_tmp} =
+{
+ type => '=s',
+ linkage => \$T2H_L2H_TMP,
+ verbose => 'if set, uses $s as temporary latex2html directory',
+ noHelp => 1,
+};
+
+# if set, cleans intermediate files (they all have the prefix $doc_l2h_) 
+# of l2h 
+$T2H_L2H_CLEAN = 1;
+$T2H_OPTIONS -> {l2h_clean} =
+{
+ type => '!',
+ linkage => \$T2H_L2H_CLEAN,
+ verbose => 'if set, do not keep intermediate latex2html files for later reuse',
+ noHelp => 1,
+};
+
+$T2H_OPTIONS -> {D} =
+{
+ type => '=s',
+ linkage => sub {$main::value{@_[1]} = 1;},
+ verbose => 'equivalent to Texinfo "@set $s 1"',
+ noHelp => 1,
+};
+
+$T2H_OPTIONS -> {init_file} =
+{
+ type => '=s',
+ linkage => \&LoadInitFile,
+ verbose => 'load init file $s'
+};
+
+
+##############################################################################
+#
+# The following can only be set in the init file
+#
+##############################################################################
+
+# if set, center @image by default
+# otherwise, do not center by default
+$T2H_CENTER_IMAGE = 1;
+
+# used as identation for block enclosing command @example, etc
+# If not empty, must be enclosed in <td></td>
+$T2H_EXAMPLE_INDENT_CELL = '<td>&nbsp;</td>';
+# same as above, only for @small
+$T2H_SMALL_EXAMPLE_INDENT_CELL = '<td>&nbsp;</td>';
+# font size for @small
+$T2H_SMALL_FONT_SIZE = '-1';
+
+# if non-empty, and no @..heading appeared in Top node, then
+# use this as header for top node/section, otherwise use value of 
+# @settitle or @shorttitle (in that order)
+$T2H_TOP_HEADING = '';
+
+# if set, use this chapter for 'Index' button, else
+# use first chapter whose name matches 'index' (case insensitive)
+$T2H_INDEX_CHAPTER = '';
+
+# if set and $T2H_SPLIT is set, then split index pages at the next letter
+# after they have more than that many entries
+$T2H_SPLIT_INDEX = 100;
+
+# if set (e.g., to index.html) replace hrefs to this file 
+# (i.e., to index.html) by ./
+$T2H_HREF_DIR_INSTEAD_FILE = '';
+
+########################################################################
+# Language dependencies: 
+# To add a new language extend T2H_WORDS hash and create $T2H_<...>_WORDS hash
+# To redefine one word, simply do:
+# $T2H_WORDS->{<language>}->{<word>} = 'whatever' in your personal init file.
+#
+$T2H_WORDS_EN =
+{
+ # titles  of pages
+ 'ToC_Title' => 'Table of Contents',
+ 'Overview_Title' => 'Short Table of Contents',
+ 'Index_Title' => 'Index',
+ 'About_Title' => 'About this document',
+ 'Footnotes_Title' => 'Footnotes',
+ 'See' => 'See',
+ 'see' => 'see',
+ 'section' => 'section',
+# If necessary, we could extend this as follows: 
+#  # text for buttons
+#  'Top_Button' => 'Top',
+#  'ToC_Button' => 'Contents',
+#  'Overview_Button' => 'Overview',
+#  'Index_button' => 'Index',
+#  'Back_Button' => 'Back',
+#  'FastBack_Button' => 'FastBack',
+#  'Prev_Button' => 'Prev',
+#  'Up_Button' => 'Up',
+#  'Next_Button' => 'Next',
+#  'Forward_Button' =>'Forward',
+#  'FastWorward_Button' => 'FastForward',
+#  'First_Button' => 'First',
+#  'Last_Button' => 'Last',
+#  'About_Button' => 'About'
+};
+
+$T2H_WORD_DE =
+{
+ 'ToC_Title' => 'Inhaltsverzeichniss',
+ 'Overview_Title' => 'Kurzes Inhaltsverzeichniss',
+ 'Index_Title' => 'Index',
+ 'About_Title' => '&Uuml;ber dieses Dokument',
+ 'Footnotes_Title' => 'Fu&szlig;noten',
+ 'See' => 'Siehe',
+ 'see' => 'siehe',
+ 'section' => 'Abschnitt',
+};
+
+$T2H_WORD_NL =
+{
+ 'ToC_Title' => 'Inhoudsopgave',
+ 'Overview_Title' => 'Korte inhoudsopgave',
+ 'Index_Title' => 'Index', #Not sure ;-)
+ 'About_Title' => 'No translation available!', #No translation available!
+ 'Footnotes_Title' => 'No translation available!', #No translation available!
+ 'See' => 'Zie',
+ 'see' => 'zie',
+ 'section' => 'sectie',
+};
+
+$T2H_WORD_ES =
+{
+ 'ToC_Title' => '&iacute;ndice General',
+ 'Overview_Title' => 'Resumen del Contenido',
+ 'Index_Title' => 'Index', #Not sure ;-)
+ 'About_Title' => 'No translation available!', #No translation available!
+ 'Footnotes_Title' => 'Fu&szlig;noten',
+ 'See' => 'V&eacute;ase',
+ 'see' => 'v&eacute;ase',
+ 'section' => 'secci&oacute;n',
+};
+
+$T2H_WORD_NO =
+{
+ 'ToC_Title' => 'Innholdsfortegnelse',
+ 'Overview_Title' => 'Kort innholdsfortegnelse',
+ 'Index_Title' => 'Indeks', #Not sure ;-)
+ 'About_Title' => 'No translation available!', #No translation available!
+ 'Footnotes_Title' => 'No translation available!',
+ 'See' => 'Se',
+ 'see' => 'se',
+ 'section' => 'avsnitt',
+};
+
+$T2H_WORD_PT =
+{
+ 'ToC_Title' => 'Sum&aacute;rio',
+ 'Overview_Title' => 'Breve Sum&aacute;rio',
+ 'Index_Title' => '&Iacute;ndice', #Not sure ;-)
+ 'About_Title' => 'No translation available!', #No translation available!
+ 'Footnotes_Title' => 'No translation available!',
+ 'See' => 'Veja',
+ 'see' => 'veja',
+ 'section' => 'Se&ccedil;&atilde;o',
+};
+
+$T2H_WORDS =
+{
+ 'en' => $T2H_WORDS_EN,
+ 'de' => $T2H_WORDS_DE,
+ 'nl' => $T2H_WORDS_NL,
+ 'es' => $T2H_WORDS_ES,
+ 'no' => $T2H_WORDS_NO,
+ 'pt' => $T2H_WORDS_PT
+};
+
+@MONTH_NAMES_EN =
+(
+ 'January', 'February', 'March', 'April', 'May',
+ 'June', 'July', 'August', 'September', 'October',
+ 'November', 'December'
+);
+
+@MONTH_NAMES_DE =
+(
+ 'Januar', 'Februar', 'M&auml;rz', 'April', 'Mai',
+ 'Juni', 'Juli', 'August', 'September', 'Oktober',
+ 'November', 'Dezember'
+);
+
+@MONTH_NAMES_NL =
+(
+ 'Januari', 'Februari', 'Maart', 'April', 'Mei',
+ 'Juni', 'Juli', 'Augustus', 'September', 'Oktober',
+ 'November', 'December'
+);
+
+@MONTH_NAMES_ES =
+(
+ 'enero', 'febrero', 'marzo', 'abril', 'mayo',
+ 'junio', 'julio', 'agosto', 'septiembre', 'octubre',
+ 'noviembre', 'diciembre'
+);
+
+@MONTH_NAMES_NO =
+(
+
+ 'januar', 'februar', 'mars', 'april', 'mai',
+ 'juni', 'juli', 'august', 'september', 'oktober',
+ 'november', 'desember'
+);
+
+@MONTH_NAMES_PT =
+(
+ 'Janeiro', 'Fevereiro', 'Mar&ccedil;o', 'Abril', 'Maio',
+ 'Junho', 'Julho', 'Agosto', 'Setembro', 'Outubro',
+ 'Novembro', 'Dezembro'
+);
+
+
+$MONTH_NAMES =
+{
+    'en' => \@MONTH_NAMES_EN,
+    'de' => \@MONTH_NAMES_DE,
+    'es' => \@MONTH_NAMES_ES,
+    'nl' => \@MONTH_NAMES_NL,
+    'no' => \@MONTH_NAMES_NO,
+    'pt' => \@MONTH_NAMES_PT
+};
+########################################################################
+# Control of Page layout:
+# You can make changes of the Page layout at two levels:
+# 1.) For small changes, it is often enough to change the value of
+#     some global string/hash/array variables
+# 2.) For larger changes, reimplement one of the T2H_DEFAULT_<fnc>* routines,
+#     give them another name, and assign them to the respective
+#     $T2H_<fnc> variable.
+
+# As a general interface, the hashes T2H_HREF, T2H_NAME, T2H_NODE hold 
+# href, html-name, node-name of
+# This     -- current section (resp. html page)
+# Top      -- top page ($T2H_TOP_FILE)
+# Contents -- Table of contents
+# Overview -- Short table of contents
+# Index    -- Index page
+# About    -- page which explain "navigation buttons"
+# First    -- first node 
+# Last     -- last node
+#
+# Whether or not the following hash values are set, depends on the context 
+# (all values are w.r.t. 'This' section)
+# Next        -- next node of texinfo
+# Prev        -- previous node of texinfo
+# Up          -- up node of texinfo
+# Forward     -- next node in reading order
+# Back        -- previous node in reading order
+# FastForward -- if leave node, up and next, else next node
+# FastBackward-- if leave node, up and prev, else prev node
+#
+# Furthermore, the following global variabels are set:
+# $T2H_THISDOC{title}     -- title as set by @setttile
+# $T2H_THISDOC{fulltitle} -- full title as set by @title...
+# $T2H_THISDOC{subtitle}  -- subtitle as set by @subtitle
+# $T2H_THISDOC{author}    -- author as set by @author
+# 
+# and pointer to arrays of lines which need to be printed by t2h_print_lines 
+# $T2H_OVERVIEW      -- lines of short table of contents
+# $T2H_TOC           -- lines of table of contents
+# $T2H_TOP           -- lines of Top texinfo node 
+# $T2H_THIS_SECTION  -- lines of 'This' section
+
+#
+# There are the following subs which control the layout:
+#
+$T2H_print_section            = \&T2H_DEFAULT_print_section;
+$T2H_print_Top_header         = \&T2H_DEFAULT_print_Top_header;       
+$T2H_print_Top_footer        = \&T2H_DEFAULT_print_Top_footer;       
+$T2H_print_Top               = \&T2H_DEFAULT_print_Top;              
+$T2H_print_Toc               = \&T2H_DEFAULT_print_Toc;              
+$T2H_print_Overview          = \&T2H_DEFAULT_print_Overview;         
+$T2H_print_Footnotes         = \&T2H_DEFAULT_print_Footnotes;        
+$T2H_print_About             = \&T2H_DEFAULT_print_About;            
+$T2H_print_misc_header       = \&T2H_DEFAULT_print_misc_header;      
+$T2H_print_misc_footer       = \&T2H_DEFAULT_print_misc_footer;      
+$T2H_print_misc                      = \&T2H_DEFAULT_print_misc;
+$T2H_print_chapter_header     = \&T2H_DEFAULT_print_chapter_header;      
+$T2H_print_chapter_footer     = \&T2H_DEFAULT_print_chapter_footer;      
+$T2H_print_page_head         = \&T2H_DEFAULT_print_page_head;        
+$T2H_print_page_foot         = \&T2H_DEFAULT_print_page_foot;        
+$T2H_print_head_navigation    = \&T2H_DEFAULT_print_head_navigation;  
+$T2H_print_foot_navigation    = \&T2H_DEFAULT_print_foot_navigation;  
+$T2H_button_icon_img         = \&T2H_DEFAULT_button_icon_img;        
+$T2H_print_navigation        = \&T2H_DEFAULT_print_navigation;       
+$T2H_about_body                      = \&T2H_DEFAULT_about_body;            
+$T2H_print_frame              = \&T2H_DEFAULT_print_frame;
+$T2H_print_toc_frame          = \&T2H_DEFAULT_print_toc_frame;
+
+########################################################################
+# Layout for html for every sections
+#
+sub T2H_DEFAULT_print_section
+{
+  my $fh = shift;
+  local $T2H_BUTTONS = \@T2H_SECTION_BUTTONS;
+  &$T2H_print_head_navigation($fh) if $T2H_SECTION_NAVIGATION;
+  my $nw = t2h_print_lines($fh);
+  if ($T2H_SPLIT eq 'section' && $T2H_SECTION_NAVIGATION)
+  {
+    &$T2H_print_foot_navigation($fh, $nw);
+  }
+  else
+  {
+    print $fh '<HR SIZE="6">' . "\n";
+  }
+}
+
+###################################################################
+# Layout of top-page I recommend that you use @ifnothtml, @ifhtml,
+# @html within the Top texinfo node to specify content of top-level
+# page. 
+#
+# If you enclose everything in @ifnothtml, then title, subtitle,
+# author and overview is printed
+# T2H_HREF of Next, Prev, Up, Forward, Back are not defined
+# if $T2H_SPLIT then Top page is in its own html file
+sub T2H_DEFAULT_print_Top_header
+{
+  &$T2H_print_page_head(@_) if $T2H_SPLIT;
+  t2h_print_label(@_); # this needs to be called, otherwise no label set
+  &$T2H_print_head_navigation(@_);
+}
+sub T2H_DEFAULT_print_Top_footer
+{
+  &$T2H_print_foot_navigation(@_);
+  &$T2H_print_page_foot(@_) if $T2H_SPLIT; 
+}
+sub T2H_DEFAULT_print_Top
+{
+  my $fh = shift;
+
+  # for redefining navigation buttons use:
+  # local $T2H_BUTTONS = [...];
+  # as it is, 'Top', 'Contents', 'Index', 'About' are printed
+  local $T2H_BUTTONS = \@T2H_MISC_BUTTONS;
+  &$T2H_print_Top_header($fh);
+  if ($T2H_THIS_SECTION)
+  {
+    # if top-level node has content, then print it with extra header
+    print $fh "<H1>$T2H_NAME{Top}</H1>"
+      unless ($T2H_HAS_TOP_HEADING);
+    t2h_print_lines($fh, $T2H_THIS_SECTION)
+  }
+  else
+  {
+    # top-level node is fully enclosed in @ifnothtml
+    # print fulltitle, subtitle, author, Overview
+    print $fh 
+      "<CENTER>\n<H1>" .
+      join("</H1>\n<H1>", split(/\n/,  $T2H_THISDOC{fulltitle})) .
+      "</H1>\n";
+    print $fh "<H2>$T2H_THISDOC{subtitle}</H2>\n" if $T2H_THISDOC{subtitle};
+    print $fh "$T2H_THISDOC{author}\n" if $T2H_THISDOC{author};
+    print $fh <<EOT;
+</CENTER>
+<HR>
+<P></P>  
+<H2> Overview: </H2>
+<BLOCKQUOTE>  
+EOT
+    t2h_print_lines($fh, $T2H_OVERVIEW);
+    print $fh "</BLOCKQUOTE>\n";
+  }
+  &$T2H_print_Top_footer($fh);
+}
+
+###################################################################
+# Layout of Toc, Overview, and Footnotes pages
+# By default, we use "normal" layout 
+# T2H_HREF of Next, Prev, Up, Forward, Back, etc are not defined
+# use: local $T2H_BUTTONS = [...] to redefine navigation buttons
+sub T2H_DEFAULT_print_Toc
+{
+  return &$T2H_print_misc(@_);
+}
+sub T2H_DEFAULT_print_Overview
+{
+  return &$T2H_print_misc(@_);
+}
+sub T2H_DEFAULT_print_Footnotes
+{
+  return &$T2H_print_misc(@_);
+}
+sub T2H_DEFAULT_print_About
+{
+  return &$T2H_print_misc(@_);
+}
+
+sub T2H_DEFAULT_print_misc_header
+{
+  &$T2H_print_page_head(@_) if $T2H_SPLIT;
+  # this needs to be called, otherwise, no labels are set
+  t2h_print_label(@_); 
+  &$T2H_print_head_navigation(@_);
+}
+sub T2H_DEFAULT_print_misc_footer
+{
+  &$T2H_print_foot_navigation(@_);
+  &$T2H_print_page_foot(@_) if $T2H_SPLIT; 
+}
+sub T2H_DEFAULT_print_misc
+{
+  my $fh = shift;
+  local $T2H_BUTTONS = \@T2H_MISC_BUTTONS;
+  &$T2H_print_misc_header($fh);
+  print $fh "<H1>$T2H_NAME{This}</H1>\n";
+  t2h_print_lines($fh);
+  &$T2H_print_misc_footer($fh);
+}
+
+###################################################################
+# chapter_header and chapter_footer are only called if
+# T2H_SPLIT eq 'chapter'
+# chapter_header: after print_page_header, before print_section
+# chapter_footer: after print_section of last section, before print_page_footer
+# 
+# If you want to get rid of navigation stuff after each section,
+# redefine print_section such that it does not call print_navigation,
+# and put print_navigation into print_chapter_header
+@T2H_CHAPTER_BUTTONS =
+  (
+   'FastBack', 'FastForward', ' ', 
+   ' ', ' ', ' ', ' ',
+   'Top', 'Contents', 'Index', 'About', 
+  );
+
+sub T2H_DEFAULT_print_chapter_header
+{
+  # nothing to do there, by default
+  if (! $T2H_SECTION_NAVIGATION)
+  {
+    my $fh = shift;
+    local $T2H_BUTTONS = \@T2H_CHAPTER_BUTTONS;
+    &$T2H_print_navigation($fh);
+    print $fh "\n<HR SIZE=2>\n";
+  }
+}
+
+sub T2H_DEFAULT_print_chapter_footer
+{
+  local $T2H_BUTTONS = \@T2H_CHAPTER_BUTTONS;
+  &$T2H_print_navigation(@_);
+}
+###################################################################
+$T2H_TODAY = &pretty_date;             # like "20 September 1993"
+
+sub pretty_date {
+    local($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst);
+
+    ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = localtime(time);
+    $year += ($year < 70) ? 2000 : 1900;
+    # obachman: Let's do it as the Americans do
+    return($MONTH_NAMES->{$T2H_LANG}[$mon] . ", " . $mday . " " . $year);
+}
+
+
+###################################################################
+# Layout of standard header and footer
+#
+
+# Set the default body text, inserted between <BODY ... > 
+###$T2H_BODYTEXT = 'LANG="EN" BGCOLOR="#FFFFFF" TEXT="#000000" LINK="#0000FF" VLINK="#800080" ALINK="#FF0000"';
+$T2H_BODYTEXT = 'LANG="' . $T2H_LANG . '" BGCOLOR="#FFFFFF" TEXT="#000000" LINK="#0000FF" VLINK="#800080" ALINK="#FF0000"';
+# text inserted after <BODY ...>
+$T2H_AFTER_BODY_OPEN = '';
+#text inserted before </BODY>
+$T2H_PRE_BODY_CLOSE = '';
+# this is used in footer
+$T2H_ADDRESS = "by <I>$T2H_USER</I> " if $T2H_USER;
+$T2H_ADDRESS .= "on <I>$T2H_TODAY</I>";
+# this is added inside <HEAD></HEAD> after <TITLE> and some META NAME stuff
+# can be used for <style> <script>, <meta> tags
+$T2H_EXTRA_HEAD = '';
+
+sub T2H_DEFAULT_print_page_head
+{
+  my $fh = shift; 
+  my $longtitle = "$T2H_THISDOC{title}: $T2H_NAME{This}";
+  print $fh <<EOT;
+<HTML>
+$T2H_DOCTYPE
+<!-- Created on $T2H_TODAY by $THISPROG -->
+<!-- 
+$T2H_AUTHORS 
+-->
+<HEAD>
+<TITLE>$longtitle</TITLE>
+
+<META NAME="description" CONTENT="$longtitle">
+<META NAME="keywords" CONTENT="$longtitle">
+<META NAME="resource-type" CONTENT="document">
+<META NAME="distribution" CONTENT="global">
+<META NAME="Generator" CONTENT="$THISPROG">
+$T2H_EXTRA_HEAD
+</HEAD>
+
+<BODY $T2H_BODYTEXT>
+$T2H_AFTER_BODY_OPEN
+EOT
+}
+
+sub T2H_DEFAULT_print_page_foot
+{
+  my $fh = shift;
+  print $fh <<EOT;
+<BR>  
+<FONT SIZE="-1">
+This document was generated
+$T2H_ADDRESS
+using <A HREF="$T2H_HOMEPAGE"><I>texi2html</I></A>
+$T2H_PRE_BODY_CLOSE
+</BODY>
+</HTML>
+EOT
+}
+
+###################################################################
+# Layout of navigation panel
+
+# if this is set, then a vertical navigation panel is used
+$T2H_VERTICAL_HEAD_NAVIGATION = 0;
+sub T2H_DEFAULT_print_head_navigation
+{
+  my $fh = shift;
+  if ($T2H_VERTICAL_HEAD_NAVIGATION)
+  {
+    print $fh <<EOT;
+<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="0">
+<TR VALIGN="TOP">
+<TD ALIGN="LEFT">
+EOT
+  }
+  &$T2H_print_navigation($fh, $T2H_VERTICAL_HEAD_NAVIGATION);
+  if ($T2H_VERTICAL_HEAD_NAVIGATION)
+  {
+    print $fh <<EOT;
+</TD>
+<TD ALIGN="LEFT">
+EOT
+  }
+  elsif ($T2H_SPLIT eq 'section')
+  {
+    print $fh "<HR SIZE=1>\n";
+  }
+}
+
+# Specifies the minimum page length required before a navigation panel
+# is placed at the bottom of a page (the default is that of latex2html)
+# T2H_THIS_WORDS_IN_PAGE holds number of words of current page
+$T2H_WORDS_IN_PAGE = 300;
+sub T2H_DEFAULT_print_foot_navigation
+{
+  my $fh = shift;
+  my $nwords = shift;
+  if ($T2H_VERTICAL_HEAD_NAVIGATION)
+  {
+    print $fh <<EOT;
+</TD>
+</TR>
+</TABLE>
+EOT
+  }
+  print $fh "<HR SIZE=1>\n";
+  &$T2H_print_navigation($fh) if ($nwords >= $T2H_WORDS_IN_PAGE)
+}
+
+######################################################################
+# navigation panel
+#
+# specify in this array which "buttons" should appear in which order
+# in the navigation panel for sections; use ' ' for empty buttons (space)
+@T2H_SECTION_BUTTONS =
+  (
+   'Back', 'Forward', ' ', 'FastBack', 'Up', 'FastForward',  
+   ' ', ' ', ' ', ' ',
+   'Top', 'Contents', 'Index', 'About', 
+  );
+
+# buttons for misc stuff
+@T2H_MISC_BUTTONS = ('Top', 'Contents', 'Index', 'About');
+
+# insert here name of icon images for buttons 
+# Icons are used, if $T2H_ICONS and resp. value are set
+%T2H_ACTIVE_ICONS =
+  (
+   'Top',      '',
+   'Contents', '',
+   'Overview', '',
+   'Index',    '',
+   'Back',     '',
+   'FastBack', '',
+   'Prev',     '',
+   'Up',       '',
+   'Next',     '',
+   'Forward',  '',
+   'FastForward', '',
+   'About' ,    '',
+   'First',    '',
+   'Last',     '',
+   ' ',        ''
+  );
+
+# insert here name of icon images for these, if button is inactive
+%T2H_PASSIVE_ICONS =
+  (
+   'Top',      '',
+   'Contents', '',
+   'Overview', '',
+   'Index',    '',
+   'Back',     '',
+   'FastBack', '',
+   'Prev',     '',
+   'Up',       '',
+   'Next',     '',
+   'Forward',  '',
+   'FastForward', '',
+   'About',     '',
+   'First',    '',
+   'Last',     '',
+  );
+
+# how to create IMG tag
+sub T2H_DEFAULT_button_icon_img
+{
+  my $button = shift;
+  my $icon = shift;
+  my $name = shift;
+  return qq{<IMG SRC="$icon" BORDER="0" ALT="$button: $name" ALIGN="MIDDLE">};
+}
+
+# Names of text as alternative for icons
+%T2H_NAVIGATION_TEXT =
+  (
+   'Top',      'Top',
+   'Contents', 'Contents',
+   'Overview', 'Overview',
+   'Index',    'Index',
+   ' ',        ' &nbsp; ',
+   'Back',     ' &lt; ',
+   'FastBack', ' &lt;&lt; ',
+   'Prev',     'Prev',
+   'Up',       ' Up ',
+   'Next',     'Next',
+   'Forward',  ' &gt; ',
+   'FastForward',  ' &gt;&gt; ',
+   'About',     ' ? ',
+   'First',    ' |&lt; ',
+   'Last',     ' &gt;| '
+  );
+
+sub T2H_DEFAULT_print_navigation
+{
+  my $fh = shift;
+  my $vertical = shift;
+  my $spacing = 1;
+  print $fh "<TABLE CELLPADDING=$spacing CELLSPACING=$spacing BORDER=0>\n";
+
+  print $fh "<TR>" unless $vertical;
+  for $button (@$T2H_BUTTONS)
+  {
+    print $fh qq{<TR VALIGN="TOP" ALIGN="LEFT">\n} if $vertical;
+    print $fh qq{<TD VALIGN="MIDDLE" ALIGN="LEFT">};
+
+    if (ref($button) eq 'CODE')
+    {
+      &$button($fh, $vertical);
+    }
+    elsif ($button eq ' ')
+    { # handle space button
+      print $fh 
+       $T2H_ICONS && $T2H_ACTIVE_ICONS{' '} ? 
+        &$T2H_button_icon_img($button, $T2H_ACTIVE_ICONS{' '}) :
+        $T2H_NAVIGATION_TEXT{' '};
+      next;
+    }
+    elsif ($T2H_HREF{$button})
+    { # button is active
+      print $fh   
+        $T2H_ICONS && $T2H_ACTIVE_ICONS{$button} ? # use icon ? 
+          t2h_anchor('', $T2H_HREF{$button},  # yes
+                   &$T2H_button_icon_img($button,
+                                       $T2H_ACTIVE_ICONS{$button},
+                                       $T2H_NAME{$button})) 
+        : # use text
+        "[" . 
+        t2h_anchor('', $T2H_HREF{$button}, $T2H_NAVIGATION_TEXT{$button}) .
+        "]";  
+    }
+    else
+    { # button is passive 
+      print $fh 
+       $T2H_ICONS && $T2H_PASSIVE_ICONS{$button} ?
+        &$T2H_button_icon_img($button,
+                              $T2H_PASSIVE_ICONS{$button},
+                              $T2H_NAME{$button}) :
+        
+        "[" . $T2H_NAVIGATION_TEXT{$button} . "]";
+    }
+    print $fh "</TD>\n";
+    print $fh "</TR>\n" if $vertical;
+  }
+  print $fh "</TR>" unless $vertical;
+  print $fh "</TABLE>\n";
+}
+
+######################################################################
+# Frames: this is from "Richard Y. Kim" <ryk@coho.net>
+# Should be improved to be more conforming to other _print* functions
+
+sub T2H_DEFAULT_print_frame
+{
+  my $fh = shift;
+  print $fh <<EOT;
+<HTML>
+<HEAD><TITLE>$T2H_THISDOC{title}</TITLE></HEAD>
+<FRAMESET cols="140,*"> 
+  <FRAME name=toc  src="$docu_toc_frame_file">
+  <FRAME name=main src="$docu_doc">
+</FRAMESET> 
+</HTML>
+EOT
+}
+
+sub T2H_DEFAULT_print_toc_frame
+{
+  my $fh = shift;
+  &$T2H_print_page_head($fh);
+  print $fh <<EOT;
+<H2>Content</H2>
+EOT
+  print $fh map {s/HREF=/target=\"main\" HREF=/; $_;} @stoc_lines;
+  print $fh "</BODY></HTML>\n";
+}
+
+######################################################################
+# About page
+#
+
+# T2H_PRE_ABOUT might be a function
+$T2H_PRE_ABOUT = <<EOT;
+This document was generated $T2H_ADDRESS
+using <A HREF="$T2H_HOMEPAGE"><I>texi2html</I></A>
+<P></P>  
+EOT
+$T2H_AFTER_ABOUT = '';
+
+sub T2H_DEFAULT_about_body
+{
+  my $about;
+  if (ref($T2H_PRE_ABOUT) eq 'CODE')
+  {
+    $about = &$T2H_PRE_ABOUT();
+  }
+  else
+  {
+    $about = $T2H_PRE_ABOUT;
+  }
+  $about .= <<EOT;
+The buttons in the navigation panels have the following meaning:
+<P></P>
+<table border = "1">
+<TR>
+<TH> Button </TH>
+<TH> Name </TH>
+<TH> Go to </TH>
+<TH> From 1.2.3 go to</TH>
+</TR>
+EOT
+  
+  for $button (@T2H_SECTION_BUTTONS)
+  {
+    next if $button eq ' ' || ref($button) eq 'CODE';
+    $about .= <<EOT;
+<TR>
+<TD ALIGN="CENTER">
+EOT
+    $about .=  
+      ($T2H_ICONS && $T2H_ACTIVE_ICONS{$button} ?
+       &$T2H_button_icon_img($button, $T2H_ACTIVE_ICONS{$button}) :
+       " [" . $T2H_NAVIGATION_TEXT{$button} . "] ");
+    $about .= <<EOT;
+</TD>
+<TD ALIGN="CENTER">
+$button
+</TD>
+<TD>
+$T2H_BUTTONS_GOTO{$button}
+</TD>
+<TD>
+$T2H_BUTTONS_EXAMPLE{$button}
+</TD>
+</TR>
+EOT
+  }
+
+  $about .= <<EOT;
+</TABLE>
+<P></P>
+where the <STRONG> Example </STRONG> assumes that the current position 
+is at <STRONG> Subsubsection One-Two-Three </STRONG> of a document of 
+the following structure:
+<UL>
+<LI> 1. Section One  </LI>
+<UL>
+<LI>1.1 Subsection One-One</LI>
+<UL>
+<LI> ... </LI>
+</UL>
+<LI>1.2 Subsection One-Two</LI>
+<UL>
+<LI>1.2.1 Subsubsection One-Two-One
+</LI><LI>1.2.2 Subsubsection One-Two-Two
+</LI><LI>1.2.3 Subsubsection One-Two-Three &nbsp; &nbsp; <STRONG>
+&lt;== Current Position </STRONG>
+</LI><LI>1.2.4 Subsubsection One-Two-Four
+</LI></UL>
+<LI>1.3 Subsection One-Three</LI>
+<UL>
+<LI> ... </LI>
+</UL>
+<LI>1.4 Subsection One-Four</LI>
+</UL>
+</UL>
+$T2H_AFTER_ABOUT
+EOT
+  return $about;  
+}
+
+  
+%T2H_BUTTONS_GOTO =
+  (
+   'Top',      'cover (top) of document',
+   'Contents', 'table of contents',
+   'Overview', 'short table of contents',
+   'Index',    'concept index',
+   'Back',     'previous section in reading order',
+   'FastBack', 'previous or up-and-previous section ',
+   'Prev',     'previous section same level',
+   'Up',       'up section',
+   'Next',     'next section same level',
+   'Forward',  'next section in reading order',
+   'FastForward', 'next or up-and-next section',
+   'About' ,    'this page',
+   'First',    'first section in reading order',
+   'Last',     'last section in reading order',
+  );
+
+%T2H_BUTTONS_EXAMPLE = 
+(
+   'Top',      ' &nbsp; ',
+   'Contents', ' &nbsp; ',
+   'Overview', ' &nbsp; ',
+   'Index',    ' &nbsp; ',
+   'Back',     '1.2.2',
+   'FastBack', '1.1',
+   'Prev',     '1.2.2',
+   'Up',       '1.2',
+   'Next',     '1.2.4',
+   'Forward',  '1.2.4',
+   'FastForward', '1.3',
+   'About',     ' &nbsp; ',
+   'First',    '1.',
+   'Last',     '1.2.4',
+);
+
+
+######################################################################
+# from here on, its l2h init stuff 
+#
+
+## initialization for latex2html as for Singular manual generation
+## obachman 3/99
+
+#
+# Options controlling Titles, File-Names, Tracing and Sectioning
+#
+$TITLE = '';
+
+$SHORTEXTN = 0;
+
+$LONG_TITLES = 0;
+
+$DESTDIR = ''; # should be overwritten by cmd-line argument
+
+$NO_SUBDIR = 0;# should be overwritten by cmd-line argument
+
+$PREFIX = '';  # should be overwritten by cmd-line argument
+
+$AUTO_PREFIX = 0; # this is needed, so that prefix settings are used
+
+$AUTO_LINK = 0; 
+
+$SPLIT = 0;
+
+$MAX_LINK_DEPTH = 0;
+
+$TMP = ''; # should be overwritten by cmd-line argument
+
+$DEBUG = 0;
+
+$VERBOSE = 1;
+
+#
+# Options controlling Extensions and Special Features 
+#
+$HTML_VERSION = "3.2";
+
+$TEXDEFS = 1; # we absolutely need that
+
+$EXTERNAL_FILE = '';
+
+$SCALABLE_FONTS = 1;
+
+$NO_SIMPLE_MATH = 1;
+
+$LOCAL_ICONS = 1;
+
+$SHORT_INDEX = 0;
+
+$NO_FOOTNODE = 1;
+
+$ADDRESS = '';
+
+$INFO = '';
+
+#
+# Switches controlling Image Generation 
+#
+$ASCII_MODE = 0;
+
+$NOLATEX = 0;
+
+$EXTERNAL_IMAGES = 0;
+
+$PS_IMAGES = 0;
+
+$NO_IMAGES = 0;
+
+$IMAGES_ONLY = 0;
+
+$REUSE = 2;
+
+$ANTI_ALIAS = 1;
+
+$ANTI_ALIAS_TEXT = 1;
+
+#
+#Switches controlling Navigation Panels
+#
+$NO_NAVIGATION = 1;
+$ADDRESS = '';
+$INFO = 0;              # 0 = do not make a "About this document..." section 
+
+#
+#Switches for Linking to other documents 
+#
+# actuall -- we don't care
+
+$MAX_SPLIT_DEPTH = 0;  # Stop making separate files at this depth
+
+$MAX_LINK_DEPTH = 0;    # Stop showing child nodes at this depth   
+
+$NOLATEX = 0;           # 1 = do not pass unknown environments to Latex
+
+$EXTERNAL_IMAGES = 0;   # 1 = leave the images outside the document 
+
+$ASCII_MODE = 0;        # 1 = do not use any icons or internal images
+
+# 1 =  use links to external postscript images rather than inlined bitmap
+# images.
+$PS_IMAGES = 0;
+$SHOW_SECTION_NUMBERS = 0;
+
+### Other global variables ###############################################
+$CHILDLINE = "";
+
+# This is the line width measured in pixels and it is used to right justify
+# equations and equation arrays; 
+$LINE_WIDTH = 500;             
+
+# Used in conjunction with AUTO_NAVIGATION
+$WORDS_IN_PAGE = 300;  
+
+# Affects ONLY the way accents are processed 
+$default_language = 'english'; 
+
+# The value of this variable determines how many words to use in each 
+# title that is added to the navigation panel (see below)
+# 
+$WORDS_IN_NAVIGATION_PANEL_TITLES = 0;
+
+# This number will determine the size of the equations, special characters,
+# and anything which will be converted into an inlined image
+# *except* "image generating environments" such as "figure", "table" 
+# or "minipage".
+# Effective values are those greater than 0.
+# Sensible values are between 0.1 - 4.
+$MATH_SCALE_FACTOR = 1.5;
+
+# This number will determine the size of 
+# image generating environments such as "figure", "table" or "minipage".
+# Effective values are those greater than 0.
+# Sensible values are between 0.1 - 4.
+$FIGURE_SCALE_FACTOR = 1.6;
+
+
+#  If both of the following two variables are set then the "Up" button
+#  of the navigation panel in the first node/page of a converted document
+#  will point to $EXTERNAL_UP_LINK. $EXTERNAL_UP_TITLE should be set
+#  to some text which describes this external link.
+$EXTERNAL_UP_LINK = "";
+$EXTERNAL_UP_TITLE = "";
+
+# If this is set then the resulting HTML will look marginally better if viewed 
+# with Netscape.
+$NETSCAPE_HTML = 1;
+
+# Valid paper sizes are "letter", "legal", "a4","a3","a2" and "a0"
+# Paper sizes has no effect other than in the time it takes to create inlined
+# images and in whether large images can be created at all ie
+#  - larger paper sizes *MAY* help with large image problems 
+#  - smaller paper sizes are quicker to handle
+$PAPERSIZE = "a4";
+
+# Replace "english" with another language in order to tell LaTeX2HTML that you 
+# want some generated section titles (eg "Table of Contents" or "References")
+# to appear in a different language. Currently only "english" and "french"
+# is supported but it is very easy to add your own. See the example in the
+# file "latex2html.config" 
+$TITLES_LANGUAGE = "english";
+
+1;     # This must be the last non-comment line
+
+# End File texi2html.init
+######################################################################
+
+
+require "$ENV{T2H_HOME}/texi2html.init" 
+  if ($0 =~ /\.pl$/ &&
+      -e "$ENV{T2H_HOME}/texi2html.init" && -r "$ENV{T2H_HOME}/texi2html.init");
+
+#+++############################################################################
+#                                                                              #
+# Initialization                                                               #
+# Pasted content of File $(srcdir)/MySimple.pm: Command-line processing        #
+#                                                                              #
+#---############################################################################
+
+# leave this within comments, and keep the require statement
+# This way, you can directly run texi2html.pl, if $ENV{T2H_HOME}/texi2html.init
+# exists.
+
+# 
+package Getopt::MySimple;
+
+# Name:
+#      Getopt::MySimple.
+#
+# Documentation:
+#      POD-style (incomplete) documentation is in file MySimple.pod
+#
+# Tabs:
+#      4 spaces || die.
+#
+# Author:
+#      Ron Savage      rpsavage@ozemail.com.au.
+#      1.00    19-Aug-97       Initial version.
+#      1.10    13-Oct-97       Add arrays of switches (eg '=s@').
+#      1.20     3-Dec-97       Add 'Help' on a per-switch basis.
+#      1.30    11-Dec-97       Change 'Help' to 'verbose'. Make all hash keys lowercase.
+#      1.40    10-Nov-98       Change width of help report. Restructure tests.
+#               1-Jul-00        Modifications for Texi2html
+
+# --------------------------------------------------------------------------
+# Locally modified by obachman (Display type instead of env, order by cmp)
+# $Id: MySimple.pm,v 1.1 2000/07/03 08:44:13 obachman Exp $
+
+# use strict;
+# no strict 'refs';
+
+use vars qw(@EXPORT @EXPORT_OK @ISA);
+use vars qw($fieldWidth $opt $VERSION);
+
+use Exporter();
+use Getopt::Long;
+
+@ISA           = qw(Exporter);
+@EXPORT                = qw();
+@EXPORT_OK     = qw($opt);     # An alias for $self -> {'opt'}.
+
+# --------------------------------------------------------------------------
+
+$fieldWidth    = 20;
+$VERSION       = '1.41';
+
+# --------------------------------------------------------------------------
+
+sub byOrder
+{
+       my($self) = @_;
+       
+       return uc($a) cmp (uc($b));
+}
+
+# --------------------------------------------------------------------------
+
+sub dumpOptions
+{
+       my($self) = @_;
+
+       print 'Option', ' ' x ($fieldWidth - length('Option') ), "Value\n";
+
+       for (sort byOrder keys(%{$self -> {'opt'} }) )
+       {
+         print "-$_", ' ' x ($fieldWidth - (1 + length) ), "${$self->{'opt'} }{$_}\n";
+       }
+
+       print "\n";
+
+}      # End of dumpOptions.
+
+# --------------------------------------------------------------------------
+# Return:
+#      0 -> Error.
+#      1 -> Ok.
+
+sub getOptions
+{
+       push(@_, 0) if ($#_ == 2);      # Default for $ignoreCase is 0.
+       push(@_, 1) if ($#_ == 3);      # Default for $helpThenExit is 1.
+
+       my($self, $default, $helpText, $versionText, 
+          $helpThenExit, $versionThenExit, $ignoreCase) = @_;
+       
+       $helpThenExit = 1 unless (defined($helpThenExit));
+       $versionThenExit = 1 unless (defined($versionThenExit));
+       $ignoreCase = 0 unless (defined($ignoreCase));
+
+       $self -> {'default'}            = $default;
+       $self -> {'helpText'}           = $helpText;
+       $self -> {'versionText'}        = $versionText;
+       $Getopt::Long::ignorecase       = $ignoreCase;
+
+       unless (defined($self -> {'default'}{'help'}))
+       {
+         $self -> {'default'}{'help'} = 
+         { 
+          type => ':i', 
+          default => '',
+          linkage => sub {$self->helpOptions($_[1]); exit (0) if $helpThenExit;},
+          verbose => "print help and exit"
+         };
+       }
+
+       unless (defined($self -> {'default'}{'version'}))
+       {
+         $self -> {'default'}{'version'} = 
+         { 
+          type => '', 
+          default => '',
+          linkage => sub {print $self->{'versionText'};  exit (0) if versionTheExit;},
+          verbose => "print version and exit"
+         };
+       }
+
+       for (keys(%{$self -> {'default'} }) )
+       {
+         my $type = ${$self -> {'default'} }{$_}{'type'};
+         push(@{$self -> {'type'} }, "$_$type");
+         $self->{'opt'}->{$_} =  ${$self -> {'default'} }{$_}{'linkage'}
+            if ${$self -> {'default'} }{$_}{'linkage'};
+       }
+
+       my($result) = &GetOptions($self -> {'opt'}, @{$self -> {'type'} });
+
+        return $result unless $result;
+
+       for (keys(%{$self -> {'default'} }) )
+       {
+          if (! defined(${$self -> {'opt'} }{$_})) #{
+            {
+            ${$self -> {'opt'} }{$_} = ${$self -> {'default'} }{$_}{'default'};
+            }
+       }
+
+       $result;
+}      # End of getOptions.
+
+# --------------------------------------------------------------------------
+
+sub helpOptions
+{
+       my($self) = shift;
+       my($noHelp) = shift;
+       $noHelp = 0 unless $noHelp;
+       my($optwidth, $typewidth, $defaultwidth, $maxlinewidth, $valind, $valwidth) 
+         = (10, 5, 9, 78, 4, 11);
+
+       print "$self->{'helpText'}" if ($self -> {'helpText'});
+
+       print ' Option', ' ' x ($optwidth - length('Option') -1 ),
+               'Type', ' ' x ($typewidth - length('Type') + 1),
+               'Default', ' ' x ($defaultwidth - length('Default') ),
+               "Description\n";
+
+       for (sort byOrder keys(%{$self -> {'default'} }) )
+       {
+         my($line, $help, $option, $val);
+         $option = $_;
+         next if ${$self->{'default'} }{$_}{'noHelp'} && ${$self->{'default'} }{$_}{'noHelp'} > $noHelp;
+               $line = " -$_ " . ' ' x ($optwidth - (2 + length) ) .
+                       "${$self->{'default'} }{$_}{'type'} ".
+                       ' ' x ($typewidth - (1+length(${$self -> {'default'} }{$_}{'type'}) ));
+
+                 $val = ${$self->{'default'} }{$_}{'linkage'};
+                if ($val)
+                {
+                  if (ref($val) eq 'SCALAR')
+                 {
+                   $val = $$val; 
+                 }
+                 else
+                 {
+                   $val = '';
+                 }
+                }
+               else
+               {
+                 $val = ${$self->{'default'} }{$_}{'default'};
+               }
+               $line .= "$val  ";
+               $line .= ' ' x ($optwidth + $typewidth + $defaultwidth + 1 - length($line));
+               
+               if (defined(${$self -> {'default'} }{$_}{'verbose'}) &&
+                 ${$self -> {'default'} }{$_}{'verbose'} ne '')
+             {
+               $help = "${$self->{'default'} }{$_}{'verbose'}";
+             }
+             else
+             {
+               $help = ' ';
+             }
+             if ((length("$line") + length($help)) < $maxlinewidth)
+             {
+               print $line , $help, "\n";
+             }
+             else
+             {
+               print $line, "\n", ' ' x $valind, $help, "\n";
+             }
+             for $val (sort byOrder keys(%{${$self->{'default'}}{$option}{'values'}}))
+             {
+               print ' ' x ($valind + 2);
+               print $val, '  ', ' ' x ($valwidth - length($val) - 2);
+               print ${$self->{'default'}}{$option}{'values'}{$val}, "\n";
+             }
+       }
+
+       print <<EOT;
+Note: 'Options' may be abbreviated. 'Type' specifications mean:
+ <none>| !    no argument: variable is set to 1 on -foo (or, to 0 on -nofoo)
+    =s | :s   mandatory (or, optional)  string argument
+    =i | :i   mandatory (or, optional)  integer argument
+EOT
+}      # End of helpOptions.
+
+#-------------------------------------------------------------------
+
+sub new
+{
+       my($class)                              = @_;
+       my($self)                               = {};
+       $self -> {'default'}    = {};
+       $self -> {'helpText'}   = '';
+       $self -> {'opt'}                = {};
+       $opt                                    = $self -> {'opt'};      # An alias for $self -> {'opt'}.
+       $self -> {'type'}               = ();
+
+       return bless $self, $class;
+
+}      # End of new.
+
+# --------------------------------------------------------------------------
+
+1;
+
+# End MySimple.pm
+
+require "$ENV{T2H_HOME}/MySimple.pm" 
+  if ($0 =~ /\.pl$/ &&
+      -e "$ENV{T2H_HOME}/texi2html.init" && -r "$ENV{T2H_HOME}/texi2html.init");
+
+package main;
+
+#+++############################################################################
+#                                                                              #
+# Constants                                                                    #
+#                                                                              #
+#---############################################################################
+
+$DEBUG_TOC   =  1;
+$DEBUG_INDEX =  2;
+$DEBUG_BIB   =  4;
+$DEBUG_GLOSS =  8;
+$DEBUG_DEF   = 16;
+$DEBUG_HTML  = 32;
+$DEBUG_USER  = 64;
+$DEBUG_L2H   = 128;
+
+
+$BIBRE = '\[[\w\/-]+\]';               # RE for a bibliography reference
+$FILERE = '[\/\w.+-]+';                        # RE for a file name
+$VARRE = '[^\s\{\}]+';                 # RE for a variable name
+$NODERE = '[^,:]+';                    # RE for a node name
+$NODESRE = '[^:]+';                    # RE for a list of node names
+
+$ERROR = "***";                                # prefix for errors 
+$WARN  = "**";                          # prefix for warnings
+  
+                                        # program home page
+$PROTECTTAG = "_ThisIsProtected_";     # tag to recognize protected sections
+
+$CHAPTEREND = "<!-- End chapter -->\n"; # to know where a chpater ends
+$SECTIONEND = "<!-- End section -->\n"; # to know where section ends
+$TOPEND     = "<!-- End top     -->\n"; # to know where top ends
+
+  
+
+#
+# pre-defined indices
+#
+$index_properties =
+{
+ 'c' => { name => 'cp'},
+ 'f' => { name => 'fn', code => 1},
+ 'v' => { name => 'vr', code => 1},
+ 'k' => { name => 'ky', code => 1},
+ 'p' => { name => 'pg', code => 1},
+ 't' => { name => 'tp', code => 1}
+};
+
+
+%predefined_index = (
+                   'cp', 'c',
+                   'fn', 'f',
+                   'vr', 'v',
+                   'ky', 'k',
+                   'pg', 'p',
+                   'tp', 't',
+                   );
+
+#
+# valid indices
+#
+%valid_index = (
+                   'c', 1,
+                   'f', 1,
+                   'v', 1,
+                   'k', 1,
+                   'p', 1,
+                   't', 1,
+               );
+
+#
+# texinfo section names to level
+#
+%sec2level = (
+             'top', 0,
+             'chapter', 1,
+             'unnumbered', 1,
+             'majorheading', 1,
+             'chapheading', 1,
+             'appendix', 1,
+             'section', 2,
+             'unnumberedsec', 2,
+             'heading', 2,
+             'appendixsec', 2,
+             'appendixsection', 2,
+             'subsection', 3,
+             'unnumberedsubsec', 3,
+             'subheading', 3,
+             'appendixsubsec', 3,
+             'subsubsection', 4,
+             'unnumberedsubsubsec', 4,
+             'subsubheading', 4,
+             'appendixsubsubsec', 4,
+             );
+
+#
+# accent map, TeX command to ISO name
+#
+%accent_map = (
+              '"',  'uml',
+              '~',  'tilde',
+              '^',  'circ',
+              '`',  'grave',
+              '\'', 'acute',
+              );
+
+#
+# texinfo "simple things" (@foo) to HTML ones
+#
+%simple_map = (
+              # cf. makeinfo.c
+              "*", "<BR>",             # HTML+
+              " ", " ",
+              "\t", " ",
+              "-", "&#173;",   # soft hyphen
+              "\n", "\n",
+              "|", "",
+              'tab', '<\/TD><TD>',
+              # spacing commands
+              ":", "",
+              "!", "!",
+              "?", "?",
+              ".", ".",
+              "-", "",
+              );
+
+#
+# texinfo "things" (@foo{}) to HTML ones
+#
+%things_map = (
+              'TeX', 'TeX',
+              'br', '<P>',             # paragraph break
+              'bullet', '*',
+              'copyright', '(C)',
+              'dots', '<small>...<\/small>',
+              'enddots', '<small>....<\/small>',
+              'equiv', '==',
+              'error', 'error-->',
+              'expansion', '==>',
+              'minus', '-',
+              'point', '-!-',
+              'print', '-|',
+              'result', '=>',
+              'today', $T2H_TODAY,
+              'aa', '&aring;',
+              'AA', '&Aring;',
+              'ae', '&aelig;',
+              'oe', '&#156;',
+              'AE', '&AElig;',
+              'OE', '&#140;',
+              'o',  '&oslash;',
+              'O',  '&Oslash;',
+              'ss', '&szlig;',
+              'l', '\/l',
+              'L', '\/L',
+              'exclamdown', '&iexcl;',
+              'questiondown', '&iquest;',
+              'pounds', '&pound;'
+              );
+
+#
+# texinfo styles (@foo{bar}) to HTML ones
+#
+%style_map = (
+             'acronym', '&do_acronym',
+             'asis', '',
+             'b', 'B',
+             'cite', 'CITE',
+             'code', 'CODE',
+             'command', 'CODE',
+             'ctrl', '&do_ctrl',       # special case
+             'dfn', 'EM',              # DFN tag is illegal in the standard
+             'dmn', '',                # useless
+             'email', '&do_email',     # insert a clickable email address
+             'emph', 'EM',
+             'env', 'CODE',
+             'file', '"TT',            # will put quotes, cf. &apply_style
+             'i', 'I',
+             'kbd', 'KBD',
+             'key', 'KBD',
+             'math', '&do_math',
+             'option', '"SAMP',        # will put quotes, cf. &apply_style
+             'r', '',                  # unsupported
+             'samp', '"SAMP',          # will put quotes, cf. &apply_style
+             'sc', '&do_sc',           # special case
+             'strong', 'STRONG',
+             't', 'TT',
+             'titlefont', '',          # useless
+             'uref', '&do_uref',       # insert a clickable URL
+             'url', '&do_url',         # insert a clickable URL
+             'var', 'VAR',
+             'w', '',                  # unsupported
+             'H', '&do_accent',
+             'dotaccent', '&do_accent',
+             'ringaccent','&do_accent',
+             'tieaccent', '&do_accent',
+             'u','&do_accent',
+             'ubaraccent','&do_accent',
+             'udotaccent','&do_accent',
+             'v', '&do_accent',
+             ',', '&do_accent',
+             'dotless', '&do_accent'
+             );
+
+#
+# texinfo format (@foo/@end foo) to HTML ones
+#
+%format_map = (
+              'quotation', 'BLOCKQUOTE',
+              # lists
+              'itemize', 'UL',
+              'enumerate', 'OL',
+              # poorly supported
+              'flushleft', 'PRE',
+              'flushright', 'PRE',
+              );
+
+#
+# an eval of these $complex_format_map->{what}->[0] yields beginning
+# an eval of these $complex_format_map->{what}->[1] yieleds end
+$complex_format_map =
+{
+ example => 
+ [
+  q{"<TABLE><tr>$T2H_EXAMPLE_INDENT_CELL<td class=example><pre>"},
+  q{'</pre></td></tr></table>'}
+ ],
+ smallexample => 
+ [
+  q{"<TABLE><tr>$T2H_SMALL_EXAMPLE_INDENT_CELL<td class=smallexample><FONT SIZE=$T2H_SMALL_FONT_SIZE><pre>"},
+  q{'</FONT></pre></td></tr></table>'}
+ ],
+ display =>
+ [
+  q{"<TABLE><tr>$T2H_EXAMPLE_INDENT_CELL<td class=display><pre " . 'style="font-family: serif">'},
+  q{'</pre></td></tr></table>'}
+ ],
+ smalldisplay =>
+ [
+  q{"<TABLE><tr>$T2H_SMALL_EXAMPLE_INDENT_CELL<td class=smalldisplay><FONT SIZE=$T2H_SMALL_FONT_SIZE><pre " . 'style="font-family: serif">'},
+  q{'</pre></FONT></td></tr></table>'}
+ ]
+};
+
+$complex_format_map->{lisp} = $complex_format_map->{example};
+$complex_format_map->{smalllisp} = $complex_format_map->{smallexample};
+$complex_format_map->{format} = $complex_format_map->{display};
+$complex_format_map->{smallformat} = $complex_format_map->{smalldisplay};
+
+#
+# texinfo definition shortcuts to real ones
+#
+%def_map = (
+           # basic commands
+           'deffn', 0,
+           'defvr', 0,
+           'deftypefn', 0,
+           'deftypevr', 0,
+           'defcv', 0,
+           'defop', 0,
+           'deftp', 0,
+           # basic x commands
+           'deffnx', 0,
+           'defvrx', 0,
+           'deftypefnx', 0,
+           'deftypevrx', 0,
+           'defcvx', 0,
+           'defopx', 0,
+           'deftpx', 0,
+           # shortcuts
+           'defun', 'deffn Function',
+           'defmac', 'deffn Macro',
+           'defspec', 'deffn {Special Form}',
+           'defvar', 'defvr Variable',
+           'defopt', 'defvr {User Option}',
+           'deftypefun', 'deftypefn Function',
+           'deftypevar', 'deftypevr Variable',
+           'defivar', 'defcv {Instance Variable}',
+           'deftypeivar', 'defcv {Instance Variable}', # NEW: FIXME
+           'defmethod', 'defop Method',
+           'deftypemethod', 'defop Method', # NEW:FIXME
+           # x shortcuts
+           'defunx', 'deffnx Function',
+           'defmacx', 'deffnx Macro',
+           'defspecx', 'deffnx {Special Form}',
+           'defvarx', 'defvrx Variable',
+           'defoptx', 'defvrx {User Option}',
+           'deftypefunx', 'deftypefnx Function',
+           'deftypevarx', 'deftypevrx Variable',
+           'defivarx', 'defcvx {Instance Variable}',
+           'defmethodx', 'defopx Method',
+           );
+
+#
+# things to skip
+#
+%to_skip = (
+           # comments
+           'c', 1,
+           'comment', 1,
+            'ifnotinfo', 1,
+            'ifnottex', 1,
+           'ifhtml', 1,
+           'end ifhtml', 1,
+            'end ifnotinfo', 1,
+            'end ifnottex', 1,
+           # useless
+           'detailmenu', 1,
+            'direntry', 1,
+           'contents', 1,
+           'shortcontents', 1,
+           'summarycontents', 1,
+           'footnotestyle', 1,
+           'end ifclear', 1,
+           'end ifset', 1,
+           'titlepage', 1,
+           'end titlepage', 1,
+           # unsupported commands (formatting)
+           'afourpaper', 1,
+           'cropmarks', 1,
+           'finalout', 1,
+           'headings', 1,
+            'sp', 1,
+           'need', 1,
+           'page', 1,
+           'setchapternewpage', 1,
+           'everyheading', 1,
+           'everyfooting', 1,
+           'evenheading', 1,
+           'evenfooting', 1,
+           'oddheading', 1,
+           'oddfooting', 1,
+           'smallbook', 1,
+           'vskip', 1,
+           'filbreak', 1,
+           'paragraphindent', 1,
+           # unsupported formats
+           'cartouche', 1,
+           'end cartouche', 1,
+           'group', 1,
+           'end group', 1,
+           );
+
+#+++############################################################################
+#                                                                              #
+# Argument parsing, initialisation                                             #
+#                                                                              #
+#---############################################################################
+
+#
+# flush stdout and stderr after every write
+#
+select(STDERR);
+$| = 1;
+select(STDOUT);
+$| = 1;
+
+
+%value = ();                           # hold texinfo variables, see also -D
+$use_bibliography = 1;
+$use_acc = 1;
+
+#
+# called on -init-file
+sub LoadInitFile
+{
+  my $init_file = shift;
+  # second argument is value of options
+  $init_file = shift;
+  if (-f $init_file)
+  {
+    print "# reading initialization file from $init_file\n" 
+      if ($T2H_VERBOSE);
+    require($init_file);
+  }
+  else
+  {
+    print "$ERROR Error: can't read init file $int_file\n";
+    $init_file = '';
+  }
+}
+
+#
+# called on -lang
+sub SetDocumentLanguage
+{
+  my $lang = shift;
+  if (! exists($T2H_WORDS->{$lang}))
+  {
+    warn "$ERROR: Language specs for '$lang' do not exists. Reverting to '" . 
+      ($T2H_LANG ? T2H_LANG : "en") . "'\n";
+  }
+  else
+  {
+    print "# using '$lang' as document language\n" if ($T2H_VERBOSE);
+    $T2H_LANG = $lang;
+  }
+}
+
+##
+## obsolete cmd line options
+##
+$T2H_OBSOLETE_OPTIONS -> {'no-section_navigation'} =
+{
+ type => '!',
+ linkage => sub {$main::T2H_SECTION_NAVIGATION = 0;},
+ verbose => 'obsolete, use -nosec_nav',
+ noHelp => 2,
+};
+$T2H_OBSOLETE_OPTIONS -> {use_acc} =
+{
+ type => '!',
+ linkage => \$use_acc,
+ verbose => 'obsolete',
+ noHelp => 2
+};
+$T2H_OBSOLETE_OPTIONS -> {expandinfo} =
+{
+ type => '!',
+ linkage => sub {$main::T2H_EXPAND = 'info';},
+ verbose => 'obsolete, use "-expand info" instead',
+ noHelp => 2,
+};
+$T2H_OBSOLETE_OPTIONS -> {expandtex} =
+{
+ type => '!',
+ linkage => sub {$main::T2H_EXPAND = 'tex';},
+ verbose => 'obsolete, use "-expand tex" instead',
+ noHelp => 2,
+};
+$T2H_OBSOLETE_OPTIONS -> {monolithic} =
+{
+ type => '!',
+ linkage => sub {$main::T2H_SPLIT = '';},
+ verbose => 'obsolete, use "-split no" instead',
+ noHelp => 2
+};
+$T2H_OBSOLETE_OPTIONS -> {split_node} =
+{
+ type => '!',
+ linkage => sub{$main::T2H_SPLIT = 'section';},
+ verbose => 'obsolete, use "-split section" instead',
+ noHelp => 2,
+};
+$T2H_OBSOLETE_OPTIONS -> {split_chapter} =
+{
+ type => '!',
+ linkage => sub{$main::T2H_SPLIT = 'chapter';},
+ verbose => 'obsolete, use "-split chapter" instead',
+ noHelp => 2,
+};
+$T2H_OBSOLETE_OPTIONS -> {no_verbose} =
+{
+ type => '!',
+ linkage => sub {$main::T2H_VERBOSE = 0;},
+ verbose => 'obsolete, use -noverbose instead',
+ noHelp => 2,
+};
+$T2H_OBSOLETE_OPTIONS -> {output_file} =
+{
+ type => '=s',
+ linkage => sub {$main::T2H_OUT = @_[1]; $T2H_SPLIT = '';},
+ verbose => 'obsolete, use -out_file instead',
+ noHelp => 2
+};
+
+$T2H_OBSOLETE_OPTIONS -> {section_navigation} =
+{
+ type => '!',
+ linkage => \$T2H_SECTION_NAVIGATION,
+ verbose => 'obsolete, use -sec_nav instead',
+ noHelp => 2,
+};
+
+$T2H_OBSOLETE_OPTIONS -> {verbose} =
+{
+ type => '!',
+ linkage => \$T2H_VERBOSE,
+ verbose => 'obsolete, use -Verbose instead',
+ noHelp => 2
+};
+
+# read initialzation from $sysconfdir/texi2htmlrc or $HOME/.texi2htmlrc
+my $home = $ENV{HOME};
+defined($home) or $home = '';
+foreach $i ('/usr/local/etc/texi2htmlrc', "$home/.texi2htmlrc") {
+    if (-f $i) {
+       print "# reading initialization file from $i\n" 
+           if ($T2H_VERBOSE);
+       require($i);
+    }
+}
+
+
+#+++############################################################################
+#                                                                              #
+# parse command-line options
+#                                                                              #
+#---############################################################################
+$T2H_USAGE_TEXT = <<EOT;
+Usage: texi2html  [OPTIONS] TEXINFO-FILE
+Translates Texinfo source documentation to HTML.
+EOT
+$T2H_FAILURE_TEXT = <<EOT;
+Try 'texi2html -help' for usage instructions.
+EOT
+$options = new Getopt::MySimple;
+
+# some older version of GetOpt::Long don't have 
+# Getopt::Long::Configure("pass_through")
+eval {Getopt::Long::Configure("pass_through");};
+$Configure_failed = $@ && <<EOT;
+**WARNING: Parsing of obsolete command-line options could have failed. 
+           Consider to use only documented command-line options (run
+           'texi2html -help 2' for a complete list) or upgrade to perl 
+           version 5.005 or higher.
+EOT
+
+if (! $options->getOptions($T2H_OPTIONS, $T2H_USAGE_TEXT, "$THISVERSION\n"))
+{
+  print $Configure_failed if $Configure_failed;
+  die $T2H_FAILURE_TEXT;
+}
+
+if (@ARGV > 1)
+{
+  eval {Getopt::Long::Configure("no_pass_through");};
+  if (! $options->getOptions($T2H_OBSOLETE_OPTIONS, $T2H_USAGE_TEXT, "$THISVERSION\n"))
+  {
+    print $Configure_failed if $Configure_failed;
+    die $T2H_FAILURE_TEXT;
+  }
+}
+
+if ($T2H_CHECK) {
+    die "Need file to check\n$T2H_FAILURE_TEXT" unless @ARGV > 0;
+    &check;
+    exit;
+}
+
+#+++############################################################################
+#                                                                              #
+# evaluation of cmd line options
+#                                                                              #
+#---############################################################################
+
+if ($T2H_EXPAND eq 'info') 
+{
+  $to_skip{'ifinfo'} = 1;
+  $to_skip{'end ifinfo'} = 1;
+} 
+elsif ($T2H_EXPAND eq 'tex')
+{
+  $to_skip{'iftex'} = 1;
+  $to_skip{'end iftex'} = 1;
+  
+}
+
+$T2H_INVISIBLE_MARK = '<IMG SRC="invisible.xbm">' if $T2H_INVISIBLE_MARK eq 'xbm';
+
+#
+# file name buisness
+#
+die "Need exactly one file to translate\n$T2H_FAILURE_TEXT" unless @ARGV == 1;
+$docu = shift(@ARGV);
+if ($docu =~ /.*\//) {
+    chop($docu_dir = $&);
+    $docu_name = $';
+} else {
+    $docu_dir = '.';
+    $docu_name = $docu;
+}
+unshift(@T2H_INCLUDE_DIRS, $docu_dir);
+$docu_name =~ s/\.te?x(i|info)?$//;    # basename of the document
+$docu_name = $T2H_PREFIX if ($T2H_PREFIX);
+
+# subdir
+if ($T2H_SUBDIR && ! $T2H_OUT)
+{
+  $T2H_SUBDIR =~ s|/*$||;
+  unless (-d "$T2H_SUBDIR" && -w "$T2H_SUBDIR")
+  {
+    if ( mkdir($T2H_SUBDIR, oct(755)))
+    {
+      print "# created directory $T2H_SUBDIR\n" if ($T2H_VERBOSE);
+    }
+    else
+    {
+      warn "$ERROR can't create directory $T2H_SUBDIR. Put results into current directory\n";
+      $T2H_SUBDIR = '';
+    }
+  }
+}
+
+if ($T2H_SUBDIR && ! $T2H_OUT)
+{
+  $docu_rdir = "$T2H_SUBDIR/";
+  print "# putting result files into directory $docu_rdir\n" if ($T2H_VERBOSE);
+}
+else
+{
+  if ($T2H_OUT && $T2H_OUT =~ m|(.*)/|)
+  {
+    $docu_rdir = "$1/";
+    print "# putting result files into directory $docu_rdir\n" if ($T2H_VERBOSE);
+  }
+  else
+  {
+    print "# putting result files into current directory \n" if ($T2H_VERBOSE);
+    $docu_rdir = '';
+  }
+}
+
+# extension
+if ($T2H_SHORTEXTN)
+{
+  $docu_ext = "htm";
+}
+else
+{
+  $docu_ext = "html";
+}
+if ($T2H_TOP_FILE =~ /\..*$/)
+{
+  $T2H_TOP_FILE = $`.".$docu_ext";
+}
+
+# result files
+if (! $T2H_OUT && ($T2H_SPLIT =~ /section/i || $T2H_SPLIT =~ /node/i))
+{
+  $T2H_SPLIT = 'section';
+}
+elsif (! $T2H_OUT && $T2H_SPLIT =~ /chapter/i)
+{
+  $T2H_SPLIT = 'chapter'
+}
+else
+{
+  undef $T2H_SPLIT;
+}
+
+$docu_doc = "$docu_name.$docu_ext";            # document's contents
+$docu_doc_file = "$docu_rdir$docu_doc";
+if ($T2H_SPLIT) 
+{
+  $docu_toc  = $T2H_TOC_FILE || "${docu_name}_toc.$docu_ext"; # document's table of contents
+  $docu_stoc = "${docu_name}_ovr.$docu_ext"; # document's short toc
+  $docu_foot = "${docu_name}_fot.$docu_ext"; # document's footnotes
+  $docu_about = "${docu_name}_abt.$docu_ext"; # about this document
+  $docu_top  = $T2H_TOP_FILE || $docu_doc;
+}
+else
+{
+  if ($T2H_OUT)
+  {
+    $docu_doc = $T2H_OUT;
+    $docu_doc =~ s|.*/||;
+  }
+  $docu_toc = $docu_foot = $docu_stoc = $docu_about = $docu_top = $docu_doc;
+}
+
+$docu_toc_file  = "$docu_rdir$docu_toc";
+$docu_stoc_file = "$docu_rdir$docu_stoc";
+$docu_foot_file = "$docu_rdir$docu_foot";
+$docu_about_file = "$docu_rdir$docu_about";
+$docu_top_file  = "$docu_rdir$docu_top";
+
+$docu_frame_file =     "$docu_rdir${docu_name}_frame.$docu_ext";
+$docu_toc_frame_file = "$docu_rdir${docu_name}_toc_frame.$docu_ext";
+
+#
+# variables
+#
+$value{'html'} = 1;                    # predefine html (the output format)
+$value{'texi2html'} = $THISVERSION;    # predefine texi2html (the translator)
+# _foo: internal to track @foo
+foreach ('_author', '_title', '_subtitle',
+        '_settitle', '_setfilename', '_shorttitle') {
+    $value{$_} = '';                   # prevent -w warnings
+}
+%node2sec = ();                                # node to section name
+%sec2node = ();                                # section to node name
+%sec2number = ();                       # section to number
+%number2sec = ();                       # number to section 
+%idx2node = ();                         # index keys to node
+%node2href = ();                       # node to HREF
+%node2next = ();                       # node to next
+%node2prev = ();                       # node to prev
+%node2up   = ();                       # node to up
+%bib2href = ();                                # bibliography reference to HREF
+%gloss2href = ();                      # glossary term to HREF
+@sections = ();                                # list of sections
+%tag2pro = ();                         # protected sections
+
+#
+# initial indexes
+#
+$bib_num = 0;
+$foot_num = 0;
+$gloss_num = 0;
+$idx_num = 0;
+$sec_num = 0;
+$doc_num = 0;
+$html_num = 0;
+
+#
+# can I use ISO8879 characters? (HTML+)
+#
+if ($T2H_USE_ISO) {
+    $things_map{'bullet'} = "&bull;";
+    $things_map{'copyright'} = "&copy;";
+    $things_map{'dots'} = "&hellip;";
+    $things_map{'equiv'} = "&equiv;";
+    $things_map{'expansion'} = "&rarr;";
+    $things_map{'point'} = "&lowast;";
+    $things_map{'result'} = "&rArr;";
+}
+
+#
+# read texi2html extensions (if any)
+#
+$extensions = 'texi2html.ext'; # extensions in working directory
+if (-f $extensions) {
+    print "# reading extensions from $extensions\n" if $T2H_VERBOSE;
+    require($extensions);
+}
+($progdir = $0) =~ s/[^\/]+$//;
+if ($progdir && ($progdir ne './')) {
+    $extensions = "${progdir}texi2html.ext"; # extensions in texi2html directory
+    if (-f $extensions) {
+       print "# reading extensions from $extensions\n" if $T2H_VERBOSE;
+       require($extensions);
+    }
+}
+
+
+print "# reading from $docu\n" if $T2H_VERBOSE;
+
+#########################################################################
+#
+# latex2html stuff
+# 
+# latex2html conversions consist of three stages:
+# 1) ToLatex: Put "latex" code into a latex file
+# 2) ToHtml: Use latex2html to generate corresponding html code and images
+# 3) FromHtml: Extract generated code and images from latex2html run
+#
+
+##########################
+# default settings
+#
+
+# defaults for files and names
+
+sub l2h_Init 
+{
+  local($root) = @_;
+  
+  return 0 unless ($root);
+  
+  $l2h_name =  "${root}_l2h";
+  
+  $l2h_latex_file = "$docu_rdir${l2h_name}.tex";
+  $l2h_cache_file = "${docu_rdir}l2h_cache.pm";
+  $T2H_L2H_L2H = "latex2html" unless ($T2H_L2H_L2H);
+  
+  # destination dir -- generated images are put there, should be the same
+  # as dir of enclosing html document -- 
+  $l2h_html_file = "$docu_rdir${l2h_name}.html";
+  $l2h_prefix = "${l2h_name}_";
+  return 1;
+}
+
+
+##########################
+# 
+# First stage: Generation of Latex file
+# Initialize with: l2h_InitToLatex
+# Add content with: l2h_ToLatex($text) --> HTML placeholder comment
+# Finish with: l2h_FinishToLatex
+# 
+
+$l2h_latex_preample = <<EOT;
+% This document was automatically generated by the l2h extenstion of texi2html
+% DO NOT EDIT !!!
+\\documentclass{article}
+\\usepackage{html}
+\\begin{document}
+EOT
+
+$l2h_latex_closing = <<EOT;
+\\end{document}
+EOT
+
+# return used latex 1, if l2h could be initalized properly, 0 otherwise
+sub l2h_InitToLatex
+{
+  %l2h_to_latex = ();
+  unless ($T2H_L2H_SKIP)
+  {
+    unless (open(L2H_LATEX, ">$l2h_latex_file"))
+    {
+      warn "$ERROR Error l2h: Can't open latex file '$latex_file' for writing\n";
+      return 0;
+    }  
+    print "# l2h: use ${l2h_latex_file} as latex file\n" if ($T2H_VERBOSE);
+    print L2H_LATEX $l2h_latex_preample;
+  }
+  # open database for caching
+  l2h_InitCache();
+  $l2h_latex_count = 0;
+  $l2h_to_latex_count = 0;
+  $l2h_cached_count = 0;
+  return  1;
+}
+
+# print text (1st arg) into latex file (if not already there), return
+# HTML commentary which can be later on replaced by the latex2html
+# generated text
+sub l2h_ToLatex
+{
+  my($text) = @_;
+  my($count);
+  
+  $l2h_to_latex_count++;
+  $text =~ s/(\s*)$//;
+  
+  # try whether we can cache it
+  my $cached_text = l2h_FromCache($text);
+  if ($cached_text)
+  {
+    $l2h_cached_count++;
+    return $cached_text;
+  }
+  
+  # try whether we have text already on things to do
+  unless ($count = $l2h_to_latex{$text})
+  {
+    $count = $l2h_latex_count;
+    $l2h_latex_count++;
+    $l2h_to_latex{$text} = $count;
+    $l2h_to_latex[$count] = $text;
+    unless ($T2H_L2H_SKIP)
+    {
+      print L2H_LATEX "\\begin{rawhtml}\n";
+      print L2H_LATEX "<!-- l2h_begin ${l2h_name} ${count} -->\n";
+      print L2H_LATEX "\\end{rawhtml}\n";
+      
+      print L2H_LATEX "$text\n";
+      
+      print L2H_LATEX "\\begin{rawhtml}\n";
+      print L2H_LATEX "<!-- l2h_end ${l2h_name} ${count} -->\n";
+      print L2H_LATEX "\\end{rawhtml}\n";
+    }
+  }
+  return "<!-- l2h_replace ${l2h_name} ${count} -->"; 
+}
+
+# print closing into latex file and close it
+sub l2h_FinishToLatex
+{
+  local ($reused);
+  
+  $reused = $l2h_to_latex_count - $l2h_latex_count - $l2h_cached_count;
+  unless ($T2H_L2H_SKIP)
+  {
+    print L2H_LATEX $l2h_latex_closing;
+    close(L2H_LATEX);
+  }
+  print "# l2h: finished to latex ($l2h_cached_count cached, $reused reused, $l2h_latex_count contents)\n" if ($T2H_VERBOSE);
+  unless ($l2h_latex_count)
+  {
+    l2h_Finish();
+    return 0;
+  }
+  return 1;
+}
+
+###################################
+# Second stage: Use latex2html to generate corresponding html code and images
+#
+# l2h_ToHtml([$l2h_latex_file, [$l2h_html_dir]]):
+#   Call latex2html on $l2h_latex_file
+#   Put images (prefixed with $l2h_name."_") and html file(s) in $l2h_html_dir
+#   Return 1, on success
+#          0, otherwise
+#
+sub l2h_ToHtml
+{
+  local($call, $ext, $root, $dotbug);
+  
+  if ($T2H_L2H_SKIP)
+  {
+    print "# l2h: skipping latex2html run\n" if ($T2H_VERBOSE);
+    return 1;
+  }
+  
+  # Check for dot in directory where dvips will work
+  if ($T2H_L2H_TMP)
+  {
+    if ($T2H_L2H_TMP =~ /\./)
+    {
+      warn "$ERROR Warning l2h: l2h_tmp dir contains a dot. Use /tmp, instead\n";
+      $dotbug = 1;
+    }
+  }
+  else
+  {
+    if (&getcwd =~ /\./)
+    {
+     warn "$ERROR Warning l2h: current dir contains a dot. Use /tmp as l2h_tmp dir \n";
+     $dotbug = 1;
+   }
+  }
+  # fix it, if necessary and hope that it works 
+  $T2H_L2H_TMP = "/tmp" if ($dotbug);
+    
+  $call = $T2H_L2H_L2H;
+  # use init file, if specified
+  $call = $call . " -init_file " . $init_file if ($init_file && -f $init_file);
+  # set output dir
+  $call .=  ($docu_rdir ? " -dir $docu_rdir" : " -no_subdir");
+  # use l2h_tmp, if specified
+  $call = $call . " -tmp $T2H_L2H_TMP" if ($T2H_L2H_TMP);
+  # options we want to be sure of
+  $call = $call ." -address 0 -info 0 -split 0 -no_navigation -no_auto_link";
+  $call = $call ." -prefix ${l2h_prefix} $l2h_latex_file"; 
+
+  print "# l2h: executing '$call'\n" if ($T2H_VERBOSE);
+  if (system($call))
+  {
+    warn "l2h ***Error: '${call}' did not succeed\n";
+    return 0;
+  }
+  else
+  {
+    print "# l2h: latex2html finished successfully\n" if ($T2H_VERBOSE);
+    return 1;
+  }
+}
+
+# this is directly pasted over from latex2html
+sub getcwd {
+    local($_) = `pwd`;
+
+    die "'pwd' failed (out of memory?)\n"
+       unless length;
+    chop;
+    $_;
+}
+
+
+##########################
+# Third stage: Extract generated contents from latex2html run
+# Initialize with: l2h_InitFromHtml
+#   open $l2h_html_file for reading
+#   reads in contents into array indexed by numbers
+#   return 1,  on success -- 0, otherwise
+# Extract Html code with: l2h_FromHtml($text)
+#   replaces in $text all previosuly inserted comments by generated html code
+#   returns (possibly changed) $text
+# Finish with: l2h_FinishFromHtml
+#   closes $l2h_html_dir/$l2h_name.".$docu_ext" 
+
+sub l2h_InitFromHtml
+{
+  local($h_line, $h_content, $count, %l2h_img);
+
+  if (! open(L2H_HTML, "<${l2h_html_file}"))
+  {
+    print "$ERROR Error l2h: Can't open ${l2h_html_file} for reading\n";
+    return 0;
+  }
+  print "# l2h: use ${l2h_html_file} as html file\n" if ($T2H_VERBOSE);
+
+  $l2h_html_count = 0;
+  
+  while ($h_line = <L2H_HTML>)
+  {
+    if ($h_line =~ /^<!-- l2h_begin $l2h_name ([0-9]+) -->/)
+    {
+      $count = $1;
+      $h_content = "";
+      while ($h_line = <L2H_HTML>)
+      {
+       if ($h_line =~ /^<!-- l2h_end $l2h_name $count -->/)
+       {
+         chomp $h_content;
+         chomp $h_content;
+         $l2h_html_count++;
+         $h_content = l2h_ToCache($count, $h_content);
+         $l2h_from_html[$count] = $h_content;
+         $h_content = '';
+         last;
+       }
+       $h_content = $h_content.$h_line;
+      }
+      if ($hcontent)
+      {
+       print "$ERROR Warning l2h: l2h_end $l2h_name $count not found\n" 
+         if ($T2H_VERBOSE);
+       close(L2H_HTML);
+       return 0;
+      }
+    }
+  }
+  print "# l2h: Got $l2h_html_count of $l2h_latex_count html contents\n"
+    if ($T2H_VERBOSE);
+
+  close(L2H_HTML);
+  return 1;
+}
+
+sub l2h_FromHtml
+{
+  local($text) = @_;
+  local($done, $to_do, $count);
+  
+  $to_do = $text;
+  
+  while ($to_do =~ /([^\000]*)<!-- l2h_replace $l2h_name ([0-9]+) -->([^\000]*)/)
+  {
+    $to_do = $1;
+    $count = $2;
+    $done = $3.$done;
+    
+    $done = "<!-- l2h_end $l2h_name $count -->".$done
+      if ($T2H_DEBUG & $DEBUG_L2H);
+
+    $done = &l2h_ExtractFromHtml($count) . $done;
+
+    $done = "<!-- l2h_begin $l2h_name $count -->".$done
+      if ($T2H_DEBUG & $DEBUG_L2H);
+  }
+  return $to_do.$done;
+}
+
+
+sub l2h_ExtractFromHtml
+{
+  local($count) = @_;
+  
+  return $l2h_from_html[$count] if ($l2h_from_html[$count]);
+  
+  if ($count >= 0 && $count < $l2h_latex_count)
+  {
+    # now we are in trouble
+    local($l_l2h, $_);
+
+    $l2h_extract_error++;
+    print "$ERROR l2h: can't extract content $count from html\n" 
+      if ($T2H_VERBOSE);
+    # try simple (ordinary) substition (without l2h)
+    $l_l2h = $T2H_L2H;
+    $T2H_L2H = 0;
+    $_ = $l2h_to_latex{$count};
+    $_ = &substitute_style($_); 
+    &unprotect_texi;
+    $_ = "<!-- l2h: ". __LINE__ . " use texi2html -->" . $_
+      if ($T2H_DEBUG & $DEBUG_L2H);
+    $T2H_L2H = $l_l2h;
+    return $_;
+  }
+  else
+  {
+    # now we have been incorrectly called
+    $l2h_range_error++;
+    print "$ERROR l2h: Request of $count content which is out of valide range [0,$l2h_latex_count)\n";
+    return "<!-- l2h: ". __LINE__ . " out of range count $count -->"
+      if ($T2H_DEBUG & $DEBUG_L2H);
+    return "<!-- l2h: out of range count $count -->";
+  }
+}
+    
+sub l2h_FinishFromHtml
+{
+  if ($T2H_VERBOSE)
+  {
+    if ($l2h_extract_error + $l2h_range_error)
+    {
+      print "# l2h: finished from html ($l2h_extract_error extract and $l2h_range_error errors)\n";
+    }
+    else
+    {
+      print "# l2h: finished from html (no errors)\n";
+    }
+  }
+}
+
+sub l2h_Finish
+{
+  l2h_StoreCache();
+  if ($T2H_L2H_CLEAN)
+  {
+    print "# l2h: removing temporary files generated by l2h extension\n"
+      if $T2H_VERBOSE;
+    while (<"$docu_rdir$l2h_name"*>)
+    {
+      unlink $_;
+    }
+  }
+  print "# l2h: Finished\n" if $T2H_VERBOSE;
+  return 1;
+}
+
+##############################
+# stuff for l2h caching
+#
+
+# I tried doing this with a dbm data base, but it did not store all
+# keys/values. Hence, I did as latex2html does it
+sub l2h_InitCache
+{
+  if (-r "$l2h_cache_file")
+  {
+    my $rdo = do "$l2h_cache_file";
+    warn("$ERROR l2h Error: could not load $docu_rdir$l2h_cache_file: $@\n")
+      unless ($rdo);
+  }
+}
+
+sub l2h_StoreCache
+{
+  return unless $l2h_latex_count;
+  
+  my ($key, $value);
+  open(FH, ">$l2h_cache_file") || return warn"$ERROR l2h Error: could not open $docu_rdir$l2h_cache_file for writing: $!\n";
+
+  
+  while (($key, $value) = each %l2h_cache)
+  {
+    # escape stuff
+    $key =~ s|/|\\/|g;
+    $key =~ s|\\\\/|\\/|g;
+    # weird, a \ at the end of the key results in an error
+    # maybe this also broke the dbm database stuff
+    $key =~ s|\\$|\\\\|;
+    $value =~ s/\|/\\\|/g; 
+    $value =~ s/\\\\\|/\\\|/g; 
+    $value =~ s|\\\\|\\\\\\\\|g;
+    print FH "\n\$l2h_cache_key = q/$key/;\n";
+    print FH "\$l2h_cache{\$l2h_cache_key} = q|$value|;\n";
+  }
+  print FH "1;";
+  close(FH);
+}
+
+# return cached html, if it exists for text, and if all pictures
+# are there, as well
+sub l2h_FromCache
+{
+  my $text = shift;
+  my $cached = $l2h_cache{$text};
+  if ($cached)
+  {
+    while ($cached =~ m/SRC="(.*?)"/g)
+    {
+      unless (-e "$docu_rdir$1")
+      {
+       return undef;
+      }
+    }
+    return $cached;
+  }
+  return undef;
+}
+
+# insert generated html into cache, move away images, 
+# return transformed html
+$maximage = 1;
+sub l2h_ToCache
+{
+  my $count = shift;
+  my $content = shift;
+  my @images = ($content =~ /SRC="(.*?)"/g);
+  my ($src, $dest);
+
+  for $src (@images)
+  {
+    $dest = $l2h_img{$src};
+    unless ($dest)
+    {
+      my $ext;
+      if ($src =~ /.*\.(.*)$/ && $1 ne $docu_ext)
+      {
+       $ext = $1;
+      }
+      else
+      {
+       warn "$ERROR: L2h image $src has invalid extension\n";
+       next;
+      }
+      while (-e "$docu_rdir${docu_name}_$maximage.$ext") { $maximage++;}
+      $dest = "${docu_name}_$maximage.$ext";
+      system("cp -f $docu_rdir$src $docu_rdir$dest");
+      $l2h_img{$src} = $dest;
+      unlink "$docu_rdir$src" unless ($DEBUG & DEBUG_L2H);
+    }
+    $content =~ s/$src/$dest/g;
+  }
+  $l2h_cache{$l2h_to_latex[$count]} = $content;
+  return $content;
+}
+
+
+#+++############################################################################
+#                                                                              #
+# Pass 1: read source, handle command, variable, simple substitution           #
+#                                                                              #
+#---############################################################################
+
+@lines = ();                           # whole document
+@toc_lines = ();                       # table of contents
+@stoc_lines = ();                      # table of contents
+$curlevel = 0;                         # current level in TOC
+$node = '';                            # current node name
+$node_next = '';                        # current node next name               
+$node_prev = '';                        # current node prev name
+$node_up = '';                          # current node up name
+$in_table = 0;                         # am I inside a table
+$table_type = '';                      # type of table ('', 'f', 'v', 'multi')
+@tables = ();                          # nested table support
+$in_bibliography = 0;                  # am I inside a bibliography
+$in_glossary = 0;                      # am I inside a glossary
+$in_top = 0;                           # am I inside the top node
+$has_top = 0;                          # did I see a top node?
+$has_top_command = 0;                  # did I see @top for automatic pointers?
+$in_pre = 0;                           # am I inside a preformatted section
+$in_list = 0;                          # am I inside a list
+$in_html = 0;                          # am I inside an HTML section
+$first_line = 1;                       # is it the first line
+$dont_html = 0;                                # don't protect HTML on this line
+$deferred_ref = '';                    # deferred reference for indexes
+@html_stack = ();                      # HTML elements stack
+$html_element = '';                    # current HTML element
+&html_reset;
+%macros = ();                           # macros
+
+# init l2h
+$T2H_L2H = &l2h_Init($docu_name) if ($T2H_L2H);
+$T2H_L2H = &l2h_InitToLatex      if ($T2H_L2H);    
+
+# build code for simple substitutions
+# the maps used (%simple_map and %things_map) MUST be aware of this
+# watch out for regexps, / and escaped characters!
+$subst_code = '';
+foreach (keys(%simple_map)) {
+    ($re = $_) =~ s/(\W)/\\$1/g; # protect regexp chars
+    $subst_code .= "s/\\\@$re/$simple_map{$_}/g;\n";
+}
+foreach (keys(%things_map)) {
+    $subst_code .= "s/\\\@$_\\{\\}/$things_map{$_}/g;\n";
+}
+if ($use_acc) {
+    # accentuated characters
+    foreach (keys(%accent_map)) {
+       if ($_ eq "`") {
+           $subst_code .= "s/$;3";
+       } elsif ($_ eq "'") {
+           $subst_code .= "s/$;4";
+       } else {
+           $subst_code .= "s/\\\@\\$_";
+       }
+       $subst_code .= "([a-z])/&\${1}$accent_map{$_};/gi;\n";
+    }
+}
+eval("sub simple_substitutions { $subst_code }");
+
+&init_input;
+INPUT_LINE: while ($_ = &next_line) {
+    #
+    # remove \input on the first lines only
+    #
+    if ($first_line) {
+       next if /^\\input/;
+       $first_line = 0;
+    }
+    # non-@ substitutions cf. texinfmt.el
+    #
+    # parse texinfo tags
+    #
+    $tag = '';
+    $end_tag = '';
+    if (/^\s*\@end\s+(\w+)\b/) {
+       $end_tag = $1;
+    } elsif (/^\s*\@(\w+)\b/) {
+       $tag = $1;
+    }
+    #
+    # handle @html / @end html
+    #
+    if ($in_html) {
+       if ($end_tag eq 'html') {
+           $in_html = 0;
+       } else {
+           $tag2pro{$in_html} .= $_;
+       }
+       next;
+    } elsif ($tag eq 'html') {
+       $in_html = $PROTECTTAG . ++$html_num;
+       push(@lines, $in_html);
+       next;
+    }
+
+    #
+    # try to remove inlined comments
+    # syntax from tex-mode.el comment-start-skip
+    #
+    s/((^|[^\@])(\@\@)*)\@c(omment | |\{|$).*/$1/;
+
+# Sometimes I use @c right at the end of  a line ( to suppress the line feed )
+#    s/((^|[^\@])(\@\@)*)\@c(omment)?$/$1/;
+#     s/((^|[^\@])(\@\@)*)\@c(omment)? .*/$1/;
+#     s/(.*)\@c{.*?}(.*)/$1$2/;
+#     s/(.*)\@comment{.*?}(.*)/$1$2/;
+#     s/^(.*)\@c /$1/;
+#     s/^(.*)\@comment /$1/;
+
+    #############################################################
+    # value substitution before macro expansion, so that
+    # it works in macro arguments                          
+    s/\@value{($VARRE)}/$value{$1}/eg;
+                           
+    #############################################################
+    # macro substitution
+    while (/\@(\w+)/g)
+    {
+      if (exists($macros->{$1}))    
+      {
+       my $before = $`;
+       my $name = $1;
+       my $after = $';
+       my @args;
+       my $args;
+       if ($after =~ /^\s*{(.*?[^\\])}(.*)/)  
+       {
+         $args = $1;
+         $after = $2;
+       }
+       elsif (@{$macros->{$name}->{Args}} == 1)
+       {
+         $args = $after;
+         $args =~ s/^\s*//;
+         $args =~ s/\s*$//;
+         $after = '';
+       }
+       $args =~ s|\\\\|\\|g;
+       $args =~ s|\\{|{|g;
+        $args =~ s|\\}|}|g;
+       if (@{$macros->{$name}->{Args}} > 1)
+       {
+         $args =~ s/(^|[^\\]),/$1$;/g ;
+         $args =~ s|\\,|,|g;
+         @args = split(/$;\s*/, $args) if (@{$macros->{$name}->{Args}} > 1);
+       }
+       else
+       {
+         $args =~ s|\\,|,|g;
+         @args = ($args);
+       }
+       my $macrobody = $macros->{$name}->{Body};
+       for ($i=0; $i<=$#args; $i++)
+       {
+         $macrobody =~ s|\\$macros->{$name}->{Args}->[$i]\\|$args[$i]|g;
+       }
+       $macrobody =~ s|\\\\|\\|g;
+       $_ = $before . $macrobody . $after;
+       unshift @input_spool, map {$_ = $_."\n"} split(/\n/, $_);
+       next INPUT_LINE;
+      }
+    }                          #
+                           
+    
+    #
+    # try to skip the line
+    #
+    if ($end_tag) {
+        $in_titlepage = 0 if $end_tag eq 'titlepage';
+       next if $to_skip{"end $end_tag"};
+    } elsif ($tag) {
+      $in_titlepage = 1 if $tag eq 'titlepage';
+      next if $to_skip{$tag};
+      last if $tag eq 'bye';
+    }
+    if ($in_top) {
+       # parsing the top node
+       if ($tag eq 'node' || 
+           ($sec2level{$tag} && $tag !~ /unnumbered/ && $tag !~ /heading/))
+       {
+           # no more in top
+           $in_top = 0;
+           push(@lines, $TOPEND);
+       }
+    }
+    unless ($in_pre) {
+       s/``/\"/g;
+       s/''/\"/g;
+       s/([\w ])---([\w ])/$1--$2/g;
+    }
+    #
+    # analyze the tag
+    #
+    if ($tag) {
+       # skip lines
+       &skip_until($tag), next if $tag eq 'ignore';
+       &skip_until($tag), next if $tag eq 'ifnothtml';
+       if ($tag eq 'ifinfo')
+       {
+         &skip_until($tag), next unless $T2H_EXPAND eq 'info';
+       }
+       if ($tag eq 'iftex')
+       {
+         &skip_until($tag), next unless $T2H_EXPAND eq 'tex';
+       } 
+       if ($tag eq 'tex')
+       {
+         # add to latex2html file
+         if ($T2H_EXPAND eq 'tex' && $T2H_L2H && ! $in_pre)
+         {
+           # add space to the end -- tex(i2dvi) does this, as well 
+           push(@lines, &l2h_ToLatex(&string_until($tag) . " "));
+         }
+         else
+         {
+           &skip_until($tag);
+         }
+         next;
+       }
+       if ($tag eq 'titlepage')
+       {
+         next;
+       }
+       # handle special tables
+       if ($tag =~ /^(|f|v|multi)table$/) {
+           $table_type = $1;
+           $tag = 'table';
+       }
+       # special cases
+       if ($tag eq 'top' || ($tag eq 'node' && /^\@node\s+top\s*,/i)) {
+           $in_top = 1;
+           $has_top = 1;
+           $has_top_command = 1 if $tag eq 'top';
+           @lines = (); # ignore all lines before top (title page garbage)
+           next;
+       } elsif ($tag eq 'node') {
+         if ($in_top)
+         {
+           $in_top = 0;
+           push(@lines, $TOPEND);
+         }
+         warn "$ERROR Bad node line: $_" unless $_ =~ /^\@node\s$NODESRE$/o;
+         # request of "Richard Y. Kim" <ryk@ap.com>
+         s/^\@node\s+//;
+         $_ = &protect_html($_); # if node contains '&' for instance
+         ($node, $node_next, $node_prev, $node_up) = split(/,/);
+         &normalise_node($node);
+         &normalise_node($node_next);
+         &normalise_node($node_prev);
+         &normalise_node($node_up);
+         $node =~ /\"/ ?
+           push @lines, &html_debug("<A NAME='$node'></A>\n", __LINE__) :
+           push @lines, &html_debug("<A NAME=\"$node\"></A>\n", __LINE__);
+         next;
+       } elsif ($tag eq 'include') {
+           if (/^\@include\s+($FILERE)\s*$/o) {
+               $file = LocateIncludeFile($1);
+               if ($file && -e $file) {
+                   &open($file);
+                   print "# including $file\n" if $T2H_VERBOSE;
+               } else {
+                   warn "$ERROR Can't find $1, skipping";
+               }
+           } else {
+               warn "$ERROR Bad include line: $_";
+           }
+           next;
+       } elsif ($tag eq 'ifclear') {
+           if (/^\@ifclear\s+($VARRE)\s*$/o) {
+               next unless defined($value{$1});
+               &skip_until($tag);
+           } else {
+               warn "$ERROR Bad ifclear line: $_";
+           }
+           next;
+       } elsif ($tag eq 'ifset') {
+           if (/^\@ifset\s+($VARRE)\s*$/o) {
+               next if defined($value{$1});
+               &skip_until($tag);
+           } else {
+               warn "$ERROR Bad ifset line: $_";
+           }
+           next;
+       } elsif ($tag eq 'menu') {
+           unless ($T2H_SHOW_MENU) {
+               &skip_until($tag);
+               next;
+           }
+           &html_push_if($tag);
+           push(@lines, &html_debug('', __LINE__));
+       } elsif ($format_map{$tag}) {
+           $in_pre = 1 if $format_map{$tag} eq 'PRE';
+           &html_push_if($format_map{$tag});
+           push(@lines, &html_debug('', __LINE__));
+           $in_list++ if $format_map{$tag} eq 'UL' || $format_map{$tag} eq 'OL' ;
+#          push(@lines, &debug("<BLOCKQUOTE>\n", __LINE__))
+#            if $tag =~ /example/i;
+           # sunshine@sunshineco.com: <PRE>bla</PRE> looks better than
+           # <PRE>\nbla</PRE> (at least on NeXTstep browser
+           push(@lines, &debug("<$format_map{$tag}>" . 
+                               ($in_pre ? '' : "\n"), __LINE__));
+           next;
+       }
+       elsif (exists $complex_format_map->{$tag})
+       {
+         my $start = eval $complex_format_map->{$tag}->[0];
+         if ($@)
+         {
+           print "$ERROR: eval of complex_format_map->{$tag}->[0] $complex_format_map->{$tag}->[0]: $@";
+           $start = '<pre>'
+         }
+         $in_pre = 1 if $start =~ /<pre/;
+         push(@lines, html_debug($start. ($in_pre ? '' : "\n"), __LINE__));
+         next;
+       } elsif ($tag eq 'table') {
+         # anorland@hem2.passagen.se
+         # if (/^\s*\@(|f|v|multi)table\s+\@(\w+)/) {
+            if (/^\s*\@(|f|v|multi)table\s+\@(\w+)|(\{[^\}]*\})/) {
+               $in_table = $2;
+               unshift(@tables, join($;, $table_type, $in_table));
+               if ($table_type eq "multi") {
+                   # don't use borders -- gets confused by empty cells
+                   push(@lines, &debug("<TABLE>\n", __LINE__));
+                   &html_push_if('TABLE');
+               } else {
+                   push(@lines, &debug("<DL COMPACT>\n", __LINE__));
+                   &html_push_if('DL');
+               }
+               push(@lines, &html_debug('', __LINE__));
+           } else {
+               warn "$ERROR Bad table line: $_";
+           }
+           next;
+       } 
+       elsif ($tag eq 'synindex' || $tag eq 'syncodeindex') 
+       {
+         if (/^\@$tag\s+(\w+)\s+(\w+)\s*$/) 
+         {
+           my $from = $1;
+           my $to = $2;
+           my $prefix_from = IndexName2Prefix($from);
+           my $prefix_to = IndexName2Prefix($to);
+
+           warn("$ERROR unknown from index name $from ind syn*index line: $_"), next
+             unless $prefix_from;
+           warn("$ERROR unknown to index name $to ind syn*index line: $_"), next
+             unless $prefix_to;
+
+           if ($tag eq 'syncodeindex')
+           {
+             $index_properties->{$prefix_to}->{'from_code'}->{$prefix_from} = 1;
+           }
+           else
+           {
+              $index_properties->{$prefix_to}->{'from'}->{$prefix_from} = 1;
+           }
+         } 
+         else 
+         {
+           warn "$ERROR Bad syn*index line: $_";
+         }
+         next;
+       } 
+       elsif ($tag eq 'defindex' || $tag eq 'defcodeindex') 
+       {
+         if (/^\@$tag\s+(\w+)\s*$/) 
+         {
+           my $name = $1;
+           $index_properties->{$name}->{name} = $name;
+           $index_properties->{$name}->{code} = 1 if $tag eq 'defcodeindex';
+         } 
+         else 
+         {
+           warn "$ERROR Bad defindex line: $_";
+         }
+         next;
+       }
+       elsif (/^\@printindex/)
+       {
+         push (@lines, "<!--::${section}::-->$_");
+         next;
+       }
+       elsif ($tag eq 'sp') {
+           push(@lines, &debug("<P>\n", __LINE__));
+           next;
+       } elsif ($tag eq 'center') {
+           push(@lines, &debug("<center>\n", __LINE__));
+           s/\@center//;
+       } elsif ($tag eq 'setref') {
+           &protect_html; # if setref contains '&' for instance
+           if (/^\@$tag\s*{($NODERE)}\s*$/) {
+               $setref = $1;
+               $setref =~ s/\s+/ /g; # normalize
+               $setref =~ s/ $//;
+               $node2sec{$setref} = $name;
+               $sec2node{$name} = $setref;
+               $node2href{$setref} = "$docu_doc#$docid";
+           } else {
+               warn "$ERROR Bad setref line: $_";
+           }
+           next;
+       } elsif ($tag eq 'lowersections') {
+           local ($sec, $level);
+           while (($sec, $level) = each %sec2level) {
+               $sec2level{$sec} = $level + 1;
+           }
+           next;
+       } elsif ($tag eq 'raisesections') {
+           local ($sec, $level);
+           while (($sec, $level) = each %sec2level) {
+               $sec2level{$sec} = $level - 1;
+           }
+           next;
+       }
+       elsif ($tag eq 'macro' || $tag eq 'rmacro')
+       {
+         if (/^\@$tag\s*(\w+)\s*(.*)/)
+         {
+           my $name = $1;
+           my @args;
+           @args = split(/\s*,\s*/ , $1)
+             if ($2 =~ /^\s*{(.*)}\s*/);
+           
+           $macros->{$name}->{Args} = \@args;
+           $macros->{$name}->{Body} = '';
+           while (($_ = &next_line) && $_ !~ /\@end $tag/)
+           {
+             $macros->{$name}->{Body} .= $_;
+           }
+           die "ERROR: No closing '\@end $tag' found for macro definition of '$name'\n"
+             unless (/\@end $tag/);
+           chomp $macros->{$name}->{Body};
+         }
+         else
+         {
+           warn "$ERROR: Bad macro defintion $_"
+         }
+         next;
+       }
+       elsif ($tag eq 'unmacro')
+       {
+         delete $macros->{$1} if (/^\@unmacro\s*(\w+)/);
+         next;
+       }
+       elsif ($tag eq 'documentlanguage')
+       {
+         SetDocumentLanguage($1) if (!$T2H_LANG && /documentlanguage\s*(\w+)/);
+       }
+       elsif (defined($def_map{$tag})) {
+           if ($def_map{$tag}) {
+               s/^\@$tag\s+//;
+               $tag = $def_map{$tag};
+               $_ = "\@$tag $_";
+               $tag =~ s/\s.*//;
+           }
+       } elsif (defined($user_sub{$tag})) {
+           s/^\@$tag\s+//;
+           $sub = $user_sub{$tag};
+           print "# user $tag = $sub, arg: $_" if $T2H_DEBUG & $DEBUG_USER;
+           if (defined(&$sub)) {
+               chop($_);
+               &$sub($_);
+           } else {
+               warn "$ERROR Bad user sub for $tag: $sub\n";
+           }
+           next;
+         } 
+       if (defined($def_map{$tag})) {
+           s/^\@$tag\s+//;
+           if ($tag =~ /x$/) {
+               # extra definition line
+               $tag = $`;
+               $is_extra = 1;
+           } else {
+               $is_extra = 0;
+           }
+           while (/\{([^\{\}]*)\}/) {
+               # this is a {} construct
+               ($before, $contents, $after) = ($`, $1, $');
+               # protect spaces
+               $contents =~ s/\s+/$;9/g;
+               # restore $_ protecting {}
+               $_ = "$before$;7$contents$;8$after";
+           }
+           @args = split(/\s+/, &protect_html($_));
+           foreach (@args) {
+               s/$;9/ /g;      # unprotect spaces
+               s/$;7/\{/g;     # ... {
+               s/$;8/\}/g;     # ... }
+           }
+           $type = shift(@args);
+           $type =~ s/^\{(.*)\}$/$1/;
+           print "# def ($tag): {$type} ", join(', ', @args), "\n"
+               if $T2H_DEBUG & $DEBUG_DEF;
+           $type .= ':'; # it's nicer like this
+           my $name = shift(@args);
+           $name =~ s/^\{(.*)\}$/$1/;
+           if ($is_extra) {
+               $_ = &debug("<DT>", __LINE__);
+           } else {
+               $_ = &debug("<DL>\n<DT>", __LINE__);
+           }
+           if ($tag eq 'deffn' || $tag eq 'defvr' || $tag eq 'deftp') {
+               $_ .= "<U>$type</U> <B>$name</B>";
+               $_ .= " <I>@args</I>" if @args;
+           } elsif ($tag eq 'deftypefn' || $tag eq 'deftypevr'
+                    || $tag eq 'defcv' || $tag eq 'defop') {
+               $ftype = $name;
+               $name = shift(@args);
+               $name =~ s/^\{(.*)\}$/$1/;
+               $_ .= "<U>$type</U> $ftype <B>$name</B>";
+               $_ .= " <I>@args</I>" if @args;
+           } else {
+               warn "$ERROR Unknown definition type: $tag\n";
+               $_ .= "<U>$type</U> <B>$name</B>";
+               $_ .= " <I>@args</I>" if @args;
+           }
+           $_ .= &debug("\n<DD>", __LINE__);
+           $name = &unprotect_html($name);
+           if ($tag eq 'deffn' || $tag eq 'deftypefn') {
+             EnterIndexEntry('f', $name, $docu_doc, $section, \@lines);
+#              unshift(@input_spool, "\@findex $name\n");
+           } elsif ($tag eq 'defop') {
+             EnterIndexEntry('f', "$name on $ftype", $docu_doc, $section, \@lines);
+#              unshift(@input_spool, "\@findex $name on $ftype\n");
+           } elsif ($tag eq 'defvr' || $tag eq 'deftypevr' || $tag eq 'defcv') {
+             EnterIndexEntry('v', $name, $docu_doc, $section, \@lines);
+#              unshift(@input_spool, "\@vindex $name\n");
+           } else {
+             EnterIndexEntry('t', $name, $docu_doc, $section, \@lines);
+#              unshift(@input_spool, "\@tindex $name\n");
+           }
+           $dont_html = 1;
+       }
+    } elsif ($end_tag) {
+       if ($format_map{$end_tag}) {
+           $in_pre = 0 if $format_map{$end_tag} eq 'PRE';
+           $in_list-- if $format_map{$end_tag} eq 'UL' || $format_map{$end_tag} eq 'OL' ;
+           &html_pop_if('P');
+           &html_pop_if('LI');
+           &html_pop_if();
+           push(@lines, &debug("</$format_map{$end_tag}>\n", __LINE__));
+           push(@lines, &html_debug('', __LINE__));
+       }
+       elsif (exists $complex_format_map->{$end_tag})
+       {
+         my $end = eval $complex_format_map->{$end_tag}->[1];
+         if ($@)
+         {
+           print "$ERROR: eval of complex_format_map->{$end_tag}->[1] $complex_format_map->{$end_tag}->[0]: $@";
+           $end = '</pre>'
+         }
+         $in_pre = 0 if $end =~ m|</pre>|;
+         push(@lines, html_debug($end, __LINE__));
+       } elsif ($end_tag =~ /^(|f|v|multi)table$/) {
+           unless (@tables) {
+               warn "$ERROR \@end $end_tag without \@*table\n";
+               next;
+           }
+           &html_pop_if('P');
+           ($table_type, $in_table) = split($;, shift(@tables));
+           unless ($1 eq $table_type) {
+               warn "$ERROR \@end $end_tag without matching \@$end_tag\n";
+               next;
+           }
+           if ($table_type eq "multi") {
+               push(@lines, "</TR></TABLE>\n");
+               &html_pop_if('TR');
+           } else {
+               push(@lines, "</DL>\n");
+               &html_pop_if('DD');
+           }
+           &html_pop_if();
+           if (@tables) {
+               ($table_type, $in_table) = split($;, $tables[0]);
+           } else {
+               $in_table = 0;
+           }
+       } elsif (defined($def_map{$end_tag})) {
+           push(@lines, &debug("</DL>\n", __LINE__));
+       } elsif ($end_tag eq 'menu') {
+           &html_pop_if();
+           push(@lines, $_); # must keep it for pass 2
+       } 
+       next;
+    }
+    #############################################################
+    # anchor insertion
+    while (/\@anchor\s*\{(.*?)\}/)
+    {
+      $_ = $`.$';
+      my $anchor = $1;
+      $anchor = &normalise_node($anchor);
+      push @lines, &html_debug("<A NAME=\"$anchor\"></A>\n");
+      $node2href{$anchor} = "$docu_doc#$anchor";
+      next INPUT_LINE if $_ =~ /^\s*$/;
+    }
+
+    #############################################################
+    # index entry generation, after value substitutions
+    if (/^\@(\w+?)index\s+/)
+    {
+      EnterIndexEntry($1, $', $docu_doc, $section, \@lines);
+      next;
+    }
+    #
+    # protect texi and HTML things
+    &protect_texi;
+    $_ = &protect_html($_) unless $dont_html;
+    $dont_html = 0;
+    # substitution (unsupported things)
+    s/^\@exdent\s+//g;
+    s/\@noindent\s+//g;
+    s/\@refill\s+//g;
+    # other substitutions
+    &simple_substitutions;
+    s/\@footnote\{/\@footnote$docu_doc\{/g; # mark footnotes, cf. pass 4
+    #
+    # analyze the tag again
+    #
+    if ($tag) {
+      if (defined($sec2level{$tag}) && $sec2level{$tag} > 0) {
+           if (/^\@$tag\s+(.+)$/) {
+               $name = $1;
+               $name = &normalise_node($name);
+               $level = $sec2level{$tag};
+               # check for index
+               $first_index_chapter = $name
+                 if ($level == 1 && !$first_index_chapter && 
+                     $name =~ /index/i);
+               if ($in_top && /heading/){
+                   $T2H_HAS_TOP_HEADING = 1;
+                    $_ = &debug("<H$level>$name</H$level>\n", __LINE__);
+                   &html_push_if('body');
+                   print "# top heading, section $name, level $level\n"
+                       if $T2H_DEBUG & $DEBUG_TOC;
+               }
+               else
+               {
+                 unless (/^\@\w*heading/)
+                 {
+                   unless (/^\@unnumbered/)
+                   {
+                     my $number = &update_sec_num($tag, $level);
+                     $name = $number. ' ' . $name if $T2H_NUMBER_SECTIONS;
+                     $sec2number{$name} = $number;
+                     $number2sec{$number} = $name;
+                   }
+                   if (defined($toplevel))
+                   {
+                     push @lines, ($level==$toplevel ? $CHAPTEREND : $SECTIONEND);
+                   }
+                   else
+                   {
+                     # first time we see a "section"
+                     unless ($level == 1) 
+                     {
+                       warn "$WARN The first section found is not of level 1: $_";
+                     }
+                     $toplevel = $level;
+                   }
+                   push(@sections, $name);
+                   next_doc() if ($T2H_SPLIT eq 'section' ||
+                                  $T2H_SPLIT && $level == $toplevel);
+                 }
+                 $sec_num++;
+                 $docid = "SEC$sec_num";
+                 $tocid = (/^\@\w*heading/ ? undef : "TOC$sec_num");
+                 # check biblio and glossary
+                 $in_bibliography = ($name =~ /^([A-Z]|\d+)?(\.\d+)*\s*bibliography$/i);
+                 $in_glossary = ($name =~ /^([A-Z]|\d+)?(\.\d+)*\s*glossary$/i);
+                 # check node
+                 if ($node)
+                 {
+                   warn "$ERROR Duplicate node found: $node\n"
+                     if ($node2sec{$node});
+                 }
+                 else
+                 {
+                   $name .= ' ' while ($node2sec{$name});
+                   $node = $name;
+                 }
+                 $name .= ' ' while ($sec2node{$name});
+                 $section = $name; 
+                 $node2sec{$node} = $name;
+                 $sec2node{$name} = $node;
+                 $node2href{$node} = "$docu_doc#$docid";
+                 $node2next{$node} = $node_next;
+                 $node2prev{$node} = $node_prev;
+                 $node2up{$node} = $node_up;
+                 print "# node $node, section $name, level $level\n"
+                   if $T2H_DEBUG & $DEBUG_TOC;
+
+                 $node = '';
+                 $node_next = '';
+                 $node_prev = '';
+                 $node_next = '';
+                 if ($tocid)
+                 {
+                   # update TOC
+                   while ($level > $curlevel) {
+                     $curlevel++;
+                     push(@toc_lines, "<UL>\n");
+                   }
+                   while ($level < $curlevel) {
+                     $curlevel--;
+                     push(@toc_lines, "</UL>\n");
+                   }
+                   $_ = &t2h_anchor($tocid, "$docu_doc#$docid", $name, 1);
+                   $_ = &substitute_style($_);
+                   push(@stoc_lines, "$_<BR>\n") if ($level == 1);
+                   if ($T2H_NUMBER_SECTIONS)
+                   {
+                     push(@toc_lines, $_ . "<BR>\n")
+                   }
+                   else
+                   {
+                     push(@toc_lines, "<LI>" . $_ ."</LI>");
+                   }
+                 }
+                 else
+                 {
+                   push(@lines, &html_debug("<A NAME=\"$docid\"></A>\n", 
+                                          __LINE__));
+                 }
+                 # update DOC
+                 push(@lines, &html_debug('', __LINE__));
+                 &html_reset;
+                 $_ =  "<H$level> $name </H$level>\n<!--docid::${docid}::-->\n";
+                 $_ = &debug($_, __LINE__);
+                 push(@lines, &html_debug('', __LINE__));
+               }
+               # update DOC
+               foreach $line (split(/\n+/, $_)) {
+                   push(@lines, "$line\n");
+               }
+               next;
+           } else {
+               warn "$ERROR Bad section line: $_";
+           }
+       } else {
+           # track variables
+           $value{$1} = Unprotect_texi($2), next if /^\@set\s+($VARRE)\s+(.*)$/o;
+           delete $value{$1}, next if /^\@clear\s+($VARRE)\s*$/o;
+           # store things
+           $value{'_shorttitle'} = Unprotect_texi($1), next if /^\@shorttitle\s+(.*)$/;
+           $value{'_setfilename'}   = Unprotect_texi($1), next if /^\@setfilename\s+(.*)$/;
+           $value{'_settitle'}      = Unprotect_texi($1), next if /^\@settitle\s+(.*)$/;
+           $value{'_author'}   .= Unprotect_texi($1)."\n", next if /^\@author\s+(.*)$/;
+           $value{'_subtitle'} .= Unprotect_texi($1)."\n", next if /^\@subtitle\s+(.*)$/;
+           $value{'_title'}    .= Unprotect_texi($1)."\n", next if /^\@title\s+(.*)$/;
+
+           # list item
+           if (/^\s*\@itemx?\s+/) {
+               $what = $';
+               $what =~ s/\s+$//;
+               if ($in_bibliography && $use_bibliography) {
+                   if ($what =~ /^$BIBRE$/o) {
+                       $id = 'BIB' . ++$bib_num;
+                       $bib2href{$what} = "$docu_doc#$id";
+                       print "# found bibliography for '$what' id $id\n"
+                           if $T2H_DEBUG & $DEBUG_BIB;
+                       $what = &t2h_anchor($id, '', $what);
+                   }
+               } elsif ($in_glossary && $T2H_USE_GLOSSARY) {
+                   $id = 'GLOSS' . ++$gloss_num;
+                   $entry = $what;
+                   $entry =~ tr/A-Z/a-z/ unless $entry =~ /^[A-Z\s]+$/;
+                   $gloss2href{$entry} = "$docu_doc#$id";
+                   print "# found glossary for '$entry' id $id\n"
+                       if $T2H_DEBUG & $DEBUG_GLOSS;
+                   $what = &t2h_anchor($id, '', $what);
+               }
+               elsif ($in_table && ($table_type eq 'f' || $table_type eq 'v'))
+               {
+                 EnterIndexEntry($table_type, $what, $docu_doc, $section, \@lines);
+               }
+               &html_pop_if('P');
+               if ($html_element eq 'DL' || $html_element eq 'DD') {
+                   if ($things_map{$in_table} && !$what) {
+                       # special case to allow @table @bullet for instance
+                       push(@lines, &debug("<DT>$things_map{$in_table}\n", __LINE__));
+                   } else {
+                       push(@lines, &debug("<DT>\@$in_table\{$what\}\n", __LINE__));
+                   }
+                   push(@lines, "<DD>");
+                   &html_push('DD') unless $html_element eq 'DD';
+                   if ($table_type) { # add also an index
+                       unshift(@input_spool, "\@${table_type}index $what\n");
+                   }
+               } elsif ($html_element eq 'TABLE') {
+                   push(@lines, &debug("<TR><TD>$what</TD>\n", __LINE__));
+                   &html_push('TR');
+               } elsif ($html_element eq 'TR') {
+                   push(@lines, &debug("</TR>\n", __LINE__));
+                   push(@lines, &debug("<TR><TD>$what</TD>\n", __LINE__));
+               } else {
+                   push(@lines, &debug("<LI>$what\n", __LINE__));
+                   &html_push('LI') unless $html_element eq 'LI';
+               }
+               push(@lines, &html_debug('', __LINE__));
+               if ($deferred_ref) {
+                   push(@lines, &debug("$deferred_ref\n", __LINE__));
+                   $deferred_ref = '';
+               }
+               next;
+           } elsif (/^\@tab\s+(.*)$/) {
+               push(@lines, "<TD>$1</TD>\n");
+               next;
+           }
+       }
+    }
+    # paragraph separator
+    if ($_ eq "\n" && ! $in_pre) {
+       next if $#lines >= 0 && $lines[$#lines] eq "\n";
+       if ($html_element eq 'P') {
+           push (@lines, &debug("</P><P>\n", __LINE__));
+       }
+#      else
+#      {
+#        push(@lines, "<P></P>\n");
+#        $_ = &debug("<P></P>\n", __LINE__);
+#      }
+        elsif ($html_element eq 'body' || $html_element eq 'BLOCKQUOTE' || $html_element eq 'DD' || $html_element eq 'LI') 
+       {
+         &html_push('P');
+         push(@lines, &debug("<P>\n", __LINE__));
+       }
+      }
+    # otherwise
+    push(@lines, $_) unless $in_titlepage;
+    push(@lines, &debug("</center>\n", __LINE__))  if ($tag eq 'center');
+}
+
+# finish TOC
+$level = 0;
+while ($level < $curlevel) {
+    $curlevel--;
+    push(@toc_lines, "</UL>\n");
+}
+
+print "# end of pass 1\n" if $T2H_VERBOSE;
+
+SetDocumentLanguage('en') unless ($T2H_LANG);
+#+++############################################################################
+#                                                                              #
+# Stuff related to Index generation                                            #
+#                                                                              #
+#---############################################################################
+
+sub EnterIndexEntry
+{
+  my $prefix = shift;
+  my $key = shift;
+  my $docu_doc = shift;
+  my $section = shift;
+  my $lines = shift;
+  local $_;
+
+  warn "$ERROR Undefined index command: $_", next
+    unless (exists ($index_properties->{$prefix}));
+  $key =~ s/\s+$//;
+  $_ = $key;
+  &protect_texi;
+  $key = $_;
+  $_ = &protect_html($_);
+  my $html_key = substitute_style($_);
+  my $id;
+  $key = remove_style($key);
+  $key = remove_things($key);
+  $_ = $key;
+  &unprotect_texi;
+  $key = $_;
+  while (exists $index->{$prefix}->{$key}) {$key .= ' '};
+  if ($lines->[$#lines] =~ /^<!--docid::(.+)::-->$/)
+  {
+    $id = $1;
+  }
+  else
+  {
+    $id = 'IDX' . ++$idx_num;
+    push(@$lines, &t2h_anchor($id, '', $T2H_INVISIBLE_MARK, !$in_pre));
+  }
+  $index->{$prefix}->{$key}->{html_key} = $html_key;
+  $index->{$prefix}->{$key}->{section} = $section;
+  $index->{$prefix}->{$key}->{href} = "$docu_doc#$id";
+  print "# found ${prefix}index  for '$key' with id $id\n"
+    if $T2H_DEBUG & $DEBUG_INDEX;
+}
+
+sub IndexName2Prefix
+{
+  my $name = shift;
+  my $prefix;
+
+  for $prefix (keys %$index_properties)
+  {
+    return $prefix if ($index_properties->{$prefix}->{name} eq $name);
+  }
+  return undef;
+}
+
+sub GetIndexEntries
+{
+  my $normal = shift;
+  my $code = shift;
+  my ($entries, $prefix, $key) = ({});
+  
+  for $prefix (keys %$normal)
+  {
+    for $key (keys %{$index->{$prefix}})
+    {
+      $entries->{$key} = {%{$index->{$prefix}->{$key}}};
+    }
+  }
+
+  if (defined($code))
+  {
+    for $prefix (keys %$code)
+    {
+      unless (exists $normal->{$keys})
+      {
+       for $key (keys %{$index->{$prefix}})
+       {
+         $entries->{$key} = {%{$index->{$prefix}->{$key}}};
+         $entries->{$key}->{html_key} = "<CODE>$entries->{$key}->{html_key}</CODE>";
+       }
+      }
+    }
+  }
+  return $entries;
+}
+
+sub byAlpha
+{
+  if ($a =~ /^[A-Za-z]/)
+  {
+    if ($b =~ /^[A-Za-z]/)
+    {
+      return lc($a) cmp lc($b);
+    }
+    else
+    {
+      return 1;
+    }
+  }
+  elsif ($b =~ /^[A-Za-z]/)
+  {
+    return -1;
+  }
+  else
+  {
+    return lc($a) cmp lc($b);
+  } 
+}
+
+sub GetIndexPages
+{
+  my $entries = shift;
+  my (@Letters, $key);
+  my ($EntriesByLetter, $Pages, $page) = ({}, [], {});
+  my @keys = sort byAlpha keys %$entries;
+
+  for $key (@keys)
+  {
+    push @{$EntriesByLetter->{uc(substr($key,0, 1))}} , $entries->{$key};
+  }
+  @Letters = sort byAlpha keys %$EntriesByLetter;
+  
+  $T2H_SPLIT_INDEX = 0 unless ($T2H_SPLIT);
+
+  unless ($T2H_SPLIT_INDEX)
+  {
+    $page->{First} = $Letters[0];
+    $page->{Last} = $Letters[$#Letters];
+    $page->{Letters} = \@Letters;
+    $page->{EntriesByLetter} = $EntriesByLetter;
+    push @$Pages, $page;
+    return $Pages;
+  }
+
+  if ($T2H_SPLIT_INDEX =~ /^\d+$/)
+  {
+    my $i = 0;
+    my ($prev_letter, $letter);
+    $page->{First} = $Letters[0];
+    for $letter (@Letters)
+    {
+      if ($i > $T2H_SPLIT_INDEX)
+      {
+       $page->{Last} = $prev_letter;
+       push @$Pages, {%$page};
+       $page->{Letters} = [];
+       $page->{EntriesByLetter} = {};
+       $page->{First} = $letter;
+       $i=0;
+      }
+      push @{$page->{Letters}}, $letter;
+      $page->{EntriesByLetter}->{$letter} = [@{$EntriesByLetter->{$letter}}];
+      $i += scalar(@{$EntriesByLetter->{$letter}});
+      $prev_letter = $letter;
+    }
+    $page->{Last} = $Letters[$#Letters];
+    push @$Pages, {%$page};
+  }
+  return $Pages;
+}
+
+sub GetIndexSummary
+{
+  my $first_page = shift;
+  my $Pages = shift;
+  my $name = shift;
+  my ($page, $letter, $summary, $i, $l1, $l2, $l);
+
+  $i = 0;
+  $summary = '<table><tr><th valign=top>Jump to: &nbsp; </th><td>';
+  
+  for $page ($first_page, @$Pages)
+  {
+    for $letter (@{$page->{Letters}})
+    {
+      $l = t2h_anchor('', "$page->{href}#${name}_$letter", "<b>$letter</b>", 
+                     0, 'style="text-decoration:none"') . "\n &nbsp; \n";
+      
+      if ($letter =~ /^[A-Za-z]/)
+      {
+       $l2 .= $l;
+      }
+      else
+      {
+       $l1 .= $l;
+      }
+    }
+  }
+  $summary .= $l1 . "<BR>\n" if ($l1);
+  $summary .= $l2 . '</td></tr></table><br>';
+  return $summary;
+}
+
+sub PrintIndexPage
+{
+  my $lines = shift;
+  my $summary = shift;
+  my $page = shift;
+  my $name = shift;
+
+  push @$lines, $summary;
+
+  push @$lines , <<EOT;
+<P></P>
+<TABLE border=0>
+<TR><TD></TD><TH ALIGN=LEFT>Index Entry</TH><TH ALIGN=LEFT> Section</TH></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+EOT
+
+  for $letter (@{$page->{Letters}})
+  {
+    push @$lines, "<TR><TH><A NAME=\"${name}_$letter\"></A>$letter</TH><TD></TD><TD></TD></TR>\n";
+    for $entry (@{$page->{EntriesByLetter}->{$letter}})
+    {
+      push @$lines, 
+      "<TR><TD></TD><TD valign=top>" . 
+       t2h_anchor('', $entry->{href}, $entry->{html_key}) .
+         "</TD><TD valign=top>" . 
+           t2h_anchor('', sec_href($entry->{section}), clean_name($entry->{section})) .
+             "</TD></TR>\n";
+    }
+    push @$lines, "<TR><TD COLSPAN=3> <HR></TD></TR>\n";
+  }
+  push @$lines, "</TABLE><P></P>";
+  push @$lines, $summary;
+}
+
+sub PrintIndex
+{
+  my $lines = shift;
+  my $name = shift;
+  my $section = shift;
+  $section = 'Top' unless $section;
+  my $prefix = IndexName2Prefix($name);
+
+  warn ("$ERROR printindex: bad index name: $name"), return 
+    unless $prefix;
+
+  if ($index_properties->{$prefix}->{code})
+  {
+    $index_properties->{$prefix}->{from_code}->{$prefix} = 1;
+  }
+  else
+  {
+    $index_properties->{$prefix}->{from}->{$prefix}= 1;
+  }
+
+  my $Entries = GetIndexEntries($index_properties->{$prefix}->{from}, 
+                               $index_properties->{$prefix}->{from_code});
+  return unless %$Entries;
+
+  if ($T2H_IDX_SUMMARY)
+  {
+    my $key;
+    open(FHIDX, ">$docu_rdir$docu_name" . "_$name.idx")
+      || die "Can't open > $docu_rdir$docu_name" . "_$name.idx for writing: $!\n";
+    print "# writing $name index summary in $docu_rdir$docu_name" . "_$name.idx...\n" if $T2H_VERBOSE;
+
+    for $key (sort keys %$Entries)
+    {
+      print FHIDX "$key\t$Entries->{$key}->{href}\n";
+    }
+  }
+
+  my $Pages = GetIndexPages($Entries);
+  my $page;
+  my $first_page = shift @$Pages;
+  my $sec_name = $section;
+  # remove section number
+  $sec_name =~ s/.*? // if $sec_name =~ /^([A-Z]|\d+)\./;
+
+  ($first_page->{href} = sec_href($section)) =~ s/\#.*$//;
+  # Update tree structure of document
+  if (@$Pages)
+  {
+    my $sec;
+    my @after;
+
+    while (@sections && $sections[$#sections] ne $section)
+    {
+      unshift @after, pop @sections;
+    }
+
+    for $page (@$Pages)
+    {
+      my $node = ($page->{First} ne $page->{Last} ? 
+                 "$sec_name: $page->{First} -- $page->{Last}" :
+                 "$sec_name: $page->{First}");
+      push @sections, $node;
+      $node2sec{$node} = $node;
+      $sec2node{$node} = $node;
+      $node2up{$node} = $section;
+      $page->{href} = next_doc();
+      $page->{name} = $node;
+      $node2href{$node} = $page->{href};
+      if ($prev_node)
+      {
+       $node2next{$prev_node} = $node;
+       $node2prev{$node} = $prev_node;
+      }
+      $prev_node = $node;
+    }
+    push @sections, @after;
+  }
+
+  my $summary = GetIndexSummary($first_page, $Pages, $name);
+  PrintIndexPage($lines, $summary, $first_page, $name);
+  for $page (@$Pages)
+  {
+    push @$lines, ($T2H_SPLIT eq 'chapter' ? $CHAPTEREND : $SECTIONEND);
+    push @$lines, "<H2 ALIGN=\"Left\">$page->{name}</H2>\n";
+    PrintIndexPage($lines, $summary, $page, $name);
+  }
+}
+
+
+#+++############################################################################
+#                                                                              #
+# Pass 2/3: handle style, menu, index, cross-reference                         #
+#                                                                              #
+#---############################################################################
+
+@lines2 = ();                          # whole document (2nd pass)
+@lines3 = ();                          # whole document (3rd pass)
+$in_menu = 0;                          # am I inside a menu
+
+while (@lines) {
+    $_ = shift(@lines);
+    #
+    # special case (protected sections)
+    #
+    if (/^$PROTECTTAG/o) {
+       push(@lines2, $_);
+       next;
+    }
+    #
+    # menu
+    #
+    if (/^\@menu\b/)
+    {
+      $in_menu = 1;
+      $in_menu_listing = 1;
+      push(@lines2, &debug("<BLOCKQUOTE><TABLE BORDER=0 CELLSPACING=0> \n", __LINE__));
+      next;
+    }
+    if (/^\@end\s+menu\b/)
+    {
+      if ($in_menu_listing)
+      {
+       push(@lines2, &debug("</TABLE></BLOCKQUOTE>\n", __LINE__));
+      }
+      else
+      {
+       push(@lines2, &debug("</BLOCKQUOTE>\n", __LINE__));
+      }
+      $in_menu = 0;
+      $in_menu_listing = 0;
+      next;
+    }
+    if ($in_menu) 
+    {
+      my ($node, $name, $descr);
+      if (/^\*\s+($NODERE)::/o)
+      {
+       $node = $1;
+       $descr = $';
+      }
+      elsif (/^\*\s+(.+):\s+([^\t,\.\n]+)[\t,\.\n]/)
+      {
+       $name = $1;
+       $node = $2;
+       $descr = $';
+      }
+      elsif (/^\*/) 
+      {
+       warn "$ERROR Bad menu line: $_";
+      }
+      else
+      {
+       if ($in_menu_listing)
+       {
+         $in_menu_listing = 0;
+         push(@lines2, &debug("</TABLE>\n", __LINE__));
+       }
+       # should be like verbatim -- preseve spaces, etc
+       s/ /\&nbsp;/g;
+       $_ .= "<br>\n";
+       push(@lines2, $_);
+      }
+      if ($node)
+      {
+       if (! $in_menu_listing)
+       {
+         $in_menu_listing = 1;
+         push(@lines2, &debug("<TABLE BORDER=0 CELLSPACING=0>\n", __LINE__));
+       }
+       # look for continuation
+       while ($lines[0] =~ /^\s+\w+/)
+       {
+         $descr .= shift(@lines);
+       }
+       &menu_entry($node, $name, $descr);
+      } 
+      next;
+    }
+    #
+    # printindex
+    #
+    PrintIndex(\@lines2, $2, $1), next
+      if (/^<!--::(.*)::-->\@printindex\s+(\w+)/);
+    #
+    # simple style substitutions
+    #
+    $_ = &substitute_style($_);
+    #
+    # xref
+    #
+    while (/\@(x|px|info|)ref{([^{}]+)(}?)/) {
+       # note: Texinfo may accept other characters
+       ($type, $nodes, $full) = ($1, $2, $3);
+       ($before, $after) = ($`, $');
+       if (! $full && $after) {
+           warn "$ERROR Bad xref (no ending } on line): $_";
+           $_ = "$before$;0${type}ref\{$nodes$after";
+           next; # while xref
+       }
+       if ($type eq 'x') {
+           $type = "$T2H_WORDS->{$T2H_LANG}->{'See'} ";
+       } elsif ($type eq 'px') {
+           $type = "$T2H_WORDS->{$T2H_LANG}->{'see'} ";
+       } elsif ($type eq 'info') {
+           $type = "$T2H_WORDS->{$T2H_LANG}->{'See'} Info";
+       } else {
+           $type = '';
+       }
+       unless ($full) {
+           $next = shift(@lines);
+           $next = &substitute_style($next);
+           chop($nodes); # remove final newline
+           if ($next =~ /\}/) { # split on 2 lines
+               $nodes .= " $`";
+               $after = $';
+           } else {
+               $nodes .= " $next";
+               $next = shift(@lines);
+               $next = &substitute_style($next);
+               chop($nodes);
+               if ($next =~ /\}/) { # split on 3 lines
+                   $nodes .= " $`";
+                   $after = $';
+               } else {
+                   warn "$ERROR Bad xref (no ending }): $_";
+                   $_ = "$before$;0xref\{$nodes$after";
+                   unshift(@lines, $next);
+                   next; # while xref
+               }
+           }
+       }
+       $nodes =~ s/\s+/ /g; # remove useless spaces
+       @args = split(/\s*,\s*/, $nodes);
+       $node = $args[0]; # the node is always the first arg
+       $node = &normalise_node($node);
+       $sec = $args[2] || $args[1] || $node2sec{$node};
+       $href = $node2href{$node};
+       if (@args == 5) { # reference to another manual
+           $sec = $args[2] || $node;
+           $man = $args[4] || $args[3];
+           $_ = "${before}${type}$T2H_WORDS->{$T2H_LANG}->{'section'} `$sec' in \@cite{$man}$after";
+       } elsif ($type =~ /Info/) { # inforef
+           warn "$ERROR Wrong number of arguments: $_" unless @args == 3;
+           ($nn, $_, $in) = @args;
+           $_ = "${before}${type} file `$in', node `$nn'$after";
+       } elsif ($sec && $href && ! $T2H_SHORT_REF) {
+           $_  = "${before}${type}";
+           $_ .= "$T2H_WORDS->{$T2H_LANG}->{'section'} " if ${type};
+           $_ .= &t2h_anchor('', $href, $sec) . $after;
+       } 
+       elsif ($href)
+       {
+         $_ = "${before}${type} " . 
+           &t2h_anchor('', $href, $args[2] || $args[1] || $node) . 
+             $after;
+       }
+       else {
+           warn "$ERROR Undefined node ($node): $_";
+           $_ = "$before$;0xref{$nodes}$after";
+       }
+    }
+
+    # replace images
+    s[\@image\s*{(.+?)}]
+    {
+     my @args = split (/\s*,\s*/, $1);
+     my $base = $args[0];
+     my $image = 
+       LocateIncludeFile("$base.png") || 
+       LocateIncludeFile("$base.jpg") ||
+       LocateIncludeFile("$base.gif");
+     warn "$ERROR no image file for $base: $_" unless ($image && -e $image);
+     "<IMG SRC=\"$image\" ALT=\"$base\">";
+     ($T2H_CENTER_IMAGE ?
+      "<CENTER><IMG SRC=\"$image\" ALT=\"$base\"></CENTER>" :
+      "<IMG SRC=\"$image\" ALT=\"$base\">");
+    }eg;
+
+    #
+    # try to guess bibliography references or glossary terms
+    #
+    unless (/^<H\d><A NAME=\"SEC\d/) {
+       if ($use_bibliography) {
+           $done = '';
+           while (/$BIBRE/o) {
+               ($pre, $what, $post) = ($`, $&, $');
+               $href = $bib2href{$what};
+               if (defined($href) && $post !~ /^[^<]*<\/A>/) {
+                   $done .= $pre . &t2h_anchor('', $href, $what);
+               } else {
+                   $done .= "$pre$what";
+               }
+               $_ = $post;
+           }
+           $_ = $done . $_;
+       }
+       if ($T2H_USE_GLOSSARY) {
+           $done = '';
+           while (/\b\w+\b/) {
+               ($pre, $what, $post) = ($`, $&, $');
+               $entry = $what;
+               $entry =~ tr/A-Z/a-z/ unless $entry =~ /^[A-Z\s]+$/;
+               $href = $gloss2href{$entry};
+               if (defined($href) && $post !~ /^[^<]*<\/A>/) {
+                   $done .= $pre . &t2h_anchor('', $href, $what);
+               } else {
+                   $done .= "$pre$what";
+               }
+               $_ = $post;
+           }
+           $_ = $done . $_;
+       }
+    }
+    # otherwise
+    push(@lines2, $_);
+}
+print "# end of pass 2\n" if $T2H_VERBOSE;
+
+#
+# split style substitutions
+#
+while (@lines2) {
+    $_ = shift(@lines2);
+    #
+    # special case (protected sections)
+    #
+    if (/^$PROTECTTAG/o) {
+       push(@lines3, $_);
+       next;
+    }
+    #
+    # split style substitutions
+    #
+    $old = '';
+    while ($old ne $_) {
+        $old = $_;
+       if (/\@(\w+)\{/) {
+           ($before, $style, $after) = ($`, $1, $');
+           if (defined($style_map{$style})) {
+               $_ = $after;
+               $text = '';
+               $after = '';
+               $failed = 1;
+               while (@lines2) {
+                   if (/\}/) {
+                       $text .= $`;
+                       $after = $';
+                       $failed = 0;
+                       last;
+                   } else {
+                       $text .= $_;
+                       $_ = shift(@lines2);
+                   }
+               }
+               if ($failed) {
+                   die "* Bad syntax (\@$style) after: $before\n";
+               } else {
+                   $text = &apply_style($style, $text);
+                   $_ = "$before$text$after";
+               }
+           }
+       }
+    }
+    # otherwise
+    push(@lines3, $_);
+}
+print "# end of pass 3\n" if $T2H_VERBOSE;
+       
+#+++############################################################################
+#                                                                              #
+# Pass 4: foot notes, final cleanup                                            #
+#                                                                              #
+#---############################################################################
+
+@foot_lines = ();                      # footnotes
+@doc_lines = ();                       # final document
+$end_of_para = 0;                      # true if last line is <P>
+       
+while (@lines3) {
+    $_ = shift(@lines3);
+    #
+    # special case (protected sections)
+    #
+    if (/^$PROTECTTAG/o) {
+       push(@doc_lines, $_);
+       $end_of_para = 0;
+       next;
+    }
+    #
+    # footnotes
+    #
+    while (/\@footnote([^\{\s]+)\{/) {
+       ($before, $d, $after) = ($`, $1, $');
+       $_ = $after;
+       $text = '';
+       $after = '';
+       $failed = 1;
+       while (@lines3) {
+           if (/\}/) {
+               $text .= $`;
+               $after = $';
+               $failed = 0;
+               last;
+           } else {
+               $text .= $_;
+               $_ = shift(@lines3);
+           }
+       }
+       if ($failed) {
+           die "* Bad syntax (\@footnote) after: $before\n";
+       } else {
+           $foot_num++;
+           $docid  = "DOCF$foot_num";
+           $footid = "FOOT$foot_num";
+           $foot = "($foot_num)";
+           push(@foot_lines, "<H3>" . &t2h_anchor($footid, "$d#$docid", $foot) . "</H3>\n");
+           $text = "<P>$text" unless $text =~ /^\s*<P>/;
+           push(@foot_lines, "$text\n");
+           $_ = $before . &t2h_anchor($docid, "$docu_foot#$footid", $foot) . $after;
+       }
+    }
+    #
+    # remove unnecessary <P>
+    #
+    if (/^\s*<P>\s*$/) {
+       next if $end_of_para++;
+    } else {
+       $end_of_para = 0;
+    }
+    # otherwise
+    push(@doc_lines, $_);
+}
+       
+print "# end of pass 4\n" if $T2H_VERBOSE;
+
+#+++############################################################################
+#                                                                              #
+# Pass 5: print things                                                         #
+#                                                                              #
+#---############################################################################
+
+$T2H_L2H = &l2h_FinishToLatex if ($T2H_L2H);
+$T2H_L2H = &l2h_ToHtml        if ($T2H_L2H);
+$T2H_L2H = &l2h_InitFromHtml  if ($T2H_L2H);
+
+# fix node2up, node2prev, node2next, if desired
+if ($has_top_command)
+{
+  for $section (keys %sec2number)
+  {
+    $node = $sec2node{$section};
+    $node2up{$node} = Sec2UpNode($section) unless $node2up{$node};
+    $node2prev{$node} = Sec2PrevNode($section) unless $node2prev{$node};
+    $node2next{$node} = Sec2NextNode($section) unless $node2next{$node};
+  }
+}
+
+# prepare %T2H_THISDOC
+$T2H_THISDOC{fulltitle} = $value{'_title'} || $value{'_settitle'} || "Untitled Document";
+$T2H_THISDOC{title} = $value{'_settitle'} || $T2H_THISDOC{fulltitle};
+$T2H_THISDOC{author} = $value{'_author'};
+$T2H_THISDOC{subtitle} = $value{'_subtitle'};
+$T2H_THISDOC{shorttitle} = $value{'_shorttitle'};
+for $key (keys %T2H_THISDOC)
+{
+  $_ = &substitute_style($T2H_THISDOC{$key});
+  &unprotect_texi;
+  s/\s*$//;
+  $T2H_THISDOC{$key} = $_;
+}
+
+# if no sections, then simply print document as is
+unless (@sections)
+{
+  print "# Writing content into $docu_top_file \n" if $T2H_VERBOSE;
+  open(FILE, "> $docu_top_file") 
+    || die "$ERROR: Can't open $docu_top_file for writing: $!\n";
+
+  &$T2H_print_page_head(\*FILE);
+  $T2H_THIS_SECTION = \@doc_lines;
+  t2h_print_lines(\*FILE);
+  &$T2H_print_foot_navigation(\*FILE);
+  &$T2H_print_page_foot(\*FILE);
+  close(FILE);
+  goto Finish;
+}
+
+# initialize $T2H_HREF, $T2H_NAME
+%T2H_HREF = 
+  (
+   'First' ,   sec_href($sections[0]),
+   'Last',     sec_href($sections[$#sections]),
+   'About',     $docu_about. '#SEC_About',
+  );
+
+# prepare TOC, OVERVIEW, TOP
+$T2H_TOC = \@toc_lines;
+$T2H_OVERVIEW = \@stoc_lines;
+if ($has_top)
+{
+  while (1)
+  {
+    $_ = shift @doc_lines;
+    last if /$TOPEND/;
+    push @$T2H_TOP, $_;
+  }
+  $T2H_HREF{'Top'} = $docu_top . '#SEC_Top';
+}
+else
+{
+  $T2H_HREF{'Top'} = $T2H_HREF{First};
+}
+
+$node2href{Top} = $T2H_HREF{Top};
+$T2H_HREF{Contents} = $docu_toc.'#SEC_Contents' if @toc_lines;
+$T2H_HREF{Overview} = $docu_stoc.'#SEC_OVERVIEW' if @stoc_lines;
+
+# settle on index
+if ($T2H_INDEX_CHAPTER)
+{
+  $T2H_HREF{Index} = $node2href{normalise_node($T2H_INDEX_CHAPTER)};
+  warn "$ERROR T2H_INDEX_CHAPTER '$T2H_INDEX_CHAPTER' not found\n"
+    unless $T2H_HREF{Index};
+}
+if (! $T2H_HREF{Index} && $first_index_chapter)
+{
+  $T2H_INDEX_CHAPTER = $first_index_chapter;
+  $T2H_HREF{Index} = $node2href{$T2H_INDEX_CHAPTER};
+}
+
+print "# Using '" . clean_name($T2H_INDEX_CHAPTER) . "' as index page\n"
+  if ($T2H_VERBOSE && $T2H_HREF{Index});
+
+%T2H_NAME =
+  (
+   'First',   clean_name($sec2node{$sections[0]}),
+   'Last',    clean_name($sec2node{$sections[$#sections]}),
+   'About',    $T2H_WORDS->{$T2H_LANG}->{'About_Title'},
+   'Contents', $T2H_WORDS->{$T2H_LANG}->{'ToC_Title'},
+   'Overview', $T2H_WORDS->{$T2H_LANG}->{'Overview_Title'},
+   'Index' ,   clean_name($T2H_INDEX_CHAPTER),
+   'Top',      clean_name($T2H_TOP_HEADING || $T2H_THISDOC{'title'} || $T2H_THISDOC{'shorttitle'}),
+  );
+
+#############################################################################
+# print frame and frame toc file
+#
+if ( $T2H_FRAMES )
+{
+  open(FILE, "> $docu_frame_file") 
+    || die "$ERROR: Can't open $docu_frame_file for writing: $!\n";
+  print "# Creating frame in $docu_frame_file ...\n" if $T2H_VERBOSE;
+  &$T2H_print_frame(\*FILE);
+  close(FILE);
+
+  open(FILE, "> $docu_toc_frame_file") 
+    || die "$ERROR: Can't open $docu_toc_frame_file for writing: $!\n";
+  print "# Creating toc frame in $docu_frame_file ...\n" if $T2H_VERBOSE;
+   &$T2H_print_toc_frame(\*FILE);
+  close(FILE);
+}
+
+
+#############################################################################
+# print Top
+#
+open(FILE, "> $docu_top_file") 
+  || die "$ERROR: Can't open $docu_top_file for writing: $!\n";
+&$T2H_print_page_head(\*FILE) unless ($T2H_SPLIT);
+
+if ($has_top)
+{
+  print "# Creating Top in $docu_top_file ...\n" if $T2H_VERBOSE;
+  $T2H_THIS_SECTION = $T2H_TOP;
+  $T2H_HREF{This} = $T2H_HREF{Top};
+  $T2H_NAME{This} = $T2H_NAME{Top};
+  &$T2H_print_Top(\*FILE);
+}
+  
+close(FILE) if $T2H_SPLIT;
+
+#############################################################################
+# Print sections
+#
+$T2H_NODE{Forward} = $sec2node{$sections[0]};
+$T2H_NAME{Forward} = &clean_name($sec2node{$sections[0]});
+$T2H_HREF{Forward} = sec_href($sections[0]);
+$T2H_NODE{This} = 'Top';
+$T2H_NAME{This} = $T2H_NAME{Top};
+$T2H_HREF{This} = $T2H_HREF{Top};
+if ($T2H_SPLIT)
+{
+  print "# writing " . scalar(@sections) . 
+    " sections in $docu_rdir$docu_name"."_[1..$doc_num]"
+         if $T2H_VERBOSE;
+  $previous = ($T2H_SPLIT eq 'chapter' ? $CHAPTEREND : $SECTIONEND);
+  undef $FH;
+  $doc_num = 0;
+}
+else
+{
+  print "# writing " . scalar(@sections) . " sections in $docu_top_file ..." 
+    if $T2H_VERBOSE;
+  $FH = \*FILE;
+  $previous = '';
+}
+
+$counter = 0;
+# loop through sections
+while ($section = shift(@sections)) 
+{
+  if ($T2H_SPLIT && ($T2H_SPLIT eq 'section' || $previous eq $CHAPTEREND))
+  { 
+    if ($FH)
+    {
+      #close previous page
+      &$T2H_print_chapter_footer($FH) if $T2H_SPLIT eq 'chapter';
+      &$T2H_print_page_foot($FH);
+      close($FH);
+      undef $FH;
+    }
+  }
+  $T2H_NAME{Back} = $T2H_NAME{This};
+  $T2H_HREF{Back} = $T2H_HREF{This};
+  $T2H_NODE{Back} = $T2H_NODE{This};
+  $T2H_NAME{This} = $T2H_NAME{Forward};
+  $T2H_HREF{This} = $T2H_HREF{Forward};
+  $T2H_NODE{This} = $T2H_NODE{Forward};
+  if ($sections[0])
+  {
+    $T2H_NODE{Forward} = $sec2node{$sections[0]};
+    $T2H_NAME{Forward} = &clean_name($T2H_NODE{Forward});
+    $T2H_HREF{Forward} = sec_href($sections[0]);
+  }
+  else
+  {
+    undef $T2H_HREF{Forward}, $T2H_NODE{Forward}, $T2H_NAME{Forward};
+  }
+
+  $node = $node2up{$T2H_NODE{This}};
+  $T2H_HREF{Up} = $node2href{$node};
+  if ($T2H_HREF{Up} eq $T2H_HREF{This} || ! $T2H_HREF{Up})
+  {
+    $T2H_NAME{Up} = $T2H_NAME{Top};
+    $T2H_HREF{Up} = $T2H_HREF{Top};
+    $T2H_NODE{Up} = 'Up';
+  }
+  else
+  {
+    $T2H_NAME{Up} = &clean_name($node);
+    $T2H_NODE{Up} = $node;
+  }
+
+  $node = $T2H_NODE{This};
+  $node = $node2prev{$node};
+  $T2H_NAME{Prev} = &clean_name($node);
+  $T2H_HREF{Prev} = $node2href{$node};
+  $T2H_NODE{Prev} = $node;
+
+  $node = $T2H_NODE{This};
+  if ($node2up{$node} && $node2up{$node} ne 'Top'&&
+      ($node2prev{$node} eq $T2H_NODE{Back} || ! $node2prev{$node}))
+  {
+    $node = $node2up{$node};
+    while ($node && $node ne $node2up{$node} && ! $node2prev{$node})
+    {
+      $node = $node2up{$node};
+    }
+    $node = $node2prev{$node} 
+      unless $node2up{$node} eq 'Top' || ! $node2up{$node};
+  }
+  else
+  {
+    $node = $node2prev{$node};
+  }
+  $T2H_NAME{FastBack} = &clean_name($node);
+  $T2H_HREF{FastBack} = $node2href{$node};
+  $T2H_NODE{FastBack} = $node;
+  
+  $node = $T2H_NODE{This};
+  $node = $node2next{$node};
+  $T2H_NAME{Next} = &clean_name($node);
+  $T2H_HREF{Next} = $node2href{$node};
+  $T2H_NODE{Next} = $node;
+
+  $node = $T2H_NODE{This};
+  if ($node2up{$node} && $node2up{$node} ne 'Top'&& 
+      ($node2next{$node} eq $T2H_NODE{Forward} || ! $node2next{$node}))
+  {
+    $node = $node2up{$node};
+    while ($node && $node ne $node2up{$node} && ! $node2next{$node})
+    {
+      $node = $node2up{$node};
+    }
+  }
+  $node = $node2next{$node};
+  $T2H_NAME{FastForward} = &clean_name($node);
+  $T2H_HREF{FastForward} = $node2href{$node};
+  $T2H_NODE{FastForward} = $node;
+
+  if (! defined($FH))
+  {
+    my $file = $T2H_HREF{This};
+    $file =~ s/\#.*$//;
+    open(FILE, "> $docu_rdir$file") || 
+      die "$ERROR: Can't open $docu_rdir$file for writing: $!\n";
+    $FH = \*FILE;
+    &$T2H_print_page_head($FH);
+    t2h_print_label($FH);
+    &$T2H_print_chapter_header($FH) if $T2H_SPLIT eq 'chapter';
+  }
+  else
+  {
+    t2h_print_label($FH);
+  }
+
+  $T2H_THIS_SECTION = [];
+  while (@doc_lines) {
+    $_ = shift(@doc_lines);
+    last if ($_ eq $SECTIONEND || $_ eq $CHAPTEREND);
+    push(@$T2H_THIS_SECTION, $_);
+  }
+  $previous = $_;
+  &$T2H_print_section($FH);
+
+  if ($T2H_VERBOSE)
+  {
+    $counter++;
+    print "." if $counter =~ /00$/;
+  }
+}
+if ($T2H_SPLIT)
+{
+  &$T2H_print_chapter_footer($FH) if $T2H_SPLIT eq 'chapter';
+  &$T2H_print_page_foot($FH);
+  close($FH);
+}
+print "\n" if $T2H_VERBOSE;
+
+#############################################################################
+# Print ToC, Overview, Footnotes
+#
+undef $T2H_HREF{Prev};
+undef $T2H_HREF{Next};
+undef $T2H_HREF{Back};
+undef $T2H_HREF{Forward};
+undef $T2H_HREF{Up};
+
+if (@foot_lines)
+{
+  print "# writing Footnotes in $docu_foot_file...\n" if $T2H_VERBOSE;
+  open (FILE, "> $docu_foot_file") || die "$ERROR: Can't open $docu_foot_file for writing: $!\n"
+      if $T2H_SPLIT;
+  $T2H_HREF{This} = $docu_foot;
+  $T2H_NAME{This} = $T2H_WORDS->{$T2H_LANG}->{'Footnotes_Title'};
+  $T2H_THIS_SECTION = \@foot_lines;
+  &$T2H_print_Footnotes(\*FILE);
+  close(FILE) if $T2H_SPLIT;
+}
+
+if (@toc_lines)
+{
+  print "# writing Toc in $docu_toc_file...\n" if $T2H_VERBOSE;
+  open (FILE, "> $docu_toc_file") || die "$ERROR: Can't open $docu_toc_file for writing: $!\n"
+      if $T2H_SPLIT;
+  $T2H_HREF{This} = $T2H_HREF{Contents};
+  $T2H_NAME{This} = $T2H_NAME{Contents};
+  $T2H_THIS_SECTION = \@toc_lines;
+  &$T2H_print_Toc(\*FILE);
+  close(FILE) if $T2H_SPLIT;
+}
+
+if (@stoc_lines)
+{
+  print "# writing Overview in $docu_stoc_file...\n" if $T2H_VERBOSE;
+  open (FILE, "> $docu_stoc_file") || die "$ERROR: Can't open $docu_stoc_file for writing: $!\n"
+      if $T2H_SPLIT;
+  
+  $T2H_HREF{This} = $T2H_HREF{Overview};
+  $T2H_NAME{This} = $T2H_NAME{Overview};
+  $T2H_THIS_SECTION = \@stoc_lines;
+  unshift @$T2H_THIS_SECTION, "<BLOCKQUOTE>\n";
+  push @$T2H_THIS_SECTION, "\n</BLOCKQUOTE>\n";
+  &$T2H_print_Overview(\*FILE);
+  close(FILE) if $T2H_SPLIT;
+}
+
+if ($about_body = &$T2H_about_body())
+{
+  print "# writing About in $docu_about_file...\n" if $T2H_VERBOSE;
+  open (FILE, "> $docu_about_file") || die "$ERROR: Can't open $docu_about_file for writing: $!\n"
+      if $T2H_SPLIT;
+  
+  $T2H_HREF{This} = $T2H_HREF{About};
+  $T2H_NAME{This} = $T2H_NAME{About};
+  $T2H_THIS_SECTION = [$about_body];
+  &$T2H_print_About(\*FILE);
+  close(FILE) if $T2H_SPLIT;
+}
+
+unless ($T2H_SPLIT)
+{
+  &$T2H_print_page_foot(\*FILE);
+  close (FILE);
+}
+  
+Finish:
+&l2h_FinishFromHtml if ($T2H_L2H);
+&l2h_Finish if($T2H_L2H);
+print "# that's all folks\n" if $T2H_VERBOSE;
+
+exit(0);
+
+#+++############################################################################
+#                                                                              #
+# Low level functions                                                          #
+#                                                                              #
+#---############################################################################
+
+sub LocateIncludeFile
+{
+  my $file = shift;
+  my $dir;
+
+  return $file if (-e $file && -r $file);
+  foreach $dir (@T2H_INCLUDE_DIRS)
+  {
+    return "$dir/$file" if (-e "$dir/$file" && -r "$dir/$file");
+  }
+  return undef;
+}
+
+sub clean_name 
+{
+  local ($_);
+  $_ = &remove_style($_[0]);
+  &unprotect_texi;
+  return $_;
+}
+
+sub update_sec_num {
+    local($name, $level) = @_;
+    my $ret;
+
+    $level--; # here we start at 0
+    if ($name =~ /^appendix/ || defined(@appendix_sec_num)) {
+       # appendix style
+       if (defined(@appendix_sec_num)) {
+           &incr_sec_num($level, @appendix_sec_num);
+       } else {
+           @appendix_sec_num = ('A', 0, 0, 0);
+       }
+       $ret = join('.', @appendix_sec_num[0..$level]);
+    } else {
+       # normal style
+       if (defined(@normal_sec_num)) 
+       {
+         &incr_sec_num($level, @normal_sec_num);
+       } 
+       else 
+       {
+         @normal_sec_num = (1, 0, 0, 0);
+       }
+       $ret = join('.', @normal_sec_num[0..$level]);
+    }
+    
+    $ret .= "." if $level == 0;
+    return $ret;
+}
+
+sub incr_sec_num {
+    local($level, $l);
+    $level = shift(@_);
+    $_[$level]++;
+    foreach $l ($level+1 .. 3) {
+       $_[$l] = 0;
+    }
+}
+
+sub Sec2UpNode
+{
+  my $sec = shift;
+  my $num = $sec2number{$sec};
+
+  return '' unless $num;
+  return 'Top' unless $num =~ /\.\d+/;
+  $num =~ s/\.[^\.]*$//;
+  $num = $num . '.' unless $num =~ /\./;
+  return $sec2node{$number2sec{$num}};
+}
+
+sub Sec2PrevNode
+{
+  my $sec = shift;
+  my $num = $sec2number{$sec};
+  my ($i, $post);
+  
+  if ($num =~ /(\w+)(\.$|$)/)
+  {
+    $num = $`;
+    $i = $1;
+    $post = $2;
+    if ($i eq 'A')
+    {
+      $i = $normal_sec_num[0];
+    }
+    elsif ($i ne '1')
+    {
+      # unfortunately, -- operator is not magical
+      $i = chr(ord($i) + 1);
+    }
+    else
+    {
+      return '';
+    }
+    return $sec2node{$number2sec{$num . $i . $post}}
+  }
+  return '';
+}
+
+sub Sec2NextNode
+{
+  my $sec = shift;
+  my $num = $sec2number{$sec};
+  my $i;
+
+  if ($num =~ /(\w+)(\.$|$)/)
+  {
+    $num = $`;
+    $i = $1;
+    $post = $2;
+    if ($post eq '.' && $i eq $normal_sec_num[0])
+    {
+      $i = 'A';
+    }
+    else
+    {
+      $i++;
+    }
+    return $sec2node{$number2sec{$num . $i . $post}}
+  }
+  return '';
+}
+
+sub check {
+    local($_, %seen, %context, $before, $match, $after);
+
+    while (<>) {
+       if (/\@(\*|\.|\:|\@|\{|\})/) {
+           $seen{$&}++;
+           $context{$&} .= "> $_" if $T2H_VERBOSE;
+           $_ = "$`XX$'";
+           redo;
+       }
+       if (/\@(\w+)/) {
+           ($before, $match, $after) = ($`, $&, $');
+           if ($before =~ /\b[\w-]+$/ && $after =~ /^[\w-.]*\b/) { # e-mail address
+               $seen{'e-mail address'}++;
+               $context{'e-mail address'} .= "> $_" if $T2H_VERBOSE;
+           } else {
+               $seen{$match}++;
+               $context{$match} .= "> $_" if $T2H_VERBOSE;
+           }
+           $match =~ s/^\@/X/;
+           $_ = "$before$match$after";
+           redo;
+       }
+    }
+    
+    foreach (sort(keys(%seen))) {
+       if ($T2H_VERBOSE) {
+           print "$_\n";
+           print $context{$_};
+       } else {
+           print "$_ ($seen{$_})\n";
+       }
+    }
+}
+
+sub open {
+    local($name) = @_;
+
+    ++$fh_name;
+    if (open($fh_name, $name)) {
+       unshift(@fhs, $fh_name);
+    } else {
+       warn "$ERROR Can't read file $name: $!\n";
+    }
+}
+
+sub init_input {
+    @fhs = ();                 # hold the file handles to read
+    @input_spool = ();         # spooled lines to read
+    $fh_name = 'FH000';
+    &open($docu);
+}
+
+sub next_line {
+    local($fh, $line);
+
+    if (@input_spool) {
+       $line = shift(@input_spool);
+       return($line);
+    }
+    while (@fhs) {
+       $fh = $fhs[0];
+       $line = <$fh>;
+       return($line) if $line;
+       close($fh);
+       shift(@fhs);
+    }
+    return(undef);
+}
+
+# used in pass 1, use &next_line
+sub skip_until {
+    local($tag) = @_;
+    local($_);
+
+    while ($_ = &next_line) {
+       return if /^\@end\s+$tag\s*$/;
+    }
+    die "* Failed to find '$tag' after: " . $lines[$#lines];
+}
+
+# used in pass 1 for l2h use &next_line
+sub string_until {
+    local($tag) = @_;
+    local($_, $string);
+
+    while ($_ = &next_line) {
+       return $string if /^\@end\s+$tag\s*$/;
+#      $_ =~ s/hbox/mbox/g;
+       $string = $string.$_;
+    }
+    die "* Failed to find '$tag' after: " . $lines[$#lines];
+}
+
+#
+# HTML stacking to have a better HTML output
+#
+
+sub html_reset {
+    @html_stack = ('html');
+    $html_element = 'body';
+}
+
+sub html_push {
+    local($what) = @_;
+    push(@html_stack, $html_element);
+    $html_element = $what;
+}
+
+sub html_push_if {
+    local($what) = @_;
+    push(@html_stack, $html_element)
+       if ($html_element && $html_element ne 'P');
+    $html_element = $what;
+}
+
+sub html_pop {
+    $html_element = pop(@html_stack);
+}
+
+sub html_pop_if {
+    local($elt);
+
+    if (@_) {
+       foreach $elt (@_) {
+           if ($elt eq $html_element) {
+               $html_element = pop(@html_stack) if @html_stack;
+               last;
+           }
+       }
+    } else {
+       $html_element = pop(@html_stack) if @html_stack;
+    }
+}
+
+sub html_debug {
+    local($what, $line) = @_;
+    if ($T2H_DEBUG & $DEBUG_HTML)
+    {
+     $what = "\n" unless $what;
+     return("<!-- $line @html_stack, $html_element -->$what")
+    }  
+    return($what);
+}
+
+# to debug the output...
+sub debug {
+    local($what, $line) = @_;
+    return("<!-- $line -->$what")
+       if $T2H_DEBUG & $DEBUG_HTML;
+    return($what);
+}
+
+sub SimpleTexi2Html
+{
+  local $_ = $_[0];
+  &protect_texi;
+  &protect_html;
+  $_ = substitute_style($_);
+  $_[0]  = $_;
+}
+
+sub normalise_node {
+  local $_ = $_[0];
+  s/\s+/ /g;
+  s/ $//;
+  s/^ //;
+  &protect_texi;
+  &protect_html;
+  $_ = substitute_style($_);
+  $_[0]  = $_;
+}
+
+sub menu_entry 
+{
+  my ($node, $name, $descr) = @_;
+  my ($href, $entry);
+  
+  &normalise_node($node);
+  $href = $node2href{$node};
+  if ($href) 
+  {
+    $descr =~ s/^\s+//;
+    $descr =~ s/\s*$//;
+    $descr = SimpleTexi2Html($descr);
+    if ($T2H_NUMBER_SECTIONS && !$T2H_NODE_NAME_IN_MENU && $node2sec{$node})
+    {
+      $entry = $node2sec{$node};
+      $name = '';
+    }
+    else
+    {
+      &normalise_node($name);
+      $entry = ($name && ($name ne $node || ! $T2H_AVOID_MENU_REDUNDANCY) 
+               ? "$name : $node" : $node);
+    }
+
+    if ($T2H_AVOID_MENU_REDUNDANCY && $descr)
+    {
+      my $clean_entry = $entry;
+      $clean_entry =~ s/^.*? // if ($clean_entry =~ /^([A-Z]|\d+)\.[\d\.]* /);
+      $clean_entry =~ s/[^\w]//g;
+      my $clean_descr = $descr;
+      $clean_descr =~ s/[^\w]//g;
+      $descr = '' if ($clean_entry eq $clean_descr)
+    }
+    push(@lines2,&debug('<TR><TD ALIGN="left" VALIGN="TOP">' . 
+                       &t2h_anchor('', $href, $entry) . 
+                       '</TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">' . 
+                       $descr . 
+                       "</TD></TR>\n", __LINE__));
+  }
+  elsif ($node =~ /^\(.*\)\w+/)
+  {
+    push(@lines2,&debug('<TR><TD ALIGN="left" VALIGN="TOP">' . 
+                       $entry . 
+                       '</TD><TD ALIGN="left" VALIGN="TOP">' . $descr . 
+                       "</TD></TR>\n", __LINE__))
+  }
+  else
+  {
+    warn "$ERROR Undefined node of menu_entry ($node): $_";
+  }
+}
+
+sub do_ctrl { "^$_[0]" }
+
+sub do_email {
+    local($addr, $text) = split(/,\s*/, $_[0]);
+
+    $text = $addr unless $text;
+    &t2h_anchor('', "mailto:$addr", $text);
+}
+
+sub do_sc 
+{ 
+  # l2h does this much better
+  return &l2h_ToLatex("{\\sc ".&unprotect_html($_[0])."}") if ($T2H_L2H);
+  return "\U$_[0]\E";
+}
+
+sub do_math
+{
+  return &l2h_ToLatex("\$".&unprotect_html($_[0])."\$") if ($T2H_L2H);
+  return "<EM>".$text."</EM>";
+}
+
+sub do_uref {
+    local($url, $text, $only_text) = split(/,\s*/, $_[0]);
+
+    $text = $only_text if $only_text;
+    $text = $url unless $text;
+    &t2h_anchor('', $url, $text);
+}
+
+sub do_url { &t2h_anchor('', $_[0], $_[0]) }
+
+sub do_acronym
+{
+  return '<FONT SIZE="-1">' . $_[0] . '</FONT>';
+}
+
+sub do_accent
+{
+  return "&$_[0]acute;" if $_[1] eq 'H';
+  return "$_[0]." if $_[1] eq 'dotaccent';
+  return "$_[0]*" if $_[1] eq 'ringaccent';
+  return "$_[0]".'[' if $_[1] eq 'tieaccent';
+  return "$_[0]".'(' if $_[1] eq 'u';
+  return "$_[0]_" if $_[1] eq 'ubaraccent';
+  return ".$_[0]" if $_[1] eq 'udotaccent';
+  return "$_[0]&lt;" if $_[1] eq 'v';
+  return "&$_[0]cedil;" if $_[1] eq ',';
+  return "$_[0]" if $_[1] eq 'dotless';
+  return undef;
+}
+
+sub apply_style {
+    local($texi_style, $text) = @_;
+    local($style);
+
+    $style = $style_map{$texi_style};
+    if (defined($style)) { # known style
+       if ($style =~ /^\"/) { # add quotes
+           $style = $';
+           $text = "\`$text\'";
+       }
+       if ($style =~ /^\&/) { # custom
+           $style = $';
+           $text = &$style($text, $texi_style);
+       } elsif ($style) { # good style
+           $text = "<$style>$text</$style>";
+       } else { # no style
+       }
+    } else { # unknown style
+       $text = undef;
+    }
+    return($text);
+}
+
+# remove Texinfo styles
+sub remove_style {
+    local($_) = @_;
+    1 while(s/\@\w+{([^\{\}]+)}/$1/g);
+    return($_);
+}
+
+sub remove_things
+{
+  local ($_) = @_;
+  s|\@(\w+)\{\}|$1|g;
+  return $_;
+}
+
+sub substitute_style {
+    local($_) = @_;
+    local($changed, $done, $style, $text);
+
+    &simple_substitutions;
+    $changed = 1;
+    while ($changed) {
+       $changed = 0;
+       $done = '';
+       while (/\@(\w+){([^\{\}]+)}/ || /\@(,){([^\{\}]+)}/) {
+           $text = &apply_style($1, $2);
+           if ($text) {
+               $_ = "$`$text$'";
+               $changed = 1;
+           } else {
+               $done .= "$`\@$1";
+               $_ = "{$2}$'";
+           }
+       }
+        $_ = $done . $_;
+    }
+    return($_);
+}
+
+sub t2h_anchor {
+    local($name, $href, $text, $newline, $extra_attribs) = @_;
+    local($result);
+
+    $result = "<A";
+    $result .= " NAME=\"$name\"" if $name;
+    if ($href)
+    {
+      $href =~ s|^$T2H_HREF_DIR_INSTEAD_FILE|./| 
+       if ($T2H_HREF_DIR_INSTEAD_FILE);
+      $result .= ($href =~ /\"/ ? " HREF='$href'"  : " HREF=\"$href\"");
+    }
+    $result .= " $extra_attribs" if $extra_attribs;
+    $result .= ">$text</A>";
+    $result .= "\n" if $newline;
+    return($result);
+}
+
+sub pretty_date {
+    local(@MoY, $sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst);
+
+    @MoY = ('January', 'February', 'March', 'April', 'May', 'June',
+           'July', 'August', 'September', 'October', 'November', 'December');
+    ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = localtime(time);
+    $year += ($year < 70) ? 2000 : 1900;
+    # obachman: Let's do it as the Americans do
+    return("$MoY[$mon], $mday  $year");
+}
+
+sub doc_href {
+    local($num) = @_;
+
+    return("${docu_name}_$num.$docu_ext");
+}
+
+sub sec_href
+{
+  return $node2href{$sec2node{$_[0]}};
+}
+
+sub next_doc {
+    $docu_doc = &doc_href(++$doc_num);
+}
+
+sub t2h_print_lines {
+    my ($fh, $lines) = @_;
+    local($_);
+    $lines = $T2H_THIS_SECTION unless $lines;
+    my $cnt = 0;
+    for (@$lines) 
+    {
+       $_ = l2h_FromHtml($_) if ($T2H_L2H);
+       if (/^$PROTECTTAG/o) {
+           $_ = $tag2pro{$_};
+       } else {
+           &unprotect_texi;
+       }
+       print $fh $_;
+       $cnt += split(/\W*\s+\W*/);
+    }
+    return $cnt;
+}
+
+sub protect_texi {
+    # protect @ { } ` '
+    s/\@\@/$;0/go;
+    s/\@\{/$;1/go;
+    s/\@\}/$;2/go;
+    s/\@\`/$;3/go;
+    s/\@\'/$;4/go;
+}
+
+sub protect_html {
+    local($what) = @_;
+    # protect & < >
+    $what =~ s/\&/\&\#38;/g;
+    $what =~ s/\</\&\#60;/g;
+    $what =~ s/\>/\&\#62;/g;
+    # restore anything in quotes
+    # this fixes my problem where I had:
+    # < IMG SRC="leftarrow.gif" ALT="<--" >  but what if I wanted &#60; in my ALT text ??
+    # maybe byte stuffing or some other technique should be used.
+    $what =~ s/\"([^\&]+)\&\#60;(.*)\"/"$1<$2"/g;
+    $what =~ s/\"([^\&]+)\&\#62;(.*)\"/"$1>$2"/g;
+    $what =~ s/\"([^\&]+)\&\#38;(.*)\"/"$1&$2"/g;
+    # but recognize some HTML things
+    $what =~ s/\&\#60;\/A\&\#62;/<\/A>/g;            # </A>
+    $what =~ s/\&\#60;A ([^\&]+)\&\#62;/<A $1>/g;     # <A [^&]+>
+    $what =~ s/\&\#60;IMG ([^\&]+)\&\#62;/<IMG $1>/g; # <IMG [^&]+>
+    return($what);
+}
+
+sub unprotect_texi {
+    s/$;0/\@/go;
+    s/$;1/\{/go;
+    s/$;2/\}/go;
+    s/$;3/\`/go;
+    s/$;4/\'/go;
+}
+
+sub Unprotect_texi 
+{
+  local $_ = shift;
+  &unprotect_texi;
+  return($_);
+}
+
+sub unprotect_html {
+    local($what) = @_;
+    $what =~ s/\&\#38;/\&/g;
+    $what =~ s/\&\#60;/\</g;
+    $what =~ s/\&\#62;/\>/g;
+    return($what);
+}
+
+sub t2h_print_label
+{
+    my $fh = shift;
+    my $href = shift || $T2H_HREF{This};
+    $href =~ s/.*#(.*)$/$1/;
+    print $fh qq{<A NAME="$href"></A>\n};
+}
+
+##############################################################################
+
+       # These next few lines are legal in both Perl and nroff.
+
+.00 ;                  # finish .ig
+'di                    \" finish diversion--previous line must be blank
+.nr nl 0-1             \" fake up transition to first page again
+.nr % 0                        \" start at page 1
+'; __END__ ############# From here on it's a standard manual page ############
+.so /usr/local/man/man1/texi2html.1
diff --git a/doc/texinfo.tex b/doc/texinfo.tex
new file mode 100644 (file)
index 0000000..555a077
--- /dev/null
@@ -0,0 +1,6688 @@
+% texinfo.tex -- TeX macros to handle Texinfo files.
+%
+% Load plain if necessary, i.e., if running under initex.
+\expandafter\ifx\csname fmtname\endcsname\relax\input plain\fi
+%
+\def\texinfoversion{2003-02-03.16}
+%
+% Copyright (C) 1985, 1986, 1988, 1990, 1991, 1992, 1993, 1994, 1995,
+% 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003 Free Software Foundation, Inc.
+%
+% This texinfo.tex file 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 texinfo.tex file 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 texinfo.tex file; see the file COPYING.  If not, write
+% to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+% Boston, MA 02111-1307, USA.
+%
+% In other words, you are welcome to use, share and improve this program.
+% You are forbidden to forbid anyone else to use, share and improve
+% what you give them.   Help stamp out software-hoarding!
+%
+% Please try the latest version of texinfo.tex before submitting bug
+% reports; you can get the latest version from:
+%   ftp://ftp.gnu.org/gnu/texinfo/texinfo.tex
+%     (and all GNU mirrors, see http://www.gnu.org/order/ftp.html)
+%   ftp://tug.org/tex/texinfo.tex
+%     (and all CTAN mirrors, see http://www.ctan.org),
+%   and /home/gd/gnu/doc/texinfo.tex on the GNU machines.
+% 
+% The GNU Texinfo home page is http://www.gnu.org/software/texinfo.
+% 
+% The texinfo.tex in any given Texinfo distribution could well be out
+% of date, so if that's what you're using, please check.
+% 
+% Send bug reports to bug-texinfo@gnu.org.  Please include including a
+% complete document in each bug report with which we can reproduce the
+% problem.  Patches are, of course, greatly appreciated.
+%
+% To process a Texinfo manual with TeX, it's most reliable to use the
+% texi2dvi shell script that comes with the distribution.  For a simple
+% manual foo.texi, however, you can get away with this:
+%   tex foo.texi
+%   texindex foo.??
+%   tex foo.texi
+%   tex foo.texi
+%   dvips foo.dvi -o  # or whatever; this makes foo.ps.
+% The extra TeX runs get the cross-reference information correct.
+% Sometimes one run after texindex suffices, and sometimes you need more
+% than two; texi2dvi does it as many times as necessary.
+% 
+% It is possible to adapt texinfo.tex for other languages, to some
+% extent.  You can get the existing language-specific files from the
+% full Texinfo distribution.
+
+\message{Loading texinfo [version \texinfoversion]:}
+
+% If in a .fmt file, print the version number
+% and turn on active characters that we couldn't do earlier because
+% they might have appeared in the input file name.
+\everyjob{\message{[Texinfo version \texinfoversion]}%
+  \catcode`+=\active \catcode`\_=\active}
+
+\message{Basics,}
+\chardef\other=12
+
+% We never want plain's outer \+ definition in Texinfo.
+% For @tex, we can use \tabalign.
+\let\+ = \relax
+
+% Save some parts of plain tex whose names we will redefine.
+\let\ptexb=\b
+\let\ptexbullet=\bullet
+\let\ptexc=\c
+\let\ptexcomma=\,
+\let\ptexdot=\.
+\let\ptexdots=\dots
+\let\ptexend=\end
+\let\ptexequiv=\equiv
+\let\ptexexclam=\!
+\let\ptexgtr=>
+\let\ptexhat=^
+\let\ptexi=\i
+\let\ptexlbrace=\{
+\let\ptexless=<
+\let\ptexplus=+
+\let\ptexrbrace=\}
+\let\ptexstar=\*
+\let\ptext=\t
+
+% If this character appears in an error message or help string, it
+% starts a new line in the output.
+\newlinechar = `^^J
+
+% Set up fixed words for English if not already set.
+\ifx\putwordAppendix\undefined  \gdef\putwordAppendix{Appendix}\fi
+\ifx\putwordChapter\undefined   \gdef\putwordChapter{Chapter}\fi
+\ifx\putwordfile\undefined      \gdef\putwordfile{file}\fi
+\ifx\putwordin\undefined        \gdef\putwordin{in}\fi
+\ifx\putwordIndexIsEmpty\undefined     \gdef\putwordIndexIsEmpty{(Index is empty)}\fi
+\ifx\putwordIndexNonexistent\undefined \gdef\putwordIndexNonexistent{(Index is nonexistent)}\fi
+\ifx\putwordInfo\undefined      \gdef\putwordInfo{Info}\fi
+\ifx\putwordInstanceVariableof\undefined \gdef\putwordInstanceVariableof{Instance Variable of}\fi
+\ifx\putwordMethodon\undefined  \gdef\putwordMethodon{Method on}\fi
+\ifx\putwordNoTitle\undefined   \gdef\putwordNoTitle{No Title}\fi
+\ifx\putwordof\undefined        \gdef\putwordof{of}\fi
+\ifx\putwordon\undefined        \gdef\putwordon{on}\fi
+\ifx\putwordpage\undefined      \gdef\putwordpage{page}\fi
+\ifx\putwordsection\undefined   \gdef\putwordsection{section}\fi
+\ifx\putwordSection\undefined   \gdef\putwordSection{Section}\fi
+\ifx\putwordsee\undefined       \gdef\putwordsee{see}\fi
+\ifx\putwordSee\undefined       \gdef\putwordSee{See}\fi
+\ifx\putwordShortTOC\undefined  \gdef\putwordShortTOC{Short Contents}\fi
+\ifx\putwordTOC\undefined       \gdef\putwordTOC{Table of Contents}\fi
+%
+\ifx\putwordMJan\undefined \gdef\putwordMJan{January}\fi
+\ifx\putwordMFeb\undefined \gdef\putwordMFeb{February}\fi
+\ifx\putwordMMar\undefined \gdef\putwordMMar{March}\fi
+\ifx\putwordMApr\undefined \gdef\putwordMApr{April}\fi
+\ifx\putwordMMay\undefined \gdef\putwordMMay{May}\fi
+\ifx\putwordMJun\undefined \gdef\putwordMJun{June}\fi
+\ifx\putwordMJul\undefined \gdef\putwordMJul{July}\fi
+\ifx\putwordMAug\undefined \gdef\putwordMAug{August}\fi
+\ifx\putwordMSep\undefined \gdef\putwordMSep{September}\fi
+\ifx\putwordMOct\undefined \gdef\putwordMOct{October}\fi
+\ifx\putwordMNov\undefined \gdef\putwordMNov{November}\fi
+\ifx\putwordMDec\undefined \gdef\putwordMDec{December}\fi
+%
+\ifx\putwordDefmac\undefined    \gdef\putwordDefmac{Macro}\fi
+\ifx\putwordDefspec\undefined   \gdef\putwordDefspec{Special Form}\fi
+\ifx\putwordDefvar\undefined    \gdef\putwordDefvar{Variable}\fi
+\ifx\putwordDefopt\undefined    \gdef\putwordDefopt{User Option}\fi
+\ifx\putwordDeftypevar\undefined\gdef\putwordDeftypevar{Variable}\fi
+\ifx\putwordDeffunc\undefined   \gdef\putwordDeffunc{Function}\fi
+\ifx\putwordDeftypefun\undefined\gdef\putwordDeftypefun{Function}\fi
+
+% In some macros, we cannot use the `\? notation---the left quote is
+% in some cases the escape char.
+\chardef\colonChar = `\:
+\chardef\commaChar = `\,
+\chardef\dotChar   = `\.
+\chardef\equalChar = `\=
+\chardef\exclamChar= `\!
+\chardef\questChar = `\?
+\chardef\semiChar  = `\;
+\chardef\spaceChar = `\ %
+\chardef\underChar = `\_
+
+% Ignore a token.
+%
+\def\gobble#1{}
+
+% True if #1 is the empty string, i.e., called like `\ifempty{}'.
+%
+\def\ifempty#1{\ifemptyx #1\emptymarkA\emptymarkB}%
+\def\ifemptyx#1#2\emptymarkB{\ifx #1\emptymarkA}%
+
+% Hyphenation fixes.
+\hyphenation{ap-pen-dix}
+\hyphenation{mini-buf-fer mini-buf-fers}
+\hyphenation{eshell}
+\hyphenation{white-space}
+
+% Margin to add to right of even pages, to left of odd pages.
+\newdimen\bindingoffset
+\newdimen\normaloffset
+\newdimen\pagewidth \newdimen\pageheight
+
+% Sometimes it is convenient to have everything in the transcript file
+% and nothing on the terminal.  We don't just call \tracingall here,
+% since that produces some useless output on the terminal.  We also make
+% some effort to order the tracing commands to reduce output in the log
+% file; cf. trace.sty in LaTeX.
+%
+\def\gloggingall{\begingroup \globaldefs = 1 \loggingall \endgroup}%
+\def\loggingall{%
+  \tracingstats2
+  \tracingpages1
+  \tracinglostchars2  % 2 gives us more in etex
+  \tracingparagraphs1
+  \tracingoutput1
+  \tracingmacros2
+  \tracingrestores1
+  \showboxbreadth\maxdimen \showboxdepth\maxdimen
+  \ifx\eTeXversion\undefined\else % etex gives us more logging
+    \tracingscantokens1
+    \tracingifs1
+    \tracinggroups1
+    \tracingnesting2
+    \tracingassigns1
+  \fi
+  \tracingcommands3  % 3 gives us more in etex
+  \errorcontextlines\maxdimen
+}%
+
+% add check for \lastpenalty to plain's definitions.  If the last thing
+% we did was a \nobreak, we don't want to insert more space.
+% 
+\def\smallbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\smallskipamount
+  \removelastskip\penalty-50\smallskip\fi\fi}
+\def\medbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\medskipamount
+  \removelastskip\penalty-100\medskip\fi\fi}
+\def\bigbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\bigskipamount
+  \removelastskip\penalty-200\bigskip\fi\fi}
+
+% For @cropmarks command.
+% Do @cropmarks to get crop marks.
+%
+\newif\ifcropmarks
+\let\cropmarks = \cropmarkstrue
+%
+% Dimensions to add cropmarks at corners.
+% Added by P. A. MacKay, 12 Nov. 1986
+%
+\newdimen\outerhsize \newdimen\outervsize % set by the paper size routines
+\newdimen\cornerlong  \cornerlong=1pc
+\newdimen\cornerthick \cornerthick=.3pt
+\newdimen\topandbottommargin \topandbottommargin=.75in
+
+% Main output routine.
+\chardef\PAGE = 255
+\output = {\onepageout{\pagecontents\PAGE}}
+
+\newbox\headlinebox
+\newbox\footlinebox
+
+% \onepageout takes a vbox as an argument.  Note that \pagecontents
+% does insertions, but you have to call it yourself.
+\def\onepageout#1{%
+  \ifcropmarks \hoffset=0pt \else \hoffset=\normaloffset \fi
+  %
+  \ifodd\pageno  \advance\hoffset by \bindingoffset
+  \else \advance\hoffset by -\bindingoffset\fi
+  %
+  % Do this outside of the \shipout so @code etc. will be expanded in
+  % the headline as they should be, not taken literally (outputting ''code).
+  \setbox\headlinebox = \vbox{\let\hsize=\pagewidth \makeheadline}%
+  \setbox\footlinebox = \vbox{\let\hsize=\pagewidth \makefootline}%
+  %
+  {%
+    % Have to do this stuff outside the \shipout because we want it to
+    % take effect in \write's, yet the group defined by the \vbox ends
+    % before the \shipout runs.
+    %
+    \escapechar = `\\     % use backslash in output files.
+    \indexdummies         % don't expand commands in the output.
+    \normalturnoffactive  % \ in index entries must not stay \, e.g., if
+                   % the page break happens to be in the middle of an example.
+    \shipout\vbox{%
+      % Do this early so pdf references go to the beginning of the page.
+      \ifpdfmakepagedest \pdfmkdest{\the\pageno} \fi
+      %
+      \ifcropmarks \vbox to \outervsize\bgroup
+        \hsize = \outerhsize
+        \vskip-\topandbottommargin
+        \vtop to0pt{%
+          \line{\ewtop\hfil\ewtop}%
+          \nointerlineskip
+          \line{%
+            \vbox{\moveleft\cornerthick\nstop}%
+            \hfill
+            \vbox{\moveright\cornerthick\nstop}%
+          }%
+          \vss}%
+        \vskip\topandbottommargin
+        \line\bgroup
+          \hfil % center the page within the outer (page) hsize.
+          \ifodd\pageno\hskip\bindingoffset\fi
+          \vbox\bgroup
+      \fi
+      %
+      \unvbox\headlinebox
+      \pagebody{#1}%
+      \ifdim\ht\footlinebox > 0pt
+        % Only leave this space if the footline is nonempty.
+        % (We lessened \vsize for it in \oddfootingxxx.)
+        % The \baselineskip=24pt in plain's \makefootline has no effect.
+        \vskip 2\baselineskip
+        \unvbox\footlinebox
+      \fi
+      %
+      \ifcropmarks
+          \egroup % end of \vbox\bgroup
+        \hfil\egroup % end of (centering) \line\bgroup
+        \vskip\topandbottommargin plus1fill minus1fill
+        \boxmaxdepth = \cornerthick
+        \vbox to0pt{\vss
+          \line{%
+            \vbox{\moveleft\cornerthick\nsbot}%
+            \hfill
+            \vbox{\moveright\cornerthick\nsbot}%
+          }%
+          \nointerlineskip
+          \line{\ewbot\hfil\ewbot}%
+        }%
+      \egroup % \vbox from first cropmarks clause
+      \fi
+    }% end of \shipout\vbox
+  }% end of group with \normalturnoffactive
+  \advancepageno
+  \ifnum\outputpenalty>-20000 \else\dosupereject\fi
+}
+
+\newinsert\margin \dimen\margin=\maxdimen
+
+\def\pagebody#1{\vbox to\pageheight{\boxmaxdepth=\maxdepth #1}}
+{\catcode`\@ =11
+\gdef\pagecontents#1{\ifvoid\topins\else\unvbox\topins\fi
+% marginal hacks, juha@viisa.uucp (Juha Takala)
+\ifvoid\margin\else % marginal info is present
+  \rlap{\kern\hsize\vbox to\z@{\kern1pt\box\margin \vss}}\fi
+\dimen@=\dp#1 \unvbox#1
+\ifvoid\footins\else\vskip\skip\footins\footnoterule \unvbox\footins\fi
+\ifr@ggedbottom \kern-\dimen@ \vfil \fi}
+}
+
+% Here are the rules for the cropmarks.  Note that they are
+% offset so that the space between them is truly \outerhsize or \outervsize
+% (P. A. MacKay, 12 November, 1986)
+%
+\def\ewtop{\vrule height\cornerthick depth0pt width\cornerlong}
+\def\nstop{\vbox
+  {\hrule height\cornerthick depth\cornerlong width\cornerthick}}
+\def\ewbot{\vrule height0pt depth\cornerthick width\cornerlong}
+\def\nsbot{\vbox
+  {\hrule height\cornerlong depth\cornerthick width\cornerthick}}
+
+% Parse an argument, then pass it to #1.  The argument is the rest of
+% the input line (except we remove a trailing comment).  #1 should be a
+% macro which expects an ordinary undelimited TeX argument.
+%
+\def\parsearg#1{%
+  \let\next = #1%
+  \begingroup
+    \obeylines
+    \futurelet\temp\parseargx
+}
+
+% If the next token is an obeyed space (from an @example environment or
+% the like), remove it and recurse.  Otherwise, we're done.
+\def\parseargx{%
+  % \obeyedspace is defined far below, after the definition of \sepspaces.
+  \ifx\obeyedspace\temp
+    \expandafter\parseargdiscardspace
+  \else
+    \expandafter\parseargline
+  \fi
+}
+
+% Remove a single space (as the delimiter token to the macro call).
+{\obeyspaces %
+ \gdef\parseargdiscardspace {\futurelet\temp\parseargx}}
+
+{\obeylines %
+  \gdef\parseargline#1^^M{%
+    \endgroup % End of the group started in \parsearg.
+    %
+    % First remove any @c comment, then any @comment.
+    % Result of each macro is put in \toks0.
+    \argremovec #1\c\relax %
+    \expandafter\argremovecomment \the\toks0 \comment\relax %
+    %
+    % Call the caller's macro, saved as \next in \parsearg.
+    \expandafter\next\expandafter{\the\toks0}%
+  }%
+}
+
+% Since all \c{,omment} does is throw away the argument, we can let TeX
+% do that for us.  The \relax here is matched by the \relax in the call
+% in \parseargline; it could be more or less anything, its purpose is
+% just to delimit the argument to the \c.
+\def\argremovec#1\c#2\relax{\toks0 = {#1}}
+\def\argremovecomment#1\comment#2\relax{\toks0 = {#1}}
+
+% \argremovec{,omment} might leave us with trailing spaces, though; e.g.,
+%    @end itemize  @c foo
+% will have two active spaces as part of the argument with the
+% `itemize'.  Here we remove all active spaces from #1, and assign the
+% result to \toks0.
+%
+% This loses if there are any *other* active characters besides spaces
+% in the argument -- _ ^ +, for example -- since they get expanded.
+% Fortunately, Texinfo does not define any such commands.  (If it ever
+% does, the catcode of the characters in questionwill have to be changed
+% here.)  But this means we cannot call \removeactivespaces as part of
+% \argremovec{,omment}, since @c uses \parsearg, and thus the argument
+% that \parsearg gets might well have any character at all in it.
+%
+\def\removeactivespaces#1{%
+  \begingroup
+    \ignoreactivespaces
+    \edef\temp{#1}%
+    \global\toks0 = \expandafter{\temp}%
+  \endgroup
+}
+
+% Change the active space to expand to nothing.
+%
+\begingroup
+  \obeyspaces
+  \gdef\ignoreactivespaces{\obeyspaces\let =\empty}
+\endgroup
+
+
+\def\flushcr{\ifx\par\lisppar \def\next##1{}\else \let\next=\relax \fi \next}
+
+%% These are used to keep @begin/@end levels from running away
+%% Call \inENV within environments (after a \begingroup)
+\newif\ifENV \ENVfalse \def\inENV{\ifENV\relax\else\ENVtrue\fi}
+\def\ENVcheck{%
+\ifENV\errmessage{Still within an environment; press RETURN to continue}
+\endgroup\fi} % This is not perfect, but it should reduce lossage
+
+% @begin foo  is the same as @foo, for now.
+\newhelp\EMsimple{Press RETURN to continue.}
+
+\outer\def\begin{\parsearg\beginxxx}
+
+\def\beginxxx #1{%
+\expandafter\ifx\csname #1\endcsname\relax
+{\errhelp=\EMsimple \errmessage{Undefined command @begin #1}}\else
+\csname #1\endcsname\fi}
+
+% @end foo executes the definition of \Efoo.
+%
+\def\end{\parsearg\endxxx}
+\def\endxxx #1{%
+  \removeactivespaces{#1}%
+  \edef\endthing{\the\toks0}%
+  %
+  \expandafter\ifx\csname E\endthing\endcsname\relax
+    \expandafter\ifx\csname \endthing\endcsname\relax
+      % There's no \foo, i.e., no ``environment'' foo.
+      \errhelp = \EMsimple
+      \errmessage{Undefined command `@end \endthing'}%
+    \else
+      \unmatchedenderror\endthing
+    \fi
+  \else
+    % Everything's ok; the right environment has been started.
+    \csname E\endthing\endcsname
+  \fi
+}
+
+% There is an environment #1, but it hasn't been started.  Give an error.
+%
+\def\unmatchedenderror#1{%
+  \errhelp = \EMsimple
+  \errmessage{This `@end #1' doesn't have a matching `@#1'}%
+}
+
+% Define the control sequence \E#1 to give an unmatched @end error.
+%
+\def\defineunmatchedend#1{%
+  \expandafter\def\csname E#1\endcsname{\unmatchedenderror{#1}}%
+}
+
+
+%% Simple single-character @ commands
+
+% @@ prints an @
+% Kludge this until the fonts are right (grr).
+\def\@{{\tt\char64}}
+
+% This is turned off because it was never documented
+% and you can use @w{...} around a quote to suppress ligatures.
+%% Define @` and @' to be the same as ` and '
+%% but suppressing ligatures.
+%\def\`{{`}}
+%\def\'{{'}}
+
+% Used to generate quoted braces.
+\def\mylbrace {{\tt\char123}}
+\def\myrbrace {{\tt\char125}}
+\let\{=\mylbrace
+\let\}=\myrbrace
+\begingroup
+  % Definitions to produce \{ and \} commands for indices,
+  % and @{ and @} for the aux file.
+  \catcode`\{ = \other \catcode`\} = \other
+  \catcode`\[ = 1 \catcode`\] = 2
+  \catcode`\! = 0 \catcode`\\ = \other
+  !gdef!lbracecmd[\{]%
+  !gdef!rbracecmd[\}]%
+  !gdef!lbraceatcmd[@{]%
+  !gdef!rbraceatcmd[@}]%
+!endgroup
+
+% Accents: @, @dotaccent @ringaccent @ubaraccent @udotaccent
+% Others are defined by plain TeX: @` @' @" @^ @~ @= @u @v @H.
+\let\, = \c
+\let\dotaccent = \.
+\def\ringaccent#1{{\accent23 #1}}
+\let\tieaccent = \t
+\let\ubaraccent = \b
+\let\udotaccent = \d
+
+% Other special characters: @questiondown @exclamdown
+% Plain TeX defines: @AA @AE @O @OE @L (plus lowercase versions) @ss.
+\def\questiondown{?`}
+\def\exclamdown{!`}
+
+% Dotless i and dotless j, used for accents.
+\def\imacro{i}
+\def\jmacro{j}
+\def\dotless#1{%
+  \def\temp{#1}%
+  \ifx\temp\imacro \ptexi
+  \else\ifx\temp\jmacro \j
+  \else \errmessage{@dotless can be used only with i or j}%
+  \fi\fi
+}
+
+% Be sure we're in horizontal mode when doing a tie, since we make space
+% equivalent to this in @example-like environments. Otherwise, a space
+% at the beginning of a line will start with \penalty -- and
+% since \penalty is valid in vertical mode, we'd end up putting the
+% penalty on the vertical list instead of in the new paragraph.
+{\catcode`@ = 11
+ % Avoid using \@M directly, because that causes trouble
+ % if the definition is written into an index file.
+ \global\let\tiepenalty = \@M
+ \gdef\tie{\leavevmode\penalty\tiepenalty\ }
+}
+
+% @: forces normal size whitespace following.
+\def\:{\spacefactor=1000 }
+
+% @* forces a line break.
+\def\*{\hfil\break\hbox{}\ignorespaces}
+
+% @. is an end-of-sentence period.
+\def\.{.\spacefactor=3000 }
+
+% @! is an end-of-sentence bang.
+\def\!{!\spacefactor=3000 }
+
+% @? is an end-of-sentence query.
+\def\?{?\spacefactor=3000 }
+
+% @w prevents a word break.  Without the \leavevmode, @w at the
+% beginning of a paragraph, when TeX is still in vertical mode, would
+% produce a whole line of output instead of starting the paragraph.
+\def\w#1{\leavevmode\hbox{#1}}
+
+% @group ... @end group forces ... to be all on one page, by enclosing
+% it in a TeX vbox.  We use \vtop instead of \vbox to construct the box
+% to keep its height that of a normal line.  According to the rules for
+% \topskip (p.114 of the TeXbook), the glue inserted is
+% max (\topskip - \ht (first item), 0).  If that height is large,
+% therefore, no glue is inserted, and the space between the headline and
+% the text is small, which looks bad.
+%
+% Another complication is that the group might be very large.  This can
+% cause the glue on the previous page to be unduly stretched, because it
+% does not have much material.  In this case, it's better to add an
+% explicit \vfill so that the extra space is at the bottom.  The
+% threshold for doing this is if the group is more than \vfilllimit
+% percent of a page (\vfilllimit can be changed inside of @tex).
+% 
+\newbox\groupbox
+\def\vfilllimit{0.7}
+%
+\def\group{\begingroup
+  \ifnum\catcode13=\active \else
+    \errhelp = \groupinvalidhelp
+    \errmessage{@group invalid in context where filling is enabled}%
+  \fi
+  %
+  % The \vtop we start below produces a box with normal height and large
+  % depth; thus, TeX puts \baselineskip glue before it, and (when the
+  % next line of text is done) \lineskip glue after it.  (See p.82 of
+  % the TeXbook.)  Thus, space below is not quite equal to space
+  % above.  But it's pretty close.
+  \def\Egroup{%
+    \egroup           % End the \vtop.
+    % \dimen0 is the vertical size of the group's box.
+    \dimen0 = \ht\groupbox  \advance\dimen0 by \dp\groupbox
+    % \dimen2 is how much space is left on the page (more or less).
+    \dimen2 = \pageheight   \advance\dimen2 by -\pagetotal
+    % if the group doesn't fit on the current page, and it's a big big
+    % group, force a page break.
+    \ifdim \dimen0 > \dimen2
+      \ifdim \pagetotal < \vfilllimit\pageheight
+        \page
+      \fi
+    \fi
+    \copy\groupbox
+    \endgroup         % End the \group.
+  }%
+  %
+  \setbox\groupbox = \vtop\bgroup
+    % We have to put a strut on the last line in case the @group is in
+    % the midst of an example, rather than completely enclosing it.
+    % Otherwise, the interline space between the last line of the group
+    % and the first line afterwards is too small.  But we can't put the
+    % strut in \Egroup, since there it would be on a line by itself.
+    % Hence this just inserts a strut at the beginning of each line.
+    \everypar = {\strut}%
+    %
+    % Since we have a strut on every line, we don't need any of TeX's
+    % normal interline spacing.
+    \offinterlineskip
+    %
+    % OK, but now we have to do something about blank
+    % lines in the input in @example-like environments, which normally
+    % just turn into \lisppar, which will insert no space now that we've
+    % turned off the interline space.  Simplest is to make them be an
+    % empty paragraph.
+    \ifx\par\lisppar
+      \edef\par{\leavevmode \par}%
+      %
+      % Reset ^^M's definition to new definition of \par.
+      \obeylines
+    \fi
+    %
+    % Do @comment since we are called inside an environment such as
+    % @example, where each end-of-line in the input causes an
+    % end-of-line in the output.  We don't want the end-of-line after
+    % the `@group' to put extra space in the output.  Since @group
+    % should appear on a line by itself (according to the Texinfo
+    % manual), we don't worry about eating any user text.
+    \comment
+}
+%
+% TeX puts in an \escapechar (i.e., `@') at the beginning of the help
+% message, so this ends up printing `@group can only ...'.
+%
+\newhelp\groupinvalidhelp{%
+group can only be used in environments such as @example,^^J%
+where each line of input produces a line of output.}
+
+% @need space-in-mils
+% forces a page break if there is not space-in-mils remaining.
+
+\newdimen\mil  \mil=0.001in
+
+\def\need{\parsearg\needx}
+
+% Old definition--didn't work.
+%\def\needx #1{\par %
+%% This method tries to make TeX break the page naturally
+%% if the depth of the box does not fit.
+%{\baselineskip=0pt%
+%\vtop to #1\mil{\vfil}\kern -#1\mil\nobreak
+%\prevdepth=-1000pt
+%}}
+
+\def\needx#1{%
+  % Ensure vertical mode, so we don't make a big box in the middle of a
+  % paragraph.
+  \par
+  %
+  % If the @need value is less than one line space, it's useless.
+  \dimen0 = #1\mil
+  \dimen2 = \ht\strutbox
+  \advance\dimen2 by \dp\strutbox
+  \ifdim\dimen0 > \dimen2
+    %
+    % Do a \strut just to make the height of this box be normal, so the
+    % normal leading is inserted relative to the preceding line.
+    % And a page break here is fine.
+    \vtop to #1\mil{\strut\vfil}%
+    %
+    % TeX does not even consider page breaks if a penalty added to the
+    % main vertical list is 10000 or more.  But in order to see if the
+    % empty box we just added fits on the page, we must make it consider
+    % page breaks.  On the other hand, we don't want to actually break the
+    % page after the empty box.  So we use a penalty of 9999.
+    %
+    % There is an extremely small chance that TeX will actually break the
+    % page at this \penalty, if there are no other feasible breakpoints in
+    % sight.  (If the user is using lots of big @group commands, which
+    % almost-but-not-quite fill up a page, TeX will have a hard time doing
+    % good page breaking, for example.)  However, I could not construct an
+    % example where a page broke at this \penalty; if it happens in a real
+    % document, then we can reconsider our strategy.
+    \penalty9999
+    %
+    % Back up by the size of the box, whether we did a page break or not.
+    \kern -#1\mil
+    %
+    % Do not allow a page break right after this kern.
+    \nobreak
+  \fi
+}
+
+% @br   forces paragraph break
+
+\let\br = \par
+
+% @dots{} output an ellipsis using the current font.
+% We do .5em per period so that it has the same spacing in a typewriter
+% font as three actual period characters.
+%
+\def\dots{%
+  \leavevmode
+  \hbox to 1.5em{%
+    \hskip 0pt plus 0.25fil minus 0.25fil
+    .\hss.\hss.%
+    \hskip 0pt plus 0.5fil minus 0.5fil
+  }%
+}
+
+% @enddots{} is an end-of-sentence ellipsis.
+%
+\def\enddots{%
+  \leavevmode
+  \hbox to 2em{%
+    \hskip 0pt plus 0.25fil minus 0.25fil
+    .\hss.\hss.\hss.%
+    \hskip 0pt plus 0.5fil minus 0.5fil
+  }%
+  \spacefactor=3000
+}
+
+
+% @page    forces the start of a new page
+%
+\def\page{\par\vfill\supereject}
+
+% @exdent text....
+% outputs text on separate line in roman font, starting at standard page margin
+
+% This records the amount of indent in the innermost environment.
+% That's how much \exdent should take out.
+\newskip\exdentamount
+
+% This defn is used inside fill environments such as @defun.
+\def\exdent{\parsearg\exdentyyy}
+\def\exdentyyy #1{{\hfil\break\hbox{\kern -\exdentamount{\rm#1}}\hfil\break}}
+
+% This defn is used inside nofill environments such as @example.
+\def\nofillexdent{\parsearg\nofillexdentyyy}
+\def\nofillexdentyyy #1{{\advance \leftskip by -\exdentamount
+\leftline{\hskip\leftskip{\rm#1}}}}
+
+% @inmargin{WHICH}{TEXT} puts TEXT in the WHICH margin next to the current
+% paragraph.  For more general purposes, use the \margin insertion
+% class.  WHICH is `l' or `r'.
+%
+\newskip\inmarginspacing \inmarginspacing=1cm
+\def\strutdepth{\dp\strutbox}
+%
+\def\doinmargin#1#2{\strut\vadjust{%
+  \nobreak
+  \kern-\strutdepth
+  \vtop to \strutdepth{%
+    \baselineskip=\strutdepth
+    \vss
+    % if you have multiple lines of stuff to put here, you'll need to
+    % make the vbox yourself of the appropriate size.
+    \ifx#1l%
+      \llap{\ignorespaces #2\hskip\inmarginspacing}%
+    \else
+      \rlap{\hskip\hsize \hskip\inmarginspacing \ignorespaces #2}%
+    \fi
+    \null
+  }%
+}}
+\def\inleftmargin{\doinmargin l}
+\def\inrightmargin{\doinmargin r}
+%
+% @inmargin{TEXT [, RIGHT-TEXT]}
+% (if RIGHT-TEXT is given, use TEXT for left page, RIGHT-TEXT for right;
+% else use TEXT for both).
+% 
+\def\inmargin#1{\parseinmargin #1,,\finish}
+\def\parseinmargin#1,#2,#3\finish{% not perfect, but better than nothing.
+  \setbox0 = \hbox{\ignorespaces #2}% 
+  \ifdim\wd0 > 0pt
+    \def\lefttext{#1}%  have both texts
+    \def\righttext{#2}%
+  \else
+    \def\lefttext{#1}%  have only one text
+    \def\righttext{#1}%
+  \fi
+  %
+  \ifodd\pageno
+    \def\temp{\inrightmargin\righttext}% odd page -> outside is right margin
+  \else
+    \def\temp{\inleftmargin\lefttext}%
+  \fi
+  \temp
+}
+
+% @include file    insert text of that file as input.
+% Allow normal characters that  we make active in the argument (a file name).
+\def\include{\begingroup
+  \catcode`\\=\other
+  \catcode`~=\other
+  \catcode`^=\other
+  \catcode`_=\other
+  \catcode`|=\other
+  \catcode`<=\other
+  \catcode`>=\other
+  \catcode`+=\other
+  \parsearg\includezzz}
+% Restore active chars for included file.
+\def\includezzz#1{\endgroup\begingroup
+  % Read the included file in a group so nested @include's work.
+  \def\thisfile{#1}%
+  \let\value=\expandablevalue
+  \input\thisfile
+\endgroup}
+
+\def\thisfile{}
+
+% @center line
+% outputs that line, centered.
+%
+\def\center{\parsearg\docenter}
+\def\docenter#1{{%
+  \ifhmode \hfil\break \fi
+  \advance\hsize by -\leftskip
+  \advance\hsize by -\rightskip
+  \line{\hfil \ignorespaces#1\unskip \hfil}%
+  \ifhmode \break \fi
+}}
+
+% @sp n   outputs n lines of vertical space
+
+\def\sp{\parsearg\spxxx}
+\def\spxxx #1{\vskip #1\baselineskip}
+
+% @comment ...line which is ignored...
+% @c is the same as @comment
+% @ignore ... @end ignore  is another way to write a comment
+
+\def\comment{\begingroup \catcode`\^^M=\other%
+\catcode`\@=\other \catcode`\{=\other \catcode`\}=\other%
+\commentxxx}
+{\catcode`\^^M=\other \gdef\commentxxx#1^^M{\endgroup}}
+
+\let\c=\comment
+
+% @paragraphindent NCHARS
+% We'll use ems for NCHARS, close enough.
+% We cannot implement @paragraphindent asis, though.
+% 
+\def\asisword{asis} % no translation, these are keywords
+\def\noneword{none}
+%
+\def\paragraphindent{\parsearg\doparagraphindent}
+\def\doparagraphindent#1{%
+  \def\temp{#1}%
+  \ifx\temp\asisword
+  \else
+    \ifx\temp\noneword
+      \defaultparindent = 0pt
+    \else
+      \defaultparindent = #1em
+    \fi
+  \fi
+  \parindent = \defaultparindent
+}
+
+% @exampleindent NCHARS
+% We'll use ems for NCHARS like @paragraphindent.
+% It seems @exampleindent asis isn't necessary, but
+% I preserve it to make it similar to @paragraphindent.
+\def\exampleindent{\parsearg\doexampleindent}
+\def\doexampleindent#1{%
+  \def\temp{#1}%
+  \ifx\temp\asisword
+  \else
+    \ifx\temp\noneword
+      \lispnarrowing = 0pt
+    \else
+      \lispnarrowing = #1em
+    \fi
+  \fi
+}
+
+% @asis just yields its argument.  Used with @table, for example.
+%
+\def\asis#1{#1}
+
+% @math outputs its argument in math mode.
+% We don't use $'s directly in the definition of \math because we need
+% to set catcodes according to plain TeX first, to allow for subscripts,
+% superscripts, special math chars, etc.
+% 
+\let\implicitmath = $%$ font-lock fix
+%
+% One complication: _ usually means subscripts, but it could also mean
+% an actual _ character, as in @math{@var{some_variable} + 1}.  So make
+% _ within @math be active (mathcode "8000), and distinguish by seeing
+% if the current family is \slfam, which is what @var uses.
+% 
+{\catcode\underChar = \active
+\gdef\mathunderscore{%
+  \catcode\underChar=\active
+  \def_{\ifnum\fam=\slfam \_\else\sb\fi}%
+}}
+%
+% Another complication: we want \\ (and @\) to output a \ character.
+% FYI, plain.tex uses \\ as a temporary control sequence (why?), but
+% this is not advertised and we don't care.  Texinfo does not
+% otherwise define @\.
+% 
+% The \mathchar is class=0=ordinary, family=7=ttfam, position=5C=\.
+\def\mathbackslash{\ifnum\fam=\ttfam \mathchar"075C \else\backslash \fi}
+%
+\def\math{%
+  \tex
+  \mathcode`\_="8000 \mathunderscore
+  \let\\ = \mathbackslash
+  \mathactive
+  \implicitmath\finishmath}
+\def\finishmath#1{#1\implicitmath\Etex}
+
+% Some active characters (such as <) are spaced differently in math.
+% We have to reset their definitions in case the @math was an
+% argument to a command which set the catcodes (such as @item or @section).
+% 
+{
+  \catcode`^ = \active
+  \catcode`< = \active
+  \catcode`> = \active
+  \catcode`+ = \active
+  \gdef\mathactive{%
+    \let^ = \ptexhat
+    \let< = \ptexless
+    \let> = \ptexgtr
+    \let+ = \ptexplus
+  }
+}
+
+% @bullet and @minus need the same treatment as @math, just above.
+\def\bullet{\implicitmath\ptexbullet\implicitmath}
+\def\minus{\implicitmath-\implicitmath}
+
+% @refill is a no-op.
+\let\refill=\relax
+
+% If working on a large document in chapters, it is convenient to
+% be able to disable indexing, cross-referencing, and contents, for test runs.
+% This is done with @novalidate (before @setfilename).
+%
+\newif\iflinks \linkstrue % by default we want the aux files.
+\let\novalidate = \linksfalse
+
+% @setfilename is done at the beginning of every texinfo file.
+% So open here the files we need to have open while reading the input.
+% This makes it possible to make a .fmt file for texinfo.
+\def\setfilename{%
+   \iflinks
+     \readauxfile
+   \fi % \openindices needs to do some work in any case.
+   \openindices
+   \fixbackslash  % Turn off hack to swallow `\input texinfo'.
+   \global\let\setfilename=\comment % Ignore extra @setfilename cmds.
+   %
+   % If texinfo.cnf is present on the system, read it.
+   % Useful for site-wide @afourpaper, etc.
+   % Just to be on the safe side, close the input stream before the \input.
+   \openin 1 texinfo.cnf
+   \ifeof1 \let\temp=\relax \else \def\temp{\input texinfo.cnf }\fi
+   \closein1
+   \temp
+   %
+   \comment % Ignore the actual filename.
+}
+
+% Called from \setfilename.
+%
+\def\openindices{%
+  \newindex{cp}%
+  \newcodeindex{fn}%
+  \newcodeindex{vr}%
+  \newcodeindex{tp}%
+  \newcodeindex{ky}%
+  \newcodeindex{pg}%
+}
+
+% @bye.
+\outer\def\bye{\pagealignmacro\tracingstats=1\ptexend}
+
+
+\message{pdf,}
+% adobe `portable' document format
+\newcount\tempnum
+\newcount\lnkcount
+\newtoks\filename
+\newcount\filenamelength
+\newcount\pgn
+\newtoks\toksA
+\newtoks\toksB
+\newtoks\toksC
+\newtoks\toksD
+\newbox\boxA
+\newcount\countA
+\newif\ifpdf
+\newif\ifpdfmakepagedest
+
+\ifx\pdfoutput\undefined
+  \pdffalse
+  \let\pdfmkdest = \gobble
+  \let\pdfurl = \gobble
+  \let\endlink = \relax
+  \let\linkcolor = \relax
+  \let\pdfmakeoutlines = \relax
+\else
+  \pdftrue
+  \pdfoutput = 1
+  \input pdfcolor
+  \def\dopdfimage#1#2#3{%
+    \def\imagewidth{#2}%
+    \def\imageheight{#3}%
+    % without \immediate, pdftex seg faults when the same image is
+    % included twice.  (Version 3.14159-pre-1.0-unofficial-20010704.)
+    \ifnum\pdftexversion < 14
+      \immediate\pdfimage
+    \else
+      \immediate\pdfximage
+    \fi
+      \ifx\empty\imagewidth\else width \imagewidth \fi
+      \ifx\empty\imageheight\else height \imageheight \fi
+      \ifnum\pdftexversion<13
+         #1.pdf%
+       \else
+         {#1.pdf}%
+       \fi
+    \ifnum\pdftexversion < 14 \else
+      \pdfrefximage \pdflastximage
+    \fi}
+  \def\pdfmkdest#1{{\normalturnoffactive \pdfdest name{#1} xyz}}
+  \def\pdfmkpgn#1{#1}
+  \let\linkcolor = \Blue  % was Cyan, but that seems light?
+  \def\endlink{\Black\pdfendlink}
+  % Adding outlines to PDF; macros for calculating structure of outlines
+  % come from Petr Olsak
+  \def\expnumber#1{\expandafter\ifx\csname#1\endcsname\relax 0%
+    \else \csname#1\endcsname \fi}
+  \def\advancenumber#1{\tempnum=\expnumber{#1}\relax
+    \advance\tempnum by1
+    \expandafter\xdef\csname#1\endcsname{\the\tempnum}}
+  \def\pdfmakeoutlines{{%
+    \openin 1 \jobname.toc
+    \ifeof 1\else\begingroup
+      \closein 1 
+      % Thanh's hack / proper braces in bookmarks  
+      \edef\mylbrace{\iftrue \string{\else}\fi}\let\{=\mylbrace
+      \edef\myrbrace{\iffalse{\else\string}\fi}\let\}=\myrbrace
+      %
+      \def\chapentry ##1##2##3{}
+      \def\secentry ##1##2##3##4{\advancenumber{chap##2}}
+      \def\subsecentry ##1##2##3##4##5{\advancenumber{sec##2.##3}}
+      \def\subsubsecentry ##1##2##3##4##5##6{\advancenumber{subsec##2.##3.##4}}
+      \let\appendixentry = \chapentry
+      \let\unnumbchapentry = \chapentry
+      \let\unnumbsecentry = \secentry
+      \let\unnumbsubsecentry = \subsecentry
+      \let\unnumbsubsubsecentry = \subsubsecentry
+      \input \jobname.toc
+      \def\chapentry ##1##2##3{%
+        \pdfoutline goto name{\pdfmkpgn{##3}}count-\expnumber{chap##2}{##1}}
+      \def\secentry ##1##2##3##4{%
+        \pdfoutline goto name{\pdfmkpgn{##4}}count-\expnumber{sec##2.##3}{##1}}
+      \def\subsecentry ##1##2##3##4##5{%
+        \pdfoutline goto name{\pdfmkpgn{##5}}count-\expnumber{subsec##2.##3.##4}{##1}}
+      \def\subsubsecentry ##1##2##3##4##5##6{%
+        \pdfoutline goto name{\pdfmkpgn{##6}}{##1}}
+      \let\appendixentry = \chapentry
+      \let\unnumbchapentry = \chapentry
+      \let\unnumbsecentry = \secentry
+      \let\unnumbsubsecentry = \subsecentry
+      \let\unnumbsubsubsecentry = \subsubsecentry
+      %
+      % Make special characters normal for writing to the pdf file.
+      % 
+      \indexnofonts
+      \let\tt=\relax
+      \turnoffactive
+      \input \jobname.toc
+    \endgroup\fi
+  }}
+  \def\makelinks #1,{%
+    \def\params{#1}\def\E{END}%
+    \ifx\params\E
+      \let\nextmakelinks=\relax
+    \else
+      \let\nextmakelinks=\makelinks
+      \ifnum\lnkcount>0,\fi
+      \picknum{#1}%
+      \startlink attr{/Border [0 0 0]} 
+        goto name{\pdfmkpgn{\the\pgn}}%
+      \linkcolor #1%
+      \advance\lnkcount by 1%
+      \endlink
+    \fi
+    \nextmakelinks
+  }
+  \def\picknum#1{\expandafter\pn#1}
+  \def\pn#1{%
+    \def\p{#1}%
+    \ifx\p\lbrace
+      \let\nextpn=\ppn
+    \else
+      \let\nextpn=\ppnn
+      \def\first{#1}
+    \fi
+    \nextpn
+  }
+  \def\ppn#1{\pgn=#1\gobble}
+  \def\ppnn{\pgn=\first}
+  \def\pdfmklnk#1{\lnkcount=0\makelinks #1,END,}
+  \def\addtokens#1#2{\edef\addtoks{\noexpand#1={\the#1#2}}\addtoks}
+  \def\skipspaces#1{\def\PP{#1}\def\D{|}%
+    \ifx\PP\D\let\nextsp\relax
+    \else\let\nextsp\skipspaces
+      \ifx\p\space\else\addtokens{\filename}{\PP}%
+        \advance\filenamelength by 1
+      \fi
+    \fi
+    \nextsp}
+  \def\getfilename#1{\filenamelength=0\expandafter\skipspaces#1|\relax}
+  \ifnum\pdftexversion < 14
+    \let \startlink \pdfannotlink
+  \else
+    \let \startlink \pdfstartlink
+  \fi
+  \def\pdfurl#1{%
+    \begingroup
+      \normalturnoffactive\def\@{@}%
+      \let\value=\expandablevalue
+      \leavevmode\Red
+      \startlink attr{/Border [0 0 0]}%
+        user{/Subtype /Link /A << /S /URI /URI (#1) >>}%
+        % #1
+    \endgroup}
+  \def\pdfgettoks#1.{\setbox\boxA=\hbox{\toksA={#1.}\toksB={}\maketoks}}
+  \def\addtokens#1#2{\edef\addtoks{\noexpand#1={\the#1#2}}\addtoks}
+  \def\adn#1{\addtokens{\toksC}{#1}\global\countA=1\let\next=\maketoks}
+  \def\poptoks#1#2|ENDTOKS|{\let\first=#1\toksD={#1}\toksA={#2}}
+  \def\maketoks{%
+    \expandafter\poptoks\the\toksA|ENDTOKS|
+    \ifx\first0\adn0
+    \else\ifx\first1\adn1 \else\ifx\first2\adn2 \else\ifx\first3\adn3
+    \else\ifx\first4\adn4 \else\ifx\first5\adn5 \else\ifx\first6\adn6
+    \else\ifx\first7\adn7 \else\ifx\first8\adn8 \else\ifx\first9\adn9 
+    \else
+      \ifnum0=\countA\else\makelink\fi
+      \ifx\first.\let\next=\done\else
+        \let\next=\maketoks
+        \addtokens{\toksB}{\the\toksD}
+        \ifx\first,\addtokens{\toksB}{\space}\fi
+      \fi
+    \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi
+    \next}
+  \def\makelink{\addtokens{\toksB}%
+    {\noexpand\pdflink{\the\toksC}}\toksC={}\global\countA=0}
+  \def\pdflink#1{%
+    \startlink attr{/Border [0 0 0]} goto name{\pdfmkpgn{#1}}
+    \linkcolor #1\endlink}
+  \def\done{\edef\st{\global\noexpand\toksA={\the\toksB}}\st}
+\fi % \ifx\pdfoutput
+
+
+\message{fonts,}
+% Font-change commands.
+
+% Texinfo sort of supports the sans serif font style, which plain TeX does not.
+% So we set up a \sf analogous to plain's \rm, etc.
+\newfam\sffam
+\def\sf{\fam=\sffam \tensf}
+\let\li = \sf % Sometimes we call it \li, not \sf.
+
+% We don't need math for this one.
+\def\ttsl{\tenttsl}
+
+% Default leading.
+\newdimen\textleading  \textleading = 13.2pt
+
+% Set the baselineskip to #1, and the lineskip and strut size
+% correspondingly.  There is no deep meaning behind these magic numbers
+% used as factors; they just match (closely enough) what Knuth defined.
+%
+\def\lineskipfactor{.08333}
+\def\strutheightpercent{.70833}
+\def\strutdepthpercent {.29167}
+%
+\def\setleading#1{%
+  \normalbaselineskip = #1\relax
+  \normallineskip = \lineskipfactor\normalbaselineskip
+  \normalbaselines
+  \setbox\strutbox =\hbox{%
+    \vrule width0pt height\strutheightpercent\baselineskip
+                    depth \strutdepthpercent \baselineskip
+  }%
+}
+
+% Set the font macro #1 to the font named #2, adding on the
+% specified font prefix (normally `cm').
+% #3 is the font's design size, #4 is a scale factor
+\def\setfont#1#2#3#4{\font#1=\fontprefix#2#3 scaled #4}
+
+% Use cm as the default font prefix.
+% To specify the font prefix, you must define \fontprefix
+% before you read in texinfo.tex.
+\ifx\fontprefix\undefined
+\def\fontprefix{cm}
+\fi
+% Support font families that don't use the same naming scheme as CM.
+\def\rmshape{r}
+\def\rmbshape{bx}               %where the normal face is bold
+\def\bfshape{b}
+\def\bxshape{bx}
+\def\ttshape{tt}
+\def\ttbshape{tt}
+\def\ttslshape{sltt}
+\def\itshape{ti}
+\def\itbshape{bxti}
+\def\slshape{sl}
+\def\slbshape{bxsl}
+\def\sfshape{ss}
+\def\sfbshape{ss}
+\def\scshape{csc}
+\def\scbshape{csc}
+
+\newcount\mainmagstep
+\ifx\bigger\relax
+  % not really supported.
+  \mainmagstep=\magstep1
+  \setfont\textrm\rmshape{12}{1000}
+  \setfont\texttt\ttshape{12}{1000}
+\else
+  \mainmagstep=\magstephalf
+  \setfont\textrm\rmshape{10}{\mainmagstep}
+  \setfont\texttt\ttshape{10}{\mainmagstep}
+\fi
+% Instead of cmb10, you may want to use cmbx10.
+% cmbx10 is a prettier font on its own, but cmb10
+% looks better when embedded in a line with cmr10
+% (in Bob's opinion).
+\setfont\textbf\bfshape{10}{\mainmagstep}
+\setfont\textit\itshape{10}{\mainmagstep}
+\setfont\textsl\slshape{10}{\mainmagstep}
+\setfont\textsf\sfshape{10}{\mainmagstep}
+\setfont\textsc\scshape{10}{\mainmagstep}
+\setfont\textttsl\ttslshape{10}{\mainmagstep}
+\font\texti=cmmi10 scaled \mainmagstep
+\font\textsy=cmsy10 scaled \mainmagstep
+
+% A few fonts for @defun, etc.
+\setfont\defbf\bxshape{10}{\magstep1} %was 1314
+\setfont\deftt\ttshape{10}{\magstep1}
+\def\df{\let\tentt=\deftt \let\tenbf = \defbf \bf}
+
+% Fonts for indices, footnotes, small examples (9pt).
+\setfont\smallrm\rmshape{9}{1000}
+\setfont\smalltt\ttshape{9}{1000}
+\setfont\smallbf\bfshape{10}{900}
+\setfont\smallit\itshape{9}{1000}
+\setfont\smallsl\slshape{9}{1000}
+\setfont\smallsf\sfshape{9}{1000}
+\setfont\smallsc\scshape{10}{900}
+\setfont\smallttsl\ttslshape{10}{900}
+\font\smalli=cmmi9
+\font\smallsy=cmsy9
+
+% Fonts for small examples (8pt).
+\setfont\smallerrm\rmshape{8}{1000}
+\setfont\smallertt\ttshape{8}{1000}
+\setfont\smallerbf\bfshape{10}{800}
+\setfont\smallerit\itshape{8}{1000}
+\setfont\smallersl\slshape{8}{1000}
+\setfont\smallersf\sfshape{8}{1000}
+\setfont\smallersc\scshape{10}{800}
+\setfont\smallerttsl\ttslshape{10}{800}
+\font\smalleri=cmmi8
+\font\smallersy=cmsy8
+
+% Fonts for title page:
+\setfont\titlerm\rmbshape{12}{\magstep3}
+\setfont\titleit\itbshape{10}{\magstep4}
+\setfont\titlesl\slbshape{10}{\magstep4}
+\setfont\titlett\ttbshape{12}{\magstep3}
+\setfont\titlettsl\ttslshape{10}{\magstep4}
+\setfont\titlesf\sfbshape{17}{\magstep1}
+\let\titlebf=\titlerm
+\setfont\titlesc\scbshape{10}{\magstep4}
+\font\titlei=cmmi12 scaled \magstep3
+\font\titlesy=cmsy10 scaled \magstep4
+\def\authorrm{\secrm}
+\def\authortt{\sectt}
+
+% Chapter (and unnumbered) fonts (17.28pt).
+\setfont\chaprm\rmbshape{12}{\magstep2}
+\setfont\chapit\itbshape{10}{\magstep3}
+\setfont\chapsl\slbshape{10}{\magstep3}
+\setfont\chaptt\ttbshape{12}{\magstep2}
+\setfont\chapttsl\ttslshape{10}{\magstep3}
+\setfont\chapsf\sfbshape{17}{1000}
+\let\chapbf=\chaprm
+\setfont\chapsc\scbshape{10}{\magstep3}
+\font\chapi=cmmi12 scaled \magstep2
+\font\chapsy=cmsy10 scaled \magstep3
+
+% Section fonts (14.4pt).
+\setfont\secrm\rmbshape{12}{\magstep1}
+\setfont\secit\itbshape{10}{\magstep2}
+\setfont\secsl\slbshape{10}{\magstep2}
+\setfont\sectt\ttbshape{12}{\magstep1}
+\setfont\secttsl\ttslshape{10}{\magstep2}
+\setfont\secsf\sfbshape{12}{\magstep1}
+\let\secbf\secrm
+\setfont\secsc\scbshape{10}{\magstep2}
+\font\seci=cmmi12 scaled \magstep1
+\font\secsy=cmsy10 scaled \magstep2
+
+% Subsection fonts (13.15pt).
+\setfont\ssecrm\rmbshape{12}{\magstephalf}
+\setfont\ssecit\itbshape{10}{1315}
+\setfont\ssecsl\slbshape{10}{1315}
+\setfont\ssectt\ttbshape{12}{\magstephalf}
+\setfont\ssecttsl\ttslshape{10}{1315}
+\setfont\ssecsf\sfbshape{12}{\magstephalf}
+\let\ssecbf\ssecrm
+\setfont\ssecsc\scbshape{10}{\magstep1}
+\font\sseci=cmmi12 scaled \magstephalf
+\font\ssecsy=cmsy10 scaled 1315
+% The smallcaps and symbol fonts should actually be scaled \magstep1.5,
+% but that is not a standard magnification.
+
+% In order for the font changes to affect most math symbols and letters,
+% we have to define the \textfont of the standard families.  Since
+% texinfo doesn't allow for producing subscripts and superscripts except
+% in the main text, we don't bother to reset \scriptfont and
+% \scriptscriptfont (which would also require loading a lot more fonts).
+%
+\def\resetmathfonts{%
+  \textfont0=\tenrm \textfont1=\teni \textfont2=\tensy
+  \textfont\itfam=\tenit \textfont\slfam=\tensl \textfont\bffam=\tenbf
+  \textfont\ttfam=\tentt \textfont\sffam=\tensf
+}
+
+% The font-changing commands redefine the meanings of \tenSTYLE, instead
+% of just \STYLE.  We do this so that font changes will continue to work
+% in math mode, where it is the current \fam that is relevant in most
+% cases, not the current font.  Plain TeX does \def\bf{\fam=\bffam
+% \tenbf}, for example.  By redefining \tenbf, we obviate the need to
+% redefine \bf itself.
+\def\textfonts{%
+  \let\tenrm=\textrm \let\tenit=\textit \let\tensl=\textsl
+  \let\tenbf=\textbf \let\tentt=\texttt \let\smallcaps=\textsc
+  \let\tensf=\textsf \let\teni=\texti \let\tensy=\textsy \let\tenttsl=\textttsl
+  \resetmathfonts \setleading{\textleading}}
+\def\titlefonts{%
+  \let\tenrm=\titlerm \let\tenit=\titleit \let\tensl=\titlesl
+  \let\tenbf=\titlebf \let\tentt=\titlett \let\smallcaps=\titlesc
+  \let\tensf=\titlesf \let\teni=\titlei \let\tensy=\titlesy
+  \let\tenttsl=\titlettsl
+  \resetmathfonts \setleading{25pt}}
+\def\titlefont#1{{\titlefonts\rm #1}}
+\def\chapfonts{%
+  \let\tenrm=\chaprm \let\tenit=\chapit \let\tensl=\chapsl
+  \let\tenbf=\chapbf \let\tentt=\chaptt \let\smallcaps=\chapsc
+  \let\tensf=\chapsf \let\teni=\chapi \let\tensy=\chapsy \let\tenttsl=\chapttsl
+  \resetmathfonts \setleading{19pt}}
+\def\secfonts{%
+  \let\tenrm=\secrm \let\tenit=\secit \let\tensl=\secsl
+  \let\tenbf=\secbf \let\tentt=\sectt \let\smallcaps=\secsc
+  \let\tensf=\secsf \let\teni=\seci \let\tensy=\secsy \let\tenttsl=\secttsl
+  \resetmathfonts \setleading{16pt}}
+\def\subsecfonts{%
+  \let\tenrm=\ssecrm \let\tenit=\ssecit \let\tensl=\ssecsl
+  \let\tenbf=\ssecbf \let\tentt=\ssectt \let\smallcaps=\ssecsc
+  \let\tensf=\ssecsf \let\teni=\sseci \let\tensy=\ssecsy \let\tenttsl=\ssecttsl
+  \resetmathfonts \setleading{15pt}}
+\let\subsubsecfonts = \subsecfonts % Maybe make sssec fonts scaled magstephalf?
+\def\smallfonts{%
+  \let\tenrm=\smallrm \let\tenit=\smallit \let\tensl=\smallsl
+  \let\tenbf=\smallbf \let\tentt=\smalltt \let\smallcaps=\smallsc
+  \let\tensf=\smallsf \let\teni=\smalli \let\tensy=\smallsy
+  \let\tenttsl=\smallttsl
+  \resetmathfonts \setleading{10.5pt}}
+\def\smallerfonts{%
+  \let\tenrm=\smallerrm \let\tenit=\smallerit \let\tensl=\smallersl
+  \let\tenbf=\smallerbf \let\tentt=\smallertt \let\smallcaps=\smallersc
+  \let\tensf=\smallersf \let\teni=\smalleri \let\tensy=\smallersy
+  \let\tenttsl=\smallerttsl
+  \resetmathfonts \setleading{9.5pt}}
+
+% Set the fonts to use with the @small... environments.
+\let\smallexamplefonts = \smallfonts
+
+% About \smallexamplefonts.  If we use \smallfonts (9pt), @smallexample
+% can fit this many characters:
+%   8.5x11=86   smallbook=72  a4=90  a5=69
+% If we use \smallerfonts (8pt), then we can fit this many characters:
+%   8.5x11=90+  smallbook=80  a4=90+  a5=77
+% For me, subjectively, the few extra characters that fit aren't worth
+% the additional smallness of 8pt.  So I'm making the default 9pt.
+% 
+% By the way, for comparison, here's what fits with @example (10pt):
+%   8.5x11=71  smallbook=60  a4=75  a5=58
+% 
+% I wish we used A4 paper on this side of the Atlantic.
+% 
+% --karl, 24jan03.
+
+
+% Set up the default fonts, so we can use them for creating boxes.
+%
+\textfonts
+
+% Define these so they can be easily changed for other fonts.
+\def\angleleft{$\langle$}
+\def\angleright{$\rangle$}
+
+% Count depth in font-changes, for error checks
+\newcount\fontdepth \fontdepth=0
+
+% Fonts for short table of contents.
+\setfont\shortcontrm\rmshape{12}{1000}
+\setfont\shortcontbf\bxshape{12}{1000}
+\setfont\shortcontsl\slshape{12}{1000}
+\setfont\shortconttt\ttshape{12}{1000}
+
+%% Add scribe-like font environments, plus @l for inline lisp (usually sans
+%% serif) and @ii for TeX italic
+
+% \smartitalic{ARG} outputs arg in italics, followed by an italic correction
+% unless the following character is such as not to need one.
+\def\smartitalicx{\ifx\next,\else\ifx\next-\else\ifx\next.\else\/\fi\fi\fi}
+\def\smartslanted#1{{\ifusingtt\ttsl\sl #1}\futurelet\next\smartitalicx}
+\def\smartitalic#1{{\ifusingtt\ttsl\it #1}\futurelet\next\smartitalicx}
+
+\let\i=\smartitalic
+\let\var=\smartslanted
+\let\dfn=\smartslanted
+\let\emph=\smartitalic
+\let\cite=\smartslanted
+
+\def\b#1{{\bf #1}}
+\let\strong=\b
+
+% We can't just use \exhyphenpenalty, because that only has effect at
+% the end of a paragraph.  Restore normal hyphenation at the end of the
+% group within which \nohyphenation is presumably called.
+%
+\def\nohyphenation{\hyphenchar\font = -1  \aftergroup\restorehyphenation}
+\def\restorehyphenation{\hyphenchar\font = `- }
+
+% Set sfcode to normal for the chars that usually have another value.
+% Can't use plain's \frenchspacing because it uses the `\x notation, and
+% sometimes \x has an active definition that messes things up.
+% 
+\catcode`@=11
+  \def\frenchspacing{%
+    \sfcode\dotChar  =\@m \sfcode\questChar=\@m \sfcode\exclamChar=\@m
+    \sfcode\colonChar=\@m \sfcode\semiChar =\@m \sfcode\commaChar =\@m
+  }
+\catcode`@=\other
+
+\def\t#1{%
+  {\tt \rawbackslash \frenchspacing #1}%
+  \null
+}
+\let\ttfont=\t
+\def\samp#1{`\tclose{#1}'\null}
+\setfont\keyrm\rmshape{8}{1000}
+\font\keysy=cmsy9
+\def\key#1{{\keyrm\textfont2=\keysy \leavevmode\hbox{%
+  \raise0.4pt\hbox{\angleleft}\kern-.08em\vtop{%
+    \vbox{\hrule\kern-0.4pt
+     \hbox{\raise0.4pt\hbox{\vphantom{\angleleft}}#1}}%
+    \kern-0.4pt\hrule}%
+  \kern-.06em\raise0.4pt\hbox{\angleright}}}}
+% The old definition, with no lozenge:
+%\def\key #1{{\ttsl \nohyphenation \uppercase{#1}}\null}
+\def\ctrl #1{{\tt \rawbackslash \hat}#1}
+
+% @file, @option are the same as @samp.
+\let\file=\samp
+\let\option=\samp
+
+% @code is a modification of @t,
+% which makes spaces the same size as normal in the surrounding text.
+\def\tclose#1{%
+  {%
+    % Change normal interword space to be same as for the current font.
+    \spaceskip = \fontdimen2\font
+    %
+    % Switch to typewriter.
+    \tt
+    %
+    % But `\ ' produces the large typewriter interword space.
+    \def\ {{\spaceskip = 0pt{} }}%
+    %
+    % Turn off hyphenation.
+    \nohyphenation
+    %
+    \rawbackslash
+    \frenchspacing
+    #1%
+  }%
+  \null
+}
+
+% We *must* turn on hyphenation at `-' and `_' in \code.
+% Otherwise, it is too hard to avoid overfull hboxes
+% in the Emacs manual, the Library manual, etc.
+
+% Unfortunately, TeX uses one parameter (\hyphenchar) to control
+% both hyphenation at - and hyphenation within words.
+% We must therefore turn them both off (\tclose does that)
+% and arrange explicitly to hyphenate at a dash.
+%  -- rms.
+{
+  \catcode`\-=\active
+  \catcode`\_=\active
+  %
+  \global\def\code{\begingroup
+    \catcode`\-=\active \let-\codedash
+    \catcode`\_=\active \let_\codeunder
+    \codex
+  }
+  %
+  % If we end up with any active - characters when handling the index,
+  % just treat them as a normal -.
+  \global\def\indexbreaks{\catcode`\-=\active \let-\realdash}
+}
+
+\def\realdash{-}
+\def\codedash{-\discretionary{}{}{}}
+\def\codeunder{%
+  % this is all so @math{@code{var_name}+1} can work.  In math mode, _
+  % is "active" (mathcode"8000) and \normalunderscore (or \char95, etc.)
+  % will therefore expand the active definition of _, which is us
+  % (inside @code that is), therefore an endless loop.
+  \ifusingtt{\ifmmode
+               \mathchar"075F % class 0=ordinary, family 7=ttfam, pos 0x5F=_.
+             \else\normalunderscore \fi
+             \discretionary{}{}{}}%
+            {\_}%
+}
+\def\codex #1{\tclose{#1}\endgroup}
+
+% @kbd is like @code, except that if the argument is just one @key command,
+% then @kbd has no effect.
+
+% @kbdinputstyle -- arg is `distinct' (@kbd uses slanted tty font always),
+%   `example' (@kbd uses ttsl only inside of @example and friends),
+%   or `code' (@kbd uses normal tty font always).
+\def\kbdinputstyle{\parsearg\kbdinputstylexxx}
+\def\kbdinputstylexxx#1{%
+  \def\arg{#1}%
+  \ifx\arg\worddistinct
+    \gdef\kbdexamplefont{\ttsl}\gdef\kbdfont{\ttsl}%
+  \else\ifx\arg\wordexample
+    \gdef\kbdexamplefont{\ttsl}\gdef\kbdfont{\tt}%
+  \else\ifx\arg\wordcode
+    \gdef\kbdexamplefont{\tt}\gdef\kbdfont{\tt}%
+  \else
+    \errhelp = \EMsimple
+    \errmessage{Unknown @kbdinputstyle `\arg'}%
+  \fi\fi\fi
+}
+\def\worddistinct{distinct}
+\def\wordexample{example}
+\def\wordcode{code}
+
+% Default is `distinct.'
+\kbdinputstyle distinct
+
+\def\xkey{\key}
+\def\kbdfoo#1#2#3\par{\def\one{#1}\def\three{#3}\def\threex{??}%
+\ifx\one\xkey\ifx\threex\three \key{#2}%
+\else{\tclose{\kbdfont\look}}\fi
+\else{\tclose{\kbdfont\look}}\fi}
+
+% For @url, @env, @command quotes seem unnecessary, so use \code.
+\let\url=\code
+\let\env=\code
+\let\command=\code
+
+% @uref (abbreviation for `urlref') takes an optional (comma-separated)
+% second argument specifying the text to display and an optional third
+% arg as text to display instead of (rather than in addition to) the url
+% itself.  First (mandatory) arg is the url.  Perhaps eventually put in
+% a hypertex \special here.
+%
+\def\uref#1{\douref #1,,,\finish}
+\def\douref#1,#2,#3,#4\finish{\begingroup
+  \unsepspaces
+  \pdfurl{#1}%
+  \setbox0 = \hbox{\ignorespaces #3}%
+  \ifdim\wd0 > 0pt
+    \unhbox0 % third arg given, show only that
+  \else
+    \setbox0 = \hbox{\ignorespaces #2}%
+    \ifdim\wd0 > 0pt
+      \ifpdf
+        \unhbox0             % PDF: 2nd arg given, show only it
+      \else
+        \unhbox0\ (\code{#1})% DVI: 2nd arg given, show both it and url
+      \fi
+    \else
+      \code{#1}% only url given, so show it
+    \fi
+  \fi
+  \endlink
+\endgroup}
+
+% rms does not like angle brackets --karl, 17may97.
+% So now @email is just like @uref, unless we are pdf.
+% 
+%\def\email#1{\angleleft{\tt #1}\angleright}
+\ifpdf
+  \def\email#1{\doemail#1,,\finish}
+  \def\doemail#1,#2,#3\finish{\begingroup
+    \unsepspaces
+    \pdfurl{mailto:#1}%
+    \setbox0 = \hbox{\ignorespaces #2}%
+    \ifdim\wd0>0pt\unhbox0\else\code{#1}\fi
+    \endlink
+  \endgroup}
+\else
+  \let\email=\uref
+\fi
+
+% Check if we are currently using a typewriter font.  Since all the
+% Computer Modern typewriter fonts have zero interword stretch (and
+% shrink), and it is reasonable to expect all typewriter fonts to have
+% this property, we can check that font parameter.
+%
+\def\ifmonospace{\ifdim\fontdimen3\font=0pt }
+
+% Typeset a dimension, e.g., `in' or `pt'.  The only reason for the
+% argument is to make the input look right: @dmn{pt} instead of @dmn{}pt.
+%
+\def\dmn#1{\thinspace #1}
+
+\def\kbd#1{\def\look{#1}\expandafter\kbdfoo\look??\par}
+
+% @l was never documented to mean ``switch to the Lisp font'',
+% and it is not used as such in any manual I can find.  We need it for
+% Polish suppressed-l.  --karl, 22sep96.
+%\def\l#1{{\li #1}\null}
+
+% Explicit font changes: @r, @sc, undocumented @ii.
+\def\r#1{{\rm #1}}              % roman font
+\def\sc#1{{\smallcaps#1}}       % smallcaps font
+\def\ii#1{{\it #1}}             % italic font
+
+% @acronym downcases the argument and prints in smallcaps.
+\def\acronym#1{{\smallcaps \lowercase{#1}}}
+
+% @pounds{} is a sterling sign.
+\def\pounds{{\it\$}}
+
+
+\message{page headings,}
+
+\newskip\titlepagetopglue \titlepagetopglue = 1.5in
+\newskip\titlepagebottomglue \titlepagebottomglue = 2pc
+
+% First the title page.  Must do @settitle before @titlepage.
+\newif\ifseenauthor
+\newif\iffinishedtitlepage
+
+% Do an implicit @contents or @shortcontents after @end titlepage if the
+% user says @setcontentsaftertitlepage or @setshortcontentsaftertitlepage.
+%
+\newif\ifsetcontentsaftertitlepage
+ \let\setcontentsaftertitlepage = \setcontentsaftertitlepagetrue
+\newif\ifsetshortcontentsaftertitlepage
+ \let\setshortcontentsaftertitlepage = \setshortcontentsaftertitlepagetrue
+
+\def\shorttitlepage{\parsearg\shorttitlepagezzz}
+\def\shorttitlepagezzz #1{\begingroup\hbox{}\vskip 1.5in \chaprm \centerline{#1}%
+        \endgroup\page\hbox{}\page}
+
+\def\titlepage{\begingroup \parindent=0pt \textfonts
+   \let\subtitlerm=\tenrm
+   \def\subtitlefont{\subtitlerm \normalbaselineskip = 13pt \normalbaselines}%
+   %
+   \def\authorfont{\authorrm \normalbaselineskip = 16pt \normalbaselines
+                   \let\tt=\authortt}%
+   %
+   % Leave some space at the very top of the page.
+   \vglue\titlepagetopglue
+   %
+   % Now you can print the title using @title.
+   \def\title{\parsearg\titlezzz}%
+   \def\titlezzz##1{\leftline{\titlefonts\rm ##1}
+                    % print a rule at the page bottom also.
+                    \finishedtitlepagefalse
+                    \vskip4pt \hrule height 4pt width \hsize \vskip4pt}%
+   % No rule at page bottom unless we print one at the top with @title.
+   \finishedtitlepagetrue
+   %
+   % Now you can put text using @subtitle.
+   \def\subtitle{\parsearg\subtitlezzz}%
+   \def\subtitlezzz##1{{\subtitlefont \rightline{##1}}}%
+   %
+   % @author should come last, but may come many times.
+   \def\author{\parsearg\authorzzz}%
+   \def\authorzzz##1{\ifseenauthor\else\vskip 0pt plus 1filll\seenauthortrue\fi
+      {\authorfont \leftline{##1}}}%
+   %
+   % Most title ``pages'' are actually two pages long, with space
+   % at the top of the second.  We don't want the ragged left on the second.
+   \let\oldpage = \page
+   \def\page{%
+      \iffinishedtitlepage\else
+         \finishtitlepage
+      \fi
+      \oldpage
+      \let\page = \oldpage
+      \hbox{}}%
+%   \def\page{\oldpage \hbox{}}
+}
+
+\def\Etitlepage{%
+   \iffinishedtitlepage\else
+      \finishtitlepage
+   \fi
+   % It is important to do the page break before ending the group,
+   % because the headline and footline are only empty inside the group.
+   % If we use the new definition of \page, we always get a blank page
+   % after the title page, which we certainly don't want.
+   \oldpage
+   \endgroup
+   %
+   % Need this before the \...aftertitlepage checks so that if they are
+   % in effect the toc pages will come out with page numbers.
+   \HEADINGSon
+   %
+   % If they want short, they certainly want long too.
+   \ifsetshortcontentsaftertitlepage
+     \shortcontents
+     \contents
+     \global\let\shortcontents = \relax
+     \global\let\contents = \relax
+   \fi
+   %
+   \ifsetcontentsaftertitlepage
+     \contents
+     \global\let\contents = \relax
+     \global\let\shortcontents = \relax
+   \fi
+}
+
+\def\finishtitlepage{%
+   \vskip4pt \hrule height 2pt width \hsize
+   \vskip\titlepagebottomglue
+   \finishedtitlepagetrue
+}
+
+%%% Set up page headings and footings.
+
+\let\thispage=\folio
+
+\newtoks\evenheadline    % headline on even pages
+\newtoks\oddheadline     % headline on odd pages
+\newtoks\evenfootline    % footline on even pages
+\newtoks\oddfootline     % footline on odd pages
+
+% Now make Tex use those variables
+\headline={{\textfonts\rm \ifodd\pageno \the\oddheadline
+                            \else \the\evenheadline \fi}}
+\footline={{\textfonts\rm \ifodd\pageno \the\oddfootline
+                            \else \the\evenfootline \fi}\HEADINGShook}
+\let\HEADINGShook=\relax
+
+% Commands to set those variables.
+% For example, this is what  @headings on  does
+% @evenheading @thistitle|@thispage|@thischapter
+% @oddheading @thischapter|@thispage|@thistitle
+% @evenfooting @thisfile||
+% @oddfooting ||@thisfile
+
+\def\evenheading{\parsearg\evenheadingxxx}
+\def\oddheading{\parsearg\oddheadingxxx}
+\def\everyheading{\parsearg\everyheadingxxx}
+
+\def\evenfooting{\parsearg\evenfootingxxx}
+\def\oddfooting{\parsearg\oddfootingxxx}
+\def\everyfooting{\parsearg\everyfootingxxx}
+
+{\catcode`\@=0 %
+
+\gdef\evenheadingxxx #1{\evenheadingyyy #1@|@|@|@|\finish}
+\gdef\evenheadingyyy #1@|#2@|#3@|#4\finish{%
+\global\evenheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}}
+
+\gdef\oddheadingxxx #1{\oddheadingyyy #1@|@|@|@|\finish}
+\gdef\oddheadingyyy #1@|#2@|#3@|#4\finish{%
+\global\oddheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}}
+
+\gdef\everyheadingxxx#1{\oddheadingxxx{#1}\evenheadingxxx{#1}}%
+
+\gdef\evenfootingxxx #1{\evenfootingyyy #1@|@|@|@|\finish}
+\gdef\evenfootingyyy #1@|#2@|#3@|#4\finish{%
+\global\evenfootline={\rlap{\centerline{#2}}\line{#1\hfil#3}}}
+
+\gdef\oddfootingxxx #1{\oddfootingyyy #1@|@|@|@|\finish}
+\gdef\oddfootingyyy #1@|#2@|#3@|#4\finish{%
+  \global\oddfootline = {\rlap{\centerline{#2}}\line{#1\hfil#3}}%
+  %
+  % Leave some space for the footline.  Hopefully ok to assume
+  % @evenfooting will not be used by itself.
+  \global\advance\pageheight by -\baselineskip
+  \global\advance\vsize by -\baselineskip
+}
+
+\gdef\everyfootingxxx#1{\oddfootingxxx{#1}\evenfootingxxx{#1}}
+%
+}% unbind the catcode of @.
+
+% @headings double      turns headings on for double-sided printing.
+% @headings single      turns headings on for single-sided printing.
+% @headings off         turns them off.
+% @headings on          same as @headings double, retained for compatibility.
+% @headings after       turns on double-sided headings after this page.
+% @headings doubleafter turns on double-sided headings after this page.
+% @headings singleafter turns on single-sided headings after this page.
+% By default, they are off at the start of a document,
+% and turned `on' after @end titlepage.
+
+\def\headings #1 {\csname HEADINGS#1\endcsname}
+
+\def\HEADINGSoff{
+\global\evenheadline={\hfil} \global\evenfootline={\hfil}
+\global\oddheadline={\hfil} \global\oddfootline={\hfil}}
+\HEADINGSoff
+% When we turn headings on, set the page number to 1.
+% For double-sided printing, put current file name in lower left corner,
+% chapter name on inside top of right hand pages, document
+% title on inside top of left hand pages, and page numbers on outside top
+% edge of all pages.
+\def\HEADINGSdouble{
+\global\pageno=1
+\global\evenfootline={\hfil}
+\global\oddfootline={\hfil}
+\global\evenheadline={\line{\folio\hfil\thistitle}}
+\global\oddheadline={\line{\thischapter\hfil\folio}}
+\global\let\contentsalignmacro = \chapoddpage
+}
+\let\contentsalignmacro = \chappager
+
+% For single-sided printing, chapter title goes across top left of page,
+% page number on top right.
+\def\HEADINGSsingle{
+\global\pageno=1
+\global\evenfootline={\hfil}
+\global\oddfootline={\hfil}
+\global\evenheadline={\line{\thischapter\hfil\folio}}
+\global\oddheadline={\line{\thischapter\hfil\folio}}
+\global\let\contentsalignmacro = \chappager
+}
+\def\HEADINGSon{\HEADINGSdouble}
+
+\def\HEADINGSafter{\let\HEADINGShook=\HEADINGSdoublex}
+\let\HEADINGSdoubleafter=\HEADINGSafter
+\def\HEADINGSdoublex{%
+\global\evenfootline={\hfil}
+\global\oddfootline={\hfil}
+\global\evenheadline={\line{\folio\hfil\thistitle}}
+\global\oddheadline={\line{\thischapter\hfil\folio}}
+\global\let\contentsalignmacro = \chapoddpage
+}
+
+\def\HEADINGSsingleafter{\let\HEADINGShook=\HEADINGSsinglex}
+\def\HEADINGSsinglex{%
+\global\evenfootline={\hfil}
+\global\oddfootline={\hfil}
+\global\evenheadline={\line{\thischapter\hfil\folio}}
+\global\oddheadline={\line{\thischapter\hfil\folio}}
+\global\let\contentsalignmacro = \chappager
+}
+
+% Subroutines used in generating headings
+% This produces Day Month Year style of output.
+% Only define if not already defined, in case a txi-??.tex file has set
+% up a different format (e.g., txi-cs.tex does this).
+\ifx\today\undefined
+\def\today{%
+  \number\day\space
+  \ifcase\month
+  \or\putwordMJan\or\putwordMFeb\or\putwordMMar\or\putwordMApr
+  \or\putwordMMay\or\putwordMJun\or\putwordMJul\or\putwordMAug
+  \or\putwordMSep\or\putwordMOct\or\putwordMNov\or\putwordMDec
+  \fi
+  \space\number\year}
+\fi
+
+% @settitle line...  specifies the title of the document, for headings.
+% It generates no output of its own.
+\def\thistitle{\putwordNoTitle}
+\def\settitle{\parsearg\settitlezzz}
+\def\settitlezzz #1{\gdef\thistitle{#1}}
+
+
+\message{tables,}
+% Tables -- @table, @ftable, @vtable, @item(x), @kitem(x), @xitem(x).
+
+% default indentation of table text
+\newdimen\tableindent \tableindent=.8in
+% default indentation of @itemize and @enumerate text
+\newdimen\itemindent  \itemindent=.3in
+% margin between end of table item and start of table text.
+\newdimen\itemmargin  \itemmargin=.1in
+
+% used internally for \itemindent minus \itemmargin
+\newdimen\itemmax
+
+% Note @table, @vtable, and @vtable define @item, @itemx, etc., with
+% these defs.
+% They also define \itemindex
+% to index the item name in whatever manner is desired (perhaps none).
+
+\newif\ifitemxneedsnegativevskip
+
+\def\itemxpar{\par\ifitemxneedsnegativevskip\nobreak\vskip-\parskip\nobreak\fi}
+
+\def\internalBitem{\smallbreak \parsearg\itemzzz}
+\def\internalBitemx{\itemxpar \parsearg\itemzzz}
+
+\def\internalBxitem "#1"{\def\xitemsubtopix{#1} \smallbreak \parsearg\xitemzzz}
+\def\internalBxitemx "#1"{\def\xitemsubtopix{#1} \itemxpar \parsearg\xitemzzz}
+
+\def\internalBkitem{\smallbreak \parsearg\kitemzzz}
+\def\internalBkitemx{\itemxpar \parsearg\kitemzzz}
+
+\def\kitemzzz #1{\dosubind {kw}{\code{#1}}{for {\bf \lastfunction}}%
+                 \itemzzz {#1}}
+
+\def\xitemzzz #1{\dosubind {kw}{\code{#1}}{for {\bf \xitemsubtopic}}%
+                 \itemzzz {#1}}
+
+\def\itemzzz #1{\begingroup %
+  \advance\hsize by -\rightskip
+  \advance\hsize by -\tableindent
+  \setbox0=\hbox{\itemfont{#1}}%
+  \itemindex{#1}%
+  \nobreak % This prevents a break before @itemx.
+  %
+  % If the item text does not fit in the space we have, put it on a line
+  % by itself, and do not allow a page break either before or after that
+  % line.  We do not start a paragraph here because then if the next
+  % command is, e.g., @kindex, the whatsit would get put into the
+  % horizontal list on a line by itself, resulting in extra blank space.
+  \ifdim \wd0>\itemmax
+    %
+    % Make this a paragraph so we get the \parskip glue and wrapping,
+    % but leave it ragged-right.
+    \begingroup
+      \advance\leftskip by-\tableindent
+      \advance\hsize by\tableindent
+      \advance\rightskip by0pt plus1fil
+      \leavevmode\unhbox0\par
+    \endgroup
+    %
+    % We're going to be starting a paragraph, but we don't want the
+    % \parskip glue -- logically it's part of the @item we just started.
+    \nobreak \vskip-\parskip
+    %
+    % Stop a page break at the \parskip glue coming up.  (Unfortunately
+    % we can't prevent a possible page break at the following
+    % \baselineskip glue.)  However, if what follows is an environment
+    % such as @example, there will be no \parskip glue; then
+    % the negative vskip we just would cause the example and the item to
+    % crash together.  So we use this bizarre value of 10001 as a signal
+    % to \aboveenvbreak to insert \parskip glue after all.
+    % (Possibly there are other commands that could be followed by
+    % @example which need the same treatment, but not section titles; or
+    % maybe section titles are the only special case and they should be
+    % penalty 10001...)
+    \penalty 10001
+    \endgroup
+    \itemxneedsnegativevskipfalse
+  \else
+    % The item text fits into the space.  Start a paragraph, so that the
+    % following text (if any) will end up on the same line.
+    \noindent
+    % Do this with kerns and \unhbox so that if there is a footnote in
+    % the item text, it can migrate to the main vertical list and
+    % eventually be printed.
+    \nobreak\kern-\tableindent
+    \dimen0 = \itemmax  \advance\dimen0 by \itemmargin \advance\dimen0 by -\wd0
+    \unhbox0
+    \nobreak\kern\dimen0
+    \endgroup
+    \itemxneedsnegativevskiptrue
+  \fi
+}
+
+\def\item{\errmessage{@item while not in a table}}
+\def\itemx{\errmessage{@itemx while not in a table}}
+\def\kitem{\errmessage{@kitem while not in a table}}
+\def\kitemx{\errmessage{@kitemx while not in a table}}
+\def\xitem{\errmessage{@xitem while not in a table}}
+\def\xitemx{\errmessage{@xitemx while not in a table}}
+
+% Contains a kludge to get @end[description] to work.
+\def\description{\tablez{\dontindex}{1}{}{}{}{}}
+
+% @table, @ftable, @vtable.
+\def\table{\begingroup\inENV\obeylines\obeyspaces\tablex}
+{\obeylines\obeyspaces%
+\gdef\tablex #1^^M{%
+\tabley\dontindex#1        \endtabley}}
+
+\def\ftable{\begingroup\inENV\obeylines\obeyspaces\ftablex}
+{\obeylines\obeyspaces%
+\gdef\ftablex #1^^M{%
+\tabley\fnitemindex#1        \endtabley
+\def\Eftable{\endgraf\afterenvbreak\endgroup}%
+\let\Etable=\relax}}
+
+\def\vtable{\begingroup\inENV\obeylines\obeyspaces\vtablex}
+{\obeylines\obeyspaces%
+\gdef\vtablex #1^^M{%
+\tabley\vritemindex#1        \endtabley
+\def\Evtable{\endgraf\afterenvbreak\endgroup}%
+\let\Etable=\relax}}
+
+\def\dontindex #1{}
+\def\fnitemindex #1{\doind {fn}{\code{#1}}}%
+\def\vritemindex #1{\doind {vr}{\code{#1}}}%
+
+{\obeyspaces %
+\gdef\tabley#1#2 #3 #4 #5 #6 #7\endtabley{\endgroup%
+\tablez{#1}{#2}{#3}{#4}{#5}{#6}}}
+
+\def\tablez #1#2#3#4#5#6{%
+\aboveenvbreak %
+\begingroup %
+\def\Edescription{\Etable}% Necessary kludge.
+\let\itemindex=#1%
+\ifnum 0#3>0 \advance \leftskip by #3\mil \fi %
+\ifnum 0#4>0 \tableindent=#4\mil \fi %
+\ifnum 0#5>0 \advance \rightskip by #5\mil \fi %
+\def\itemfont{#2}%
+\itemmax=\tableindent %
+\advance \itemmax by -\itemmargin %
+\advance \leftskip by \tableindent %
+\exdentamount=\tableindent
+\parindent = 0pt
+\parskip = \smallskipamount
+\ifdim \parskip=0pt \parskip=2pt \fi%
+\def\Etable{\endgraf\afterenvbreak\endgroup}%
+\let\item = \internalBitem %
+\let\itemx = \internalBitemx %
+\let\kitem = \internalBkitem %
+\let\kitemx = \internalBkitemx %
+\let\xitem = \internalBxitem %
+\let\xitemx = \internalBxitemx %
+}
+
+% This is the counter used by @enumerate, which is really @itemize
+
+\newcount \itemno
+
+\def\itemize{\parsearg\itemizezzz}
+
+\def\itemizezzz #1{%
+  \begingroup % ended by the @end itemize
+  \itemizey {#1}{\Eitemize}
+}
+
+\def\itemizey #1#2{%
+\aboveenvbreak %
+\itemmax=\itemindent %
+\advance \itemmax by -\itemmargin %
+\advance \leftskip by \itemindent %
+\exdentamount=\itemindent
+\parindent = 0pt %
+\parskip = \smallskipamount %
+\ifdim \parskip=0pt \parskip=2pt \fi%
+\def#2{\endgraf\afterenvbreak\endgroup}%
+\def\itemcontents{#1}%
+\let\item=\itemizeitem}
+
+% \splitoff TOKENS\endmark defines \first to be the first token in
+% TOKENS, and \rest to be the remainder.
+%
+\def\splitoff#1#2\endmark{\def\first{#1}\def\rest{#2}}%
+
+% Allow an optional argument of an uppercase letter, lowercase letter,
+% or number, to specify the first label in the enumerated list.  No
+% argument is the same as `1'.
+%
+\def\enumerate{\parsearg\enumeratezzz}
+\def\enumeratezzz #1{\enumeratey #1  \endenumeratey}
+\def\enumeratey #1 #2\endenumeratey{%
+  \begingroup % ended by the @end enumerate
+  %
+  % If we were given no argument, pretend we were given `1'.
+  \def\thearg{#1}%
+  \ifx\thearg\empty \def\thearg{1}\fi
+  %
+  % Detect if the argument is a single token.  If so, it might be a
+  % letter.  Otherwise, the only valid thing it can be is a number.
+  % (We will always have one token, because of the test we just made.
+  % This is a good thing, since \splitoff doesn't work given nothing at
+  % all -- the first parameter is undelimited.)
+  \expandafter\splitoff\thearg\endmark
+  \ifx\rest\empty
+    % Only one token in the argument.  It could still be anything.
+    % A ``lowercase letter'' is one whose \lccode is nonzero.
+    % An ``uppercase letter'' is one whose \lccode is both nonzero, and
+    %   not equal to itself.
+    % Otherwise, we assume it's a number.
+    %
+    % We need the \relax at the end of the \ifnum lines to stop TeX from
+    % continuing to look for a <number>.
+    %
+    \ifnum\lccode\expandafter`\thearg=0\relax
+      \numericenumerate % a number (we hope)
+    \else
+      % It's a letter.
+      \ifnum\lccode\expandafter`\thearg=\expandafter`\thearg\relax
+        \lowercaseenumerate % lowercase letter
+      \else
+        \uppercaseenumerate % uppercase letter
+      \fi
+    \fi
+  \else
+    % Multiple tokens in the argument.  We hope it's a number.
+    \numericenumerate
+  \fi
+}
+
+% An @enumerate whose labels are integers.  The starting integer is
+% given in \thearg.
+%
+\def\numericenumerate{%
+  \itemno = \thearg
+  \startenumeration{\the\itemno}%
+}
+
+% The starting (lowercase) letter is in \thearg.
+\def\lowercaseenumerate{%
+  \itemno = \expandafter`\thearg
+  \startenumeration{%
+    % Be sure we're not beyond the end of the alphabet.
+    \ifnum\itemno=0
+      \errmessage{No more lowercase letters in @enumerate; get a bigger
+                  alphabet}%
+    \fi
+    \char\lccode\itemno
+  }%
+}
+
+% The starting (uppercase) letter is in \thearg.
+\def\uppercaseenumerate{%
+  \itemno = \expandafter`\thearg
+  \startenumeration{%
+    % Be sure we're not beyond the end of the alphabet.
+    \ifnum\itemno=0
+      \errmessage{No more uppercase letters in @enumerate; get a bigger
+                  alphabet}
+    \fi
+    \char\uccode\itemno
+  }%
+}
+
+% Call itemizey, adding a period to the first argument and supplying the
+% common last two arguments.  Also subtract one from the initial value in
+% \itemno, since @item increments \itemno.
+%
+\def\startenumeration#1{%
+  \advance\itemno by -1
+  \itemizey{#1.}\Eenumerate\flushcr
+}
+
+% @alphaenumerate and @capsenumerate are abbreviations for giving an arg
+% to @enumerate.
+%
+\def\alphaenumerate{\enumerate{a}}
+\def\capsenumerate{\enumerate{A}}
+\def\Ealphaenumerate{\Eenumerate}
+\def\Ecapsenumerate{\Eenumerate}
+
+% Definition of @item while inside @itemize.
+
+\def\itemizeitem{%
+\advance\itemno by 1
+{\let\par=\endgraf \smallbreak}%
+\ifhmode \errmessage{In hmode at itemizeitem}\fi
+{\parskip=0in \hskip 0pt
+\hbox to 0pt{\hss \itemcontents\hskip \itemmargin}%
+\vadjust{\penalty 1200}}%
+\flushcr}
+
+% @multitable macros
+% Amy Hendrickson, 8/18/94, 3/6/96
+%
+% @multitable ... @end multitable will make as many columns as desired.
+% Contents of each column will wrap at width given in preamble.  Width
+% can be specified either with sample text given in a template line,
+% or in percent of \hsize, the current width of text on page.
+
+% Table can continue over pages but will only break between lines.
+
+% To make preamble:
+%
+% Either define widths of columns in terms of percent of \hsize:
+%   @multitable @columnfractions .25 .3 .45
+%   @item ...
+%
+%   Numbers following @columnfractions are the percent of the total
+%   current hsize to be used for each column. You may use as many
+%   columns as desired.
+
+
+% Or use a template:
+%   @multitable {Column 1 template} {Column 2 template} {Column 3 template}
+%   @item ...
+%   using the widest term desired in each column.
+%
+% For those who want to use more than one line's worth of words in
+% the preamble, break the line within one argument and it
+% will parse correctly, i.e.,
+%
+%     @multitable {Column 1 template} {Column 2 template} {Column 3
+%      template}
+% Not:
+%     @multitable {Column 1 template} {Column 2 template}
+%      {Column 3 template}
+
+% Each new table line starts with @item, each subsequent new column
+% starts with @tab. Empty columns may be produced by supplying @tab's
+% with nothing between them for as many times as empty columns are needed,
+% ie, @tab@tab@tab will produce two empty columns.
+
+% @item, @tab, @multitable or @end multitable do not need to be on their
+% own lines, but it will not hurt if they are.
+
+% Sample multitable:
+
+%   @multitable {Column 1 template} {Column 2 template} {Column 3 template}
+%   @item first col stuff @tab second col stuff @tab third col
+%   @item
+%   first col stuff
+%   @tab
+%   second col stuff
+%   @tab
+%   third col
+%   @item first col stuff @tab second col stuff
+%   @tab Many paragraphs of text may be used in any column.
+%
+%         They will wrap at the width determined by the template.
+%   @item@tab@tab This will be in third column.
+%   @end multitable
+
+% Default dimensions may be reset by user.
+% @multitableparskip is vertical space between paragraphs in table.
+% @multitableparindent is paragraph indent in table.
+% @multitablecolmargin is horizontal space to be left between columns.
+% @multitablelinespace is space to leave between table items, baseline
+%                                                            to baseline.
+%   0pt means it depends on current normal line spacing.
+%
+\newskip\multitableparskip
+\newskip\multitableparindent
+\newdimen\multitablecolspace
+\newskip\multitablelinespace
+\multitableparskip=0pt
+\multitableparindent=6pt
+\multitablecolspace=12pt
+\multitablelinespace=0pt
+
+% Macros used to set up halign preamble:
+%
+\let\endsetuptable\relax
+\def\xendsetuptable{\endsetuptable}
+\let\columnfractions\relax
+\def\xcolumnfractions{\columnfractions}
+\newif\ifsetpercent
+
+% #1 is the part of the @columnfraction before the decimal point, which
+% is presumably either 0 or the empty string (but we don't check, we
+% just throw it away).  #2 is the decimal part, which we use as the
+% percent of \hsize for this column.
+\def\pickupwholefraction#1.#2 {%
+  \global\advance\colcount by 1
+  \expandafter\xdef\csname col\the\colcount\endcsname{.#2\hsize}%
+  \setuptable
+}
+
+\newcount\colcount
+\def\setuptable#1{%
+  \def\firstarg{#1}%
+  \ifx\firstarg\xendsetuptable
+    \let\go = \relax
+  \else
+    \ifx\firstarg\xcolumnfractions
+      \global\setpercenttrue
+    \else
+      \ifsetpercent
+         \let\go\pickupwholefraction
+      \else
+         \global\advance\colcount by 1
+         \setbox0=\hbox{#1\unskip\space}% Add a normal word space as a
+                   % separator; typically that is always in the input, anyway.
+         \expandafter\xdef\csname col\the\colcount\endcsname{\the\wd0}%
+      \fi
+    \fi
+    \ifx\go\pickupwholefraction
+      % Put the argument back for the \pickupwholefraction call, so
+      % we'll always have a period there to be parsed.
+      \def\go{\pickupwholefraction#1}%
+    \else
+      \let\go = \setuptable
+    \fi%
+  \fi
+  \go
+}
+
+% @multitable ... @end multitable definitions:
+%
+\def\multitable{\parsearg\dotable}
+\def\dotable#1{\bgroup
+  \vskip\parskip
+  \let\item=\crcrwithfootnotes
+  % A \tab used to include \hskip1sp.  But then the space in a template
+  % line is not enough.  That is bad.  So let's go back to just & until
+  % we encounter the problem it was intended to solve again.  --karl,
+  % nathan@acm.org, 20apr99.
+  \let\tab=&%
+  \let\startfootins=\startsavedfootnote
+  \tolerance=9500
+  \hbadness=9500
+  \setmultitablespacing
+  \parskip=\multitableparskip
+  \parindent=\multitableparindent
+  \overfullrule=0pt
+  \global\colcount=0
+  \def\Emultitable{%
+    \global\setpercentfalse
+    \crcrwithfootnotes\crcr
+    \egroup\egroup
+  }%
+  %
+  % To parse everything between @multitable and @item:
+  \setuptable#1 \endsetuptable
+  %
+  % \everycr will reset column counter, \colcount, at the end of
+  % each line. Every column entry will cause \colcount to advance by one.
+  % The table preamble
+  % looks at the current \colcount to find the correct column width.
+  \everycr{\noalign{%
+  %
+  % \filbreak%% keeps underfull box messages off when table breaks over pages.
+  % Maybe so, but it also creates really weird page breaks when the table
+  % breaks over pages. Wouldn't \vfil be better?  Wait until the problem
+  % manifests itself, so it can be fixed for real --karl.
+    \global\colcount=0\relax}}%
+  %
+  % This preamble sets up a generic column definition, which will
+  % be used as many times as user calls for columns.
+  % \vtop will set a single line and will also let text wrap and
+  % continue for many paragraphs if desired.
+  \halign\bgroup&\global\advance\colcount by 1\relax
+    \multistrut\vtop{\hsize=\expandafter\csname col\the\colcount\endcsname
+  %
+  % In order to keep entries from bumping into each other
+  % we will add a \leftskip of \multitablecolspace to all columns after
+  % the first one.
+  %
+  % If a template has been used, we will add \multitablecolspace
+  % to the width of each template entry.
+  %
+  % If the user has set preamble in terms of percent of \hsize we will
+  % use that dimension as the width of the column, and the \leftskip
+  % will keep entries from bumping into each other.  Table will start at
+  % left margin and final column will justify at right margin.
+  %
+  % Make sure we don't inherit \rightskip from the outer environment.
+  \rightskip=0pt
+  \ifnum\colcount=1
+    % The first column will be indented with the surrounding text.
+    \advance\hsize by\leftskip
+  \else
+    \ifsetpercent \else
+      % If user has not set preamble in terms of percent of \hsize
+      % we will advance \hsize by \multitablecolspace.
+      \advance\hsize by \multitablecolspace
+    \fi
+   % In either case we will make \leftskip=\multitablecolspace:
+  \leftskip=\multitablecolspace
+  \fi
+  % Ignoring space at the beginning and end avoids an occasional spurious
+  % blank line, when TeX decides to break the line at the space before the
+  % box from the multistrut, so the strut ends up on a line by itself.
+  % For example:
+  % @multitable @columnfractions .11 .89
+  % @item @code{#}
+  % @tab Legal holiday which is valid in major parts of the whole country.
+  % Is automatically provided with highlighting sequences respectively marking
+  % characters.
+  \noindent\ignorespaces##\unskip\multistrut}\cr
+}
+
+\def\setmultitablespacing{% test to see if user has set \multitablelinespace.
+% If so, do nothing. If not, give it an appropriate dimension based on
+% current baselineskip.
+\ifdim\multitablelinespace=0pt
+\setbox0=\vbox{X}\global\multitablelinespace=\the\baselineskip
+\global\advance\multitablelinespace by-\ht0
+%% strut to put in table in case some entry doesn't have descenders,
+%% to keep lines equally spaced
+\let\multistrut = \strut
+\else
+%% FIXME: what is \box0 supposed to be?
+\gdef\multistrut{\vrule height\multitablelinespace depth\dp0
+width0pt\relax} \fi
+%% Test to see if parskip is larger than space between lines of
+%% table. If not, do nothing.
+%%        If so, set to same dimension as multitablelinespace.
+\ifdim\multitableparskip>\multitablelinespace
+\global\multitableparskip=\multitablelinespace
+\global\advance\multitableparskip-7pt %% to keep parskip somewhat smaller
+                                      %% than skip between lines in the table.
+\fi%
+\ifdim\multitableparskip=0pt
+\global\multitableparskip=\multitablelinespace
+\global\advance\multitableparskip-7pt %% to keep parskip somewhat smaller
+                                      %% than skip between lines in the table.
+\fi}
+
+% In case a @footnote appears inside an alignment, save the footnote
+% text to a box and make the \insert when a row of the table is
+% finished.  Otherwise, the insertion is lost, it never migrates to the
+% main vertical list.  --kasal, 22jan03.
+%
+\newbox\savedfootnotes
+%
+% \dotable \let's \startfootins to this, so that \dofootnote will call
+% it instead of starting the insertion right away.
+\def\startsavedfootnote{%
+  \global\setbox\savedfootnotes = \vbox\bgroup
+    \unvbox\savedfootnotes
+}
+\def\crcrwithfootnotes{%
+  \crcr
+  \ifvoid\savedfootnotes \else
+    \noalign{\insert\footins{\box\savedfootnotes}}%
+  \fi
+}
+
+\message{conditionals,}
+% Prevent errors for section commands.
+% Used in @ignore and in failing conditionals.
+\def\ignoresections{%
+  \let\chapter=\relax
+  \let\unnumbered=\relax
+  \let\top=\relax
+  \let\unnumberedsec=\relax
+  \let\unnumberedsection=\relax
+  \let\unnumberedsubsec=\relax
+  \let\unnumberedsubsection=\relax
+  \let\unnumberedsubsubsec=\relax
+  \let\unnumberedsubsubsection=\relax
+  \let\section=\relax
+  \let\subsec=\relax
+  \let\subsubsec=\relax
+  \let\subsection=\relax
+  \let\subsubsection=\relax
+  \let\appendix=\relax
+  \let\appendixsec=\relax
+  \let\appendixsection=\relax
+  \let\appendixsubsec=\relax
+  \let\appendixsubsection=\relax
+  \let\appendixsubsubsec=\relax
+  \let\appendixsubsubsection=\relax
+  \let\contents=\relax
+  \let\smallbook=\relax
+  \let\titlepage=\relax
+}
+
+% Used in nested conditionals, where we have to parse the Texinfo source
+% and so want to turn off most commands, in case they are used
+% incorrectly.
+%
+% We use \empty instead of \relax for the @def... commands, so that \end
+% doesn't throw an error.  For instance:
+% @ignore
+% @deffn ...
+% @end deffn
+% @end ignore
+% 
+% The @end deffn is going to get expanded, because we're trying to allow
+% nested conditionals.  But we don't want to expand the actual @deffn,
+% since it might be syntactically correct and intended to be ignored.
+% Since \end checks for \relax, using \empty does not cause an error.
+% 
+\def\ignoremorecommands{%
+  \let\defcodeindex = \relax
+  \let\defcv = \empty
+  \let\defcvx = \empty
+  \let\Edefcv = \empty
+  \let\deffn = \empty
+  \let\deffnx = \empty
+  \let\Edeffn = \empty
+  \let\defindex = \relax
+  \let\defivar = \empty
+  \let\defivarx = \empty
+  \let\Edefivar = \empty
+  \let\defmac = \empty
+  \let\defmacx = \empty
+  \let\Edefmac = \empty
+  \let\defmethod = \empty
+  \let\defmethodx = \empty
+  \let\Edefmethod = \empty
+  \let\defop = \empty
+  \let\defopx = \empty
+  \let\Edefop = \empty
+  \let\defopt = \empty
+  \let\defoptx = \empty
+  \let\Edefopt = \empty
+  \let\defspec = \empty
+  \let\defspecx = \empty
+  \let\Edefspec = \empty
+  \let\deftp = \empty
+  \let\deftpx = \empty
+  \let\Edeftp = \empty
+  \let\deftypefn = \empty
+  \let\deftypefnx = \empty
+  \let\Edeftypefn = \empty
+  \let\deftypefun = \empty
+  \let\deftypefunx = \empty
+  \let\Edeftypefun = \empty
+  \let\deftypeivar = \empty
+  \let\deftypeivarx = \empty
+  \let\Edeftypeivar = \empty
+  \let\deftypemethod = \empty
+  \let\deftypemethodx = \empty
+  \let\Edeftypemethod = \empty
+  \let\deftypeop = \empty
+  \let\deftypeopx = \empty
+  \let\Edeftypeop = \empty
+  \let\deftypevar = \empty
+  \let\deftypevarx = \empty
+  \let\Edeftypevar = \empty
+  \let\deftypevr = \empty
+  \let\deftypevrx = \empty
+  \let\Edeftypevr = \empty
+  \let\defun = \empty
+  \let\defunx = \empty
+  \let\Edefun = \empty
+  \let\defvar = \empty
+  \let\defvarx = \empty
+  \let\Edefvar = \empty
+  \let\defvr = \empty
+  \let\defvrx = \empty
+  \let\Edefvr = \empty
+  \let\clear = \relax
+  \let\down = \relax
+  \let\evenfooting = \relax
+  \let\evenheading = \relax
+  \let\everyfooting = \relax
+  \let\everyheading = \relax
+  \let\headings = \relax
+  \let\include = \relax
+  \let\item = \relax
+  \let\lowersections = \relax
+  \let\oddfooting = \relax
+  \let\oddheading = \relax
+  \let\printindex = \relax
+  \let\pxref = \relax
+  \let\raisesections = \relax
+  \let\ref = \relax
+  \let\set = \relax
+  \let\setchapternewpage = \relax
+  \let\setchapterstyle = \relax
+  \let\settitle = \relax
+  \let\up = \relax
+  \let\verbatiminclude = \relax
+  \let\xref = \relax
+}
+
+% Ignore @ignore, @ifhtml, @ifinfo, and the like.
+%
+\def\direntry{\doignore{direntry}}
+\def\documentdescriptionword{documentdescription}
+\def\documentdescription{\doignore{documentdescription}}
+\def\html{\doignore{html}}
+\def\ifhtml{\doignore{ifhtml}}
+\def\ifinfo{\doignore{ifinfo}}
+\def\ifnottex{\doignore{ifnottex}}
+\def\ifplaintext{\doignore{ifplaintext}}
+\def\ifxml{\doignore{ifxml}}
+\def\ignore{\doignore{ignore}}
+\def\menu{\doignore{menu}}
+\def\xml{\doignore{xml}}
+
+% @dircategory CATEGORY  -- specify a category of the dir file
+% which this file should belong to.  Ignore this in TeX.
+\let\dircategory = \comment
+
+% Ignore text until a line `@end #1'.
+%
+\def\doignore#1{\begingroup
+  % Don't complain about control sequences we have declared \outer.
+  \ignoresections
+  %
+  % Define a command to swallow text until we reach `@end #1'.
+  % This @ is a catcode 12 token (that is the normal catcode of @ in
+  % this texinfo.tex file).  We change the catcode of @ below to match.
+  \long\def\doignoretext##1@end #1{\enddoignore}%
+  %
+  % Make sure that spaces turn into tokens that match what \doignoretext wants.
+  \catcode\spaceChar = 10
+  %
+  % Ignore braces, too, so mismatched braces don't cause trouble.
+  \catcode`\{ = 9
+  \catcode`\} = 9
+  %
+  % We must not have @c interpreted as a control sequence.
+  \catcode`\@ = 12
+  %
+  \def\ignoreword{#1}%
+  \ifx\ignoreword\documentdescriptionword
+    % The c kludge breaks documentdescription, since
+    % `documentdescription' contains a `c'.  Means not everything will
+    % be ignored inside @documentdescription, but oh well...
+  \else
+    % Make the letter c a comment character so that the rest of the line
+    % will be ignored. This way, the document can have (for example)
+    %   @c @end ifinfo
+    % and the @end ifinfo will be properly ignored.
+    % (We've just changed @ to catcode 12.)
+    \catcode`\c = 14
+  \fi
+  %
+  % And now expand the command defined above.
+  \doignoretext
+}
+
+% What we do to finish off ignored text.
+%
+\def\enddoignore{\endgroup\ignorespaces}%
+
+\newif\ifwarnedobs\warnedobsfalse
+\def\obstexwarn{%
+  \ifwarnedobs\relax\else
+  % We need to warn folks that they may have trouble with TeX 3.0.
+  % This uses \immediate\write16 rather than \message to get newlines.
+    \immediate\write16{}
+    \immediate\write16{WARNING: for users of Unix TeX 3.0!}
+    \immediate\write16{This manual trips a bug in TeX version 3.0 (tex hangs).}
+    \immediate\write16{If you are running another version of TeX, relax.}
+    \immediate\write16{If you are running Unix TeX 3.0, kill this TeX process.}
+    \immediate\write16{  Then upgrade your TeX installation if you can.}
+    \immediate\write16{  (See ftp://ftp.gnu.org/non-gnu/TeX.README.)}
+    \immediate\write16{If you are stuck with version 3.0, run the}
+    \immediate\write16{  script ``tex3patch'' from the Texinfo distribution}
+    \immediate\write16{  to use a workaround.}
+    \immediate\write16{}
+    \global\warnedobstrue
+    \fi
+}
+
+% **In TeX 3.0, setting text in \nullfont hangs tex.  For a
+% workaround (which requires the file ``dummy.tfm'' to be installed),
+% uncomment the following line:
+%%%%%\font\nullfont=dummy\let\obstexwarn=\relax
+
+% Ignore text, except that we keep track of conditional commands for
+% purposes of nesting, up to an `@end #1' command.
+%
+\def\nestedignore#1{%
+  \obstexwarn
+  % We must actually expand the ignored text to look for the @end
+  % command, so that nested ignore constructs work.  Thus, we put the
+  % text into a \vbox and then do nothing with the result.  To minimize
+  % the chance of memory overflow, we follow the approach outlined on
+  % page 401 of the TeXbook.
+  %
+  \setbox0 = \vbox\bgroup
+    % Don't complain about control sequences we have declared \outer.
+    \ignoresections
+    %
+    % Define `@end #1' to end the box, which will in turn undefine the
+    % @end command again.
+    \expandafter\def\csname E#1\endcsname{\egroup\ignorespaces}%
+    %
+    % We are going to be parsing Texinfo commands.  Most cause no
+    % trouble when they are used incorrectly, but some commands do
+    % complicated argument parsing or otherwise get confused, so we
+    % undefine them.
+    %
+    % We can't do anything about stray @-signs, unfortunately;
+    % they'll produce `undefined control sequence' errors.
+    \ignoremorecommands
+    %
+    % Set the current font to be \nullfont, a TeX primitive, and define
+    % all the font commands to also use \nullfont.  We don't use
+    % dummy.tfm, as suggested in the TeXbook, because some sites
+    % might not have that installed.  Therefore, math mode will still
+    % produce output, but that should be an extremely small amount of
+    % stuff compared to the main input.
+    %
+    \nullfont
+    \let\tenrm=\nullfont \let\tenit=\nullfont \let\tensl=\nullfont
+    \let\tenbf=\nullfont \let\tentt=\nullfont \let\smallcaps=\nullfont
+    \let\tensf=\nullfont
+    % Similarly for index fonts.
+    \let\smallrm=\nullfont \let\smallit=\nullfont \let\smallsl=\nullfont
+    \let\smallbf=\nullfont \let\smalltt=\nullfont \let\smallsc=\nullfont
+    \let\smallsf=\nullfont
+    % Similarly for smallexample fonts.
+    \let\smallerrm=\nullfont \let\smallerit=\nullfont \let\smallersl=\nullfont
+    \let\smallerbf=\nullfont \let\smallertt=\nullfont \let\smallersc=\nullfont
+    \let\smallersf=\nullfont
+    %
+    % Don't complain when characters are missing from the fonts.
+    \tracinglostchars = 0
+    %
+    % Don't bother to do space factor calculations.
+    \frenchspacing
+    %
+    % Don't report underfull hboxes.
+    \hbadness = 10000
+    %
+    % Do minimal line-breaking.
+    \pretolerance = 10000
+    %
+    % Do not execute instructions in @tex.
+    \def\tex{\doignore{tex}}%
+    % Do not execute macro definitions.
+    % `c' is a comment character, so the word `macro' will get cut off.
+    \def\macro{\doignore{ma}}%
+}
+
+% @set VAR sets the variable VAR to an empty value.
+% @set VAR REST-OF-LINE sets VAR to the value REST-OF-LINE.
+%
+% Since we want to separate VAR from REST-OF-LINE (which might be
+% empty), we can't just use \parsearg; we have to insert a space of our
+% own to delimit the rest of the line, and then take it out again if we
+% didn't need it.  Make sure the catcode of space is correct to avoid
+% losing inside @example, for instance.
+%
+\def\set{\begingroup\catcode` =10
+  \catcode`\-=12 \catcode`\_=12 % Allow - and _ in VAR.
+  \parsearg\setxxx}
+\def\setxxx#1{\setyyy#1 \endsetyyy}
+\def\setyyy#1 #2\endsetyyy{%
+  \def\temp{#2}%
+  \ifx\temp\empty \global\expandafter\let\csname SET#1\endcsname = \empty
+  \else \setzzz{#1}#2\endsetzzz % Remove the trailing space \setxxx inserted.
+  \fi
+  \endgroup
+}
+% Can't use \xdef to pre-expand #2 and save some time, since \temp or
+% \next or other control sequences that we've defined might get us into
+% an infinite loop. Consider `@set foo @cite{bar}'.
+\def\setzzz#1#2 \endsetzzz{\expandafter\gdef\csname SET#1\endcsname{#2}}
+
+% @clear VAR clears (i.e., unsets) the variable VAR.
+%
+\def\clear{\parsearg\clearxxx}
+\def\clearxxx#1{\global\expandafter\let\csname SET#1\endcsname=\relax}
+
+% @value{foo} gets the text saved in variable foo.
+{
+  \catcode`\_ = \active
+  %
+  % We might end up with active _ or - characters in the argument if
+  % we're called from @code, as @code{@value{foo-bar_}}.  So \let any
+  % such active characters to their normal equivalents.
+  \gdef\value{\begingroup
+    \catcode`\-=\other \catcode`\_=\other
+    \indexbreaks \let_\normalunderscore
+    \valuexxx}
+}
+\def\valuexxx#1{\expandablevalue{#1}\endgroup}
+
+% We have this subroutine so that we can handle at least some @value's
+% properly in indexes (we \let\value to this in \indexdummies).  Ones
+% whose names contain - or _ still won't work, but we can't do anything
+% about that.  The command has to be fully expandable (if the variable
+% is set), since the result winds up in the index file.  This means that
+% if the variable's value contains other Texinfo commands, it's almost
+% certain it will fail (although perhaps we could fix that with
+% sufficient work to do a one-level expansion on the result, instead of
+% complete).
+%
+\def\expandablevalue#1{%
+  \expandafter\ifx\csname SET#1\endcsname\relax
+    {[No value for ``#1'']}%
+    \message{Variable `#1', used in @value, is not set.}%
+  \else
+    \csname SET#1\endcsname
+  \fi
+}
+
+% @ifset VAR ... @end ifset reads the `...' iff VAR has been defined
+% with @set.
+%
+\def\ifset{\parsearg\doifset}
+\def\doifset#1{%
+  \expandafter\ifx\csname SET#1\endcsname\relax
+    \let\next=\ifsetfail
+  \else
+    \let\next=\ifsetsucceed
+  \fi
+  \next
+}
+\def\ifsetsucceed{\conditionalsucceed{ifset}}
+\def\ifsetfail{\nestedignore{ifset}}
+\defineunmatchedend{ifset}
+
+% @ifclear VAR ... @end ifclear reads the `...' iff VAR has never been
+% defined with @set, or has been undefined with @clear.
+%
+\def\ifclear{\parsearg\doifclear}
+\def\doifclear#1{%
+  \expandafter\ifx\csname SET#1\endcsname\relax
+    \let\next=\ifclearsucceed
+  \else
+    \let\next=\ifclearfail
+  \fi
+  \next
+}
+\def\ifclearsucceed{\conditionalsucceed{ifclear}}
+\def\ifclearfail{\nestedignore{ifclear}}
+\defineunmatchedend{ifclear}
+
+% @iftex, @ifnothtml, @ifnotinfo, @ifnotplaintext always succeed; we
+% read the text following, through the first @end iftex (etc.).  Make
+% `@end iftex' (etc.) valid only after an @iftex.
+%
+\def\iftex{\conditionalsucceed{iftex}}
+\def\ifnothtml{\conditionalsucceed{ifnothtml}}
+\def\ifnotinfo{\conditionalsucceed{ifnotinfo}}
+\def\ifnotplaintext{\conditionalsucceed{ifnotplaintext}}
+\defineunmatchedend{iftex}
+\defineunmatchedend{ifnothtml}
+\defineunmatchedend{ifnotinfo}
+\defineunmatchedend{ifnotplaintext}
+
+% True conditional.  Since \set globally defines its variables, we can
+% just start and end a group (to keep the @end definition undefined at
+% the outer level).
+%
+\def\conditionalsucceed#1{\begingroup
+  \expandafter\def\csname E#1\endcsname{\endgroup}%
+}
+
+% @defininfoenclose.
+\let\definfoenclose=\comment
+
+
+\message{indexing,}
+% Index generation facilities
+
+% Define \newwrite to be identical to plain tex's \newwrite
+% except not \outer, so it can be used within \newindex.
+{\catcode`\@=11
+\gdef\newwrite{\alloc@7\write\chardef\sixt@@n}}
+
+% \newindex {foo} defines an index named foo.
+% It automatically defines \fooindex such that
+% \fooindex ...rest of line... puts an entry in the index foo.
+% It also defines \fooindfile to be the number of the output channel for
+% the file that accumulates this index.  The file's extension is foo.
+% The name of an index should be no more than 2 characters long
+% for the sake of vms.
+%
+\def\newindex#1{%
+  \iflinks
+    \expandafter\newwrite \csname#1indfile\endcsname
+    \openout \csname#1indfile\endcsname \jobname.#1 % Open the file
+  \fi
+  \expandafter\xdef\csname#1index\endcsname{%     % Define @#1index
+    \noexpand\doindex{#1}}
+}
+
+% @defindex foo  ==  \newindex{foo}
+%
+\def\defindex{\parsearg\newindex}
+
+% Define @defcodeindex, like @defindex except put all entries in @code.
+%
+\def\defcodeindex{\parsearg\newcodeindex}
+%
+\def\newcodeindex#1{%
+  \iflinks
+    \expandafter\newwrite \csname#1indfile\endcsname
+    \openout \csname#1indfile\endcsname \jobname.#1
+  \fi
+  \expandafter\xdef\csname#1index\endcsname{%
+    \noexpand\docodeindex{#1}}%
+}
+
+
+% @synindex foo bar    makes index foo feed into index bar.
+% Do this instead of @defindex foo if you don't want it as a separate index.
+% 
+% @syncodeindex foo bar   similar, but put all entries made for index foo
+% inside @code.
+% 
+\def\synindex#1 #2 {\dosynindex\doindex{#1}{#2}}
+\def\syncodeindex#1 #2 {\dosynindex\docodeindex{#1}{#2}}
+
+% #1 is \doindex or \docodeindex, #2 the index getting redefined (foo),
+% #3 the target index (bar).
+\def\dosynindex#1#2#3{%
+  % Only do \closeout if we haven't already done it, else we'll end up
+  % closing the target index.
+  \expandafter \ifx\csname donesynindex#2\endcsname \undefined
+    % The \closeout helps reduce unnecessary open files; the limit on the
+    % Acorn RISC OS is a mere 16 files.
+    \expandafter\closeout\csname#2indfile\endcsname
+    \expandafter\let\csname\donesynindex#2\endcsname = 1
+  \fi
+  % redefine \fooindfile:
+  \expandafter\let\expandafter\temp\expandafter=\csname#3indfile\endcsname
+  \expandafter\let\csname#2indfile\endcsname=\temp
+  % redefine \fooindex:
+  \expandafter\xdef\csname#2index\endcsname{\noexpand#1{#3}}%
+}
+
+% Define \doindex, the driver for all \fooindex macros.
+% Argument #1 is generated by the calling \fooindex macro,
+%  and it is "foo", the name of the index.
+
+% \doindex just uses \parsearg; it calls \doind for the actual work.
+% This is because \doind is more useful to call from other macros.
+
+% There is also \dosubind {index}{topic}{subtopic}
+% which makes an entry in a two-level index such as the operation index.
+
+\def\doindex#1{\edef\indexname{#1}\parsearg\singleindexer}
+\def\singleindexer #1{\doind{\indexname}{#1}}
+
+% like the previous two, but they put @code around the argument.
+\def\docodeindex#1{\edef\indexname{#1}\parsearg\singlecodeindexer}
+\def\singlecodeindexer #1{\doind{\indexname}{\code{#1}}}
+
+% Take care of Texinfo commands that can appear in an index entry.
+% Since there are some commands we want to expand, and others we don't,
+% we have to laboriously prevent expansion for those that we don't.
+% 
+\def\indexdummies{%
+  \def\@{@}% change to @@ when we switch to @ as escape char in index files.
+  \def\ {\realbackslash\space }%
+  % Need these in case \tex is in effect and \{ is a \delimiter again.
+  % But can't use \lbracecmd and \rbracecmd because texindex assumes
+  % braces and backslashes are used only as delimiters.  
+  \let\{ = \mylbrace
+  \let\} = \myrbrace
+  %
+  % \definedummyword defines \#1 as \realbackslash #1\space, thus
+  % effectively preventing its expansion.  This is used only for control
+  % words, not control letters, because the \space would be incorrect
+  % for control characters, but is needed to separate the control word
+  % from whatever follows.
+  % 
+  % For control letters, we have \definedummyletter, which omits the
+  % space.
+  % 
+  % These can be used both for control words that take an argument and
+  % those that do not.  If it is followed by {arg} in the input, then
+  % that will dutifully get written to the index (or wherever).
+  % 
+  \def\definedummyword##1{%
+    \expandafter\def\csname ##1\endcsname{\realbackslash ##1\space}%
+  }%
+  \def\definedummyletter##1{%
+    \expandafter\def\csname ##1\endcsname{\realbackslash ##1}%
+  }%
+  %
+  % Do the redefinitions.
+  \commondummies
+}
+
+% For the aux file, @ is the escape character.  So we want to redefine
+% everything using @ instead of \realbackslash.  When everything uses 
+% @, this will be simpler.
+% 
+\def\atdummies{%
+  \def\@{@@}%
+  \def\ {@ }%
+  \let\{ = \lbraceatcmd
+  \let\} = \rbraceatcmd
+  %
+  % (See comments in \indexdummies.)
+  \def\definedummyword##1{%
+    \expandafter\def\csname ##1\endcsname{@##1\space}%
+  }%
+  \def\definedummyletter##1{%
+    \expandafter\def\csname ##1\endcsname{@##1}%
+  }%
+  %
+  % Do the redefinitions.
+  \commondummies
+}
+
+% Called from \indexdummies and \atdummies.  \definedummyword and
+% \definedummyletter must be defined first.
+% 
+\def\commondummies{%
+  %
+  \normalturnoffactive
+  %
+  % Control letters and accents.
+  \definedummyletter{_}%
+  \definedummyletter{,}%
+  \definedummyletter{"}%
+  \definedummyletter{`}%
+  \definedummyletter{'}%
+  \definedummyletter{^}%
+  \definedummyletter{~}%
+  \definedummyletter{=}%
+  \definedummyword{u}%
+  \definedummyword{v}%
+  \definedummyword{H}%
+  \definedummyword{dotaccent}%
+  \definedummyword{ringaccent}%
+  \definedummyword{tieaccent}%
+  \definedummyword{ubaraccent}%
+  \definedummyword{udotaccent}%
+  \definedummyword{dotless}%
+  %
+  % Other non-English letters.
+  \definedummyword{AA}%
+  \definedummyword{AE}%
+  \definedummyword{L}%
+  \definedummyword{OE}%
+  \definedummyword{O}%
+  \definedummyword{aa}%
+  \definedummyword{ae}%
+  \definedummyword{l}%
+  \definedummyword{oe}%
+  \definedummyword{o}%
+  \definedummyword{ss}%
+  %
+  % Although these internal commands shouldn't show up, sometimes they do.
+  \definedummyword{bf}%
+  \definedummyword{gtr}%
+  \definedummyword{hat}%
+  \definedummyword{less}%
+  \definedummyword{sf}%
+  \definedummyword{sl}%
+  \definedummyword{tclose}%
+  \definedummyword{tt}%
+  %
+  % Texinfo font commands.
+  \definedummyword{b}%
+  \definedummyword{i}%
+  \definedummyword{r}%
+  \definedummyword{sc}%
+  \definedummyword{t}%
+  %
+  \definedummyword{TeX}%
+  \definedummyword{acronym}%
+  \definedummyword{cite}%
+  \definedummyword{code}%
+  \definedummyword{command}%
+  \definedummyword{dfn}%
+  \definedummyword{dots}%
+  \definedummyword{emph}%
+  \definedummyword{env}%
+  \definedummyword{file}%
+  \definedummyword{kbd}%
+  \definedummyword{key}%
+  \definedummyword{math}%
+  \definedummyword{option}%
+  \definedummyword{samp}%
+  \definedummyword{strong}%
+  \definedummyword{uref}%
+  \definedummyword{url}%
+  \definedummyword{var}%
+  \definedummyword{w}%
+  %
+  % Assorted special characters.
+  \definedummyword{bullet}%
+  \definedummyword{copyright}%
+  \definedummyword{dots}%
+  \definedummyword{enddots}%
+  \definedummyword{equiv}%
+  \definedummyword{error}%
+  \definedummyword{expansion}%
+  \definedummyword{minus}%
+  \definedummyword{pounds}%
+  \definedummyword{point}%
+  \definedummyword{print}%
+  \definedummyword{result}%
+  %
+  % Handle some cases of @value -- where the variable name does not
+  % contain - or _, and the value does not contain any
+  % (non-fully-expandable) commands.
+  \let\value = \expandablevalue
+  %
+  % Normal spaces, not active ones.
+  \unsepspaces
+  %
+  % No macro expansion.
+  \turnoffmacros
+}
+
+% If an index command is used in an @example environment, any spaces
+% therein should become regular spaces in the raw index file, not the
+% expansion of \tie (\leavevmode \penalty \@M \ ).
+{\obeyspaces
+ \gdef\unsepspaces{\obeyspaces\let =\space}}
+
+
+% \indexnofonts is used when outputting the strings to sort the index
+% by, and when constructing control sequence names.  It eliminates all
+% control sequences and just writes whatever the best ASCII sort string
+% would be for a given command (usually its argument).
+%
+\def\indexdummytex{TeX}
+\def\indexdummydots{...}
+%
+\def\indexnofonts{%
+  \def\ { }%
+  \def\@{@}%
+  % how to handle braces?
+  \def\_{\normalunderscore}%
+  %
+  \let\,=\asis
+  \let\"=\asis
+  \let\`=\asis
+  \let\'=\asis
+  \let\^=\asis
+  \let\~=\asis
+  \let\==\asis
+  \let\u=\asis
+  \let\v=\asis
+  \let\H=\asis
+  \let\dotaccent=\asis
+  \let\ringaccent=\asis
+  \let\tieaccent=\asis
+  \let\ubaraccent=\asis
+  \let\udotaccent=\asis
+  \let\dotless=\asis
+  %
+  % Other non-English letters.
+  \def\AA{AA}%
+  \def\AE{AE}%
+  \def\L{L}%
+  \def\OE{OE}%
+  \def\O{O}%
+  \def\aa{aa}%
+  \def\ae{ae}%
+  \def\l{l}%
+  \def\oe{oe}%
+  \def\o{o}%
+  \def\ss{ss}%
+  \def\exclamdown{!}%
+  \def\questiondown{?}%
+  %
+  % Don't no-op \tt, since it isn't a user-level command
+  % and is used in the definitions of the active chars like <, >, |, etc.
+  % Likewise with the other plain tex font commands.
+  %\let\tt=\asis
+  %
+  % Texinfo font commands.
+  \let\b=\asis
+  \let\i=\asis
+  \let\r=\asis
+  \let\sc=\asis
+  \let\t=\asis
+  %
+  \let\TeX=\indexdummytex
+  \let\acronym=\asis
+  \let\cite=\asis
+  \let\code=\asis
+  \let\command=\asis
+  \let\dfn=\asis
+  \let\dots=\indexdummydots
+  \let\emph=\asis
+  \let\env=\asis
+  \let\file=\asis
+  \let\kbd=\asis
+  \let\key=\asis
+  \let\math=\asis
+  \let\option=\asis
+  \let\samp=\asis
+  \let\strong=\asis
+  \let\uref=\asis
+  \let\url=\asis
+  \let\var=\asis
+  \let\w=\asis
+}
+
+\let\indexbackslash=0  %overridden during \printindex.
+\let\SETmarginindex=\relax % put index entries in margin (undocumented)?
+
+% For \ifx comparisons.
+\def\emptymacro{\empty}
+
+% Most index entries go through here, but \dosubind is the general case.
+%
+\def\doind#1#2{\dosubind{#1}{#2}\empty}
+
+% Workhorse for all \fooindexes.
+% #1 is name of index, #2 is stuff to put there, #3 is subentry --
+% \empty if called from \doind, as we usually are.  The main exception
+% is with defuns, which call us directly.
+%
+\def\dosubind#1#2#3{%
+  % Put the index entry in the margin if desired.
+  \ifx\SETmarginindex\relax\else
+    \insert\margin{\hbox{\vrule height8pt depth3pt width0pt #2}}%
+  \fi
+  {%
+    \count255=\lastpenalty
+    {%
+      \indexdummies % Must do this here, since \bf, etc expand at this stage
+      \escapechar=`\\
+      {%
+        \let\folio = 0% We will expand all macros now EXCEPT \folio.
+        \def\rawbackslashxx{\indexbackslash}% \indexbackslash isn't defined now
+        % so it will be output as is; and it will print as backslash.
+        %
+        % The main index entry text.
+        \toks0 = {#2}%
+        %
+        % If third arg is present, precede it with space in sort key.
+        \def\thirdarg{#3}%
+        \ifx\thirdarg\emptymacro \else
+           % If the third (subentry) arg is present, add it to the index
+           % line to write.
+          \toks0 = \expandafter{\the\toks0 \space #3}%
+        \fi
+        %
+        % Process the index entry with all font commands turned off, to
+        % get the string to sort by.
+        {\indexnofonts
+         \edef\temp{\the\toks0}% need full expansion
+         \xdef\indexsorttmp{\temp}%
+        }%
+        %
+        % Set up the complete index entry, with both the sort key and
+        % the original text, including any font commands.  We write
+        % three arguments to \entry to the .?? file (four in the
+        % subentry case), texindex reduces to two when writing the .??s
+        % sorted result.
+        \edef\temp{%
+          \write\csname#1indfile\endcsname{%
+            \realbackslash entry{\indexsorttmp}{\folio}{\the\toks0}}%
+        }%
+        %
+        % If a skip is the last thing on the list now, preserve it
+        % by backing up by \lastskip, doing the \write, then inserting
+        % the skip again.  Otherwise, the whatsit generated by the
+        % \write will make \lastskip zero.  The result is that sequences
+        % like this:
+        % @end defun
+        % @tindex whatever
+        % @defun ...
+        % will have extra space inserted, because the \medbreak in the
+        % start of the @defun won't see the skip inserted by the @end of
+        % the previous defun.
+        %
+        % But don't do any of this if we're not in vertical mode.  We
+        % don't want to do a \vskip and prematurely end a paragraph.
+        %
+        % Avoid page breaks due to these extra skips, too.
+        %
+        \iflinks
+          \ifvmode
+            \skip0 = \lastskip
+            \ifdim\lastskip = 0pt \else \nobreak\vskip-\skip0 \fi
+          \fi
+          %
+          \temp % do the write
+          %
+          \ifvmode \ifdim\skip0 = 0pt \else \nobreak\vskip\skip0 \fi \fi
+        \fi
+      }%
+    }%
+    \penalty\count255
+  }%
+}
+
+% The index entry written in the file actually looks like
+%  \entry {sortstring}{page}{topic}
+% or
+%  \entry {sortstring}{page}{topic}{subtopic}
+% The texindex program reads in these files and writes files
+% containing these kinds of lines:
+%  \initial {c}
+%     before the first topic whose initial is c
+%  \entry {topic}{pagelist}
+%     for a topic that is used without subtopics
+%  \primary {topic}
+%     for the beginning of a topic that is used with subtopics
+%  \secondary {subtopic}{pagelist}
+%     for each subtopic.
+
+% Define the user-accessible indexing commands
+% @findex, @vindex, @kindex, @cindex.
+
+\def\findex {\fnindex}
+\def\kindex {\kyindex}
+\def\cindex {\cpindex}
+\def\vindex {\vrindex}
+\def\tindex {\tpindex}
+\def\pindex {\pgindex}
+
+\def\cindexsub {\begingroup\obeylines\cindexsub}
+{\obeylines %
+\gdef\cindexsub "#1" #2^^M{\endgroup %
+\dosubind{cp}{#2}{#1}}}
+
+% Define the macros used in formatting output of the sorted index material.
+
+% @printindex causes a particular index (the ??s file) to get printed.
+% It does not print any chapter heading (usually an @unnumbered).
+%
+\def\printindex{\parsearg\doprintindex}
+\def\doprintindex#1{\begingroup
+  \dobreak \chapheadingskip{10000}%
+  %
+  \smallfonts \rm
+  \tolerance = 9500
+  \indexbreaks
+  %
+  % See if the index file exists and is nonempty.
+  % Change catcode of @ here so that if the index file contains
+  % \initial {@}
+  % as its first line, TeX doesn't complain about mismatched braces
+  % (because it thinks @} is a control sequence).
+  \catcode`\@ = 11
+  \openin 1 \jobname.#1s
+  \ifeof 1
+    % \enddoublecolumns gets confused if there is no text in the index,
+    % and it loses the chapter title and the aux file entries for the
+    % index.  The easiest way to prevent this problem is to make sure
+    % there is some text.
+    \putwordIndexNonexistent
+  \else
+    %
+    % If the index file exists but is empty, then \openin leaves \ifeof
+    % false.  We have to make TeX try to read something from the file, so
+    % it can discover if there is anything in it.
+    \read 1 to \temp
+    \ifeof 1
+      \putwordIndexIsEmpty
+    \else
+      % Index files are almost Texinfo source, but we use \ as the escape
+      % character.  It would be better to use @, but that's too big a change
+      % to make right now.
+      \def\indexbackslash{\rawbackslashxx}%
+      \catcode`\\ = 0
+      \escapechar = `\\
+      \begindoublecolumns
+      \input \jobname.#1s
+      \enddoublecolumns
+    \fi
+  \fi
+  \closein 1
+\endgroup}
+
+% These macros are used by the sorted index file itself.
+% Change them to control the appearance of the index.
+
+\def\initial#1{{%
+  % Some minor font changes for the special characters.
+  \let\tentt=\sectt \let\tt=\sectt \let\sf=\sectt
+  %
+  % Remove any glue we may have, we'll be inserting our own.
+  \removelastskip
+  %
+  % We like breaks before the index initials, so insert a bonus.
+  \penalty -300
+  %
+  % Typeset the initial.  Making this add up to a whole number of
+  % baselineskips increases the chance of the dots lining up from column
+  % to column.  It still won't often be perfect, because of the stretch
+  % we need before each entry, but it's better.
+  %
+  % No shrink because it confuses \balancecolumns.
+  \vskip 1.67\baselineskip plus .5\baselineskip
+  \leftline{\secbf #1}%
+  \vskip .33\baselineskip plus .1\baselineskip
+  %
+  % Do our best not to break after the initial.
+  \nobreak
+}}
+
+% This typesets a paragraph consisting of #1, dot leaders, and then #2
+% flush to the right margin.  It is used for index and table of contents
+% entries.  The paragraph is indented by \leftskip.
+%
+\def\entry#1#2{\begingroup
+  %
+  % Start a new paragraph if necessary, so our assignments below can't
+  % affect previous text.
+  \par
+  %
+  % Do not fill out the last line with white space.
+  \parfillskip = 0in
+  %
+  % No extra space above this paragraph.
+  \parskip = 0in
+  %
+  % Do not prefer a separate line ending with a hyphen to fewer lines.
+  \finalhyphendemerits = 0
+  %
+  % \hangindent is only relevant when the entry text and page number
+  % don't both fit on one line.  In that case, bob suggests starting the
+  % dots pretty far over on the line.  Unfortunately, a large
+  % indentation looks wrong when the entry text itself is broken across
+  % lines.  So we use a small indentation and put up with long leaders.
+  %
+  % \hangafter is reset to 1 (which is the value we want) at the start
+  % of each paragraph, so we need not do anything with that.
+  \hangindent = 2em
+  %
+  % When the entry text needs to be broken, just fill out the first line
+  % with blank space.
+  \rightskip = 0pt plus1fil
+  %
+  % A bit of stretch before each entry for the benefit of balancing columns.
+  \vskip 0pt plus1pt
+  %
+  % Start a ``paragraph'' for the index entry so the line breaking
+  % parameters we've set above will have an effect.
+  \noindent
+  %
+  % Insert the text of the index entry.  TeX will do line-breaking on it.
+  #1%
+  % The following is kludged to not output a line of dots in the index if
+  % there are no page numbers.  The next person who breaks this will be
+  % cursed by a Unix daemon.
+  \def\tempa{{\rm }}%
+  \def\tempb{#2}%
+  \edef\tempc{\tempa}%
+  \edef\tempd{\tempb}%
+  \ifx\tempc\tempd\ \else%
+    %
+    % If we must, put the page number on a line of its own, and fill out
+    % this line with blank space.  (The \hfil is overwhelmed with the
+    % fill leaders glue in \indexdotfill if the page number does fit.)
+    \hfil\penalty50
+    \null\nobreak\indexdotfill % Have leaders before the page number.
+    %
+    % The `\ ' here is removed by the implicit \unskip that TeX does as
+    % part of (the primitive) \par.  Without it, a spurious underfull
+    % \hbox ensues.
+    \ifpdf
+      \pdfgettoks#2.\ \the\toksA % The page number ends the paragraph.
+    \else
+      \ #2% The page number ends the paragraph.
+    \fi
+  \fi%
+  \par
+\endgroup}
+
+% Like \dotfill except takes at least 1 em.
+\def\indexdotfill{\cleaders
+  \hbox{$\mathsurround=0pt \mkern1.5mu ${\it .}$ \mkern1.5mu$}\hskip 1em plus 1fill}
+
+\def\primary #1{\line{#1\hfil}}
+
+\newskip\secondaryindent \secondaryindent=0.5cm
+\def\secondary#1#2{{%
+  \parfillskip=0in
+  \parskip=0in
+  \hangindent=1in
+  \hangafter=1
+  \noindent\hskip\secondaryindent\hbox{#1}\indexdotfill
+  \ifpdf
+    \pdfgettoks#2.\ \the\toksA % The page number ends the paragraph.
+  \else
+    #2
+  \fi
+  \par
+}}
+
+% Define two-column mode, which we use to typeset indexes.
+% Adapted from the TeXbook, page 416, which is to say,
+% the manmac.tex format used to print the TeXbook itself.
+\catcode`\@=11
+
+\newbox\partialpage
+\newdimen\doublecolumnhsize
+
+\def\begindoublecolumns{\begingroup % ended by \enddoublecolumns
+  % Grab any single-column material above us.
+  \output = {%
+    %
+    % Here is a possibility not foreseen in manmac: if we accumulate a
+    % whole lot of material, we might end up calling this \output
+    % routine twice in a row (see the doublecol-lose test, which is
+    % essentially a couple of indexes with @setchapternewpage off).  In
+    % that case we just ship out what is in \partialpage with the normal
+    % output routine.  Generally, \partialpage will be empty when this
+    % runs and this will be a no-op.  See the indexspread.tex test case.
+    \ifvoid\partialpage \else
+      \onepageout{\pagecontents\partialpage}%
+    \fi
+    %
+    \global\setbox\partialpage = \vbox{%
+      % Unvbox the main output page.
+      \unvbox\PAGE
+      \kern-\topskip \kern\baselineskip
+    }%
+  }%
+  \eject % run that output routine to set \partialpage
+  %
+  % Use the double-column output routine for subsequent pages.
+  \output = {\doublecolumnout}%
+  %
+  % Change the page size parameters.  We could do this once outside this
+  % routine, in each of @smallbook, @afourpaper, and the default 8.5x11
+  % format, but then we repeat the same computation.  Repeating a couple
+  % of assignments once per index is clearly meaningless for the
+  % execution time, so we may as well do it in one place.
+  %
+  % First we halve the line length, less a little for the gutter between
+  % the columns.  We compute the gutter based on the line length, so it
+  % changes automatically with the paper format.  The magic constant
+  % below is chosen so that the gutter has the same value (well, +-<1pt)
+  % as it did when we hard-coded it.
+  %
+  % We put the result in a separate register, \doublecolumhsize, so we
+  % can restore it in \pagesofar, after \hsize itself has (potentially)
+  % been clobbered.
+  %
+  \doublecolumnhsize = \hsize
+    \advance\doublecolumnhsize by -.04154\hsize
+    \divide\doublecolumnhsize by 2
+  \hsize = \doublecolumnhsize
+  %
+  % Double the \vsize as well.  (We don't need a separate register here,
+  % since nobody clobbers \vsize.)
+  \vsize = 2\vsize
+}
+
+% The double-column output routine for all double-column pages except
+% the last.
+%
+\def\doublecolumnout{%
+  \splittopskip=\topskip \splitmaxdepth=\maxdepth
+  % Get the available space for the double columns -- the normal
+  % (undoubled) page height minus any material left over from the
+  % previous page.
+  \dimen@ = \vsize
+  \divide\dimen@ by 2
+  \advance\dimen@ by -\ht\partialpage
+  %
+  % box0 will be the left-hand column, box2 the right.
+  \setbox0=\vsplit255 to\dimen@ \setbox2=\vsplit255 to\dimen@
+  \onepageout\pagesofar
+  \unvbox255
+  \penalty\outputpenalty
+}
+%
+% Re-output the contents of the output page -- any previous material,
+% followed by the two boxes we just split, in box0 and box2.
+\def\pagesofar{%
+  \unvbox\partialpage
+  %
+  \hsize = \doublecolumnhsize
+  \wd0=\hsize \wd2=\hsize
+  \hbox to\pagewidth{\box0\hfil\box2}%
+}
+% 
+% All done with double columns.
+\def\enddoublecolumns{%
+  \output = {%
+    % Split the last of the double-column material.  Leave it on the
+    % current page, no automatic page break.
+    \balancecolumns
+    %
+    % If we end up splitting too much material for the current page,
+    % though, there will be another page break right after this \output
+    % invocation ends.  Having called \balancecolumns once, we do not
+    % want to call it again.  Therefore, reset \output to its normal
+    % definition right away.  (We hope \balancecolumns will never be
+    % called on to balance too much material, but if it is, this makes
+    % the output somewhat more palatable.)
+    \global\output = {\onepageout{\pagecontents\PAGE}}%
+  }%
+  \eject
+  \endgroup % started in \begindoublecolumns
+  %
+  % \pagegoal was set to the doubled \vsize above, since we restarted
+  % the current page.  We're now back to normal single-column
+  % typesetting, so reset \pagegoal to the normal \vsize (after the
+  % \endgroup where \vsize got restored).
+  \pagegoal = \vsize
+}
+%
+% Called at the end of the double column material.
+\def\balancecolumns{%
+  \setbox0 = \vbox{\unvbox255}% like \box255 but more efficient, see p.120.
+  \dimen@ = \ht0
+  \advance\dimen@ by \topskip
+  \advance\dimen@ by-\baselineskip
+  \divide\dimen@ by 2 % target to split to
+  %debug\message{final 2-column material height=\the\ht0, target=\the\dimen@.}%
+  \splittopskip = \topskip
+  % Loop until we get a decent breakpoint.
+  {%
+    \vbadness = 10000
+    \loop
+      \global\setbox3 = \copy0
+      \global\setbox1 = \vsplit3 to \dimen@
+    \ifdim\ht3>\dimen@
+      \global\advance\dimen@ by 1pt
+    \repeat
+  }%
+  %debug\message{split to \the\dimen@, column heights: \the\ht1, \the\ht3.}%
+  \setbox0=\vbox to\dimen@{\unvbox1}%
+  \setbox2=\vbox to\dimen@{\unvbox3}%
+  %
+  \pagesofar
+}
+\catcode`\@ = \other
+
+
+\message{sectioning,}
+% Chapters, sections, etc.
+
+\newcount\chapno
+\newcount\secno        \secno=0
+\newcount\subsecno     \subsecno=0
+\newcount\subsubsecno  \subsubsecno=0
+
+% This counter is funny since it counts through charcodes of letters A, B, ...
+\newcount\appendixno  \appendixno = `\@
+% \def\appendixletter{\char\the\appendixno}
+% We do the following for the sake of pdftex, which needs the actual
+% letter in the expansion, not just typeset.
+\def\appendixletter{%
+  \ifnum\appendixno=`A A%
+  \else\ifnum\appendixno=`B B%
+  \else\ifnum\appendixno=`C C%
+  \else\ifnum\appendixno=`D D%
+  \else\ifnum\appendixno=`E E%
+  \else\ifnum\appendixno=`F F%
+  \else\ifnum\appendixno=`G G%
+  \else\ifnum\appendixno=`H H%
+  \else\ifnum\appendixno=`I I%
+  \else\ifnum\appendixno=`J J%
+  \else\ifnum\appendixno=`K K%
+  \else\ifnum\appendixno=`L L%
+  \else\ifnum\appendixno=`M M%
+  \else\ifnum\appendixno=`N N%
+  \else\ifnum\appendixno=`O O%
+  \else\ifnum\appendixno=`P P%
+  \else\ifnum\appendixno=`Q Q%
+  \else\ifnum\appendixno=`R R%
+  \else\ifnum\appendixno=`S S%
+  \else\ifnum\appendixno=`T T%
+  \else\ifnum\appendixno=`U U%
+  \else\ifnum\appendixno=`V V%
+  \else\ifnum\appendixno=`W W%
+  \else\ifnum\appendixno=`X X%
+  \else\ifnum\appendixno=`Y Y%
+  \else\ifnum\appendixno=`Z Z%
+  % The \the is necessary, despite appearances, because \appendixletter is
+  % expanded while writing the .toc file.  \char\appendixno is not
+  % expandable, thus it is written literally, thus all appendixes come out
+  % with the same letter (or @) in the toc without it.
+  \else\char\the\appendixno
+  \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi
+  \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi}
+
+% Each @chapter defines this as the name of the chapter.
+% page headings and footings can use it.  @section does likewise.
+\def\thischapter{}
+\def\thissection{}
+
+\newcount\absseclevel % used to calculate proper heading level
+\newcount\secbase\secbase=0 % @raise/lowersections modify this count
+
+% @raisesections: treat @section as chapter, @subsection as section, etc.
+\def\raisesections{\global\advance\secbase by -1}
+\let\up=\raisesections % original BFox name
+
+% @lowersections: treat @chapter as section, @section as subsection, etc.
+\def\lowersections{\global\advance\secbase by 1}
+\let\down=\lowersections % original BFox name
+
+% Choose a numbered-heading macro
+% #1 is heading level if unmodified by @raisesections or @lowersections
+% #2 is text for heading
+\def\numhead#1#2{\absseclevel=\secbase\advance\absseclevel by #1
+\ifcase\absseclevel
+  \chapterzzz{#2}
+\or
+  \seczzz{#2}
+\or
+  \numberedsubseczzz{#2}
+\or
+  \numberedsubsubseczzz{#2}
+\else
+  \ifnum \absseclevel<0
+    \chapterzzz{#2}
+  \else
+    \numberedsubsubseczzz{#2}
+  \fi
+\fi
+}
+
+% like \numhead, but chooses appendix heading levels
+\def\apphead#1#2{\absseclevel=\secbase\advance\absseclevel by #1
+\ifcase\absseclevel
+  \appendixzzz{#2}
+\or
+  \appendixsectionzzz{#2}
+\or
+  \appendixsubseczzz{#2}
+\or
+  \appendixsubsubseczzz{#2}
+\else
+  \ifnum \absseclevel<0
+    \appendixzzz{#2}
+  \else
+    \appendixsubsubseczzz{#2}
+  \fi
+\fi
+}
+
+% like \numhead, but chooses numberless heading levels
+\def\unnmhead#1#2{\absseclevel=\secbase\advance\absseclevel by #1
+\ifcase\absseclevel
+  \unnumberedzzz{#2}
+\or
+  \unnumberedseczzz{#2}
+\or
+  \unnumberedsubseczzz{#2}
+\or
+  \unnumberedsubsubseczzz{#2}
+\else
+  \ifnum \absseclevel<0
+    \unnumberedzzz{#2}
+  \else
+    \unnumberedsubsubseczzz{#2}
+  \fi
+\fi
+}
+
+% @chapter, @appendix, @unnumbered.
+\def\thischaptername{No Chapter Title}
+\outer\def\chapter{\parsearg\chapteryyy}
+\def\chapteryyy #1{\numhead0{#1}} % normally numhead0 calls chapterzzz
+\def\chapterzzz #1{%
+  \secno=0 \subsecno=0 \subsubsecno=0
+  \global\advance \chapno by 1 \message{\putwordChapter\space \the\chapno}%
+  \chapmacro {#1}{\the\chapno}%
+  \gdef\thissection{#1}%
+  \gdef\thischaptername{#1}%
+  % We don't substitute the actual chapter name into \thischapter
+  % because we don't want its macros evaluated now.
+  \xdef\thischapter{\putwordChapter{} \the\chapno: \noexpand\thischaptername}%
+  \writetocentry{chap}{#1}{{\the\chapno}}
+  \donoderef
+  \global\let\section = \numberedsec
+  \global\let\subsection = \numberedsubsec
+  \global\let\subsubsection = \numberedsubsubsec
+}
+
+% we use \chapno to avoid indenting back
+\def\appendixbox#1{%
+  \setbox0 = \hbox{\putwordAppendix{} \the\chapno}%
+  \hbox to \wd0{#1\hss}}
+
+\outer\def\appendix{\parsearg\appendixyyy}
+\def\appendixyyy #1{\apphead0{#1}} % normally apphead0 calls appendixzzz
+\def\appendixzzz #1{%
+  \secno=0 \subsecno=0 \subsubsecno=0
+  \global\advance \appendixno by 1
+  \message{\putwordAppendix\space \appendixletter}%
+  \chapmacro {#1}{\appendixbox{\putwordAppendix{} \appendixletter}}%
+  \gdef\thissection{#1}%
+  \gdef\thischaptername{#1}%
+  \xdef\thischapter{\putwordAppendix{} \appendixletter: \noexpand\thischaptername}%
+  \writetocentry{appendix}{#1}{{\appendixletter}}
+  \appendixnoderef
+  \global\let\section = \appendixsec
+  \global\let\subsection = \appendixsubsec
+  \global\let\subsubsection = \appendixsubsubsec
+}
+
+% @centerchap is like @unnumbered, but the heading is centered.
+\outer\def\centerchap{\parsearg\centerchapyyy}
+\def\centerchapyyy #1{{\let\unnumbchapmacro=\centerchapmacro \unnumberedyyy{#1}}}
+
+% @top is like @unnumbered.
+\outer\def\top{\parsearg\unnumberedyyy}
+
+\outer\def\unnumbered{\parsearg\unnumberedyyy}
+\def\unnumberedyyy #1{\unnmhead0{#1}} % normally unnmhead0 calls unnumberedzzz
+\def\unnumberedzzz #1{%
+  \secno=0 \subsecno=0 \subsubsecno=0
+  %
+  % This used to be simply \message{#1}, but TeX fully expands the
+  % argument to \message.  Therefore, if #1 contained @-commands, TeX
+  % expanded them.  For example, in `@unnumbered The @cite{Book}', TeX
+  % expanded @cite (which turns out to cause errors because \cite is meant
+  % to be executed, not expanded).
+  %
+  % Anyway, we don't want the fully-expanded definition of @cite to appear
+  % as a result of the \message, we just want `@cite' itself.  We use
+  % \the<toks register> to achieve this: TeX expands \the<toks> only once,
+  % simply yielding the contents of <toks register>.  (We also do this for
+  % the toc entries.)
+  \toks0 = {#1}\message{(\the\toks0)}%
+  %
+  \unnumbchapmacro {#1}%
+  \gdef\thischapter{#1}\gdef\thissection{#1}%
+  \writetocentry{unnumbchap}{#1}{{\the\chapno}}
+  \unnumbnoderef
+  \global\let\section = \unnumberedsec
+  \global\let\subsection = \unnumberedsubsec
+  \global\let\subsubsection = \unnumberedsubsubsec
+}
+
+% Sections.
+\outer\def\numberedsec{\parsearg\secyyy}
+\def\secyyy #1{\numhead1{#1}} % normally calls seczzz
+\def\seczzz #1{%
+  \subsecno=0 \subsubsecno=0 \global\advance \secno by 1 %
+  \gdef\thissection{#1}\secheading {#1}{\the\chapno}{\the\secno}%
+  \writetocentry{sec}{#1}{{\the\chapno}{\the\secno}}
+  \donoderef
+  \nobreak
+}
+
+\outer\def\appendixsection{\parsearg\appendixsecyyy}
+\outer\def\appendixsec{\parsearg\appendixsecyyy}
+\def\appendixsecyyy #1{\apphead1{#1}} % normally calls appendixsectionzzz
+\def\appendixsectionzzz #1{%
+  \subsecno=0 \subsubsecno=0 \global\advance \secno by 1 %
+  \gdef\thissection{#1}\secheading {#1}{\appendixletter}{\the\secno}%
+  \writetocentry{sec}{#1}{{\appendixletter}{\the\secno}}
+  \appendixnoderef
+  \nobreak
+}
+
+\outer\def\unnumberedsec{\parsearg\unnumberedsecyyy}
+\def\unnumberedsecyyy #1{\unnmhead1{#1}} % normally calls unnumberedseczzz
+\def\unnumberedseczzz #1{%
+  \plainsecheading {#1}\gdef\thissection{#1}%
+  \writetocentry{unnumbsec}{#1}{{\the\chapno}{\the\secno}}
+  \unnumbnoderef
+  \nobreak
+}
+
+% Subsections.
+\outer\def\numberedsubsec{\parsearg\numberedsubsecyyy}
+\def\numberedsubsecyyy #1{\numhead2{#1}} % normally calls numberedsubseczzz
+\def\numberedsubseczzz #1{%
+  \gdef\thissection{#1}\subsubsecno=0 \global\advance \subsecno by 1 %
+  \subsecheading {#1}{\the\chapno}{\the\secno}{\the\subsecno}%
+  \writetocentry{subsec}{#1}{{\the\chapno}{\the\secno}{\the\subsecno}}
+  \donoderef
+  \nobreak
+}
+
+\outer\def\appendixsubsec{\parsearg\appendixsubsecyyy}
+\def\appendixsubsecyyy #1{\apphead2{#1}} % normally calls appendixsubseczzz
+\def\appendixsubseczzz #1{%
+  \gdef\thissection{#1}\subsubsecno=0 \global\advance \subsecno by 1 %
+  \subsecheading {#1}{\appendixletter}{\the\secno}{\the\subsecno}%
+  \writetocentry{subsec}{#1}{{\appendixletter}{\the\secno}{\the\subsecno}}
+  \appendixnoderef
+  \nobreak
+}
+
+\outer\def\unnumberedsubsec{\parsearg\unnumberedsubsecyyy}
+\def\unnumberedsubsecyyy #1{\unnmhead2{#1}} %normally calls unnumberedsubseczzz
+\def\unnumberedsubseczzz #1{%
+  \plainsubsecheading {#1}\gdef\thissection{#1}%
+  \writetocentry{unnumbsubsec}{#1}{{\the\chapno}{\the\secno}{\the\subsecno}}
+  \unnumbnoderef
+  \nobreak
+}
+
+% Subsubsections.
+\outer\def\numberedsubsubsec{\parsearg\numberedsubsubsecyyy}
+\def\numberedsubsubsecyyy #1{\numhead3{#1}} % normally numberedsubsubseczzz
+\def\numberedsubsubseczzz #1{%
+  \gdef\thissection{#1}\global\advance \subsubsecno by 1 %
+  \subsubsecheading {#1}
+    {\the\chapno}{\the\secno}{\the\subsecno}{\the\subsubsecno}%
+  \writetocentry{subsubsec}{#1}{{\the\chapno}{\the\secno}{\the\subsecno}{\the\subsubsecno}}
+  \donoderef
+  \nobreak
+}
+
+\outer\def\appendixsubsubsec{\parsearg\appendixsubsubsecyyy}
+\def\appendixsubsubsecyyy #1{\apphead3{#1}} % normally appendixsubsubseczzz
+\def\appendixsubsubseczzz #1{%
+  \gdef\thissection{#1}\global\advance \subsubsecno by 1 %
+  \subsubsecheading {#1}
+    {\appendixletter}{\the\secno}{\the\subsecno}{\the\subsubsecno}%
+  \writetocentry{subsubsec}{#1}{{\appendixletter}{\the\secno}{\the\subsecno}{\the\subsubsecno}}
+  \appendixnoderef
+  \nobreak
+}
+
+\outer\def\unnumberedsubsubsec{\parsearg\unnumberedsubsubsecyyy}
+\def\unnumberedsubsubsecyyy #1{\unnmhead3{#1}} %normally unnumberedsubsubseczzz
+\def\unnumberedsubsubseczzz #1{%
+  \plainsubsubsecheading {#1}\gdef\thissection{#1}%
+  \writetocentry{unnumbsubsubsec}{#1}{{\the\chapno}{\the\secno}{\the\subsecno}{\the\subsubsecno}}
+  \unnumbnoderef
+  \nobreak
+}
+
+% These are variants which are not "outer", so they can appear in @ifinfo.
+% Actually, they should now be obsolete; ordinary section commands should work.
+\def\infotop{\parsearg\unnumberedzzz}
+\def\infounnumbered{\parsearg\unnumberedzzz}
+\def\infounnumberedsec{\parsearg\unnumberedseczzz}
+\def\infounnumberedsubsec{\parsearg\unnumberedsubseczzz}
+\def\infounnumberedsubsubsec{\parsearg\unnumberedsubsubseczzz}
+
+\def\infoappendix{\parsearg\appendixzzz}
+\def\infoappendixsec{\parsearg\appendixseczzz}
+\def\infoappendixsubsec{\parsearg\appendixsubseczzz}
+\def\infoappendixsubsubsec{\parsearg\appendixsubsubseczzz}
+
+\def\infochapter{\parsearg\chapterzzz}
+\def\infosection{\parsearg\sectionzzz}
+\def\infosubsection{\parsearg\subsectionzzz}
+\def\infosubsubsection{\parsearg\subsubsectionzzz}
+
+% These macros control what the section commands do, according
+% to what kind of chapter we are in (ordinary, appendix, or unnumbered).
+% Define them by default for a numbered chapter.
+\global\let\section = \numberedsec
+\global\let\subsection = \numberedsubsec
+\global\let\subsubsection = \numberedsubsubsec
+
+% Define @majorheading, @heading and @subheading
+
+% NOTE on use of \vbox for chapter headings, section headings, and such:
+%       1) We use \vbox rather than the earlier \line to permit
+%          overlong headings to fold.
+%       2) \hyphenpenalty is set to 10000 because hyphenation in a
+%          heading is obnoxious; this forbids it.
+%       3) Likewise, headings look best if no \parindent is used, and
+%          if justification is not attempted.  Hence \raggedright.
+
+
+\def\majorheading{\parsearg\majorheadingzzz}
+\def\majorheadingzzz #1{%
+  {\advance\chapheadingskip by 10pt \chapbreak }%
+  {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000
+                    \parindent=0pt\raggedright
+                    \rm #1\hfill}}\bigskip \par\penalty 200}
+
+\def\chapheading{\parsearg\chapheadingzzz}
+\def\chapheadingzzz #1{\chapbreak %
+  {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000
+                    \parindent=0pt\raggedright
+                    \rm #1\hfill}}\bigskip \par\penalty 200}
+
+% @heading, @subheading, @subsubheading.
+\def\heading{\parsearg\plainsecheading}
+\def\subheading{\parsearg\plainsubsecheading}
+\def\subsubheading{\parsearg\plainsubsubsecheading}
+
+% These macros generate a chapter, section, etc. heading only
+% (including whitespace, linebreaking, etc. around it),
+% given all the information in convenient, parsed form.
+
+%%% Args are the skip and penalty (usually negative)
+\def\dobreak#1#2{\par\ifdim\lastskip<#1\removelastskip\penalty#2\vskip#1\fi}
+
+\def\setchapterstyle #1 {\csname CHAPF#1\endcsname}
+
+%%% Define plain chapter starts, and page on/off switching for it
+% Parameter controlling skip before chapter headings (if needed)
+
+\newskip\chapheadingskip
+
+\def\chapbreak{\dobreak \chapheadingskip {-4000}}
+\def\chappager{\par\vfill\supereject}
+\def\chapoddpage{\chappager \ifodd\pageno \else \hbox to 0pt{} \chappager\fi}
+
+\def\setchapternewpage #1 {\csname CHAPPAG#1\endcsname}
+
+\def\CHAPPAGoff{%
+\global\let\contentsalignmacro = \chappager
+\global\let\pchapsepmacro=\chapbreak
+\global\let\pagealignmacro=\chappager}
+
+\def\CHAPPAGon{%
+\global\let\contentsalignmacro = \chappager
+\global\let\pchapsepmacro=\chappager
+\global\let\pagealignmacro=\chappager
+\global\def\HEADINGSon{\HEADINGSsingle}}
+
+\def\CHAPPAGodd{
+\global\let\contentsalignmacro = \chapoddpage
+\global\let\pchapsepmacro=\chapoddpage
+\global\let\pagealignmacro=\chapoddpage
+\global\def\HEADINGSon{\HEADINGSdouble}}
+
+\CHAPPAGon
+
+\def\CHAPFplain{
+\global\let\chapmacro=\chfplain
+\global\let\unnumbchapmacro=\unnchfplain
+\global\let\centerchapmacro=\centerchfplain}
+
+% Plain chapter opening.
+% #1 is the text, #2 the chapter number or empty if unnumbered.
+\def\chfplain#1#2{%
+  \pchapsepmacro
+  {%
+    \chapfonts \rm
+    \def\chapnum{#2}%
+    \setbox0 = \hbox{#2\ifx\chapnum\empty\else\enspace\fi}%
+    \vbox{\hyphenpenalty=10000 \tolerance=5000 \parindent=0pt \raggedright
+          \hangindent = \wd0 \centerparametersmaybe
+          \unhbox0 #1\par}%
+  }%
+  \nobreak\bigskip % no page break after a chapter title
+  \nobreak
+}
+
+% Plain opening for unnumbered.
+\def\unnchfplain#1{\chfplain{#1}{}}
+
+% @centerchap -- centered and unnumbered.
+\let\centerparametersmaybe = \relax
+\def\centerchfplain#1{{%
+  \def\centerparametersmaybe{%
+    \advance\rightskip by 3\rightskip
+    \leftskip = \rightskip
+    \parfillskip = 0pt
+  }%
+  \chfplain{#1}{}%
+}}
+
+\CHAPFplain % The default
+
+\def\unnchfopen #1{%
+\chapoddpage {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000
+                       \parindent=0pt\raggedright
+                       \rm #1\hfill}}\bigskip \par\nobreak
+}
+
+\def\chfopen #1#2{\chapoddpage {\chapfonts
+\vbox to 3in{\vfil \hbox to\hsize{\hfil #2} \hbox to\hsize{\hfil #1} \vfil}}%
+\par\penalty 5000 %
+}
+
+\def\centerchfopen #1{%
+\chapoddpage {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000
+                       \parindent=0pt
+                       \hfill {\rm #1}\hfill}}\bigskip \par\nobreak
+}
+
+\def\CHAPFopen{
+\global\let\chapmacro=\chfopen
+\global\let\unnumbchapmacro=\unnchfopen
+\global\let\centerchapmacro=\centerchfopen}
+
+
+% Section titles.
+\newskip\secheadingskip
+\def\secheadingbreak{\dobreak \secheadingskip {-1000}}
+\def\secheading#1#2#3{\sectionheading{sec}{#2.#3}{#1}}
+\def\plainsecheading#1{\sectionheading{sec}{}{#1}}
+
+% Subsection titles.
+\newskip \subsecheadingskip
+\def\subsecheadingbreak{\dobreak \subsecheadingskip {-500}}
+\def\subsecheading#1#2#3#4{\sectionheading{subsec}{#2.#3.#4}{#1}}
+\def\plainsubsecheading#1{\sectionheading{subsec}{}{#1}}
+
+% Subsubsection titles.
+\let\subsubsecheadingskip = \subsecheadingskip
+\let\subsubsecheadingbreak = \subsecheadingbreak
+\def\subsubsecheading#1#2#3#4#5{\sectionheading{subsubsec}{#2.#3.#4.#5}{#1}}
+\def\plainsubsubsecheading#1{\sectionheading{subsubsec}{}{#1}}
+
+
+% Print any size section title.
+%
+% #1 is the section type (sec/subsec/subsubsec), #2 is the section
+% number (maybe empty), #3 the text.
+\def\sectionheading#1#2#3{%
+  {%
+    \expandafter\advance\csname #1headingskip\endcsname by \parskip
+    \csname #1headingbreak\endcsname
+  }%
+  {%
+    % Switch to the right set of fonts.
+    \csname #1fonts\endcsname \rm
+    %
+    % Only insert the separating space if we have a section number.
+    \def\secnum{#2}%
+    \setbox0 = \hbox{#2\ifx\secnum\empty\else\enspace\fi}%
+    %
+    \vbox{\hyphenpenalty=10000 \tolerance=5000 \parindent=0pt \raggedright
+          \hangindent = \wd0 % zero if no section number
+          \unhbox0 #3}%
+  }%
+  % Add extra space after the heading -- either a line space or a
+  % paragraph space, whichever is more.  (Some people like to set
+  % \parskip to large values for some reason.)  Don't allow stretch, though.
+  \nobreak
+  \ifdim\parskip>\normalbaselineskip
+    \kern\parskip
+  \else
+    \kern\normalbaselineskip
+  \fi
+  \nobreak
+}
+
+
+\message{toc,}
+% Table of contents.
+\newwrite\tocfile
+
+% Write an entry to the toc file, opening it if necessary.
+% Called from @chapter, etc.  We supply {\folio} at the end of the
+% argument, which will end up as the last argument to the \...entry macro.
+%
+% Usage: \writetocentry{chap}{The Name of The Game}{{\the\chapno}}
+% We open the .toc file for writing here instead of at @setfilename (or
+% any other fixed time) so that @contents can be anywhere in the document.
+%
+\newif\iftocfileopened
+\def\writetocentry#1#2#3{%
+  \iftocfileopened\else
+    \immediate\openout\tocfile = \jobname.toc
+    \global\tocfileopenedtrue
+  \fi
+  %
+  \iflinks
+    \toks0 = {#2}%
+    \edef\temp{\write\tocfile{\realbackslash #1entry{\the\toks0}#3{\folio}}}%
+    \temp
+  \fi
+  %
+  % Tell \shipout to create a page destination if we're doing pdf, which
+  % will be the target of the links in the table of contents.  We can't
+  % just do it on every page because the title pages are numbered 1 and
+  % 2 (the page numbers aren't printed), and so are the first two pages
+  % of the document.  Thus, we'd have two destinations named `1', and
+  % two named `2'.
+  \ifpdf \pdfmakepagedesttrue \fi
+}
+
+\newskip\contentsrightmargin \contentsrightmargin=1in
+\newcount\savepageno
+\newcount\lastnegativepageno \lastnegativepageno = -1
+
+% Finish up the main text and prepare to read what we've written
+% to \tocfile.
+%
+\def\startcontents#1{%
+   % If @setchapternewpage on, and @headings double, the contents should
+   % start on an odd page, unlike chapters.  Thus, we maintain
+   % \contentsalignmacro in parallel with \pagealignmacro.
+   % From: Torbjorn Granlund <tege@matematik.su.se>
+   \contentsalignmacro
+   \immediate\closeout\tocfile
+   %
+   % Don't need to put `Contents' or `Short Contents' in the headline.
+   % It is abundantly clear what they are.
+   \unnumbchapmacro{#1}\def\thischapter{}%
+   \savepageno = \pageno
+   \begingroup                  % Set up to handle contents files properly.
+      \catcode`\\=0  \catcode`\{=1  \catcode`\}=2  \catcode`\@=11
+      % We can't do this, because then an actual ^ in a section
+      % title fails, e.g., @chapter ^ -- exponentiation.  --karl, 9jul97.
+      %\catcode`\^=7 % to see ^^e4 as \"a etc. juha@piuha.ydi.vtt.fi
+      \raggedbottom             % Worry more about breakpoints than the bottom.
+      \advance\hsize by -\contentsrightmargin % Don't use the full line length.
+      %
+      % Roman numerals for page numbers.
+      \ifnum \pageno>0 \global\pageno = \lastnegativepageno \fi
+}
+
+
+% Normal (long) toc.
+\def\contents{%
+   \startcontents{\putwordTOC}%
+     \openin 1 \jobname.toc
+     \ifeof 1 \else
+       \closein 1
+       \input \jobname.toc
+     \fi
+     \vfill \eject
+     \contentsalignmacro % in case @setchapternewpage odd is in effect
+     \pdfmakeoutlines
+   \endgroup
+   \lastnegativepageno = \pageno
+   \global\pageno = \savepageno
+}
+
+% And just the chapters.
+\def\summarycontents{%
+   \startcontents{\putwordShortTOC}%
+      %
+      \let\chapentry = \shortchapentry
+      \let\appendixentry = \shortappendixentry
+      \let\unnumbchapentry = \shortunnumberedentry
+      % We want a true roman here for the page numbers.
+      \secfonts
+      \let\rm=\shortcontrm \let\bf=\shortcontbf
+      \let\sl=\shortcontsl \let\tt=\shortconttt
+      \rm
+      \hyphenpenalty = 10000
+      \advance\baselineskip by 1pt % Open it up a little.
+      \def\secentry ##1##2##3##4{}
+      \def\subsecentry ##1##2##3##4##5{}
+      \def\subsubsecentry ##1##2##3##4##5##6{}
+      \let\unnumbsecentry = \secentry
+      \let\unnumbsubsecentry = \subsecentry
+      \let\unnumbsubsubsecentry = \subsubsecentry
+      \openin 1 \jobname.toc
+      \ifeof 1 \else
+        \closein 1
+        \input \jobname.toc
+      \fi
+     \vfill \eject
+     \contentsalignmacro % in case @setchapternewpage odd is in effect
+   \endgroup
+   \lastnegativepageno = \pageno
+   \global\pageno = \savepageno
+}
+\let\shortcontents = \summarycontents
+
+\ifpdf
+  \pdfcatalog{/PageMode /UseOutlines}%
+\fi
+
+% These macros generate individual entries in the table of contents.
+% The first argument is the chapter or section name.
+% The last argument is the page number.
+% The arguments in between are the chapter number, section number, ...
+
+% Chapters, in the main contents.
+\def\chapentry#1#2#3{\dochapentry{#2\labelspace#1}{#3}}
+%
+% Chapters, in the short toc.
+% See comments in \dochapentry re vbox and related settings.
+\def\shortchapentry#1#2#3{%
+  \tocentry{\shortchaplabel{#2}\labelspace #1}{\doshortpageno\bgroup#3\egroup}%
+}
+
+% Appendices, in the main contents.
+\def\appendixentry#1#2#3{%
+  \dochapentry{\appendixbox{\putwordAppendix{} #2}\labelspace#1}{#3}}
+%
+% Appendices, in the short toc.
+\let\shortappendixentry = \shortchapentry
+
+% Typeset the label for a chapter or appendix for the short contents.
+% The arg is, e.g., `Appendix A' for an appendix, or `3' for a chapter.
+% We could simplify the code here by writing out an \appendixentry
+% command in the toc file for appendices, instead of using \chapentry
+% for both, but it doesn't seem worth it.
+%
+\newdimen\shortappendixwidth
+%
+\def\shortchaplabel#1{%
+  % This space should be enough, since a single number is .5em, and the
+  % widest letter (M) is 1em, at least in the Computer Modern fonts.
+  % But use \hss just in case.
+  % (This space doesn't include the extra space that gets added after
+  % the label; that gets put in by \shortchapentry above.)
+  \dimen0 = 1em
+  \hbox to \dimen0{#1\hss}%
+}
+
+% Unnumbered chapters.
+\def\unnumbchapentry#1#2#3{\dochapentry{#1}{#3}}
+\def\shortunnumberedentry#1#2#3{\tocentry{#1}{\doshortpageno\bgroup#3\egroup}}
+
+% Sections.
+\def\secentry#1#2#3#4{\dosecentry{#2.#3\labelspace#1}{#4}}
+\def\unnumbsecentry#1#2#3#4{\dosecentry{#1}{#4}}
+
+% Subsections.
+\def\subsecentry#1#2#3#4#5{\dosubsecentry{#2.#3.#4\labelspace#1}{#5}}
+\def\unnumbsubsecentry#1#2#3#4#5{\dosubsecentry{#1}{#5}}
+
+% And subsubsections.
+\def\subsubsecentry#1#2#3#4#5#6{%
+  \dosubsubsecentry{#2.#3.#4.#5\labelspace#1}{#6}}
+\def\unnumbsubsubsecentry#1#2#3#4#5#6{\dosubsubsecentry{#1}{#6}}
+
+% This parameter controls the indentation of the various levels.
+\newdimen\tocindent \tocindent = 3pc
+
+% Now for the actual typesetting. In all these, #1 is the text and #2 is the
+% page number.
+%
+% If the toc has to be broken over pages, we want it to be at chapters
+% if at all possible; hence the \penalty.
+\def\dochapentry#1#2{%
+   \penalty-300 \vskip1\baselineskip plus.33\baselineskip minus.25\baselineskip
+   \begingroup
+     \chapentryfonts
+     \tocentry{#1}{\dopageno\bgroup#2\egroup}%
+   \endgroup
+   \nobreak\vskip .25\baselineskip plus.1\baselineskip
+}
+
+\def\dosecentry#1#2{\begingroup
+  \secentryfonts \leftskip=\tocindent
+  \tocentry{#1}{\dopageno\bgroup#2\egroup}%
+\endgroup}
+
+\def\dosubsecentry#1#2{\begingroup
+  \subsecentryfonts \leftskip=2\tocindent
+  \tocentry{#1}{\dopageno\bgroup#2\egroup}%
+\endgroup}
+
+\def\dosubsubsecentry#1#2{\begingroup
+  \subsubsecentryfonts \leftskip=3\tocindent
+  \tocentry{#1}{\dopageno\bgroup#2\egroup}%
+\endgroup}
+
+% Final typesetting of a toc entry; we use the same \entry macro as for
+% the index entries, but we want to suppress hyphenation here.  (We
+% can't do that in the \entry macro, since index entries might consist
+% of hyphenated-identifiers-that-do-not-fit-on-a-line-and-nothing-else.)
+\def\tocentry#1#2{\begingroup
+  \vskip 0pt plus1pt % allow a little stretch for the sake of nice page breaks
+  % Do not use \turnoffactive in these arguments.  Since the toc is
+  % typeset in cmr, characters such as _ would come out wrong; we
+  % have to do the usual translation tricks.
+  \entry{#1}{#2}%
+\endgroup}
+
+% Space between chapter (or whatever) number and the title.
+\def\labelspace{\hskip1em \relax}
+
+\def\dopageno#1{{\rm #1}}
+\def\doshortpageno#1{{\rm #1}}
+
+\def\chapentryfonts{\secfonts \rm}
+\def\secentryfonts{\textfonts}
+\let\subsecentryfonts = \textfonts
+\let\subsubsecentryfonts = \textfonts
+
+
+\message{environments,}
+% @foo ... @end foo.
+
+% @point{}, @result{}, @expansion{}, @print{}, @equiv{}.
+% 
+% Since these characters are used in examples, it should be an even number of
+% \tt widths. Each \tt character is 1en, so two makes it 1em.
+%
+\def\point{$\star$}
+\def\result{\leavevmode\raise.15ex\hbox to 1em{\hfil$\Rightarrow$\hfil}}
+\def\expansion{\leavevmode\raise.1ex\hbox to 1em{\hfil$\mapsto$\hfil}}
+\def\print{\leavevmode\lower.1ex\hbox to 1em{\hfil$\dashv$\hfil}}
+\def\equiv{\leavevmode\lower.1ex\hbox to 1em{\hfil$\ptexequiv$\hfil}}
+
+% The @error{} command.
+% Adapted from the TeXbook's \boxit.
+% 
+\newbox\errorbox
+%
+{\tentt \global\dimen0 = 3em}% Width of the box.
+\dimen2 = .55pt % Thickness of rules
+% The text. (`r' is open on the right, `e' somewhat less so on the left.)
+\setbox0 = \hbox{\kern-.75pt \tensf error\kern-1.5pt}
+%
+\global\setbox\errorbox=\hbox to \dimen0{\hfil
+   \hsize = \dimen0 \advance\hsize by -5.8pt % Space to left+right.
+   \advance\hsize by -2\dimen2 % Rules.
+   \vbox{
+      \hrule height\dimen2
+      \hbox{\vrule width\dimen2 \kern3pt          % Space to left of text.
+         \vtop{\kern2.4pt \box0 \kern2.4pt}% Space above/below.
+         \kern3pt\vrule width\dimen2}% Space to right.
+      \hrule height\dimen2}
+    \hfil}
+%
+\def\error{\leavevmode\lower.7ex\copy\errorbox}
+
+% @tex ... @end tex    escapes into raw Tex temporarily.
+% One exception: @ is still an escape character, so that @end tex works.
+% But \@ or @@ will get a plain tex @ character.
+
+\def\tex{\begingroup
+  \catcode `\\=0 \catcode `\{=1 \catcode `\}=2
+  \catcode `\$=3 \catcode `\&=4 \catcode `\#=6
+  \catcode `\^=7 \catcode `\_=8 \catcode `\~=\active \let~=\tie
+  \catcode `\%=14
+  \catcode `\+=\other
+  \catcode `\"=\other
+  \catcode `\==\other
+  \catcode `\|=\other
+  \catcode `\<=\other
+  \catcode `\>=\other
+  \escapechar=`\\
+  %
+  \let\b=\ptexb
+  \let\bullet=\ptexbullet
+  \let\c=\ptexc
+  \let\,=\ptexcomma
+  \let\.=\ptexdot
+  \let\dots=\ptexdots
+  \let\equiv=\ptexequiv
+  \let\!=\ptexexclam
+  \let\i=\ptexi
+  \let\{=\ptexlbrace
+  \let\+=\tabalign
+  \let\}=\ptexrbrace
+  \let\*=\ptexstar
+  \let\t=\ptext
+  %
+  \def\endldots{\mathinner{\ldots\ldots\ldots\ldots}}%
+  \def\enddots{\relax\ifmmode\endldots\else$\mathsurround=0pt \endldots\,$\fi}%
+  \def\@{@}%
+\let\Etex=\endgroup}
+
+% Define @lisp ... @end lisp.
+% @lisp does a \begingroup so it can rebind things,
+% including the definition of @end lisp (which normally is erroneous).
+
+% Amount to narrow the margins by for @lisp.
+\newskip\lispnarrowing \lispnarrowing=0.4in
+
+% This is the definition that ^^M gets inside @lisp, @example, and other
+% such environments.  \null is better than a space, since it doesn't
+% have any width.
+\def\lisppar{\null\endgraf}
+
+% Make each space character in the input produce a normal interword
+% space in the output.  Don't allow a line break at this space, as this
+% is used only in environments like @example, where each line of input
+% should produce a line of output anyway.
+%
+{\obeyspaces %
+\gdef\sepspaces{\obeyspaces\let =\tie}}
+
+% Define \obeyedspace to be our active space, whatever it is.  This is
+% for use in \parsearg.
+{\sepspaces%
+\global\let\obeyedspace= }
+
+% This space is always present above and below environments.
+\newskip\envskipamount \envskipamount = 0pt
+
+% Make spacing and below environment symmetrical.  We use \parskip here
+% to help in doing that, since in @example-like environments \parskip
+% is reset to zero; thus the \afterenvbreak inserts no space -- but the
+% start of the next paragraph will insert \parskip.
+%
+\def\aboveenvbreak{{%
+  % =10000 instead of <10000 because of a special case in \itemzzz, q.v.
+  \ifnum \lastpenalty=10000 \else
+    \advance\envskipamount by \parskip
+    \endgraf
+    \ifdim\lastskip<\envskipamount
+      \removelastskip
+      % it's not a good place to break if the last penalty was \nobreak
+      % or better ...
+      \ifnum\lastpenalty>10000 \else \penalty-50 \fi
+      \vskip\envskipamount
+    \fi
+  \fi
+}}
+
+\let\afterenvbreak = \aboveenvbreak
+
+% \nonarrowing is a flag.  If "set", @lisp etc don't narrow margins.
+\let\nonarrowing=\relax
+
+% @cartouche ... @end cartouche: draw rectangle w/rounded corners around
+% environment contents.
+\font\circle=lcircle10
+\newdimen\circthick
+\newdimen\cartouter\newdimen\cartinner
+\newskip\normbskip\newskip\normpskip\newskip\normlskip
+\circthick=\fontdimen8\circle
+%
+\def\ctl{{\circle\char'013\hskip -6pt}}% 6pt from pl file: 1/2charwidth
+\def\ctr{{\hskip 6pt\circle\char'010}}
+\def\cbl{{\circle\char'012\hskip -6pt}}
+\def\cbr{{\hskip 6pt\circle\char'011}}
+\def\carttop{\hbox to \cartouter{\hskip\lskip
+        \ctl\leaders\hrule height\circthick\hfil\ctr
+        \hskip\rskip}}
+\def\cartbot{\hbox to \cartouter{\hskip\lskip
+        \cbl\leaders\hrule height\circthick\hfil\cbr
+        \hskip\rskip}}
+%
+\newskip\lskip\newskip\rskip
+
+\def\cartouche{%
+\par  % can't be in the midst of a paragraph.
+\begingroup
+        \lskip=\leftskip \rskip=\rightskip
+        \leftskip=0pt\rightskip=0pt %we want these *outside*.
+        \cartinner=\hsize \advance\cartinner by-\lskip
+                          \advance\cartinner by-\rskip
+        \cartouter=\hsize
+        \advance\cartouter by 18.4pt % allow for 3pt kerns on either
+%                                    side, and for 6pt waste from
+%                                    each corner char, and rule thickness
+        \normbskip=\baselineskip \normpskip=\parskip \normlskip=\lineskip
+        % Flag to tell @lisp, etc., not to narrow margin.
+        \let\nonarrowing=\comment
+        \vbox\bgroup
+                \baselineskip=0pt\parskip=0pt\lineskip=0pt
+                \carttop
+                \hbox\bgroup
+                        \hskip\lskip
+                        \vrule\kern3pt
+                        \vbox\bgroup
+                                \hsize=\cartinner
+                                \kern3pt
+                                \begingroup
+                                        \baselineskip=\normbskip
+                                        \lineskip=\normlskip
+                                        \parskip=\normpskip
+                                        \vskip -\parskip
+\def\Ecartouche{%
+                                \endgroup
+                                \kern3pt
+                        \egroup
+                        \kern3pt\vrule
+                        \hskip\rskip
+                \egroup
+                \cartbot
+        \egroup
+\endgroup
+}}
+
+
+% This macro is called at the beginning of all the @example variants,
+% inside a group.
+\def\nonfillstart{%
+  \aboveenvbreak
+  \inENV % This group ends at the end of the body
+  \hfuzz = 12pt % Don't be fussy
+  \sepspaces % Make spaces be word-separators rather than space tokens.
+  \let\par = \lisppar % don't ignore blank lines
+  \obeylines % each line of input is a line of output
+  \parskip = 0pt
+  \parindent = 0pt
+  \emergencystretch = 0pt % don't try to avoid overfull boxes
+  % @cartouche defines \nonarrowing to inhibit narrowing
+  % at next level down.
+  \ifx\nonarrowing\relax
+    \advance \leftskip by \lispnarrowing
+    \exdentamount=\lispnarrowing
+    \let\exdent=\nofillexdent
+    \let\nonarrowing=\relax
+  \fi
+}
+
+% Define the \E... control sequence only if we are inside the particular
+% environment, so the error checking in \end will work.
+%
+% To end an @example-like environment, we first end the paragraph (via
+% \afterenvbreak's vertical glue), and then the group.  That way we keep
+% the zero \parskip that the environments set -- \parskip glue will be
+% inserted at the beginning of the next paragraph in the document, after
+% the environment.
+%
+\def\nonfillfinish{\afterenvbreak\endgroup}
+
+% @lisp: indented, narrowed, typewriter font.
+\def\lisp{\begingroup
+  \nonfillstart
+  \let\Elisp = \nonfillfinish
+  \tt
+  \let\kbdfont = \kbdexamplefont % Allow @kbd to do something special.
+  \gobble       % eat return
+}
+
+% @example: Same as @lisp.
+\def\example{\begingroup \def\Eexample{\nonfillfinish\endgroup}\lisp}
+
+% @smallexample and @smalllisp: use smaller fonts.
+% Originally contributed by Pavel@xerox.
+\def\smalllisp{\begingroup
+  \def\Esmalllisp{\nonfillfinish\endgroup}%
+  \def\Esmallexample{\nonfillfinish\endgroup}%
+  \smallexamplefonts
+  \lisp
+}
+\let\smallexample = \smalllisp
+
+
+% @display: same as @lisp except keep current font.
+%
+\def\display{\begingroup
+  \nonfillstart
+  \let\Edisplay = \nonfillfinish
+  \gobble
+}
+%
+% @smalldisplay: @display plus smaller fonts.
+%
+\def\smalldisplay{\begingroup
+  \def\Esmalldisplay{\nonfillfinish\endgroup}%
+  \smallexamplefonts \rm
+  \display
+}
+
+% @format: same as @display except don't narrow margins.
+%
+\def\format{\begingroup
+  \let\nonarrowing = t
+  \nonfillstart
+  \let\Eformat = \nonfillfinish
+  \gobble
+}
+%
+% @smallformat: @format plus smaller fonts.
+%
+\def\smallformat{\begingroup
+  \def\Esmallformat{\nonfillfinish\endgroup}%
+  \smallexamplefonts \rm
+  \format
+}
+
+% @flushleft (same as @format).
+%
+\def\flushleft{\begingroup \def\Eflushleft{\nonfillfinish\endgroup}\format}
+
+% @flushright.
+%
+\def\flushright{\begingroup
+  \let\nonarrowing = t
+  \nonfillstart
+  \let\Eflushright = \nonfillfinish
+  \advance\leftskip by 0pt plus 1fill
+  \gobble
+}
+
+
+% @quotation does normal linebreaking (hence we can't use \nonfillstart)
+% and narrows the margins.
+%
+\def\quotation{%
+  \begingroup\inENV %This group ends at the end of the @quotation body
+  {\parskip=0pt \aboveenvbreak}% because \aboveenvbreak inserts \parskip
+  \parindent=0pt
+  % We have retained a nonzero parskip for the environment, since we're
+  % doing normal filling. So to avoid extra space below the environment...
+  \def\Equotation{\parskip = 0pt \nonfillfinish}%
+  %
+  % @cartouche defines \nonarrowing to inhibit narrowing at next level down.
+  \ifx\nonarrowing\relax
+    \advance\leftskip by \lispnarrowing
+    \advance\rightskip by \lispnarrowing
+    \exdentamount = \lispnarrowing
+    \let\nonarrowing = \relax
+  \fi
+}
+
+
+% LaTeX-like @verbatim...@end verbatim and @verb{<char>...<char>}
+% If we want to allow any <char> as delimiter, 
+% we need the curly braces so that makeinfo sees the @verb command, eg:
+% `@verbx...x' would look like the '@verbx' command.  --janneke@gnu.org
+%
+% [Knuth]: Donald Ervin Knuth, 1996.  The TeXbook.
+%
+% [Knuth] p.344; only we need to do the other characters Texinfo sets
+% active too.  Otherwise, they get lost as the first character on a
+% verbatim line.
+\def\dospecials{%
+  \do\ \do\\\do\{\do\}\do\$\do\&%
+  \do\#\do\^\do\^^K\do\_\do\^^A\do\%\do\~%
+  \do\<\do\>\do\|\do\@\do+\do\"%
+}
+%
+% [Knuth] p. 380
+\def\uncatcodespecials{%
+  \def\do##1{\catcode`##1=12}\dospecials}
+%
+% [Knuth] pp. 380,381,391
+% Disable Spanish ligatures ?` and !` of \tt font
+\begingroup
+  \catcode`\`=\active\gdef`{\relax\lq}
+\endgroup
+%
+% Setup for the @verb command.
+%
+% Eight spaces for a tab
+\begingroup
+  \catcode`\^^I=\active
+  \gdef\tabeightspaces{\catcode`\^^I=\active\def^^I{\ \ \ \ \ \ \ \ }}
+\endgroup
+%
+\def\setupverb{%
+  \tt  % easiest (and conventionally used) font for verbatim
+  \def\par{\leavevmode\endgraf}%
+  \catcode`\`=\active
+  \tabeightspaces
+  % Respect line breaks,
+  % print special symbols as themselves, and
+  % make each space count
+  % must do in this order:
+  \obeylines \uncatcodespecials \sepspaces
+}
+
+% Setup for the @verbatim environment
+%
+% Real tab expansion
+\newdimen\tabw \setbox0=\hbox{\tt\space} \tabw=8\wd0 % tab amount
+%
+\def\starttabbox{\setbox0=\hbox\bgroup}
+\begingroup
+  \catcode`\^^I=\active
+  \gdef\tabexpand{%
+    \catcode`\^^I=\active
+    \def^^I{\leavevmode\egroup
+      \dimen0=\wd0 % the width so far, or since the previous tab
+      \divide\dimen0 by\tabw
+      \multiply\dimen0 by\tabw % compute previous multiple of \tabw
+      \advance\dimen0 by\tabw  % advance to next multiple of \tabw
+      \wd0=\dimen0 \box0 \starttabbox
+    }%
+  }
+\endgroup
+\def\setupverbatim{%
+  % Easiest (and conventionally used) font for verbatim
+  \tt
+  \def\par{\leavevmode\egroup\box0\endgraf}%
+  \catcode`\`=\active
+  \tabexpand
+  % Respect line breaks,
+  % print special symbols as themselves, and
+  % make each space count
+  % must do in this order:
+  \obeylines \uncatcodespecials \sepspaces
+  \everypar{\starttabbox}%
+}
+
+% Do the @verb magic: verbatim text is quoted by unique 
+% delimiter characters.  Before first delimiter expect a 
+% right brace, after last delimiter expect closing brace:
+%
+%    \def\doverb'{'<char>#1<char>'}'{#1}
+%
+% [Knuth] p. 382; only eat outer {}
+\begingroup
+  \catcode`[=1\catcode`]=2\catcode`\{=12\catcode`\}=12
+  \gdef\doverb{#1[\def\next##1#1}[##1\endgroup]\next]
+\endgroup
+%
+\def\verb{\begingroup\setupverb\doverb}
+%
+%
+% Do the @verbatim magic: define the macro \doverbatim so that
+% the (first) argument ends when '@end verbatim' is reached, ie:
+%
+%     \def\doverbatim#1@end verbatim{#1}
+%
+% For Texinfo it's a lot easier than for LaTeX, 
+% because texinfo's \verbatim doesn't stop at '\end{verbatim}':
+% we need not redefine '\', '{' and '}'.
+%
+% Inspired by LaTeX's verbatim command set [latex.ltx]
+%% Include LaTeX hack for completeness -- never know
+%% \begingroup
+%% \catcode`|=0 \catcode`[=1
+%% \catcode`]=2\catcode`\{=12\catcode`\}=12\catcode`\ =\active
+%% \catcode`\\=12|gdef|doverbatim#1@end verbatim[
+%% #1|endgroup|def|Everbatim[]|end[verbatim]]
+%% |endgroup
+%
+\begingroup
+  \catcode`\ =\active
+  \obeylines %
+  % ignore everything up to the first ^^M, that's the newline at the end
+  % of the @verbatim input line itself.  Otherwise we get an extra blank
+  % line in the output.
+  \gdef\doverbatim#1^^M#2@end verbatim{#2\end{verbatim}}%
+\endgroup
+%
+\def\verbatim{%
+  \def\Everbatim{\nonfillfinish\endgroup}%
+  \begingroup
+    \nonfillstart
+    \advance\leftskip by -\defbodyindent
+    \begingroup\setupverbatim\doverbatim
+}
+
+% @verbatiminclude FILE - insert text of file in verbatim environment.
+%
+% Allow normal characters that we make active in the argument (a file name).
+\def\verbatiminclude{%
+  \begingroup
+    \catcode`\\=\other
+    \catcode`~=\other
+    \catcode`^=\other
+    \catcode`_=\other
+    \catcode`|=\other
+    \catcode`<=\other
+    \catcode`>=\other
+    \catcode`+=\other
+    \parsearg\doverbatiminclude
+}
+\def\setupverbatiminclude{%
+  \begingroup
+    \nonfillstart
+    \advance\leftskip by -\defbodyindent
+    \begingroup\setupverbatim
+}
+%
+\def\doverbatiminclude#1{%
+     % Restore active chars for included file.
+  \endgroup
+  \begingroup
+    \let\value=\expandablevalue
+    \def\thisfile{#1}%
+    \expandafter\expandafter\setupverbatiminclude\input\thisfile
+  \endgroup
+  \nonfillfinish
+  \endgroup
+}
+
+% @copying ... @end copying.
+% Save the text away for @insertcopying later.  Many commands won't be
+% allowed in this context, but that's ok.
+% 
+% We save the uninterpreted tokens, rather than creating a box.
+% Saving the text in a box would be much easier, but then all the
+% typesetting commands (@smallbook, font changes, etc.) have to be done
+% beforehand -- and a) we want @copying to be done first in the source
+% file; b) letting users define the frontmatter in as flexible order as
+% possible is very desirable.
+% 
+\def\copying{\begingroup
+  % Define a command to swallow text until we reach `@end copying'.
+  % \ is the escape char in this texinfo.tex file, so it is the
+  % delimiter for the command; @ will be the escape char when we read
+  % it, but that doesn't matter.
+  \long\def\docopying##1\end copying{\gdef\copyingtext{##1}\enddocopying}%
+  %
+  % We must preserve ^^M's in the input file; see \insertcopying below.
+  \catcode`\^^M = \active
+  \docopying
+}
+
+% What we do to finish off the copying text.
+%
+\def\enddocopying{\endgroup\ignorespaces}
+
+% @insertcopying.  Here we must play games with ^^M's.  On the one hand,
+% we need them to delimit commands such as `@end quotation', so they
+% must be active.  On the other hand, we certainly don't want every
+% end-of-line to be a \par, as would happen with the normal active
+% definition of ^^M.  On the third hand, two ^^M's in a row should still
+% generate a \par.
+% 
+% Our approach is to make ^^M insert a space and a penalty1 normally;
+% then it can also check if \lastpenalty=1.  If it does, then manually
+% do \par.
+% 
+% This messes up the normal definitions of @c[omment], so we redefine
+% it.  Similarly for @ignore.  (These commands are used in the gcc
+% manual for man page generation.)
+% 
+% Seems pretty fragile, most line-oriented commands will presumably
+% fail, but for the limited use of getting the copying text (which
+% should be quite simple) inserted, we can hope it's ok.
+%
+{\catcode`\^^M=\active %
+\gdef\insertcopying{\begingroup %
+  \parindent = 0pt  % looks wrong on title page
+  \def^^M{%
+    \ifnum \lastpenalty=1 %
+      \par %
+    \else %
+      \space \penalty 1 %
+    \fi %
+  }%
+  %
+  % Fix @c[omment] for catcode 13 ^^M's.
+  \def\c##1^^M{\ignorespaces}%
+  \let\comment = \c %
+  %
+  % Don't bother jumping through all the hoops that \doignore does, it
+  % would be very hard since the catcodes are already set.
+  \long\def\ignore##1\end ignore{\ignorespaces}%
+  %
+  \copyingtext %
+\endgroup}%
+}
+
+\message{defuns,}
+% @defun etc.
+
+% Allow user to change definition object font (\df) internally
+\def\setdeffont#1 {\csname DEF#1\endcsname}
+
+\newskip\defbodyindent \defbodyindent=.4in
+\newskip\defargsindent \defargsindent=50pt
+\newskip\deflastargmargin \deflastargmargin=18pt
+
+\newcount\parencount
+
+% We want ()&[] to print specially on the defun line.
+% 
+\def\activeparens{%
+  \catcode`\(=\active \catcode`\)=\active
+  \catcode`\&=\active
+  \catcode`\[=\active \catcode`\]=\active
+}
+
+% Make control sequences which act like normal parenthesis chars.
+\let\lparen = ( \let\rparen = )
+
+{\activeparens % Now, smart parens don't turn on until &foo (see \amprm)
+
+% Be sure that we always have a definition for `(', etc.  For example,
+% if the fn name has parens in it, \boldbrax will not be in effect yet,
+% so TeX would otherwise complain about undefined control sequence.
+\global\let(=\lparen \global\let)=\rparen
+\global\let[=\lbrack \global\let]=\rbrack
+
+\gdef\functionparens{\boldbrax\let&=\amprm\parencount=0 }
+\gdef\boldbrax{\let(=\opnr\let)=\clnr\let[=\lbrb\let]=\rbrb}
+% This is used to turn on special parens
+% but make & act ordinary (given that it's active).
+\gdef\boldbraxnoamp{\let(=\opnr\let)=\clnr\let[=\lbrb\let]=\rbrb\let&=\ampnr}
+
+% Definitions of (, ) and & used in args for functions.
+% This is the definition of ( outside of all parentheses.
+\gdef\oprm#1 {{\rm\char`\(}#1 \bf \let(=\opnested
+  \global\advance\parencount by 1
+}
+%
+% This is the definition of ( when already inside a level of parens.
+\gdef\opnested{\char`\(\global\advance\parencount by 1 }
+%
+\gdef\clrm{% Print a paren in roman if it is taking us back to depth of 0.
+  % also in that case restore the outer-level definition of (.
+  \ifnum \parencount=1 {\rm \char `\)}\sl \let(=\oprm \else \char `\) \fi
+  \global\advance \parencount by -1 }
+% If we encounter &foo, then turn on ()-hacking afterwards
+\gdef\amprm#1 {{\rm\&#1}\let(=\oprm \let)=\clrm\ }
+%
+\gdef\normalparens{\boldbrax\let&=\ampnr}
+} % End of definition inside \activeparens
+%% These parens (in \boldbrax) actually are a little bolder than the
+%% contained text.  This is especially needed for [ and ]
+\def\opnr{{\sf\char`\(}\global\advance\parencount by 1 }
+\def\clnr{{\sf\char`\)}\global\advance\parencount by -1 }
+\let\ampnr = \&
+\def\lbrb{{\bf\char`\[}}
+\def\rbrb{{\bf\char`\]}}
+
+% Active &'s sneak into the index arguments, so make sure it's defined.
+{
+  \catcode`& = \active
+  \global\let& = \ampnr
+}
+
+% \defname, which formats the name of the @def (not the args).
+% #1 is the function name.
+% #2 is the type of definition, such as "Function".
+%
+\def\defname#1#2{%
+  % How we'll output the type name.  Putting it in brackets helps
+  % distinguish it from the body text that may end up on the next line
+  % just below it.
+  \ifempty{#2}%
+    \def\defnametype{}%
+  \else
+    \def\defnametype{[\rm #2]}%
+  \fi
+  %
+  % Get the values of \leftskip and \rightskip as they were outside the @def...
+  \dimen2=\leftskip
+  \advance\dimen2 by -\defbodyindent
+  %
+  % Figure out values for the paragraph shape.
+  \setbox0=\hbox{\hskip \deflastargmargin{\defnametype}}%
+  \dimen0=\hsize \advance \dimen0 by -\wd0  % compute size for first line
+  \dimen1=\hsize \advance \dimen1 by -\defargsindent  % size for continuations
+  \parshape 2 0in \dimen0 \defargsindent \dimen1
+  %
+  % Output arg 2 ("Function" or some such) but stuck inside a box of
+  % width 0 so it does not interfere with linebreaking.
+  \noindent
+  %
+  {% Adjust \hsize to exclude the ambient margins,
+   % so that \rightline will obey them.
+   \advance \hsize by -\dimen2
+   \dimen3 = 0pt  % was -1.25pc
+   \rlap{\rightline{\defnametype\kern\dimen3}}%
+  }%
+  %
+  % Allow all lines to be underfull without complaint:
+  \tolerance=10000 \hbadness=10000
+  \advance\leftskip by -\defbodyindent
+  \exdentamount=\defbodyindent
+  {\df #1}\enskip        % output function name
+  % \defunargs will be called next to output the arguments, if any.
+}
+
+% Common pieces to start any @def...
+% #1 is the \E... control sequence to end the definition (which we define).
+% #2 is the \...x control sequence (which our caller defines).
+% #3 is the control sequence to process the header, such as \defunheader.
+% 
+\def\parsebodycommon#1#2#3{%
+  \begingroup\inENV
+  % If there are two @def commands in a row, we'll have a \nobreak,
+  % which is there to keep the function description together with its
+  % header.  But if there's nothing but headers, we want to allow a
+  % break after all.  Check for penalty 10002 (inserted by
+  % \defargscommonending) instead of 10000, since the sectioning
+  % commands insert a \penalty10000, and we don't want to allow a break
+  % between a section heading and a defun.
+  \ifnum\lastpenalty=10002 \penalty0 \fi
+  \medbreak
+  %
+  % Define the \E... end token that this defining construct specifies
+  % so that it will exit this group.
+  \def#1{\endgraf\endgroup\medbreak}%
+  %
+  \parindent=0in
+  \advance\leftskip by \defbodyindent
+  \exdentamount=\defbodyindent
+}
+
+% Common part of the \...x definitions.
+% 
+\def\defxbodycommon{%
+  % As with \parsebodycommon above, allow line break if we have multiple
+  % x headers in a row.  It's not a great place, though.
+  \ifnum\lastpenalty=10000 \penalty1000 \fi
+  %
+  \begingroup\obeylines
+}
+
+% Process body of @defun, @deffn, @defmac, etc.
+%
+\def\defparsebody#1#2#3{%
+  \parsebodycommon{#1}{#2}{#3}%
+  \def#2{\defxbodycommon \activeparens \spacesplit#3}%
+  \catcode\equalChar=\active
+  \begingroup\obeylines\activeparens
+  \spacesplit#3%
+}
+
+% #1, #2, #3 are the common arguments (see \parsebodycommon above).
+% #4, delimited by the space, is the class name.
+%
+\def\defmethparsebody#1#2#3#4 {%
+  \parsebodycommon{#1}{#2}{#3}%
+  \def#2##1 {\defxbodycommon \activeparens \spacesplit{#3{##1}}}%
+  \begingroup\obeylines\activeparens
+  % The \empty here prevents misinterpretation of a construct such as
+  %   @deffn {whatever} {Enharmonic comma}
+  % See comments at \deftpparsebody, although in our case we don't have
+  % to remove the \empty afterwards, since it is empty.
+  \spacesplit{#3{#4}}\empty
+}
+
+% Used for @deftypemethod and @deftypeivar.
+% #1, #2, #3 are the common arguments (see \defparsebody).
+% #4, delimited by a space, is the class name.
+% #5 is the method's return type.
+%
+\def\deftypemethparsebody#1#2#3#4 #5 {%
+  \parsebodycommon{#1}{#2}{#3}%
+  \def#2##1 ##2 {\defxbodycommon \activeparens \spacesplit{#3{##1}{##2}}}%
+  \begingroup\obeylines\activeparens
+  \spacesplit{#3{#4}{#5}}%
+}
+
+% Used for @deftypeop.  The change from \deftypemethparsebody is an
+% extra argument at the beginning which is the `category', instead of it
+% being the hardwired string `Method' or `Instance Variable'.  We have
+% to account for this both in the \...x definition and in parsing the
+% input at hand.  Thus also need a control sequence (passed as #5) for
+% the \E... definition to assign the category name to.
+% 
+\def\deftypeopparsebody#1#2#3#4#5 #6 {%
+  \parsebodycommon{#1}{#2}{#3}%
+  \def#2##1 ##2 ##3 {\def#4{##1}%
+    \defxbodycommon \activeparens \spacesplit{#3{##2}{##3}}}%
+  \begingroup\obeylines\activeparens
+  \spacesplit{#3{#5}{#6}}%
+}
+
+% For @defop.
+\def\defopparsebody #1#2#3#4#5 {%
+  \parsebodycommon{#1}{#2}{#3}%
+  \def#2##1 ##2 {\def#4{##1}%
+    \defxbodycommon \activeparens \spacesplit{#3{##2}}}%
+  \begingroup\obeylines\activeparens
+  \spacesplit{#3{#5}}%
+}
+
+% These parsing functions are similar to the preceding ones
+% except that they do not make parens into active characters.
+% These are used for "variables" since they have no arguments.
+%
+\def\defvarparsebody #1#2#3{%
+  \parsebodycommon{#1}{#2}{#3}%
+  \def#2{\defxbodycommon \spacesplit#3}%
+  \catcode\equalChar=\active
+  \begingroup\obeylines
+  \spacesplit#3%
+}
+
+% @defopvar.
+\def\defopvarparsebody #1#2#3#4#5 {%
+  \parsebodycommon{#1}{#2}{#3}%
+  \def#2##1 ##2 {\def#4{##1}%
+    \defxbodycommon \spacesplit{#3{##2}}}%
+  \begingroup\obeylines
+  \spacesplit{#3{#5}}%
+}
+
+\def\defvrparsebody#1#2#3#4 {%
+  \parsebodycommon{#1}{#2}{#3}%
+  \def#2##1 {\defxbodycommon \spacesplit{#3{##1}}}%
+  \begingroup\obeylines
+  \spacesplit{#3{#4}}%
+}
+
+% This loses on `@deftp {Data Type} {struct termios}' -- it thinks the
+% type is just `struct', because we lose the braces in `{struct
+% termios}' when \spacesplit reads its undelimited argument.  Sigh.
+% \let\deftpparsebody=\defvrparsebody
+%
+% So, to get around this, we put \empty in with the type name.  That
+% way, TeX won't find exactly `{...}' as an undelimited argument, and
+% won't strip off the braces.
+%
+\def\deftpparsebody #1#2#3#4 {%
+  \parsebodycommon{#1}{#2}{#3}%
+  \def#2##1 {\defxbodycommon \spacesplit{#3{##1}}}%
+  \begingroup\obeylines
+  \spacesplit{\parsetpheaderline{#3{#4}}}\empty
+}
+
+% Fine, but then we have to eventually remove the \empty *and* the
+% braces (if any).  That's what this does.
+%
+\def\removeemptybraces\empty#1\relax{#1}
+
+% After \spacesplit has done its work, this is called -- #1 is the final
+% thing to call, #2 the type name (which starts with \empty), and #3
+% (which might be empty) the arguments.
+%
+\def\parsetpheaderline#1#2#3{%
+  #1{\removeemptybraces#2\relax}{#3}%
+}%
+
+% Split up #2 (the rest of the input line) at the first space token.
+% call #1 with two arguments:
+%  the first is all of #2 before the space token,
+%  the second is all of #2 after that space token.
+% If #2 contains no space token, all of it is passed as the first arg
+% and the second is passed as empty.
+%
+{\obeylines %
+ \gdef\spacesplit#1#2^^M{\endgroup\spacesplitx{#1}#2 \relax\spacesplitx}%
+ \long\gdef\spacesplitx#1#2 #3#4\spacesplitx{%
+   \ifx\relax #3%
+     #1{#2}{}%
+   \else %
+     #1{#2}{#3#4}%
+   \fi}%
+}
+
+% Define @defun.
+
+% This is called to end the arguments processing for all the @def... commands.
+%
+\def\defargscommonending{%
+  \interlinepenalty = 10000
+  \advance\rightskip by 0pt plus 1fil
+  \endgraf
+  \nobreak\vskip -\parskip
+  \penalty 10002  % signal to \parsebodycommon.
+}
+
+% This expands the args and terminates the paragraph they comprise.
+% 
+\def\defunargs#1{\functionparens \sl
+% Expand, preventing hyphenation at `-' chars.
+% Note that groups don't affect changes in \hyphenchar.
+% Set the font temporarily and use \font in case \setfont made \tensl a macro.
+{\tensl\hyphenchar\font=0}%
+#1%
+{\tensl\hyphenchar\font=45}%
+\ifnum\parencount=0 \else \errmessage{Unbalanced parentheses in @def}\fi%
+  \defargscommonending
+}
+
+\def\deftypefunargs #1{%
+% Expand, preventing hyphenation at `-' chars.
+% Note that groups don't affect changes in \hyphenchar.
+% Use \boldbraxnoamp, not \functionparens, so that & is not special.
+\boldbraxnoamp
+\tclose{#1}% avoid \code because of side effects on active chars
+  \defargscommonending
+}
+
+% Do complete processing of one @defun or @defunx line already parsed.
+
+% @deffn Command forward-char nchars
+
+\def\deffn{\defmethparsebody\Edeffn\deffnx\deffnheader}
+
+\def\deffnheader #1#2#3{\doind {fn}{\code{#2}}%
+\begingroup\defname {#2}{#1}\defunargs{#3}\endgroup %
+\catcode\equalChar=\other % Turn off change made in \defparsebody
+}
+
+% @defun == @deffn Function
+
+\def\defun{\defparsebody\Edefun\defunx\defunheader}
+
+\def\defunheader #1#2{\doind {fn}{\code{#1}}% Make entry in function index
+\begingroup\defname {#1}{\putwordDeffunc}%
+\defunargs {#2}\endgroup %
+\catcode\equalChar=\other % Turn off change made in \defparsebody
+}
+
+% @deftypefun int foobar (int @var{foo}, float @var{bar})
+
+\def\deftypefun{\defparsebody\Edeftypefun\deftypefunx\deftypefunheader}
+
+% #1 is the data type.  #2 is the name and args.
+\def\deftypefunheader #1#2{\deftypefunheaderx{#1}#2 \relax}
+% #1 is the data type, #2 the name, #3 the args.
+\def\deftypefunheaderx #1#2 #3\relax{%
+\doind {fn}{\code{#2}}% Make entry in function index
+\begingroup\defname {\defheaderxcond#1\relax$.$#2}{\putwordDeftypefun}%
+\deftypefunargs {#3}\endgroup %
+\catcode\equalChar=\other % Turn off change made in \defparsebody
+}
+
+% @deftypefn {Library Function} int foobar (int @var{foo}, float @var{bar})
+
+\def\deftypefn{\defmethparsebody\Edeftypefn\deftypefnx\deftypefnheader}
+
+% \defheaderxcond#1\relax$.$
+% puts #1 in @code, followed by a space, but does nothing if #1 is null.
+\def\defheaderxcond#1#2$.${\ifx#1\relax\else\code{#1#2} \fi}
+
+% #1 is the classification.  #2 is the data type.  #3 is the name and args.
+\def\deftypefnheader #1#2#3{\deftypefnheaderx{#1}{#2}#3 \relax}
+% #1 is the classification, #2 the data type, #3 the name, #4 the args.
+\def\deftypefnheaderx #1#2#3 #4\relax{%
+\doind {fn}{\code{#3}}% Make entry in function index
+\begingroup
+\normalparens % notably, turn off `&' magic, which prevents
+%               at least some C++ text from working
+\defname {\defheaderxcond#2\relax$.$#3}{#1}%
+\deftypefunargs {#4}\endgroup %
+\catcode\equalChar=\other % Turn off change made in \defparsebody
+}
+
+% @defmac == @deffn Macro
+
+\def\defmac{\defparsebody\Edefmac\defmacx\defmacheader}
+
+\def\defmacheader #1#2{\doind {fn}{\code{#1}}% Make entry in function index
+\begingroup\defname {#1}{\putwordDefmac}%
+\defunargs {#2}\endgroup %
+\catcode\equalChar=\other % Turn off change made in \defparsebody
+}
+
+% @defspec == @deffn Special Form
+
+\def\defspec{\defparsebody\Edefspec\defspecx\defspecheader}
+
+\def\defspecheader #1#2{\doind {fn}{\code{#1}}% Make entry in function index
+\begingroup\defname {#1}{\putwordDefspec}%
+\defunargs {#2}\endgroup %
+\catcode\equalChar=\other % Turn off change made in \defparsebody
+}
+
+% @defop CATEGORY CLASS OPERATION ARG...
+%
+\def\defop #1 {\def\defoptype{#1}%
+\defopparsebody\Edefop\defopx\defopheader\defoptype}
+%
+\def\defopheader#1#2#3{%
+  \dosubind{fn}{\code{#2}}{\putwordon\ \code{#1}}% function index entry
+  \begingroup
+    \defname{#2}{\defoptype\ \putwordon\ #1}%
+    \defunargs{#3}%
+  \endgroup
+}
+
+% @deftypeop CATEGORY CLASS TYPE OPERATION ARG...
+%
+\def\deftypeop #1 {\def\deftypeopcategory{#1}%
+  \deftypeopparsebody\Edeftypeop\deftypeopx\deftypeopheader
+                       \deftypeopcategory}
+%
+% #1 is the class name, #2 the data type, #3 the operation name, #4 the args.
+\def\deftypeopheader#1#2#3#4{%
+  \dosubind{fn}{\code{#3}}{\putwordon\ \code{#1}}% entry in function index
+  \begingroup
+    \defname{\defheaderxcond#2\relax$.$#3}
+            {\deftypeopcategory\ \putwordon\ \code{#1}}%
+    \deftypefunargs{#4}%
+  \endgroup
+}
+
+% @deftypemethod CLASS TYPE METHOD ARG...
+%
+\def\deftypemethod{%
+  \deftypemethparsebody\Edeftypemethod\deftypemethodx\deftypemethodheader}
+%
+% #1 is the class name, #2 the data type, #3 the method name, #4 the args.
+\def\deftypemethodheader#1#2#3#4{%
+  \dosubind{fn}{\code{#3}}{\putwordon\ \code{#1}}% entry in function index
+  \begingroup
+    \defname{\defheaderxcond#2\relax$.$#3}{\putwordMethodon\ \code{#1}}%
+    \deftypefunargs{#4}%
+  \endgroup
+}
+
+% @deftypeivar CLASS TYPE VARNAME
+%
+\def\deftypeivar{%
+  \deftypemethparsebody\Edeftypeivar\deftypeivarx\deftypeivarheader}
+%
+% #1 is the class name, #2 the data type, #3 the variable name.
+\def\deftypeivarheader#1#2#3{%
+  \dosubind{vr}{\code{#3}}{\putwordof\ \code{#1}}% entry in variable index
+  \begingroup
+    \defname{\defheaderxcond#2\relax$.$#3}
+            {\putwordInstanceVariableof\ \code{#1}}%
+    \defvarargs{#3}%
+  \endgroup
+}
+
+% @defmethod == @defop Method
+%
+\def\defmethod{\defmethparsebody\Edefmethod\defmethodx\defmethodheader}
+%
+% #1 is the class name, #2 the method name, #3 the args.
+\def\defmethodheader#1#2#3{%
+  \dosubind{fn}{\code{#2}}{\putwordon\ \code{#1}}% entry in function index
+  \begingroup
+    \defname{#2}{\putwordMethodon\ \code{#1}}%
+    \defunargs{#3}%
+  \endgroup
+}
+
+% @defcv {Class Option} foo-class foo-flag
+
+\def\defcv #1 {\def\defcvtype{#1}%
+\defopvarparsebody\Edefcv\defcvx\defcvarheader\defcvtype}
+
+\def\defcvarheader #1#2#3{%
+  \dosubind{vr}{\code{#2}}{\putwordof\ \code{#1}}% variable index entry
+  \begingroup
+    \defname{#2}{\defcvtype\ \putwordof\ #1}%
+    \defvarargs{#3}%
+  \endgroup
+}
+
+% @defivar CLASS VARNAME == @defcv {Instance Variable} CLASS VARNAME
+%
+\def\defivar{\defvrparsebody\Edefivar\defivarx\defivarheader}
+%
+\def\defivarheader#1#2#3{%
+  \dosubind{vr}{\code{#2}}{\putwordof\ \code{#1}}% entry in var index
+  \begingroup
+    \defname{#2}{\putwordInstanceVariableof\ #1}%
+    \defvarargs{#3}%
+  \endgroup
+}
+
+% @defvar
+% First, define the processing that is wanted for arguments of @defvar.
+% This is actually simple: just print them in roman.
+% This must expand the args and terminate the paragraph they make up
+\def\defvarargs #1{\normalparens #1%
+  \defargscommonending
+}
+
+% @defvr Counter foo-count
+
+\def\defvr{\defvrparsebody\Edefvr\defvrx\defvrheader}
+
+\def\defvrheader #1#2#3{\doind {vr}{\code{#2}}%
+\begingroup\defname {#2}{#1}\defvarargs{#3}\endgroup}
+
+% @defvar == @defvr Variable
+
+\def\defvar{\defvarparsebody\Edefvar\defvarx\defvarheader}
+
+\def\defvarheader #1#2{\doind {vr}{\code{#1}}% Make entry in var index
+\begingroup\defname {#1}{\putwordDefvar}%
+\defvarargs {#2}\endgroup %
+}
+
+% @defopt == @defvr {User Option}
+
+\def\defopt{\defvarparsebody\Edefopt\defoptx\defoptheader}
+
+\def\defoptheader #1#2{\doind {vr}{\code{#1}}% Make entry in var index
+\begingroup\defname {#1}{\putwordDefopt}%
+\defvarargs {#2}\endgroup %
+}
+
+% @deftypevar int foobar
+
+\def\deftypevar{\defvarparsebody\Edeftypevar\deftypevarx\deftypevarheader}
+
+% #1 is the data type.  #2 is the name, perhaps followed by text that
+% is actually part of the data type, which should not be put into the index.
+\def\deftypevarheader #1#2{%
+\dovarind#2 \relax% Make entry in variables index
+\begingroup\defname {\defheaderxcond#1\relax$.$#2}{\putwordDeftypevar}%
+  \defargscommonending
+\endgroup}
+\def\dovarind#1 #2\relax{\doind{vr}{\code{#1}}}
+
+% @deftypevr {Global Flag} int enable
+
+\def\deftypevr{\defvrparsebody\Edeftypevr\deftypevrx\deftypevrheader}
+
+\def\deftypevrheader #1#2#3{\dovarind#3 \relax%
+\begingroup\defname {\defheaderxcond#2\relax$.$#3}{#1}
+  \defargscommonending
+\endgroup}
+
+% Now define @deftp
+% Args are printed in bold, a slight difference from @defvar.
+
+\def\deftpargs #1{\bf \defvarargs{#1}}
+
+% @deftp Class window height width ...
+
+\def\deftp{\deftpparsebody\Edeftp\deftpx\deftpheader}
+
+\def\deftpheader #1#2#3{\doind {tp}{\code{#2}}%
+\begingroup\defname {#2}{#1}\deftpargs{#3}\endgroup}
+
+% These definitions are used if you use @defunx (etc.)
+% anywhere other than immediately after a @defun or @defunx.
+% 
+\def\defcvx#1 {\errmessage{@defcvx in invalid context}}
+\def\deffnx#1 {\errmessage{@deffnx in invalid context}}
+\def\defivarx#1 {\errmessage{@defivarx in invalid context}}
+\def\defmacx#1 {\errmessage{@defmacx in invalid context}}
+\def\defmethodx#1 {\errmessage{@defmethodx in invalid context}}
+\def\defoptx #1 {\errmessage{@defoptx in invalid context}}
+\def\defopx#1 {\errmessage{@defopx in invalid context}}
+\def\defspecx#1 {\errmessage{@defspecx in invalid context}}
+\def\deftpx#1 {\errmessage{@deftpx in invalid context}}
+\def\deftypefnx#1 {\errmessage{@deftypefnx in invalid context}}
+\def\deftypefunx#1 {\errmessage{@deftypefunx in invalid context}}
+\def\deftypeivarx#1 {\errmessage{@deftypeivarx in invalid context}}
+\def\deftypemethodx#1 {\errmessage{@deftypemethodx in invalid context}}
+\def\deftypeopx#1 {\errmessage{@deftypeopx in invalid context}}
+\def\deftypevarx#1 {\errmessage{@deftypevarx in invalid context}}
+\def\deftypevrx#1 {\errmessage{@deftypevrx in invalid context}}
+\def\defunx#1 {\errmessage{@defunx in invalid context}}
+\def\defvarx#1 {\errmessage{@defvarx in invalid context}}
+\def\defvrx#1 {\errmessage{@defvrx in invalid context}}
+
+
+\message{macros,}
+% @macro.
+
+% To do this right we need a feature of e-TeX, \scantokens,
+% which we arrange to emulate with a temporary file in ordinary TeX.
+\ifx\eTeXversion\undefined
+ \newwrite\macscribble
+ \def\scanmacro#1{%
+   \begingroup \newlinechar`\^^M
+   % Undo catcode changes of \startcontents and \doprintindex
+   \catcode`\@=0 \catcode`\\=\other \escapechar=`\@
+   % Append \endinput to make sure that TeX does not see the ending newline.
+   \toks0={#1\endinput}%
+   \immediate\openout\macscribble=\jobname.tmp
+   \immediate\write\macscribble{\the\toks0}%
+   \immediate\closeout\macscribble
+   \let\xeatspaces\eatspaces
+   \input \jobname.tmp
+   \endgroup
+}
+\else
+\def\scanmacro#1{%
+\begingroup \newlinechar`\^^M
+% Undo catcode changes of \startcontents and \doprintindex
+\catcode`\@=0 \catcode`\\=\other \escapechar=`\@
+\let\xeatspaces\eatspaces\scantokens{#1\endinput}\endgroup}
+\fi
+
+\newcount\paramno   % Count of parameters
+\newtoks\macname    % Macro name
+\newif\ifrecursive  % Is it recursive?
+\def\macrolist{}    % List of all defined macros in the form
+                    % \do\macro1\do\macro2...
+
+% Utility routines.
+% Thisdoes \let #1 = #2, except with \csnames.
+\def\cslet#1#2{%
+\expandafter\expandafter
+\expandafter\let
+\expandafter\expandafter
+\csname#1\endcsname
+\csname#2\endcsname}
+
+% Trim leading and trailing spaces off a string.
+% Concepts from aro-bend problem 15 (see CTAN).
+{\catcode`\@=11
+\gdef\eatspaces #1{\expandafter\trim@\expandafter{#1 }}
+\gdef\trim@ #1{\trim@@ @#1 @ #1 @ @@}
+\gdef\trim@@ #1@ #2@ #3@@{\trim@@@\empty #2 @}
+\def\unbrace#1{#1}
+\unbrace{\gdef\trim@@@ #1 } #2@{#1}
+}
+
+% Trim a single trailing ^^M off a string.
+{\catcode`\^^M=\other \catcode`\Q=3%
+\gdef\eatcr #1{\eatcra #1Q^^MQ}%
+\gdef\eatcra#1^^MQ{\eatcrb#1Q}%
+\gdef\eatcrb#1Q#2Q{#1}%
+}
+
+% Macro bodies are absorbed as an argument in a context where
+% all characters are catcode 10, 11 or 12, except \ which is active
+% (as in normal texinfo). It is necessary to change the definition of \.
+
+% It's necessary to have hard CRs when the macro is executed. This is
+% done by  making ^^M (\endlinechar) catcode 12 when reading the macro
+% body, and then making it the \newlinechar in \scanmacro.
+
+\def\macrobodyctxt{%
+  \catcode`\~=\other
+  \catcode`\^=\other
+  \catcode`\_=\other
+  \catcode`\|=\other
+  \catcode`\<=\other
+  \catcode`\>=\other
+  \catcode`\+=\other
+  \catcode`\{=\other
+  \catcode`\}=\other
+  \catcode`\@=\other
+  \catcode`\^^M=\other
+  \usembodybackslash}
+
+\def\macroargctxt{%
+  \catcode`\~=\other
+  \catcode`\^=\other
+  \catcode`\_=\other
+  \catcode`\|=\other
+  \catcode`\<=\other
+  \catcode`\>=\other
+  \catcode`\+=\other
+  \catcode`\@=\other
+  \catcode`\\=\other}
+
+% \mbodybackslash is the definition of \ in @macro bodies.
+% It maps \foo\ => \csname macarg.foo\endcsname => #N
+% where N is the macro parameter number.
+% We define \csname macarg.\endcsname to be \realbackslash, so
+% \\ in macro replacement text gets you a backslash.
+
+{\catcode`@=0 @catcode`@\=@active
+ @gdef@usembodybackslash{@let\=@mbodybackslash}
+ @gdef@mbodybackslash#1\{@csname macarg.#1@endcsname}
+}
+\expandafter\def\csname macarg.\endcsname{\realbackslash}
+
+\def\macro{\recursivefalse\parsearg\macroxxx}
+\def\rmacro{\recursivetrue\parsearg\macroxxx}
+
+\def\macroxxx#1{%
+  \getargs{#1}%           now \macname is the macname and \argl the arglist
+  \ifx\argl\empty       % no arguments
+     \paramno=0%
+  \else
+     \expandafter\parsemargdef \argl;%
+  \fi
+  \if1\csname ismacro.\the\macname\endcsname
+     \message{Warning: redefining \the\macname}%
+  \else
+     \expandafter\ifx\csname \the\macname\endcsname \relax
+     \else \errmessage{Macro name \the\macname\space already defined}\fi
+     \global\cslet{macsave.\the\macname}{\the\macname}%
+     \global\expandafter\let\csname ismacro.\the\macname\endcsname=1%
+     % Add the macroname to \macrolist
+     \toks0 = \expandafter{\macrolist\do}%
+     \xdef\macrolist{\the\toks0
+       \expandafter\noexpand\csname\the\macname\endcsname}%
+  \fi
+  \begingroup \macrobodyctxt
+  \ifrecursive \expandafter\parsermacbody
+  \else \expandafter\parsemacbody
+  \fi}
+
+\def\unmacro{\parsearg\dounmacro}
+\def\dounmacro#1{%
+  \if1\csname ismacro.#1\endcsname
+    \global\cslet{#1}{macsave.#1}%
+    \global\expandafter\let \csname ismacro.#1\endcsname=0%
+    % Remove the macro name from \macrolist:
+    \begingroup
+      \expandafter\let\csname#1\endcsname \relax
+      \let\do\unmacrodo
+      \xdef\macrolist{\macrolist}%
+    \endgroup
+  \else
+    \errmessage{Macro #1 not defined}%
+  \fi
+}
+
+% Called by \do from \dounmacro on each macro.  The idea is to omit any
+% macro definitions that have been changed to \relax.
+% 
+\def\unmacrodo#1{%
+  \ifx#1\relax
+    % remove this
+  \else
+    \noexpand\do \noexpand #1%
+  \fi
+}
+
+% This makes use of the obscure feature that if the last token of a
+% <parameter list> is #, then the preceding argument is delimited by
+% an opening brace, and that opening brace is not consumed.
+\def\getargs#1{\getargsxxx#1{}}
+\def\getargsxxx#1#{\getmacname #1 \relax\getmacargs}
+\def\getmacname #1 #2\relax{\macname={#1}}
+\def\getmacargs#1{\def\argl{#1}}
+
+% Parse the optional {params} list.  Set up \paramno and \paramlist
+% so \defmacro knows what to do.  Define \macarg.blah for each blah
+% in the params list, to be ##N where N is the position in that list.
+% That gets used by \mbodybackslash (above).
+
+% We need to get `macro parameter char #' into several definitions.
+% The technique used is stolen from LaTeX:  let \hash be something
+% unexpandable, insert that wherever you need a #, and then redefine
+% it to # just before using the token list produced.
+%
+% The same technique is used to protect \eatspaces till just before
+% the macro is used.
+
+\def\parsemargdef#1;{\paramno=0\def\paramlist{}%
+        \let\hash\relax\let\xeatspaces\relax\parsemargdefxxx#1,;,}
+\def\parsemargdefxxx#1,{%
+  \if#1;\let\next=\relax
+  \else \let\next=\parsemargdefxxx
+    \advance\paramno by 1%
+    \expandafter\edef\csname macarg.\eatspaces{#1}\endcsname
+        {\xeatspaces{\hash\the\paramno}}%
+    \edef\paramlist{\paramlist\hash\the\paramno,}%
+  \fi\next}
+
+% These two commands read recursive and nonrecursive macro bodies.
+% (They're different since rec and nonrec macros end differently.)
+
+\long\def\parsemacbody#1@end macro%
+{\xdef\temp{\eatcr{#1}}\endgroup\defmacro}%
+\long\def\parsermacbody#1@end rmacro%
+{\xdef\temp{\eatcr{#1}}\endgroup\defmacro}%
+
+% This defines the macro itself. There are six cases: recursive and
+% nonrecursive macros of zero, one, and many arguments.
+% Much magic with \expandafter here.
+% \xdef is used so that macro definitions will survive the file
+% they're defined in; @include reads the file inside a group.
+\def\defmacro{%
+  \let\hash=##% convert placeholders to macro parameter chars
+  \ifrecursive
+    \ifcase\paramno
+    % 0
+      \expandafter\xdef\csname\the\macname\endcsname{%
+        \noexpand\scanmacro{\temp}}%
+    \or % 1
+      \expandafter\xdef\csname\the\macname\endcsname{%
+         \bgroup\noexpand\macroargctxt
+         \noexpand\braceorline
+         \expandafter\noexpand\csname\the\macname xxx\endcsname}%
+      \expandafter\xdef\csname\the\macname xxx\endcsname##1{%
+         \egroup\noexpand\scanmacro{\temp}}%
+    \else % many
+      \expandafter\xdef\csname\the\macname\endcsname{%
+         \bgroup\noexpand\macroargctxt
+         \noexpand\csname\the\macname xx\endcsname}%
+      \expandafter\xdef\csname\the\macname xx\endcsname##1{%
+          \expandafter\noexpand\csname\the\macname xxx\endcsname ##1,}%
+      \expandafter\expandafter
+      \expandafter\xdef
+      \expandafter\expandafter
+        \csname\the\macname xxx\endcsname
+          \paramlist{\egroup\noexpand\scanmacro{\temp}}%
+    \fi
+  \else
+    \ifcase\paramno
+    % 0
+      \expandafter\xdef\csname\the\macname\endcsname{%
+        \noexpand\norecurse{\the\macname}%
+        \noexpand\scanmacro{\temp}\egroup}%
+    \or % 1
+      \expandafter\xdef\csname\the\macname\endcsname{%
+         \bgroup\noexpand\macroargctxt
+         \noexpand\braceorline
+         \expandafter\noexpand\csname\the\macname xxx\endcsname}%
+      \expandafter\xdef\csname\the\macname xxx\endcsname##1{%
+        \egroup
+        \noexpand\norecurse{\the\macname}%
+        \noexpand\scanmacro{\temp}\egroup}%
+    \else % many
+      \expandafter\xdef\csname\the\macname\endcsname{%
+         \bgroup\noexpand\macroargctxt
+         \expandafter\noexpand\csname\the\macname xx\endcsname}%
+      \expandafter\xdef\csname\the\macname xx\endcsname##1{%
+          \expandafter\noexpand\csname\the\macname xxx\endcsname ##1,}%
+      \expandafter\expandafter
+      \expandafter\xdef
+      \expandafter\expandafter
+      \csname\the\macname xxx\endcsname
+      \paramlist{%
+          \egroup
+          \noexpand\norecurse{\the\macname}%
+          \noexpand\scanmacro{\temp}\egroup}%
+    \fi
+  \fi}
+
+\def\norecurse#1{\bgroup\cslet{#1}{macsave.#1}}
+
+% \braceorline decides whether the next nonwhitespace character is a
+% {.  If so it reads up to the closing }, if not, it reads the whole
+% line.  Whatever was read is then fed to the next control sequence
+% as an argument (by \parsebrace or \parsearg)
+\def\braceorline#1{\let\next=#1\futurelet\nchar\braceorlinexxx}
+\def\braceorlinexxx{%
+  \ifx\nchar\bgroup\else
+    \expandafter\parsearg
+  \fi \next}
+
+% We mant to disable all macros during \shipout so that they are not
+% expanded by \write.
+\def\turnoffmacros{\begingroup \def\do##1{\let\noexpand##1=\relax}%
+  \edef\next{\macrolist}\expandafter\endgroup\next}
+
+
+% @alias.
+% We need some trickery to remove the optional spaces around the equal
+% sign.  Just make them active and then expand them all to nothing.
+\def\alias{\begingroup\obeyspaces\parsearg\aliasxxx}
+\def\aliasxxx #1{\aliasyyy#1\relax}
+\def\aliasyyy #1=#2\relax{\ignoreactivespaces
+\edef\next{\global\let\expandafter\noexpand\csname#1\endcsname=%
+           \expandafter\noexpand\csname#2\endcsname}%
+\expandafter\endgroup\next}
+
+
+\message{cross references,}
+% @xref etc.
+
+\newwrite\auxfile
+
+\newif\ifhavexrefs    % True if xref values are known.
+\newif\ifwarnedxrefs  % True if we warned once that they aren't known.
+
+% @inforef is relatively simple.
+\def\inforef #1{\inforefzzz #1,,,,**}
+\def\inforefzzz #1,#2,#3,#4**{\putwordSee{} \putwordInfo{} \putwordfile{} \file{\ignorespaces #3{}},
+  node \samp{\ignorespaces#1{}}}
+
+% @node's job is to define \lastnode.
+\def\node{\ENVcheck\parsearg\nodezzz}
+\def\nodezzz#1{\nodexxx [#1,]}
+\def\nodexxx[#1,#2]{\gdef\lastnode{#1}}
+\let\nwnode=\node
+\let\lastnode=\relax
+
+% The sectioning commands (@chapter, etc.) call these.
+\def\donoderef{%
+  \ifx\lastnode\relax\else
+    \expandafter\expandafter\expandafter\setref{\lastnode}%
+      {Ysectionnumberandtype}%
+    \global\let\lastnode=\relax
+  \fi
+}
+\def\unnumbnoderef{%
+  \ifx\lastnode\relax\else
+    \expandafter\expandafter\expandafter\setref{\lastnode}{Ynothing}%
+    \global\let\lastnode=\relax
+  \fi
+}
+\def\appendixnoderef{%
+  \ifx\lastnode\relax\else
+    \expandafter\expandafter\expandafter\setref{\lastnode}%
+      {Yappendixletterandtype}%
+    \global\let\lastnode=\relax
+  \fi
+}
+
+
+% @anchor{NAME} -- define xref target at arbitrary point.
+%
+\newcount\savesfregister
+\gdef\savesf{\relax \ifhmode \savesfregister=\spacefactor \fi}
+\gdef\restoresf{\relax \ifhmode \spacefactor=\savesfregister \fi}
+\gdef\anchor#1{\savesf \setref{#1}{Ynothing}\restoresf \ignorespaces}
+
+% \setref{NAME}{SNT} defines a cross-reference point NAME (a node or an
+% anchor), namely NAME-title (the corresponding @chapter/etc. name),
+% NAME-pg (the page number), and NAME-snt (section number and type).
+% Called from \foonoderef.
+% 
+% We have to set \indexdummies so commands such as @code in a section
+% title aren't expanded.  It would be nicer not to expand the titles in
+% the first place, but there's so many layers that that is hard to do.
+%
+% Likewise, use \turnoffactive so that punctuation chars such as underscore
+% and backslash work in node names.
+% 
+\def\setref#1#2{{%
+  \atdummies
+  \pdfmkdest{#1}%
+  %
+  \turnoffactive
+  \dosetq{#1-title}{Ytitle}%
+  \dosetq{#1-pg}{Ypagenumber}%
+  \dosetq{#1-snt}{#2}%
+}}
+
+% @xref, @pxref, and @ref generate cross-references.  For \xrefX, #1 is
+% the node name, #2 the name of the Info cross-reference, #3 the printed
+% node name, #4 the name of the Info file, #5 the name of the printed
+% manual.  All but the node name can be omitted.
+%
+\def\pxref#1{\putwordsee{} \xrefX[#1,,,,,,,]}
+\def\xref#1{\putwordSee{} \xrefX[#1,,,,,,,]}
+\def\ref#1{\xrefX[#1,,,,,,,]}
+\def\xrefX[#1,#2,#3,#4,#5,#6]{\begingroup
+  \unsepspaces
+  \def\printedmanual{\ignorespaces #5}%
+  \def\printednodename{\ignorespaces #3}%
+  \setbox1=\hbox{\printedmanual}%
+  \setbox0=\hbox{\printednodename}%
+  \ifdim \wd0 = 0pt
+    % No printed node name was explicitly given.
+    \expandafter\ifx\csname SETxref-automatic-section-title\endcsname\relax
+      % Use the node name inside the square brackets.
+      \def\printednodename{\ignorespaces #1}%
+    \else
+      % Use the actual chapter/section title appear inside
+      % the square brackets.  Use the real section title if we have it.
+      \ifdim \wd1 > 0pt
+        % It is in another manual, so we don't have it.
+        \def\printednodename{\ignorespaces #1}%
+      \else
+        \ifhavexrefs
+          % We know the real title if we have the xref values.
+          \def\printednodename{\refx{#1-title}{}}%
+        \else
+          % Otherwise just copy the Info node name.
+          \def\printednodename{\ignorespaces #1}%
+        \fi%
+      \fi
+    \fi
+  \fi
+  %
+  % If we use \unhbox0 and \unhbox1 to print the node names, TeX does not
+  % insert empty discretionaries after hyphens, which means that it will
+  % not find a line break at a hyphen in a node names.  Since some manuals
+  % are best written with fairly long node names, containing hyphens, this
+  % is a loss.  Therefore, we give the text of the node name again, so it
+  % is as if TeX is seeing it for the first time.
+  \ifpdf
+    \leavevmode
+    \getfilename{#4}%
+    {\turnoffactive \otherbackslash
+     \ifnum\filenamelength>0
+       \startlink attr{/Border [0 0 0]}%
+         goto file{\the\filename.pdf} name{#1}%
+     \else
+       \startlink attr{/Border [0 0 0]}%
+         goto name{#1}%
+     \fi
+    }%
+    \linkcolor
+  \fi
+  %
+  \ifdim \wd1 > 0pt
+    \putwordsection{} ``\printednodename'' \putwordin{} \cite{\printedmanual}%
+  \else
+    % _ (for example) has to be the character _ for the purposes of the
+    % control sequence corresponding to the node, but it has to expand
+    % into the usual \leavevmode...\vrule stuff for purposes of
+    % printing. So we \turnoffactive for the \refx-snt, back on for the
+    % printing, back off for the \refx-pg.
+    {\turnoffactive \otherbackslash
+     % Only output a following space if the -snt ref is nonempty; for
+     % @unnumbered and @anchor, it won't be.
+     \setbox2 = \hbox{\ignorespaces \refx{#1-snt}{}}%
+     \ifdim \wd2 > 0pt \refx{#1-snt}\space\fi
+    }%
+    % [mynode],
+    [\printednodename],\space
+    % page 3
+    \turnoffactive \otherbackslash \putwordpage\tie\refx{#1-pg}{}%
+  \fi
+  \endlink
+\endgroup}
+
+% \dosetq is called from \setref to do the actual \write (\iflinks).
+%
+\def\dosetq#1#2{%
+  {\let\folio=0%
+   \edef\next{\write\auxfile{\internalsetq{#1}{#2}}}%
+   \iflinks \next \fi
+  }%
+}
+
+% \internalsetq{foo}{page} expands into
+%   CHARACTERS @xrdef{foo}{...expansion of \page...}
+\def\internalsetq#1#2{@xrdef{#1}{\csname #2\endcsname}}
+
+% Things to be expanded by \internalsetq.
+% 
+\def\Ypagenumber{\folio}
+\def\Ytitle{\thissection}
+\def\Ynothing{}
+\def\Ysectionnumberandtype{%
+  \ifnum\secno=0
+    \putwordChapter@tie \the\chapno
+  \else \ifnum\subsecno=0
+    \putwordSection@tie \the\chapno.\the\secno
+  \else \ifnum\subsubsecno=0
+    \putwordSection@tie \the\chapno.\the\secno.\the\subsecno
+  \else
+    \putwordSection@tie \the\chapno.\the\secno.\the\subsecno.\the\subsubsecno
+  \fi\fi\fi
+}
+
+\def\Yappendixletterandtype{%
+  \ifnum\secno=0
+     \putwordAppendix@tie @char\the\appendixno{}%
+  \else \ifnum\subsecno=0
+     \putwordSection@tie @char\the\appendixno.\the\secno
+  \else \ifnum\subsubsecno=0
+    \putwordSection@tie @char\the\appendixno.\the\secno.\the\subsecno
+  \else
+    \putwordSection@tie
+      @char\the\appendixno.\the\secno.\the\subsecno.\the\subsubsecno
+  \fi\fi\fi
+}
+
+% Use TeX 3.0's \inputlineno to get the line number, for better error
+% messages, but if we're using an old version of TeX, don't do anything.
+%
+\ifx\inputlineno\thisisundefined
+  \let\linenumber = \empty % Pre-3.0.
+\else
+  \def\linenumber{\the\inputlineno:\space}
+\fi
+
+% Define \refx{NAME}{SUFFIX} to reference a cross-reference string named NAME.
+% If its value is nonempty, SUFFIX is output afterward.
+%
+\def\refx#1#2{%
+  {%
+    \indexnofonts
+    \otherbackslash
+    \expandafter\global\expandafter\let\expandafter\thisrefX
+      \csname X#1\endcsname
+  }%
+  \ifx\thisrefX\relax
+    % If not defined, say something at least.
+    \angleleft un\-de\-fined\angleright
+    \iflinks
+      \ifhavexrefs
+        \message{\linenumber Undefined cross reference `#1'.}%
+      \else
+        \ifwarnedxrefs\else
+          \global\warnedxrefstrue
+          \message{Cross reference values unknown; you must run TeX again.}%
+        \fi
+      \fi
+    \fi
+  \else
+    % It's defined, so just use it.
+    \thisrefX
+  \fi
+  #2% Output the suffix in any case.
+}
+
+% This is the macro invoked by entries in the aux file.
+%
+\def\xrdef#1{\expandafter\gdef\csname X#1\endcsname}
+
+% Read the last existing aux file, if any.  No error if none exists.
+\def\readauxfile{\begingroup
+  \catcode`\^^@=\other
+  \catcode`\^^A=\other
+  \catcode`\^^B=\other
+  \catcode`\^^C=\other
+  \catcode`\^^D=\other
+  \catcode`\^^E=\other
+  \catcode`\^^F=\other
+  \catcode`\^^G=\other
+  \catcode`\^^H=\other
+  \catcode`\^^K=\other
+  \catcode`\^^L=\other
+  \catcode`\^^N=\other
+  \catcode`\^^P=\other
+  \catcode`\^^Q=\other
+  \catcode`\^^R=\other
+  \catcode`\^^S=\other
+  \catcode`\^^T=\other
+  \catcode`\^^U=\other
+  \catcode`\^^V=\other
+  \catcode`\^^W=\other
+  \catcode`\^^X=\other
+  \catcode`\^^Z=\other
+  \catcode`\^^[=\other
+  \catcode`\^^\=\other
+  \catcode`\^^]=\other
+  \catcode`\^^^=\other
+  \catcode`\^^_=\other
+  % It was suggested to set the catcode of ^ to 7, which would allow ^^e4 etc.
+  % in xref tags, i.e., node names.  But since ^^e4 notation isn't
+  % supported in the main text, it doesn't seem desirable.  Furthermore,
+  % that is not enough: for node names that actually contain a ^
+  % character, we would end up writing a line like this: 'xrdef {'hat
+  % b-title}{'hat b} and \xrdef does a \csname...\endcsname on the first
+  % argument, and \hat is not an expandable control sequence.  It could
+  % all be worked out, but why?  Either we support ^^ or we don't.
+  %
+  % The other change necessary for this was to define \auxhat:
+  % \def\auxhat{\def^{'hat }}% extra space so ok if followed by letter
+  % and then to call \auxhat in \setq.
+  %
+  \catcode`\^=\other
+  %
+  % Special characters.  Should be turned off anyway, but...
+  \catcode`\~=\other
+  \catcode`\[=\other
+  \catcode`\]=\other
+  \catcode`\"=\other
+  \catcode`\_=\other
+  \catcode`\|=\other
+  \catcode`\<=\other
+  \catcode`\>=\other
+  \catcode`\$=\other
+  \catcode`\#=\other
+  \catcode`\&=\other
+  \catcode`\%=\other
+  \catcode`+=\other % avoid \+ for paranoia even though we've turned it off
+  %
+  % Make the characters 128-255 be printing characters
+  {%
+    \count 1=128
+    \def\loop{%
+      \catcode\count 1=\other
+      \advance\count 1 by 1
+      \ifnum \count 1<256 \loop \fi
+    }%
+  }%
+  %
+  % Turn off \ as an escape so we do not lose on
+  % entries which were dumped with control sequences in their names.
+  % For example, @xrdef{$\leq $-fun}{page ...} made by @defun ^^
+  % Reference to such entries still does not work the way one would wish,
+  % but at least they do not bomb out when the aux file is read in.
+  \catcode`\\=\other
+  %
+  % @ is our escape character in .aux files.
+  \catcode`\{=1
+  \catcode`\}=2
+  \catcode`\@=0
+  %
+  \openin 1 \jobname.aux
+  \ifeof 1 \else
+    \closein 1
+    \input \jobname.aux
+    \global\havexrefstrue
+    \global\warnedobstrue
+  \fi
+  % Open the new aux file.  TeX will close it automatically at exit.
+  \openout\auxfile=\jobname.aux
+\endgroup}
+
+
+% Footnotes.
+
+\newcount \footnoteno
+
+% The trailing space in the following definition for supereject is
+% vital for proper filling; pages come out unaligned when you do a
+% pagealignmacro call if that space before the closing brace is
+% removed. (Generally, numeric constants should always be followed by a
+% space to prevent strange expansion errors.)
+\def\supereject{\par\penalty -20000\footnoteno =0 }
+
+% @footnotestyle is meaningful for info output only.
+\let\footnotestyle=\comment
+
+\let\ptexfootnote=\footnote
+
+{\catcode `\@=11
+%
+% Auto-number footnotes.  Otherwise like plain.
+\gdef\footnote{%
+  \global\advance\footnoteno by \@ne
+  \edef\thisfootno{$^{\the\footnoteno}$}%
+  %
+  % In case the footnote comes at the end of a sentence, preserve the
+  % extra spacing after we do the footnote number.
+  \let\@sf\empty
+  \ifhmode\edef\@sf{\spacefactor\the\spacefactor}\/\fi
+  %
+  % Remove inadvertent blank space before typesetting the footnote number.
+  \unskip
+  \thisfootno\@sf
+  \dofootnote
+}%
+
+% Don't bother with the trickery in plain.tex to not require the
+% footnote text as a parameter.  Our footnotes don't need to be so general.
+%
+% Oh yes, they do; otherwise, @ifset and anything else that uses
+% \parseargline fail inside footnotes because the tokens are fixed when
+% the footnote is read.  --karl, 16nov96.
+%
+% The start of the footnote looks usually like this:
+\gdef\startfootins{\insert\footins\bgroup}
+%
+% ... but this macro is redefined inside @multitable.
+%
+\gdef\dofootnote{%
+  \startfootins
+  % We want to typeset this text as a normal paragraph, even if the
+  % footnote reference occurs in (for example) a display environment.
+  % So reset some parameters.
+  \hsize=\pagewidth
+  \interlinepenalty\interfootnotelinepenalty
+  \splittopskip\ht\strutbox % top baseline for broken footnotes
+  \splitmaxdepth\dp\strutbox
+  \floatingpenalty\@MM
+  \leftskip\z@skip
+  \rightskip\z@skip
+  \spaceskip\z@skip
+  \xspaceskip\z@skip
+  \parindent\defaultparindent
+  %
+  \smallfonts \rm
+  %
+  % Because we use hanging indentation in footnotes, a @noindent appears
+  % to exdent this text, so make it be a no-op.  makeinfo does not use
+  % hanging indentation so @noindent can still be needed within footnote
+  % text after an @example or the like (not that this is good style).
+  \let\noindent = \relax
+  %
+  % Hang the footnote text off the number.  Use \everypar in case the
+  % footnote extends for more than one paragraph.
+  \everypar = {\hang}%
+  \textindent{\thisfootno}%
+  %
+  % Don't crash into the line above the footnote text.  Since this
+  % expands into a box, it must come within the paragraph, lest it
+  % provide a place where TeX can split the footnote.
+  \footstrut
+  \futurelet\next\fo@t
+}
+}%end \catcode `\@=11
+
+% @| inserts a changebar to the left of the current line.  It should
+% surround any changed text.  This approach does *not* work if the
+% change spans more than two lines of output.  To handle that, we would
+% have adopt a much more difficult approach (putting marks into the main
+% vertical list for the beginning and end of each change).
+%
+\def\|{%
+  % \vadjust can only be used in horizontal mode.
+  \leavevmode
+  %
+  % Append this vertical mode material after the current line in the output.
+  \vadjust{%
+    % We want to insert a rule with the height and depth of the current
+    % leading; that is exactly what \strutbox is supposed to record.
+    \vskip-\baselineskip
+    %
+    % \vadjust-items are inserted at the left edge of the type.  So
+    % the \llap here moves out into the left-hand margin.
+    \llap{%
+      %
+      % For a thicker or thinner bar, change the `1pt'.
+      \vrule height\baselineskip width1pt
+      %
+      % This is the space between the bar and the text.
+      \hskip 12pt
+    }%
+  }%
+}
+
+% For a final copy, take out the rectangles
+% that mark overfull boxes (in case you have decided
+% that the text looks ok even though it passes the margin).
+%
+\def\finalout{\overfullrule=0pt}
+
+% @image.  We use the macros from epsf.tex to support this.
+% If epsf.tex is not installed and @image is used, we complain.
+%
+% Check for and read epsf.tex up front.  If we read it only at @image
+% time, we might be inside a group, and then its definitions would get
+% undone and the next image would fail.
+\openin 1 = epsf.tex
+\ifeof 1 \else
+  \closein 1
+  % Do not bother showing banner with epsf.tex v2.7k (available in
+  % doc/epsf.tex and on ctan).
+  \def\epsfannounce{\toks0 = }%
+  \input epsf.tex
+\fi
+%
+% We will only complain once about lack of epsf.tex.
+\newif\ifwarnednoepsf
+\newhelp\noepsfhelp{epsf.tex must be installed for images to
+  work.  It is also included in the Texinfo distribution, or you can get
+  it from ftp://tug.org/tex/epsf.tex.}
+%
+\def\image#1{%
+  \ifx\epsfbox\undefined
+    \ifwarnednoepsf \else
+      \errhelp = \noepsfhelp
+      \errmessage{epsf.tex not found, images will be ignored}%
+      \global\warnednoepsftrue
+    \fi
+  \else
+    \imagexxx #1,,,,,\finish
+  \fi
+}
+%
+% Arguments to @image:
+% #1 is (mandatory) image filename; we tack on .eps extension.
+% #2 is (optional) width, #3 is (optional) height.
+% #4 is (ignored optional) html alt text.
+% #5 is (ignored optional) extension.
+% #6 is just the usual extra ignored arg for parsing this stuff.
+\newif\ifimagevmode
+\def\imagexxx#1,#2,#3,#4,#5,#6\finish{\begingroup
+  \catcode`\^^M = 5     % in case we're inside an example
+  \normalturnoffactive  % allow _ et al. in names
+  % If the image is by itself, center it.
+  \ifvmode
+    \imagevmodetrue
+    \nobreak\bigskip
+    % Usually we'll have text after the image which will insert
+    % \parskip glue, so insert it here too to equalize the space
+    % above and below. 
+    \nobreak\vskip\parskip
+    \nobreak
+    \line\bgroup\hss
+  \fi
+  %
+  % Output the image.
+  \ifpdf
+    \dopdfimage{#1}{#2}{#3}%
+  \else
+    % \epsfbox itself resets \epsf?size at each figure.
+    \setbox0 = \hbox{\ignorespaces #2}\ifdim\wd0 > 0pt \epsfxsize=#2\relax \fi
+    \setbox0 = \hbox{\ignorespaces #3}\ifdim\wd0 > 0pt \epsfysize=#3\relax \fi
+    \epsfbox{#1.eps}%
+  \fi
+  %
+  \ifimagevmode \hss \egroup \bigbreak \fi  % space after the image
+\endgroup}
+
+
+\message{localization,}
+% and i18n.
+
+% @documentlanguage is usually given very early, just after
+% @setfilename.  If done too late, it may not override everything
+% properly.  Single argument is the language abbreviation.
+% It would be nice if we could set up a hyphenation file here.
+%
+\def\documentlanguage{\parsearg\dodocumentlanguage}
+\def\dodocumentlanguage#1{%
+  \tex % read txi-??.tex file in plain TeX.
+  % Read the file if it exists.
+  \openin 1 txi-#1.tex
+  \ifeof1
+    \errhelp = \nolanghelp
+    \errmessage{Cannot read language file txi-#1.tex}%
+    \let\temp = \relax
+  \else
+    \def\temp{\input txi-#1.tex }%
+  \fi
+  \temp
+  \endgroup
+}
+\newhelp\nolanghelp{The given language definition file cannot be found or
+is empty.  Maybe you need to install it?  In the current directory
+should work if nowhere else does.}
+
+
+% @documentencoding should change something in TeX eventually, most
+% likely, but for now just recognize it.
+\let\documentencoding = \comment
+
+
+% Page size parameters.
+%
+\newdimen\defaultparindent \defaultparindent = 15pt
+
+\chapheadingskip = 15pt plus 4pt minus 2pt
+\secheadingskip = 12pt plus 3pt minus 2pt
+\subsecheadingskip = 9pt plus 2pt minus 2pt
+
+% Prevent underfull vbox error messages.
+\vbadness = 10000
+
+% Don't be so finicky about underfull hboxes, either.
+\hbadness = 2000
+
+% Following George Bush, just get rid of widows and orphans.
+\widowpenalty=10000
+\clubpenalty=10000
+
+% Use TeX 3.0's \emergencystretch to help line breaking, but if we're
+% using an old version of TeX, don't do anything.  We want the amount of
+% stretch added to depend on the line length, hence the dependence on
+% \hsize.  We call this whenever the paper size is set.
+%
+\def\setemergencystretch{%
+  \ifx\emergencystretch\thisisundefined
+    % Allow us to assign to \emergencystretch anyway.
+    \def\emergencystretch{\dimen0}%
+  \else
+    \emergencystretch = .15\hsize
+  \fi
+}
+
+% Parameters in order: 1) textheight; 2) textwidth; 3) voffset;
+% 4) hoffset; 5) binding offset; 6) topskip; 7) physical page height; 8)
+% physical page width.
+% 
+% We also call \setleading{\textleading}, so the caller should define
+% \textleading.  The caller should also set \parskip.
+%
+\def\internalpagesizes#1#2#3#4#5#6#7#8{%
+  \voffset = #3\relax
+  \topskip = #6\relax
+  \splittopskip = \topskip
+  %
+  \vsize = #1\relax
+  \advance\vsize by \topskip
+  \outervsize = \vsize
+  \advance\outervsize by 2\topandbottommargin
+  \pageheight = \vsize
+  %
+  \hsize = #2\relax
+  \outerhsize = \hsize
+  \advance\outerhsize by 0.5in
+  \pagewidth = \hsize
+  %
+  \normaloffset = #4\relax
+  \bindingoffset = #5\relax
+  %
+  \ifpdf
+    \pdfpageheight #7\relax
+    \pdfpagewidth #8\relax
+  \fi
+  %
+  \setleading{\textleading}
+  %
+  \parindent = \defaultparindent
+  \setemergencystretch
+}
+
+% @letterpaper (the default).
+\def\letterpaper{{\globaldefs = 1
+  \parskip = 3pt plus 2pt minus 1pt
+  \textleading = 13.2pt
+  %
+  % If page is nothing but text, make it come out even.
+  \internalpagesizes{46\baselineskip}{6in}%
+                    {\voffset}{.25in}%
+                    {\bindingoffset}{36pt}%
+                    {11in}{8.5in}%
+}}
+
+% Use @smallbook to reset parameters for 7x9.5 (or so) format.
+\def\smallbook{{\globaldefs = 1
+  \parskip = 2pt plus 1pt
+  \textleading = 12pt
+  %
+  \internalpagesizes{7.5in}{5in}%
+                    {\voffset}{.25in}%
+                    {\bindingoffset}{16pt}%
+                    {9.25in}{7in}%
+  %
+  \lispnarrowing = 0.3in
+  \tolerance = 700
+  \hfuzz = 1pt
+  \contentsrightmargin = 0pt
+  \defbodyindent = .5cm
+}}
+
+% Use @afourpaper to print on European A4 paper.
+\def\afourpaper{{\globaldefs = 1
+  \parskip = 3pt plus 2pt minus 1pt
+  \textleading = 13.2pt
+  %
+  % Double-side printing via postscript on Laserjet 4050 
+  % prints double-sided nicely when \bindingoffset=10mm and \hoffset=-6mm.
+  % To change the settings for a different printer or situation, adjust
+  % \normaloffset until the front-side and back-side texts align.  Then
+  % do the same for \bindingoffset.  You can set these for testing in
+  % your texinfo source file like this:
+  % @tex
+  % \global\normaloffset = -6mm
+  % \global\bindingoffset = 10mm
+  % @end tex
+  \internalpagesizes{51\baselineskip}{160mm}
+                    {\voffset}{\hoffset}%
+                    {\bindingoffset}{44pt}%
+                    {297mm}{210mm}%
+  %
+  \tolerance = 700
+  \hfuzz = 1pt
+  \contentsrightmargin = 0pt
+  \defbodyindent = 5mm
+}}
+
+% Use @afivepaper to print on European A5 paper.
+% From romildo@urano.iceb.ufop.br, 2 July 2000.
+% He also recommends making @example and @lisp be small.
+\def\afivepaper{{\globaldefs = 1
+  \parskip = 2pt plus 1pt minus 0.1pt
+  \textleading = 12.5pt
+  %
+  \internalpagesizes{160mm}{120mm}%
+                    {\voffset}{\hoffset}%
+                    {\bindingoffset}{8pt}%
+                    {210mm}{148mm}%
+  %
+  \lispnarrowing = 0.2in
+  \tolerance = 800
+  \hfuzz = 1.2pt
+  \contentsrightmargin = 0pt
+  \defbodyindent = 2mm
+  \tableindent = 12mm
+}}
+
+% A specific text layout, 24x15cm overall, intended for A4 paper.  
+\def\afourlatex{{\globaldefs = 1
+  \afourpaper
+  \internalpagesizes{237mm}{150mm}%
+                    {\voffset}{4.6mm}%
+                    {\bindingoffset}{7mm}%
+                    {297mm}{210mm}%
+  %
+  % Must explicitly reset to 0 because we call \afourpaper.
+  \globaldefs = 0
+}}
+
+% Use @afourwide to print on A4 paper in landscape format.
+\def\afourwide{{\globaldefs = 1
+  \afourpaper
+  \internalpagesizes{241mm}{165mm}%
+                    {\voffset}{-2.95mm}%
+                    {\bindingoffset}{7mm}%
+                    {297mm}{210mm}%
+  \globaldefs = 0
+}}
+
+% @pagesizes TEXTHEIGHT[,TEXTWIDTH]
+% Perhaps we should allow setting the margins, \topskip, \parskip,
+% and/or leading, also. Or perhaps we should compute them somehow.
+%
+\def\pagesizes{\parsearg\pagesizesxxx}
+\def\pagesizesxxx#1{\pagesizesyyy #1,,\finish}
+\def\pagesizesyyy#1,#2,#3\finish{{%
+  \setbox0 = \hbox{\ignorespaces #2}\ifdim\wd0 > 0pt \hsize=#2\relax \fi
+  \globaldefs = 1
+  %
+  \parskip = 3pt plus 2pt minus 1pt
+  \setleading{\textleading}%
+  %
+  \dimen0 = #1
+  \advance\dimen0 by \voffset
+  %
+  \dimen2 = \hsize
+  \advance\dimen2 by \normaloffset
+  %
+  \internalpagesizes{#1}{\hsize}%
+                    {\voffset}{\normaloffset}%
+                    {\bindingoffset}{44pt}%
+                    {\dimen0}{\dimen2}%
+}}
+
+% Set default to letter.
+%
+\letterpaper
+
+
+\message{and turning on texinfo input format.}
+
+% Define macros to output various characters with catcode for normal text.
+\catcode`\"=\other
+\catcode`\~=\other
+\catcode`\^=\other
+\catcode`\_=\other
+\catcode`\|=\other
+\catcode`\<=\other
+\catcode`\>=\other
+\catcode`\+=\other
+\catcode`\$=\other
+\def\normaldoublequote{"}
+\def\normaltilde{~}
+\def\normalcaret{^}
+\def\normalunderscore{_}
+\def\normalverticalbar{|}
+\def\normalless{<}
+\def\normalgreater{>}
+\def\normalplus{+}
+\def\normaldollar{$}%$ font-lock fix
+
+% This macro is used to make a character print one way in ttfont
+% where it can probably just be output, and another way in other fonts,
+% where something hairier probably needs to be done.
+%
+% #1 is what to print if we are indeed using \tt; #2 is what to print
+% otherwise.  Since all the Computer Modern typewriter fonts have zero
+% interword stretch (and shrink), and it is reasonable to expect all
+% typewriter fonts to have this, we can check that font parameter.
+%
+\def\ifusingtt#1#2{\ifdim \fontdimen3\font=0pt #1\else #2\fi}
+
+% Same as above, but check for italic font.  Actually this also catches
+% non-italic slanted fonts since it is impossible to distinguish them from
+% italic fonts.  But since this is only used by $ and it uses \sl anyway
+% this is not a problem.
+\def\ifusingit#1#2{\ifdim \fontdimen1\font>0pt #1\else #2\fi}
+
+% Turn off all special characters except @
+% (and those which the user can use as if they were ordinary).
+% Most of these we simply print from the \tt font, but for some, we can
+% use math or other variants that look better in normal text.
+
+\catcode`\"=\active
+\def\activedoublequote{{\tt\char34}}
+\let"=\activedoublequote
+\catcode`\~=\active
+\def~{{\tt\char126}}
+\chardef\hat=`\^
+\catcode`\^=\active
+\def^{{\tt \hat}}
+
+\catcode`\_=\active
+\def_{\ifusingtt\normalunderscore\_}
+% Subroutine for the previous macro.
+\def\_{\leavevmode \kern.07em \vbox{\hrule width.3em height.1ex}\kern .07em }
+
+\catcode`\|=\active
+\def|{{\tt\char124}}
+\chardef \less=`\<
+\catcode`\<=\active
+\def<{{\tt \less}}
+\chardef \gtr=`\>
+\catcode`\>=\active
+\def>{{\tt \gtr}}
+\catcode`\+=\active
+\def+{{\tt \char 43}}
+\catcode`\$=\active
+\def${\ifusingit{{\sl\$}}\normaldollar}%$ font-lock fix
+
+% Set up an active definition for =, but don't enable it most of the time.
+{\catcode`\==\active
+\global\def={{\tt \char 61}}}
+
+\catcode`+=\active
+\catcode`\_=\active
+
+% If a .fmt file is being used, characters that might appear in a file
+% name cannot be active until we have parsed the command line.
+% So turn them off again, and have \everyjob (or @setfilename) turn them on.
+% \otherifyactive is called near the end of this file.
+\def\otherifyactive{\catcode`+=\other \catcode`\_=\other}
+
+\catcode`\@=0
+
+% \rawbackslashxx outputs one backslash character in current font,
+% as in \char`\\.
+\global\chardef\rawbackslashxx=`\\
+
+% \rawbackslash defines an active \ to do \rawbackslashxx.
+% \otherbackslash defines an active \ to be a literal `\' character with
+% catcode other.
+{\catcode`\\=\active
+ @gdef@rawbackslash{@let\=@rawbackslashxx}
+ @gdef@otherbackslash{@let\=@realbackslash}
+}
+
+% \realbackslash is an actual character `\' with catcode other.
+{\catcode`\\=\other @gdef@realbackslash{\}}
+
+% \normalbackslash outputs one backslash in fixed width font.
+\def\normalbackslash{{\tt\rawbackslashxx}}
+
+\catcode`\\=\active
+
+% Used sometimes to turn off (effectively) the active characters
+% even after parsing them.
+@def@turnoffactive{%
+  @let"=@normaldoublequote
+  @let\=@realbackslash
+  @let~=@normaltilde
+  @let^=@normalcaret
+  @let_=@normalunderscore
+  @let|=@normalverticalbar
+  @let<=@normalless
+  @let>=@normalgreater
+  @let+=@normalplus
+  @let$=@normaldollar %$ font-lock fix
+}
+
+% Same as @turnoffactive except outputs \ as {\tt\char`\\} instead of
+% the literal character `\'.  (Thus, \ is not expandable when this is in
+% effect.)
+% 
+@def@normalturnoffactive{@turnoffactive @let\=@normalbackslash}
+
+% Make _ and + \other characters, temporarily.
+% This is canceled by @fixbackslash.
+@otherifyactive
+
+% If a .fmt file is being used, we don't want the `\input texinfo' to show up.
+% That is what \eatinput is for; after that, the `\' should revert to printing
+% a backslash.
+%
+@gdef@eatinput input texinfo{@fixbackslash}
+@global@let\ = @eatinput
+
+% On the other hand, perhaps the file did not have a `\input texinfo'. Then
+% the first `\{ in the file would cause an error. This macro tries to fix
+% that, assuming it is called before the first `\' could plausibly occur.
+% Also back turn on active characters that might appear in the input
+% file name, in case not using a pre-dumped format.
+%
+@gdef@fixbackslash{%
+  @ifx\@eatinput @let\ = @normalbackslash @fi
+  @catcode`+=@active
+  @catcode`@_=@active
+}
+
+% Say @foo, not \foo, in error messages.
+@escapechar = `@@
+
+% These look ok in all fonts, so just make them not special.  
+@catcode`@& = @other
+@catcode`@# = @other
+@catcode`@% = @other
+
+@c Set initial fonts.
+@textfonts
+@rm
+
+
+@c Local variables:
+@c eval: (add-hook 'write-file-hooks 'time-stamp)
+@c page-delimiter: "^\\\\message"
+@c time-stamp-start: "def\\\\texinfoversion{"
+@c time-stamp-format: "%:y-%02m-%02d.%02H"
+@c time-stamp-end: "}"
+@c End:
diff --git a/doc/version.texi b/doc/version.texi
new file mode 100644 (file)
index 0000000..654e837
--- /dev/null
@@ -0,0 +1,10 @@
+@ignore
+Copyright (C) 1988-2006 Free Software Foundation, Inc. 
+@end ignore
+
+@set EDITION 5.2
+@set VERSION 5.2
+@set UPDATED 26 April 2006
+@set UPDATED-MONTH April 2006
+
+@set LASTCHANGE Wed Apr 26 09:22:57 EDT 2006
diff --git a/emacs_keymap.c b/emacs_keymap.c
new file mode 100644 (file)
index 0000000..ca9d134
--- /dev/null
@@ -0,0 +1,873 @@
+/* emacs_keymap.c -- the keymap for emacs_mode in readline (). */
+
+/* Copyright (C) 1987, 1989, 1992 Free Software Foundation, Inc.
+
+   This file is part of the GNU Readline Library, a library for
+   reading lines of text with interactive input and history editing.
+
+   The GNU Readline Library 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.
+
+   The GNU Readline Library is distributed in the hope that it will be
+   useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+   of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   The GNU General Public License is often shipped with GNU software, and
+   is generally kept in a file called COPYING or LICENSE.  If you do not
+   have a copy of the license, write to the Free Software Foundation,
+   59 Temple Place, Suite 330, Boston, MA 02111 USA. */
+
+#if !defined (BUFSIZ)
+#include <stdio.h>
+#endif /* !BUFSIZ */
+
+#include "readline.h"
+
+/* An array of function pointers, one for each possible key.
+   If the type byte is ISKMAP, then the pointer is the address of
+   a keymap. */
+
+KEYMAP_ENTRY_ARRAY emacs_standard_keymap = {
+
+  /* Control keys. */
+  { ISFUNC, rl_set_mark },                     /* Control-@ */
+  { ISFUNC, rl_beg_of_line },                  /* Control-a */
+  { ISFUNC, rl_backward_char },                        /* Control-b */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* Control-c */
+  { ISFUNC, rl_delete },                       /* Control-d */
+  { ISFUNC, rl_end_of_line },                  /* Control-e */
+  { ISFUNC, rl_forward_char },                 /* Control-f */
+  { ISFUNC, rl_abort },                                /* Control-g */
+  { ISFUNC, rl_rubout },                       /* Control-h */
+  { ISFUNC, rl_complete },                     /* Control-i */
+  { ISFUNC, rl_newline },                      /* Control-j */
+  { ISFUNC, rl_kill_line },                    /* Control-k */
+  { ISFUNC, rl_clear_screen },                 /* Control-l */
+  { ISFUNC, rl_newline },                      /* Control-m */
+  { ISFUNC, rl_get_next_history },             /* Control-n */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* Control-o */
+  { ISFUNC, rl_get_previous_history },         /* Control-p */
+  { ISFUNC, rl_quoted_insert },                        /* Control-q */
+  { ISFUNC, rl_reverse_search_history },       /* Control-r */
+  { ISFUNC, rl_forward_search_history },       /* Control-s */
+  { ISFUNC, rl_transpose_chars },              /* Control-t */
+  { ISFUNC, rl_unix_line_discard },            /* Control-u */
+  { ISFUNC, rl_quoted_insert },                        /* Control-v */
+  { ISFUNC, rl_unix_word_rubout },             /* Control-w */
+  { ISKMAP, (rl_command_func_t *)emacs_ctlx_keymap },  /* Control-x */
+  { ISFUNC, rl_yank },                         /* Control-y */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* Control-z */
+  { ISKMAP, (rl_command_func_t *)emacs_meta_keymap }, /* Control-[ */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* Control-\ */
+  { ISFUNC, rl_char_search },                  /* Control-] */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* Control-^ */
+  { ISFUNC, rl_undo_command },                 /* Control-_ */
+
+  /* The start of printing characters. */
+  { ISFUNC, rl_insert },               /* SPACE */
+  { ISFUNC, rl_insert },               /* ! */
+  { ISFUNC, rl_insert },               /* " */
+  { ISFUNC, rl_insert },               /* # */
+  { ISFUNC, rl_insert },               /* $ */
+  { ISFUNC, rl_insert },               /* % */
+  { ISFUNC, rl_insert },               /* & */
+  { ISFUNC, rl_insert },               /* ' */
+  { ISFUNC, rl_insert },               /* ( */
+  { ISFUNC, rl_insert },               /* ) */
+  { ISFUNC, rl_insert },               /* * */
+  { ISFUNC, rl_insert },               /* + */
+  { ISFUNC, rl_insert },               /* , */
+  { ISFUNC, rl_insert },               /* - */
+  { ISFUNC, rl_insert },               /* . */
+  { ISFUNC, rl_insert },               /* / */
+       
+         /* Regular digits. */
+  { ISFUNC, rl_insert },               /* 0 */
+  { ISFUNC, rl_insert },               /* 1 */
+  { ISFUNC, rl_insert },               /* 2 */
+  { ISFUNC, rl_insert },               /* 3 */
+  { ISFUNC, rl_insert },               /* 4 */
+  { ISFUNC, rl_insert },               /* 5 */
+  { ISFUNC, rl_insert },               /* 6 */
+  { ISFUNC, rl_insert },               /* 7 */
+  { ISFUNC, rl_insert },               /* 8 */
+  { ISFUNC, rl_insert },               /* 9 */
+
+  /* A little more punctuation. */
+  { ISFUNC, rl_insert },               /* : */
+  { ISFUNC, rl_insert },               /* ; */
+  { ISFUNC, rl_insert },               /* < */
+  { ISFUNC, rl_insert },               /* = */
+  { ISFUNC, rl_insert },               /* > */
+  { ISFUNC, rl_insert },               /* ? */
+  { ISFUNC, rl_insert },               /* @ */
+
+  /* Uppercase alphabet. */
+  { ISFUNC, rl_insert },               /* A */
+  { ISFUNC, rl_insert },               /* B */
+  { ISFUNC, rl_insert },               /* C */
+  { ISFUNC, rl_insert },               /* D */
+  { ISFUNC, rl_insert },               /* E */
+  { ISFUNC, rl_insert },               /* F */
+  { ISFUNC, rl_insert },               /* G */
+  { ISFUNC, rl_insert },               /* H */
+  { ISFUNC, rl_insert },               /* I */
+  { ISFUNC, rl_insert },               /* J */
+  { ISFUNC, rl_insert },               /* K */
+  { ISFUNC, rl_insert },               /* L */
+  { ISFUNC, rl_insert },               /* M */
+  { ISFUNC, rl_insert },               /* N */
+  { ISFUNC, rl_insert },               /* O */
+  { ISFUNC, rl_insert },               /* P */
+  { ISFUNC, rl_insert },               /* Q */
+  { ISFUNC, rl_insert },               /* R */
+  { ISFUNC, rl_insert },               /* S */
+  { ISFUNC, rl_insert },               /* T */
+  { ISFUNC, rl_insert },               /* U */
+  { ISFUNC, rl_insert },               /* V */
+  { ISFUNC, rl_insert },               /* W */
+  { ISFUNC, rl_insert },               /* X */
+  { ISFUNC, rl_insert },               /* Y */
+  { ISFUNC, rl_insert },               /* Z */
+
+  /* Some more punctuation. */
+  { ISFUNC, rl_insert },               /* [ */
+  { ISFUNC, rl_insert },               /* \ */
+  { ISFUNC, rl_insert },               /* ] */
+  { ISFUNC, rl_insert },               /* ^ */
+  { ISFUNC, rl_insert },               /* _ */
+  { ISFUNC, rl_insert },               /* ` */
+
+  /* Lowercase alphabet. */
+  { ISFUNC, rl_insert },               /* a */
+  { ISFUNC, rl_insert },               /* b */
+  { ISFUNC, rl_insert },               /* c */
+  { ISFUNC, rl_insert },               /* d */
+  { ISFUNC, rl_insert },               /* e */
+  { ISFUNC, rl_insert },               /* f */
+  { ISFUNC, rl_insert },               /* g */
+  { ISFUNC, rl_insert },               /* h */
+  { ISFUNC, rl_insert },               /* i */
+  { ISFUNC, rl_insert },               /* j */
+  { ISFUNC, rl_insert },               /* k */
+  { ISFUNC, rl_insert },               /* l */
+  { ISFUNC, rl_insert },               /* m */
+  { ISFUNC, rl_insert },               /* n */
+  { ISFUNC, rl_insert },               /* o */
+  { ISFUNC, rl_insert },               /* p */
+  { ISFUNC, rl_insert },               /* q */
+  { ISFUNC, rl_insert },               /* r */
+  { ISFUNC, rl_insert },               /* s */
+  { ISFUNC, rl_insert },               /* t */
+  { ISFUNC, rl_insert },               /* u */
+  { ISFUNC, rl_insert },               /* v */
+  { ISFUNC, rl_insert },               /* w */
+  { ISFUNC, rl_insert },               /* x */
+  { ISFUNC, rl_insert },               /* y */
+  { ISFUNC, rl_insert },               /* z */
+
+  /* Final punctuation. */
+  { ISFUNC, rl_insert },               /* { */
+  { ISFUNC, rl_insert },               /* | */
+  { ISFUNC, rl_insert },               /* } */
+  { ISFUNC, rl_insert },               /* ~ */
+  { ISFUNC, rl_rubout },               /* RUBOUT */
+
+#if KEYMAP_SIZE > 128
+  /* Pure 8-bit characters (128 - 159).
+     These might be used in some
+     character sets. */
+  { ISFUNC, rl_insert },               /* ? */
+  { ISFUNC, rl_insert },               /* ? */
+  { ISFUNC, rl_insert },               /* ? */
+  { ISFUNC, rl_insert },               /* ? */
+  { ISFUNC, rl_insert },               /* ? */
+  { ISFUNC, rl_insert },               /* ? */
+  { ISFUNC, rl_insert },               /* ? */
+  { ISFUNC, rl_insert },               /* ? */
+  { ISFUNC, rl_insert },               /* ? */
+  { ISFUNC, rl_insert },               /* ? */
+  { ISFUNC, rl_insert },               /* ? */
+  { ISFUNC, rl_insert },               /* ? */
+  { ISFUNC, rl_insert },               /* ? */
+  { ISFUNC, rl_insert },               /* ? */
+  { ISFUNC, rl_insert },               /* ? */
+  { ISFUNC, rl_insert },               /* ? */
+  { ISFUNC, rl_insert },               /* ? */
+  { ISFUNC, rl_insert },               /* ? */
+  { ISFUNC, rl_insert },               /* ? */
+  { ISFUNC, rl_insert },               /* ? */
+  { ISFUNC, rl_insert },               /* ? */
+  { ISFUNC, rl_insert },               /* ? */
+  { ISFUNC, rl_insert },               /* ? */
+  { ISFUNC, rl_insert },               /* ? */
+  { ISFUNC, rl_insert },               /* ? */
+  { ISFUNC, rl_insert },               /* ? */
+  { ISFUNC, rl_insert },               /* ? */
+  { ISFUNC, rl_insert },               /* ? */
+  { ISFUNC, rl_insert },               /* ? */
+  { ISFUNC, rl_insert },               /* ? */
+  { ISFUNC, rl_insert },               /* ? */
+  { ISFUNC, rl_insert },               /* ? */
+
+  /* ISO Latin-1 characters (160 - 255) */
+  { ISFUNC, rl_insert },       /* No-break space */
+  { ISFUNC, rl_insert },       /* Inverted exclamation mark */
+  { ISFUNC, rl_insert },       /* Cent sign */
+  { ISFUNC, rl_insert },       /* Pound sign */
+  { ISFUNC, rl_insert },       /* Currency sign */
+  { ISFUNC, rl_insert },       /* Yen sign */
+  { ISFUNC, rl_insert },       /* Broken bar */
+  { ISFUNC, rl_insert },       /* Section sign */
+  { ISFUNC, rl_insert },       /* Diaeresis */
+  { ISFUNC, rl_insert },       /* Copyright sign */
+  { ISFUNC, rl_insert },       /* Feminine ordinal indicator */
+  { ISFUNC, rl_insert },       /* Left pointing double angle quotation mark */
+  { ISFUNC, rl_insert },       /* Not sign */
+  { ISFUNC, rl_insert },       /* Soft hyphen */
+  { ISFUNC, rl_insert },       /* Registered sign */
+  { ISFUNC, rl_insert },       /* Macron */
+  { ISFUNC, rl_insert },       /* Degree sign */
+  { ISFUNC, rl_insert },       /* Plus-minus sign */
+  { ISFUNC, rl_insert },       /* Superscript two */
+  { ISFUNC, rl_insert },       /* Superscript three */
+  { ISFUNC, rl_insert },       /* Acute accent */
+  { ISFUNC, rl_insert },       /* Micro sign */
+  { ISFUNC, rl_insert },       /* Pilcrow sign */
+  { ISFUNC, rl_insert },       /* Middle dot */
+  { ISFUNC, rl_insert },       /* Cedilla */
+  { ISFUNC, rl_insert },       /* Superscript one */
+  { ISFUNC, rl_insert },       /* Masculine ordinal indicator */
+  { ISFUNC, rl_insert },       /* Right pointing double angle quotation mark */
+  { ISFUNC, rl_insert },       /* Vulgar fraction one quarter */
+  { ISFUNC, rl_insert },       /* Vulgar fraction one half */
+  { ISFUNC, rl_insert },       /* Vulgar fraction three quarters */
+  { ISFUNC, rl_insert },       /* Inverted questionk mark */
+  { ISFUNC, rl_insert },       /* Latin capital letter a with grave */
+  { ISFUNC, rl_insert },       /* Latin capital letter a with acute */
+  { ISFUNC, rl_insert },       /* Latin capital letter a with circumflex */
+  { ISFUNC, rl_insert },       /* Latin capital letter a with tilde */
+  { ISFUNC, rl_insert },       /* Latin capital letter a with diaeresis */
+  { ISFUNC, rl_insert },       /* Latin capital letter a with ring above */
+  { ISFUNC, rl_insert },       /* Latin capital letter ae */
+  { ISFUNC, rl_insert },       /* Latin capital letter c with cedilla */
+  { ISFUNC, rl_insert },       /* Latin capital letter e with grave */
+  { ISFUNC, rl_insert },       /* Latin capital letter e with acute */
+  { ISFUNC, rl_insert },       /* Latin capital letter e with circumflex */
+  { ISFUNC, rl_insert },       /* Latin capital letter e with diaeresis */
+  { ISFUNC, rl_insert },       /* Latin capital letter i with grave */
+  { ISFUNC, rl_insert },       /* Latin capital letter i with acute */
+  { ISFUNC, rl_insert },       /* Latin capital letter i with circumflex */
+  { ISFUNC, rl_insert },       /* Latin capital letter i with diaeresis */
+  { ISFUNC, rl_insert },       /* Latin capital letter eth (Icelandic) */
+  { ISFUNC, rl_insert },       /* Latin capital letter n with tilde */
+  { ISFUNC, rl_insert },       /* Latin capital letter o with grave */
+  { ISFUNC, rl_insert },       /* Latin capital letter o with acute */
+  { ISFUNC, rl_insert },       /* Latin capital letter o with circumflex */
+  { ISFUNC, rl_insert },       /* Latin capital letter o with tilde */
+  { ISFUNC, rl_insert },       /* Latin capital letter o with diaeresis */
+  { ISFUNC, rl_insert },       /* Multiplication sign */
+  { ISFUNC, rl_insert },       /* Latin capital letter o with stroke */
+  { ISFUNC, rl_insert },       /* Latin capital letter u with grave */
+  { ISFUNC, rl_insert },       /* Latin capital letter u with acute */
+  { ISFUNC, rl_insert },       /* Latin capital letter u with circumflex */
+  { ISFUNC, rl_insert },       /* Latin capital letter u with diaeresis */
+  { ISFUNC, rl_insert },       /* Latin capital letter Y with acute */
+  { ISFUNC, rl_insert },       /* Latin capital letter thorn (Icelandic) */
+  { ISFUNC, rl_insert },       /* Latin small letter sharp s (German) */
+  { ISFUNC, rl_insert },       /* Latin small letter a with grave */
+  { ISFUNC, rl_insert },       /* Latin small letter a with acute */
+  { ISFUNC, rl_insert },       /* Latin small letter a with circumflex */
+  { ISFUNC, rl_insert },       /* Latin small letter a with tilde */
+  { ISFUNC, rl_insert },       /* Latin small letter a with diaeresis */
+  { ISFUNC, rl_insert },       /* Latin small letter a with ring above */
+  { ISFUNC, rl_insert },       /* Latin small letter ae */
+  { ISFUNC, rl_insert },       /* Latin small letter c with cedilla */
+  { ISFUNC, rl_insert },       /* Latin small letter e with grave */
+  { ISFUNC, rl_insert },       /* Latin small letter e with acute */
+  { ISFUNC, rl_insert },       /* Latin small letter e with circumflex */
+  { ISFUNC, rl_insert },       /* Latin small letter e with diaeresis */
+  { ISFUNC, rl_insert },       /* Latin small letter i with grave */
+  { ISFUNC, rl_insert },       /* Latin small letter i with acute */
+  { ISFUNC, rl_insert },       /* Latin small letter i with circumflex */
+  { ISFUNC, rl_insert },       /* Latin small letter i with diaeresis */
+  { ISFUNC, rl_insert },       /* Latin small letter eth (Icelandic) */
+  { ISFUNC, rl_insert },       /* Latin small letter n with tilde */
+  { ISFUNC, rl_insert },       /* Latin small letter o with grave */
+  { ISFUNC, rl_insert },       /* Latin small letter o with acute */
+  { ISFUNC, rl_insert },       /* Latin small letter o with circumflex */
+  { ISFUNC, rl_insert },       /* Latin small letter o with tilde */
+  { ISFUNC, rl_insert },       /* Latin small letter o with diaeresis */
+  { ISFUNC, rl_insert },       /* Division sign */
+  { ISFUNC, rl_insert },       /* Latin small letter o with stroke */
+  { ISFUNC, rl_insert },       /* Latin small letter u with grave */
+  { ISFUNC, rl_insert },       /* Latin small letter u with acute */
+  { ISFUNC, rl_insert },       /* Latin small letter u with circumflex */
+  { ISFUNC, rl_insert },       /* Latin small letter u with diaeresis */
+  { ISFUNC, rl_insert },       /* Latin small letter y with acute */
+  { ISFUNC, rl_insert },       /* Latin small letter thorn (Icelandic) */
+  { ISFUNC, rl_insert }                /* Latin small letter y with diaeresis */
+#endif /* KEYMAP_SIZE > 128 */
+};
+
+KEYMAP_ENTRY_ARRAY emacs_meta_keymap = {
+
+  /* Meta keys.  Just like above, but the high bit is set. */
+  { ISFUNC, (rl_command_func_t *)0x0 },        /* Meta-Control-@ */
+  { ISFUNC, (rl_command_func_t *)0x0 },        /* Meta-Control-a */
+  { ISFUNC, (rl_command_func_t *)0x0 },        /* Meta-Control-b */
+  { ISFUNC, (rl_command_func_t *)0x0 },        /* Meta-Control-c */
+  { ISFUNC, (rl_command_func_t *)0x0 },        /* Meta-Control-d */
+  { ISFUNC, (rl_command_func_t *)0x0 },        /* Meta-Control-e */
+  { ISFUNC, (rl_command_func_t *)0x0 },        /* Meta-Control-f */
+  { ISFUNC, rl_abort },                        /* Meta-Control-g */
+  { ISFUNC, rl_backward_kill_word },   /* Meta-Control-h */
+  { ISFUNC, rl_tab_insert },           /* Meta-Control-i */
+  { ISFUNC, rl_vi_editing_mode },      /* Meta-Control-j */
+  { ISFUNC, (rl_command_func_t *)0x0 },        /* Meta-Control-k */
+  { ISFUNC, (rl_command_func_t *)0x0 },        /* Meta-Control-l */
+  { ISFUNC, rl_vi_editing_mode },      /* Meta-Control-m */
+  { ISFUNC, (rl_command_func_t *)0x0 },        /* Meta-Control-n */
+  { ISFUNC, (rl_command_func_t *)0x0 },        /* Meta-Control-o */
+  { ISFUNC, (rl_command_func_t *)0x0 },        /* Meta-Control-p */
+  { ISFUNC, (rl_command_func_t *)0x0 },        /* Meta-Control-q */
+  { ISFUNC, rl_revert_line },          /* Meta-Control-r */
+  { ISFUNC, (rl_command_func_t *)0x0 },        /* Meta-Control-s */
+  { ISFUNC, (rl_command_func_t *)0x0 },        /* Meta-Control-t */
+  { ISFUNC, (rl_command_func_t *)0x0 },        /* Meta-Control-u */
+  { ISFUNC, (rl_command_func_t *)0x0 },        /* Meta-Control-v */
+  { ISFUNC, (rl_command_func_t *)0x0 },        /* Meta-Control-w */
+  { ISFUNC, (rl_command_func_t *)0x0 },        /* Meta-Control-x */
+  { ISFUNC, rl_yank_nth_arg },         /* Meta-Control-y */
+  { ISFUNC, (rl_command_func_t *)0x0 },        /* Meta-Control-z */
+
+  { ISFUNC, rl_complete },             /* Meta-Control-[ */
+  { ISFUNC, (rl_command_func_t *)0x0 },        /* Meta-Control-\ */
+  { ISFUNC, rl_backward_char_search }, /* Meta-Control-] */
+  { ISFUNC, (rl_command_func_t *)0x0 },        /* Meta-Control-^ */
+  { ISFUNC, (rl_command_func_t *)0x0 },        /* Meta-Control-_ */
+
+  /* The start of printing characters. */
+  { ISFUNC, rl_set_mark },             /* Meta-SPACE */
+  { ISFUNC, (rl_command_func_t *)0x0 },        /* Meta-! */
+  { ISFUNC, (rl_command_func_t *)0x0 },        /* Meta-" */
+  { ISFUNC, rl_insert_comment },       /* Meta-# */
+  { ISFUNC, (rl_command_func_t *)0x0 },        /* Meta-$ */
+  { ISFUNC, (rl_command_func_t *)0x0 },        /* Meta-% */
+  { ISFUNC, rl_tilde_expand },         /* Meta-& */
+  { ISFUNC, (rl_command_func_t *)0x0 },        /* Meta-' */
+  { ISFUNC, (rl_command_func_t *)0x0 },        /* Meta-( */
+  { ISFUNC, (rl_command_func_t *)0x0 },        /* Meta-) */
+  { ISFUNC, rl_insert_completions },   /* Meta-* */
+  { ISFUNC, (rl_command_func_t *)0x0 },        /* Meta-+ */
+  { ISFUNC, (rl_command_func_t *)0x0 },        /* Meta-, */
+  { ISFUNC, rl_digit_argument },       /* Meta-- */
+  { ISFUNC, rl_yank_last_arg},         /* Meta-. */
+  { ISFUNC, (rl_command_func_t *)0x0 },        /* Meta-/ */
+
+  /* Regular digits. */
+  { ISFUNC, rl_digit_argument },       /* Meta-0 */
+  { ISFUNC, rl_digit_argument },       /* Meta-1 */
+  { ISFUNC, rl_digit_argument },       /* Meta-2 */
+  { ISFUNC, rl_digit_argument },       /* Meta-3 */
+  { ISFUNC, rl_digit_argument },       /* Meta-4 */
+  { ISFUNC, rl_digit_argument },       /* Meta-5 */
+  { ISFUNC, rl_digit_argument },       /* Meta-6 */
+  { ISFUNC, rl_digit_argument },       /* Meta-7 */
+  { ISFUNC, rl_digit_argument },       /* Meta-8 */
+  { ISFUNC, rl_digit_argument },       /* Meta-9 */
+
+  /* A little more punctuation. */
+  { ISFUNC, (rl_command_func_t *)0x0 },        /* Meta-: */
+  { ISFUNC, (rl_command_func_t *)0x0 },        /* Meta-; */
+  { ISFUNC, rl_beginning_of_history }, /* Meta-< */
+  { ISFUNC, rl_possible_completions }, /* Meta-= */
+  { ISFUNC, rl_end_of_history },       /* Meta-> */
+  { ISFUNC, rl_possible_completions }, /* Meta-? */
+  { ISFUNC, (rl_command_func_t *)0x0 },        /* Meta-@ */
+
+  /* Uppercase alphabet. */
+  { ISFUNC, rl_do_lowercase_version }, /* Meta-A */
+  { ISFUNC, rl_do_lowercase_version }, /* Meta-B */
+  { ISFUNC, rl_do_lowercase_version }, /* Meta-C */
+  { ISFUNC, rl_do_lowercase_version }, /* Meta-D */
+  { ISFUNC, rl_do_lowercase_version }, /* Meta-E */
+  { ISFUNC, rl_do_lowercase_version }, /* Meta-F */
+  { ISFUNC, rl_do_lowercase_version }, /* Meta-G */
+  { ISFUNC, rl_do_lowercase_version }, /* Meta-H */
+  { ISFUNC, rl_do_lowercase_version }, /* Meta-I */
+  { ISFUNC, rl_do_lowercase_version }, /* Meta-J */
+  { ISFUNC, rl_do_lowercase_version }, /* Meta-K */
+  { ISFUNC, rl_do_lowercase_version }, /* Meta-L */
+  { ISFUNC, rl_do_lowercase_version }, /* Meta-M */
+  { ISFUNC, rl_do_lowercase_version }, /* Meta-N */
+  { ISFUNC, rl_do_lowercase_version }, /* Meta-O */
+  { ISFUNC, rl_do_lowercase_version }, /* Meta-P */
+  { ISFUNC, rl_do_lowercase_version }, /* Meta-Q */
+  { ISFUNC, rl_do_lowercase_version }, /* Meta-R */
+  { ISFUNC, rl_do_lowercase_version }, /* Meta-S */
+  { ISFUNC, rl_do_lowercase_version }, /* Meta-T */
+  { ISFUNC, rl_do_lowercase_version }, /* Meta-U */
+  { ISFUNC, rl_do_lowercase_version }, /* Meta-V */
+  { ISFUNC, rl_do_lowercase_version }, /* Meta-W */
+  { ISFUNC, rl_do_lowercase_version }, /* Meta-X */
+  { ISFUNC, rl_do_lowercase_version }, /* Meta-Y */
+  { ISFUNC, rl_do_lowercase_version }, /* Meta-Z */
+
+  /* Some more punctuation. */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* Meta-[ */    /* was rl_arrow_keys */
+  { ISFUNC, rl_delete_horizontal_space },      /* Meta-\ */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* Meta-] */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* Meta-^ */
+  { ISFUNC, rl_yank_last_arg },                        /* Meta-_ */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* Meta-` */
+
+  /* Lowercase alphabet. */
+  { ISFUNC, (rl_command_func_t *)0x0 },        /* Meta-a */
+  { ISFUNC, rl_backward_word },                /* Meta-b */
+  { ISFUNC, rl_capitalize_word },      /* Meta-c */
+  { ISFUNC, rl_kill_word },            /* Meta-d */
+  { ISFUNC, (rl_command_func_t *)0x0 },        /* Meta-e */
+  { ISFUNC, rl_forward_word },         /* Meta-f */
+  { ISFUNC, (rl_command_func_t *)0x0 },        /* Meta-g */
+  { ISFUNC, (rl_command_func_t *)0x0 },        /* Meta-h */
+  { ISFUNC, (rl_command_func_t *)0x0 },        /* Meta-i */
+  { ISFUNC, (rl_command_func_t *)0x0 },        /* Meta-j */
+  { ISFUNC, (rl_command_func_t *)0x0 },        /* Meta-k */
+  { ISFUNC, rl_downcase_word },                /* Meta-l */
+  { ISFUNC, (rl_command_func_t *)0x0 },        /* Meta-m */
+  { ISFUNC, rl_noninc_forward_search },        /* Meta-n */
+  { ISFUNC, (rl_command_func_t *)0x0 },        /* Meta-o */    /* was rl_arrow_keys */
+  { ISFUNC, rl_noninc_reverse_search },        /* Meta-p */
+  { ISFUNC, (rl_command_func_t *)0x0 },        /* Meta-q */
+  { ISFUNC, rl_revert_line },          /* Meta-r */
+  { ISFUNC, (rl_command_func_t *)0x0 },        /* Meta-s */
+  { ISFUNC, rl_transpose_words },      /* Meta-t */
+  { ISFUNC, rl_upcase_word },          /* Meta-u */
+  { ISFUNC, (rl_command_func_t *)0x0 },        /* Meta-v */
+  { ISFUNC, (rl_command_func_t *)0x0 },        /* Meta-w */
+  { ISFUNC, (rl_command_func_t *)0x0 },        /* Meta-x */
+  { ISFUNC, rl_yank_pop },             /* Meta-y */
+  { ISFUNC, (rl_command_func_t *)0x0 },        /* Meta-z */
+
+  /* Final punctuation. */
+  { ISFUNC, (rl_command_func_t *)0x0 },        /* Meta-{ */
+  { ISFUNC, (rl_command_func_t *)0x0 },        /* Meta-| */
+  { ISFUNC, (rl_command_func_t *)0x0 },        /* Meta-} */
+  { ISFUNC, rl_tilde_expand },         /* Meta-~ */
+  { ISFUNC, rl_backward_kill_word },   /* Meta-rubout */
+
+#if KEYMAP_SIZE > 128
+  /* Undefined keys. */
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 }
+#endif /* KEYMAP_SIZE > 128 */
+};
+
+KEYMAP_ENTRY_ARRAY emacs_ctlx_keymap = {
+
+  /* Control keys. */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* Control-@ */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* Control-a */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* Control-b */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* Control-c */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* Control-d */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* Control-e */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* Control-f */
+  { ISFUNC, rl_abort },                                /* Control-g */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* Control-h */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* Control-i */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* Control-j */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* Control-k */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* Control-l */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* Control-m */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* Control-n */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* Control-o */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* Control-p */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* Control-q */
+  { ISFUNC, rl_re_read_init_file },            /* Control-r */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* Control-s */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* Control-t */
+  { ISFUNC, rl_undo_command },                 /* Control-u */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* Control-v */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* Control-w */
+  { ISFUNC, rl_exchange_point_and_mark },      /* Control-x */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* Control-y */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* Control-z */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* Control-[ */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* Control-\ */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* Control-] */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* Control-^ */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* Control-_ */
+
+  /* The start of printing characters. */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* SPACE */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* ! */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* " */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* # */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* $ */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* % */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* & */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* ' */
+  { ISFUNC, rl_start_kbd_macro },              /* ( */
+  { ISFUNC, rl_end_kbd_macro  },               /* ) */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* * */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* + */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* , */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* - */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* . */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* / */
+
+  /* Regular digits. */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* 0 */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* 1 */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* 2 */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* 3 */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* 4 */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* 5 */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* 6 */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* 7 */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* 8 */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* 9 */
+
+  /* A little more punctuation. */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* : */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* ; */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* < */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* = */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* > */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* ? */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* @ */
+
+  /* Uppercase alphabet. */
+  { ISFUNC, rl_do_lowercase_version },         /* A */
+  { ISFUNC, rl_do_lowercase_version },         /* B */
+  { ISFUNC, rl_do_lowercase_version },         /* C */
+  { ISFUNC, rl_do_lowercase_version },         /* D */
+  { ISFUNC, rl_do_lowercase_version },         /* E */
+  { ISFUNC, rl_do_lowercase_version },         /* F */
+  { ISFUNC, rl_do_lowercase_version },         /* G */
+  { ISFUNC, rl_do_lowercase_version },         /* H */
+  { ISFUNC, rl_do_lowercase_version },         /* I */
+  { ISFUNC, rl_do_lowercase_version },         /* J */
+  { ISFUNC, rl_do_lowercase_version },         /* K */
+  { ISFUNC, rl_do_lowercase_version },         /* L */
+  { ISFUNC, rl_do_lowercase_version },         /* M */
+  { ISFUNC, rl_do_lowercase_version },         /* N */
+  { ISFUNC, rl_do_lowercase_version },         /* O */
+  { ISFUNC, rl_do_lowercase_version },         /* P */
+  { ISFUNC, rl_do_lowercase_version },         /* Q */
+  { ISFUNC, rl_do_lowercase_version },         /* R */
+  { ISFUNC, rl_do_lowercase_version },         /* S */
+  { ISFUNC, rl_do_lowercase_version },         /* T */
+  { ISFUNC, rl_do_lowercase_version },         /* U */
+  { ISFUNC, rl_do_lowercase_version },         /* V */
+  { ISFUNC, rl_do_lowercase_version },         /* W */
+  { ISFUNC, rl_do_lowercase_version },         /* X */
+  { ISFUNC, rl_do_lowercase_version },         /* Y */
+  { ISFUNC, rl_do_lowercase_version },         /* Z */
+
+  /* Some more punctuation. */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* [ */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* \ */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* ] */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* ^ */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* _ */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* ` */
+
+  /* Lowercase alphabet. */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* a */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* b */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* c */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* d */
+  { ISFUNC, rl_call_last_kbd_macro },          /* e */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* f */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* g */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* h */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* i */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* j */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* k */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* l */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* m */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* n */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* o */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* p */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* q */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* r */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* s */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* t */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* u */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* v */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* w */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* x */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* y */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* z */
+
+  /* Final punctuation. */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* { */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* | */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* } */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* ~ */
+  { ISFUNC, rl_backward_kill_line },           /* RUBOUT */
+
+#if KEYMAP_SIZE > 128
+  /* Undefined keys. */
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 }
+#endif /* KEYMAP_SIZE > 128 */
+};
diff --git a/examples/Inputrc b/examples/Inputrc
new file mode 100644 (file)
index 0000000..d7fdb42
--- /dev/null
@@ -0,0 +1,81 @@
+# My ~/.inputrc file is in -*- text -*- for easy editing with Emacs.
+#
+# Notice the various bindings which are conditionalized depending
+# on which program is running, or what terminal is active.
+#
+
+# Copyright (C) 1989-2002 Free Software Foundation, Inc.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111 USA.
+
+# In all programs, all terminals, make sure this is bound.
+"\C-x\C-r": re-read-init-file
+
+# Hp terminals (and some others) have ugly default behaviour for C-h.
+"\C-h": backward-delete-char
+"\e\C-h": backward-kill-word
+"\C-xd": dump-functions
+
+# In xterm windows, make the arrow keys do the right thing.
+$if TERM=xterm
+"\e[A": previous-history
+"\e[B": next-history
+"\e[C": forward-char
+"\e[D": backward-char
+
+# alternate arrow key prefix
+"\eOA": previous-history
+"\eOB": next-history
+"\eOC": forward-char
+"\eOD": backward-char
+
+# Under Xterm in Bash, we bind local Function keys to do something useful.
+$if Bash
+"\e[11~": "Function Key 1"
+"\e[12~": "Function Key 2"
+"\e[13~": "Function Key 3"
+"\e[14~": "Function Key 4"
+"\e[15~": "Function Key 5"
+
+# I know the following escape sequence numbers are 1 greater than
+# the function key.  Don't ask me why, I didn't design the xterm terminal.
+"\e[17~": "Function Key 6"
+"\e[18~": "Function Key 7"
+"\e[19~": "Function Key 8"
+"\e[20~": "Function Key 9"
+"\e[21~": "Function Key 10"
+$endif
+$endif
+
+# For Bash, all terminals, add some Bash specific hacks.
+$if Bash
+"\C-xv": show-bash-version
+"\C-x\C-e": shell-expand-line
+
+# Here is one for editing my path.
+"\C-xp": "$PATH\C-x\C-e\C-e\"\C-aPATH=\":\C-b"
+
+# Make C-x r read my mail in emacs.
+# "\C-xr": "emacs -f rmail\C-j"
+$endif
+
+# For FTP, different hacks:
+$if Ftp
+"\C-xg": "get \M-?"
+"\C-xt": "put \M-?"
+"\M-.": yank-last-arg
+$endif
+
+" ": self-insert
diff --git a/examples/Makefile.in b/examples/Makefile.in
new file mode 100644 (file)
index 0000000..e27bbc0
--- /dev/null
@@ -0,0 +1,102 @@
+#
+# This is the Makefile for the readline examples subdirectory.
+#
+# Copyright (C) 1994 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111 USA.
+RL_LIBRARY_VERSION = @LIBVERSION@
+
+SHELL = @MAKE_SHELL@
+RM = rm -f
+
+srcdir = @srcdir@
+VPATH = .:@srcdir@
+top_srcdir = @top_srcdir@
+BUILD_DIR = .
+
+# Support an alternate destination root directory for package building
+DESTDIR =
+
+DEFS = @DEFS@
+CC = @CC@
+CFLAGS = @CFLAGS@
+LOCAL_CFLAGS = @LOCAL_CFLAGS@ -DREADLINE_LIBRARY -DRL_LIBRARY_VERSION='"$(RL_LIBRARY_VERSION)"'
+CPPFLAGS = @CPPFLAGS@
+
+INCLUDES = -I$(srcdir) -I$(top_srcdir) -I..
+
+CCFLAGS  = $(DEFS) $(LOCAL_CFLAGS) $(CPPFLAGS) $(INCLUDES) $(CFLAGS)
+LDFLAGS = -g -L.. @LDFLAGS@
+
+PURIFY = @PURIFY@
+
+READLINE_LIB = ../libreadline.a
+HISTORY_LIB = ../libhistory.a
+
+TERMCAP_LIB = @TERMCAP_LIB@
+
+.c.o:
+       ${RM} $@
+       $(CC) $(CCFLAGS) -c $<
+
+EXECUTABLES = fileman rltest rl rlcat rlversion histexamp 
+OBJECTS = fileman.o rltest.o rl.o rlcat.o rlversion.o histexamp.o
+
+all: $(EXECUTABLES)
+everything: all
+
+rl: rl.o $(READLINE_LIB)
+       $(PURIFY) $(CC) $(LDFLAGS) -o $@ rl.o $(READLINE_LIB) $(TERMCAP_LIB)
+
+rlcat: rlcat.o $(READLINE_LIB)
+       $(PURIFY) $(CC) $(LDFLAGS) -o $@ rlcat.o $(READLINE_LIB) $(TERMCAP_LIB)
+
+fileman: fileman.o $(READLINE_LIB)
+       $(PURIFY) $(CC) $(LDFLAGS) -o $@ fileman.o $(READLINE_LIB) $(TERMCAP_LIB)
+
+rltest: rltest.o $(READLINE_LIB)
+       $(PURIFY) $(CC) $(LDFLAGS) -o $@ rltest.o $(READLINE_LIB) $(TERMCAP_LIB)
+
+rlptytest: rlptytest.o $(READLINE_LIB)
+       $(PURIFY) $(CC) $(LDFLAGS) -o $@ rlptytest.o $(READLINE_LIB) $(TERMCAP_LIB)
+
+rlversion: rlversion.o $(READLINE_LIB)
+       $(CC) $(LDFLAGS) -o $@ rlversion.o $(READLINE_LIB) $(TERMCAP_LIB)
+
+histexamp: histexamp.o $(HISTORY_LIB)
+       $(PURIFY) $(CC) $(LDFLAGS) -o $@ histexamp.o -lhistory $(TERMCAP_LIB)
+
+clean mostlyclean:
+       $(RM) $(OBJECTS)
+       $(RM) $(EXECUTABLES) *.exe
+
+distclean maintainer-clean: clean
+       $(RM) Makefile
+
+fileman.o: fileman.c
+rltest.o: rltest.c
+rl.o: rl.c
+rlversion.o: rlversion.c
+histexamp.o: histexamp.c
+rlcat.o: rlcat.c
+rlptytest.o: rlptytest.c
+
+fileman.o: $(top_srcdir)/readline.h
+rltest.o: $(top_srcdir)/readline.h
+rl.o: $(top_srcdir)/readline.h
+rlversion.o: $(top_srcdir)/readline.h
+histexamp.o: $(top_srcdir)/history.h
+rlcat.o: $(top_srcdir)/readline.h $(top_srcdir)/history.h
+rlptytest.o: $(top_srcdir)/readline.h $(top_srcdir)/history.h
diff --git a/examples/excallback.c b/examples/excallback.c
new file mode 100644 (file)
index 0000000..385492b
--- /dev/null
@@ -0,0 +1,191 @@
+/*
+From: Jeff Solomon <jsolomon@stanford.edu>
+Date: Fri,  9 Apr 1999 10:13:27 -0700 (PDT)
+To: chet@po.cwru.edu
+Subject: new readline example
+Message-ID: <14094.12094.527305.199695@mrclean.Stanford.EDU>
+
+Chet,
+
+I've been using readline 4.0. Specifically, I've been using the perl
+version Term::ReadLine::Gnu. It works great.
+
+Anyway, I've been playing around the alternate interface and I wanted
+to contribute a little C program, callback.c, to you that you could
+use as an example of the alternate interface in the /examples
+directory of the readline distribution.
+
+My example shows how, using the alternate interface, you can
+interactively change the prompt (which is very nice imo). Also, I
+point out that you must roll your own terminal setting when using the
+alternate interface because readline depreps (using your parlance) the
+terminal while in the user callback. I try to demostrate what I mean
+with an example. I've included the program below.
+
+To compile, I just put the program in the examples directory and made
+the appropriate changes to the EXECUTABLES and OBJECTS line and added
+an additional target 'callback'.
+
+I compiled on my Sun Solaris2.6 box using Sun's cc.
+
+Let me know what you think.
+
+Jeff
+*/
+/*
+Copyright (C) 1999 Jeff Solomon
+*/
+
+#if defined (HAVE_CONFIG_H)
+#include <config.h>
+#endif
+
+#include <stdio.h>
+#include <sys/types.h>
+
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+
+#include <termios.h>   /* xxx - should make this more general */
+
+#ifdef READLINE_LIBRARY
+#  include "readline.h"
+#else
+#  include <readline/readline.h>
+#endif
+
+/* This little examples demonstrates the alternate interface to using readline.
+ * In the alternate interface, the user maintains control over program flow and
+ * only calls readline when STDIN is readable. Using the alternate interface,
+ * you can do anything else while still using readline (like talking to a
+ * network or another program) without blocking.
+ *
+ * Specifically, this program highlights two importants features of the
+ * alternate interface. The first is the ability to interactively change the
+ * prompt, which can't be done using the regular interface since rl_prompt is
+ * read-only.
+ * 
+ * The second feature really highlights a subtle point when using the alternate
+ * interface. That is, readline will not alter the terminal when inside your
+ * callback handler. So let's so, your callback executes a user command that
+ * takes a non-trivial amount of time to complete (seconds). While your
+ * executing the command, the user continues to type keystrokes and expects them
+ * to be re-echoed on the new prompt when it returns. Unfortunately, the default
+ * terminal configuration doesn't do this. After the prompt returns, the user
+ * must hit one additional keystroke and then will see all of his previous
+ * keystrokes. To illustrate this, compile and run this program. Type "sleep" at
+ * the prompt and then type "bar" before the prompt returns (you have 3
+ * seconds). Notice how "bar" is re-echoed on the prompt after the prompt
+ * returns? This is what you expect to happen. Now comment out the 4 lines below
+ * the line that says COMMENT LINE BELOW. Recompile and rerun the program and do
+ * the same thing. When the prompt returns, you should not see "bar". Now type
+ * "f", see how "barf" magically appears? This behavior is un-expected and not
+ * desired.
+ */
+
+void process_line(char *line);
+int  change_prompt(void);
+char *get_prompt(void);
+
+int prompt = 1;
+char prompt_buf[40], line_buf[256];
+tcflag_t old_lflag;
+cc_t     old_vtime;
+struct termios term;
+
+int 
+main()
+{
+    fd_set fds;
+
+    /* Adjust the terminal slightly before the handler is installed. Disable
+     * canonical mode processing and set the input character time flag to be
+     * non-blocking.
+     */
+    if( tcgetattr(STDIN_FILENO, &term) < 0 ) {
+        perror("tcgetattr");
+        exit(1);
+    }
+    old_lflag = term.c_lflag;
+    old_vtime = term.c_cc[VTIME];
+    term.c_lflag &= ~ICANON;
+    term.c_cc[VTIME] = 1;
+    /* COMMENT LINE BELOW - see above */
+    if( tcsetattr(STDIN_FILENO, TCSANOW, &term) < 0 ) {
+        perror("tcsetattr");
+        exit(1);
+    }
+
+    rl_add_defun("change-prompt", change_prompt, CTRL('t'));
+    rl_callback_handler_install(get_prompt(), process_line);
+
+    while(1) {
+      FD_ZERO(&fds);
+      FD_SET(fileno(stdin), &fds);
+
+      if( select(FD_SETSIZE, &fds, NULL, NULL, NULL) < 0) {
+        perror("select");
+        exit(1);
+      }
+
+      if( FD_ISSET(fileno(stdin), &fds) ) {
+        rl_callback_read_char();
+      }
+    }
+}
+
+void
+process_line(char *line)
+{
+  if( line == NULL ) {
+    fprintf(stderr, "\n", line);
+
+    /* reset the old terminal setting before exiting */
+    term.c_lflag     = old_lflag;
+    term.c_cc[VTIME] = old_vtime;
+    if( tcsetattr(STDIN_FILENO, TCSANOW, &term) < 0 ) {
+        perror("tcsetattr");
+        exit(1);
+    }
+    exit(0);
+  }
+
+  if( strcmp(line, "sleep") == 0 ) {
+    sleep(3);
+  } else {
+    fprintf(stderr, "|%s|\n", line);
+  }
+
+  free (line);
+}
+
+int
+change_prompt(void)
+{
+  /* toggle the prompt variable */
+  prompt = !prompt;
+
+  /* save away the current contents of the line */
+  strcpy(line_buf, rl_line_buffer);
+
+  /* install a new handler which will change the prompt and erase the current line */
+  rl_callback_handler_install(get_prompt(), process_line);
+
+  /* insert the old text on the new line */
+  rl_insert_text(line_buf);
+
+  /* redraw the current line - this is an undocumented function. It invokes the
+   * redraw-current-line command.
+   */
+  rl_refresh_line(0, 0);
+}
+
+char *
+get_prompt(void)
+{
+  /* The prompts can even be different lengths! */
+  sprintf(prompt_buf, "%s", 
+    prompt ? "Hit ctrl-t to toggle prompt> " : "Pretty cool huh?> ");
+  return prompt_buf;
+}
diff --git a/examples/fileman.c b/examples/fileman.c
new file mode 100644 (file)
index 0000000..340eee7
--- /dev/null
@@ -0,0 +1,485 @@
+/* Copyright (C) 1987-2002 Free Software Foundation, Inc.
+
+   This file is part of the GNU Readline Library, a library for
+   reading lines of text with interactive input and history editing.
+
+   The GNU Readline Library 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.
+
+   The GNU Readline Library is distributed in the hope that it will be
+   useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+   of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   The GNU General Public License is often shipped with GNU software, and
+   is generally kept in a file called COPYING or LICENSE.  If you do not
+   have a copy of the license, write to the Free Software Foundation,
+   59 Temple Place, Suite 330, Boston, MA 02111 USA. */
+
+/* fileman.c -- A tiny application which demonstrates how to use the
+   GNU Readline library.  This application interactively allows users
+   to manipulate files and their modes. */
+
+#ifdef HAVE_CONFIG_H
+#  include <config.h>
+#endif
+
+#include <sys/types.h>
+#ifdef HAVE_SYS_FILE_H
+#  include <sys/file.h>
+#endif
+#include <sys/stat.h>
+
+#ifdef HAVE_UNISTD_H
+#  include <unistd.h>
+#endif
+
+#include <fcntl.h>
+#include <stdio.h>
+#include <errno.h>
+
+#if defined (HAVE_STRING_H)
+#  include <string.h>
+#else /* !HAVE_STRING_H */
+#  include <strings.h>
+#endif /* !HAVE_STRING_H */
+
+#ifdef HAVE_STDLIB_H
+#  include <stdlib.h>
+#endif
+
+#ifdef READLINE_LIBRARY
+#  include "readline.h"
+#  include "history.h"
+#else
+#  include <readline/readline.h>
+#  include <readline/history.h>
+#endif
+
+extern char *xmalloc ();
+
+/* The names of functions that actually do the manipulation. */
+int com_list PARAMS((char *));
+int com_view PARAMS((char *));
+int com_rename PARAMS((char *));
+int com_stat PARAMS((char *));
+int com_pwd PARAMS((char *));
+int com_delete PARAMS((char *));
+int com_help PARAMS((char *));
+int com_cd PARAMS((char *));
+int com_quit PARAMS((char *));
+
+/* A structure which contains information on the commands this program
+   can understand. */
+
+typedef struct {
+  char *name;                  /* User printable name of the function. */
+  rl_icpfunc_t *func;          /* Function to call to do the job. */
+  char *doc;                   /* Documentation for this function.  */
+} COMMAND;
+
+COMMAND commands[] = {
+  { "cd", com_cd, "Change to directory DIR" },
+  { "delete", com_delete, "Delete FILE" },
+  { "help", com_help, "Display this text" },
+  { "?", com_help, "Synonym for `help'" },
+  { "list", com_list, "List files in DIR" },
+  { "ls", com_list, "Synonym for `list'" },
+  { "pwd", com_pwd, "Print the current working directory" },
+  { "quit", com_quit, "Quit using Fileman" },
+  { "rename", com_rename, "Rename FILE to NEWNAME" },
+  { "stat", com_stat, "Print out statistics on FILE" },
+  { "view", com_view, "View the contents of FILE" },
+  { (char *)NULL, (rl_icpfunc_t *)NULL, (char *)NULL }
+};
+
+/* Forward declarations. */
+char *stripwhite ();
+COMMAND *find_command ();
+
+/* The name of this program, as taken from argv[0]. */
+char *progname;
+
+/* When non-zero, this global means the user is done using this program. */
+int done;
+
+char *
+dupstr (s)
+     char *s;
+{
+  char *r;
+
+  r = xmalloc (strlen (s) + 1);
+  strcpy (r, s);
+  return (r);
+}
+
+main (argc, argv)
+     int argc;
+     char **argv;
+{
+  char *line, *s;
+
+  progname = argv[0];
+
+  initialize_readline ();      /* Bind our completer. */
+
+  /* Loop reading and executing lines until the user quits. */
+  for ( ; done == 0; )
+    {
+      line = readline ("FileMan: ");
+
+      if (!line)
+        break;
+
+      /* Remove leading and trailing whitespace from the line.
+         Then, if there is anything left, add it to the history list
+         and execute it. */
+      s = stripwhite (line);
+
+      if (*s)
+        {
+          add_history (s);
+          execute_line (s);
+        }
+
+      free (line);
+    }
+  exit (0);
+}
+
+/* Execute a command line. */
+int
+execute_line (line)
+     char *line;
+{
+  register int i;
+  COMMAND *command;
+  char *word;
+
+  /* Isolate the command word. */
+  i = 0;
+  while (line[i] && whitespace (line[i]))
+    i++;
+  word = line + i;
+
+  while (line[i] && !whitespace (line[i]))
+    i++;
+
+  if (line[i])
+    line[i++] = '\0';
+
+  command = find_command (word);
+
+  if (!command)
+    {
+      fprintf (stderr, "%s: No such command for FileMan.\n", word);
+      return (-1);
+    }
+
+  /* Get argument to command, if any. */
+  while (whitespace (line[i]))
+    i++;
+
+  word = line + i;
+
+  /* Call the function. */
+  return ((*(command->func)) (word));
+}
+
+/* Look up NAME as the name of a command, and return a pointer to that
+   command.  Return a NULL pointer if NAME isn't a command name. */
+COMMAND *
+find_command (name)
+     char *name;
+{
+  register int i;
+
+  for (i = 0; commands[i].name; i++)
+    if (strcmp (name, commands[i].name) == 0)
+      return (&commands[i]);
+
+  return ((COMMAND *)NULL);
+}
+
+/* Strip whitespace from the start and end of STRING.  Return a pointer
+   into STRING. */
+char *
+stripwhite (string)
+     char *string;
+{
+  register char *s, *t;
+
+  for (s = string; whitespace (*s); s++)
+    ;
+    
+  if (*s == 0)
+    return (s);
+
+  t = s + strlen (s) - 1;
+  while (t > s && whitespace (*t))
+    t--;
+  *++t = '\0';
+
+  return s;
+}
+
+/* **************************************************************** */
+/*                                                                  */
+/*                  Interface to Readline Completion                */
+/*                                                                  */
+/* **************************************************************** */
+
+char *command_generator PARAMS((const char *, int));
+char **fileman_completion PARAMS((const char *, int, int));
+
+/* Tell the GNU Readline library how to complete.  We want to try to complete
+   on command names if this is the first word in the line, or on filenames
+   if not. */
+initialize_readline ()
+{
+  /* Allow conditional parsing of the ~/.inputrc file. */
+  rl_readline_name = "FileMan";
+
+  /* Tell the completer that we want a crack first. */
+  rl_attempted_completion_function = fileman_completion;
+}
+
+/* Attempt to complete on the contents of TEXT.  START and END bound the
+   region of rl_line_buffer that contains the word to complete.  TEXT is
+   the word to complete.  We can use the entire contents of rl_line_buffer
+   in case we want to do some simple parsing.  Return the array of matches,
+   or NULL if there aren't any. */
+char **
+fileman_completion (text, start, end)
+     const char *text;
+     int start, end;
+{
+  char **matches;
+
+  matches = (char **)NULL;
+
+  /* If this word is at the start of the line, then it is a command
+     to complete.  Otherwise it is the name of a file in the current
+     directory. */
+  if (start == 0)
+    matches = rl_completion_matches (text, command_generator);
+
+  return (matches);
+}
+
+/* Generator function for command completion.  STATE lets us know whether
+   to start from scratch; without any state (i.e. STATE == 0), then we
+   start at the top of the list. */
+char *
+command_generator (text, state)
+     const char *text;
+     int state;
+{
+  static int list_index, len;
+  char *name;
+
+  /* If this is a new word to complete, initialize now.  This includes
+     saving the length of TEXT for efficiency, and initializing the index
+     variable to 0. */
+  if (!state)
+    {
+      list_index = 0;
+      len = strlen (text);
+    }
+
+  /* Return the next name which partially matches from the command list. */
+  while (name = commands[list_index].name)
+    {
+      list_index++;
+
+      if (strncmp (name, text, len) == 0)
+        return (dupstr(name));
+    }
+
+  /* If no names matched, then return NULL. */
+  return ((char *)NULL);
+}
+
+/* **************************************************************** */
+/*                                                                  */
+/*                       FileMan Commands                           */
+/*                                                                  */
+/* **************************************************************** */
+
+/* String to pass to system ().  This is for the LIST, VIEW and RENAME
+   commands. */
+static char syscom[1024];
+
+/* List the file(s) named in arg. */
+com_list (arg)
+     char *arg;
+{
+  if (!arg)
+    arg = "";
+
+  sprintf (syscom, "ls -FClg %s", arg);
+  return (system (syscom));
+}
+
+com_view (arg)
+     char *arg;
+{
+  if (!valid_argument ("view", arg))
+    return 1;
+
+#if defined (__MSDOS__)
+  /* more.com doesn't grok slashes in pathnames */
+  sprintf (syscom, "less %s", arg);
+#else
+  sprintf (syscom, "more %s", arg);
+#endif
+  return (system (syscom));
+}
+
+com_rename (arg)
+     char *arg;
+{
+  too_dangerous ("rename");
+  return (1);
+}
+
+com_stat (arg)
+     char *arg;
+{
+  struct stat finfo;
+
+  if (!valid_argument ("stat", arg))
+    return (1);
+
+  if (stat (arg, &finfo) == -1)
+    {
+      perror (arg);
+      return (1);
+    }
+
+  printf ("Statistics for `%s':\n", arg);
+
+  printf ("%s has %d link%s, and is %d byte%s in length.\n",
+         arg,
+          finfo.st_nlink,
+          (finfo.st_nlink == 1) ? "" : "s",
+          finfo.st_size,
+          (finfo.st_size == 1) ? "" : "s");
+  printf ("Inode Last Change at: %s", ctime (&finfo.st_ctime));
+  printf ("      Last access at: %s", ctime (&finfo.st_atime));
+  printf ("    Last modified at: %s", ctime (&finfo.st_mtime));
+  return (0);
+}
+
+com_delete (arg)
+     char *arg;
+{
+  too_dangerous ("delete");
+  return (1);
+}
+
+/* Print out help for ARG, or for all of the commands if ARG is
+   not present. */
+com_help (arg)
+     char *arg;
+{
+  register int i;
+  int printed = 0;
+
+  for (i = 0; commands[i].name; i++)
+    {
+      if (!*arg || (strcmp (arg, commands[i].name) == 0))
+        {
+          printf ("%s\t\t%s.\n", commands[i].name, commands[i].doc);
+          printed++;
+        }
+    }
+
+  if (!printed)
+    {
+      printf ("No commands match `%s'.  Possibilties are:\n", arg);
+
+      for (i = 0; commands[i].name; i++)
+        {
+          /* Print in six columns. */
+          if (printed == 6)
+            {
+              printed = 0;
+              printf ("\n");
+            }
+
+          printf ("%s\t", commands[i].name);
+          printed++;
+        }
+
+      if (printed)
+        printf ("\n");
+    }
+  return (0);
+}
+
+/* Change to the directory ARG. */
+com_cd (arg)
+     char *arg;
+{
+  if (chdir (arg) == -1)
+    {
+      perror (arg);
+      return 1;
+    }
+
+  com_pwd ("");
+  return (0);
+}
+
+/* Print out the current working directory. */
+com_pwd (ignore)
+     char *ignore;
+{
+  char dir[1024], *s;
+
+  s = getcwd (dir, sizeof(dir) - 1);
+  if (s == 0)
+    {
+      printf ("Error getting pwd: %s\n", dir);
+      return 1;
+    }
+
+  printf ("Current directory is %s\n", dir);
+  return 0;
+}
+
+/* The user wishes to quit using this program.  Just set DONE non-zero. */
+com_quit (arg)
+     char *arg;
+{
+  done = 1;
+  return (0);
+}
+
+/* Function which tells you that you can't do this. */
+too_dangerous (caller)
+     char *caller;
+{
+  fprintf (stderr,
+           "%s: Too dangerous for me to distribute.  Write it yourself.\n",
+           caller);
+}
+
+/* Return non-zero if ARG is a valid argument for CALLER, else print
+   an error message and return zero. */
+int
+valid_argument (caller, arg)
+     char *caller, *arg;
+{
+  if (!arg || !*arg)
+    {
+      fprintf (stderr, "%s: Argument required.\n", caller);
+      return (0);
+    }
+
+  return (1);
+}
diff --git a/examples/histexamp.c b/examples/histexamp.c
new file mode 100644 (file)
index 0000000..4f059c1
--- /dev/null
@@ -0,0 +1,124 @@
+/* Copyright (C) 1987-2002 Free Software Foundation, Inc.
+
+   This file is part of the GNU Readline Library, a library for
+   reading lines of text with interactive input and history editing.
+
+   The GNU Readline Library 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.
+
+   The GNU Readline Library is distributed in the hope that it will be
+   useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+   of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   The GNU General Public License is often shipped with GNU software, and
+   is generally kept in a file called COPYING or LICENSE.  If you do not
+   have a copy of the license, write to the Free Software Foundation,
+   59 Temple Place, Suite 330, Boston, MA 02111 USA. */
+
+#include <stdio.h>
+
+#ifdef READLINE_LIBRARY
+#  include "history.h"
+#else
+#  include <readline/history.h>
+#endif
+
+#include <string.h>
+
+main (argc, argv)
+     int argc;
+     char **argv;
+{
+  char line[1024], *t;
+  int len, done;
+
+  line[0] = 0;
+  done = 0;
+
+  using_history ();
+  while (!done)
+    {
+      printf ("history$ ");
+      fflush (stdout);
+      t = fgets (line, sizeof (line) - 1, stdin);
+      if (t && *t)
+       {
+         len = strlen (t);
+         if (t[len - 1] == '\n')
+           t[len - 1] = '\0';
+       }
+
+      if (!t)
+       strcpy (line, "quit");
+
+      if (line[0])
+       {
+         char *expansion;
+         int result;
+
+         using_history ();
+
+         result = history_expand (line, &expansion);
+         if (result)
+           fprintf (stderr, "%s\n", expansion);
+
+         if (result < 0 || result == 2)
+           {
+             free (expansion);
+             continue;
+           }
+
+         add_history (expansion);
+         strncpy (line, expansion, sizeof (line) - 1);
+         free (expansion);
+       }
+
+      if (strcmp (line, "quit") == 0)
+       done = 1;
+      else if (strcmp (line, "save") == 0)
+       write_history ("history_file");
+      else if (strcmp (line, "read") == 0)
+       read_history ("history_file");
+      else if (strcmp (line, "list") == 0)
+       {
+         register HIST_ENTRY **the_list;
+         register int i;
+         time_t tt;
+         char timestr[128];
+
+         the_list = history_list ();
+         if (the_list)
+           for (i = 0; the_list[i]; i++)
+             {
+               tt = history_get_time (the_list[i]);
+               if (tt)
+                 strftime (timestr, sizeof (timestr), "%a %R", localtime(&tt));
+               else
+                 strcpy (timestr, "??");
+               printf ("%d: %s: %s\n", i + history_base, timestr, the_list[i]->line);
+             }
+       }
+      else if (strncmp (line, "delete", 6) == 0)
+       {
+         int which;
+         if ((sscanf (line + 6, "%d", &which)) == 1)
+           {
+             HIST_ENTRY *entry = remove_history (which);
+             if (!entry)
+               fprintf (stderr, "No such entry %d\n", which);
+             else
+               {
+                 free (entry->line);
+                 free (entry);
+               }
+           }
+         else
+           {
+             fprintf (stderr, "non-numeric arg given to `delete'\n");
+           }
+       }
+    }
+}
diff --git a/examples/manexamp.c b/examples/manexamp.c
new file mode 100644 (file)
index 0000000..9c6cf2c
--- /dev/null
@@ -0,0 +1,112 @@
+/* manexamp.c -- The examples which appear in the documentation are here. */
+
+/* Copyright (C) 1987-2002 Free Software Foundation, Inc.
+
+   This file is part of the GNU Readline Library, a library for
+   reading lines of text with interactive input and history editing.
+
+   The GNU Readline Library 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.
+
+   The GNU Readline Library is distributed in the hope that it will be
+   useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+   of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   The GNU General Public License is often shipped with GNU software, and
+   is generally kept in a file called COPYING or LICENSE.  If you do not
+   have a copy of the license, write to the Free Software Foundation,
+   59 Temple Place, Suite 330, Boston, MA 02111 USA. */
+
+#include <stdio.h>
+#include <readline/readline.h>
+
+/* **************************************************************** */
+/*                                                                  */
+/*                     How to Emulate gets ()                      */
+/*                                                                  */
+/* **************************************************************** */
+
+/* A static variable for holding the line. */
+static char *line_read = (char *)NULL;
+
+/* Read a string, and return a pointer to it.  Returns NULL on EOF. */
+char *
+rl_gets ()
+{
+  /* If the buffer has already been allocated, return the memory
+     to the free pool. */
+  if (line_read)
+    {
+      free (line_read);
+      line_read = (char *)NULL;
+    }
+
+  /* Get a line from the user. */
+  line_read = readline ("");
+
+  /* If the line has any text in it, save it on the history. */
+  if (line_read && *line_read)
+    add_history (line_read);
+
+  return (line_read);
+}
+
+/* **************************************************************** */
+/*                                                                  */
+/*        Writing a Function to be Called by Readline.              */
+/*                                                                  */
+/* **************************************************************** */
+
+/* Invert the case of the COUNT following characters. */
+invert_case_line (count, key)
+     int count, key;
+{
+  register int start, end;
+
+  start = rl_point;
+
+  if (count < 0)
+    {
+      direction = -1;
+      count = -count;
+    }
+  else
+    direction = 1;
+      
+  /* Find the end of the range to modify. */
+  end = start + (count * direction);
+
+  /* Force it to be within range. */
+  if (end > rl_end)
+    end = rl_end;
+  else if (end < 0)
+    end = -1;
+
+  if (start > end)
+    {
+      int temp = start;
+      start = end;
+      end = temp;
+    }
+
+  if (start == end)
+    return;
+
+  /* Tell readline that we are modifying the line, so save the undo
+     information. */
+  rl_modifying (start, end);
+
+  for (; start != end; start += direction)
+    {
+      if (_rl_uppercase_p (rl_line_buffer[start]))
+       rl_line_buffer[start] = _rl_to_lower (rl_line_buffer[start]);
+      else if (_rl_lowercase_p (rl_line_buffer[start]))
+       rl_line_buffer[start] = _rl_to_upper (rl_line_buffer[start]);
+    }
+
+  /* Move point to on top of the last character changed. */
+  rl_point = end - direction;
+}
diff --git a/examples/readlinebuf.h b/examples/readlinebuf.h
new file mode 100644 (file)
index 0000000..a8af52c
--- /dev/null
@@ -0,0 +1,139 @@
+/*******************************************************************************
+ * $Revision: 1.2 $
+ * $Date: 2001/09/11 06:19:36 $
+ * $Author: vyzo $
+ *
+ * Contents: A streambuf which uses the GNU readline library for line I/O
+ * (c) 2001 by Dimitris Vyzovitis [vyzo@media.mit.edu]
+ *
+ * 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
+ *
+ ******************************************************************************/
+
+#ifndef _READLINEBUF_H_
+#define _READLINEBUF_H_
+
+#include <iostream>
+#include <cstring>
+#include <cassert>
+#include <cstdlib>
+#include <cstdio>
+
+#include <readline/readline.h>
+#include <readline/history.h>
+
+#if (defined __GNUC__) && (__GNUC__ < 3)
+#include <streambuf.h>
+#else
+#include <streambuf>
+using std::streamsize;
+using std::streambuf;
+#endif
+
+class readlinebuf : public streambuf {
+public:
+#if (defined __GNUC__) && (__GNUC__ < 3)
+       typedef char char_type;
+       typedef int int_type;
+       typedef streampos pos_type;
+       typedef streamoff off_type;
+#endif
+       static const int_type eof = EOF; // this is -1
+       static const int_type not_eof = 0;
+
+private:
+       const char* prompt_;
+       bool history_;
+       char* line_;
+       int low_;
+       int high_;
+
+protected:
+               
+       virtual int_type showmanyc() const { return high_ - low_; }
+               
+       virtual streamsize xsgetn( char_type* buf, streamsize n ) {
+               int rd = n > (high_ - low_)? (high_ - low_) : n;
+               memcpy( buf, line_, rd );
+               low_ += rd;
+                       
+               if ( rd < n ) {
+                       low_ = high_ = 0;
+                       free( line_ ); // free( NULL ) is a noop
+                       line_ = readline( prompt_ );
+                       if ( line_ ) {
+                               high_ = strlen( line_ );
+                               if ( history_ && high_ ) add_history( line_ );
+                               rd += xsgetn( buf + rd, n - rd );
+                       }
+               }
+                       
+               return rd; 
+       }
+               
+       virtual int_type underflow() {
+               if ( high_ == low_ ) {
+                       low_ = high_ = 0;
+                       free( line_ ); // free( NULL ) is a noop
+                       line_ = readline( prompt_ );
+                       if ( line_ ) {
+                               high_ = strlen( line_ );
+                               if ( history_ && high_ ) add_history( line_ );
+                       }
+               }
+                       
+               if ( low_ < high_ ) return line_[low_];
+               else return eof;
+       }
+               
+       virtual int_type uflow() {
+               int_type c = underflow();
+               if ( c != eof ) ++low_;
+               return c;
+       }
+               
+       virtual int_type pbackfail( int_type c = eof ) {
+               if ( low_ > 0 ) --low_;
+               else if ( c != eof ) {
+                       if ( high_ > 0 ) {
+                               char* nl = (char*)realloc( line_, high_ + 1 );
+                               if ( nl ) {
+                                       line_ = (char*)memcpy( nl + 1, line_, high_ );
+                                       high_ += 1;
+                                       line_[0] = char( c );
+                               } else return eof;
+                       } else {
+                               assert( !line_ );
+                               line_ = (char*)malloc( sizeof( char ) );
+                               *line_ = char( c );
+                               high_ = 1;
+                       }
+               } else return eof;
+
+               return not_eof;
+       }
+               
+public:
+       readlinebuf( const char* prompt = NULL, bool history = true ) 
+               : prompt_( prompt ), history_( history ),
+                 line_( NULL ), low_( 0 ), high_( 0 ) {
+               setbuf( 0, 0 );
+       }
+               
+               
+};
+
+#endif
diff --git a/examples/rl-fgets.c b/examples/rl-fgets.c
new file mode 100644 (file)
index 0000000..5512b94
--- /dev/null
@@ -0,0 +1,374 @@
+/*
+Date: Tue, 16 Mar 2004 19:38:40 -0800
+From: Harold Levy <Harold.Levy@synopsys.com>
+Subject: fgets(stdin) --> readline() redirector
+To: chet@po.cwru.edu
+
+Hi Chet,
+
+Here is something you may find useful enough to include in the readline
+distribution.  It is a shared library that redirects calls to fgets(stdin)
+to readline() via LD_PRELOAD, and it supports a custom prompt and list of
+command names.  Many people have asked me for this file, so I thought I'd
+pass it your way in hope of just including it with readline to begin with.
+
+Best Regards,
+
+-Harold
+*/
+
+/******************************************************************************
+*******************************************************************************
+  
+  FILE NAME:    fgets.c                  TARGET:   libfgets.so
+  AUTHOR:       Harold Levy              VERSION:  1.0
+                hlevy@synopsys.com
+  
+  ABSTRACT:  Customize fgets() behavior via LD_PRELOAD in the following ways:
+  
+    -- If fgets(stdin) is called, redirect to GNU readline() to obtain
+       command-line editing, file-name completion, history, etc.
+  
+    -- A list of commands for command-name completion can be configured by
+       setting the environment-variable FGETS_COMMAND_FILE to a file containing
+       the list of commands to be used.
+  
+    -- Command-line editing with readline() works best when the prompt string
+       is known; you can set this with the FGETS_PROMPT environment variable.
+  
+    -- There special strings that libfgets will interpret as internal commands:
+  
+           _fgets_reset_    reset the command list
+  
+           _fgets_dump_     dump status
+  
+           _fgets_debug_    toggle debug messages
+
+  HOW TO BUILD:  Here are examples of how to build libfgets.so on various
+  platforms; you will have to add -I and -L flags to configure access to
+  the readline header and library files.
+
+  (32-bit builds with gcc)
+  AIX:   gcc -fPIC fgets.c -shared -o libfgets.so -lc -ldl -lreadline -ltermcap
+  HP-UX: gcc -fPIC fgets.c -shared -o libfgets.so -lc -ldld -lreadline
+  Linux: gcc -fPIC fgets.c -shared -o libfgets.so -lc -ldl -lreadline
+  SunOS: gcc -fPIC fgets.c -shared -o libfgets.so -lc -ldl -lgen -lreadline
+
+  (64-bit builds without gcc)
+  SunOS: SUNWspro/bin/cc -D_LARGEFILE64_SOURCE=1 -xtarget=ultra -xarch=v9 \
+           -KPIC fgets.c -Bdynamic -lc -ldl -lgen -ltermcap -lreadline
+  
+  HOW TO USE:  Different operating systems have different levels of support
+  for the LD_PRELOAD concept.  The generic method for 32-bit platforms is to
+  put libtermcap.so, libfgets.so, and libreadline.so (with absolute paths)
+  in the LD_PRELOAD environment variable, and to put their parent directories
+  in the LD_LIBRARY_PATH environment variable.  Unfortunately there is no
+  generic method for 64-bit platforms; e.g. for 64-bit SunOS, you would have
+  to build both 32-bit and 64-bit libfgets and libreadline libraries, and
+  use the LD_FLAGS_32 and LD_FLAGS_64 environment variables with preload and
+  library_path configurations (a mix of 32-bit and 64-bit calls are made under
+  64-bit SunOS).
+  
+  EXAMPLE WRAPPER:  Here is an example shell script wrapper around the
+  program "foo" that uses fgets() for command-line input:
+
+      #!/bin/csh
+      #### replace this with the libtermcap.so directory:
+      set dir1 = "/usr/lib"
+      #### replace this with the libfgets.so directory:
+      set dir2 = "/usr/fgets"
+      #### replace this with the libreadline.so directory:
+      set dir3 = "/usr/local/lib"
+      set lib1 = "${dir1}/libtermcap.so"
+      set lib2 = "${dir2}/libfgets.so"
+      set lib3 = "${dir3}/libreadline.so"
+      if ( "${?LD_PRELOAD}" ) then
+        setenv LD_PRELOAD "${lib1}:${lib2}:${lib3}:${LD_PRELOAD}"
+      else
+        setenv LD_PRELOAD "${lib1}:${lib2}:${lib3}"
+      endif
+      if ( "${?LD_LIBRARY_PATH}" ) then
+        setenv LD_LIBRARY_PATH "${dir1}:${dir2}:${dir3}:${LD_LIBRARY_PATH}"
+      else
+        setenv LD_LIBRARY_PATH "${dir1}:${dir2}:${dir3}"
+      endif
+      setenv FGETS_COMMAND_FILE "${dir2}/foo.commands"
+      setenv FGETS_PROMPT       "foo> "
+      exec "foo" $*
+  
+  Copyright (C)©2003-2004 Harold Levy.
+  
+  This code links to the GNU readline library, and as such is bound by 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.
+  
+  The GNU General Public License is often shipped with GNU software, and is
+  generally kept in a file called COPYING or LICENSE.  If you do not have a
+  copy of the license, write to the Free Software Foundation, 59 Temple Place,
+  Suite 330, Boston, MA 02111 USA.
+  
+  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.
+  
+*******************************************************************************
+******************************************************************************/
+
+
+\f
+#include <dlfcn.h>
+#include <stdio.h>
+#include <strings.h>
+#include <stdlib.h>
+#include <unistd.h>
+
+#include <readline/readline.h>
+#include <readline/history.h>
+
+
+\f
+/* for dynamically connecting to the native fgets() */
+#if defined(RTLD_NEXT)
+#define REAL_LIBC RTLD_NEXT
+#else
+#define REAL_LIBC ((void *) -1L)
+#endif
+typedef char * ( * fgets_t ) ( char * s, int n, FILE * stream ) ;
+
+
+\f
+/* private data */
+/* -- writeable data is stored in the shared library's data segment
+   -- every process that uses the shared library gets a private memory copy of
+      its entire data segment
+   -- static data in the shared library is not copied to the application
+   -- only read-only (i.e. 'const') data is stored in the shared library's
+      text segment
+*/
+static char ** my_fgets_names           = NULL ;
+static int     my_fgets_number_of_names = 0    ;
+static int     my_fgets_debug_flag      = 0    ;
+
+
+\f
+/* invoked with _fgets_reset_ */
+static void
+my_fgets_reset (
+  void
+) {
+  if ( my_fgets_names && (my_fgets_number_of_names > 0) ) {
+    int i ;
+    if ( my_fgets_debug_flag ) {
+      printf ( "libfgets:  removing command list\n" ) ;
+    }
+    for ( i = 0 ; i < my_fgets_number_of_names ; i ++ ) {
+      if ( my_fgets_names[i] ) free ( my_fgets_names[i] ) ;
+    }
+    free ( my_fgets_names ) ;
+  }
+  my_fgets_names = NULL ;
+  my_fgets_number_of_names = 0 ;
+}
+
+
+\f
+/* invoked with _fgets_dump_ */
+static void
+my_fgets_dump (
+  void
+) {
+  char * s ;
+  printf ( "\n" ) ;
+  s = getenv ( "FGETS_PROMPT" ) ;
+  printf ( "FGETS_PROMPT       = %s\n", s ? s : "" ) ;
+  s = getenv ( "FGETS_COMMAND_FILE" ) ;
+  printf ( "FGETS_COMMAND_FILE = %s\n", s ? s : "" ) ;
+  printf ( "debug flag         = %d\n", my_fgets_debug_flag ) ;
+  printf ( "#commands          = %d\n", my_fgets_number_of_names ) ;
+  if ( my_fgets_debug_flag ) {
+    if ( my_fgets_names && (my_fgets_number_of_names > 0) ) {
+      int i ;
+      for ( i = 0 ; i < my_fgets_number_of_names ; i ++ ) {
+        printf ( "%s\n", my_fgets_names[i] ) ;
+      }
+    }
+  }
+  printf ( "\n" ) ;
+}
+
+
+\f
+/* invoked with _fgets_debug_ */
+static void
+my_fgets_debug_toggle (
+  void
+) {
+  my_fgets_debug_flag = my_fgets_debug_flag ? 0 : 1 ;
+  if ( my_fgets_debug_flag ) {
+    printf ( "libfgets:  debug flag = %d\n", my_fgets_debug_flag ) ;
+  }
+}
+
+
+\f
+/* read the command list if needed, return the i-th name */
+static char *
+my_fgets_lookup (
+  int index
+) {
+  if ( (! my_fgets_names) || (! my_fgets_number_of_names) ) {
+    char * fname ;
+    FILE * fp ;
+    fgets_t _fgets ;
+    int i ;
+    char buf1[256], buf2[256] ;
+    fname = getenv ( "FGETS_COMMAND_FILE" ) ;
+    if ( ! fname ) {
+      if ( my_fgets_debug_flag ) {
+        printf ( "libfgets:  empty or unset FGETS_COMMAND_FILE\n" ) ;
+      }
+      return NULL ;
+    }
+    fp = fopen ( fname, "r" ) ;
+    if ( ! fp ) {
+      if ( my_fgets_debug_flag ) {
+        printf ( "libfgets:  cannot open '%s' for reading\n", fname ) ;
+      }
+      return NULL ;
+    }
+    _fgets = (fgets_t) dlsym ( REAL_LIBC, "fgets" ) ;
+    if ( ! _fgets ) {
+      fprintf ( stderr,
+        "libfgets:  failed to dynamically link to native fgets()\n"
+      ) ;
+      return NULL ;
+    }
+    for ( i = 0 ; _fgets(buf1,255,fp) ; i ++ ) ;
+    if ( ! i ) { fclose(fp) ; return NULL ; }
+    my_fgets_names = (char**) calloc ( i, sizeof(char*) ) ;
+    rewind ( fp ) ;
+    i = 0 ;
+    while ( _fgets(buf1,255,fp) ) {
+      buf1[255] = 0 ;
+      if ( 1 == sscanf(buf1,"%s",buf2) ) {
+        my_fgets_names[i] = strdup(buf2) ;
+        i ++ ;
+      }
+    }
+    fclose ( fp ) ;
+    my_fgets_number_of_names = i ;
+    if ( my_fgets_debug_flag ) {
+      printf ( "libfgets:  successfully read %d commands\n", i ) ;
+    }
+  }
+  if ( index < my_fgets_number_of_names ) {
+    return my_fgets_names[index] ;
+  } else {
+    return NULL ;
+  }
+}
+
+
+\f
+/* generate a list of partial name matches for readline() */
+static char *
+my_fgets_generator (
+  const char * text,
+  int          state
+)
+{
+  static int list_index, len ;
+  char *     name ;
+  if ( ! state ) {
+    list_index = 0 ;
+    len = strlen ( text ) ;
+  }
+  while ( ( name = my_fgets_lookup(list_index) ) ) {
+    list_index ++ ;
+    if ( ! strncmp ( name, text, len ) ) {
+      return ( strdup ( name ) ) ;
+    }
+  }
+  return ( NULL ) ;
+}
+
+
+\f
+/* partial name completion callback for readline() */
+static char **
+my_fgets_completion (
+  const char * text,
+  int          start,
+  int          end
+)
+{
+  char ** matches ;
+  matches = NULL ;
+  if ( ! start ) {
+    matches = rl_completion_matches ( text, my_fgets_generator ) ;
+  }
+  return ( matches ) ;
+}
+
+
+\f
+/* fgets() intercept */
+char *
+fgets (
+  char * s,
+  int    n,
+  FILE * stream
+)
+{
+  if ( ! s ) return NULL ;
+  if ( stream == stdin ) {
+    char * prompt ;
+    char * my_fgets_line ;
+    rl_already_prompted = 1 ;
+    rl_attempted_completion_function = my_fgets_completion ;
+    rl_catch_signals = 1 ;
+    rl_catch_sigwinch = 1 ;
+    rl_set_signals () ;
+    prompt = getenv ( "FGETS_PROMPT" ) ;
+    for (
+      my_fgets_line = 0 ; ! my_fgets_line ; my_fgets_line=readline(prompt)
+    ) ;
+    if ( ! strncmp(my_fgets_line, "_fgets_reset_", 13) ) {
+      my_fgets_reset () ;
+      free ( my_fgets_line ) ;
+      strcpy ( s, "\n" ) ;
+      return ( s ) ;
+    }
+    if ( ! strncmp(my_fgets_line, "_fgets_dump_", 12) ) {
+      my_fgets_dump () ;
+      free ( my_fgets_line ) ;
+      strcpy ( s, "\n" ) ;
+      return ( s ) ;
+    }
+    if ( ! strncmp(my_fgets_line, "_fgets_debug_", 13) ) {
+      my_fgets_debug_toggle () ;
+      free ( my_fgets_line ) ;
+      strcpy ( s, "\n" ) ;
+      return ( s ) ;
+    }
+    (void) strncpy ( s, my_fgets_line, n-1 ) ;
+    (void) strcat ( s, "\n" ) ;
+    if ( *my_fgets_line ) add_history ( my_fgets_line ) ;
+    free ( my_fgets_line ) ;
+    return ( s ) ;
+  } else {
+    static fgets_t _fgets ;
+    _fgets = (fgets_t) dlsym ( REAL_LIBC, "fgets" ) ;
+    if ( ! _fgets ) {
+      fprintf ( stderr,
+        "libfgets:  failed to dynamically link to native fgets()\n"
+      ) ;
+      strcpy ( s, "\n" ) ;
+      return ( s ) ;
+    }
+    return (
+      _fgets ( s, n, stream )
+    ) ;
+  }
+}
diff --git a/examples/rl.c b/examples/rl.c
new file mode 100644 (file)
index 0000000..c608c15
--- /dev/null
@@ -0,0 +1,158 @@
+/*
+ * rl - command-line interface to read a line from the standard input
+ *      (or another fd) using readline.
+ *
+ * usage: rl [-p prompt] [-u unit] [-d default] [-n nchars]
+ */
+
+/* Copyright (C) 1987-2002 Free Software Foundation, Inc.
+
+   This file is part of the GNU Readline Library, a library for
+   reading lines of text with interactive input and history editing.
+
+   The GNU Readline Library 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.
+
+   The GNU Readline Library is distributed in the hope that it will be
+   useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+   of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   The GNU General Public License is often shipped with GNU software, and
+   is generally kept in a file called COPYING or LICENSE.  If you do not
+   have a copy of the license, write to the Free Software Foundation,
+   59 Temple Place, Suite 330, Boston, MA 02111 USA. */
+
+#if defined (HAVE_CONFIG_H)
+#  include <config.h>
+#endif
+
+#include <stdio.h>
+#include <sys/types.h>
+
+#ifdef HAVE_STDLIB_H
+#  include <stdlib.h>
+#else 
+extern void exit();
+#endif
+
+#if defined (READLINE_LIBRARY)
+#  include "posixstat.h"
+#  include "readline.h"
+#  include "history.h"
+#else
+#  include <sys/stat.h>
+#  include <readline/readline.h>
+#  include <readline/history.h>
+#endif
+
+extern int optind;
+extern char *optarg;
+
+#if !defined (strchr) && !defined (__STDC__)
+extern char *strrchr();
+#endif
+
+static char *progname;
+static char *deftext;
+
+static int
+set_deftext ()
+{
+  if (deftext)
+    {
+      rl_insert_text (deftext);
+      deftext = (char *)NULL;
+      rl_startup_hook = (rl_hook_func_t *)NULL;
+    }
+  return 0;
+}
+
+static void
+usage()
+{
+  fprintf (stderr, "%s: usage: %s [-p prompt] [-u unit] [-d default] [-n nchars]\n",
+               progname, progname);
+}
+
+int
+main (argc, argv)
+     int argc;
+     char **argv;
+{
+  char *temp, *prompt;
+  struct stat sb;
+  int opt, fd, nch;
+  FILE *ifp;
+
+  progname = strrchr(argv[0], '/');
+  if (progname == 0)
+    progname = argv[0];
+  else
+    progname++;
+
+  /* defaults */
+  prompt = "readline$ ";
+  fd = nch = 0;
+  deftext = (char *)0;
+
+  while ((opt = getopt(argc, argv, "p:u:d:n:")) != EOF)
+    {
+      switch (opt)
+       {
+       case 'p':
+         prompt = optarg;
+         break;
+       case 'u':
+         fd = atoi(optarg);
+         if (fd < 0)
+           {
+             fprintf (stderr, "%s: bad file descriptor `%s'\n", progname, optarg);
+             exit (2);
+           }
+         break;
+       case 'd':
+         deftext = optarg;
+         break;
+       case 'n':
+         nch = atoi(optarg);
+         if (nch < 0)
+           {
+             fprintf (stderr, "%s: bad value for -n: `%s'\n", progname, optarg);
+             exit (2);
+           }
+         break;
+       default:
+         usage ();
+         exit (2);
+       }
+    }
+
+  if (fd != 0)
+    {
+      if (fstat (fd, &sb) < 0)
+       {
+         fprintf (stderr, "%s: %d: bad file descriptor\n", progname, fd);
+         exit (1);
+       }
+      ifp = fdopen (fd, "r");
+      rl_instream = ifp;
+    }
+
+  if (deftext && *deftext)
+    rl_startup_hook = set_deftext;
+
+  if (nch > 0)
+    rl_num_chars_to_read = nch;
+
+  temp = readline (prompt);
+
+  /* Test for EOF. */
+  if (temp == 0)
+    exit (1);
+
+  printf ("%s\n", temp);
+  exit (0);
+}
diff --git a/examples/rlcat.c b/examples/rlcat.c
new file mode 100644 (file)
index 0000000..33aea4a
--- /dev/null
@@ -0,0 +1,180 @@
+/*
+ * rlcat - cat(1) using readline
+ *
+ * usage: rlcat
+ */
+
+/* Copyright (C) 1987-2002 Free Software Foundation, Inc.
+
+   This file is part of the GNU Readline Library, a library for
+   reading lines of text with interactive input and history editing.
+
+   The GNU Readline Library 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.
+
+   The GNU Readline Library is distributed in the hope that it will be
+   useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+   of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   The GNU General Public License is often shipped with GNU software, and
+   is generally kept in a file called COPYING or LICENSE.  If you do not
+   have a copy of the license, write to the Free Software Foundation,
+   59 Temple Place, Suite 330, Boston, MA 02111 USA. */
+
+#if defined (HAVE_CONFIG_H)
+#  include <config.h>
+#endif
+
+#ifdef HAVE_UNISTD_H
+#  include <unistd.h>
+#endif
+
+#include <sys/types.h>
+#include "posixstat.h"
+
+#include <stdio.h>
+#include <ctype.h>
+#include <string.h>
+#include <errno.h>
+
+#ifdef HAVE_STDLIB_H
+#  include <stdlib.h>
+#else 
+extern void exit();
+#endif
+
+#ifndef errno
+extern int errno;
+#endif
+
+#if defined (READLINE_LIBRARY)
+#  include "readline.h"
+#  include "history.h"
+#else
+#  include <readline/readline.h>
+#  include <readline/history.h>
+#endif
+
+extern int optind;
+extern char *optarg;
+
+static int stdcat();
+
+static char *progname;
+static int vflag;
+
+static void
+usage()
+{
+  fprintf (stderr, "%s: usage: %s [-vEVN] [filename]\n", progname, progname);
+}
+
+int
+main (argc, argv)
+     int argc;
+     char **argv;
+{
+  char *temp;
+  int opt, Vflag, Nflag;
+
+  progname = strrchr(argv[0], '/');
+  if (progname == 0)
+    progname = argv[0];
+  else
+    progname++;
+
+  vflag = Vflag = Nflag = 0;
+  while ((opt = getopt(argc, argv, "vEVN")) != EOF)
+    {
+      switch (opt)
+       {
+       case 'v':
+         vflag = 1;
+         break;
+       case 'V':
+         Vflag = 1;
+         break;
+       case 'E':
+         Vflag = 0;
+         break;
+       case 'N':
+         Nflag = 1;
+         break;
+       default:
+         usage ();
+         exit (2);
+       }
+    }
+
+  argc -= optind;
+  argv += optind;
+
+  if (isatty(0) == 0 || argc || Nflag)
+    return stdcat(argc, argv);
+
+  rl_variable_bind ("editing-mode", Vflag ? "vi" : "emacs");
+  while (temp = readline (""))
+    {
+      if (*temp)
+        add_history (temp);
+      printf ("%s\n", temp);
+    }
+
+  return (ferror (stdout));
+}
+
+static int
+fcopy(fp)
+     FILE *fp;
+{
+  int c;
+  char *x;
+
+  while ((c = getc(fp)) != EOF)
+    {
+      if (vflag && isascii ((unsigned char)c) && isprint((unsigned char)c) == 0)
+       {
+         x = rl_untranslate_keyseq (c);
+         if (fputs (x, stdout) != 0)
+           return 1;
+       }
+      else if (putchar (c) == EOF)
+        return 1;
+    }
+  return (ferror (stdout));
+}
+
+int
+stdcat (argc, argv)
+     int argc;
+     char **argv;
+{
+  int  i, fd, r;
+  char *s;
+  FILE *fp;
+
+  if (argc == 0)
+    return (fcopy(stdin));
+
+  for (i = 0, r = 1; i < argc; i++)
+    {
+      if (*argv[i] == '-' && argv[i][1] == 0)
+       fp = stdin;
+      else
+       {
+         fp = fopen (argv[i], "r");
+         if (fp == 0)
+           {
+             fprintf (stderr, "%s: %s: cannot open: %s\n", progname, argv[i], strerror(errno));
+             continue;
+           }
+        }
+      r = fcopy (fp);
+      if (fp != stdin)
+       fclose(fp);
+    }
+  return r;
+}
diff --git a/examples/rlfe/ChangeLog b/examples/rlfe/ChangeLog
new file mode 100644 (file)
index 0000000..ba41b2b
--- /dev/null
@@ -0,0 +1,37 @@
+2004-11-04  Per Bothner  <per@bothner.com>
+
+       * pty.c:  Import from screen-4.0.2.
+       * configure.in, Makefile.in, config.h.in:  Set up autoconf handling,
+       copying a bunk of stuff over from screen.
+       * rlfe.c:  Use OpenPTY from pty.c instead of get_master_pty.
+
+2004-11-03  Per Bothner  <per@bothner.com>
+
+       * rlfe.c:  Get input emphasis (boldening) more robust.
+
+       * rlfe.c:  Various cleanups on comments and names.
+
+2003-11-07 Wolfgang Taeuber <wolfgang_taeuber@agilent.com>
+
+       * Specify a history file and the size of the history file with command
+       * line options; use EDITOR/VISUAL to set vi/emacs preference.
+
+1999-09-03  Chet Ramey <chet@nike.ins.cwru.edu>
+
+       * fep.c: Memmove is not universally available.  This patch assumes
+       that an autoconf test has been performed, and that memcpy is
+       available without checking.
+
+       * fep.c: VDISCARD is not universally available, even when termios is.
+
+       * fep.c: If a system doesn't have TIOCSCTTY, the first `open'
+       performed after setsid allocates a controlling terminal.  The
+       original code would leave the child process running on the slave pty
+       without a controlling tty if TIOCSCTTY was not available.
+
+       * fep.c: Most versions of SVR4, including solaris, don't allow
+       terminal ioctl calls on the master side of the pty.
+
+1999-08-28  Per Bothner  <per@bothner.com>
+
+       * fep.c:  Initial release.
diff --git a/examples/rlfe/Makefile.in b/examples/rlfe/Makefile.in
new file mode 100644 (file)
index 0000000..70aa6b3
--- /dev/null
@@ -0,0 +1,176 @@
+#
+# Makefile template for rlfe 
+#
+# See machine dependant config.h for more configuration options.
+#
+
+srcdir = @srcdir@
+VPATH = @srcdir@
+
+DESTDIR = 
+
+# Where to install screen.
+
+prefix = @prefix@
+exec_prefix = @exec_prefix@
+
+# don't forget to change mandir and infodir in doc/Makefile.
+bindir  = $(exec_prefix)/bin
+
+VERSION = @VERSION@
+SCREEN = screen-$(VERSION)
+
+CC = @CC@
+CFLAGS = @CFLAGS@
+CPPFLAGS = @CPPFLAGS@
+#LDFLAGS = -L$(READLINE_DIR)
+LDFLAGS = @LDFLAGS@
+LIBS = -lreadline -lhistory -lncurses @LIBS@
+
+CPP=@CPP@
+CPP_DEPEND=$(CC) -MM
+
+INSTALL = @INSTALL@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_DATA = @INSTALL_DATA@
+
+AWK = @AWK@
+
+OPTIONS=
+#OPTIONS= -DDEBUG
+
+SHELL=/bin/sh
+
+CFILES=        rlfe.c pty.c
+HFILES= extern.h os.h screen.h
+EXTRA_DIST=configure.in configure Makefile.in config.h.in ChangeLog README
+OFILES=        rlfe.o pty.o
+
+all:   rlfe
+
+rlfe: $(OFILES)
+       $(CC) $(LDFLAGS) -o $@ $(OFILES) $(LIBS)
+
+rlfe-$(VERSION).tar.gz:
+       tar czf $@ $(CFILES) $(HFILES) $(EXTRA_DIST)
+
+.c.o:
+       $(CC) -c -I. -I$(srcdir) $(M_CFLAGS) $(DEFS) $(OPTIONS) $(CFLAGS) $<
+
+install_bin: .version screen
+       -if [ -f $(DESTDIR)$(bindir)/$(SCREEN) ] && [ ! -f $(DESTDIR)$(bindir)/$(SCREEN).old ]; \
+               then mv $(DESTDIR)$(bindir)/$(SCREEN) $(DESTDIR)$(bindir)/$(SCREEN).old; fi
+       $(INSTALL_PROGRAM) screen $(DESTDIR)$(bindir)/$(SCREEN)
+       -chown root $(DESTDIR)$(bindir)/$(SCREEN) && chmod 4755 $(DESTDIR)$(bindir)/$(SCREEN)
+# This doesn't work if $(bindir)/screen is a symlink
+       -if [ -f $(DESTDIR)$(bindir)/screen ] && [ ! -f $(DESTDIR)$(bindir)/screen.old ]; then mv $(DESTDIR)$(bindir)/screen $(DESTDIR)$(bindir)/screen.old; fi
+       rm -f $(DESTDIR)$(bindir)/screen
+       (cd $(DESTDIR)$(bindir) && ln -sf $(SCREEN) screen)
+       cp $(srcdir)/utf8encodings/?? $(DESTDIR)$(SCREENENCODINGS)
+
+
+uninstall: .version
+       rm -f $(DESTDIR)$(bindir)/$(SCREEN)
+       rm -f $(DESTDIR)$(bindir)/screen
+       -mv $(DESTDIR)$(bindir)/screen.old $(DESTDIR)$(bindir)/screen
+       rm -f $(DESTDIR)$(ETCSCREENRC)
+       cd doc; $(MAKE) uninstall
+
+shadow:
+       mkdir shadow;
+       cd shadow; ln -s ../*.[ch] ../*.in ../*.sh ../configure ../doc ../terminfo ../etc .
+       rm -f shadow/term.h shadow/tty.c shadow/comm.h shadow/osdef.h
+       echo "install all Makefiles and config:" > shadow/Makefile
+       echo "  rm -f config.cache" >> shadow/Makefile
+       echo "  sh ./configure" >> shadow/Makefile
+
+term.h: term.c term.sh
+       AWK=$(AWK) srcdir=$(srcdir) sh $(srcdir)/term.sh
+
+kmapdef.c: term.h
+
+tty.c: tty.sh 
+       sh $(srcdir)/tty.sh tty.c
+
+mostlyclean:
+       rm -f $(OFILES) rlfe *.o
+
+clean celan: mostlyclean
+       rm -f tty.c term.h comm.h osdef.h kmapdef.c core
+
+# Delete all files from the current directory that are created by 
+# configuring or building the program.
+# building of term.h/comm.h requires awk. Keep it in the distribution
+# we keep config.h, as this file knows where 'make dist' finds the ETCSCREENRC.
+#distclean:    mostlyclean
+#      rm -f $(SCREEN).tar $(SCREEN).tar.gz
+#      rm -f config.status Makefile
+#      rm -f osdef.h doc/Makefile
+
+maintainer-clean:
+       @echo "This command is not even intended for maintainers to use;"
+       @echo "it deletes files that may require special tools to rebuild."
+
+
+# Delete everything from the current directory that can be
+# reconstructed with this Makefile.
+realclean: .version mostlyclean
+       rm -f $(SCREEN).tar $(SCREEN).tar.gz
+       rm -f config.status Makefile doc/Makefile
+       rm -f tty.c term.h comm.h osdef.h kmapdef.c
+       rm -f config.h
+       echo "install all Makefiles and config:" > Makefile
+       echo "  sh ./configure" >> Makefile
+
+tags TAGS: $(CFILES)
+       -ctags    *.sh $(CFILES) *.h
+       -ctags -e *.sh $(CFILES) *.h
+
+dist: .version $(SCREEN).tar.gz
+
+
+# Perform self-tests (if any).
+check:
+
+config:
+       rm -f config.cache
+       sh ./configure
+
+
+###############################################################################
+
+.version:
+       @rev=`sed < $(srcdir)/patchlevel.h -n -e '/#define REV/s/#define REV  *//p'`; \
+       vers=`sed < $(srcdir)/patchlevel.h -n -e '/#define VERS/s/#define VERS  *//p'`; \
+       pat=`sed < $(srcdir)/patchlevel.h -n -e '/#define PATCHLEVEL/s/#define PATCHLEVEL  *//p'`; \
+       if [ "$${rev}.$${vers}.$${pat}" != "$(VERSION)" ]; then \
+       echo "This distribution is screen-$${rev}.$${vers}.$${pat}, but"; \
+       echo "the Makefile is from $(VERSION). Please update!"; exit 1; fi
+
+###############################################################################
+
+mdepend: $(CFILES) term.h
+       @rm -f DEPEND ; \
+       for i in ${CFILES} ; do \
+         echo "$$i" ; \
+         echo `echo "$$i" | sed -e 's/.c$$/.o/'`": $$i" `\
+            cc -E $$i |\
+            grep '^# .*"\./.*\.h"' |\
+            (sort -t'"' -u -k 2,2 2>/dev/null || sort -t'"' -u +1 -2) |\
+            sed -e 's/.*"\.\/\(.*\)".*/\1/'\
+          ` >> DEPEND ; \
+       done
+
+depend: depend.in
+       ./config.status || ./configure
+
+depend.in: $(CFILES) term.h
+       cp Makefile.in Makefile.in~
+       sed -e '/\#\#\# Dependencies/q' < Makefile.in > tmp_make
+       for i in $(CFILES); do echo $$i; $(CPP_DEPEND) $$i >> tmp_make; done 
+       mv tmp_make Makefile.in
+
+###############################################################################
+
+### Dependencies:
+pty.o: pty.c config.h
diff --git a/examples/rlfe/README b/examples/rlfe/README
new file mode 100644 (file)
index 0000000..9e1f689
--- /dev/null
@@ -0,0 +1,78 @@
+rlfe (ReadLine Front-End) is a "universal wrapper" around readline.
+You specify an interactive program to run (typically a shell), and
+readline is used to edit input lines.
+
+There are other such front-ends; what distinguishes this one is that
+it monitors the state of the inferior pty, and if the inferior program
+switches its terminal to raw mode, then rlfe passes your characters
+through directly.  This basically means you can run your entire
+session (including bash and terminal-mode emacs) under rlfe.
+
+FEATURES
+
+* Can use all readline commands (and history) in commands that
+read input lines in "canonical mode" - even 'cat'!
+
+* Automatically switches between "readline-editing mode" and "raw mode"
+depending on the terminal mode.  If the inferior program invokes
+readline itself, it will do its own line editing.  (The inferior
+readline will not know about rlfe, and it will have its own history.)
+You can even run programs like 'emavs -nw' and 'vi' under rlfe.
+The goal is you could leave rlfe always on without even knowing
+about it.  (We're not quite there, but it works tolerably well.)
+
+* The input line (after any prompt) is changed to bold-face.
+
+INSTALL
+
+The usual: ./configure && make && make install
+
+Note so far rlfe has only been tested on GNU Linux (Fedora Core 2)
+and Mac OS X (10.3).
+
+This assumes readline header files and libraries are in the default
+places.  If not, you can create a link named readline pointing to the
+readline sources.  To link with libreadline.a and libhistory.a
+you can copy or link them, or add LDFLAGS='-/path/to/readline' to
+the make command-line.
+
+USAGE
+
+Just run it.  That by default runs bash.  You can run some other
+command by giving it as command-line arguments.
+
+There are a few tweaks:  -h allows you to name the history file,
+and -s allows you to specify its size.  It default to "emacs" mode,
+but if the the environment variable EDITOR is set to "vi" that
+mode is chosen.
+
+ISSUES
+
+* The mode switching depends on the terminal mode set by the inferior
+program.  Thus ssh/telnet/screen-type programs will typically be in
+raw mode, so rlfe won't be much use, even if remote programs run in
+canonical mode.  The work-around is to run rlfe on the remote end.
+
+* Echo supression and prompt recognition are somewhat fragile.
+(A protocol so that the o/s tty code can reliably communicate its
+state to rlfe could solve this problem, and the previous one.)
+
+* See the intro to rlfe.c for more notes.
+
+* Assumes a VT100-compatible terminal, though that could be generalized
+if anybody cares.
+
+* Requires ncurses.
+
+* It would be useful to integrate rlfe's logic in a terminal emulator.
+That would make it easier to reposition the edit position with a mouse,
+integrate cut-and-paste with the system clipboard, and more robustly
+handle escape sequence and multi-byte characters more robustly.
+
+AUTHOR
+
+Per Bothner <per@bothner.com>
+
+LICENSE
+
+GPL.
diff --git a/examples/rlfe/config.h.in b/examples/rlfe/config.h.in
new file mode 100644 (file)
index 0000000..587cee2
--- /dev/null
@@ -0,0 +1,375 @@
+/* Copyright 2004 Per Bothner <per@bothner.com>
+ * Based on config.h from screen-4.0.2.
+ * Copyright (c) 1993-2000
+ *      Juergen Weigert (jnweiger@immd4.informatik.uni-erlangen.de)
+ *      Michael Schroeder (mlschroe@immd4.informatik.uni-erlangen.de)
+ * Copyright (c) 1987 Oliver Laumann
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program (see the file COPYING); if not, write to the
+ * Free Software Foundation, Inc.,
+ * 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA
+ *
+ ****************************************************************
+ * $Id: config.h.in,v 1.12 1994/05/31 12:31:36 mlschroe Exp $ FAU
+ */
+
+
+
+
+
+/**********************************************************************
+ *
+ *     User Configuration Section
+ */
+
+
+/* 
+ * define PTYMODE if you do not like the default of 0622, which allows 
+ * public write to your pty.
+ * define PTYGROUP to some numerical group-id if you do not want the
+ * tty to be in "your" group.
+ * Note, screen is unable to change mode or group of the pty if it
+ * is not installed with sufficient privilege. (e.g. set-uid-root)
+ * define PTYROFS if the /dev/pty devices are mounted on a read-only 
+ * filesystem so screen should not even attempt to set mode or group  
+ * even if running as root (e.g. on TiVo).
+ */
+#undef PTYMODE
+#undef PTYGROUP
+#undef PTYROFS
+
+/*
+ * If screen is NOT installed set-uid root, screen can provide tty
+ * security by exclusively locking the ptys.  While this keeps other
+ * users from opening your ptys, it also keeps your own subprocesses
+ * from being able to open /dev/tty.  Define LOCKPTY to add this
+ * exclusive locking.
+ */
+#undef LOCKPTY
+
+
+/**********************************************************************
+ *
+ *     End of User Configuration Section
+ *
+ *      Rest of this file is modified by 'configure'
+ *      Change at your own risk!
+ *
+ */
+
+/*
+ * Some defines to identify special unix variants
+ */
+#ifndef SVR4
+#undef SVR4
+#endif
+
+#ifndef _POSIX_SOURCE
+#undef _POSIX_SOURCE
+#endif
+
+/*
+ * Define POSIX if your system supports IEEE Std 1003.1-1988 (POSIX).
+ */
+#undef POSIX
+
+/*
+ * Define TERMIO if you have struct termio instead of struct sgttyb.
+ * This is usually the case for SVID systems, where BSD uses sgttyb.
+ * POSIX systems should define this anyway, even though they use
+ * struct termios.
+ */
+#undef TERMIO
+
+/*
+ * Define CYTERMIO if you have cyrillic termio modes.
+ */
+#undef CYTERMIO
+
+/*
+ * Define TERMINFO if your machine emulates the termcap routines
+ * with the terminfo database.
+ * Thus the .screenrc file is parsed for
+ * the command 'terminfo' and not 'termcap'.
+ */
+#undef TERMINFO
+
+/*
+ * If your library does not define ospeed, define this.
+ */
+#undef NEED_OSPEED
+
+/*
+ * Define SYSV if your machine is SYSV complient (Sys V, HPUX, A/UX)
+ */
+#ifndef SYSV
+#undef SYSV
+#endif
+
+/*
+ * Define SIGVOID if your signal handlers return void.  On older
+ * systems, signal returns int, but on newer ones, it returns void.
+ */
+#undef SIGVOID 
+
+/*
+ * Define USESIGSET if you have sigset for BSD 4.1 reliable signals.
+ */
+#undef USESIGSET
+
+/*
+ * Define SYSVSIGS if signal handlers must be reinstalled after
+ * they have been called.
+ */
+#undef SYSVSIGS
+
+/*
+ * Define BSDWAIT if your system defines a 'union wait' in <sys/wait.h>
+ *
+ * Only allow BSDWAIT i.e. wait3 on nonposix systems, since
+ * posix implies wait(3) and waitpid(3). vdlinden@fwi.uva.nl
+ * 
+ */
+#ifndef POSIX
+#undef BSDWAIT
+#endif
+
+/*
+ * On RISCOS we prefer wait2() over wait3(). rouilj@sni-usa.com 
+ */
+#ifdef BSDWAIT
+#undef USE_WAIT2
+#endif
+
+/*
+ * Define if you have the utempter utmp helper program
+ */
+#undef HAVE_UTEMPTER
+
+/*
+ * If ttyslot() breaks getlogin() by returning indexes to utmp entries
+ * of type DEAD_PROCESS, then our getlogin() replacement should be
+ * selected by defining BUGGYGETLOGIN.
+ */
+#undef BUGGYGETLOGIN
+
+/*
+ * If your system has the calls setreuid() and setregid(),
+ * define HAVE_SETREUID. Otherwise screen will use a forked process to
+ * safely create output files without retaining any special privileges.
+ */
+#undef HAVE_SETREUID
+
+/*
+ * If your system supports BSD4.4's seteuid() and setegid(), define
+ * HAVE_SETEUID.
+ */
+#undef HAVE_SETEUID
+
+/*
+ * If you want the "time" command to display the current load average
+ * define LOADAV. Maybe you must install screen with the needed
+ * privileges to read /dev/kmem.
+ * Note that NLIST_ stuff is only checked, when getloadavg() is not available.
+ */
+#undef LOADAV
+
+#undef LOADAV_NUM
+#undef LOADAV_TYPE
+#undef LOADAV_SCALE
+#undef LOADAV_GETLOADAVG
+#undef LOADAV_UNIX
+#undef LOADAV_AVENRUN
+#undef LOADAV_USE_NLIST64
+
+#undef NLIST_DECLARED
+#undef NLIST_STRUCT
+#undef NLIST_NAME_UNION
+
+/*
+ * If your system has the new format /etc/ttys (like 4.3 BSD) and the
+ * getttyent(3) library functions, define GETTTYENT.
+ */
+#undef GETTTYENT
+
+/*
+ * Define USEBCOPY if the bcopy/memcpy from your system's C library
+ * supports the overlapping of source and destination blocks.  When
+ * undefined, screen uses its own (probably slower) version of bcopy().
+ * 
+ * SYSV machines may have a working memcpy() -- Oh, this is 
+ * quite unlikely. Tell me if you see one.
+ * "But then, memmove() should work, if at all available" he thought...
+ * Boing, never say "works everywhere" unless you checked SCO UNIX.
+ * Their memove fails the test in the configure script. Sigh. (Juergen)
+ */
+#undef USEBCOPY
+#undef USEMEMCPY
+#undef USEMEMMOVE
+
+/*
+ * If your system has vsprintf() and requires the use of the macros in
+ * "varargs.h" to use functions with variable arguments,
+ * define USEVARARGS.
+ */
+#undef USEVARARGS
+
+/*
+ * If your system has strerror() define this.
+ */
+#undef HAVE_STRERROR
+
+/*
+ * If the select return value doesn't treat a descriptor that is
+ * usable for reading and writing as two hits, define SELECT_BROKEN.
+ */
+#undef SELECT_BROKEN
+
+/*
+ * Define this if your system supports named pipes.
+ */
+#undef NAMEDPIPE
+
+/*
+ * Define this if your system exits select() immediatly if a pipe is
+ * opened read-only and no writer has opened it.
+ */
+#undef BROKEN_PIPE
+
+/*
+ * Define this if the unix-domain socket implementation doesn't
+ * create a socket in the filesystem.
+ */
+#undef SOCK_NOT_IN_FS
+
+/*
+ * If your system has setenv() and unsetenv() define USESETENV
+ */
+#undef USESETENV
+
+/*
+ * If your system does not come with a setenv()/putenv()/getenv()
+ * functions, you may bring in our own code by defining NEEDPUTENV.
+ */
+#undef NEEDPUTENV
+
+/*
+ * If the passwords are stored in a shadow file and you want the
+ * builtin lock to work properly, define SHADOWPW.
+ */
+#undef SHADOWPW
+
+/*
+ * If you are on a SYS V machine that restricts filename length to 14 
+ * characters, you may need to enforce that by setting NAME_MAX to 14
+ */
+#undef NAME_MAX                /* KEEP_UNDEF_HERE override system value */
+#undef NAME_MAX
+
+/*
+ * define HAVE_RENAME if your system has a rename() function
+ */
+#undef HAVE_RENAME
+
+/*
+ * define HAVE__EXIT if your system has the _exit() call.
+ */
+#undef HAVE__EXIT
+
+/*
+ * define HAVE_LSTAT if your system has symlinks and the lstat() call.
+ */
+#undef HAVE_LSTAT
+
+/*
+ * define HAVE_UTIMES if your system has the utimes() call.
+ */
+#undef HAVE_UTIMES
+
+/*
+ * define HAVE_FCHOWN if your system has the fchown() call.
+ */
+#undef HAVE_FCHOWN
+
+/*
+ * define HAVE_FCHMOD if your system has the fchmod() call.
+ */
+#undef HAVE_FCHMOD
+
+/*
+ * define HAVE_VSNPRINTF if your system has vsnprintf() (GNU lib).
+ */
+#undef HAVE_VSNPRINTF
+
+/*
+ * define HAVE_GETCWD if your system has the getcwd() call.
+ */
+#undef HAVE_GETCWD
+
+/*
+ * define HAVE_SETLOCALE if your system has the setlocale() call.
+ */
+#undef HAVE_SETLOCALE
+
+/*
+ * define HAVE_STRFTIME if your system has the strftime() call.
+ */
+#undef HAVE_STRFTIME
+
+/*
+ * define HAVE_NL_LANGINFO if your system has the nl_langinfo() call
+ * and <langinfo.h> defines CODESET.
+ */
+#undef HAVE_NL_LANGINFO
+
+/*
+ * Newer versions of Solaris include fdwalk, which can greatly improve
+ * the startup time of screen; otherwise screen spends a lot of time
+ * closing file descriptors.
+ */
+#undef HAVE_FDWALK
+
+/*
+ * define HAVE_DEV_PTC if you have a /dev/ptc character special
+ * device.
+ */
+#undef HAVE_DEV_PTC
+
+/*
+ * define HAVE_SVR4_PTYS if you have a /dev/ptmx character special
+ * device and support the ptsname(), grantpt(), unlockpt() functions.
+ */
+#undef HAVE_SVR4_PTYS
+
+/*
+ * define HAVE_GETPT if you have the getpt() function.
+ */
+#undef HAVE_GETPT
+
+/*
+ * define HAVE_OPENPTY if your system has the openpty() call.
+ */
+#undef HAVE_OPENPTY
+
+/* 
+ * define PTYRANGE0 and or PTYRANGE1 if you want to adapt screen
+ * to unusual environments. E.g. For SunOs the defaults are "qpr" and 
+ * "0123456789abcdef". For SunOs 4.1.2 
+ * #define PTYRANGE0 "pqrstuvwxyzPQRST" 
+ * is recommended by Dan Jacobson.
+ */
+#undef PTYRANGE0
+#undef PTYRANGE1
+
+#define USEVARARGS
diff --git a/examples/rlfe/configure b/examples/rlfe/configure
new file mode 100755 (executable)
index 0000000..ba82026
--- /dev/null
@@ -0,0 +1,5400 @@
+#! /bin/sh
+# Guess values for system-dependent variables and create Makefiles.
+# Generated by GNU Autoconf 2.59.
+#
+# Copyright (C) 2003 Free Software Foundation, Inc.
+# This configure script is free software; the Free Software Foundation
+# gives unlimited permission to copy, distribute and modify it.
+## --------------------- ##
+## M4sh Initialization.  ##
+## --------------------- ##
+
+# Be Bourne compatible
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
+  emulate sh
+  NULLCMD=:
+  # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '${1+"$@"}'='"$@"'
+elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then
+  set -o posix
+fi
+DUALCASE=1; export DUALCASE # for MKS sh
+
+# Support unset when possible.
+if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
+  as_unset=unset
+else
+  as_unset=false
+fi
+
+
+# Work around bugs in pre-3.0 UWIN ksh.
+$as_unset ENV MAIL MAILPATH
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# NLS nuisances.
+for as_var in \
+  LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \
+  LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \
+  LC_TELEPHONE LC_TIME
+do
+  if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then
+    eval $as_var=C; export $as_var
+  else
+    $as_unset $as_var
+  fi
+done
+
+# Required to use basename.
+if expr a : '\(a\)' >/dev/null 2>&1; then
+  as_expr=expr
+else
+  as_expr=false
+fi
+
+if (basename /) >/dev/null 2>&1 && test "X`basename / 2>&1`" = "X/"; then
+  as_basename=basename
+else
+  as_basename=false
+fi
+
+
+# Name of the executable.
+as_me=`$as_basename "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+        X"$0" : 'X\(//\)$' \| \
+        X"$0" : 'X\(/\)$' \| \
+        .     : '\(.\)' 2>/dev/null ||
+echo X/"$0" |
+    sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/; q; }
+         /^X\/\(\/\/\)$/{ s//\1/; q; }
+         /^X\/\(\/\).*/{ s//\1/; q; }
+         s/.*/./; q'`
+
+
+# PATH needs CR, and LINENO needs CR and PATH.
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+  echo "#! /bin/sh" >conf$$.sh
+  echo  "exit 0"   >>conf$$.sh
+  chmod +x conf$$.sh
+  if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then
+    PATH_SEPARATOR=';'
+  else
+    PATH_SEPARATOR=:
+  fi
+  rm -f conf$$.sh
+fi
+
+
+  as_lineno_1=$LINENO
+  as_lineno_2=$LINENO
+  as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null`
+  test "x$as_lineno_1" != "x$as_lineno_2" &&
+  test "x$as_lineno_3"  = "x$as_lineno_2"  || {
+  # Find who we are.  Look in the path if we contain no path at all
+  # relative or not.
+  case $0 in
+    *[\\/]* ) as_myself=$0 ;;
+    *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+done
+
+       ;;
+  esac
+  # We did not find ourselves, most probably we were run as `sh COMMAND'
+  # in which case we are not to be found in the path.
+  if test "x$as_myself" = x; then
+    as_myself=$0
+  fi
+  if test ! -f "$as_myself"; then
+    { echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2
+   { (exit 1); exit 1; }; }
+  fi
+  case $CONFIG_SHELL in
+  '')
+    as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for as_base in sh bash ksh sh5; do
+        case $as_dir in
+        /*)
+          if ("$as_dir/$as_base" -c '
+  as_lineno_1=$LINENO
+  as_lineno_2=$LINENO
+  as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null`
+  test "x$as_lineno_1" != "x$as_lineno_2" &&
+  test "x$as_lineno_3"  = "x$as_lineno_2" ') 2>/dev/null; then
+            $as_unset BASH_ENV || test "${BASH_ENV+set}" != set || { BASH_ENV=; export BASH_ENV; }
+            $as_unset ENV || test "${ENV+set}" != set || { ENV=; export ENV; }
+            CONFIG_SHELL=$as_dir/$as_base
+            export CONFIG_SHELL
+            exec "$CONFIG_SHELL" "$0" ${1+"$@"}
+          fi;;
+        esac
+       done
+done
+;;
+  esac
+
+  # Create $as_me.lineno as a copy of $as_myself, but with $LINENO
+  # uniformly replaced by the line number.  The first 'sed' inserts a
+  # line-number line before each line; the second 'sed' does the real
+  # work.  The second script uses 'N' to pair each line-number line
+  # with the numbered line, and appends trailing '-' during
+  # substitution so that $LINENO is not a special case at line end.
+  # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the
+  # second 'sed' script.  Blame Lee E. McMahon for sed's syntax.  :-)
+  sed '=' <$as_myself |
+    sed '
+      N
+      s,$,-,
+      : loop
+      s,^\(['$as_cr_digits']*\)\(.*\)[$]LINENO\([^'$as_cr_alnum'_]\),\1\2\1\3,
+      t loop
+      s,-$,,
+      s,^['$as_cr_digits']*\n,,
+    ' >$as_me.lineno &&
+  chmod +x $as_me.lineno ||
+    { echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2
+   { (exit 1); exit 1; }; }
+
+  # Don't try to exec as it changes $[0], causing all sort of problems
+  # (the dirname of $[0] is not the place where we might find the
+  # original and so on.  Autoconf is especially sensible to this).
+  . ./$as_me.lineno
+  # Exit status is that of the last command.
+  exit
+}
+
+
+case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in
+  *c*,-n*) ECHO_N= ECHO_C='
+' ECHO_T='     ' ;;
+  *c*,*  ) ECHO_N=-n ECHO_C= ECHO_T= ;;
+  *)       ECHO_N= ECHO_C='\c' ECHO_T= ;;
+esac
+
+if expr a : '\(a\)' >/dev/null 2>&1; then
+  as_expr=expr
+else
+  as_expr=false
+fi
+
+rm -f conf$$ conf$$.exe conf$$.file
+echo >conf$$.file
+if ln -s conf$$.file conf$$ 2>/dev/null; then
+  # We could just check for DJGPP; but this test a) works b) is more generic
+  # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04).
+  if test -f conf$$.exe; then
+    # Don't use ln at all; we don't have any links
+    as_ln_s='cp -p'
+  else
+    as_ln_s='ln -s'
+  fi
+elif ln conf$$.file conf$$ 2>/dev/null; then
+  as_ln_s=ln
+else
+  as_ln_s='cp -p'
+fi
+rm -f conf$$ conf$$.exe conf$$.file
+
+if mkdir -p . 2>/dev/null; then
+  as_mkdir_p=:
+else
+  test -d ./-p && rmdir ./-p
+  as_mkdir_p=false
+fi
+
+as_executable_p="test -f"
+
+# Sed expression to map a string onto a valid CPP name.
+as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
+
+# Sed expression to map a string onto a valid variable name.
+as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
+
+
+# IFS
+# We need space, tab and new line, in precisely that order.
+as_nl='
+'
+IFS="  $as_nl"
+
+# CDPATH.
+$as_unset CDPATH
+
+
+# Name of the host.
+# hostname on some systems (SVR3.2, Linux) returns a bogus exit status,
+# so uname gets run too.
+ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q`
+
+exec 6>&1
+
+#
+# Initializations.
+#
+ac_default_prefix=/usr/local
+ac_config_libobj_dir=.
+cross_compiling=no
+subdirs=
+MFLAGS=
+MAKEFLAGS=
+SHELL=${CONFIG_SHELL-/bin/sh}
+
+# Maximum number of lines to put in a shell here document.
+# This variable seems obsolete.  It should probably be removed, and
+# only ac_max_sed_lines should be used.
+: ${ac_max_here_lines=38}
+
+# Identity of this package.
+PACKAGE_NAME=
+PACKAGE_TARNAME=
+PACKAGE_VERSION=
+PACKAGE_STRING=
+PACKAGE_BUGREPORT=
+
+ac_unique_file="rlfe.c"
+ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS VERSION CC CFLAGS LDFLAGS CPPFLAGS ac_ct_CC EXEEXT OBJEXT CPP EGREP AWK WRITEPATH XTERMPATH LIBOBJS LTLIBOBJS'
+ac_subst_files=''
+
+# Initialize some variables set by options.
+ac_init_help=
+ac_init_version=false
+# The variables have the same names as the options, with
+# dashes changed to underlines.
+cache_file=/dev/null
+exec_prefix=NONE
+no_create=
+no_recursion=
+prefix=NONE
+program_prefix=NONE
+program_suffix=NONE
+program_transform_name=s,x,x,
+silent=
+site=
+srcdir=
+verbose=
+x_includes=NONE
+x_libraries=NONE
+
+# Installation directory options.
+# These are left unexpanded so users can "make install exec_prefix=/foo"
+# and all the variables that are supposed to be based on exec_prefix
+# by default will actually change.
+# Use braces instead of parens because sh, perl, etc. also accept them.
+bindir='${exec_prefix}/bin'
+sbindir='${exec_prefix}/sbin'
+libexecdir='${exec_prefix}/libexec'
+datadir='${prefix}/share'
+sysconfdir='${prefix}/etc'
+sharedstatedir='${prefix}/com'
+localstatedir='${prefix}/var'
+libdir='${exec_prefix}/lib'
+includedir='${prefix}/include'
+oldincludedir='/usr/include'
+infodir='${prefix}/info'
+mandir='${prefix}/man'
+
+ac_prev=
+for ac_option
+do
+  # If the previous option needs an argument, assign it.
+  if test -n "$ac_prev"; then
+    eval "$ac_prev=\$ac_option"
+    ac_prev=
+    continue
+  fi
+
+  ac_optarg=`expr "x$ac_option" : 'x[^=]*=\(.*\)'`
+
+  # Accept the important Cygnus configure options, so we can diagnose typos.
+
+  case $ac_option in
+
+  -bindir | --bindir | --bindi | --bind | --bin | --bi)
+    ac_prev=bindir ;;
+  -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*)
+    bindir=$ac_optarg ;;
+
+  -build | --build | --buil | --bui | --bu)
+    ac_prev=build_alias ;;
+  -build=* | --build=* | --buil=* | --bui=* | --bu=*)
+    build_alias=$ac_optarg ;;
+
+  -cache-file | --cache-file | --cache-fil | --cache-fi \
+  | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)
+    ac_prev=cache_file ;;
+  -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \
+  | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*)
+    cache_file=$ac_optarg ;;
+
+  --config-cache | -C)
+    cache_file=config.cache ;;
+
+  -datadir | --datadir | --datadi | --datad | --data | --dat | --da)
+    ac_prev=datadir ;;
+  -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \
+  | --da=*)
+    datadir=$ac_optarg ;;
+
+  -disable-* | --disable-*)
+    ac_feature=`expr "x$ac_option" : 'x-*disable-\(.*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null &&
+      { echo "$as_me: error: invalid feature name: $ac_feature" >&2
+   { (exit 1); exit 1; }; }
+    ac_feature=`echo $ac_feature | sed 's/-/_/g'`
+    eval "enable_$ac_feature=no" ;;
+
+  -enable-* | --enable-*)
+    ac_feature=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null &&
+      { echo "$as_me: error: invalid feature name: $ac_feature" >&2
+   { (exit 1); exit 1; }; }
+    ac_feature=`echo $ac_feature | sed 's/-/_/g'`
+    case $ac_option in
+      *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;;
+      *) ac_optarg=yes ;;
+    esac
+    eval "enable_$ac_feature='$ac_optarg'" ;;
+
+  -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \
+  | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \
+  | --exec | --exe | --ex)
+    ac_prev=exec_prefix ;;
+  -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \
+  | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \
+  | --exec=* | --exe=* | --ex=*)
+    exec_prefix=$ac_optarg ;;
+
+  -gas | --gas | --ga | --g)
+    # Obsolete; use --with-gas.
+    with_gas=yes ;;
+
+  -help | --help | --hel | --he | -h)
+    ac_init_help=long ;;
+  -help=r* | --help=r* | --hel=r* | --he=r* | -hr*)
+    ac_init_help=recursive ;;
+  -help=s* | --help=s* | --hel=s* | --he=s* | -hs*)
+    ac_init_help=short ;;
+
+  -host | --host | --hos | --ho)
+    ac_prev=host_alias ;;
+  -host=* | --host=* | --hos=* | --ho=*)
+    host_alias=$ac_optarg ;;
+
+  -includedir | --includedir | --includedi | --included | --include \
+  | --includ | --inclu | --incl | --inc)
+    ac_prev=includedir ;;
+  -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \
+  | --includ=* | --inclu=* | --incl=* | --inc=*)
+    includedir=$ac_optarg ;;
+
+  -infodir | --infodir | --infodi | --infod | --info | --inf)
+    ac_prev=infodir ;;
+  -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*)
+    infodir=$ac_optarg ;;
+
+  -libdir | --libdir | --libdi | --libd)
+    ac_prev=libdir ;;
+  -libdir=* | --libdir=* | --libdi=* | --libd=*)
+    libdir=$ac_optarg ;;
+
+  -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \
+  | --libexe | --libex | --libe)
+    ac_prev=libexecdir ;;
+  -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \
+  | --libexe=* | --libex=* | --libe=*)
+    libexecdir=$ac_optarg ;;
+
+  -localstatedir | --localstatedir | --localstatedi | --localstated \
+  | --localstate | --localstat | --localsta | --localst \
+  | --locals | --local | --loca | --loc | --lo)
+    ac_prev=localstatedir ;;
+  -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \
+  | --localstate=* | --localstat=* | --localsta=* | --localst=* \
+  | --locals=* | --local=* | --loca=* | --loc=* | --lo=*)
+    localstatedir=$ac_optarg ;;
+
+  -mandir | --mandir | --mandi | --mand | --man | --ma | --m)
+    ac_prev=mandir ;;
+  -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*)
+    mandir=$ac_optarg ;;
+
+  -nfp | --nfp | --nf)
+    # Obsolete; use --without-fp.
+    with_fp=no ;;
+
+  -no-create | --no-create | --no-creat | --no-crea | --no-cre \
+  | --no-cr | --no-c | -n)
+    no_create=yes ;;
+
+  -no-recursion | --no-recursion | --no-recursio | --no-recursi \
+  | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r)
+    no_recursion=yes ;;
+
+  -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \
+  | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \
+  | --oldin | --oldi | --old | --ol | --o)
+    ac_prev=oldincludedir ;;
+  -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \
+  | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \
+  | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*)
+    oldincludedir=$ac_optarg ;;
+
+  -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
+    ac_prev=prefix ;;
+  -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
+    prefix=$ac_optarg ;;
+
+  -program-prefix | --program-prefix | --program-prefi | --program-pref \
+  | --program-pre | --program-pr | --program-p)
+    ac_prev=program_prefix ;;
+  -program-prefix=* | --program-prefix=* | --program-prefi=* \
+  | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*)
+    program_prefix=$ac_optarg ;;
+
+  -program-suffix | --program-suffix | --program-suffi | --program-suff \
+  | --program-suf | --program-su | --program-s)
+    ac_prev=program_suffix ;;
+  -program-suffix=* | --program-suffix=* | --program-suffi=* \
+  | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*)
+    program_suffix=$ac_optarg ;;
+
+  -program-transform-name | --program-transform-name \
+  | --program-transform-nam | --program-transform-na \
+  | --program-transform-n | --program-transform- \
+  | --program-transform | --program-transfor \
+  | --program-transfo | --program-transf \
+  | --program-trans | --program-tran \
+  | --progr-tra | --program-tr | --program-t)
+    ac_prev=program_transform_name ;;
+  -program-transform-name=* | --program-transform-name=* \
+  | --program-transform-nam=* | --program-transform-na=* \
+  | --program-transform-n=* | --program-transform-=* \
+  | --program-transform=* | --program-transfor=* \
+  | --program-transfo=* | --program-transf=* \
+  | --program-trans=* | --program-tran=* \
+  | --progr-tra=* | --program-tr=* | --program-t=*)
+    program_transform_name=$ac_optarg ;;
+
+  -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+  | -silent | --silent | --silen | --sile | --sil)
+    silent=yes ;;
+
+  -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
+    ac_prev=sbindir ;;
+  -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
+  | --sbi=* | --sb=*)
+    sbindir=$ac_optarg ;;
+
+  -sharedstatedir | --sharedstatedir | --sharedstatedi \
+  | --sharedstated | --sharedstate | --sharedstat | --sharedsta \
+  | --sharedst | --shareds | --shared | --share | --shar \
+  | --sha | --sh)
+    ac_prev=sharedstatedir ;;
+  -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \
+  | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \
+  | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \
+  | --sha=* | --sh=*)
+    sharedstatedir=$ac_optarg ;;
+
+  -site | --site | --sit)
+    ac_prev=site ;;
+  -site=* | --site=* | --sit=*)
+    site=$ac_optarg ;;
+
+  -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
+    ac_prev=srcdir ;;
+  -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
+    srcdir=$ac_optarg ;;
+
+  -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \
+  | --syscon | --sysco | --sysc | --sys | --sy)
+    ac_prev=sysconfdir ;;
+  -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \
+  | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*)
+    sysconfdir=$ac_optarg ;;
+
+  -target | --target | --targe | --targ | --tar | --ta | --t)
+    ac_prev=target_alias ;;
+  -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)
+    target_alias=$ac_optarg ;;
+
+  -v | -verbose | --verbose | --verbos | --verbo | --verb)
+    verbose=yes ;;
+
+  -version | --version | --versio | --versi | --vers | -V)
+    ac_init_version=: ;;
+
+  -with-* | --with-*)
+    ac_package=`expr "x$ac_option" : 'x-*with-\([^=]*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null &&
+      { echo "$as_me: error: invalid package name: $ac_package" >&2
+   { (exit 1); exit 1; }; }
+    ac_package=`echo $ac_package| sed 's/-/_/g'`
+    case $ac_option in
+      *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;;
+      *) ac_optarg=yes ;;
+    esac
+    eval "with_$ac_package='$ac_optarg'" ;;
+
+  -without-* | --without-*)
+    ac_package=`expr "x$ac_option" : 'x-*without-\(.*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null &&
+      { echo "$as_me: error: invalid package name: $ac_package" >&2
+   { (exit 1); exit 1; }; }
+    ac_package=`echo $ac_package | sed 's/-/_/g'`
+    eval "with_$ac_package=no" ;;
+
+  --x)
+    # Obsolete; use --with-x.
+    with_x=yes ;;
+
+  -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \
+  | --x-incl | --x-inc | --x-in | --x-i)
+    ac_prev=x_includes ;;
+  -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \
+  | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*)
+    x_includes=$ac_optarg ;;
+
+  -x-libraries | --x-libraries | --x-librarie | --x-librari \
+  | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l)
+    ac_prev=x_libraries ;;
+  -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \
+  | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)
+    x_libraries=$ac_optarg ;;
+
+  -*) { echo "$as_me: error: unrecognized option: $ac_option
+Try \`$0 --help' for more information." >&2
+   { (exit 1); exit 1; }; }
+    ;;
+
+  *=*)
+    ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_envvar" : ".*[^_$as_cr_alnum]" >/dev/null &&
+      { echo "$as_me: error: invalid variable name: $ac_envvar" >&2
+   { (exit 1); exit 1; }; }
+    ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`
+    eval "$ac_envvar='$ac_optarg'"
+    export $ac_envvar ;;
+
+  *)
+    # FIXME: should be removed in autoconf 3.0.
+    echo "$as_me: WARNING: you should use --build, --host, --target" >&2
+    expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null &&
+      echo "$as_me: WARNING: invalid host type: $ac_option" >&2
+    : ${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}
+    ;;
+
+  esac
+done
+
+if test -n "$ac_prev"; then
+  ac_option=--`echo $ac_prev | sed 's/_/-/g'`
+  { echo "$as_me: error: missing argument to $ac_option" >&2
+   { (exit 1); exit 1; }; }
+fi
+
+# Be sure to have absolute paths.
+for ac_var in exec_prefix prefix
+do
+  eval ac_val=$`echo $ac_var`
+  case $ac_val in
+    [\\/$]* | ?:[\\/]* | NONE | '' ) ;;
+    *)  { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2
+   { (exit 1); exit 1; }; };;
+  esac
+done
+
+# Be sure to have absolute paths.
+for ac_var in bindir sbindir libexecdir datadir sysconfdir sharedstatedir \
+             localstatedir libdir includedir oldincludedir infodir mandir
+do
+  eval ac_val=$`echo $ac_var`
+  case $ac_val in
+    [\\/$]* | ?:[\\/]* ) ;;
+    *)  { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2
+   { (exit 1); exit 1; }; };;
+  esac
+done
+
+# There might be people who depend on the old broken behavior: `$host'
+# used to hold the argument of --host etc.
+# FIXME: To remove some day.
+build=$build_alias
+host=$host_alias
+target=$target_alias
+
+# FIXME: To remove some day.
+if test "x$host_alias" != x; then
+  if test "x$build_alias" = x; then
+    cross_compiling=maybe
+    echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host.
+    If a cross compiler is detected then cross compile mode will be used." >&2
+  elif test "x$build_alias" != "x$host_alias"; then
+    cross_compiling=yes
+  fi
+fi
+
+ac_tool_prefix=
+test -n "$host_alias" && ac_tool_prefix=$host_alias-
+
+test "$silent" = yes && exec 6>/dev/null
+
+
+# Find the source files, if location was not specified.
+if test -z "$srcdir"; then
+  ac_srcdir_defaulted=yes
+  # Try the directory containing this script, then its parent.
+  ac_confdir=`(dirname "$0") 2>/dev/null ||
+$as_expr X"$0" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+        X"$0" : 'X\(//\)[^/]' \| \
+        X"$0" : 'X\(//\)$' \| \
+        X"$0" : 'X\(/\)' \| \
+        .     : '\(.\)' 2>/dev/null ||
+echo X"$0" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+         /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+         /^X\(\/\/\)$/{ s//\1/; q; }
+         /^X\(\/\).*/{ s//\1/; q; }
+         s/.*/./; q'`
+  srcdir=$ac_confdir
+  if test ! -r $srcdir/$ac_unique_file; then
+    srcdir=..
+  fi
+else
+  ac_srcdir_defaulted=no
+fi
+if test ! -r $srcdir/$ac_unique_file; then
+  if test "$ac_srcdir_defaulted" = yes; then
+    { echo "$as_me: error: cannot find sources ($ac_unique_file) in $ac_confdir or .." >&2
+   { (exit 1); exit 1; }; }
+  else
+    { echo "$as_me: error: cannot find sources ($ac_unique_file) in $srcdir" >&2
+   { (exit 1); exit 1; }; }
+  fi
+fi
+(cd $srcdir && test -r ./$ac_unique_file) 2>/dev/null ||
+  { echo "$as_me: error: sources are in $srcdir, but \`cd $srcdir' does not work" >&2
+   { (exit 1); exit 1; }; }
+srcdir=`echo "$srcdir" | sed 's%\([^\\/]\)[\\/]*$%\1%'`
+ac_env_build_alias_set=${build_alias+set}
+ac_env_build_alias_value=$build_alias
+ac_cv_env_build_alias_set=${build_alias+set}
+ac_cv_env_build_alias_value=$build_alias
+ac_env_host_alias_set=${host_alias+set}
+ac_env_host_alias_value=$host_alias
+ac_cv_env_host_alias_set=${host_alias+set}
+ac_cv_env_host_alias_value=$host_alias
+ac_env_target_alias_set=${target_alias+set}
+ac_env_target_alias_value=$target_alias
+ac_cv_env_target_alias_set=${target_alias+set}
+ac_cv_env_target_alias_value=$target_alias
+ac_env_CC_set=${CC+set}
+ac_env_CC_value=$CC
+ac_cv_env_CC_set=${CC+set}
+ac_cv_env_CC_value=$CC
+ac_env_CFLAGS_set=${CFLAGS+set}
+ac_env_CFLAGS_value=$CFLAGS
+ac_cv_env_CFLAGS_set=${CFLAGS+set}
+ac_cv_env_CFLAGS_value=$CFLAGS
+ac_env_LDFLAGS_set=${LDFLAGS+set}
+ac_env_LDFLAGS_value=$LDFLAGS
+ac_cv_env_LDFLAGS_set=${LDFLAGS+set}
+ac_cv_env_LDFLAGS_value=$LDFLAGS
+ac_env_CPPFLAGS_set=${CPPFLAGS+set}
+ac_env_CPPFLAGS_value=$CPPFLAGS
+ac_cv_env_CPPFLAGS_set=${CPPFLAGS+set}
+ac_cv_env_CPPFLAGS_value=$CPPFLAGS
+ac_env_CPP_set=${CPP+set}
+ac_env_CPP_value=$CPP
+ac_cv_env_CPP_set=${CPP+set}
+ac_cv_env_CPP_value=$CPP
+
+#
+# Report the --help message.
+#
+if test "$ac_init_help" = "long"; then
+  # Omit some internal or obsolete options to make the list less imposing.
+  # This message is too long to be a string in the A/UX 3.1 sh.
+  cat <<_ACEOF
+\`configure' configures this package to adapt to many kinds of systems.
+
+Usage: $0 [OPTION]... [VAR=VALUE]...
+
+To assign environment variables (e.g., CC, CFLAGS...), specify them as
+VAR=VALUE.  See below for descriptions of some of the useful variables.
+
+Defaults for the options are specified in brackets.
+
+Configuration:
+  -h, --help              display this help and exit
+      --help=short        display options specific to this package
+      --help=recursive    display the short help of all the included packages
+  -V, --version           display version information and exit
+  -q, --quiet, --silent   do not print \`checking...' messages
+      --cache-file=FILE   cache test results in FILE [disabled]
+  -C, --config-cache      alias for \`--cache-file=config.cache'
+  -n, --no-create         do not create output files
+      --srcdir=DIR        find the sources in DIR [configure dir or \`..']
+
+_ACEOF
+
+  cat <<_ACEOF
+Installation directories:
+  --prefix=PREFIX         install architecture-independent files in PREFIX
+                         [$ac_default_prefix]
+  --exec-prefix=EPREFIX   install architecture-dependent files in EPREFIX
+                         [PREFIX]
+
+By default, \`make install' will install all the files in
+\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc.  You can specify
+an installation prefix other than \`$ac_default_prefix' using \`--prefix',
+for instance \`--prefix=\$HOME'.
+
+For better control, use the options below.
+
+Fine tuning of the installation directories:
+  --bindir=DIR           user executables [EPREFIX/bin]
+  --sbindir=DIR          system admin executables [EPREFIX/sbin]
+  --libexecdir=DIR       program executables [EPREFIX/libexec]
+  --datadir=DIR          read-only architecture-independent data [PREFIX/share]
+  --sysconfdir=DIR       read-only single-machine data [PREFIX/etc]
+  --sharedstatedir=DIR   modifiable architecture-independent data [PREFIX/com]
+  --localstatedir=DIR    modifiable single-machine data [PREFIX/var]
+  --libdir=DIR           object code libraries [EPREFIX/lib]
+  --includedir=DIR       C header files [PREFIX/include]
+  --oldincludedir=DIR    C header files for non-gcc [/usr/include]
+  --infodir=DIR          info documentation [PREFIX/info]
+  --mandir=DIR           man documentation [PREFIX/man]
+_ACEOF
+
+  cat <<\_ACEOF
+_ACEOF
+fi
+
+if test -n "$ac_init_help"; then
+
+  cat <<\_ACEOF
+
+Optional Packages:
+  --with-PACKAGE[=ARG]    use PACKAGE [ARG=yes]
+  --without-PACKAGE       do not use PACKAGE (same as --with-PACKAGE=no)
+  --with-pty-mode=mode    default mode for ptys
+  --with-pty-group=group  default group for ptys
+
+Some influential environment variables:
+  CC          C compiler command
+  CFLAGS      C compiler flags
+  LDFLAGS     linker flags, e.g. -L<lib dir> if you have libraries in a
+              nonstandard directory <lib dir>
+  CPPFLAGS    C/C++ preprocessor flags, e.g. -I<include dir> if you have
+              headers in a nonstandard directory <include dir>
+  CPP         C preprocessor
+
+Use these variables to override the choices made by `configure' or to help
+it to find libraries and programs with nonstandard names/locations.
+
+_ACEOF
+fi
+
+if test "$ac_init_help" = "recursive"; then
+  # If there are subdirs, report their specific --help.
+  ac_popdir=`pwd`
+  for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue
+    test -d $ac_dir || continue
+    ac_builddir=.
+
+if test "$ac_dir" != .; then
+  ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'`
+  # A "../" for each directory in $ac_dir_suffix.
+  ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'`
+else
+  ac_dir_suffix= ac_top_builddir=
+fi
+
+case $srcdir in
+  .)  # No --srcdir option.  We are building in place.
+    ac_srcdir=.
+    if test -z "$ac_top_builddir"; then
+       ac_top_srcdir=.
+    else
+       ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'`
+    fi ;;
+  [\\/]* | ?:[\\/]* )  # Absolute path.
+    ac_srcdir=$srcdir$ac_dir_suffix;
+    ac_top_srcdir=$srcdir ;;
+  *) # Relative path.
+    ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix
+    ac_top_srcdir=$ac_top_builddir$srcdir ;;
+esac
+
+# Do not use `cd foo && pwd` to compute absolute paths, because
+# the directories may not exist.
+case `pwd` in
+.) ac_abs_builddir="$ac_dir";;
+*)
+  case "$ac_dir" in
+  .) ac_abs_builddir=`pwd`;;
+  [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";;
+  *) ac_abs_builddir=`pwd`/"$ac_dir";;
+  esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_top_builddir=${ac_top_builddir}.;;
+*)
+  case ${ac_top_builddir}. in
+  .) ac_abs_top_builddir=$ac_abs_builddir;;
+  [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;;
+  *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;;
+  esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_srcdir=$ac_srcdir;;
+*)
+  case $ac_srcdir in
+  .) ac_abs_srcdir=$ac_abs_builddir;;
+  [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;;
+  *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;;
+  esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_top_srcdir=$ac_top_srcdir;;
+*)
+  case $ac_top_srcdir in
+  .) ac_abs_top_srcdir=$ac_abs_builddir;;
+  [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;;
+  *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;;
+  esac;;
+esac
+
+    cd $ac_dir
+    # Check for guested configure; otherwise get Cygnus style configure.
+    if test -f $ac_srcdir/configure.gnu; then
+      echo
+      $SHELL $ac_srcdir/configure.gnu  --help=recursive
+    elif test -f $ac_srcdir/configure; then
+      echo
+      $SHELL $ac_srcdir/configure  --help=recursive
+    elif test -f $ac_srcdir/configure.ac ||
+          test -f $ac_srcdir/configure.in; then
+      echo
+      $ac_configure --help
+    else
+      echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2
+    fi
+    cd $ac_popdir
+  done
+fi
+
+test -n "$ac_init_help" && exit 0
+if $ac_init_version; then
+  cat <<\_ACEOF
+
+Copyright (C) 2003 Free Software Foundation, Inc.
+This configure script is free software; the Free Software Foundation
+gives unlimited permission to copy, distribute and modify it.
+_ACEOF
+  exit 0
+fi
+exec 5>config.log
+cat >&5 <<_ACEOF
+This file contains any messages produced by compilers while
+running configure, to aid debugging if configure makes a mistake.
+
+It was created by $as_me, which was
+generated by GNU Autoconf 2.59.  Invocation command line was
+
+  $ $0 $@
+
+_ACEOF
+{
+cat <<_ASUNAME
+## --------- ##
+## Platform. ##
+## --------- ##
+
+hostname = `(hostname || uname -n) 2>/dev/null | sed 1q`
+uname -m = `(uname -m) 2>/dev/null || echo unknown`
+uname -r = `(uname -r) 2>/dev/null || echo unknown`
+uname -s = `(uname -s) 2>/dev/null || echo unknown`
+uname -v = `(uname -v) 2>/dev/null || echo unknown`
+
+/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown`
+/bin/uname -X     = `(/bin/uname -X) 2>/dev/null     || echo unknown`
+
+/bin/arch              = `(/bin/arch) 2>/dev/null              || echo unknown`
+/usr/bin/arch -k       = `(/usr/bin/arch -k) 2>/dev/null       || echo unknown`
+/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown`
+hostinfo               = `(hostinfo) 2>/dev/null               || echo unknown`
+/bin/machine           = `(/bin/machine) 2>/dev/null           || echo unknown`
+/usr/bin/oslevel       = `(/usr/bin/oslevel) 2>/dev/null       || echo unknown`
+/bin/universe          = `(/bin/universe) 2>/dev/null          || echo unknown`
+
+_ASUNAME
+
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  echo "PATH: $as_dir"
+done
+
+} >&5
+
+cat >&5 <<_ACEOF
+
+
+## ----------- ##
+## Core tests. ##
+## ----------- ##
+
+_ACEOF
+
+
+# Keep a trace of the command line.
+# Strip out --no-create and --no-recursion so they do not pile up.
+# Strip out --silent because we don't want to record it for future runs.
+# Also quote any args containing shell meta-characters.
+# Make two passes to allow for proper duplicate-argument suppression.
+ac_configure_args=
+ac_configure_args0=
+ac_configure_args1=
+ac_sep=
+ac_must_keep_next=false
+for ac_pass in 1 2
+do
+  for ac_arg
+  do
+    case $ac_arg in
+    -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;;
+    -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+    | -silent | --silent | --silen | --sile | --sil)
+      continue ;;
+    *" "*|*"   "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?\"\']*)
+      ac_arg=`echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
+    esac
+    case $ac_pass in
+    1) ac_configure_args0="$ac_configure_args0 '$ac_arg'" ;;
+    2)
+      ac_configure_args1="$ac_configure_args1 '$ac_arg'"
+      if test $ac_must_keep_next = true; then
+       ac_must_keep_next=false # Got value, back to normal.
+      else
+       case $ac_arg in
+         *=* | --config-cache | -C | -disable-* | --disable-* \
+         | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \
+         | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \
+         | -with-* | --with-* | -without-* | --without-* | --x)
+           case "$ac_configure_args0 " in
+             "$ac_configure_args1"*" '$ac_arg' "* ) continue ;;
+           esac
+           ;;
+         -* ) ac_must_keep_next=true ;;
+       esac
+      fi
+      ac_configure_args="$ac_configure_args$ac_sep'$ac_arg'"
+      # Get rid of the leading space.
+      ac_sep=" "
+      ;;
+    esac
+  done
+done
+$as_unset ac_configure_args0 || test "${ac_configure_args0+set}" != set || { ac_configure_args0=; export ac_configure_args0; }
+$as_unset ac_configure_args1 || test "${ac_configure_args1+set}" != set || { ac_configure_args1=; export ac_configure_args1; }
+
+# When interrupted or exit'd, cleanup temporary files, and complete
+# config.log.  We remove comments because anyway the quotes in there
+# would cause problems or look ugly.
+# WARNING: Be sure not to use single quotes in there, as some shells,
+# such as our DU 5.0 friend, will then `close' the trap.
+trap 'exit_status=$?
+  # Save into config.log some information that might help in debugging.
+  {
+    echo
+
+    cat <<\_ASBOX
+## ---------------- ##
+## Cache variables. ##
+## ---------------- ##
+_ASBOX
+    echo
+    # The following way of writing the cache mishandles newlines in values,
+{
+  (set) 2>&1 |
+    case `(ac_space='"'"' '"'"'; set | grep ac_space) 2>&1` in
+    *ac_space=\ *)
+      sed -n \
+       "s/'"'"'/'"'"'\\\\'"'"''"'"'/g;
+         s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='"'"'\\2'"'"'/p"
+      ;;
+    *)
+      sed -n \
+       "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p"
+      ;;
+    esac;
+}
+    echo
+
+    cat <<\_ASBOX
+## ----------------- ##
+## Output variables. ##
+## ----------------- ##
+_ASBOX
+    echo
+    for ac_var in $ac_subst_vars
+    do
+      eval ac_val=$`echo $ac_var`
+      echo "$ac_var='"'"'$ac_val'"'"'"
+    done | sort
+    echo
+
+    if test -n "$ac_subst_files"; then
+      cat <<\_ASBOX
+## ------------- ##
+## Output files. ##
+## ------------- ##
+_ASBOX
+      echo
+      for ac_var in $ac_subst_files
+      do
+       eval ac_val=$`echo $ac_var`
+       echo "$ac_var='"'"'$ac_val'"'"'"
+      done | sort
+      echo
+    fi
+
+    if test -s confdefs.h; then
+      cat <<\_ASBOX
+## ----------- ##
+## confdefs.h. ##
+## ----------- ##
+_ASBOX
+      echo
+      sed "/^$/d" confdefs.h | sort
+      echo
+    fi
+    test "$ac_signal" != 0 &&
+      echo "$as_me: caught signal $ac_signal"
+    echo "$as_me: exit $exit_status"
+  } >&5
+  rm -f core *.core &&
+  rm -rf conftest* confdefs* conf$$* $ac_clean_files &&
+    exit $exit_status
+     ' 0
+for ac_signal in 1 2 13 15; do
+  trap 'ac_signal='$ac_signal'; { (exit 1); exit 1; }' $ac_signal
+done
+ac_signal=0
+
+# confdefs.h avoids OS command line length limits that DEFS can exceed.
+rm -rf conftest* confdefs.h
+# AIX cpp loses on an empty file, so make sure it contains at least a newline.
+echo >confdefs.h
+
+# Predefined preprocessor variables.
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_NAME "$PACKAGE_NAME"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_TARNAME "$PACKAGE_TARNAME"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_VERSION "$PACKAGE_VERSION"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_STRING "$PACKAGE_STRING"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT"
+_ACEOF
+
+
+# Let the site file select an alternate cache file if it wants to.
+# Prefer explicitly selected file to automatically selected ones.
+if test -z "$CONFIG_SITE"; then
+  if test "x$prefix" != xNONE; then
+    CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site"
+  else
+    CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site"
+  fi
+fi
+for ac_site_file in $CONFIG_SITE; do
+  if test -r "$ac_site_file"; then
+    { echo "$as_me:$LINENO: loading site script $ac_site_file" >&5
+echo "$as_me: loading site script $ac_site_file" >&6;}
+    sed 's/^/| /' "$ac_site_file" >&5
+    . "$ac_site_file"
+  fi
+done
+
+if test -r "$cache_file"; then
+  # Some versions of bash will fail to source /dev/null (special
+  # files actually), so we avoid doing that.
+  if test -f "$cache_file"; then
+    { echo "$as_me:$LINENO: loading cache $cache_file" >&5
+echo "$as_me: loading cache $cache_file" >&6;}
+    case $cache_file in
+      [\\/]* | ?:[\\/]* ) . $cache_file;;
+      *)                      . ./$cache_file;;
+    esac
+  fi
+else
+  { echo "$as_me:$LINENO: creating cache $cache_file" >&5
+echo "$as_me: creating cache $cache_file" >&6;}
+  >$cache_file
+fi
+
+# Check that the precious variables saved in the cache have kept the same
+# value.
+ac_cache_corrupted=false
+for ac_var in `(set) 2>&1 |
+              sed -n 's/^ac_env_\([a-zA-Z_0-9]*\)_set=.*/\1/p'`; do
+  eval ac_old_set=\$ac_cv_env_${ac_var}_set
+  eval ac_new_set=\$ac_env_${ac_var}_set
+  eval ac_old_val="\$ac_cv_env_${ac_var}_value"
+  eval ac_new_val="\$ac_env_${ac_var}_value"
+  case $ac_old_set,$ac_new_set in
+    set,)
+      { echo "$as_me:$LINENO: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5
+echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;}
+      ac_cache_corrupted=: ;;
+    ,set)
+      { echo "$as_me:$LINENO: error: \`$ac_var' was not set in the previous run" >&5
+echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;}
+      ac_cache_corrupted=: ;;
+    ,);;
+    *)
+      if test "x$ac_old_val" != "x$ac_new_val"; then
+       { echo "$as_me:$LINENO: error: \`$ac_var' has changed since the previous run:" >&5
+echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;}
+       { echo "$as_me:$LINENO:   former value:  $ac_old_val" >&5
+echo "$as_me:   former value:  $ac_old_val" >&2;}
+       { echo "$as_me:$LINENO:   current value: $ac_new_val" >&5
+echo "$as_me:   current value: $ac_new_val" >&2;}
+       ac_cache_corrupted=:
+      fi;;
+  esac
+  # Pass precious variables to config.status.
+  if test "$ac_new_set" = set; then
+    case $ac_new_val in
+    *" "*|*"   "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?\"\']*)
+      ac_arg=$ac_var=`echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;;
+    *) ac_arg=$ac_var=$ac_new_val ;;
+    esac
+    case " $ac_configure_args " in
+      *" '$ac_arg' "*) ;; # Avoid dups.  Use of quotes ensures accuracy.
+      *) ac_configure_args="$ac_configure_args '$ac_arg'" ;;
+    esac
+  fi
+done
+if $ac_cache_corrupted; then
+  { echo "$as_me:$LINENO: error: changes in the environment can compromise the build" >&5
+echo "$as_me: error: changes in the environment can compromise the build" >&2;}
+  { { echo "$as_me:$LINENO: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&5
+echo "$as_me: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+          ac_config_headers="$ac_config_headers config.h"
+
+VERSION=0.4
+
+
+
+old_CFLAGS="$CFLAGS"
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}gcc; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_CC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_CC="${ac_tool_prefix}gcc"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+fi
+if test -z "$ac_cv_prog_CC"; then
+  ac_ct_CC=$CC
+  # Extract the first word of "gcc", so it can be a program name with args.
+set dummy gcc; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$ac_ct_CC"; then
+  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_CC="gcc"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+  echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
+echo "${ECHO_T}$ac_ct_CC" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+  CC=$ac_ct_CC
+else
+  CC="$ac_cv_prog_CC"
+fi
+
+if test -z "$CC"; then
+  if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}cc; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_CC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_CC="${ac_tool_prefix}cc"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+fi
+if test -z "$ac_cv_prog_CC"; then
+  ac_ct_CC=$CC
+  # Extract the first word of "cc", so it can be a program name with args.
+set dummy cc; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$ac_ct_CC"; then
+  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_CC="cc"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+  echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
+echo "${ECHO_T}$ac_ct_CC" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+  CC=$ac_ct_CC
+else
+  CC="$ac_cv_prog_CC"
+fi
+
+fi
+if test -z "$CC"; then
+  # Extract the first word of "cc", so it can be a program name with args.
+set dummy cc; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_CC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+  ac_prog_rejected=no
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then
+       ac_prog_rejected=yes
+       continue
+     fi
+    ac_cv_prog_CC="cc"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+if test $ac_prog_rejected = yes; then
+  # We found a bogon in the path, so make sure we never use it.
+  set dummy $ac_cv_prog_CC
+  shift
+  if test $# != 0; then
+    # We chose a different compiler from the bogus one.
+    # However, it has the same basename, so the bogon will be chosen
+    # first if we set CC to just the basename; use the full file name.
+    shift
+    ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@"
+  fi
+fi
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+fi
+if test -z "$CC"; then
+  if test -n "$ac_tool_prefix"; then
+  for ac_prog in cl
+  do
+    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_CC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_CC="$ac_tool_prefix$ac_prog"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+    test -n "$CC" && break
+  done
+fi
+if test -z "$CC"; then
+  ac_ct_CC=$CC
+  for ac_prog in cl
+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 "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$ac_ct_CC"; then
+  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_CC="$ac_prog"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+  echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
+echo "${ECHO_T}$ac_ct_CC" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+  test -n "$ac_ct_CC" && break
+done
+
+  CC=$ac_ct_CC
+fi
+
+fi
+
+
+test -z "$CC" && { { echo "$as_me:$LINENO: error: no acceptable C compiler found in \$PATH
+See \`config.log' for more details." >&5
+echo "$as_me: error: no acceptable C compiler found in \$PATH
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; }
+
+# Provide some information about the compiler.
+echo "$as_me:$LINENO:" \
+     "checking for C compiler version" >&5
+ac_compiler=`set X $ac_compile; echo $2`
+{ (eval echo "$as_me:$LINENO: \"$ac_compiler --version </dev/null >&5\"") >&5
+  (eval $ac_compiler --version </dev/null >&5) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }
+{ (eval echo "$as_me:$LINENO: \"$ac_compiler -v </dev/null >&5\"") >&5
+  (eval $ac_compiler -v </dev/null >&5) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }
+{ (eval echo "$as_me:$LINENO: \"$ac_compiler -V </dev/null >&5\"") >&5
+  (eval $ac_compiler -V </dev/null >&5) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }
+
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+ac_clean_files_save=$ac_clean_files
+ac_clean_files="$ac_clean_files a.out a.exe b.out"
+# Try to create an executable without -o first, disregard a.out.
+# It will help us diagnose broken compilers, and finding out an intuition
+# of exeext.
+echo "$as_me:$LINENO: checking for C compiler default output file name" >&5
+echo $ECHO_N "checking for C compiler default output file name... $ECHO_C" >&6
+ac_link_default=`echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'`
+if { (eval echo "$as_me:$LINENO: \"$ac_link_default\"") >&5
+  (eval $ac_link_default) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; then
+  # Find the output, starting from the most likely.  This scheme is
+# not robust to junk in `.', hence go to wildcards (a.*) only as a last
+# resort.
+
+# Be careful to initialize this variable, since it used to be cached.
+# Otherwise an old cache value of `no' led to `EXEEXT = no' in a Makefile.
+ac_cv_exeext=
+# b.out is created by i960 compilers.
+for ac_file in a_out.exe a.exe conftest.exe a.out conftest a.* conftest.* b.out
+do
+  test -f "$ac_file" || continue
+  case $ac_file in
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.o | *.obj )
+       ;;
+    conftest.$ac_ext )
+       # This is the source file.
+       ;;
+    [ab].out )
+       # We found the default executable, but exeext='' is most
+       # certainly right.
+       break;;
+    *.* )
+       ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
+       # FIXME: I believe we export ac_cv_exeext for Libtool,
+       # but it would be cool to find out if it's true.  Does anybody
+       # maintain Libtool? --akim.
+       export ac_cv_exeext
+       break;;
+    * )
+       break;;
+  esac
+done
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+{ { echo "$as_me:$LINENO: error: C compiler cannot create executables
+See \`config.log' for more details." >&5
+echo "$as_me: error: C compiler cannot create executables
+See \`config.log' for more details." >&2;}
+   { (exit 77); exit 77; }; }
+fi
+
+ac_exeext=$ac_cv_exeext
+echo "$as_me:$LINENO: result: $ac_file" >&5
+echo "${ECHO_T}$ac_file" >&6
+
+# Check the compiler produces executables we can run.  If not, either
+# the compiler is broken, or we cross compile.
+echo "$as_me:$LINENO: checking whether the C compiler works" >&5
+echo $ECHO_N "checking whether the C compiler works... $ECHO_C" >&6
+# FIXME: These cross compiler hacks should be removed for Autoconf 3.0
+# If not cross compiling, check that we can run a simple program.
+if test "$cross_compiling" != yes; then
+  if { ac_try='./$ac_file'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+    cross_compiling=no
+  else
+    if test "$cross_compiling" = maybe; then
+       cross_compiling=yes
+    else
+       { { echo "$as_me:$LINENO: error: cannot run C compiled programs.
+If you meant to cross compile, use \`--host'.
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot run C compiled programs.
+If you meant to cross compile, use \`--host'.
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; }
+    fi
+  fi
+fi
+echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+
+rm -f a.out a.exe conftest$ac_cv_exeext b.out
+ac_clean_files=$ac_clean_files_save
+# Check the compiler produces executables we can run.  If not, either
+# the compiler is broken, or we cross compile.
+echo "$as_me:$LINENO: checking whether we are cross compiling" >&5
+echo $ECHO_N "checking whether we are cross compiling... $ECHO_C" >&6
+echo "$as_me:$LINENO: result: $cross_compiling" >&5
+echo "${ECHO_T}$cross_compiling" >&6
+
+echo "$as_me:$LINENO: checking for suffix of executables" >&5
+echo $ECHO_N "checking for suffix of executables... $ECHO_C" >&6
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; then
+  # If both `conftest.exe' and `conftest' are `present' (well, observable)
+# catch `conftest.exe'.  For instance with Cygwin, `ls conftest' will
+# work properly (i.e., refer to `conftest.exe'), while it won't with
+# `rm'.
+for ac_file in conftest.exe conftest conftest.*; do
+  test -f "$ac_file" || continue
+  case $ac_file in
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.o | *.obj ) ;;
+    *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
+         export ac_cv_exeext
+         break;;
+    * ) break;;
+  esac
+done
+else
+  { { echo "$as_me:$LINENO: error: cannot compute suffix of executables: cannot compile and link
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot compute suffix of executables: cannot compile and link
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+rm -f conftest$ac_cv_exeext
+echo "$as_me:$LINENO: result: $ac_cv_exeext" >&5
+echo "${ECHO_T}$ac_cv_exeext" >&6
+
+rm -f conftest.$ac_ext
+EXEEXT=$ac_cv_exeext
+ac_exeext=$EXEEXT
+echo "$as_me:$LINENO: checking for suffix of object files" >&5
+echo $ECHO_N "checking for suffix of object files... $ECHO_C" >&6
+if test "${ac_cv_objext+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.o conftest.obj
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; then
+  for ac_file in `(ls conftest.o conftest.obj; ls conftest.*) 2>/dev/null`; do
+  case $ac_file in
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg ) ;;
+    *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'`
+       break;;
+  esac
+done
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+{ { echo "$as_me:$LINENO: error: cannot compute suffix of object files: cannot compile
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot compute suffix of object files: cannot compile
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+rm -f conftest.$ac_cv_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_objext" >&5
+echo "${ECHO_T}$ac_cv_objext" >&6
+OBJEXT=$ac_cv_objext
+ac_objext=$OBJEXT
+echo "$as_me:$LINENO: checking whether we are using the GNU C compiler" >&5
+echo $ECHO_N "checking whether we are using the GNU C compiler... $ECHO_C" >&6
+if test "${ac_cv_c_compiler_gnu+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+#ifndef __GNUC__
+       choke me
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag"
+                        || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_compiler_gnu=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_compiler_gnu=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+ac_cv_c_compiler_gnu=$ac_compiler_gnu
+
+fi
+echo "$as_me:$LINENO: result: $ac_cv_c_compiler_gnu" >&5
+echo "${ECHO_T}$ac_cv_c_compiler_gnu" >&6
+GCC=`test $ac_compiler_gnu = yes && echo yes`
+ac_test_CFLAGS=${CFLAGS+set}
+ac_save_CFLAGS=$CFLAGS
+CFLAGS="-g"
+echo "$as_me:$LINENO: checking whether $CC accepts -g" >&5
+echo $ECHO_N "checking whether $CC accepts -g... $ECHO_C" >&6
+if test "${ac_cv_prog_cc_g+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag"
+                        || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_prog_cc_g=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_prog_cc_g=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_prog_cc_g" >&5
+echo "${ECHO_T}$ac_cv_prog_cc_g" >&6
+if test "$ac_test_CFLAGS" = set; then
+  CFLAGS=$ac_save_CFLAGS
+elif test $ac_cv_prog_cc_g = yes; then
+  if test "$GCC" = yes; then
+    CFLAGS="-g -O2"
+  else
+    CFLAGS="-g"
+  fi
+else
+  if test "$GCC" = yes; then
+    CFLAGS="-O2"
+  else
+    CFLAGS=
+  fi
+fi
+echo "$as_me:$LINENO: checking for $CC option to accept ANSI C" >&5
+echo $ECHO_N "checking for $CC option to accept ANSI C... $ECHO_C" >&6
+if test "${ac_cv_prog_cc_stdc+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_cv_prog_cc_stdc=no
+ac_save_CC=$CC
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <stdarg.h>
+#include <stdio.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+/* Most of the following tests are stolen from RCS 5.7's src/conf.sh.  */
+struct buf { int x; };
+FILE * (*rcsopen) (struct buf *, struct stat *, int);
+static char *e (p, i)
+     char **p;
+     int i;
+{
+  return p[i];
+}
+static char *f (char * (*g) (char **, int), char **p, ...)
+{
+  char *s;
+  va_list v;
+  va_start (v,p);
+  s = g (p, va_arg (v,int));
+  va_end (v);
+  return s;
+}
+
+/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default.  It has
+   function prototypes and stuff, but not '\xHH' hex character constants.
+   These don't provoke an error unfortunately, instead are silently treated
+   as 'x'.  The following induces an error, until -std1 is added to get
+   proper ANSI mode.  Curiously '\x00'!='x' always comes out true, for an
+   array size at least.  It's necessary to write '\x00'==0 to get something
+   that's true only with -std1.  */
+int osf4_cc_array ['\x00' == 0 ? 1 : -1];
+
+int test (int i, double x);
+struct s1 {int (*f) (int a);};
+struct s2 {int (*f) (double a);};
+int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int);
+int argc;
+char **argv;
+int
+main ()
+{
+return f (e, argv, 0) != argv[0]  ||  f (e, argv, 1) != argv[1];
+  ;
+  return 0;
+}
+_ACEOF
+# Don't try gcc -ansi; that turns off useful extensions and
+# breaks some systems' header files.
+# AIX                  -qlanglvl=ansi
+# Ultrix and OSF/1     -std1
+# HP-UX 10.20 and later        -Ae
+# HP-UX older versions -Aa -D_HPUX_SOURCE
+# SVR4                 -Xc -D__EXTENSIONS__
+for ac_arg in "" -qlanglvl=ansi -std1 -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__"
+do
+  CC="$ac_save_CC $ac_arg"
+  rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag"
+                        || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_prog_cc_stdc=$ac_arg
+break
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+fi
+rm -f conftest.err conftest.$ac_objext
+done
+rm -f conftest.$ac_ext conftest.$ac_objext
+CC=$ac_save_CC
+
+fi
+
+case "x$ac_cv_prog_cc_stdc" in
+  x|xno)
+    echo "$as_me:$LINENO: result: none needed" >&5
+echo "${ECHO_T}none needed" >&6 ;;
+  *)
+    echo "$as_me:$LINENO: result: $ac_cv_prog_cc_stdc" >&5
+echo "${ECHO_T}$ac_cv_prog_cc_stdc" >&6
+    CC="$CC $ac_cv_prog_cc_stdc" ;;
+esac
+
+# Some people use a C++ compiler to compile C.  Since we use `exit',
+# in C++ we need to declare it.  In case someone uses the same compiler
+# for both compiling C and C++ we need to have the C++ compiler decide
+# the declaration of exit, since it's the most demanding environment.
+cat >conftest.$ac_ext <<_ACEOF
+#ifndef __cplusplus
+  choke me
+#endif
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag"
+                        || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  for ac_declaration in \
+   '' \
+   'extern "C" void std::exit (int) throw (); using std::exit;' \
+   'extern "C" void std::exit (int); using std::exit;' \
+   'extern "C" void exit (int) throw ();' \
+   'extern "C" void exit (int);' \
+   'void exit (int);'
+do
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_declaration
+#include <stdlib.h>
+int
+main ()
+{
+exit (42);
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag"
+                        || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  :
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+continue
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_declaration
+int
+main ()
+{
+exit (42);
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag"
+                        || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  break
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+done
+rm -f conftest*
+if test -n "$ac_declaration"; then
+  echo '#ifdef __cplusplus' >>confdefs.h
+  echo $ac_declaration      >>confdefs.h
+  echo '#endif'             >>confdefs.h
+fi
+
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+echo "$as_me:$LINENO: checking how to run the C preprocessor" >&5
+echo $ECHO_N "checking how to run the C preprocessor... $ECHO_C" >&6
+# On Suns, sometimes $CPP names a directory.
+if test -n "$CPP" && test -d "$CPP"; then
+  CPP=
+fi
+if test -z "$CPP"; then
+  if test "${ac_cv_prog_CPP+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+      # Double quotes because CPP needs to be expanded
+    for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp"
+    do
+      ac_preproc_ok=false
+for ac_c_preproc_warn_flag in '' yes
+do
+  # Use a header file that comes with gcc, so configuring glibc
+  # with a fresh cross-compiler works.
+  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+  # <limits.h> exists even on freestanding compilers.
+  # On the NeXT, cc -E runs the code through the compiler's parser,
+  # not just through cpp. "Syntax error" is here to catch this case.
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+                    Syntax error
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+  (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null; then
+  if test -s conftest.err; then
+    ac_cpp_err=$ac_c_preproc_warn_flag
+    ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
+  else
+    ac_cpp_err=
+  fi
+else
+  ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+  :
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+  # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err conftest.$ac_ext
+
+  # OK, works on sane cases.  Now check whether non-existent headers
+  # can be detected and how.
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <ac_nonexistent.h>
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+  (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null; then
+  if test -s conftest.err; then
+    ac_cpp_err=$ac_c_preproc_warn_flag
+    ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
+  else
+    ac_cpp_err=
+  fi
+else
+  ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+  # Broken: success on invalid input.
+continue
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+  # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then
+  break
+fi
+
+    done
+    ac_cv_prog_CPP=$CPP
+
+fi
+  CPP=$ac_cv_prog_CPP
+else
+  ac_cv_prog_CPP=$CPP
+fi
+echo "$as_me:$LINENO: result: $CPP" >&5
+echo "${ECHO_T}$CPP" >&6
+ac_preproc_ok=false
+for ac_c_preproc_warn_flag in '' yes
+do
+  # Use a header file that comes with gcc, so configuring glibc
+  # with a fresh cross-compiler works.
+  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+  # <limits.h> exists even on freestanding compilers.
+  # On the NeXT, cc -E runs the code through the compiler's parser,
+  # not just through cpp. "Syntax error" is here to catch this case.
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+                    Syntax error
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+  (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null; then
+  if test -s conftest.err; then
+    ac_cpp_err=$ac_c_preproc_warn_flag
+    ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
+  else
+    ac_cpp_err=
+  fi
+else
+  ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+  :
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+  # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err conftest.$ac_ext
+
+  # OK, works on sane cases.  Now check whether non-existent headers
+  # can be detected and how.
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <ac_nonexistent.h>
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+  (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null; then
+  if test -s conftest.err; then
+    ac_cpp_err=$ac_c_preproc_warn_flag
+    ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
+  else
+    ac_cpp_err=
+  fi
+else
+  ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+  # Broken: success on invalid input.
+continue
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+  # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then
+  :
+else
+  { { echo "$as_me:$LINENO: error: C preprocessor \"$CPP\" fails sanity check
+See \`config.log' for more details." >&5
+echo "$as_me: error: C preprocessor \"$CPP\" fails sanity check
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+
+echo "$as_me:$LINENO: checking for egrep" >&5
+echo $ECHO_N "checking for egrep... $ECHO_C" >&6
+if test "${ac_cv_prog_egrep+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if echo a | (grep -E '(a|b)') >/dev/null 2>&1
+    then ac_cv_prog_egrep='grep -E'
+    else ac_cv_prog_egrep='egrep'
+    fi
+fi
+echo "$as_me:$LINENO: result: $ac_cv_prog_egrep" >&5
+echo "${ECHO_T}$ac_cv_prog_egrep" >&6
+ EGREP=$ac_cv_prog_egrep
+
+
+if test $ac_cv_c_compiler_gnu = yes; then
+    echo "$as_me:$LINENO: checking whether $CC needs -traditional" >&5
+echo $ECHO_N "checking whether $CC needs -traditional... $ECHO_C" >&6
+if test "${ac_cv_prog_gcc_traditional+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+    ac_pattern="Autoconf.*'x'"
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <sgtty.h>
+Autoconf TIOCGETP
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "$ac_pattern" >/dev/null 2>&1; then
+  ac_cv_prog_gcc_traditional=yes
+else
+  ac_cv_prog_gcc_traditional=no
+fi
+rm -f conftest*
+
+
+  if test $ac_cv_prog_gcc_traditional = no; then
+    cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <termio.h>
+Autoconf TCGETA
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "$ac_pattern" >/dev/null 2>&1; then
+  ac_cv_prog_gcc_traditional=yes
+fi
+rm -f conftest*
+
+  fi
+fi
+echo "$as_me:$LINENO: result: $ac_cv_prog_gcc_traditional" >&5
+echo "${ECHO_T}$ac_cv_prog_gcc_traditional" >&6
+  if test $ac_cv_prog_gcc_traditional = yes; then
+    CC="$CC -traditional"
+  fi
+fi
+
+echo "$as_me:$LINENO: checking for library containing strerror" >&5
+echo $ECHO_N "checking for library containing strerror... $ECHO_C" >&6
+if test "${ac_cv_search_strerror+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_func_search_save_LIBS=$LIBS
+ac_cv_search_strerror=no
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+/* Override any gcc2 internal prototype to avoid an error.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+   builtin and then its argument prototype would still apply.  */
+char strerror ();
+int
+main ()
+{
+strerror ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+  (eval $ac_link) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag"
+                        || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest$ac_exeext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_search_strerror="none required"
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+fi
+rm -f conftest.err conftest.$ac_objext \
+      conftest$ac_exeext conftest.$ac_ext
+if test "$ac_cv_search_strerror" = no; then
+  for ac_lib in cposix; do
+    LIBS="-l$ac_lib  $ac_func_search_save_LIBS"
+    cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+/* Override any gcc2 internal prototype to avoid an error.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+   builtin and then its argument prototype would still apply.  */
+char strerror ();
+int
+main ()
+{
+strerror ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+  (eval $ac_link) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag"
+                        || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest$ac_exeext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_search_strerror="-l$ac_lib"
+break
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+fi
+rm -f conftest.err conftest.$ac_objext \
+      conftest$ac_exeext conftest.$ac_ext
+  done
+fi
+LIBS=$ac_func_search_save_LIBS
+fi
+echo "$as_me:$LINENO: result: $ac_cv_search_strerror" >&5
+echo "${ECHO_T}$ac_cv_search_strerror" >&6
+if test "$ac_cv_search_strerror" != no; then
+  test "$ac_cv_search_strerror" = "none required" || LIBS="$ac_cv_search_strerror $LIBS"
+
+fi
+
+
+if test "$cross_compiling" = yes; then
+  { { echo "$as_me:$LINENO: error: cannot run test program while cross compiling
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot run test program while cross compiling
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; }
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+main(){exit(0);}
+_ACEOF
+rm -f conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  :
+else
+  echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+( exit $ac_status )
+
+if test $CC != cc ; then
+echo "Your $CC failed - restarting with CC=cc" 1>&6
+
+echo "" 1>&6
+
+CC=cc
+export CC
+exec $0 $configure_args
+fi
+
+fi
+rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+
+if test "$cross_compiling" = yes; then
+  { { echo "$as_me:$LINENO: error: cannot run test program while cross compiling
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot run test program while cross compiling
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; }
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+main(){exit(0);}
+_ACEOF
+rm -f conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  :
+else
+  echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+( exit $ac_status )
+exec 5>&2
+eval $ac_link
+echo "CC=$CC; CFLAGS=$CFLAGS; LIBS=$LIBS;" 1>&6
+
+echo "$ac_compile" 1>&6
+
+{ { echo "$as_me:$LINENO: error: Can't run the compiler - sorry" >&5
+echo "$as_me: error: Can't run the compiler - sorry" >&2;}
+   { (exit 1); exit 1; }; }
+fi
+rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+
+if test "$cross_compiling" = yes; then
+  { { echo "$as_me:$LINENO: error: cannot run test program while cross compiling
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot run test program while cross compiling
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; }
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+main()
+{
+  int __something_strange_();
+  __something_strange_(0);
+}
+
+_ACEOF
+rm -f conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  { { echo "$as_me:$LINENO: error: Your compiler does not set the exit status - sorry" >&5
+echo "$as_me: error: Your compiler does not set the exit status - sorry" >&2;}
+   { (exit 1); exit 1; }; }
+else
+  echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+fi
+rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+
+for ac_prog in gawk mawk nawk awk
+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 "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_AWK+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$AWK"; then
+  ac_cv_prog_AWK="$AWK" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_AWK="$ac_prog"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+fi
+fi
+AWK=$ac_cv_prog_AWK
+if test -n "$AWK"; then
+  echo "$as_me:$LINENO: result: $AWK" >&5
+echo "${ECHO_T}$AWK" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+  test -n "$AWK" && break
+done
+
+
+if test -f etc/toolcheck; then
+{ echo "$as_me:$LINENO: checking for buggy tools..." >&5
+echo "$as_me: checking for buggy tools..." >&6;}
+sh etc/toolcheck 1>&6
+fi
+
+
+{ echo "$as_me:$LINENO: checking for System V..." >&5
+echo "$as_me: checking for System V..." >&6;}
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <sys/types.h>
+#include <signal.h>
+#include <fcntl.h>
+int
+main ()
+{
+int x = SIGCHLD | FNDELAY;
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag"
+                        || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  :
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+cat >>confdefs.h <<\_ACEOF
+#define SYSV 1
+_ACEOF
+
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+{ echo "$as_me:$LINENO: checking for Solaris 2.x..." >&5
+echo "$as_me: checking for Solaris 2.x..." >&6;}
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#if defined(SVR4) && defined(sun)
+  yes
+#endif
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "yes" >/dev/null 2>&1; then
+  LIBS="$LIBS -lsocket -lnsl -lkstat"
+fi
+rm -f conftest*
+
+
+
+{ echo "$as_me:$LINENO: checking select..." >&5
+echo "$as_me: checking select..." >&6;}
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+select(0, 0, 0, 0, 0);
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+  (eval $ac_link) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag"
+                        || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest$ac_exeext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  :
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+LIBS="$LIBS -lnet -lnsl"
+{ echo "$as_me:$LINENO: checking select with $LIBS..." >&5
+echo "$as_me: checking select with $LIBS..." >&6;}
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+select(0, 0, 0, 0, 0);
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+  (eval $ac_link) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag"
+                        || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest$ac_exeext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  :
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+{ { echo "$as_me:$LINENO: error: !!! no select - no screen" >&5
+echo "$as_me: error: !!! no select - no screen" >&2;}
+   { (exit 1); exit 1; }; }
+fi
+rm -f conftest.err conftest.$ac_objext \
+      conftest$ac_exeext conftest.$ac_ext
+
+fi
+rm -f conftest.err conftest.$ac_objext \
+      conftest$ac_exeext conftest.$ac_ext
+
+{ echo "$as_me:$LINENO: checking select return value..." >&5
+echo "$as_me: checking select return value..." >&6;}
+if test "$cross_compiling" = yes; then
+  { { echo "$as_me:$LINENO: error: cannot run test program while cross compiling
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot run test program while cross compiling
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; }
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+
+char *nam = "/tmp/conftest$$";
+
+#ifdef NAMEDPIPE
+
+#ifndef O_NONBLOCK
+#define O_NONBLOCK O_NDELAY
+#endif
+#ifndef S_IFIFO
+#define S_IFIFO 0010000
+#endif
+
+
+main()
+{
+#ifdef FD_SET
+  fd_set f;
+#else
+  int f;
+#endif
+
+#ifdef __FreeBSD__
+/* From Andrew A. Chernov (ache@astral.msk.su):
+ * opening RDWR fifo fails in BSD 4.4, but select return values are
+ * right.
+ */
+  exit(0);
+#endif
+  (void)alarm(5);
+#ifdef POSIX
+  if (mkfifo(nam, 0777))
+#else
+  if (mknod(nam, S_IFIFO|0777, 0))
+#endif
+    exit(1);
+  close(0);
+  if (open(nam, O_RDWR | O_NONBLOCK))
+    exit(1);
+  if (write(0, "TEST", 4) == -1)
+    exit(1);
+
+#else
+
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <sys/un.h>
+
+main()
+{
+  int s1, s2, l;
+  struct sockaddr_un a;
+#ifdef FD_SET
+  fd_set f;
+#else
+  int f;
+#endif
+
+  (void)alarm(5);
+  if ((s1 = socket(AF_UNIX, SOCK_STREAM, 0)) == -1)
+    exit(1);
+  a.sun_family = AF_UNIX;
+  strcpy(a.sun_path, nam);
+  (void) unlink(nam);
+  if (bind(s1, (struct sockaddr *) &a, strlen(nam)+2) == -1)
+    exit(1);
+  if (listen(s1, 2))
+    exit(1);
+  if (fork() == 0)
+    {
+      if ((s2 = socket(AF_UNIX, SOCK_STREAM, 0)) == -1)
+       kill(getppid(), 3);
+      (void)connect(s2, (struct sockaddr *)&a, strlen(nam) + 2);
+      if (write(s2, "HELLO", 5) == -1)
+       kill(getppid(), 3);
+      exit(0);
+    }
+  l = sizeof(a);
+  close(0);
+  if (accept(s1, (struct sockaddr *)&a, &l))
+    exit(1);
+#endif
+
+
+#ifdef FD_SET
+  FD_SET(0, &f);
+#else
+  f = 1;
+#endif
+  if (select(1, &f, 0, 0, 0) == -1)
+    exit(1);
+  if (select(1, &f, &f, 0, 0) != 2)
+    exit(1);
+  exit(0);
+}
+
+_ACEOF
+rm -f conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  echo "- select is ok" 1>&6
+
+else
+  echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+( exit $ac_status )
+echo "- select can't count" 1>&6
+ cat >>confdefs.h <<\_ACEOF
+#define SELECT_BROKEN 1
+_ACEOF
+
+fi
+rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+
+{ echo "$as_me:$LINENO: checking for tgetent..." >&5
+echo "$as_me: checking for tgetent..." >&6;}
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+tgetent((char *)0, (char *)0);
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+  (eval $ac_link) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag"
+                        || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest$ac_exeext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  :
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+olibs="$LIBS"
+LIBS="-lcurses $olibs"
+{ echo "$as_me:$LINENO: checking libcurses..." >&5
+echo "$as_me: checking libcurses..." >&6;}
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+#ifdef __hpux
+__sorry_hpux_libcurses_is_totally_broken_in_10_10();
+#else
+tgetent((char *)0, (char *)0);
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+  (eval $ac_link) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag"
+                        || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest$ac_exeext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  :
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+LIBS="-ltermcap $olibs"
+{ echo "$as_me:$LINENO: checking libtermcap..." >&5
+echo "$as_me: checking libtermcap..." >&6;}
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+tgetent((char *)0, (char *)0);
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+  (eval $ac_link) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag"
+                        || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest$ac_exeext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  :
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+LIBS="-ltermlib $olibs"
+{ echo "$as_me:$LINENO: checking libtermlib..." >&5
+echo "$as_me: checking libtermlib..." >&6;}
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+tgetent((char *)0, (char *)0);
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+  (eval $ac_link) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag"
+                        || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest$ac_exeext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  :
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+LIBS="-lncurses $olibs"
+{ echo "$as_me:$LINENO: checking libncurses..." >&5
+echo "$as_me: checking libncurses..." >&6;}
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+tgetent((char *)0, (char *)0);
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+  (eval $ac_link) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag"
+                        || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest$ac_exeext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  :
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+{ { echo "$as_me:$LINENO: error: !!! no tgetent - no screen" >&5
+echo "$as_me: error: !!! no tgetent - no screen" >&2;}
+   { (exit 1); exit 1; }; }
+fi
+rm -f conftest.err conftest.$ac_objext \
+      conftest$ac_exeext conftest.$ac_ext
+fi
+rm -f conftest.err conftest.$ac_objext \
+      conftest$ac_exeext conftest.$ac_ext
+fi
+rm -f conftest.err conftest.$ac_objext \
+      conftest$ac_exeext conftest.$ac_ext
+fi
+rm -f conftest.err conftest.$ac_objext \
+      conftest$ac_exeext conftest.$ac_ext
+fi
+rm -f conftest.err conftest.$ac_objext \
+      conftest$ac_exeext conftest.$ac_ext
+
+if test "$cross_compiling" = yes; then
+  { { echo "$as_me:$LINENO: error: cannot run test program while cross compiling
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot run test program while cross compiling
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; }
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+main()
+{
+ exit(strcmp(tgoto("%p1%d", 0, 1), "1") ? 0 : 1);
+}
+_ACEOF
+rm -f conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  echo "- you use the termcap database" 1>&6
+
+else
+  echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+( exit $ac_status )
+echo "- you use the terminfo database" 1>&6
+ cat >>confdefs.h <<\_ACEOF
+#define TERMINFO 1
+_ACEOF
+
+fi
+rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: checking ospeed..." >&5
+echo "$as_me: checking ospeed..." >&6;}
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+extern short ospeed;
+int
+main ()
+{
+ospeed=5;
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+  (eval $ac_link) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag"
+                        || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest$ac_exeext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  :
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+cat >>confdefs.h <<\_ACEOF
+#define NEED_OSPEED 1
+_ACEOF
+
+fi
+rm -f conftest.err conftest.$ac_objext \
+      conftest$ac_exeext conftest.$ac_ext
+
+{ echo "$as_me:$LINENO: checking for /dev/ptc..." >&5
+echo "$as_me: checking for /dev/ptc..." >&6;}
+if test -r /dev/ptc; then
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_DEV_PTC 1
+_ACEOF
+
+fi
+
+{ echo "$as_me:$LINENO: checking for SVR4 ptys..." >&5
+echo "$as_me: checking for SVR4 ptys..." >&6;}
+sysvr4ptys=
+if test -c /dev/ptmx ; then
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+ptsname(0);grantpt(0);unlockpt(0);
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+  (eval $ac_link) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag"
+                        || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest$ac_exeext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  cat >>confdefs.h <<\_ACEOF
+#define HAVE_SVR4_PTYS 1
+_ACEOF
+
+sysvr4ptys=1
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+fi
+rm -f conftest.err conftest.$ac_objext \
+      conftest$ac_exeext conftest.$ac_ext
+fi
+
+
+for ac_func in getpt
+do
+as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
+echo "$as_me:$LINENO: checking for $ac_func" >&5
+echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6
+if eval "test \"\${$as_ac_var+set}\" = set"; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+/* Define $ac_func to an innocuous variant, in case <limits.h> declares $ac_func.
+   For example, HP-UX 11i <limits.h> declares gettimeofday.  */
+#define $ac_func innocuous_$ac_func
+
+/* System header to define __stub macros and hopefully few prototypes,
+    which can conflict with char $ac_func (); below.
+    Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+    <limits.h> exists even on freestanding compilers.  */
+
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+
+#undef $ac_func
+
+/* Override any gcc2 internal prototype to avoid an error.  */
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+/* 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 ();
+/* 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
+char (*f) () = $ac_func;
+#endif
+#ifdef __cplusplus
+}
+#endif
+
+int
+main ()
+{
+return f != $ac_func;
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+  (eval $ac_link) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag"
+                        || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest$ac_exeext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  eval "$as_ac_var=yes"
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+eval "$as_ac_var=no"
+fi
+rm -f conftest.err conftest.$ac_objext \
+      conftest$ac_exeext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5
+echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6
+if test `eval echo '${'$as_ac_var'}'` = yes; then
+  cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+done
+
+
+if test -z "$sysvr4ptys"; then
+
+for ac_func in openpty
+do
+as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
+echo "$as_me:$LINENO: checking for $ac_func" >&5
+echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6
+if eval "test \"\${$as_ac_var+set}\" = set"; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+/* Define $ac_func to an innocuous variant, in case <limits.h> declares $ac_func.
+   For example, HP-UX 11i <limits.h> declares gettimeofday.  */
+#define $ac_func innocuous_$ac_func
+
+/* System header to define __stub macros and hopefully few prototypes,
+    which can conflict with char $ac_func (); below.
+    Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+    <limits.h> exists even on freestanding compilers.  */
+
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+
+#undef $ac_func
+
+/* Override any gcc2 internal prototype to avoid an error.  */
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+/* 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 ();
+/* 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
+char (*f) () = $ac_func;
+#endif
+#ifdef __cplusplus
+}
+#endif
+
+int
+main ()
+{
+return f != $ac_func;
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+  (eval $ac_link) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag"
+                        || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest$ac_exeext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  eval "$as_ac_var=yes"
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+eval "$as_ac_var=no"
+fi
+rm -f conftest.err conftest.$ac_objext \
+      conftest$ac_exeext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5
+echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6
+if test `eval echo '${'$as_ac_var'}'` = yes; then
+  cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1
+_ACEOF
+
+else
+  echo "$as_me:$LINENO: checking for openpty in -lutil" >&5
+echo $ECHO_N "checking for openpty in -lutil... $ECHO_C" >&6
+if test "${ac_cv_lib_util_openpty+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lutil  $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+/* Override any gcc2 internal prototype to avoid an error.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+   builtin and then its argument prototype would still apply.  */
+char openpty ();
+int
+main ()
+{
+openpty ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+  (eval $ac_link) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag"
+                        || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest$ac_exeext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_lib_util_openpty=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_lib_util_openpty=no
+fi
+rm -f conftest.err conftest.$ac_objext \
+      conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:$LINENO: result: $ac_cv_lib_util_openpty" >&5
+echo "${ECHO_T}$ac_cv_lib_util_openpty" >&6
+if test $ac_cv_lib_util_openpty = yes; then
+  cat >>confdefs.h <<\_ACEOF
+#define HAVE_OPENPTY 1
+_ACEOF
+ LIBS="$LIBS -lutil"
+fi
+
+fi
+done
+
+fi
+
+{ echo "$as_me:$LINENO: checking for ptyranges..." >&5
+echo "$as_me: checking for ptyranges..." >&6;}
+if test -d /dev/ptym ; then
+pdir='/dev/ptym'
+else
+pdir='/dev'
+fi
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#ifdef M_UNIX
+   yes;
+#endif
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "yes" >/dev/null 2>&1; then
+  ptys=`echo /dev/ptyp??`
+else
+  ptys=`echo $pdir/pty??`
+fi
+rm -f conftest*
+
+if test "$ptys" != "$pdir/pty??" ; then
+p0=`echo $ptys | tr ' ' '\012' | sed -e 's/^.*\(.\).$/\1/g' | sort -u | tr -d '\012'`
+p1=`echo $ptys | tr ' ' '\012' | sed -e 's/^.*\(.\)$/\1/g'  | sort -u | tr -d '\012'`
+cat >>confdefs.h <<_ACEOF
+#define PTYRANGE0 "$p0"
+_ACEOF
+
+cat >>confdefs.h <<_ACEOF
+#define PTYRANGE1 "$p1"
+_ACEOF
+
+fi
+
+
+# Check whether --with-pty-mode or --without-pty-mode was given.
+if test "${with_pty_mode+set}" = set; then
+  withval="$with_pty_mode"
+   ptymode="${withval}"
+fi;
+
+# Check whether --with-pty-group or --without-pty-group was given.
+if test "${with_pty_group+set}" = set; then
+  withval="$with_pty_group"
+   ptygrp="${withval}"
+fi;
+test -n "$ptymode" || ptymode=0620
+if test -n "$ptygrp" ; then
+cat >>confdefs.h <<_ACEOF
+#define PTYMODE $ptymode
+_ACEOF
+
+cat >>confdefs.h <<_ACEOF
+#define PTYGROUP $ptygrp
+_ACEOF
+
+else
+
+{ echo "$as_me:$LINENO: checking default tty permissions/group..." >&5
+echo "$as_me: checking default tty permissions/group..." >&6;}
+rm -f conftest_grp
+if test "$cross_compiling" = yes; then
+  { { echo "$as_me:$LINENO: error: cannot run test program while cross compiling
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot run test program while cross compiling
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; }
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <stdio.h>
+main()
+{
+  struct stat sb;
+  char *x,*ttyname();
+  int om, m;
+  FILE *fp;
+
+  if (!(x = ttyname(0))) exit(1);
+  if (stat(x, &sb)) exit(1);
+  om = sb.st_mode;
+  if (om & 002) exit(0);
+  m = system("mesg y");
+  if (m == -1 || m == 127) exit(1);
+  if (stat(x, &sb)) exit(1);
+  m = sb.st_mode;
+  if (chmod(x, om)) exit(1);
+  if (m & 002) exit(0);
+  if (sb.st_gid == getgid()) exit(1);
+  if (!(fp=fopen("conftest_grp", "w")))
+    exit(1);
+  fprintf(fp, "%d\n", sb.st_gid);
+  fclose(fp);
+  exit(0);
+}
+
+_ACEOF
+rm -f conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+
+    if test -f conftest_grp; then
+       ptygrp=`cat conftest_grp`
+       echo "- pty mode: $ptymode, group: $ptygrp" 1>&6
+
+       cat >>confdefs.h <<_ACEOF
+#define PTYMODE $ptymode
+_ACEOF
+
+       cat >>confdefs.h <<_ACEOF
+#define PTYGROUP $ptygrp
+_ACEOF
+
+    else
+       echo "- ptys are world accessable" 1>&6
+
+    fi
+
+else
+  echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+( exit $ac_status )
+
+    WRITEPATH=''
+    XTERMPATH=''
+    # Extract the first word of "write", so it can be a program name with args.
+set dummy write; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_path_WRITEPATH+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  case $WRITEPATH in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_WRITEPATH="$WRITEPATH" # Let the user override the test with a path.
+  ;;
+  *)
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_path_WRITEPATH="$as_dir/$ac_word$ac_exec_ext"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+  ;;
+esac
+fi
+WRITEPATH=$ac_cv_path_WRITEPATH
+
+if test -n "$WRITEPATH"; then
+  echo "$as_me:$LINENO: result: $WRITEPATH" >&5
+echo "${ECHO_T}$WRITEPATH" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+    # Extract the first word of "xterm", so it can be a program name with args.
+set dummy xterm; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_path_XTERMPATH+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  case $XTERMPATH in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_XTERMPATH="$XTERMPATH" # Let the user override the test with a path.
+  ;;
+  *)
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_path_XTERMPATH="$as_dir/$ac_word$ac_exec_ext"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+  ;;
+esac
+fi
+XTERMPATH=$ac_cv_path_XTERMPATH
+
+if test -n "$XTERMPATH"; then
+  echo "$as_me:$LINENO: result: $XTERMPATH" >&5
+echo "${ECHO_T}$XTERMPATH" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+    found=
+    if test -n "$WRITEPATH$XTERMPATH"; then
+      findfollow=
+      lsfollow=
+      found=`find $WRITEPATH $XTERMPATH -follow -print 2>/dev/null`
+      if test -n "$found"; then
+       findfollow=-follow
+       lsfollow=L
+      fi
+      if test -n "$XTERMPATH"; then
+       ptygrpn=`ls -l$lsfollow $XTERMPATH | sed -n -e 1p | $AWK '{print $4}'`
+       if test tty != "$ptygrpn"; then
+         XTERMPATH=
+       fi
+      fi
+    fi
+    if test -n "$WRITEPATH$XTERMPATH"; then
+      found=`find $WRITEPATH $XTERMPATH $findfollow -perm -2000 -print`
+      if test -n "$found"; then
+       ptygrp=`ls -ln$lsfollow $found | sed -n -e 1p | $AWK '{print $4}'`
+       echo "- pty mode: $ptymode, group: $ptygrp" 1>&6
+
+       cat >>confdefs.h <<_ACEOF
+#define PTYMODE $ptymode
+_ACEOF
+
+       cat >>confdefs.h <<_ACEOF
+#define PTYGROUP $ptygrp
+_ACEOF
+
+      else
+       echo "- ptys are world accessable" 1>&6
+
+      fi
+    else
+      echo "- can't determine - assume ptys are world accessable" 1>&6
+
+    fi
+
+
+fi
+rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f conftest_grp
+fi
+
+if test -n "$posix" ; then
+
+echo "assuming posix signal definition" 1>&6
+
+cat >>confdefs.h <<\_ACEOF
+#define SIGVOID 1
+_ACEOF
+
+
+else
+
+{ echo "$as_me:$LINENO: checking return type of signal handlers..." >&5
+echo "$as_me: checking return type of signal handlers..." >&6;}
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <sys/types.h>
+#include <signal.h>
+#ifdef signal
+#undef signal
+#endif
+extern void (*signal ()) ();
+int
+main ()
+{
+int i;
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag"
+                        || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  cat >>confdefs.h <<\_ACEOF
+#define SIGVOID 1
+_ACEOF
+
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+{ echo "$as_me:$LINENO: checking sigset..." >&5
+echo "$as_me: checking sigset..." >&6;}
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+#include <sys/types.h>
+#include <signal.h>
+
+int
+main ()
+{
+
+#ifdef SIGVOID
+sigset(0, (void (*)())0);
+#else
+sigset(0, (int (*)())0);
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+  (eval $ac_link) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag"
+                        || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest$ac_exeext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  cat >>confdefs.h <<\_ACEOF
+#define USESIGSET 1
+_ACEOF
+
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+fi
+rm -f conftest.err conftest.$ac_objext \
+      conftest$ac_exeext conftest.$ac_ext
+{ echo "$as_me:$LINENO: checking signal implementation..." >&5
+echo "$as_me: checking signal implementation..." >&6;}
+if test "$cross_compiling" = yes; then
+  { { echo "$as_me:$LINENO: error: cannot run test program while cross compiling
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot run test program while cross compiling
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; }
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+#include <sys/types.h>
+#include <signal.h>
+
+#ifndef SIGCLD
+#define SIGCLD SIGCHLD
+#endif
+#ifdef USESIGSET
+#define signal sigset
+#endif
+
+int got;
+
+#ifdef SIGVOID
+void
+#endif
+hand()
+{
+  got++;
+}
+
+main()
+{
+  /* on hpux we use sigvec to get bsd signals */
+#ifdef __hpux
+  (void)signal(SIGCLD, hand);
+  kill(getpid(), SIGCLD);
+  kill(getpid(), SIGCLD);
+  if (got < 2)
+    exit(1);
+#endif
+  exit(0);
+}
+
+_ACEOF
+rm -f conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  :
+else
+  echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+( exit $ac_status )
+cat >>confdefs.h <<\_ACEOF
+#define SYSVSIGS 1
+_ACEOF
+
+fi
+rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+
+fi
+
+          ac_config_files="$ac_config_files Makefile"
+cat >confcache <<\_ACEOF
+# This file is a shell script that caches the results of configure
+# tests run on this system so they can be shared between configure
+# scripts and configure runs, see configure's option --config-cache.
+# It is not useful on other systems.  If it contains results you don't
+# want to keep, you may remove or edit it.
+#
+# config.status only pays attention to the cache file if you give it
+# the --recheck option to rerun configure.
+#
+# `ac_cv_env_foo' variables (set or unset) will be overridden when
+# loading this file, other *unset* `ac_cv_foo' will be assigned the
+# following values.
+
+_ACEOF
+
+# The following way of writing the cache mishandles newlines in values,
+# but we know of no workaround that is simple, portable, and efficient.
+# So, don't put newlines in cache variables' values.
+# Ultrix sh set writes to stderr and can't be redirected directly,
+# and sets the high bit in the cache file unless we assign to the vars.
+{
+  (set) 2>&1 |
+    case `(ac_space=' '; set | grep ac_space) 2>&1` in
+    *ac_space=\ *)
+      # `set' does not quote correctly, so add quotes (double-quote
+      # substitution turns \\\\ into \\, and sed turns \\ into \).
+      sed -n \
+       "s/'/'\\\\''/g;
+         s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p"
+      ;;
+    *)
+      # `set' quotes correctly as required by POSIX, so do not add quotes.
+      sed -n \
+       "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p"
+      ;;
+    esac;
+} |
+  sed '
+     t clear
+     : clear
+     s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/
+     t end
+     /^ac_cv_env/!s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/
+     : end' >>confcache
+if diff $cache_file confcache >/dev/null 2>&1; then :; else
+  if test -w $cache_file; then
+    test "x$cache_file" != "x/dev/null" && echo "updating cache $cache_file"
+    cat confcache >$cache_file
+  else
+    echo "not updating unwritable cache $cache_file"
+  fi
+fi
+rm -f confcache
+
+test "x$prefix" = xNONE && prefix=$ac_default_prefix
+# Let make expand exec_prefix.
+test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
+
+# VPATH may cause trouble with some makes, so we remove $(srcdir),
+# ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and
+# trailing colons and then remove the whole line if VPATH becomes empty
+# (actually we leave an empty line to preserve line numbers).
+if test "x$srcdir" = x.; then
+  ac_vpsub='/^[         ]*VPATH[        ]*=/{
+s/:*\$(srcdir):*/:/;
+s/:*\${srcdir}:*/:/;
+s/:*@srcdir@:*/:/;
+s/^\([^=]*=[    ]*\):*/\1/;
+s/:*$//;
+s/^[^=]*=[      ]*$//;
+}'
+fi
+
+DEFS=-DHAVE_CONFIG_H
+
+ac_libobjs=
+ac_ltlibobjs=
+for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue
+  # 1. Remove the extension, and $U if already installed.
+  ac_i=`echo "$ac_i" |
+        sed 's/\$U\././;s/\.o$//;s/\.obj$//'`
+  # 2. Add them.
+  ac_libobjs="$ac_libobjs $ac_i\$U.$ac_objext"
+  ac_ltlibobjs="$ac_ltlibobjs $ac_i"'$U.lo'
+done
+LIBOBJS=$ac_libobjs
+
+LTLIBOBJS=$ac_ltlibobjs
+
+
+
+: ${CONFIG_STATUS=./config.status}
+ac_clean_files_save=$ac_clean_files
+ac_clean_files="$ac_clean_files $CONFIG_STATUS"
+{ echo "$as_me:$LINENO: creating $CONFIG_STATUS" >&5
+echo "$as_me: creating $CONFIG_STATUS" >&6;}
+cat >$CONFIG_STATUS <<_ACEOF
+#! $SHELL
+# Generated by $as_me.
+# Run this file to recreate the current configuration.
+# Compiler output produced by configure, useful for debugging
+# configure, is in config.log if it exists.
+
+debug=false
+ac_cs_recheck=false
+ac_cs_silent=false
+SHELL=\${CONFIG_SHELL-$SHELL}
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+## --------------------- ##
+## M4sh Initialization.  ##
+## --------------------- ##
+
+# Be Bourne compatible
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
+  emulate sh
+  NULLCMD=:
+  # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '${1+"$@"}'='"$@"'
+elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then
+  set -o posix
+fi
+DUALCASE=1; export DUALCASE # for MKS sh
+
+# Support unset when possible.
+if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
+  as_unset=unset
+else
+  as_unset=false
+fi
+
+
+# Work around bugs in pre-3.0 UWIN ksh.
+$as_unset ENV MAIL MAILPATH
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# NLS nuisances.
+for as_var in \
+  LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \
+  LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \
+  LC_TELEPHONE LC_TIME
+do
+  if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then
+    eval $as_var=C; export $as_var
+  else
+    $as_unset $as_var
+  fi
+done
+
+# Required to use basename.
+if expr a : '\(a\)' >/dev/null 2>&1; then
+  as_expr=expr
+else
+  as_expr=false
+fi
+
+if (basename /) >/dev/null 2>&1 && test "X`basename / 2>&1`" = "X/"; then
+  as_basename=basename
+else
+  as_basename=false
+fi
+
+
+# Name of the executable.
+as_me=`$as_basename "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+        X"$0" : 'X\(//\)$' \| \
+        X"$0" : 'X\(/\)$' \| \
+        .     : '\(.\)' 2>/dev/null ||
+echo X/"$0" |
+    sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/; q; }
+         /^X\/\(\/\/\)$/{ s//\1/; q; }
+         /^X\/\(\/\).*/{ s//\1/; q; }
+         s/.*/./; q'`
+
+
+# PATH needs CR, and LINENO needs CR and PATH.
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+  echo "#! /bin/sh" >conf$$.sh
+  echo  "exit 0"   >>conf$$.sh
+  chmod +x conf$$.sh
+  if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then
+    PATH_SEPARATOR=';'
+  else
+    PATH_SEPARATOR=:
+  fi
+  rm -f conf$$.sh
+fi
+
+
+  as_lineno_1=$LINENO
+  as_lineno_2=$LINENO
+  as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null`
+  test "x$as_lineno_1" != "x$as_lineno_2" &&
+  test "x$as_lineno_3"  = "x$as_lineno_2"  || {
+  # Find who we are.  Look in the path if we contain no path at all
+  # relative or not.
+  case $0 in
+    *[\\/]* ) as_myself=$0 ;;
+    *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+done
+
+       ;;
+  esac
+  # We did not find ourselves, most probably we were run as `sh COMMAND'
+  # in which case we are not to be found in the path.
+  if test "x$as_myself" = x; then
+    as_myself=$0
+  fi
+  if test ! -f "$as_myself"; then
+    { { echo "$as_me:$LINENO: error: cannot find myself; rerun with an absolute path" >&5
+echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2;}
+   { (exit 1); exit 1; }; }
+  fi
+  case $CONFIG_SHELL in
+  '')
+    as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for as_base in sh bash ksh sh5; do
+        case $as_dir in
+        /*)
+          if ("$as_dir/$as_base" -c '
+  as_lineno_1=$LINENO
+  as_lineno_2=$LINENO
+  as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null`
+  test "x$as_lineno_1" != "x$as_lineno_2" &&
+  test "x$as_lineno_3"  = "x$as_lineno_2" ') 2>/dev/null; then
+            $as_unset BASH_ENV || test "${BASH_ENV+set}" != set || { BASH_ENV=; export BASH_ENV; }
+            $as_unset ENV || test "${ENV+set}" != set || { ENV=; export ENV; }
+            CONFIG_SHELL=$as_dir/$as_base
+            export CONFIG_SHELL
+            exec "$CONFIG_SHELL" "$0" ${1+"$@"}
+          fi;;
+        esac
+       done
+done
+;;
+  esac
+
+  # Create $as_me.lineno as a copy of $as_myself, but with $LINENO
+  # uniformly replaced by the line number.  The first 'sed' inserts a
+  # line-number line before each line; the second 'sed' does the real
+  # work.  The second script uses 'N' to pair each line-number line
+  # with the numbered line, and appends trailing '-' during
+  # substitution so that $LINENO is not a special case at line end.
+  # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the
+  # second 'sed' script.  Blame Lee E. McMahon for sed's syntax.  :-)
+  sed '=' <$as_myself |
+    sed '
+      N
+      s,$,-,
+      : loop
+      s,^\(['$as_cr_digits']*\)\(.*\)[$]LINENO\([^'$as_cr_alnum'_]\),\1\2\1\3,
+      t loop
+      s,-$,,
+      s,^['$as_cr_digits']*\n,,
+    ' >$as_me.lineno &&
+  chmod +x $as_me.lineno ||
+    { { echo "$as_me:$LINENO: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&5
+echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2;}
+   { (exit 1); exit 1; }; }
+
+  # Don't try to exec as it changes $[0], causing all sort of problems
+  # (the dirname of $[0] is not the place where we might find the
+  # original and so on.  Autoconf is especially sensible to this).
+  . ./$as_me.lineno
+  # Exit status is that of the last command.
+  exit
+}
+
+
+case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in
+  *c*,-n*) ECHO_N= ECHO_C='
+' ECHO_T='     ' ;;
+  *c*,*  ) ECHO_N=-n ECHO_C= ECHO_T= ;;
+  *)       ECHO_N= ECHO_C='\c' ECHO_T= ;;
+esac
+
+if expr a : '\(a\)' >/dev/null 2>&1; then
+  as_expr=expr
+else
+  as_expr=false
+fi
+
+rm -f conf$$ conf$$.exe conf$$.file
+echo >conf$$.file
+if ln -s conf$$.file conf$$ 2>/dev/null; then
+  # We could just check for DJGPP; but this test a) works b) is more generic
+  # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04).
+  if test -f conf$$.exe; then
+    # Don't use ln at all; we don't have any links
+    as_ln_s='cp -p'
+  else
+    as_ln_s='ln -s'
+  fi
+elif ln conf$$.file conf$$ 2>/dev/null; then
+  as_ln_s=ln
+else
+  as_ln_s='cp -p'
+fi
+rm -f conf$$ conf$$.exe conf$$.file
+
+if mkdir -p . 2>/dev/null; then
+  as_mkdir_p=:
+else
+  test -d ./-p && rmdir ./-p
+  as_mkdir_p=false
+fi
+
+as_executable_p="test -f"
+
+# Sed expression to map a string onto a valid CPP name.
+as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
+
+# Sed expression to map a string onto a valid variable name.
+as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
+
+
+# IFS
+# We need space, tab and new line, in precisely that order.
+as_nl='
+'
+IFS="  $as_nl"
+
+# CDPATH.
+$as_unset CDPATH
+
+exec 6>&1
+
+# Open the log real soon, to keep \$[0] and so on meaningful, and to
+# report actual input values of CONFIG_FILES etc. instead of their
+# values after options handling.  Logging --version etc. is OK.
+exec 5>>config.log
+{
+  echo
+  sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX
+## Running $as_me. ##
+_ASBOX
+} >&5
+cat >&5 <<_CSEOF
+
+This file was extended by $as_me, which was
+generated by GNU Autoconf 2.59.  Invocation command line was
+
+  CONFIG_FILES    = $CONFIG_FILES
+  CONFIG_HEADERS  = $CONFIG_HEADERS
+  CONFIG_LINKS    = $CONFIG_LINKS
+  CONFIG_COMMANDS = $CONFIG_COMMANDS
+  $ $0 $@
+
+_CSEOF
+echo "on `(hostname || uname -n) 2>/dev/null | sed 1q`" >&5
+echo >&5
+_ACEOF
+
+# Files that config.status was made for.
+if test -n "$ac_config_files"; then
+  echo "config_files=\"$ac_config_files\"" >>$CONFIG_STATUS
+fi
+
+if test -n "$ac_config_headers"; then
+  echo "config_headers=\"$ac_config_headers\"" >>$CONFIG_STATUS
+fi
+
+if test -n "$ac_config_links"; then
+  echo "config_links=\"$ac_config_links\"" >>$CONFIG_STATUS
+fi
+
+if test -n "$ac_config_commands"; then
+  echo "config_commands=\"$ac_config_commands\"" >>$CONFIG_STATUS
+fi
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+
+ac_cs_usage="\
+\`$as_me' instantiates files from templates according to the
+current configuration.
+
+Usage: $0 [OPTIONS] [FILE]...
+
+  -h, --help       print this help, then exit
+  -V, --version    print version number, then exit
+  -q, --quiet      do not print progress messages
+  -d, --debug      don't remove temporary files
+      --recheck    update $as_me by reconfiguring in the same conditions
+  --file=FILE[:TEMPLATE]
+                  instantiate the configuration file FILE
+  --header=FILE[:TEMPLATE]
+                  instantiate the configuration header FILE
+
+Configuration files:
+$config_files
+
+Configuration headers:
+$config_headers
+
+Report bugs to <bug-autoconf@gnu.org>."
+_ACEOF
+
+cat >>$CONFIG_STATUS <<_ACEOF
+ac_cs_version="\\
+config.status
+configured by $0, generated by GNU Autoconf 2.59,
+  with options \\"`echo "$ac_configure_args" | sed 's/[\\""\`\$]/\\\\&/g'`\\"
+
+Copyright (C) 2003 Free Software Foundation, Inc.
+This config.status script is free software; the Free Software Foundation
+gives unlimited permission to copy, distribute and modify it."
+srcdir=$srcdir
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+# If no file are specified by the user, then we need to provide default
+# value.  By we need to know if files were specified by the user.
+ac_need_defaults=:
+while test $# != 0
+do
+  case $1 in
+  --*=*)
+    ac_option=`expr "x$1" : 'x\([^=]*\)='`
+    ac_optarg=`expr "x$1" : 'x[^=]*=\(.*\)'`
+    ac_shift=:
+    ;;
+  -*)
+    ac_option=$1
+    ac_optarg=$2
+    ac_shift=shift
+    ;;
+  *) # This is not an option, so the user has probably given explicit
+     # arguments.
+     ac_option=$1
+     ac_need_defaults=false;;
+  esac
+
+  case $ac_option in
+  # Handling of the options.
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF
+  -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
+    ac_cs_recheck=: ;;
+  --version | --vers* | -V )
+    echo "$ac_cs_version"; exit 0 ;;
+  --he | --h)
+    # Conflict between --help and --header
+    { { echo "$as_me:$LINENO: error: ambiguous option: $1
+Try \`$0 --help' for more information." >&5
+echo "$as_me: error: ambiguous option: $1
+Try \`$0 --help' for more information." >&2;}
+   { (exit 1); exit 1; }; };;
+  --help | --hel | -h )
+    echo "$ac_cs_usage"; exit 0 ;;
+  --debug | --d* | -d )
+    debug=: ;;
+  --file | --fil | --fi | --f )
+    $ac_shift
+    CONFIG_FILES="$CONFIG_FILES $ac_optarg"
+    ac_need_defaults=false;;
+  --header | --heade | --head | --hea )
+    $ac_shift
+    CONFIG_HEADERS="$CONFIG_HEADERS $ac_optarg"
+    ac_need_defaults=false;;
+  -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+  | -silent | --silent | --silen | --sile | --sil | --si | --s)
+    ac_cs_silent=: ;;
+
+  # This is an error.
+  -*) { { echo "$as_me:$LINENO: error: unrecognized option: $1
+Try \`$0 --help' for more information." >&5
+echo "$as_me: error: unrecognized option: $1
+Try \`$0 --help' for more information." >&2;}
+   { (exit 1); exit 1; }; } ;;
+
+  *) ac_config_targets="$ac_config_targets $1" ;;
+
+  esac
+  shift
+done
+
+ac_configure_extra_args=
+
+if $ac_cs_silent; then
+  exec 6>/dev/null
+  ac_configure_extra_args="$ac_configure_extra_args --silent"
+fi
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF
+if \$ac_cs_recheck; then
+  echo "running $SHELL $0 " $ac_configure_args \$ac_configure_extra_args " --no-create --no-recursion" >&6
+  exec $SHELL $0 $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion
+fi
+
+_ACEOF
+
+
+
+
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+for ac_config_target in $ac_config_targets
+do
+  case "$ac_config_target" in
+  # Handling of arguments.
+  "Makefile" ) CONFIG_FILES="$CONFIG_FILES Makefile" ;;
+  "config.h" ) CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;;
+  *) { { echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5
+echo "$as_me: error: invalid argument: $ac_config_target" >&2;}
+   { (exit 1); exit 1; }; };;
+  esac
+done
+
+# If the user did not use the arguments to specify the items to instantiate,
+# then the envvar interface is used.  Set only those that are not.
+# We use the long form for the default assignment because of an extremely
+# bizarre bug on SunOS 4.1.3.
+if $ac_need_defaults; then
+  test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files
+  test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers
+fi
+
+# Have a temporary directory for convenience.  Make it in the build tree
+# simply because there is no reason to put it here, and in addition,
+# creating and moving files from /tmp can sometimes cause problems.
+# Create a temporary directory, and hook for its removal unless debugging.
+$debug ||
+{
+  trap 'exit_status=$?; rm -rf $tmp && exit $exit_status' 0
+  trap '{ (exit 1); exit 1; }' 1 2 13 15
+}
+
+# Create a (secure) tmp directory for tmp files.
+
+{
+  tmp=`(umask 077 && mktemp -d -q "./confstatXXXXXX") 2>/dev/null` &&
+  test -n "$tmp" && test -d "$tmp"
+}  ||
+{
+  tmp=./confstat$$-$RANDOM
+  (umask 077 && mkdir $tmp)
+} ||
+{
+   echo "$me: cannot create a temporary directory in ." >&2
+   { (exit 1); exit 1; }
+}
+
+_ACEOF
+
+cat >>$CONFIG_STATUS <<_ACEOF
+
+#
+# CONFIG_FILES section.
+#
+
+# No need to generate the scripts if there are no CONFIG_FILES.
+# This happens for instance when ./config.status config.h
+if test -n "\$CONFIG_FILES"; then
+  # Protect against being on the right side of a sed subst in config.status.
+  sed 's/,@/@@/; s/@,/@@/; s/,;t t\$/@;t t/; /@;t t\$/s/[\\\\&,]/\\\\&/g;
+   s/@@/,@/; s/@@/@,/; s/@;t t\$/,;t t/' >\$tmp/subs.sed <<\\CEOF
+s,@SHELL@,$SHELL,;t t
+s,@PATH_SEPARATOR@,$PATH_SEPARATOR,;t t
+s,@PACKAGE_NAME@,$PACKAGE_NAME,;t t
+s,@PACKAGE_TARNAME@,$PACKAGE_TARNAME,;t t
+s,@PACKAGE_VERSION@,$PACKAGE_VERSION,;t t
+s,@PACKAGE_STRING@,$PACKAGE_STRING,;t t
+s,@PACKAGE_BUGREPORT@,$PACKAGE_BUGREPORT,;t t
+s,@exec_prefix@,$exec_prefix,;t t
+s,@prefix@,$prefix,;t t
+s,@program_transform_name@,$program_transform_name,;t t
+s,@bindir@,$bindir,;t t
+s,@sbindir@,$sbindir,;t t
+s,@libexecdir@,$libexecdir,;t t
+s,@datadir@,$datadir,;t t
+s,@sysconfdir@,$sysconfdir,;t t
+s,@sharedstatedir@,$sharedstatedir,;t t
+s,@localstatedir@,$localstatedir,;t t
+s,@libdir@,$libdir,;t t
+s,@includedir@,$includedir,;t t
+s,@oldincludedir@,$oldincludedir,;t t
+s,@infodir@,$infodir,;t t
+s,@mandir@,$mandir,;t t
+s,@build_alias@,$build_alias,;t t
+s,@host_alias@,$host_alias,;t t
+s,@target_alias@,$target_alias,;t t
+s,@DEFS@,$DEFS,;t t
+s,@ECHO_C@,$ECHO_C,;t t
+s,@ECHO_N@,$ECHO_N,;t t
+s,@ECHO_T@,$ECHO_T,;t t
+s,@LIBS@,$LIBS,;t t
+s,@VERSION@,$VERSION,;t t
+s,@CC@,$CC,;t t
+s,@CFLAGS@,$CFLAGS,;t t
+s,@LDFLAGS@,$LDFLAGS,;t t
+s,@CPPFLAGS@,$CPPFLAGS,;t t
+s,@ac_ct_CC@,$ac_ct_CC,;t t
+s,@EXEEXT@,$EXEEXT,;t t
+s,@OBJEXT@,$OBJEXT,;t t
+s,@CPP@,$CPP,;t t
+s,@EGREP@,$EGREP,;t t
+s,@AWK@,$AWK,;t t
+s,@WRITEPATH@,$WRITEPATH,;t t
+s,@XTERMPATH@,$XTERMPATH,;t t
+s,@LIBOBJS@,$LIBOBJS,;t t
+s,@LTLIBOBJS@,$LTLIBOBJS,;t t
+CEOF
+
+_ACEOF
+
+  cat >>$CONFIG_STATUS <<\_ACEOF
+  # Split the substitutions into bite-sized pieces for seds with
+  # small command number limits, like on Digital OSF/1 and HP-UX.
+  ac_max_sed_lines=48
+  ac_sed_frag=1 # Number of current file.
+  ac_beg=1 # First line for current file.
+  ac_end=$ac_max_sed_lines # Line after last line for current file.
+  ac_more_lines=:
+  ac_sed_cmds=
+  while $ac_more_lines; do
+    if test $ac_beg -gt 1; then
+      sed "1,${ac_beg}d; ${ac_end}q" $tmp/subs.sed >$tmp/subs.frag
+    else
+      sed "${ac_end}q" $tmp/subs.sed >$tmp/subs.frag
+    fi
+    if test ! -s $tmp/subs.frag; then
+      ac_more_lines=false
+    else
+      # The purpose of the label and of the branching condition is to
+      # speed up the sed processing (if there are no `@' at all, there
+      # is no need to browse any of the substitutions).
+      # These are the two extra sed commands mentioned above.
+      (echo ':t
+  /@[a-zA-Z_][a-zA-Z_0-9]*@/!b' && cat $tmp/subs.frag) >$tmp/subs-$ac_sed_frag.sed
+      if test -z "$ac_sed_cmds"; then
+       ac_sed_cmds="sed -f $tmp/subs-$ac_sed_frag.sed"
+      else
+       ac_sed_cmds="$ac_sed_cmds | sed -f $tmp/subs-$ac_sed_frag.sed"
+      fi
+      ac_sed_frag=`expr $ac_sed_frag + 1`
+      ac_beg=$ac_end
+      ac_end=`expr $ac_end + $ac_max_sed_lines`
+    fi
+  done
+  if test -z "$ac_sed_cmds"; then
+    ac_sed_cmds=cat
+  fi
+fi # test -n "$CONFIG_FILES"
+
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF
+for ac_file in : $CONFIG_FILES; do test "x$ac_file" = x: && continue
+  # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in".
+  case $ac_file in
+  - | *:- | *:-:* ) # input from stdin
+       cat >$tmp/stdin
+       ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'`
+       ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;;
+  *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'`
+       ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;;
+  * )   ac_file_in=$ac_file.in ;;
+  esac
+
+  # Compute @srcdir@, @top_srcdir@, and @INSTALL@ for subdirectories.
+  ac_dir=`(dirname "$ac_file") 2>/dev/null ||
+$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+        X"$ac_file" : 'X\(//\)[^/]' \| \
+        X"$ac_file" : 'X\(//\)$' \| \
+        X"$ac_file" : 'X\(/\)' \| \
+        .     : '\(.\)' 2>/dev/null ||
+echo X"$ac_file" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+         /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+         /^X\(\/\/\)$/{ s//\1/; q; }
+         /^X\(\/\).*/{ s//\1/; q; }
+         s/.*/./; q'`
+  { if $as_mkdir_p; then
+    mkdir -p "$ac_dir"
+  else
+    as_dir="$ac_dir"
+    as_dirs=
+    while test ! -d "$as_dir"; do
+      as_dirs="$as_dir $as_dirs"
+      as_dir=`(dirname "$as_dir") 2>/dev/null ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+        X"$as_dir" : 'X\(//\)[^/]' \| \
+        X"$as_dir" : 'X\(//\)$' \| \
+        X"$as_dir" : 'X\(/\)' \| \
+        .     : '\(.\)' 2>/dev/null ||
+echo X"$as_dir" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+         /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+         /^X\(\/\/\)$/{ s//\1/; q; }
+         /^X\(\/\).*/{ s//\1/; q; }
+         s/.*/./; q'`
+    done
+    test ! -n "$as_dirs" || mkdir $as_dirs
+  fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5
+echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;}
+   { (exit 1); exit 1; }; }; }
+
+  ac_builddir=.
+
+if test "$ac_dir" != .; then
+  ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'`
+  # A "../" for each directory in $ac_dir_suffix.
+  ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'`
+else
+  ac_dir_suffix= ac_top_builddir=
+fi
+
+case $srcdir in
+  .)  # No --srcdir option.  We are building in place.
+    ac_srcdir=.
+    if test -z "$ac_top_builddir"; then
+       ac_top_srcdir=.
+    else
+       ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'`
+    fi ;;
+  [\\/]* | ?:[\\/]* )  # Absolute path.
+    ac_srcdir=$srcdir$ac_dir_suffix;
+    ac_top_srcdir=$srcdir ;;
+  *) # Relative path.
+    ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix
+    ac_top_srcdir=$ac_top_builddir$srcdir ;;
+esac
+
+# Do not use `cd foo && pwd` to compute absolute paths, because
+# the directories may not exist.
+case `pwd` in
+.) ac_abs_builddir="$ac_dir";;
+*)
+  case "$ac_dir" in
+  .) ac_abs_builddir=`pwd`;;
+  [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";;
+  *) ac_abs_builddir=`pwd`/"$ac_dir";;
+  esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_top_builddir=${ac_top_builddir}.;;
+*)
+  case ${ac_top_builddir}. in
+  .) ac_abs_top_builddir=$ac_abs_builddir;;
+  [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;;
+  *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;;
+  esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_srcdir=$ac_srcdir;;
+*)
+  case $ac_srcdir in
+  .) ac_abs_srcdir=$ac_abs_builddir;;
+  [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;;
+  *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;;
+  esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_top_srcdir=$ac_top_srcdir;;
+*)
+  case $ac_top_srcdir in
+  .) ac_abs_top_srcdir=$ac_abs_builddir;;
+  [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;;
+  *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;;
+  esac;;
+esac
+
+
+
+  if test x"$ac_file" != x-; then
+    { echo "$as_me:$LINENO: creating $ac_file" >&5
+echo "$as_me: creating $ac_file" >&6;}
+    rm -f "$ac_file"
+  fi
+  # Let's still pretend it is `configure' which instantiates (i.e., don't
+  # use $as_me), people would be surprised to read:
+  #    /* config.h.  Generated by config.status.  */
+  if test x"$ac_file" = x-; then
+    configure_input=
+  else
+    configure_input="$ac_file.  "
+  fi
+  configure_input=$configure_input"Generated from `echo $ac_file_in |
+                                    sed 's,.*/,,'` by configure."
+
+  # First look for the input files in the build tree, otherwise in the
+  # src tree.
+  ac_file_inputs=`IFS=:
+    for f in $ac_file_in; do
+      case $f in
+      -) echo $tmp/stdin ;;
+      [\\/$]*)
+        # Absolute (can't be DOS-style, as IFS=:)
+        test -f "$f" || { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5
+echo "$as_me: error: cannot find input file: $f" >&2;}
+   { (exit 1); exit 1; }; }
+        echo "$f";;
+      *) # Relative
+        if test -f "$f"; then
+          # Build tree
+          echo "$f"
+        elif test -f "$srcdir/$f"; then
+          # Source tree
+          echo "$srcdir/$f"
+        else
+          # /dev/null tree
+          { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5
+echo "$as_me: error: cannot find input file: $f" >&2;}
+   { (exit 1); exit 1; }; }
+        fi;;
+      esac
+    done` || { (exit 1); exit 1; }
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF
+  sed "$ac_vpsub
+$extrasub
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF
+:t
+/@[a-zA-Z_][a-zA-Z_0-9]*@/!b
+s,@configure_input@,$configure_input,;t t
+s,@srcdir@,$ac_srcdir,;t t
+s,@abs_srcdir@,$ac_abs_srcdir,;t t
+s,@top_srcdir@,$ac_top_srcdir,;t t
+s,@abs_top_srcdir@,$ac_abs_top_srcdir,;t t
+s,@builddir@,$ac_builddir,;t t
+s,@abs_builddir@,$ac_abs_builddir,;t t
+s,@top_builddir@,$ac_top_builddir,;t t
+s,@abs_top_builddir@,$ac_abs_top_builddir,;t t
+" $ac_file_inputs | (eval "$ac_sed_cmds") >$tmp/out
+  rm -f $tmp/stdin
+  if test x"$ac_file" != x-; then
+    mv $tmp/out $ac_file
+  else
+    cat $tmp/out
+    rm -f $tmp/out
+  fi
+
+done
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF
+
+#
+# CONFIG_HEADER section.
+#
+
+# These sed commands are passed to sed as "A NAME B NAME C VALUE D", where
+# NAME is the cpp macro being defined and VALUE is the value it is being given.
+#
+# ac_d sets the value in "#define NAME VALUE" lines.
+ac_dA='s,^\([   ]*\)#\([        ]*define[       ][      ]*\)'
+ac_dB='[        ].*$,\1#\2'
+ac_dC=' '
+ac_dD=',;t'
+# ac_u turns "#undef NAME" without trailing blanks into "#define NAME VALUE".
+ac_uA='s,^\([   ]*\)#\([        ]*\)undef\([    ][      ]*\)'
+ac_uB='$,\1#\2define\3'
+ac_uC=' '
+ac_uD=',;t'
+
+for ac_file in : $CONFIG_HEADERS; do test "x$ac_file" = x: && continue
+  # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in".
+  case $ac_file in
+  - | *:- | *:-:* ) # input from stdin
+       cat >$tmp/stdin
+       ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'`
+       ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;;
+  *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'`
+       ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;;
+  * )   ac_file_in=$ac_file.in ;;
+  esac
+
+  test x"$ac_file" != x- && { echo "$as_me:$LINENO: creating $ac_file" >&5
+echo "$as_me: creating $ac_file" >&6;}
+
+  # First look for the input files in the build tree, otherwise in the
+  # src tree.
+  ac_file_inputs=`IFS=:
+    for f in $ac_file_in; do
+      case $f in
+      -) echo $tmp/stdin ;;
+      [\\/$]*)
+        # Absolute (can't be DOS-style, as IFS=:)
+        test -f "$f" || { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5
+echo "$as_me: error: cannot find input file: $f" >&2;}
+   { (exit 1); exit 1; }; }
+        # Do quote $f, to prevent DOS paths from being IFS'd.
+        echo "$f";;
+      *) # Relative
+        if test -f "$f"; then
+          # Build tree
+          echo "$f"
+        elif test -f "$srcdir/$f"; then
+          # Source tree
+          echo "$srcdir/$f"
+        else
+          # /dev/null tree
+          { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5
+echo "$as_me: error: cannot find input file: $f" >&2;}
+   { (exit 1); exit 1; }; }
+        fi;;
+      esac
+    done` || { (exit 1); exit 1; }
+  # Remove the trailing spaces.
+  sed 's/[      ]*$//' $ac_file_inputs >$tmp/in
+
+_ACEOF
+
+# Transform confdefs.h into two sed scripts, `conftest.defines' and
+# `conftest.undefs', that substitutes the proper values into
+# config.h.in to produce config.h.  The first handles `#define'
+# templates, and the second `#undef' templates.
+# And first: Protect against being on the right side of a sed subst in
+# config.status.  Protect against being in an unquoted here document
+# in config.status.
+rm -f conftest.defines conftest.undefs
+# Using a here document instead of a string reduces the quoting nightmare.
+# Putting comments in sed scripts is not portable.
+#
+# `end' is used to avoid that the second main sed command (meant for
+# 0-ary CPP macros) applies to n-ary macro definitions.
+# See the Autoconf documentation for `clear'.
+cat >confdef2sed.sed <<\_ACEOF
+s/[\\&,]/\\&/g
+s,[\\$`],\\&,g
+t clear
+: clear
+s,^[    ]*#[    ]*define[       ][      ]*\([^  (][^    (]*\)\(([^)]*)\)[       ]*\(.*\)$,${ac_dA}\1${ac_dB}\1\2${ac_dC}\3${ac_dD},gp
+t end
+s,^[    ]*#[    ]*define[       ][      ]*\([^  ][^     ]*\)[   ]*\(.*\)$,${ac_dA}\1${ac_dB}\1${ac_dC}\2${ac_dD},gp
+: end
+_ACEOF
+# If some macros were called several times there might be several times
+# the same #defines, which is useless.  Nevertheless, we may not want to
+# sort them, since we want the *last* AC-DEFINE to be honored.
+uniq confdefs.h | sed -n -f confdef2sed.sed >conftest.defines
+sed 's/ac_d/ac_u/g' conftest.defines >conftest.undefs
+rm -f confdef2sed.sed
+
+# This sed command replaces #undef with comments.  This is necessary, for
+# example, in the case of _POSIX_SOURCE, which is predefined and required
+# on some systems where configure will not decide to define it.
+cat >>conftest.undefs <<\_ACEOF
+s,^[    ]*#[    ]*undef[        ][      ]*[a-zA-Z_][a-zA-Z_0-9]*,/* & */,
+_ACEOF
+
+# Break up conftest.defines because some shells have a limit on the size
+# of here documents, and old seds have small limits too (100 cmds).
+echo '  # Handle all the #define templates only if necessary.' >>$CONFIG_STATUS
+echo '  if grep "^[     ]*#[    ]*define" $tmp/in >/dev/null; then' >>$CONFIG_STATUS
+echo '  # If there are no defines, we may have an empty if/fi' >>$CONFIG_STATUS
+echo '  :' >>$CONFIG_STATUS
+rm -f conftest.tail
+while grep . conftest.defines >/dev/null
+do
+  # Write a limited-size here document to $tmp/defines.sed.
+  echo '  cat >$tmp/defines.sed <<CEOF' >>$CONFIG_STATUS
+  # Speed up: don't consider the non `#define' lines.
+  echo '/^[     ]*#[    ]*define/!b' >>$CONFIG_STATUS
+  # Work around the forget-to-reset-the-flag bug.
+  echo 't clr' >>$CONFIG_STATUS
+  echo ': clr' >>$CONFIG_STATUS
+  sed ${ac_max_here_lines}q conftest.defines >>$CONFIG_STATUS
+  echo 'CEOF
+  sed -f $tmp/defines.sed $tmp/in >$tmp/out
+  rm -f $tmp/in
+  mv $tmp/out $tmp/in
+' >>$CONFIG_STATUS
+  sed 1,${ac_max_here_lines}d conftest.defines >conftest.tail
+  rm -f conftest.defines
+  mv conftest.tail conftest.defines
+done
+rm -f conftest.defines
+echo '  fi # grep' >>$CONFIG_STATUS
+echo >>$CONFIG_STATUS
+
+# Break up conftest.undefs because some shells have a limit on the size
+# of here documents, and old seds have small limits too (100 cmds).
+echo '  # Handle all the #undef templates' >>$CONFIG_STATUS
+rm -f conftest.tail
+while grep . conftest.undefs >/dev/null
+do
+  # Write a limited-size here document to $tmp/undefs.sed.
+  echo '  cat >$tmp/undefs.sed <<CEOF' >>$CONFIG_STATUS
+  # Speed up: don't consider the non `#undef'
+  echo '/^[     ]*#[    ]*undef/!b' >>$CONFIG_STATUS
+  # Work around the forget-to-reset-the-flag bug.
+  echo 't clr' >>$CONFIG_STATUS
+  echo ': clr' >>$CONFIG_STATUS
+  sed ${ac_max_here_lines}q conftest.undefs >>$CONFIG_STATUS
+  echo 'CEOF
+  sed -f $tmp/undefs.sed $tmp/in >$tmp/out
+  rm -f $tmp/in
+  mv $tmp/out $tmp/in
+' >>$CONFIG_STATUS
+  sed 1,${ac_max_here_lines}d conftest.undefs >conftest.tail
+  rm -f conftest.undefs
+  mv conftest.tail conftest.undefs
+done
+rm -f conftest.undefs
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+  # Let's still pretend it is `configure' which instantiates (i.e., don't
+  # use $as_me), people would be surprised to read:
+  #    /* config.h.  Generated by config.status.  */
+  if test x"$ac_file" = x-; then
+    echo "/* Generated by configure.  */" >$tmp/config.h
+  else
+    echo "/* $ac_file.  Generated by configure.  */" >$tmp/config.h
+  fi
+  cat $tmp/in >>$tmp/config.h
+  rm -f $tmp/in
+  if test x"$ac_file" != x-; then
+    if diff $ac_file $tmp/config.h >/dev/null 2>&1; then
+      { echo "$as_me:$LINENO: $ac_file is unchanged" >&5
+echo "$as_me: $ac_file is unchanged" >&6;}
+    else
+      ac_dir=`(dirname "$ac_file") 2>/dev/null ||
+$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+        X"$ac_file" : 'X\(//\)[^/]' \| \
+        X"$ac_file" : 'X\(//\)$' \| \
+        X"$ac_file" : 'X\(/\)' \| \
+        .     : '\(.\)' 2>/dev/null ||
+echo X"$ac_file" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+         /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+         /^X\(\/\/\)$/{ s//\1/; q; }
+         /^X\(\/\).*/{ s//\1/; q; }
+         s/.*/./; q'`
+      { if $as_mkdir_p; then
+    mkdir -p "$ac_dir"
+  else
+    as_dir="$ac_dir"
+    as_dirs=
+    while test ! -d "$as_dir"; do
+      as_dirs="$as_dir $as_dirs"
+      as_dir=`(dirname "$as_dir") 2>/dev/null ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+        X"$as_dir" : 'X\(//\)[^/]' \| \
+        X"$as_dir" : 'X\(//\)$' \| \
+        X"$as_dir" : 'X\(/\)' \| \
+        .     : '\(.\)' 2>/dev/null ||
+echo X"$as_dir" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+         /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+         /^X\(\/\/\)$/{ s//\1/; q; }
+         /^X\(\/\).*/{ s//\1/; q; }
+         s/.*/./; q'`
+    done
+    test ! -n "$as_dirs" || mkdir $as_dirs
+  fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5
+echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;}
+   { (exit 1); exit 1; }; }; }
+
+      rm -f $ac_file
+      mv $tmp/config.h $ac_file
+    fi
+  else
+    cat $tmp/config.h
+    rm -f $tmp/config.h
+  fi
+done
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+
+{ (exit 0); exit 0; }
+_ACEOF
+chmod +x $CONFIG_STATUS
+ac_clean_files=$ac_clean_files_save
+
+
+# configure is writing to config.log, and then calls config.status.
+# config.status does its own redirection, appending to config.log.
+# Unfortunately, on DOS this fails, as config.log is still kept open
+# by configure, so config.status won't be able to write to it; its
+# output is simply discarded.  So we exec the FD to /dev/null,
+# effectively closing config.log, so it can be properly (re)opened and
+# appended to by config.status.  When coming back to configure, we
+# need to make the FD available again.
+if test "$no_create" != yes; then
+  ac_cs_success=:
+  ac_config_status_args=
+  test "$silent" = yes &&
+    ac_config_status_args="$ac_config_status_args --quiet"
+  exec 5>/dev/null
+  $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false
+  exec 5>>config.log
+  # Use ||, not &&, to avoid exiting from the if with $? = 1, which
+  # would make configure fail if this is the last instruction.
+  $ac_cs_success || { (exit 1); exit 1; }
+fi
+
diff --git a/examples/rlfe/configure.in b/examples/rlfe/configure.in
new file mode 100644 (file)
index 0000000..ad68541
--- /dev/null
@@ -0,0 +1,438 @@
+dnl Process this file with autoconf to produce a configure script.
+
+AC_INIT(rlfe.c)
+AC_CONFIG_HEADER(config.h)
+VERSION=0.4
+AC_SUBST(VERSION)
+
+dnl
+dnl Define some useful macros
+dnl
+AC_DEFUN(AC_PROGRAM_SOURCE,
+[AC_REQUIRE([AC_PROG_CPP])AC_PROVIDE([$0])cat > conftest.c <<EOF
+#include "confdefs.h"
+[$1]
+_CUT_HERE_
+[$2]
+EOF
+eval "$ac_cpp conftest.c 2>&5 | sed -e '1,/_CUT_HERE_/d' -e 's/ //g' > conftest.out"
+. ./conftest.out
+rm -f conftest*
+])dnl
+dnl
+define(AC_NOTE,
+[echo "$1" 1>&AC_FD_MSG
+])dnl
+
+old_CFLAGS="$CFLAGS"
+AC_PROG_CC
+AC_PROG_CPP
+AC_PROG_GCC_TRADITIONAL
+AC_ISC_POSIX
+
+AC_TRY_RUN(main(){exit(0);},,[
+if test $CC != cc ; then
+AC_NOTE(Your $CC failed - restarting with CC=cc)
+AC_NOTE()
+CC=cc
+export CC
+exec $0 $configure_args
+fi
+])
+
+AC_TRY_RUN(main(){exit(0);},,
+exec 5>&2
+eval $ac_link
+AC_NOTE(CC=$CC; CFLAGS=$CFLAGS; LIBS=$LIBS;)
+AC_NOTE($ac_compile)
+AC_MSG_ERROR(Can't run the compiler - sorry))
+
+AC_TRY_RUN([
+main()
+{
+  int __something_strange_();
+  __something_strange_(0);
+}
+],AC_MSG_ERROR(Your compiler does not set the exit status - sorry))
+
+AC_PROG_AWK
+
+if test -f etc/toolcheck; then
+AC_CHECKING(for buggy tools)
+sh etc/toolcheck 1>&AC_FD_MSG
+fi
+
+dnl
+dnl    ****  special unix variants  ****
+dnl
+
+AC_CHECKING(for System V)
+AC_TRY_COMPILE(
+[#include <sys/types.h>
+#include <signal.h>
+#include <fcntl.h>], [int x = SIGCHLD | FNDELAY;], , AC_DEFINE(SYSV))
+
+AC_CHECKING(for Solaris 2.x)
+AC_EGREP_CPP(yes,
+[#if defined(SVR4) && defined(sun)
+  yes
+#endif
+], LIBS="$LIBS -lsocket -lnsl -lkstat")
+
+dnl
+dnl    ****  select()  ****
+dnl
+
+AC_CHECKING(select)
+AC_TRY_LINK(,[select(0, 0, 0, 0, 0);],, 
+LIBS="$LIBS -lnet -lnsl"
+AC_CHECKING(select with $LIBS)
+AC_TRY_LINK(,[select(0, 0, 0, 0, 0);],, 
+AC_MSG_ERROR(!!! no select - no screen))
+)
+dnl
+dnl    ****  check the select implementation ****
+dnl
+
+AC_CHECKING(select return value)
+AC_TRY_RUN([
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+
+char *nam = "/tmp/conftest$$";
+
+#ifdef NAMEDPIPE
+
+#ifndef O_NONBLOCK
+#define O_NONBLOCK O_NDELAY
+#endif
+#ifndef S_IFIFO
+#define S_IFIFO 0010000
+#endif
+
+
+main()
+{
+#ifdef FD_SET
+  fd_set f;
+#else
+  int f;
+#endif
+
+#ifdef __FreeBSD__
+/* From Andrew A. Chernov (ache@astral.msk.su):
+ * opening RDWR fifo fails in BSD 4.4, but select return values are
+ * right.
+ */
+  exit(0);
+#endif
+  (void)alarm(5);
+#ifdef POSIX
+  if (mkfifo(nam, 0777))
+#else
+  if (mknod(nam, S_IFIFO|0777, 0))
+#endif
+    exit(1);
+  close(0);
+  if (open(nam, O_RDWR | O_NONBLOCK))
+    exit(1);
+  if (write(0, "TEST", 4) == -1)
+    exit(1);
+
+#else
+
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <sys/un.h>
+
+main()
+{
+  int s1, s2, l;
+  struct sockaddr_un a;
+#ifdef FD_SET
+  fd_set f;
+#else
+  int f;
+#endif
+
+  (void)alarm(5);
+  if ((s1 = socket(AF_UNIX, SOCK_STREAM, 0)) == -1)
+    exit(1);
+  a.sun_family = AF_UNIX;
+  strcpy(a.sun_path, nam);
+  (void) unlink(nam);
+  if (bind(s1, (struct sockaddr *) &a, strlen(nam)+2) == -1)
+    exit(1);
+  if (listen(s1, 2))
+    exit(1);
+  if (fork() == 0)
+    {
+      if ((s2 = socket(AF_UNIX, SOCK_STREAM, 0)) == -1)
+       kill(getppid(), 3);
+      (void)connect(s2, (struct sockaddr *)&a, strlen(nam) + 2);
+      if (write(s2, "HELLO", 5) == -1)
+       kill(getppid(), 3);
+      exit(0);
+    }
+  l = sizeof(a);
+  close(0);
+  if (accept(s1, (struct sockaddr *)&a, &l))
+    exit(1);
+#endif
+
+
+#ifdef FD_SET
+  FD_SET(0, &f);
+#else
+  f = 1;
+#endif
+  if (select(1, &f, 0, 0, 0) == -1)
+    exit(1);
+  if (select(1, &f, &f, 0, 0) != 2)
+    exit(1);
+  exit(0);
+}
+],AC_NOTE(- select is ok),
+AC_NOTE(- select can't count) AC_DEFINE(SELECT_BROKEN))
+
+dnl
+dnl    ****  termcap or terminfo  ****
+dnl
+AC_CHECKING(for tgetent)
+AC_TRY_LINK(,tgetent((char *)0, (char *)0);,,
+olibs="$LIBS"
+LIBS="-lcurses $olibs"
+AC_CHECKING(libcurses)
+AC_TRY_LINK(,[
+#ifdef __hpux
+__sorry_hpux_libcurses_is_totally_broken_in_10_10();
+#else
+tgetent((char *)0, (char *)0);
+#endif
+],,
+LIBS="-ltermcap $olibs"
+AC_CHECKING(libtermcap)
+AC_TRY_LINK(,tgetent((char *)0, (char *)0);,,
+LIBS="-ltermlib $olibs"
+AC_CHECKING(libtermlib)
+AC_TRY_LINK(,tgetent((char *)0, (char *)0);,,
+LIBS="-lncurses $olibs"
+AC_CHECKING(libncurses)
+AC_TRY_LINK(,tgetent((char *)0, (char *)0);,,
+AC_MSG_ERROR(!!! no tgetent - no screen))))))
+
+AC_TRY_RUN([
+main()
+{
+ exit(strcmp(tgoto("%p1%d", 0, 1), "1") ? 0 : 1);
+}], AC_NOTE(- you use the termcap database),
+AC_NOTE(- you use the terminfo database) AC_DEFINE(TERMINFO))
+AC_CHECKING(ospeed)
+AC_TRY_LINK(extern short ospeed;,ospeed=5;,,AC_DEFINE(NEED_OSPEED))
+
+dnl
+dnl    ****  PTY specific things  ****
+dnl
+AC_CHECKING(for /dev/ptc)
+if test -r /dev/ptc; then
+AC_DEFINE(HAVE_DEV_PTC)
+fi
+
+AC_CHECKING(for SVR4 ptys)
+sysvr4ptys=
+if test -c /dev/ptmx ; then
+AC_TRY_LINK([],[ptsname(0);grantpt(0);unlockpt(0);],[AC_DEFINE(HAVE_SVR4_PTYS)
+sysvr4ptys=1])
+fi
+
+AC_CHECK_FUNCS(getpt)
+
+dnl check for openpty()
+if test -z "$sysvr4ptys"; then
+AC_CHECK_FUNCS(openpty,,
+[AC_CHECK_LIB(util,openpty, [AC_DEFINE(HAVE_OPENPTY)] [LIBS="$LIBS -lutil"])])
+fi
+
+AC_CHECKING(for ptyranges)
+if test -d /dev/ptym ; then
+pdir='/dev/ptym'
+else
+pdir='/dev'
+fi
+dnl SCO uses ptyp%d
+AC_EGREP_CPP(yes,
+[#ifdef M_UNIX
+   yes;
+#endif
+], ptys=`echo /dev/ptyp??`, ptys=`echo $pdir/pty??`)
+dnl if test -c /dev/ptyp19; then
+dnl ptys=`echo /dev/ptyp??`
+dnl else
+dnl ptys=`echo $pdir/pty??`
+dnl fi
+if test "$ptys" != "$pdir/pty??" ; then
+p0=`echo $ptys | tr ' ' '\012' | sed -e 's/^.*\(.\).$/\1/g' | sort -u | tr -d '\012'`
+p1=`echo $ptys | tr ' ' '\012' | sed -e 's/^.*\(.\)$/\1/g'  | sort -u | tr -d '\012'`
+AC_DEFINE_UNQUOTED(PTYRANGE0,"$p0")
+AC_DEFINE_UNQUOTED(PTYRANGE1,"$p1")
+fi
+
+dnl    ****  pty mode/group handling ****
+dnl
+dnl support provided by Luke Mewburn <lm@rmit.edu.au>, 931222
+AC_ARG_WITH(pty-mode, [  --with-pty-mode=mode    default mode for ptys], [ ptymode="${withval}" ])
+AC_ARG_WITH(pty-group, [  --with-pty-group=group  default group for ptys], [ ptygrp="${withval}" ])
+test -n "$ptymode" || ptymode=0620
+if test -n "$ptygrp" ; then
+AC_DEFINE_UNQUOTED(PTYMODE, $ptymode)
+AC_DEFINE_UNQUOTED(PTYGROUP,$ptygrp)
+else
+
+AC_CHECKING(default tty permissions/group)
+rm -f conftest_grp
+AC_TRY_RUN([
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <stdio.h>
+main()
+{
+  struct stat sb;
+  char *x,*ttyname();
+  int om, m;
+  FILE *fp;
+
+  if (!(x = ttyname(0))) exit(1);
+  if (stat(x, &sb)) exit(1);
+  om = sb.st_mode;
+  if (om & 002) exit(0);
+  m = system("mesg y");
+  if (m == -1 || m == 127) exit(1);
+  if (stat(x, &sb)) exit(1);
+  m = sb.st_mode;
+  if (chmod(x, om)) exit(1);
+  if (m & 002) exit(0);
+  if (sb.st_gid == getgid()) exit(1);
+  if (!(fp=fopen("conftest_grp", "w")))
+    exit(1);
+  fprintf(fp, "%d\n", sb.st_gid);
+  fclose(fp);
+  exit(0);
+}
+],[
+    if test -f conftest_grp; then
+       ptygrp=`cat conftest_grp`
+       AC_NOTE([- pty mode: $ptymode, group: $ptygrp])
+       AC_DEFINE_UNQUOTED(PTYMODE, $ptymode)
+       AC_DEFINE_UNQUOTED(PTYGROUP,$ptygrp)
+    else
+       AC_NOTE(- ptys are world accessable)
+    fi
+],[
+    WRITEPATH=''
+    XTERMPATH=''
+    AC_PATH_PROG(WRITEPATH, write)
+    AC_PATH_PROG(XTERMPATH, xterm)
+    found=
+    if test -n "$WRITEPATH$XTERMPATH"; then
+      findfollow=
+      lsfollow=
+      found=`find $WRITEPATH $XTERMPATH -follow -print 2>/dev/null`
+      if test -n "$found"; then
+       findfollow=-follow
+       lsfollow=L
+      fi
+      if test -n "$XTERMPATH"; then
+       ptygrpn=`ls -l$lsfollow $XTERMPATH | sed -n -e 1p | $AWK '{print $4}'`
+       if test tty != "$ptygrpn"; then
+         XTERMPATH=
+       fi
+      fi
+    fi
+    if test -n "$WRITEPATH$XTERMPATH"; then
+      found=`find $WRITEPATH $XTERMPATH $findfollow -perm -2000 -print` 
+      if test -n "$found"; then
+       ptygrp=`ls -ln$lsfollow $found | sed -n -e 1p | $AWK '{print $4}'`
+       AC_NOTE([- pty mode: $ptymode, group: $ptygrp])
+       AC_DEFINE_UNQUOTED(PTYMODE, $ptymode)
+       AC_DEFINE_UNQUOTED(PTYGROUP,$ptygrp)
+      else
+       AC_NOTE(- ptys are world accessable)
+      fi
+    else
+      AC_NOTE(- can't determine - assume ptys are world accessable)
+    fi
+  ]
+)
+rm -f conftest_grp
+fi
+
+dnl
+dnl    ****  signal handling  ****
+dnl
+if test -n "$posix" ; then
+
+dnl POSIX has reliable signals with void return type.
+AC_NOTE(assuming posix signal definition)
+AC_DEFINE(SIGVOID)
+
+else
+
+AC_CHECKING(return type of signal handlers)
+AC_TRY_COMPILE(
+[#include <sys/types.h>
+#include <signal.h>
+#ifdef signal
+#undef signal
+#endif
+extern void (*signal ()) ();], [int i;], AC_DEFINE(SIGVOID))
+AC_CHECKING(sigset)
+AC_TRY_LINK([
+#include <sys/types.h>
+#include <signal.h>
+],[
+#ifdef SIGVOID
+sigset(0, (void (*)())0);
+#else
+sigset(0, (int (*)())0);
+#endif
+], AC_DEFINE(USESIGSET))
+AC_CHECKING(signal implementation)
+AC_TRY_RUN([
+#include <sys/types.h>
+#include <signal.h>
+
+#ifndef SIGCLD
+#define SIGCLD SIGCHLD
+#endif
+#ifdef USESIGSET
+#define signal sigset
+#endif
+
+int got;
+
+#ifdef SIGVOID
+void
+#endif
+hand()
+{
+  got++;
+}
+
+main()
+{
+  /* on hpux we use sigvec to get bsd signals */
+#ifdef __hpux
+  (void)signal(SIGCLD, hand);
+  kill(getpid(), SIGCLD);
+  kill(getpid(), SIGCLD);
+  if (got < 2)
+    exit(1);
+#endif
+  exit(0);
+}
+],,AC_DEFINE(SYSVSIGS))
+
+fi
+
+AC_OUTPUT(Makefile)
diff --git a/examples/rlfe/extern.h b/examples/rlfe/extern.h
new file mode 100644 (file)
index 0000000..37d4275
--- /dev/null
@@ -0,0 +1,33 @@
+/* Copyright (c) 1993-2002
+ *      Juergen Weigert (jnweiger@immd4.informatik.uni-erlangen.de)
+ *      Michael Schroeder (mlschroe@immd4.informatik.uni-erlangen.de)
+ * Copyright (c) 1987 Oliver Laumann
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program (see the file COPYING); if not, write to the
+ * Free Software Foundation, Inc.,
+ * 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA
+ *
+ ****************************************************************
+ * $Id: extern.h,v 1.18 1994/05/31 12:31:57 mlschroe Exp $ FAU
+ */
+
+#if !defined(__GNUC__) || __GNUC__ < 2
+#undef __attribute__
+#define __attribute__(x)
+#endif
+
+/* pty.c */
+extern int   OpenPTY __P((char **));
+extern void  InitPTY __P((int));
+
diff --git a/examples/rlfe/os.h b/examples/rlfe/os.h
new file mode 100644 (file)
index 0000000..0008a5c
--- /dev/null
@@ -0,0 +1,530 @@
+/* Copyright (c) 1993-2002
+ *      Juergen Weigert (jnweiger@immd4.informatik.uni-erlangen.de)
+ *      Michael Schroeder (mlschroe@immd4.informatik.uni-erlangen.de)
+ * Copyright (c) 1987 Oliver Laumann
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program (see the file COPYING); if not, write to the
+ * Free Software Foundation, Inc.,
+ * 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA
+ *
+ ****************************************************************
+ * $Id: os.h,v 1.10 1994/05/31 12:32:22 mlschroe Exp $ FAU
+ */
+
+#include <stdio.h>
+#include <errno.h>
+
+#include <sys/param.h>
+
+/* In strict ANSI mode, HP-UX machines define __hpux but not hpux */
+#if defined(__hpux) && !defined(hpux)
+# define hpux
+#endif
+
+#if defined(__bsdi__) || defined(__386BSD__) || defined(_CX_UX) || defined(hpux) || defined(_IBMR2) || defined(linux)
+# include <signal.h>
+#endif /* __bsdi__ || __386BSD__ || _CX_UX || hpux || _IBMR2 || linux */
+
+#ifdef ISC
+# ifdef ENAMETOOLONG
+#  undef ENAMETOOLONG
+# endif
+# ifdef ENOTEMPTY
+#  undef ENOTEMPTY
+# endif
+# include <sys/bsdtypes.h>
+# include <net/errno.h>
+#endif
+
+#ifdef sun
+# define getpgrp __getpgrp
+# define exit __exit
+#endif
+#ifdef POSIX
+# include <unistd.h>
+# if defined(__STDC__)
+#  include <stdlib.h>
+# endif /* __STDC__ */
+#endif /* POSIX */
+#ifdef sun
+# undef getpgrp
+# undef exit
+#endif /* sun */
+
+#ifndef linux /* all done in <errno.h> */
+extern int errno;
+#endif /* linux */
+#ifndef HAVE_STRERROR
+/* No macros, please */
+#undef strerror
+#endif
+
+#if !defined(SYSV) && !defined(linux)
+# ifdef NEWSOS
+#  define strlen ___strlen___
+#  include <strings.h>
+#  undef strlen
+# else /* NEWSOS */
+#  include <strings.h>
+# endif /* NEWSOS */
+#else /* SYSV */
+# if defined(SVR4) || defined(NEWSOS)
+#  define strlen ___strlen___
+#  include <string.h>
+#  undef strlen
+#  if !defined(NEWSOS) && !defined(__hpux)
+    extern size_t strlen(const char *);
+#  endif
+# else /* SVR4 */
+#  include <string.h>
+# endif /* SVR4 */
+#endif /* SYSV */
+
+#ifdef USEVARARGS
+# if defined(__STDC__)
+#  include <stdarg.h>
+#  define VA_LIST(var) va_list var;
+#  define VA_DOTS ...
+#  define VA_DECL
+#  define VA_START(ap, fmt) va_start(ap, fmt)
+#  define VA_ARGS(ap) ap
+#  define VA_END(ap) va_end(ap)
+# else
+#  include <varargs.h>
+#  define VA_LIST(var) va_list var;
+#  define VA_DOTS va_alist
+#  define VA_DECL va_dcl
+#  define VA_START(ap, fmt) va_start(ap)
+#  define VA_ARGS(ap) ap
+#  define VA_END(ap) va_end(ap)
+# endif
+#else
+# define VA_LIST(var)
+# define VA_DOTS p1, p2, p3, p4, p5, p6
+# define VA_DECL unsigned long VA_DOTS;
+# define VA_START(ap, fmt)
+# define VA_ARGS(ap) VA_DOTS
+# define VA_END(ap)
+# undef vsnprintf
+# define vsnprintf xsnprintf
+#endif
+
+#if !defined(sun) && !defined(B43) && !defined(ISC) && !defined(pyr) && !defined(_CX_UX)
+# include <time.h>
+#endif
+#include <sys/time.h>
+
+#ifdef M_UNIX   /* SCO */
+# include <sys/stream.h>
+# include <sys/ptem.h>
+# define ftruncate(fd, s) chsize(fd, s)
+#endif
+
+#ifdef SYSV
+# define index strchr
+# define rindex strrchr
+# define bzero(poi,len) memset(poi,0,len)
+# define bcmp memcmp
+# define killpg(pgrp,sig) kill( -(pgrp), sig)
+#endif
+
+#ifndef HAVE_GETCWD
+# define getcwd(b,l) getwd(b)
+#endif
+
+#ifndef USEBCOPY
+# ifdef USEMEMMOVE
+#  define bcopy(s,d,len) memmove(d,s,len)
+# else
+#  ifdef USEMEMCPY
+#   define bcopy(s,d,len) memcpy(d,s,len)
+#  else
+#   define NEED_OWN_BCOPY
+#   define bcopy xbcopy
+#  endif
+# endif
+#endif
+
+#ifdef hpux
+# define setreuid(ruid, euid) setresuid(ruid, euid, -1)
+# define setregid(rgid, egid) setresgid(rgid, egid, -1)
+#endif
+
+#if defined(HAVE_SETEUID) || defined(HAVE_SETREUID)
+# define USE_SETEUID
+#endif
+
+#if !defined(HAVE__EXIT) && !defined(_exit)
+#define _exit(x) exit(x)
+#endif
+
+#ifndef HAVE_UTIMES
+# define utimes utime
+#endif
+
+#ifdef BUILTIN_TELNET
+# include <netinet/in.h>
+# include <arpa/inet.h>
+#endif
+
+#if defined(USE_LOCALE) && (!defined(HAVE_SETLOCALE) || !defined(HAVE_STRFTIME))
+# undef USE_LOCALE
+#endif
+
+/*****************************************************************
+ *    terminal handling
+ */
+
+#ifdef POSIX
+# include <termios.h>
+# ifdef hpux
+#  include <bsdtty.h>
+# endif /* hpux */
+# ifdef NCCS
+#  define MAXCC NCCS
+# else
+#  define MAXCC 256
+# endif
+#else /* POSIX */
+# ifdef TERMIO
+#  include <termio.h>
+#  ifdef NCC
+#   define MAXCC NCC
+#  else
+#   define MAXCC 256
+#  endif
+#  ifdef CYTERMIO
+#   include <cytermio.h>
+#  endif
+# else /* TERMIO */
+#  include <sgtty.h>
+# endif /* TERMIO */
+#endif /* POSIX */
+
+#ifndef VDISABLE
+# ifdef _POSIX_VDISABLE
+#  define VDISABLE _POSIX_VDISABLE
+# else
+#  define VDISABLE 0377
+# endif /* _POSIX_VDISABLE */
+#endif /* !VDISABLE */
+
+
+/* on sgi, regardless of the stream head's read mode (RNORM/RMSGN/RMSGD)
+ * TIOCPKT mode causes data loss if our buffer is too small (IOSIZE)
+ * to hold the whole packet at first read().
+ * (Marc Boucher)
+ *
+ * matthew green:
+ * TIOCPKT is broken on dgux 5.4.1 generic AViiON mc88100
+ *
+ * Joe Traister: On AIX4, programs like irc won't work if screen
+ * uses TIOCPKT (select fails to return on pty read).
+ */
+#if defined(sgi) || defined(DGUX) || defined(_IBMR2)
+# undef TIOCPKT
+#endif
+
+/* linux ncurses is broken, we have to use our own tputs */
+#if defined(linux) && defined(TERMINFO)
+# define tputs xtputs
+#endif
+
+/* Alexandre Oliva: SVR4 style ptys don't work with osf */
+#ifdef __osf__
+# undef HAVE_SVR4_PTYS
+#endif
+
+/*****************************************************************
+ *   utmp handling
+ */
+
+#ifdef GETUTENT
+  typedef char *slot_t;
+#else
+  typedef int slot_t;
+#endif
+
+#if defined(UTMPOK) || defined(BUGGYGETLOGIN)
+# if defined(SVR4) && !defined(DGUX) && !defined(__hpux) && !defined(linux)
+#  include <utmpx.h>
+#  define UTMPFILE     UTMPX_FILE
+#  define utmp         utmpx
+#  define getutent     getutxent
+#  define getutid      getutxid
+#  define getutline    getutxline
+#  define pututline    pututxline
+#  define setutent     setutxent
+#  define endutent     endutxent
+#  define ut_time      ut_xtime
+# else /* SVR4 */
+#  include <utmp.h>
+# endif /* SVR4 */
+# ifdef apollo
+   /* 
+    * We don't have GETUTENT, so we dig into utmp ourselves.
+    * But we save the permanent filedescriptor and
+    * open utmp just when we need to. 
+    * This code supports an unsorted utmp. jw.
+    */
+#  define UTNOKEEP
+# endif /* apollo */
+
+# ifndef UTMPFILE
+#  ifdef UTMP_FILE
+#   define UTMPFILE    UTMP_FILE
+#  else
+#   ifdef _PATH_UTMP
+#    define UTMPFILE   _PATH_UTMP
+#   else
+#    define UTMPFILE   "/etc/utmp"
+#   endif /* _PATH_UTMP */
+#  endif
+# endif
+
+#endif /* UTMPOK || BUGGYGETLOGIN */
+
+#if !defined(UTMPOK) && defined(USRLIMIT)
+# undef USRLIMIT
+#endif
+
+#ifdef LOGOUTOK
+# ifndef LOGINDEFAULT
+#  define LOGINDEFAULT 0
+# endif
+#else
+# ifdef LOGINDEFAULT
+#  undef LOGINDEFAULT
+# endif
+# define LOGINDEFAULT 1
+#endif
+
+
+/*****************************************************************
+ *    file stuff
+ */
+
+#ifndef F_OK
+#define F_OK 0
+#endif
+#ifndef X_OK
+#define X_OK 1
+#endif
+#ifndef W_OK
+#define W_OK 2
+#endif
+#ifndef R_OK
+#define R_OK 4
+#endif
+
+#ifndef S_IFIFO
+#define S_IFIFO  0010000
+#endif
+#ifndef S_IREAD
+#define S_IREAD  0000400
+#endif
+#ifndef S_IWRITE
+#define S_IWRITE 0000200
+#endif
+#ifndef S_IEXEC
+#define S_IEXEC  0000100
+#endif
+
+#if defined(S_IFIFO) && defined(S_IFMT) && !defined(S_ISFIFO)
+#define S_ISFIFO(mode) (((mode) & S_IFMT) == S_IFIFO)
+#endif
+#if defined(S_IFSOCK) && defined(S_IFMT) && !defined(S_ISSOCK)
+#define S_ISSOCK(mode) (((mode) & S_IFMT) == S_IFSOCK)
+#endif
+#if defined(S_IFCHR) && defined(S_IFMT) && !defined(S_ISCHR)
+#define S_ISCHR(mode) (((mode) & S_IFMT) == S_IFCHR)
+#endif
+#if defined(S_IFDIR) && defined(S_IFMT) && !defined(S_ISDIR)
+#define S_ISDIR(mode) (((mode) & S_IFMT) == S_IFDIR)
+#endif
+#if defined(S_IFLNK) && defined(S_IFMT) && !defined(S_ISLNK)
+#define S_ISLNK(mode) (((mode) & S_IFMT) == S_IFLNK)
+#endif
+
+/*
+ * SunOS 4.1.3: `man 2V open' has only one line that mentions O_NOBLOCK:
+ *
+ *     O_NONBLOCK     Same as O_NDELAY above.
+ *
+ * on the very same SunOS 4.1.3, I traced the open system call and found
+ * that an open("/dev/ttyy08", O_RDWR|O_NONBLOCK|O_NOCTTY) was blocked,
+ * whereas open("/dev/ttyy08", O_RDWR|O_NDELAY  |O_NOCTTY) went through.
+ *
+ * For this simple reason I now favour O_NDELAY. jw. 4.5.95
+ */
+#if defined(sun) && !defined(SVR4)
+# undef O_NONBLOCK
+#endif
+
+#if !defined(O_NONBLOCK) && defined(O_NDELAY)
+# define O_NONBLOCK O_NDELAY
+#endif
+
+#if !defined(FNBLOCK) && defined(FNONBLOCK)
+# define FNBLOCK FNONBLOCK
+#endif
+#if !defined(FNBLOCK) && defined(FNDELAY)
+# define FNBLOCK FNDELAY
+#endif
+#if !defined(FNBLOCK) && defined(O_NONBLOCK)
+# define FNBLOCK O_NONBLOCK
+#endif
+
+#ifndef POSIX
+#undef mkfifo
+#define mkfifo(n,m) mknod(n,S_IFIFO|(m),0)
+#endif
+
+#if !defined(HAVE_LSTAT) && !defined(lstat)
+# define lstat stat
+#endif
+
+/*****************************************************************
+ *    signal handling
+ */
+
+#ifdef SIGVOID
+# define SIGRETURN
+# define sigret_t void
+#else
+# define SIGRETURN return 0;
+# define sigret_t int
+#endif
+
+/* Geeeee, reverse it? */
+#if defined(SVR4) || (defined(SYSV) && defined(ISC)) || defined(_AIX) || defined(linux) || defined(ultrix) || defined(__386BSD__) || defined(__bsdi__) || defined(POSIX) || defined(NeXT)
+# define SIGHASARG
+#endif
+
+#ifdef SIGHASARG
+# define SIGPROTOARG   (int)
+# define SIGDEFARG     (sigsig) int sigsig;
+# define SIGARG        0
+#else
+# define SIGPROTOARG   (void)
+# define SIGDEFARG     ()
+# define SIGARG
+#endif
+
+#ifndef SIGCHLD
+#define SIGCHLD SIGCLD
+#endif
+
+#if defined(POSIX) || defined(hpux)
+# define signal xsignal
+#else
+# ifdef USESIGSET
+#  define signal sigset
+# endif /* USESIGSET */
+#endif
+
+/* used in screen.c and attacher.c */
+#ifndef NSIG           /* kbeal needs these w/o SYSV */
+# define NSIG 32
+#endif /* !NSIG */
+
+
+/*****************************************************************
+ *    Wait stuff
+ */
+
+#if (!defined(sysV68) && !defined(M_XENIX)) || defined(NeXT) || defined(M_UNIX)
+# include <sys/wait.h>
+#endif
+
+#ifndef WTERMSIG
+# ifndef BSDWAIT /* if wait is NOT a union: */
+#  define WTERMSIG(status) (status & 0177)
+# else
+#  define WTERMSIG(status) status.w_T.w_Termsig 
+# endif
+#endif
+
+#ifndef WSTOPSIG
+# ifndef BSDWAIT /* if wait is NOT a union: */
+#  define WSTOPSIG(status) ((status >> 8) & 0377)
+# else
+#  define WSTOPSIG(status) status.w_S.w_Stopsig 
+# endif
+#endif
+
+/* NET-2 uses WCOREDUMP */
+#if defined(WCOREDUMP) && !defined(WIFCORESIG)
+# define WIFCORESIG(status) WCOREDUMP(status)
+#endif
+
+#ifndef WIFCORESIG
+# ifndef BSDWAIT /* if wait is NOT a union: */
+#  define WIFCORESIG(status) (status & 0200)
+# else
+#  define WIFCORESIG(status) status.w_T.w_Coredump
+# endif
+#endif
+
+#ifndef WEXITSTATUS
+# ifndef BSDWAIT /* if wait is NOT a union: */
+#  define WEXITSTATUS(status) ((status >> 8) & 0377)
+# else
+#  define WEXITSTATUS(status) status.w_T.w_Retcode
+# endif
+#endif
+
+
+/*****************************************************************
+ *    select stuff
+ */
+
+#if defined(M_XENIX) || defined(M_UNIX) || defined(_SEQUENT_)
+#include <sys/select.h>                /* for timeval + FD... */
+#endif
+
+/*
+ * SunOS 3.5 - Tom Schmidt - Micron Semiconductor, Inc - 27-Jul-93
+ * tschmidt@vax.micron.com
+ */
+#ifndef FD_SET
+# ifndef SUNOS3
+typedef struct fd_set { int fds_bits[1]; } fd_set;
+# endif
+# define FD_ZERO(fd) ((fd)->fds_bits[0] = 0)
+# define FD_SET(b, fd) ((fd)->fds_bits[0] |= 1 << (b))
+# define FD_ISSET(b, fd) ((fd)->fds_bits[0] & 1 << (b))
+# define FD_SETSIZE 32
+#endif
+
+
+/*****************************************************************
+ *    user defineable stuff
+ */
+
+#ifndef TERMCAP_BUFSIZE
+# define TERMCAP_BUFSIZE 2048
+#endif
+
+#ifndef MAXPATHLEN
+# define MAXPATHLEN 1024
+#endif
+
+/* 
+ * you may try to vary this value. Use low values if your (VMS) system
+ * tends to choke when pasting. Use high values if you want to test
+ * how many characters your pty's can buffer.
+ */
+#define IOSIZE         4096
+
diff --git a/examples/rlfe/pty.c b/examples/rlfe/pty.c
new file mode 100644 (file)
index 0000000..f89d44c
--- /dev/null
@@ -0,0 +1,387 @@
+/* Copyright (c) 1993-2002
+ *      Juergen Weigert (jnweiger@immd4.informatik.uni-erlangen.de)
+ *      Michael Schroeder (mlschroe@immd4.informatik.uni-erlangen.de)
+ * Copyright (c) 1987 Oliver Laumann
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program (see the file COPYING); if not, write to the
+ * Free Software Foundation, Inc.,
+ * 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA
+ *
+ ****************************************************************
+ */
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <signal.h>
+
+#include "config.h"
+#include "screen.h"
+
+#ifndef sun
+# include <sys/ioctl.h>
+#endif
+
+/* for solaris 2.1, Unixware (SVR4.2) and possibly others */
+#ifdef HAVE_SVR4_PTYS
+# include <sys/stropts.h>
+#endif
+
+#if defined(sun) && defined(LOCKPTY) && !defined(TIOCEXCL)
+# include <sys/ttold.h>
+#endif
+
+#ifdef ISC
+# include <sys/tty.h>
+# include <sys/sioctl.h>
+# include <sys/pty.h>
+#endif
+
+#ifdef sgi
+# include <sys/sysmacros.h>
+#endif /* sgi */
+
+#include "extern.h"
+
+/*
+ * if no PTYRANGE[01] is in the config file, we pick a default
+ */
+#ifndef PTYRANGE0
+# define PTYRANGE0 "qpr"
+#endif
+#ifndef PTYRANGE1
+# define PTYRANGE1 "0123456789abcdef"
+#endif
+
+/* SVR4 pseudo ttys don't seem to work with SCO-5 */
+#ifdef M_UNIX
+# undef HAVE_SVR4_PTYS
+#endif
+
+extern int eff_uid;
+
+/* used for opening a new pty-pair: */
+static char PtyName[32], TtyName[32];
+
+#if !(defined(sequent) || defined(_SEQUENT_) || defined(HAVE_SVR4_PTYS))
+# ifdef hpux
+static char PtyProto[] = "/dev/ptym/ptyXY";
+static char TtyProto[] = "/dev/pty/ttyXY";
+# else
+#  ifdef M_UNIX
+static char PtyProto[] = "/dev/ptypXY";
+static char TtyProto[] = "/dev/ttypXY";
+#  else
+static char PtyProto[] = "/dev/ptyXY";
+static char TtyProto[] = "/dev/ttyXY";
+#  endif
+# endif /* hpux */
+#endif
+
+static void initmaster __P((int));
+
+#if defined(sun)
+/* sun's utmp_update program opens the salve side, thus corrupting
+ */
+int pty_preopen = 1;
+#else
+int pty_preopen = 0;
+#endif
+
+/*
+ *  Open all ptys with O_NOCTTY, just to be on the safe side
+ *  (RISCos mips breaks otherwise)
+ */
+#ifndef O_NOCTTY
+# define O_NOCTTY 0
+#endif
+
+/***************************************************************/
+
+static void
+initmaster(f)
+int f;
+{
+#ifdef POSIX
+  tcflush(f, TCIOFLUSH);
+#else
+# ifdef TIOCFLUSH
+  (void) ioctl(f, TIOCFLUSH, (char *) 0);
+# endif
+#endif
+#ifdef LOCKPTY
+  (void) ioctl(f, TIOCEXCL, (char *) 0);
+#endif
+}
+
+void
+InitPTY(f)
+int f;
+{
+  if (f < 0)
+    return;
+#if defined(I_PUSH) && defined(HAVE_SVR4_PTYS) && !defined(sgi) && !defined(linux) && !defined(__osf__) && !defined(M_UNIX)
+  if (ioctl(f, I_PUSH, "ptem"))
+    Panic(errno, "InitPTY: cannot I_PUSH ptem");
+  if (ioctl(f, I_PUSH, "ldterm"))
+    Panic(errno, "InitPTY: cannot I_PUSH ldterm");
+# ifdef sun
+  if (ioctl(f, I_PUSH, "ttcompat"))
+    Panic(errno, "InitPTY: cannot I_PUSH ttcompat");
+# endif
+#endif
+}
+
+/***************************************************************/
+
+#if defined(OSX) && !defined(PTY_DONE)
+#define PTY_DONE
+int
+OpenPTY(ttyn)
+char **ttyn;
+{
+  register int f;
+  if ((f = open_controlling_pty(TtyName)) < 0)
+    return -1;
+  initmaster(f);
+  *ttyn = TtyName;
+  return f;
+}
+#endif
+
+/***************************************************************/
+
+#if (defined(sequent) || defined(_SEQUENT_)) && !defined(PTY_DONE)
+#define PTY_DONE
+int
+OpenPTY(ttyn)
+char **ttyn;
+{
+  char *m, *s;
+  register int f;
+
+  if ((f = getpseudotty(&s, &m)) < 0)
+    return -1;
+#ifdef _SEQUENT_
+  fvhangup(s);
+#endif
+  strncpy(PtyName, m, sizeof(PtyName));
+  strncpy(TtyName, s, sizeof(TtyName));
+  initmaster(f);
+  *ttyn = TtyName;
+  return f;
+}
+#endif
+
+/***************************************************************/
+
+#if defined(__sgi) && !defined(PTY_DONE)
+#define PTY_DONE
+int
+OpenPTY(ttyn)
+char **ttyn;
+{
+  int f;
+  char *name, *_getpty(); 
+  sigret_t (*sigcld)__P(SIGPROTOARG);
+
+  /*
+   * SIGCHLD set to SIG_DFL for _getpty() because it may fork() and
+   * exec() /usr/adm/mkpts
+   */
+  sigcld = signal(SIGCHLD, SIG_DFL);
+  name = _getpty(&f, O_RDWR | O_NONBLOCK, 0600, 0);
+  signal(SIGCHLD, sigcld);
+
+  if (name == 0)
+    return -1;
+  initmaster(f);
+  *ttyn = name;
+  return f;
+}
+#endif
+
+/***************************************************************/
+
+#if defined(MIPS) && defined(HAVE_DEV_PTC) && !defined(PTY_DONE)
+#define PTY_DONE
+int
+OpenPTY(ttyn)
+char **ttyn;
+{
+  register int f;
+  struct stat buf;
+   
+  strcpy(PtyName, "/dev/ptc");
+  if ((f = open(PtyName, O_RDWR | O_NOCTTY | O_NONBLOCK)) < 0)
+    return -1;
+  if (fstat(f, &buf) < 0)
+    {
+      close(f);
+      return -1;
+    }
+  sprintf(TtyName, "/dev/ttyq%d", minor(buf.st_rdev));
+  initmaster(f);
+  *ttyn = TtyName;
+  return f;
+}
+#endif
+
+/***************************************************************/
+
+#if defined(HAVE_SVR4_PTYS) && !defined(PTY_DONE)
+#define PTY_DONE
+int
+OpenPTY(ttyn)
+char **ttyn;
+{
+  register int f;
+  char *m, *ptsname();
+  int unlockpt __P((int)), grantpt __P((int));
+#if defined(HAVE_GETPT) && defined(linux)
+  int getpt __P((void));
+#endif
+  sigret_t (*sigcld)__P(SIGPROTOARG);
+
+  strcpy(PtyName, "/dev/ptmx");
+#if defined(HAVE_GETPT) && defined(linux)
+  if ((f = getpt()) == -1)
+#else
+  if ((f = open(PtyName, O_RDWR | O_NOCTTY)) == -1)
+#endif
+    return -1;
+
+  /*
+   * SIGCHLD set to SIG_DFL for grantpt() because it fork()s and
+   * exec()s pt_chmod
+   */
+  sigcld = signal(SIGCHLD, SIG_DFL);
+  if ((m = ptsname(f)) == NULL || grantpt(f) || unlockpt(f))
+    {
+      signal(SIGCHLD, sigcld);
+      close(f);
+      return -1;
+    } 
+  signal(SIGCHLD, sigcld);
+  strncpy(TtyName, m, sizeof(TtyName));
+  initmaster(f);
+  *ttyn = TtyName;
+  return f;
+}
+#endif
+
+/***************************************************************/
+
+#if defined(_AIX) && defined(HAVE_DEV_PTC) && !defined(PTY_DONE)
+#define PTY_DONE
+
+int
+OpenPTY(ttyn)
+char **ttyn;
+{
+  register int f;
+
+  /* a dumb looking loop replaced by mycrofts code: */
+  strcpy (PtyName, "/dev/ptc");
+  if ((f = open (PtyName, O_RDWR | O_NOCTTY)) < 0)
+    return -1;
+  strncpy(TtyName, ttyname(f), sizeof(TtyName));
+  if (eff_uid && access(TtyName, R_OK | W_OK))
+    {
+      close(f);
+      return -1;
+    }
+  initmaster(f);
+# ifdef _IBMR2
+  pty_preopen = 1;
+# endif
+  *ttyn = TtyName;
+  return f;
+}
+#endif
+
+/***************************************************************/
+
+#if defined(HAVE_OPENPTY) && !defined(PTY_DONE)
+#define PTY_DONE
+int
+OpenPTY(ttyn)
+char **ttyn;
+{
+  int f, s;
+  if (openpty(&f, &s, TtyName, NULL, NULL) != 0)
+    return -1;
+  close(s);
+  initmaster(f);
+  pty_preopen = 1;
+  *ttyn = TtyName;
+  return f;    
+}
+#endif
+
+/***************************************************************/
+
+#ifndef PTY_DONE
+int
+OpenPTY(ttyn)
+char **ttyn;
+{
+  register char *p, *q, *l, *d;
+  register int f;
+
+  debug("OpenPTY: Using BSD style ptys.\n");
+  strcpy(PtyName, PtyProto);
+  strcpy(TtyName, TtyProto);
+  for (p = PtyName; *p != 'X'; p++)
+    ;
+  for (q = TtyName; *q != 'X'; q++)
+    ;
+  for (l = PTYRANGE0; (*p = *l) != '\0'; l++)
+    {
+      for (d = PTYRANGE1; (p[1] = *d) != '\0'; d++)
+       {
+         debug1("OpenPTY tries '%s'\n", PtyName);
+         if ((f = open(PtyName, O_RDWR | O_NOCTTY)) == -1)
+           continue;
+         q[0] = *l;
+         q[1] = *d;
+         if (eff_uid && access(TtyName, R_OK | W_OK))
+           {
+             close(f);
+             continue;
+           }
+#if defined(sun) && defined(TIOCGPGRP) && !defined(SUNOS3)
+         /* Hack to ensure that the slave side of the pty is
+          * unused. May not work in anything other than SunOS4.1
+          */
+           {
+             int pgrp;
+
+             /* tcgetpgrp does not work (uses TIOCGETPGRP)! */
+             if (ioctl(f, TIOCGPGRP, (char *)&pgrp) != -1 || errno != EIO)
+               {
+                 close(f);
+                 continue;
+               }
+           }
+#endif
+         initmaster(f);
+         *ttyn = TtyName;
+         return f;
+       }
+    }
+  return -1;
+}
+#endif
+
diff --git a/examples/rlfe/rlfe.c b/examples/rlfe/rlfe.c
new file mode 100644 (file)
index 0000000..6d747dc
--- /dev/null
@@ -0,0 +1,780 @@
+/* A front-end using readline to "cook" input lines.
+ *
+ * Copyright (C) 2004, 1999  Per Bothner
+ * 
+ * This front-end 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.
+ *
+ * Some code from Johnson & Troan: "Linux Application Development"
+ * (Addison-Wesley, 1998) was used directly or for inspiration.
+ *
+ * 2003-11-07 Wolfgang Taeuber <wolfgang_taeuber@agilent.com>
+ * Specify a history file and the size of the history file with command
+ * line options; use EDITOR/VISUAL to set vi/emacs preference.
+ */
+
+/* PROBLEMS/TODO:
+ *
+ * Only tested under GNU/Linux and Mac OS 10.x;  needs to be ported.
+ *
+ * Switching between line-editing-mode vs raw-char-mode depending on
+ * what tcgetattr returns is inherently not robust, plus it doesn't
+ * work when ssh/telnetting in.  A better solution is possible if the
+ * tty system can send in-line escape sequences indicating the current
+ * mode, echo'd input, etc.  That would also allow a user preference
+ * to set different colors for prompt, input, stdout, and stderr.
+ *
+ * When running mc -c under the Linux console, mc does not recognize
+ * mouse clicks, which mc does when not running under rlfe.
+ *
+ * Pasting selected text containing tabs is like hitting the tab character,
+ * which invokes readline completion.  We don't want this.  I don't know
+ * if this is fixable without integrating rlfe into a terminal emulator.
+ *
+ * Echo suppression is a kludge, but can only be avoided with better kernel
+ * support: We need a tty mode to disable "real" echoing, while still
+ * letting the inferior think its tty driver to doing echoing.
+ * Stevens's book claims SCR$ and BSD4.3+ have TIOCREMOTE.
+ *
+ * The latest readline may have some hooks we can use to avoid having
+ * to back up the prompt. (See HAVE_ALREADY_PROMPTED.)
+ *
+ * Desirable readline feature:  When in cooked no-echo mode (e.g. password),
+ * echo characters are they are types with '*', but remove them when done.
+ *
+ * Asynchronous output while we're editing an input line should be
+ * inserted in the output view *before* the input line, so that the
+ * lines being edited (with the prompt) float at the end of the input.
+ *
+ * A "page mode" option to emulate more/less behavior:  At each page of
+ * output, pause for a user command.  This required parsing the output
+ * to keep track of line lengths.  It also requires remembering the
+ * output, if we want an option to scroll back, which suggests that
+ * this should be integrated with a terminal emulator like xterm.
+ */
+
+#include <stdio.h>
+#include <fcntl.h>
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+#include <signal.h>
+#include <netdb.h>
+#include <stdlib.h>
+#include <errno.h>
+#include <grp.h>
+#include <string.h>
+#include <sys/stat.h>
+#include <unistd.h>
+#include <sys/ioctl.h>
+#include <termios.h>
+
+#include "config.h"
+
+#ifdef READLINE_LIBRARY
+#  include "readline.h"
+#  include "history.h"
+#else
+#  include <readline/readline.h>
+#  include <readline/history.h>
+#endif
+
+#ifndef COMMAND
+#define COMMAND "/bin/bash"
+#endif
+#ifndef COMMAND_ARGS
+#define COMMAND_ARGS COMMAND
+#endif
+
+#ifndef ALT_COMMAND
+#define ALT_COMMAND "/bin/sh"
+#endif
+#ifndef ALT_COMMAND_ARGS
+#define ALT_COMMAND_ARGS ALT_COMMAND
+#endif
+
+#ifndef HAVE_MEMMOVE
+#  if __GNUC__ > 1
+#    define memmove(d, s, n)   __builtin_memcpy(d, s, n)
+#  else
+#    define memmove(d, s, n)   memcpy(d, s, n)
+#  endif
+#else
+#  define memmove(d, s, n)     memcpy(d, s, n)
+#endif
+
+#define APPLICATION_NAME "rlfe"
+
+static int in_from_inferior_fd;
+static int out_to_inferior_fd;
+static void set_edit_mode ();
+static void usage_exit ();
+static char *hist_file = 0;
+static int  hist_size = 0;
+
+/* Unfortunately, we cannot safely display echo from the inferior process.
+   The reason is that the echo bit in the pty is "owned" by the inferior,
+   and if we try to turn it off, we could confuse the inferior.
+   Thus, when echoing, we get echo twice:  First readline echoes while
+   we're actually editing. Then we send the line to the inferior, and the
+   terminal driver send back an extra echo.
+   The work-around is to remember the input lines, and when we see that
+   line come back, we supress the output.
+   A better solution (supposedly available on SVR4) would be a smarter
+   terminal driver, with more flags ... */
+#define ECHO_SUPPRESS_MAX 1024
+char echo_suppress_buffer[ECHO_SUPPRESS_MAX];
+int echo_suppress_start = 0;
+int echo_suppress_limit = 0;
+
+/*#define DEBUG*/
+
+#ifdef DEBUG
+FILE *logfile = NULL;
+#define DPRINT0(FMT) (fprintf(logfile, FMT), fflush(logfile))
+#define DPRINT1(FMT, V1) (fprintf(logfile, FMT, V1), fflush(logfile))
+#define DPRINT2(FMT, V1, V2) (fprintf(logfile, FMT, V1, V2), fflush(logfile))
+#else
+#define DPRINT0(FMT) ((void) 0) /* Do nothing */
+#define DPRINT1(FMT, V1) ((void) 0) /* Do nothing */
+#define DPRINT2(FMT, V1, V2) ((void) 0) /* Do nothing */
+#endif
+
+struct termios orig_term;
+
+/* Pid of child process. */
+static pid_t child = -1;
+
+static void
+sig_child (int signo)
+{
+  int status;
+  wait (&status);
+  if (hist_file != 0)
+    {
+      write_history (hist_file);
+      if (hist_size)
+       history_truncate_file (hist_file, hist_size);
+    }
+  DPRINT0 ("(Child process died.)\n");
+  tcsetattr(STDIN_FILENO, TCSANOW, &orig_term);
+  exit (0);
+}
+
+volatile int propagate_sigwinch = 0;
+
+/* sigwinch_handler
+ * propagate window size changes from input file descriptor to
+ * master side of pty.
+ */
+void sigwinch_handler(int signal) { 
+   propagate_sigwinch = 1;
+}
+
+
+/* get_slave_pty() returns an integer file descriptor.
+ * If it returns < 0, an error has occurred.
+ * Otherwise, it has returned the slave file descriptor.
+ */
+
+int get_slave_pty(char *name) { 
+   struct group *gptr;
+   gid_t gid;
+   int slave = -1;
+
+   /* chown/chmod the corresponding pty, if possible.
+    * This will only work if the process has root permissions.
+    * Alternatively, write and exec a small setuid program that
+    * does just this.
+    */
+   if ((gptr = getgrnam("tty")) != 0) {
+      gid = gptr->gr_gid;
+   } else {
+      /* if the tty group does not exist, don't change the
+       * group on the slave pty, only the owner
+       */
+      gid = -1;
+   }
+
+   /* Note that we do not check for errors here.  If this is code
+    * where these actions are critical, check for errors!
+    */
+   chown(name, getuid(), gid);
+   /* This code only makes the slave read/writeable for the user.
+    * If this is for an interactive shell that will want to
+    * receive "write" and "wall" messages, OR S_IWGRP into the
+    * second argument below.
+    */
+   chmod(name, S_IRUSR|S_IWUSR);
+
+   /* open the corresponding slave pty */
+   slave = open(name, O_RDWR);
+   return (slave);
+}
+
+/* Certain special characters, such as ctrl/C, we want to pass directly
+   to the inferior, rather than letting readline handle them. */
+
+static char special_chars[20];
+static int special_chars_count;
+
+static void
+add_special_char(int ch)
+{
+  if (ch != 0)
+    special_chars[special_chars_count++] = ch;
+}
+
+static int eof_char;
+
+static int
+is_special_char(int ch)
+{
+  int i;
+#if 0
+  if (ch == eof_char && rl_point == rl_end)
+    return 1;
+#endif
+  for (i = special_chars_count;  --i >= 0; )
+    if (special_chars[i] == ch)
+      return 1;
+  return 0;
+}
+
+static char buf[1024];
+/* buf[0 .. buf_count-1] is the what has been emitted on the current line.
+   It is used as the readline prompt. */
+static int buf_count = 0;
+
+int do_emphasize_input = 1;
+int current_emphasize_input;
+
+char *start_input_mode = "\033[1m";
+char *end_input_mode = "\033[0m";
+
+int num_keys = 0;
+
+static void maybe_emphasize_input (int on)
+{
+  if (on == current_emphasize_input
+      || (on && ! do_emphasize_input))
+    return;
+  fprintf (rl_outstream, on ? start_input_mode : end_input_mode);
+  fflush (rl_outstream);
+  current_emphasize_input = on;
+}
+
+static void
+null_prep_terminal (int meta)
+{
+}
+
+static void
+null_deprep_terminal ()
+{
+  maybe_emphasize_input (0);
+}
+
+static int
+pre_input_change_mode (void)
+{
+  return 0;
+}
+
+char pending_special_char;
+
+static void
+line_handler (char *line)
+{
+  if (line == NULL)
+    {
+      char buf[1];
+      DPRINT0("saw eof!\n");
+      buf[0] = '\004'; /* ctrl/d */
+      write (out_to_inferior_fd, buf, 1);
+    }
+  else
+    {
+      static char enter[] = "\r";
+      /*  Send line to inferior: */
+      int length = strlen (line);
+      if (length > ECHO_SUPPRESS_MAX-2)
+       {
+         echo_suppress_start = 0;
+         echo_suppress_limit = 0;
+       }
+      else
+       {
+         if (echo_suppress_limit + length > ECHO_SUPPRESS_MAX - 2)
+           {
+             if (echo_suppress_limit - echo_suppress_start + length
+                 <= ECHO_SUPPRESS_MAX - 2)
+               {
+                 memmove (echo_suppress_buffer,
+                          echo_suppress_buffer + echo_suppress_start,
+                          echo_suppress_limit - echo_suppress_start);
+                 echo_suppress_limit -= echo_suppress_start;
+                 echo_suppress_start = 0;
+               }
+             else
+               {
+                 echo_suppress_limit = 0;
+               }
+             echo_suppress_start = 0;
+           }
+         memcpy (echo_suppress_buffer + echo_suppress_limit,
+                 line, length);
+         echo_suppress_limit += length;
+         echo_suppress_buffer[echo_suppress_limit++] = '\r';
+         echo_suppress_buffer[echo_suppress_limit++] = '\n';
+       }
+      write (out_to_inferior_fd, line, length);
+      if (pending_special_char == 0)
+        {
+          write (out_to_inferior_fd, enter, sizeof(enter)-1);
+          if (*line)
+            add_history (line);
+        }
+      free (line);
+    }
+  rl_callback_handler_remove ();
+  buf_count = 0;
+  num_keys = 0;
+  if (pending_special_char != 0)
+    {
+      write (out_to_inferior_fd, &pending_special_char, 1);
+      pending_special_char = 0;
+    }
+}
+
+/* Value of rl_getc_function.
+   Use this because readline should read from stdin, not rl_instream,
+   points to the pty (so readline has monitor its terminal modes). */
+
+int
+my_rl_getc (FILE *dummy)
+{
+  int ch = rl_getc (stdin);
+  if (is_special_char (ch))
+    {
+      pending_special_char = ch;
+      return '\r';
+    }
+  return ch;
+}
+
+int
+main(int argc, char** argv)
+{
+  char *path;
+  int i;
+  int master;
+  char *name;
+  int in_from_tty_fd;
+  struct sigaction act;
+  struct winsize ws;
+  struct termios t;
+  int maxfd;
+  fd_set in_set;
+  static char empty_string[1] = "";
+  char *prompt = empty_string;
+  int ioctl_err = 0;
+  int arg_base = 1;
+
+#ifdef DEBUG
+  logfile = fopen("/tmp/rlfe.log", "w");
+#endif
+
+  while (arg_base<argc)
+    {
+      if (argv[arg_base][0] != '-')
+       break;
+      if (arg_base+1 >= argc )
+       usage_exit();
+      switch(argv[arg_base][1])
+       {
+       case 'h':
+         arg_base++;
+         hist_file = argv[arg_base];
+         break;
+       case 's':
+         arg_base++;
+         hist_size = atoi(argv[arg_base]);
+         if (hist_size<0)
+           usage_exit();
+         break;
+       default:
+         usage_exit();
+       }
+      arg_base++;
+    }
+  if (hist_file)
+    read_history (hist_file);
+
+  set_edit_mode ();
+
+  rl_readline_name = APPLICATION_NAME;
+  
+  if ((master = OpenPTY (&name)) < 0)
+    {
+      perror("ptypair: could not open master pty");
+      exit(1);
+    }
+
+  DPRINT1("pty name: '%s'\n", name);
+
+  /* set up SIGWINCH handler */
+  act.sa_handler = sigwinch_handler;
+  sigemptyset(&(act.sa_mask));
+  act.sa_flags = 0;
+  if (sigaction(SIGWINCH, &act, NULL) < 0)
+    {
+      perror("ptypair: could not handle SIGWINCH ");
+      exit(1);
+    }
+
+  if (ioctl(STDIN_FILENO, TIOCGWINSZ, &ws) < 0)
+    {
+      perror("ptypair: could not get window size");
+      exit(1);
+    }
+
+  if ((child = fork()) < 0)
+    {
+      perror("cannot fork");
+      exit(1);
+    }
+
+  if (child == 0)
+    { 
+      int slave;  /* file descriptor for slave pty */
+
+      /* We are in the child process */
+      close(master);
+
+#ifdef TIOCSCTTY
+      if ((slave = get_slave_pty(name)) < 0)
+       {
+         perror("ptypair: could not open slave pty");
+         exit(1);
+       }
+#endif
+
+      /* We need to make this process a session group leader, because
+       * it is on a new PTY, and things like job control simply will
+       * not work correctly unless there is a session group leader
+       * and process group leader (which a session group leader
+       * automatically is). This also disassociates us from our old
+       * controlling tty. 
+       */
+      if (setsid() < 0)
+       {
+         perror("could not set session leader");
+       }
+
+      /* Tie us to our new controlling tty. */
+#ifdef TIOCSCTTY
+      if (ioctl(slave, TIOCSCTTY, NULL))
+       {
+         perror("could not set new controlling tty");
+       }
+#else
+      if ((slave = get_slave_pty(name)) < 0)
+       {
+         perror("ptypair: could not open slave pty");
+         exit(1);
+       }
+#endif
+
+      /* make slave pty be standard in, out, and error */
+      dup2(slave, STDIN_FILENO);
+      dup2(slave, STDOUT_FILENO);
+      dup2(slave, STDERR_FILENO);
+
+      /* at this point the slave pty should be standard input */
+      if (slave > 2)
+       {
+         close(slave);
+       }
+
+      /* Try to restore window size; failure isn't critical */
+      if (ioctl(STDOUT_FILENO, TIOCSWINSZ, &ws) < 0)
+       {
+         perror("could not restore window size");
+       }
+
+      /* now start the shell */
+      {
+       static char* command_args[] = { COMMAND_ARGS, NULL };
+       static char* alt_command_args[] = { ALT_COMMAND_ARGS, NULL };
+       if (argc <= 1)
+         {
+           execvp (COMMAND, command_args);
+           execvp (ALT_COMMAND, alt_command_args);
+         }
+       else
+         execvp (argv[arg_base], &argv[arg_base]);
+      }
+
+      /* should never be reached */
+      exit(1);
+    }
+
+  /* parent */
+  signal (SIGCHLD, sig_child);
+
+  /* Note that we only set termios settings for standard input;
+   * the master side of a pty is NOT a tty.
+   */
+  tcgetattr(STDIN_FILENO, &orig_term);
+
+  t = orig_term;
+  eof_char = t.c_cc[VEOF];
+  /*  add_special_char(t.c_cc[VEOF]);*/
+  add_special_char(t.c_cc[VINTR]);
+  add_special_char(t.c_cc[VQUIT]);
+  add_special_char(t.c_cc[VSUSP]);
+#if defined (VDISCARD)
+  add_special_char(t.c_cc[VDISCARD]);
+#endif
+
+  t.c_lflag &= ~(ICANON | ISIG | ECHO | ECHOCTL | ECHOE | \
+                ECHOK | ECHOKE | ECHONL | ECHOPRT );
+  t.c_iflag &= ~ICRNL;
+  t.c_iflag |= IGNBRK;
+  t.c_cc[VMIN] = 1;
+  t.c_cc[VTIME] = 0;
+  tcsetattr(STDIN_FILENO, TCSANOW, &t);
+  in_from_inferior_fd = master;
+  out_to_inferior_fd = master;
+  rl_instream = fdopen (master, "r");
+  rl_getc_function = my_rl_getc;
+
+  rl_prep_term_function = null_prep_terminal; 
+  rl_deprep_term_function = null_deprep_terminal;
+  rl_pre_input_hook = pre_input_change_mode;
+  rl_callback_handler_install (prompt, line_handler);
+
+  in_from_tty_fd = STDIN_FILENO;
+  FD_ZERO (&in_set);
+  maxfd = in_from_inferior_fd > in_from_tty_fd ? in_from_inferior_fd
+    : in_from_tty_fd;
+  for (;;)
+    {
+      int num;
+      FD_SET (in_from_inferior_fd, &in_set);
+      FD_SET (in_from_tty_fd, &in_set);
+
+      num = select(maxfd+1, &in_set, NULL, NULL, NULL);
+
+      if (propagate_sigwinch)
+       {
+         struct winsize ws;
+         if (ioctl (STDIN_FILENO, TIOCGWINSZ, &ws) >= 0)
+           {
+             ioctl (master, TIOCSWINSZ, &ws);
+           }
+         propagate_sigwinch = 0;
+         continue;
+       }
+
+      if (num <= 0)
+       {
+         perror ("select");
+         exit (-1);
+       }
+      if (FD_ISSET (in_from_tty_fd, &in_set))
+       {
+         extern int readline_echoing_p;
+         struct termios term_master;
+         int do_canon = 1;
+         int do_icrnl = 1;
+         int ioctl_ret;
+
+         DPRINT1("[tty avail num_keys:%d]\n", num_keys);
+
+         /* If we can't get tty modes for the master side of the pty, we
+            can't handle non-canonical-mode programs.  Always assume the
+            master is in canonical echo mode if we can't tell. */
+         ioctl_ret = tcgetattr(master, &term_master);
+
+         if (ioctl_ret >= 0)
+           {
+             do_canon = (term_master.c_lflag & ICANON) != 0;
+             do_icrnl = (term_master.c_lflag & ICRNL) != 0;
+             readline_echoing_p = (term_master.c_lflag & ECHO) != 0;
+             DPRINT1 ("echo,canon,crnl:%03d\n",
+                      100 * readline_echoing_p
+                      + 10 * do_canon
+                      + 1 * do_icrnl);
+           }
+         else
+           {
+             if (ioctl_err == 0)
+               DPRINT1("tcgetattr on master fd failed: errno = %d\n", errno);
+             ioctl_err = 1;
+           }
+
+         if (do_canon == 0 && num_keys == 0)
+           {
+             char ch[10];
+             int count = read (STDIN_FILENO, ch, sizeof(ch));
+             DPRINT1("[read %d chars from stdin: ", count);
+             DPRINT2(" \"%.*s\"]\n", count, ch);
+             if (do_icrnl)
+               {
+                 int i = count;
+                 while (--i >= 0)
+                   {
+                     if (ch[i] == '\r')
+                       ch[i] = '\n';
+                   }
+               }
+             maybe_emphasize_input (1);
+             write (out_to_inferior_fd, ch, count);
+           }
+         else
+           {
+             if (num_keys == 0)
+               {
+                 int i;
+                 /* Re-install callback handler for new prompt. */
+                 if (prompt != empty_string)
+                   free (prompt);
+                 if (prompt == NULL)
+                   {
+                     DPRINT0("New empty prompt\n");
+                     prompt = empty_string;
+                   }
+                 else
+                   {
+                     if (do_emphasize_input && buf_count > 0)
+                       {
+                         prompt = malloc (buf_count + strlen (end_input_mode)
+                                          + strlen (start_input_mode) + 5);
+                         sprintf (prompt, "\001%s\002%.*s\001%s\002",
+                                  end_input_mode,
+                                  buf_count, buf,
+                                  start_input_mode);
+                       }
+                     else
+                       {
+                         prompt = malloc (buf_count + 1);
+                         memcpy (prompt, buf, buf_count);
+                         prompt[buf_count] = '\0';
+                       }
+                     DPRINT1("New prompt '%s'\n", prompt);
+#if 0 /* ifdef HAVE_RL_ALREADY_PROMPTED */
+                     /* Doesn't quite work when do_emphasize_input is 1. */
+                     rl_already_prompted = buf_count > 0;
+#else
+                     if (buf_count > 0)
+                       write (1, "\r", 1);
+#endif
+                   }
+
+                 rl_callback_handler_install (prompt, line_handler);
+               }
+             num_keys++;
+             maybe_emphasize_input (1);
+             rl_callback_read_char ();
+           }
+       }
+      else /* output from inferior. */
+       {
+         int i;
+         int count;
+         int old_count;
+         if (buf_count > (sizeof(buf) >> 2))
+           buf_count = 0;
+         count = read (in_from_inferior_fd, buf+buf_count,
+                       sizeof(buf) - buf_count);
+          DPRINT2("read %d from inferior, buf_count=%d", count, buf_count);
+         DPRINT2(": \"%.*s\"", count, buf+buf_count);
+         maybe_emphasize_input (0);
+         if (count <= 0)
+           {
+             DPRINT0 ("(Connection closed by foreign host.)\n");
+             tcsetattr(STDIN_FILENO, TCSANOW, &orig_term);
+             exit (0);
+           }
+         old_count = buf_count;
+
+          /* Look for any pending echo that we need to suppress. */
+         while (echo_suppress_start < echo_suppress_limit
+                && count > 0
+                && buf[buf_count] == echo_suppress_buffer[echo_suppress_start])
+           {
+             count--;
+             buf_count++;
+             echo_suppress_start++;
+           }
+         DPRINT1("suppressed %d characters of echo.\n", buf_count-old_count);
+
+          /* Write to the terminal anything that was not suppressed. */
+          if (count > 0)
+            write (1, buf + buf_count, count);
+
+          /* Finally, look for a prompt candidate.
+           * When we get around to going input (from the keyboard),
+           * we will consider the prompt to be anything since the last
+           * line terminator.  So we need to save that text in the
+           * initial part of buf.  However, anything before the
+           * most recent end-of-line is not interesting. */
+         buf_count += count;
+#if 1
+         for (i = buf_count;  --i >= old_count; )
+#else
+         for (i = buf_count - 1;  i-- >= buf_count - count; )
+#endif
+           {
+             if (buf[i] == '\n' || buf[i] == '\r')
+               {
+                 i++;
+                 memmove (buf, buf+i, buf_count - i);
+                 buf_count -= i;
+                 break;
+               }
+           }
+         DPRINT2("-> i: %d, buf_count: %d\n", i, buf_count);
+       }
+    }
+}
+
+static void set_edit_mode ()
+{
+  int vi = 0;
+  char *shellopts;
+
+  shellopts = getenv ("SHELLOPTS");
+  while (shellopts != 0)
+    {
+      if (strncmp ("vi", shellopts, 2) == 0)
+       {
+         vi = 1;
+         break;
+       }
+      shellopts = index (shellopts + 1, ':');
+    }
+
+  if (!vi)
+    {
+      if (getenv ("EDITOR") != 0)
+       vi |= strcmp (getenv ("EDITOR"), "vi") == 0;
+    }
+
+  if (vi)
+    rl_variable_bind ("editing-mode", "vi");
+  else
+    rl_variable_bind ("editing-mode", "emacs");
+}
+
+
+static void usage_exit ()
+{
+  fprintf (stderr, "Usage: rlfe [-h histfile] [-s size] cmd [arg1] [arg2] ...\n\n");
+  exit (1);
+}
diff --git a/examples/rlfe/screen.h b/examples/rlfe/screen.h
new file mode 100644 (file)
index 0000000..5b040c3
--- /dev/null
@@ -0,0 +1,2 @@
+/* Dummy header to avoid modifying pty.c */
+#include "os.h"
diff --git a/examples/rlptytest.c b/examples/rlptytest.c
new file mode 100644 (file)
index 0000000..79257db
--- /dev/null
@@ -0,0 +1,337 @@
+/*
+ *
+ * Another test harness for the readline callback interface.
+ *
+ * Author: Bob Rossi <bob@brasko.net>
+ */
+
+#if defined (HAVE_CONFIG_H)
+#include <config.h>
+#endif
+
+#include <stdio.h>
+#include <sys/types.h>
+#include <errno.h>
+#include <curses.h>
+
+#include <stdlib.h>
+#include <unistd.h>
+
+#include <signal.h>
+
+#if 0  /* LINUX */
+#include <pty.h>
+#else
+#include <util.h>
+#endif
+
+#ifdef READLINE_LIBRARY
+#  include "readline.h"
+#else
+#  include <readline/readline.h>
+#endif
+
+/**
+ * Master/Slave PTY used to keep readline off of stdin/stdout.
+ */
+static int masterfd = -1;
+static int slavefd;
+
+void
+sigint (s)
+     int s;
+{
+  tty_reset (STDIN_FILENO);
+  close (masterfd);
+  close (slavefd);
+  printf ("\n");
+  exit (0);
+}
+
+static int 
+user_input()
+{
+  int size;
+  const int MAX = 1024;
+  char *buf = (char *)malloc(MAX+1);
+
+  size = read (STDIN_FILENO, buf, MAX);
+  if (size == -1)
+    return -1;
+
+  size = write (masterfd, buf, size);
+  if (size == -1)
+    return -1;
+
+  return 0;
+}
+
+static int 
+readline_input()
+{
+  const int MAX = 1024;
+  char *buf = (char *)malloc(MAX+1);
+  int size;
+
+  size = read (masterfd, buf, MAX);
+  if (size == -1)
+    {
+      free( buf );
+      buf = NULL;
+      return -1;
+    }
+
+  buf[size] = 0;
+
+  /* Display output from readline */
+  if ( size > 0 )
+    fprintf(stderr, "%s", buf);
+
+  free( buf );
+  buf = NULL;
+  return 0;
+}
+
+static void 
+rlctx_send_user_command(char *line)
+{
+  /* This happens when rl_callback_read_char gets EOF */
+  if ( line == NULL )
+    return;
+    
+  if (strcmp (line, "exit") == 0) {
+       tty_reset (STDIN_FILENO);
+       close (masterfd);
+       close (slavefd);
+       printf ("\n");
+       exit (0);
+  }
+  
+  /* Don't add the enter command */
+  if ( line && *line != '\0' )
+    add_history(line);
+}
+
+static void 
+custom_deprep_term_function ()
+{
+}
+
+static int 
+init_readline (int inputfd, int outputfd) 
+{
+  FILE *inputFILE, *outputFILE;
+
+  inputFILE = fdopen (inputfd, "r");
+  if (!inputFILE)
+    return -1;
+
+  outputFILE = fdopen (outputfd, "w");
+  if (!outputFILE)
+    return -1;
+
+  rl_instream = inputFILE;
+  rl_outstream = outputFILE;
+
+  /* Tell readline what the prompt is if it needs to put it back */
+  rl_callback_handler_install("(rltest):  ", rlctx_send_user_command);
+
+  /* Set the terminal type to dumb so the output of readline can be
+   * understood by tgdb */
+  if ( rl_reset_terminal("dumb") == -1 )
+    return -1;
+
+  /* For some reason, readline can not deprep the terminal.
+   * However, it doesn't matter because no other application is working on
+   * the terminal besides readline */
+  rl_deprep_term_function = custom_deprep_term_function;
+
+  using_history();
+  read_history(".history"); 
+
+  return 0;
+}
+
+static int 
+main_loop(void)
+{
+  fd_set rset;
+  int max;
+    
+  max = (masterfd > STDIN_FILENO) ? masterfd : STDIN_FILENO;
+  max = (max > slavefd) ? max : slavefd;
+
+  for (;;)
+    {
+      /* Reset the fd_set, and watch for input from GDB or stdin */
+      FD_ZERO(&rset);
+        
+      FD_SET(STDIN_FILENO, &rset);
+      FD_SET(slavefd, &rset);
+      FD_SET(masterfd, &rset);
+
+      /* Wait for input */
+      if (select(max + 1, &rset, NULL, NULL, NULL) == -1)
+        {
+          if (errno == EINTR)
+             continue;
+          else
+            return -1;
+        }
+
+      /* Input received through the pty:  Handle it 
+       * Wrote to masterfd, slave fd has that input, alert readline to read it. 
+       */
+      if (FD_ISSET(slavefd, &rset))
+        rl_callback_read_char();
+
+      /* Input received through the pty.
+       * Readline read from slavefd, and it wrote to the masterfd. 
+       */
+      if (FD_ISSET(masterfd, &rset))
+        if ( readline_input() == -1 )
+          return -1;
+
+      /* Input received:  Handle it, write to masterfd (input to readline) */
+      if (FD_ISSET(STDIN_FILENO, &rset))
+        if ( user_input() == -1 )
+          return -1;
+  }
+
+  return 0;
+}
+
+/* The terminal attributes before calling tty_cbreak */
+static struct termios save_termios;
+static struct winsize size;
+static enum { RESET, TCBREAK } ttystate = RESET;
+
+/* tty_cbreak: Sets terminal to cbreak mode. Also known as noncanonical mode.
+ *    1. Signal handling is still turned on, so the user can still type those.
+ *    2. echo is off
+ *    3. Read in one char at a time.
+ *
+ * fd    - The file descriptor of the terminal
+ * 
+ * Returns: 0 on sucess, -1 on error
+ */
+int tty_cbreak(int fd){
+   struct termios buf;
+    int ttysavefd = -1;
+   
+   if(tcgetattr(fd, &save_termios) < 0)
+      return -1;
+      
+   buf = save_termios;
+   buf.c_lflag &= ~(ECHO | ICANON);
+   buf.c_iflag &= ~(ICRNL | INLCR);
+   buf.c_cc[VMIN] = 1;
+   buf.c_cc[VTIME] = 0;
+
+#if defined (VLNEXT) && defined (_POSIX_VDISABLE)
+   buf.c_cc[VLNEXT] = _POSIX_VDISABLE;
+#endif
+
+#if defined (VDSUSP) && defined (_POSIX_VDISABLE)
+   buf.c_cc[VDSUSP] = _POSIX_VDISABLE;
+#endif
+
+  /* enable flow control; only stty start char can restart output */
+#if 0
+  buf.c_iflag |= (IXON|IXOFF);
+#ifdef IXANY
+  buf.c_iflag &= ~IXANY;
+#endif
+#endif
+
+  /* disable flow control; let ^S and ^Q through to pty */
+  buf.c_iflag &= ~(IXON|IXOFF);
+#ifdef IXANY
+  buf.c_iflag &= ~IXANY;
+#endif
+
+  if(tcsetattr(fd, TCSAFLUSH, &buf) < 0)
+      return -1;
+
+   ttystate = TCBREAK;
+   ttysavefd = fd;
+
+   /* set size */
+   if(ioctl(fd, TIOCGWINSZ, (char *)&size) < 0)
+      return -1;
+
+#ifdef DEBUG
+   err_msg("%d rows and %d cols\n", size.ws_row, size.ws_col);   
+#endif
+   
+   return (0);   
+}
+
+int 
+tty_off_xon_xoff (int fd)
+{
+  struct termios buf;
+  int ttysavefd = -1;
+
+  if(tcgetattr(fd, &buf) < 0)
+    return -1;
+     
+  buf.c_iflag &= ~(IXON|IXOFF);
+
+  if(tcsetattr(fd, TCSAFLUSH, &buf) < 0)
+    return -1;
+
+  return 0;   
+}
+
+/* tty_reset: Sets the terminal attributes back to their previous state.
+ * PRE: tty_cbreak must have already been called.
+ * 
+ * fd    - The file descrioptor of the terminal to reset.
+ * 
+ * Returns: 0 on success, -1 on error
+ */
+int tty_reset(int fd)
+{
+   if(ttystate != TCBREAK)
+      return (0);
+
+   if(tcsetattr(fd, TCSAFLUSH, &save_termios) < 0)
+      return (-1);
+      
+   ttystate = RESET;
+   
+   return 0;   
+}
+
+int 
+main()
+{
+  int val;
+  val = openpty (&masterfd, &slavefd, NULL, NULL, NULL);
+  if (val == -1)
+    return -1;
+
+  val = tty_off_xon_xoff (masterfd);
+  if (val == -1)
+    return -1;
+
+  val = init_readline (slavefd, slavefd);
+  if (val == -1)
+    return -1;
+
+  val = tty_cbreak (STDIN_FILENO);
+  if (val == -1)
+    return -1;
+
+  signal (SIGINT, sigint);
+
+  val = main_loop ();
+
+  tty_reset (STDIN_FILENO);
+
+  if (val == -1)
+    return -1;
+
+  return 0;
+}
diff --git a/examples/rltest.c b/examples/rltest.c
new file mode 100644 (file)
index 0000000..cb67bab
--- /dev/null
@@ -0,0 +1,93 @@
+/* **************************************************************** */
+/*                                                                 */
+/*                     Testing Readline                            */
+/*                                                                 */
+/* **************************************************************** */
+
+/* Copyright (C) 1987-2002 Free Software Foundation, Inc.
+
+   This file is part of the GNU Readline Library, a library for
+   reading lines of text with interactive input and history editing.
+
+   The GNU Readline Library 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.
+
+   The GNU Readline Library is distributed in the hope that it will be
+   useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+   of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   The GNU General Public License is often shipped with GNU software, and
+   is generally kept in a file called COPYING or LICENSE.  If you do not
+   have a copy of the license, write to the Free Software Foundation,
+   59 Temple Place, Suite 330, Boston, MA 02111 USA. */
+
+#if defined (HAVE_CONFIG_H)
+#include <config.h>
+#endif
+
+#include <stdio.h>
+#include <sys/types.h>
+
+#ifdef HAVE_STDLIB_H
+#  include <stdlib.h>
+#else 
+extern void exit();
+#endif
+
+#ifdef READLINE_LIBRARY
+#  include "readline.h"
+#  include "history.h"
+#else
+#  include <readline/readline.h>
+#  include <readline/history.h>
+#endif
+
+extern HIST_ENTRY **history_list ();
+
+main ()
+{
+  char *temp, *prompt;
+  int done;
+
+  temp = (char *)NULL;
+  prompt = "readline$ ";
+  done = 0;
+
+  while (!done)
+    {
+      temp = readline (prompt);
+
+      /* Test for EOF. */
+      if (!temp)
+       exit (1);
+
+      /* If there is anything on the line, print it and remember it. */
+      if (*temp)
+       {
+         fprintf (stderr, "%s\r\n", temp);
+         add_history (temp);
+       }
+
+      /* Check for `command' that we handle. */
+      if (strcmp (temp, "quit") == 0)
+       done = 1;
+
+      if (strcmp (temp, "list") == 0)
+       {
+         HIST_ENTRY **list;
+         register int i;
+
+         list = history_list ();
+         if (list)
+           {
+             for (i = 0; list[i]; i++)
+               fprintf (stderr, "%d: %s\r\n", i, list[i]->line);
+           }
+       }
+      free (temp);
+    }
+  exit (0);
+}
diff --git a/examples/rlversion.c b/examples/rlversion.c
new file mode 100644 (file)
index 0000000..6c86874
--- /dev/null
@@ -0,0 +1,49 @@
+/*
+ * rlversion -- print out readline's version number
+ */
+
+/* Copyright (C) 1987-2002 Free Software Foundation, Inc.
+
+   This file is part of the GNU Readline Library, a library for
+   reading lines of text with interactive input and history editing.
+
+   The GNU Readline Library 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.
+
+   The GNU Readline Library is distributed in the hope that it will be
+   useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+   of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   The GNU General Public License is often shipped with GNU software, and
+   is generally kept in a file called COPYING or LICENSE.  If you do not
+   have a copy of the license, write to the Free Software Foundation,
+   59 Temple Place, Suite 330, Boston, MA 02111 USA. */
+
+#if defined (HAVE_CONFIG_H)
+#  include <config.h>
+#endif
+
+#include <stdio.h>
+#include <sys/types.h>
+#include "posixstat.h"
+
+#ifdef HAVE_STDLIB_H
+#  include <stdlib.h>
+#else
+extern void exit();
+#endif
+
+#ifdef READLINE_LIBRARY
+#  include "readline.h"
+#else
+#  include <readline/readline.h>
+#endif
+
+main()
+{
+       printf ("%s\n", rl_library_version ? rl_library_version : "unknown");
+       exit (0);
+}
diff --git a/funmap.c b/funmap.c
new file mode 100644 (file)
index 0000000..9c760cc
--- /dev/null
+++ b/funmap.c
@@ -0,0 +1,255 @@
+/* funmap.c -- attach names to functions. */
+
+/* Copyright (C) 1987, 1989, 1992 Free Software Foundation, Inc.
+
+   This file is part of the GNU Readline Library, a library for
+   reading lines of text with interactive input and history editing.
+
+   The GNU Readline Library 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.
+
+   The GNU Readline Library is distributed in the hope that it will be
+   useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+   of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   The GNU General Public License is often shipped with GNU software, and
+   is generally kept in a file called COPYING or LICENSE.  If you do not
+   have a copy of the license, write to the Free Software Foundation,
+   59 Temple Place, Suite 330, Boston, MA 02111 USA. */
+#define READLINE_LIBRARY
+
+#if defined (HAVE_CONFIG_H)
+#  include <config.h>
+#endif
+
+#if !defined (BUFSIZ)
+#include <stdio.h>
+#endif /* BUFSIZ */
+
+#if defined (HAVE_STDLIB_H)
+#  include <stdlib.h>
+#else
+#  include "ansi_stdlib.h"
+#endif /* HAVE_STDLIB_H */
+
+#include "rlconf.h"
+#include "readline.h"
+
+#include "xmalloc.h"
+
+#ifdef __STDC__
+typedef int QSFUNC (const void *, const void *);
+#else
+typedef int QSFUNC ();
+#endif
+
+extern int _rl_qsort_string_compare PARAMS((char **, char **));
+
+FUNMAP **funmap;
+static int funmap_size;
+static int funmap_entry;
+
+/* After initializing the function map, this is the index of the first
+   program specific function. */
+int funmap_program_specific_entry_start;
+
+static FUNMAP default_funmap[] = {
+  { "abort", rl_abort },
+  { "accept-line", rl_newline },
+  { "arrow-key-prefix", rl_arrow_keys },
+  { "backward-byte", rl_backward_byte },
+  { "backward-char", rl_backward_char },
+  { "backward-delete-char", rl_rubout },
+  { "backward-kill-line", rl_backward_kill_line },
+  { "backward-kill-word", rl_backward_kill_word },
+  { "backward-word", rl_backward_word },
+  { "beginning-of-history", rl_beginning_of_history },
+  { "beginning-of-line", rl_beg_of_line },
+  { "call-last-kbd-macro", rl_call_last_kbd_macro },
+  { "capitalize-word", rl_capitalize_word },
+  { "character-search", rl_char_search },
+  { "character-search-backward", rl_backward_char_search },
+  { "clear-screen", rl_clear_screen },
+  { "complete", rl_complete },
+  { "copy-backward-word", rl_copy_backward_word },
+  { "copy-forward-word", rl_copy_forward_word },
+  { "copy-region-as-kill", rl_copy_region_to_kill },
+  { "delete-char", rl_delete },
+  { "delete-char-or-list", rl_delete_or_show_completions },
+  { "delete-horizontal-space", rl_delete_horizontal_space },
+  { "digit-argument", rl_digit_argument },
+  { "do-lowercase-version", rl_do_lowercase_version },
+  { "downcase-word", rl_downcase_word },
+  { "dump-functions", rl_dump_functions },
+  { "dump-macros", rl_dump_macros },
+  { "dump-variables", rl_dump_variables },
+  { "emacs-editing-mode", rl_emacs_editing_mode },
+  { "end-kbd-macro", rl_end_kbd_macro },
+  { "end-of-history", rl_end_of_history },
+  { "end-of-line", rl_end_of_line },
+  { "exchange-point-and-mark", rl_exchange_point_and_mark },
+  { "forward-backward-delete-char", rl_rubout_or_delete },
+  { "forward-byte", rl_forward_byte },
+  { "forward-char", rl_forward_char },
+  { "forward-search-history", rl_forward_search_history },
+  { "forward-word", rl_forward_word },
+  { "history-search-backward", rl_history_search_backward },
+  { "history-search-forward", rl_history_search_forward },
+  { "insert-comment", rl_insert_comment },
+  { "insert-completions", rl_insert_completions },
+  { "kill-whole-line", rl_kill_full_line },
+  { "kill-line", rl_kill_line },
+  { "kill-region", rl_kill_region },
+  { "kill-word", rl_kill_word },
+  { "menu-complete", rl_menu_complete },
+  { "next-history", rl_get_next_history },
+  { "non-incremental-forward-search-history", rl_noninc_forward_search },
+  { "non-incremental-reverse-search-history", rl_noninc_reverse_search },
+  { "non-incremental-forward-search-history-again", rl_noninc_forward_search_again },
+  { "non-incremental-reverse-search-history-again", rl_noninc_reverse_search_again },
+  { "overwrite-mode", rl_overwrite_mode },
+#ifdef __CYGWIN__
+  { "paste-from-clipboard", rl_paste_from_clipboard },
+#endif
+  { "possible-completions", rl_possible_completions },
+  { "previous-history", rl_get_previous_history },
+  { "quoted-insert", rl_quoted_insert },
+  { "re-read-init-file", rl_re_read_init_file },
+  { "redraw-current-line", rl_refresh_line},
+  { "reverse-search-history", rl_reverse_search_history },
+  { "revert-line", rl_revert_line },
+  { "self-insert", rl_insert },
+  { "set-mark", rl_set_mark },
+  { "start-kbd-macro", rl_start_kbd_macro },
+  { "tab-insert", rl_tab_insert },
+  { "tilde-expand", rl_tilde_expand },
+  { "transpose-chars", rl_transpose_chars },
+  { "transpose-words", rl_transpose_words },
+  { "tty-status", rl_tty_status },
+  { "undo", rl_undo_command },
+  { "universal-argument", rl_universal_argument },
+  { "unix-filename-rubout", rl_unix_filename_rubout },
+  { "unix-line-discard", rl_unix_line_discard },
+  { "unix-word-rubout", rl_unix_word_rubout },
+  { "upcase-word", rl_upcase_word },
+  { "yank", rl_yank },
+  { "yank-last-arg", rl_yank_last_arg },
+  { "yank-nth-arg", rl_yank_nth_arg },
+  { "yank-pop", rl_yank_pop },
+
+#if defined (VI_MODE)
+  { "vi-append-eol", rl_vi_append_eol },
+  { "vi-append-mode", rl_vi_append_mode },
+  { "vi-arg-digit", rl_vi_arg_digit },
+  { "vi-back-to-indent", rl_vi_back_to_indent },
+  { "vi-bWord", rl_vi_bWord },
+  { "vi-bword", rl_vi_bword },
+  { "vi-change-case", rl_vi_change_case },
+  { "vi-change-char", rl_vi_change_char },
+  { "vi-change-to", rl_vi_change_to },
+  { "vi-char-search", rl_vi_char_search },
+  { "vi-column", rl_vi_column },
+  { "vi-complete", rl_vi_complete },
+  { "vi-delete", rl_vi_delete },
+  { "vi-delete-to", rl_vi_delete_to },
+  { "vi-eWord", rl_vi_eWord },
+  { "vi-editing-mode", rl_vi_editing_mode },
+  { "vi-end-word", rl_vi_end_word },
+  { "vi-eof-maybe", rl_vi_eof_maybe },
+  { "vi-eword", rl_vi_eword },
+  { "vi-fWord", rl_vi_fWord },
+  { "vi-fetch-history", rl_vi_fetch_history },
+  { "vi-first-print", rl_vi_first_print },
+  { "vi-fword", rl_vi_fword },
+  { "vi-goto-mark", rl_vi_goto_mark },
+  { "vi-insert-beg", rl_vi_insert_beg },
+  { "vi-insertion-mode", rl_vi_insertion_mode },
+  { "vi-match", rl_vi_match },
+  { "vi-movement-mode", rl_vi_movement_mode },
+  { "vi-next-word", rl_vi_next_word },
+  { "vi-overstrike", rl_vi_overstrike },
+  { "vi-overstrike-delete", rl_vi_overstrike_delete },
+  { "vi-prev-word", rl_vi_prev_word },
+  { "vi-put", rl_vi_put },
+  { "vi-redo", rl_vi_redo },
+  { "vi-replace", rl_vi_replace },
+  { "vi-rubout", rl_vi_rubout },
+  { "vi-search", rl_vi_search },
+  { "vi-search-again", rl_vi_search_again },
+  { "vi-set-mark", rl_vi_set_mark },
+  { "vi-subst", rl_vi_subst },
+  { "vi-tilde-expand", rl_vi_tilde_expand },
+  { "vi-yank-arg", rl_vi_yank_arg },
+  { "vi-yank-to", rl_vi_yank_to },
+#endif /* VI_MODE */
+
+ {(char *)NULL, (rl_command_func_t *)NULL }
+};
+
+int
+rl_add_funmap_entry (name, function)
+     const char *name;
+     rl_command_func_t *function;
+{
+  if (funmap_entry + 2 >= funmap_size)
+    {
+      funmap_size += 64;
+      funmap = (FUNMAP **)xrealloc (funmap, funmap_size * sizeof (FUNMAP *));
+    }
+  
+  funmap[funmap_entry] = (FUNMAP *)xmalloc (sizeof (FUNMAP));
+  funmap[funmap_entry]->name = name;
+  funmap[funmap_entry]->function = function;
+
+  funmap[++funmap_entry] = (FUNMAP *)NULL;
+  return funmap_entry;
+}
+
+static int funmap_initialized;
+
+/* Make the funmap contain all of the default entries. */
+void
+rl_initialize_funmap ()
+{
+  register int i;
+
+  if (funmap_initialized)
+    return;
+
+  for (i = 0; default_funmap[i].name; i++)
+    rl_add_funmap_entry (default_funmap[i].name, default_funmap[i].function);
+
+  funmap_initialized = 1;
+  funmap_program_specific_entry_start = i;
+}
+
+/* Produce a NULL terminated array of known function names.  The array
+   is sorted.  The array itself is allocated, but not the strings inside.
+   You should free () the array when you done, but not the pointrs. */
+const char **
+rl_funmap_names ()
+{
+  const char **result;
+  int result_size, result_index;
+
+  /* Make sure that the function map has been initialized. */
+  rl_initialize_funmap ();
+
+  for (result_index = result_size = 0, result = (const char **)NULL; funmap[result_index]; result_index++)
+    {
+      if (result_index + 2 > result_size)
+       {
+         result_size += 20;
+         result = (const char **)xrealloc (result, result_size * sizeof (char *));
+       }
+
+      result[result_index] = funmap[result_index]->name;
+      result[result_index + 1] = (char *)NULL;
+    }
+
+  qsort (result, result_index, sizeof (char *), (QSFUNC *)_rl_qsort_string_compare);
+  return (result);
+}
diff --git a/histexpand.c b/histexpand.c
new file mode 100644 (file)
index 0000000..f46c0b2
--- /dev/null
@@ -0,0 +1,1593 @@
+/* histexpand.c -- history expansion. */
+
+/* Copyright (C) 1989-2004 Free Software Foundation, Inc.
+
+   This file contains the GNU History Library (the Library), a set of
+   routines for managing the text of previously typed lines.
+
+   The Library 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.
+
+   The Library is distributed in the hope that it will be useful, but
+   WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   General Public License for more details.
+
+   The GNU General Public License is often shipped with GNU software, and
+   is generally kept in a file called COPYING or LICENSE.  If you do not
+   have a copy of the license, write to the Free Software Foundation,
+   59 Temple Place, Suite 330, Boston, MA 02111 USA. */
+
+#define READLINE_LIBRARY
+
+#if defined (HAVE_CONFIG_H)
+#  include <config.h>
+#endif
+
+#include <stdio.h>
+
+#if defined (HAVE_STDLIB_H)
+#  include <stdlib.h>
+#else
+#  include "ansi_stdlib.h"
+#endif /* HAVE_STDLIB_H */
+
+#if defined (HAVE_UNISTD_H)
+#  ifndef _MINIX
+#    include <sys/types.h>
+#  endif
+#  include <unistd.h>
+#endif
+
+#include "rlmbutil.h"
+
+#include "history.h"
+#include "histlib.h"
+
+#include "rlshell.h"
+#include "xmalloc.h"
+
+#define HISTORY_WORD_DELIMITERS                " \t\n;&()|<>"
+#define HISTORY_QUOTE_CHARACTERS       "\"'`"
+
+#define slashify_in_quotes "\\`\"$"
+
+typedef int _hist_search_func_t PARAMS((const char *, int));
+
+static char error_pointer;
+
+static char *subst_lhs;
+static char *subst_rhs;
+static int subst_lhs_len;
+static int subst_rhs_len;
+
+static char *get_history_word_specifier PARAMS((char *, char *, int *));
+static char *history_find_word PARAMS((char *, int));
+static int history_tokenize_word PARAMS((const char *, int));
+static char *history_substring PARAMS((const char *, int, int));
+
+static char *quote_breaks PARAMS((char *));
+
+/* Variables exported by this file. */
+/* The character that represents the start of a history expansion
+   request.  This is usually `!'. */
+char history_expansion_char = '!';
+
+/* The character that invokes word substitution if found at the start of
+   a line.  This is usually `^'. */
+char history_subst_char = '^';
+
+/* During tokenization, if this character is seen as the first character
+   of a word, then it, and all subsequent characters upto a newline are
+   ignored.  For a Bourne shell, this should be '#'.  Bash special cases
+   the interactive comment character to not be a comment delimiter. */
+char history_comment_char = '\0';
+
+/* The list of characters which inhibit the expansion of text if found
+   immediately following history_expansion_char. */
+char *history_no_expand_chars = " \t\n\r=";
+
+/* If set to a non-zero value, single quotes inhibit history expansion.
+   The default is 0. */
+int history_quotes_inhibit_expansion = 0;
+
+/* Used to split words by history_tokenize_internal. */
+char *history_word_delimiters = HISTORY_WORD_DELIMITERS;
+
+/* If set, this points to a function that is called to verify that a
+   particular history expansion should be performed. */
+rl_linebuf_func_t *history_inhibit_expansion_function;
+
+/* **************************************************************** */
+/*                                                                 */
+/*                     History Expansion                           */
+/*                                                                 */
+/* **************************************************************** */
+
+/* Hairy history expansion on text, not tokens.  This is of general
+   use, and thus belongs in this library. */
+
+/* The last string searched for by a !?string? search. */
+static char *search_string;
+
+/* The last string matched by a !?string? search. */
+static char *search_match;
+
+/* Return the event specified at TEXT + OFFSET modifying OFFSET to
+   point to after the event specifier.  Just a pointer to the history
+   line is returned; NULL is returned in the event of a bad specifier.
+   You pass STRING with *INDEX equal to the history_expansion_char that
+   begins this specification.
+   DELIMITING_QUOTE is a character that is allowed to end the string
+   specification for what to search for in addition to the normal
+   characters `:', ` ', `\t', `\n', and sometimes `?'.
+   So you might call this function like:
+   line = get_history_event ("!echo:p", &index, 0);  */
+char *
+get_history_event (string, caller_index, delimiting_quote)
+     const char *string;
+     int *caller_index;
+     int delimiting_quote;
+{
+  register int i;
+  register char c;
+  HIST_ENTRY *entry;
+  int which, sign, local_index, substring_okay;
+  _hist_search_func_t *search_func;
+  char *temp;
+
+  /* The event can be specified in a number of ways.
+
+     !!   the previous command
+     !n   command line N
+     !-n  current command-line minus N
+     !str the most recent command starting with STR
+     !?str[?]
+         the most recent command containing STR
+
+     All values N are determined via HISTORY_BASE. */
+
+  i = *caller_index;
+
+  if (string[i] != history_expansion_char)
+    return ((char *)NULL);
+
+  /* Move on to the specification. */
+  i++;
+
+  sign = 1;
+  substring_okay = 0;
+
+#define RETURN_ENTRY(e, w) \
+       return ((e = history_get (w)) ? e->line : (char *)NULL)
+
+  /* Handle !! case. */
+  if (string[i] == history_expansion_char)
+    {
+      i++;
+      which = history_base + (history_length - 1);
+      *caller_index = i;
+      RETURN_ENTRY (entry, which);
+    }
+
+  /* Hack case of numeric line specification. */
+  if (string[i] == '-')
+    {
+      sign = -1;
+      i++;
+    }
+
+  if (_rl_digit_p (string[i]))
+    {
+      /* Get the extent of the digits and compute the value. */
+      for (which = 0; _rl_digit_p (string[i]); i++)
+       which = (which * 10) + _rl_digit_value (string[i]);
+
+      *caller_index = i;
+
+      if (sign < 0)
+       which = (history_length + history_base) - which;
+
+      RETURN_ENTRY (entry, which);
+    }
+
+  /* This must be something to search for.  If the spec begins with
+     a '?', then the string may be anywhere on the line.  Otherwise,
+     the string must be found at the start of a line. */
+  if (string[i] == '?')
+    {
+      substring_okay++;
+      i++;
+    }
+
+  /* Only a closing `?' or a newline delimit a substring search string. */
+  for (local_index = i; c = string[i]; i++)
+    {
+#if defined (HANDLE_MULTIBYTE)
+      if (MB_CUR_MAX > 1 && rl_byte_oriented == 0)
+       {
+         int v;
+         mbstate_t ps;
+
+         memset (&ps, 0, sizeof (mbstate_t));
+         /* These produce warnings because we're passing a const string to a
+            function that takes a non-const string. */
+         _rl_adjust_point ((char *)string, i, &ps);
+         if ((v = _rl_get_char_len ((char *)string + i, &ps)) > 1)
+           {
+             i += v - 1;
+             continue;
+           }
+        }
+
+#endif /* HANDLE_MULTIBYTE */
+      if ((!substring_okay && (whitespace (c) || c == ':' ||
+         (history_search_delimiter_chars && member (c, history_search_delimiter_chars)) ||
+         string[i] == delimiting_quote)) ||
+         string[i] == '\n' ||
+         (substring_okay && string[i] == '?'))
+       break;
+    }
+
+  which = i - local_index;
+  temp = (char *)xmalloc (1 + which);
+  if (which)
+    strncpy (temp, string + local_index, which);
+  temp[which] = '\0';
+
+  if (substring_okay && string[i] == '?')
+    i++;
+
+  *caller_index = i;
+
+#define FAIL_SEARCH() \
+  do { \
+    history_offset = history_length; free (temp) ; return (char *)NULL; \
+  } while (0)
+
+  /* If there is no search string, try to use the previous search string,
+     if one exists.  If not, fail immediately. */
+  if (*temp == '\0' && substring_okay)
+    {
+      if (search_string)
+        {
+          free (temp);
+          temp = savestring (search_string);
+        }
+      else
+        FAIL_SEARCH ();
+    }
+
+  search_func = substring_okay ? history_search : history_search_prefix;
+  while (1)
+    {
+      local_index = (*search_func) (temp, -1);
+
+      if (local_index < 0)
+       FAIL_SEARCH ();
+
+      if (local_index == 0 || substring_okay)
+       {
+         entry = current_history ();
+         history_offset = history_length;
+       
+         /* If this was a substring search, then remember the
+            string that we matched for word substitution. */
+         if (substring_okay)
+           {
+             FREE (search_string);
+             search_string = temp;
+
+             FREE (search_match);
+             search_match = history_find_word (entry->line, local_index);
+           }
+         else
+           free (temp);
+
+         return (entry->line);
+       }
+
+      if (history_offset)
+       history_offset--;
+      else
+       FAIL_SEARCH ();
+    }
+#undef FAIL_SEARCH
+#undef RETURN_ENTRY
+}
+
+/* Function for extracting single-quoted strings.  Used for inhibiting
+   history expansion within single quotes. */
+
+/* Extract the contents of STRING as if it is enclosed in single quotes.
+   SINDEX, when passed in, is the offset of the character immediately
+   following the opening single quote; on exit, SINDEX is left pointing
+   to the closing single quote. */
+static void
+hist_string_extract_single_quoted (string, sindex)
+     char *string;
+     int *sindex;
+{
+  register int i;
+
+  for (i = *sindex; string[i] && string[i] != '\''; i++)
+    ;
+
+  *sindex = i;
+}
+
+static char *
+quote_breaks (s)
+     char *s;
+{
+  register char *p, *r;
+  char *ret;
+  int len = 3;
+
+  for (p = s; p && *p; p++, len++)
+    {
+      if (*p == '\'')
+       len += 3;
+      else if (whitespace (*p) || *p == '\n')
+       len += 2;
+    }
+
+  r = ret = (char *)xmalloc (len);
+  *r++ = '\'';
+  for (p = s; p && *p; )
+    {
+      if (*p == '\'')
+       {
+         *r++ = '\'';
+         *r++ = '\\';
+         *r++ = '\'';
+         *r++ = '\'';
+         p++;
+       }
+      else if (whitespace (*p) || *p == '\n')
+       {
+         *r++ = '\'';
+         *r++ = *p++;
+         *r++ = '\'';
+       }
+      else
+       *r++ = *p++;
+    }
+  *r++ = '\'';
+  *r = '\0';
+  return ret;
+}
+
+static char *
+hist_error(s, start, current, errtype)
+      char *s;
+      int start, current, errtype;
+{
+  char *temp;
+  const char *emsg;
+  int ll, elen;
+
+  ll = current - start;
+
+  switch (errtype)
+    {
+    case EVENT_NOT_FOUND:
+      emsg = "event not found";
+      elen = 15;
+      break;
+    case BAD_WORD_SPEC:
+      emsg = "bad word specifier";
+      elen = 18;
+      break;
+    case SUBST_FAILED:
+      emsg = "substitution failed";
+      elen = 19;
+      break;
+    case BAD_MODIFIER:
+      emsg = "unrecognized history modifier";
+      elen = 29;
+      break;
+    case NO_PREV_SUBST:
+      emsg = "no previous substitution";
+      elen = 24;
+      break;
+    default:
+      emsg = "unknown expansion error";
+      elen = 23;
+      break;
+    }
+
+  temp = (char *)xmalloc (ll + elen + 3);
+  strncpy (temp, s + start, ll);
+  temp[ll] = ':';
+  temp[ll + 1] = ' ';
+  strcpy (temp + ll + 2, emsg);
+  return (temp);
+}
+
+/* Get a history substitution string from STR starting at *IPTR
+   and return it.  The length is returned in LENPTR.
+
+   A backslash can quote the delimiter.  If the string is the
+   empty string, the previous pattern is used.  If there is
+   no previous pattern for the lhs, the last history search
+   string is used.
+
+   If IS_RHS is 1, we ignore empty strings and set the pattern
+   to "" anyway.  subst_lhs is not changed if the lhs is empty;
+   subst_rhs is allowed to be set to the empty string. */
+
+static char *
+get_subst_pattern (str, iptr, delimiter, is_rhs, lenptr)
+     char *str;
+     int *iptr, delimiter, is_rhs, *lenptr;
+{
+  register int si, i, j, k;
+  char *s;
+#if defined (HANDLE_MULTIBYTE)
+  mbstate_t ps;
+#endif
+
+  s = (char *)NULL;
+  i = *iptr;
+
+#if defined (HANDLE_MULTIBYTE)
+  memset (&ps, 0, sizeof (mbstate_t));
+  _rl_adjust_point (str, i, &ps);
+#endif
+
+  for (si = i; str[si] && str[si] != delimiter; si++)
+#if defined (HANDLE_MULTIBYTE)
+    if (MB_CUR_MAX > 1 && rl_byte_oriented == 0)
+      {
+       int v;
+       if ((v = _rl_get_char_len (str + si, &ps)) > 1)
+         si += v - 1;
+       else if (str[si] == '\\' && str[si + 1] == delimiter)
+         si++;
+      }
+    else
+#endif /* HANDLE_MULTIBYTE */
+      if (str[si] == '\\' && str[si + 1] == delimiter)
+       si++;
+
+  if (si > i || is_rhs)
+    {
+      s = (char *)xmalloc (si - i + 1);
+      for (j = 0, k = i; k < si; j++, k++)
+       {
+         /* Remove a backslash quoting the search string delimiter. */
+         if (str[k] == '\\' && str[k + 1] == delimiter)
+           k++;
+         s[j] = str[k];
+       }
+      s[j] = '\0';
+      if (lenptr)
+       *lenptr = j;
+    }
+
+  i = si;
+  if (str[i])
+    i++;
+  *iptr = i;
+
+  return s;
+}
+
+static void
+postproc_subst_rhs ()
+{
+  char *new;
+  int i, j, new_size;
+
+  new = (char *)xmalloc (new_size = subst_rhs_len + subst_lhs_len);
+  for (i = j = 0; i < subst_rhs_len; i++)
+    {
+      if (subst_rhs[i] == '&')
+       {
+         if (j + subst_lhs_len >= new_size)
+           new = (char *)xrealloc (new, (new_size = new_size * 2 + subst_lhs_len));
+         strcpy (new + j, subst_lhs);
+         j += subst_lhs_len;
+       }
+      else
+       {
+         /* a single backslash protects the `&' from lhs interpolation */
+         if (subst_rhs[i] == '\\' && subst_rhs[i + 1] == '&')
+           i++;
+         if (j >= new_size)
+           new = (char *)xrealloc (new, new_size *= 2);
+         new[j++] = subst_rhs[i];
+       }
+    }
+  new[j] = '\0';
+  free (subst_rhs);
+  subst_rhs = new;
+  subst_rhs_len = j;
+}
+
+/* Expand the bulk of a history specifier starting at STRING[START].
+   Returns 0 if everything is OK, -1 if an error occurred, and 1
+   if the `p' modifier was supplied and the caller should just print
+   the returned string.  Returns the new index into string in
+   *END_INDEX_PTR, and the expanded specifier in *RET_STRING. */
+static int
+history_expand_internal (string, start, end_index_ptr, ret_string, current_line)
+     char *string;
+     int start, *end_index_ptr;
+     char **ret_string;
+     char *current_line;       /* for !# */
+{
+  int i, n, starting_index;
+  int substitute_globally, subst_bywords, want_quotes, print_only;
+  char *event, *temp, *result, *tstr, *t, c, *word_spec;
+  int result_len;
+#if defined (HANDLE_MULTIBYTE)
+  mbstate_t ps;
+
+  memset (&ps, 0, sizeof (mbstate_t));
+#endif
+
+  result = (char *)xmalloc (result_len = 128);
+
+  i = start;
+
+  /* If it is followed by something that starts a word specifier,
+     then !! is implied as the event specifier. */
+
+  if (member (string[i + 1], ":$*%^"))
+    {
+      char fake_s[3];
+      int fake_i = 0;
+      i++;
+      fake_s[0] = fake_s[1] = history_expansion_char;
+      fake_s[2] = '\0';
+      event = get_history_event (fake_s, &fake_i, 0);
+    }
+  else if (string[i + 1] == '#')
+    {
+      i += 2;
+      event = current_line;
+    }
+  else
+    {
+      int quoted_search_delimiter = 0;
+
+      /* If the character before this `!' is a double or single
+        quote, then this expansion takes place inside of the
+        quoted string.  If we have to search for some text ("!foo"),
+        allow the delimiter to end the search string. */
+#if defined (HANDLE_MULTIBYTE)
+      if (MB_CUR_MAX > 1 && rl_byte_oriented == 0)
+       {
+         int ch, l;
+         l = _rl_find_prev_mbchar (string, i, MB_FIND_ANY);
+         ch = string[l];
+         /* XXX - original patch had i - 1 ???  If i == 0 it would fail. */
+         if (i && (ch == '\'' || ch == '"'))
+           quoted_search_delimiter = ch;
+       }
+      else
+#endif /* HANDLE_MULTIBYTE */    
+       if (i && (string[i - 1] == '\'' || string[i - 1] == '"'))
+         quoted_search_delimiter = string[i - 1];
+
+      event = get_history_event (string, &i, quoted_search_delimiter);
+    }
+         
+  if (event == 0)
+    {
+      *ret_string = hist_error (string, start, i, EVENT_NOT_FOUND);
+      free (result);
+      return (-1);
+    }
+
+  /* If a word specifier is found, then do what that requires. */
+  starting_index = i;
+  word_spec = get_history_word_specifier (string, event, &i);
+
+  /* There is no such thing as a `malformed word specifier'.  However,
+     it is possible for a specifier that has no match.  In that case,
+     we complain. */
+  if (word_spec == (char *)&error_pointer)
+    {
+      *ret_string = hist_error (string, starting_index, i, BAD_WORD_SPEC);
+      free (result);
+      return (-1);
+    }
+
+  /* If no word specifier, than the thing of interest was the event. */
+  temp = word_spec ? savestring (word_spec) : savestring (event);
+  FREE (word_spec);
+
+  /* Perhaps there are other modifiers involved.  Do what they say. */
+  want_quotes = substitute_globally = subst_bywords = print_only = 0;
+  starting_index = i;
+
+  while (string[i] == ':')
+    {
+      c = string[i + 1];
+
+      if (c == 'g' || c == 'a')
+       {
+         substitute_globally = 1;
+         i++;
+         c = string[i + 1];
+       }
+      else if (c == 'G')
+       {
+         subst_bywords = 1;
+         i++;
+         c = string[i + 1];
+       }
+
+      switch (c)
+       {
+       default:
+         *ret_string = hist_error (string, i+1, i+2, BAD_MODIFIER);
+         free (result);
+         free (temp);
+         return -1;
+
+       case 'q':
+         want_quotes = 'q';
+         break;
+
+       case 'x':
+         want_quotes = 'x';
+         break;
+
+         /* :p means make this the last executed line.  So we
+            return an error state after adding this line to the
+            history. */
+       case 'p':
+         print_only++;
+         break;
+
+         /* :t discards all but the last part of the pathname. */
+       case 't':
+         tstr = strrchr (temp, '/');
+         if (tstr)
+           {
+             tstr++;
+             t = savestring (tstr);
+             free (temp);
+             temp = t;
+           }
+         break;
+
+         /* :h discards the last part of a pathname. */
+       case 'h':
+         tstr = strrchr (temp, '/');
+         if (tstr)
+           *tstr = '\0';
+         break;
+
+         /* :r discards the suffix. */
+       case 'r':
+         tstr = strrchr (temp, '.');
+         if (tstr)
+           *tstr = '\0';
+         break;
+
+         /* :e discards everything but the suffix. */
+       case 'e':
+         tstr = strrchr (temp, '.');
+         if (tstr)
+           {
+             t = savestring (tstr);
+             free (temp);
+             temp = t;
+           }
+         break;
+
+       /* :s/this/that substitutes `that' for the first
+          occurrence of `this'.  :gs/this/that substitutes `that'
+          for each occurrence of `this'.  :& repeats the last
+          substitution.  :g& repeats the last substitution
+          globally. */
+
+       case '&':
+       case 's':
+         {
+           char *new_event;
+           int delimiter, failed, si, l_temp, ws, we;
+
+           if (c == 's')
+             {
+               if (i + 2 < (int)strlen (string))
+                 {
+#if defined (HANDLE_MULTIBYTE)
+                   if (MB_CUR_MAX > 1 && rl_byte_oriented == 0)
+                     {
+                       _rl_adjust_point (string, i + 2, &ps);
+                       if (_rl_get_char_len (string + i + 2, &ps) > 1)
+                         delimiter = 0;
+                       else
+                         delimiter = string[i + 2];
+                     }
+                   else
+#endif /* HANDLE_MULTIBYTE */
+                     delimiter = string[i + 2];
+                 }
+               else
+                 break;        /* no search delimiter */
+
+               i += 3;
+
+               t = get_subst_pattern (string, &i, delimiter, 0, &subst_lhs_len);
+               /* An empty substitution lhs with no previous substitution
+                  uses the last search string as the lhs. */
+               if (t)
+                 {
+                   FREE (subst_lhs);
+                   subst_lhs = t;
+                 }
+               else if (!subst_lhs)
+                 {
+                   if (search_string && *search_string)
+                     {
+                       subst_lhs = savestring (search_string);
+                       subst_lhs_len = strlen (subst_lhs);
+                     }
+                   else
+                     {
+                       subst_lhs = (char *) NULL;
+                       subst_lhs_len = 0;
+                     }
+                 }
+
+               FREE (subst_rhs);
+               subst_rhs = get_subst_pattern (string, &i, delimiter, 1, &subst_rhs_len);
+
+               /* If `&' appears in the rhs, it's supposed to be replaced
+                  with the lhs. */
+               if (member ('&', subst_rhs))
+                 postproc_subst_rhs ();
+             }
+           else
+             i += 2;
+
+           /* If there is no lhs, the substitution can't succeed. */
+           if (subst_lhs_len == 0)
+             {
+               *ret_string = hist_error (string, starting_index, i, NO_PREV_SUBST);
+               free (result);
+               free (temp);
+               return -1;
+             }
+
+           l_temp = strlen (temp);
+           /* Ignore impossible cases. */
+           if (subst_lhs_len > l_temp)
+             {
+               *ret_string = hist_error (string, starting_index, i, SUBST_FAILED);
+               free (result);
+               free (temp);
+               return (-1);
+             }
+
+           /* Find the first occurrence of THIS in TEMP. */
+           /* Substitute SUBST_RHS for SUBST_LHS in TEMP.  There are three
+              cases to consider:
+
+                1.  substitute_globally == subst_bywords == 0
+                2.  substitute_globally == 1 && subst_bywords == 0
+                3.  substitute_globally == 0 && subst_bywords == 1
+
+              In the first case, we substitute for the first occurrence only.
+              In the second case, we substitute for every occurrence.
+              In the third case, we tokenize into words and substitute the
+              first occurrence of each word. */
+
+           si = we = 0;
+           for (failed = 1; (si + subst_lhs_len) <= l_temp; si++)
+             {
+               /* First skip whitespace and find word boundaries if
+                  we're past the end of the word boundary we found
+                  the last time. */
+               if (subst_bywords && si > we)
+                 {
+                   for (; temp[si] && whitespace (temp[si]); si++)
+                     ;
+                   ws = si;
+                   we = history_tokenize_word (temp, si);
+                 }
+
+               if (STREQN (temp+si, subst_lhs, subst_lhs_len))
+                 {
+                   int len = subst_rhs_len - subst_lhs_len + l_temp;
+                   new_event = (char *)xmalloc (1 + len);
+                   strncpy (new_event, temp, si);
+                   strncpy (new_event + si, subst_rhs, subst_rhs_len);
+                   strncpy (new_event + si + subst_rhs_len,
+                            temp + si + subst_lhs_len,
+                            l_temp - (si + subst_lhs_len));
+                   new_event[len] = '\0';
+                   free (temp);
+                   temp = new_event;
+
+                   failed = 0;
+
+                   if (substitute_globally)
+                     {
+                       /* Reported to fix a bug that causes it to skip every
+                          other match when matching a single character.  Was
+                          si += subst_rhs_len previously. */
+                       si += subst_rhs_len - 1;
+                       l_temp = strlen (temp);
+                       substitute_globally++;
+                       continue;
+                     }
+                   else if (subst_bywords)
+                     {
+                       si = we;
+                       l_temp = strlen (temp);
+                       continue;
+                     }
+                   else
+                     break;
+                 }
+             }
+
+           if (substitute_globally > 1)
+             {
+               substitute_globally = 0;
+               continue;       /* don't want to increment i */
+             }
+
+           if (failed == 0)
+             continue;         /* don't want to increment i */
+
+           *ret_string = hist_error (string, starting_index, i, SUBST_FAILED);
+           free (result);
+           free (temp);
+           return (-1);
+         }
+       }
+      i += 2;
+    }
+  /* Done with modfiers. */
+  /* Believe it or not, we have to back the pointer up by one. */
+  --i;
+
+  if (want_quotes)
+    {
+      char *x;
+
+      if (want_quotes == 'q')
+       x = sh_single_quote (temp);
+      else if (want_quotes == 'x')
+       x = quote_breaks (temp);
+      else
+       x = savestring (temp);
+
+      free (temp);
+      temp = x;
+    }
+
+  n = strlen (temp);
+  if (n >= result_len)
+    result = (char *)xrealloc (result, n + 2);
+  strcpy (result, temp);
+  free (temp);
+
+  *end_index_ptr = i;
+  *ret_string = result;
+  return (print_only);
+}
+
+/* Expand the string STRING, placing the result into OUTPUT, a pointer
+   to a string.  Returns:
+
+  -1) If there was an error in expansion.
+   0) If no expansions took place (or, if the only change in
+      the text was the de-slashifying of the history expansion
+      character)
+   1) If expansions did take place
+   2) If the `p' modifier was given and the caller should print the result
+
+  If an error ocurred in expansion, then OUTPUT contains a descriptive
+  error message. */
+
+#define ADD_STRING(s) \
+       do \
+         { \
+           int sl = strlen (s); \
+           j += sl; \
+           if (j >= result_len) \
+             { \
+               while (j >= result_len) \
+                 result_len += 128; \
+               result = (char *)xrealloc (result, result_len); \
+             } \
+           strcpy (result + j - sl, s); \
+         } \
+       while (0)
+
+#define ADD_CHAR(c) \
+       do \
+         { \
+           if (j >= result_len - 1) \
+             result = (char *)xrealloc (result, result_len += 64); \
+           result[j++] = c; \
+           result[j] = '\0'; \
+         } \
+       while (0)
+
+int
+history_expand (hstring, output)
+     char *hstring;
+     char **output;
+{
+  register int j;
+  int i, r, l, passc, cc, modified, eindex, only_printing, dquote;
+  char *string;
+
+  /* The output string, and its length. */
+  int result_len;
+  char *result;
+
+#if defined (HANDLE_MULTIBYTE)
+  char mb[MB_LEN_MAX];
+  mbstate_t ps;
+#endif
+
+  /* Used when adding the string. */
+  char *temp;
+
+  if (output == 0)
+    return 0;
+
+  /* Setting the history expansion character to 0 inhibits all
+     history expansion. */
+  if (history_expansion_char == 0)
+    {
+      *output = savestring (hstring);
+      return (0);
+    }
+    
+  /* Prepare the buffer for printing error messages. */
+  result = (char *)xmalloc (result_len = 256);
+  result[0] = '\0';
+
+  only_printing = modified = 0;
+  l = strlen (hstring);
+
+  /* Grovel the string.  Only backslash and single quotes can quote the
+     history escape character.  We also handle arg specifiers. */
+
+  /* Before we grovel forever, see if the history_expansion_char appears
+     anywhere within the text. */
+
+  /* The quick substitution character is a history expansion all right.  That
+     is to say, "^this^that^" is equivalent to "!!:s^this^that^", and in fact,
+     that is the substitution that we do. */
+  if (hstring[0] == history_subst_char)
+    {
+      string = (char *)xmalloc (l + 5);
+
+      string[0] = string[1] = history_expansion_char;
+      string[2] = ':';
+      string[3] = 's';
+      strcpy (string + 4, hstring);
+      l += 4;
+    }
+  else
+    {
+#if defined (HANDLE_MULTIBYTE)
+      memset (&ps, 0, sizeof (mbstate_t));
+#endif
+
+      string = hstring;
+      /* If not quick substitution, still maybe have to do expansion. */
+
+      /* `!' followed by one of the characters in history_no_expand_chars
+        is NOT an expansion. */
+      for (i = dquote = 0; string[i]; i++)
+       {
+#if defined (HANDLE_MULTIBYTE)
+         if (MB_CUR_MAX > 1 && rl_byte_oriented == 0)
+           {
+             int v;
+             v = _rl_get_char_len (string + i, &ps);
+             if (v > 1)
+               {
+                 i += v - 1;
+                 continue;
+               }
+           }
+#endif /* HANDLE_MULTIBYTE */
+
+         cc = string[i + 1];
+         /* The history_comment_char, if set, appearing at the beginning
+            of a word signifies that the rest of the line should not have
+            history expansion performed on it.
+            Skip the rest of the line and break out of the loop. */
+         if (history_comment_char && string[i] == history_comment_char &&
+             (i == 0 || member (string[i - 1], history_word_delimiters)))
+           {
+             while (string[i])
+               i++;
+             break;
+           }
+         else if (string[i] == history_expansion_char)
+           {
+             if (!cc || member (cc, history_no_expand_chars))
+               continue;
+             /* If the calling application has set
+                history_inhibit_expansion_function to a function that checks
+                for special cases that should not be history expanded,
+                call the function and skip the expansion if it returns a
+                non-zero value. */
+             else if (history_inhibit_expansion_function &&
+                       (*history_inhibit_expansion_function) (string, i))
+               continue;
+             else
+               break;
+           }
+         /* Shell-like quoting: allow backslashes to quote double quotes
+            inside a double-quoted string. */
+         else if (dquote && string[i] == '\\' && cc == '"')
+           i++;
+         /* More shell-like quoting:  if we're paying attention to single
+            quotes and letting them quote the history expansion character,
+            then we need to pay attention to double quotes, because single
+            quotes are not special inside double-quoted strings. */
+         else if (history_quotes_inhibit_expansion && string[i] == '"')
+           {
+             dquote = 1 - dquote;
+           }
+         else if (dquote == 0 && history_quotes_inhibit_expansion && string[i] == '\'')
+           {
+             /* If this is bash, single quotes inhibit history expansion. */
+             i++;
+             hist_string_extract_single_quoted (string, &i);
+           }
+         else if (history_quotes_inhibit_expansion && string[i] == '\\')
+           {
+             /* If this is bash, allow backslashes to quote single
+                quotes and the history expansion character. */
+             if (cc == '\'' || cc == history_expansion_char)
+               i++;
+           }
+         
+       }
+         
+      if (string[i] != history_expansion_char)
+       {
+         free (result);
+         *output = savestring (string);
+         return (0);
+       }
+    }
+
+  /* Extract and perform the substitution. */
+  for (passc = dquote = i = j = 0; i < l; i++)
+    {
+      int tchar = string[i];
+
+      if (passc)
+       {
+         passc = 0;
+         ADD_CHAR (tchar);
+         continue;
+       }
+
+#if defined (HANDLE_MULTIBYTE)
+      if (MB_CUR_MAX > 1 && rl_byte_oriented == 0)
+       {
+         int k, c;
+
+         c = tchar;
+         memset (mb, 0, sizeof (mb));
+         for (k = 0; k < MB_LEN_MAX; k++)
+           {
+             mb[k] = (char)c;
+             memset (&ps, 0, sizeof (mbstate_t));
+             if (_rl_get_char_len (mb, &ps) == -2)
+               c = string[++i];
+             else
+               break;
+           }
+         if (strlen (mb) > 1)
+           {
+             ADD_STRING (mb);
+             break;
+           }
+       }
+#endif /* HANDLE_MULTIBYTE */
+
+      if (tchar == history_expansion_char)
+       tchar = -3;
+      else if (tchar == history_comment_char)
+       tchar = -2;
+
+      switch (tchar)
+       {
+       default:
+         ADD_CHAR (string[i]);
+         break;
+
+       case '\\':
+         passc++;
+         ADD_CHAR (tchar);
+         break;
+
+       case '"':
+         dquote = 1 - dquote;
+         ADD_CHAR (tchar);
+         break;
+         
+       case '\'':
+         {
+           /* If history_quotes_inhibit_expansion is set, single quotes
+              inhibit history expansion. */
+           if (dquote == 0 && history_quotes_inhibit_expansion)
+             {
+               int quote, slen;
+
+               quote = i++;
+               hist_string_extract_single_quoted (string, &i);
+
+               slen = i - quote + 2;
+               temp = (char *)xmalloc (slen);
+               strncpy (temp, string + quote, slen);
+               temp[slen - 1] = '\0';
+               ADD_STRING (temp);
+               free (temp);
+             }
+           else
+             ADD_CHAR (string[i]);
+           break;
+         }
+
+       case -2:                /* history_comment_char */
+         if (i == 0 || member (string[i - 1], history_word_delimiters))
+           {
+             temp = (char *)xmalloc (l - i + 1);
+             strcpy (temp, string + i);
+             ADD_STRING (temp);
+             free (temp);
+             i = l;
+           }
+         else
+           ADD_CHAR (string[i]);
+         break;
+
+       case -3:                /* history_expansion_char */
+         cc = string[i + 1];
+
+         /* If the history_expansion_char is followed by one of the
+            characters in history_no_expand_chars, then it is not a
+            candidate for expansion of any kind. */
+         if (member (cc, history_no_expand_chars))
+           {
+             ADD_CHAR (string[i]);
+             break;
+           }
+
+#if defined (NO_BANG_HASH_MODIFIERS)
+         /* There is something that is listed as a `word specifier' in csh
+            documentation which means `the expanded text to this point'.
+            That is not a word specifier, it is an event specifier.  If we
+            don't want to allow modifiers with `!#', just stick the current
+            output line in again. */
+         if (cc == '#')
+           {
+             if (result)
+               {
+                 temp = (char *)xmalloc (1 + strlen (result));
+                 strcpy (temp, result);
+                 ADD_STRING (temp);
+                 free (temp);
+               }
+             i++;
+             break;
+           }
+#endif
+
+         r = history_expand_internal (string, i, &eindex, &temp, result);
+         if (r < 0)
+           {
+             *output = temp;
+             free (result);
+             if (string != hstring)
+               free (string);
+             return -1;
+           }
+         else
+           {
+             if (temp)
+               {
+                 modified++;
+                 if (*temp)
+                   ADD_STRING (temp);
+                 free (temp);
+               }
+             only_printing = r == 1;
+             i = eindex;
+           }
+         break;
+       }
+    }
+
+  *output = result;
+  if (string != hstring)
+    free (string);
+
+  if (only_printing)
+    {
+#if 0
+      add_history (result);
+#endif
+      return (2);
+    }
+
+  return (modified != 0);
+}
+
+/* Return a consed string which is the word specified in SPEC, and found
+   in FROM.  NULL is returned if there is no spec.  The address of
+   ERROR_POINTER is returned if the word specified cannot be found.
+   CALLER_INDEX is the offset in SPEC to start looking; it is updated
+   to point to just after the last character parsed. */
+static char *
+get_history_word_specifier (spec, from, caller_index)
+     char *spec, *from;
+     int *caller_index;
+{
+  register int i = *caller_index;
+  int first, last;
+  int expecting_word_spec = 0;
+  char *result;
+
+  /* The range of words to return doesn't exist yet. */
+  first = last = 0;
+  result = (char *)NULL;
+
+  /* If we found a colon, then this *must* be a word specification.  If
+     it isn't, then it is an error. */
+  if (spec[i] == ':')
+    {
+      i++;
+      expecting_word_spec++;
+    }
+
+  /* Handle special cases first. */
+
+  /* `%' is the word last searched for. */
+  if (spec[i] == '%')
+    {
+      *caller_index = i + 1;
+      return (search_match ? savestring (search_match) : savestring (""));
+    }
+
+  /* `*' matches all of the arguments, but not the command. */
+  if (spec[i] == '*')
+    {
+      *caller_index = i + 1;
+      result = history_arg_extract (1, '$', from);
+      return (result ? result : savestring (""));
+    }
+
+  /* `$' is last arg. */
+  if (spec[i] == '$')
+    {
+      *caller_index = i + 1;
+      return (history_arg_extract ('$', '$', from));
+    }
+
+  /* Try to get FIRST and LAST figured out. */
+
+  if (spec[i] == '-')
+    first = 0;
+  else if (spec[i] == '^')
+    {
+      first = 1;
+      i++;
+    }
+  else if (_rl_digit_p (spec[i]) && expecting_word_spec)
+    {
+      for (first = 0; _rl_digit_p (spec[i]); i++)
+       first = (first * 10) + _rl_digit_value (spec[i]);
+    }
+  else
+    return ((char *)NULL);     /* no valid `first' for word specifier */
+
+  if (spec[i] == '^' || spec[i] == '*')
+    {
+      last = (spec[i] == '^') ? 1 : '$';       /* x* abbreviates x-$ */
+      i++;
+    }
+  else if (spec[i] != '-')
+    last = first;
+  else
+    {
+      i++;
+
+      if (_rl_digit_p (spec[i]))
+       {
+         for (last = 0; _rl_digit_p (spec[i]); i++)
+           last = (last * 10) + _rl_digit_value (spec[i]);
+       }
+      else if (spec[i] == '$')
+       {
+         i++;
+         last = '$';
+       }
+#if 0
+      else if (!spec[i] || spec[i] == ':')
+       /* check against `:' because there could be a modifier separator */
+#else
+      else
+       /* csh seems to allow anything to terminate the word spec here,
+          leaving it as an abbreviation. */
+#endif
+       last = -1;              /* x- abbreviates x-$ omitting word `$' */
+    }
+
+  *caller_index = i;
+
+  if (last >= first || last == '$' || last < 0)
+    result = history_arg_extract (first, last, from);
+
+  return (result ? result : (char *)&error_pointer);
+}
+
+/* Extract the args specified, starting at FIRST, and ending at LAST.
+   The args are taken from STRING.  If either FIRST or LAST is < 0,
+   then make that arg count from the right (subtract from the number of
+   tokens, so that FIRST = -1 means the next to last token on the line).
+   If LAST is `$' the last arg from STRING is used. */
+char *
+history_arg_extract (first, last, string)
+     int first, last;
+     const char *string;
+{
+  register int i, len;
+  char *result;
+  int size, offset;
+  char **list;
+
+  /* XXX - think about making history_tokenize return a struct array,
+     each struct in array being a string and a length to avoid the
+     calls to strlen below. */
+  if ((list = history_tokenize (string)) == NULL)
+    return ((char *)NULL);
+
+  for (len = 0; list[len]; len++)
+    ;
+
+  if (last < 0)
+    last = len + last - 1;
+
+  if (first < 0)
+    first = len + first - 1;
+
+  if (last == '$')
+    last = len - 1;
+
+  if (first == '$')
+    first = len - 1;
+
+  last++;
+
+  if (first >= len || last > len || first < 0 || last < 0 || first > last)
+    result = ((char *)NULL);
+  else
+    {
+      for (size = 0, i = first; i < last; i++)
+       size += strlen (list[i]) + 1;
+      result = (char *)xmalloc (size + 1);
+      result[0] = '\0';
+
+      for (i = first, offset = 0; i < last; i++)
+       {
+         strcpy (result + offset, list[i]);
+         offset += strlen (list[i]);
+         if (i + 1 < last)
+           {
+             result[offset++] = ' ';
+             result[offset] = 0;
+           }
+       }
+    }
+
+  for (i = 0; i < len; i++)
+    free (list[i]);
+  free (list);
+
+  return (result);
+}
+
+static int
+history_tokenize_word (string, ind)
+     const char *string;
+     int ind;
+{
+  register int i;
+  int delimiter;
+
+  i = ind;
+  delimiter = 0;
+
+  if (member (string[i], "()\n"))
+    {
+      i++;
+      return i;
+    }
+
+  if (member (string[i], "<>;&|$"))
+    {
+      int peek = string[i + 1];
+
+      if (peek == string[i] && peek != '$')
+       {
+         if (peek == '<' && string[i + 2] == '-')
+           i++;
+         else if (peek == '<' && string[i + 2] == '<')
+           i++;
+         i += 2;
+         return i;
+       }
+      else
+       {
+         if ((peek == '&' && (string[i] == '>' || string[i] == '<')) ||
+             (peek == '>' && string[i] == '&') ||
+             (peek == '(' && (string[i] == '>' || string[i] == '<')) || /* ) */
+             (peek == '(' && string[i] == '$')) /* ) */
+           {
+             i += 2;
+             return i;
+           }
+       }
+
+      if (string[i] != '$')
+       {
+         i++;
+         return i;
+       }
+    }
+
+  /* Get word from string + i; */
+
+  if (member (string[i], HISTORY_QUOTE_CHARACTERS))
+    delimiter = string[i++];
+
+  for (; string[i]; i++)
+    {
+      if (string[i] == '\\' && string[i + 1] == '\n')
+       {
+         i++;
+         continue;
+       }
+
+      if (string[i] == '\\' && delimiter != '\'' &&
+         (delimiter != '"' || member (string[i], slashify_in_quotes)))
+       {
+         i++;
+         continue;
+       }
+
+      if (delimiter && string[i] == delimiter)
+       {
+         delimiter = 0;
+         continue;
+       }
+
+      if (!delimiter && (member (string[i], history_word_delimiters)))
+       break;
+
+      if (!delimiter && member (string[i], HISTORY_QUOTE_CHARACTERS))
+       delimiter = string[i];
+    }
+
+  return i;
+}
+
+static char *
+history_substring (string, start, end)
+     const char *string;
+     int start, end;
+{
+  register int len;
+  register char *result;
+
+  len = end - start;
+  result = (char *)xmalloc (len + 1);
+  strncpy (result, string + start, len);
+  result[len] = '\0';
+  return result;
+}
+
+/* Parse STRING into tokens and return an array of strings.  If WIND is
+   not -1 and INDP is not null, we also want the word surrounding index
+   WIND.  The position in the returned array of strings is returned in
+   *INDP. */
+static char **
+history_tokenize_internal (string, wind, indp)
+     const char *string;
+     int wind, *indp;
+{
+  char **result;
+  register int i, start, result_index, size;
+
+  /* If we're searching for a string that's not part of a word (e.g., " "),
+     make sure we set *INDP to a reasonable value. */
+  if (indp && wind != -1)
+    *indp = -1;
+
+  /* Get a token, and stuff it into RESULT.  The tokens are split
+     exactly where the shell would split them. */
+  for (i = result_index = size = 0, result = (char **)NULL; string[i]; )
+    {
+      /* Skip leading whitespace. */
+      for (; string[i] && whitespace (string[i]); i++)
+       ;
+      if (string[i] == 0 || string[i] == history_comment_char)
+       return (result);
+
+      start = i;
+
+      i = history_tokenize_word (string, start);
+
+      /* If we have a non-whitespace delimiter character (which would not be
+        skipped by the loop above), use it and any adjacent delimiters to
+        make a separate field.  Any adjacent white space will be skipped the
+        next time through the loop. */
+      if (i == start && history_word_delimiters)
+       {
+         i++;
+         while (string[i] && member (string[i], history_word_delimiters))
+           i++;
+       }
+
+      /* If we are looking for the word in which the character at a
+        particular index falls, remember it. */
+      if (indp && wind != -1 && wind >= start && wind < i)
+        *indp = result_index;
+
+      if (result_index + 2 >= size)
+       result = (char **)xrealloc (result, ((size += 10) * sizeof (char *)));
+
+      result[result_index++] = history_substring (string, start, i);
+      result[result_index] = (char *)NULL;
+    }
+
+  return (result);
+}
+
+/* Return an array of tokens, much as the shell might.  The tokens are
+   parsed out of STRING. */
+char **
+history_tokenize (string)
+     const char *string;
+{
+  return (history_tokenize_internal (string, -1, (int *)NULL));
+}
+
+/* Find and return the word which contains the character at index IND
+   in the history line LINE.  Used to save the word matched by the
+   last history !?string? search. */
+static char *
+history_find_word (line, ind)
+     char *line;
+     int ind;
+{
+  char **words, *s;
+  int i, wind;
+
+  words = history_tokenize_internal (line, ind, &wind);
+  if (wind == -1 || words == 0)
+    return ((char *)NULL);
+  s = words[wind];
+  for (i = 0; i < wind; i++)
+    free (words[i]);
+  for (i = wind + 1; words[i]; i++)
+    free (words[i]);
+  free (words);
+  return s;
+}
diff --git a/histfile.c b/histfile.c
new file mode 100644 (file)
index 0000000..2f051a3
--- /dev/null
@@ -0,0 +1,546 @@
+/* histfile.c - functions to manipulate the history file. */
+
+/* Copyright (C) 1989-2003 Free Software Foundation, Inc.
+
+   This file contains the GNU History Library (the Library), a set of
+   routines for managing the text of previously typed lines.
+
+   The Library 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.
+
+   The Library is distributed in the hope that it will be useful, but
+   WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   General Public License for more details.
+
+   The GNU General Public License is often shipped with GNU software, and
+   is generally kept in a file called COPYING or LICENSE.  If you do not
+   have a copy of the license, write to the Free Software Foundation,
+   59 Temple Place, Suite 330, Boston, MA 02111 USA. */
+
+/* The goal is to make the implementation transparent, so that you
+   don't have to know what data types are used, just what functions
+   you can call.  I think I have done that. */
+
+#define READLINE_LIBRARY
+
+#if defined (__TANDEM)
+#  include <floss.h>
+#endif
+
+#if defined (HAVE_CONFIG_H)
+#  include <config.h>
+#endif
+
+#include <stdio.h>
+
+#include <sys/types.h>
+#if ! defined (_MINIX) && defined (HAVE_SYS_FILE_H)
+#  include <sys/file.h>
+#endif
+#include "posixstat.h"
+#include <fcntl.h>
+
+#if defined (HAVE_STDLIB_H)
+#  include <stdlib.h>
+#else
+#  include "ansi_stdlib.h"
+#endif /* HAVE_STDLIB_H */
+
+#if defined (HAVE_UNISTD_H)
+#  include <unistd.h>
+#endif
+
+#if defined (__EMX__) || defined (__CYGWIN__)
+#  undef HAVE_MMAP
+#endif
+
+#ifdef HISTORY_USE_MMAP
+#  include <sys/mman.h>
+
+#  ifdef MAP_FILE
+#    define MAP_RFLAGS (MAP_FILE|MAP_PRIVATE)
+#    define MAP_WFLAGS (MAP_FILE|MAP_SHARED)
+#  else
+#    define MAP_RFLAGS MAP_PRIVATE
+#    define MAP_WFLAGS MAP_SHARED
+#  endif
+
+#  ifndef MAP_FAILED
+#    define MAP_FAILED ((void *)-1)
+#  endif
+
+#endif /* HISTORY_USE_MMAP */
+
+/* If we're compiling for __EMX__ (OS/2) or __CYGWIN__ (cygwin32 environment
+   on win 95/98/nt), we want to open files with O_BINARY mode so that there
+   is no \n -> \r\n conversion performed.  On other systems, we don't want to
+   mess around with O_BINARY at all, so we ensure that it's defined to 0. */
+#if defined (__EMX__) || defined (__CYGWIN__)
+#  ifndef O_BINARY
+#    define O_BINARY 0
+#  endif
+#else /* !__EMX__ && !__CYGWIN__ */
+#  undef O_BINARY
+#  define O_BINARY 0
+#endif /* !__EMX__ && !__CYGWIN__ */
+
+#include <errno.h>
+#if !defined (errno)
+extern int errno;
+#endif /* !errno */
+
+#include "history.h"
+#include "histlib.h"
+
+#include "rlshell.h"
+#include "xmalloc.h"
+
+/* If non-zero, we write timestamps to the history file in history_do_write() */
+int history_write_timestamps = 0;
+
+/* Does S look like the beginning of a history timestamp entry?  Placeholder
+   for more extensive tests. */
+#define HIST_TIMESTAMP_START(s)                (*(s) == history_comment_char)
+
+/* Return the string that should be used in the place of this
+   filename.  This only matters when you don't specify the
+   filename to read_history (), or write_history (). */
+static char *
+history_filename (filename)
+     const char *filename;
+{
+  char *return_val;
+  const char *home;
+  int home_len;
+
+  return_val = filename ? savestring (filename) : (char *)NULL;
+
+  if (return_val)
+    return (return_val);
+  
+  home = sh_get_env_value ("HOME");
+
+  if (home == 0)
+    {
+      home = ".";
+      home_len = 1;
+    }
+  else
+    home_len = strlen (home);
+
+  return_val = (char *)xmalloc (2 + home_len + 8); /* strlen(".history") == 8 */
+  strcpy (return_val, home);
+  return_val[home_len] = '/';
+#if defined (__MSDOS__)
+  strcpy (return_val + home_len + 1, "_history");
+#else
+  strcpy (return_val + home_len + 1, ".history");
+#endif
+
+  return (return_val);
+}
+
+/* Add the contents of FILENAME to the history list, a line at a time.
+   If FILENAME is NULL, then read from ~/.history.  Returns 0 if
+   successful, or errno if not. */
+int
+read_history (filename)
+     const char *filename;
+{
+  return (read_history_range (filename, 0, -1));
+}
+
+/* Read a range of lines from FILENAME, adding them to the history list.
+   Start reading at the FROM'th line and end at the TO'th.  If FROM
+   is zero, start at the beginning.  If TO is less than FROM, read
+   until the end of the file.  If FILENAME is NULL, then read from
+   ~/.history.  Returns 0 if successful, or errno if not. */
+int
+read_history_range (filename, from, to)
+     const char *filename;
+     int from, to;
+{
+  register char *line_start, *line_end, *p;
+  char *input, *buffer, *bufend, *last_ts;
+  int file, current_line, chars_read;
+  struct stat finfo;
+  size_t file_size;
+#if defined (EFBIG)
+  int overflow_errno = EFBIG;
+#elif defined (EOVERFLOW)
+  int overflow_errno = EOVERFLOW;
+#else
+  int overflow_errno = EIO;
+#endif
+
+  buffer = last_ts = (char *)NULL;
+  input = history_filename (filename);
+  file = open (input, O_RDONLY|O_BINARY, 0666);
+
+  if ((file < 0) || (fstat (file, &finfo) == -1))
+    goto error_and_exit;
+
+  file_size = (size_t)finfo.st_size;
+
+  /* check for overflow on very large files */
+  if (file_size != finfo.st_size || file_size + 1 < file_size)
+    {
+      errno = overflow_errno;
+      goto error_and_exit;
+    }
+
+#ifdef HISTORY_USE_MMAP
+  /* We map read/write and private so we can change newlines to NULs without
+     affecting the underlying object. */
+  buffer = (char *)mmap (0, file_size, PROT_READ|PROT_WRITE, MAP_RFLAGS, file, 0);
+  if ((void *)buffer == MAP_FAILED)
+    {
+      errno = overflow_errno;
+      goto error_and_exit;
+    }
+  chars_read = file_size;
+#else
+  buffer = (char *)malloc (file_size + 1);
+  if (buffer == 0)
+    {
+      errno = overflow_errno;
+      goto error_and_exit;
+    }
+
+  chars_read = read (file, buffer, file_size);
+#endif
+  if (chars_read < 0)
+    {
+  error_and_exit:
+      if (errno != 0)
+       chars_read = errno;
+      else
+       chars_read = EIO;
+      if (file >= 0)
+       close (file);
+
+      FREE (input);
+#ifndef HISTORY_USE_MMAP
+      FREE (buffer);
+#endif
+
+      return (chars_read);
+    }
+
+  close (file);
+
+  /* Set TO to larger than end of file if negative. */
+  if (to < 0)
+    to = chars_read;
+
+  /* Start at beginning of file, work to end. */
+  bufend = buffer + chars_read;
+  current_line = 0;
+
+  /* Skip lines until we are at FROM. */
+  for (line_start = line_end = buffer; line_end < bufend && current_line < from; line_end++)
+    if (*line_end == '\n')
+      {
+       p = line_end + 1;
+       /* If we see something we think is a timestamp, continue with this
+          line.  We should check more extensively here... */
+       if (HIST_TIMESTAMP_START(p) == 0)
+         current_line++;
+       line_start = p;
+      }
+
+  /* If there are lines left to gobble, then gobble them now. */
+  for (line_end = line_start; line_end < bufend; line_end++)
+    if (*line_end == '\n')
+      {
+       /* Change to allow Windows-like \r\n end of line delimiter. */
+       if (line_end > line_start && line_end[-1] == '\r')
+         line_end[-1] = '\0';
+       else
+         *line_end = '\0';
+
+       if (*line_start)
+         {
+           if (HIST_TIMESTAMP_START(line_start) == 0)
+             {
+               add_history (line_start);
+               if (last_ts)
+                 {
+                   add_history_time (last_ts);
+                   last_ts = NULL;
+                 }
+             }
+           else
+             {
+               last_ts = line_start;
+               current_line--;
+             }
+         }
+
+       current_line++;
+
+       if (current_line >= to)
+         break;
+
+       line_start = line_end + 1;
+      }
+
+  FREE (input);
+#ifndef HISTORY_USE_MMAP
+  FREE (buffer);
+#else
+  munmap (buffer, file_size);
+#endif
+
+  return (0);
+}
+
+/* Truncate the history file FNAME, leaving only LINES trailing lines.
+   If FNAME is NULL, then use ~/.history.  Returns 0 on success, errno
+   on failure. */
+int
+history_truncate_file (fname, lines)
+     const char *fname;
+     int lines;
+{
+  char *buffer, *filename, *bp, *bp1;          /* bp1 == bp+1 */
+  int file, chars_read, rv;
+  struct stat finfo;
+  size_t file_size;
+
+  buffer = (char *)NULL;
+  filename = history_filename (fname);
+  file = open (filename, O_RDONLY|O_BINARY, 0666);
+  rv = 0;
+
+  /* Don't try to truncate non-regular files. */
+  if (file == -1 || fstat (file, &finfo) == -1)
+    {
+      rv = errno;
+      if (file != -1)
+       close (file);
+      goto truncate_exit;
+    }
+
+  if (S_ISREG (finfo.st_mode) == 0)
+    {
+      close (file);
+#ifdef EFTYPE
+      rv = EFTYPE;
+#else
+      rv = EINVAL;
+#endif
+      goto truncate_exit;
+    }
+
+  file_size = (size_t)finfo.st_size;
+
+  /* check for overflow on very large files */
+  if (file_size != finfo.st_size || file_size + 1 < file_size)
+    {
+      close (file);
+#if defined (EFBIG)
+      rv = errno = EFBIG;
+#elif defined (EOVERFLOW)
+      rv = errno = EOVERFLOW;
+#else
+      rv = errno = EINVAL;
+#endif
+      goto truncate_exit;
+    }
+
+  buffer = (char *)malloc (file_size + 1);
+  if (buffer == 0)
+    {
+      close (file);
+      goto truncate_exit;
+    }
+
+  chars_read = read (file, buffer, file_size);
+  close (file);
+
+  if (chars_read <= 0)
+    {
+      rv = (chars_read < 0) ? errno : 0;
+      goto truncate_exit;
+    }
+
+  /* Count backwards from the end of buffer until we have passed
+     LINES lines.  bp1 is set funny initially.  But since bp[1] can't
+     be a comment character (since it's off the end) and *bp can't be
+     both a newline and the history comment character, it should be OK. */
+  for (bp1 = bp = buffer + chars_read - 1; lines && bp > buffer; bp--)
+    {
+      if (*bp == '\n' && HIST_TIMESTAMP_START(bp1) == 0)
+       lines--;
+      bp1 = bp;
+    }
+
+  /* If this is the first line, then the file contains exactly the
+     number of lines we want to truncate to, so we don't need to do
+     anything.  It's the first line if we don't find a newline between
+     the current value of i and 0.  Otherwise, write from the start of
+     this line until the end of the buffer. */
+  for ( ; bp > buffer; bp--)
+    {
+      if (*bp == '\n' && HIST_TIMESTAMP_START(bp1) == 0)
+        {
+         bp++;
+         break;
+        }
+      bp1 = bp;
+    }
+
+  /* Write only if there are more lines in the file than we want to
+     truncate to. */
+  if (bp > buffer && ((file = open (filename, O_WRONLY|O_TRUNC|O_BINARY, 0600)) != -1))
+    {
+      write (file, bp, chars_read - (bp - buffer));
+
+#if defined (__BEOS__)
+      /* BeOS ignores O_TRUNC. */
+      ftruncate (file, chars_read - (bp - buffer));
+#endif
+
+      close (file);
+    }
+
+ truncate_exit:
+
+  FREE (buffer);
+
+  free (filename);
+  return rv;
+}
+
+/* Workhorse function for writing history.  Writes NELEMENT entries
+   from the history list to FILENAME.  OVERWRITE is non-zero if you
+   wish to replace FILENAME with the entries. */
+static int
+history_do_write (filename, nelements, overwrite)
+     const char *filename;
+     int nelements, overwrite;
+{
+  register int i;
+  char *output;
+  int file, mode, rv;
+#ifdef HISTORY_USE_MMAP
+  size_t cursize;
+
+  mode = overwrite ? O_RDWR|O_CREAT|O_TRUNC|O_BINARY : O_RDWR|O_APPEND|O_BINARY;
+#else
+  mode = overwrite ? O_WRONLY|O_CREAT|O_TRUNC|O_BINARY : O_WRONLY|O_APPEND|O_BINARY;
+#endif
+  output = history_filename (filename);
+  rv = 0;
+
+  if ((file = open (output, mode, 0600)) == -1)
+    {
+      FREE (output);
+      return (errno);
+    }
+
+#ifdef HISTORY_USE_MMAP
+  cursize = overwrite ? 0 : lseek (file, 0, SEEK_END);
+#endif
+
+  if (nelements > history_length)
+    nelements = history_length;
+
+  /* Build a buffer of all the lines to write, and write them in one syscall.
+     Suggested by Peter Ho (peter@robosts.oxford.ac.uk). */
+  {
+    HIST_ENTRY **the_history;  /* local */
+    register int j;
+    int buffer_size;
+    char *buffer;
+
+    the_history = history_list ();
+    /* Calculate the total number of bytes to write. */
+    for (buffer_size = 0, i = history_length - nelements; i < history_length; i++)
+#if 0
+      buffer_size += 2 + HISTENT_BYTES (the_history[i]);
+#else
+      {
+       if (history_write_timestamps && the_history[i]->timestamp && the_history[i]->timestamp[0])
+         buffer_size += strlen (the_history[i]->timestamp) + 1;
+       buffer_size += strlen (the_history[i]->line) + 1;
+      }
+#endif
+
+    /* Allocate the buffer, and fill it. */
+#ifdef HISTORY_USE_MMAP
+    if (ftruncate (file, buffer_size+cursize) == -1)
+      goto mmap_error;
+    buffer = (char *)mmap (0, buffer_size, PROT_READ|PROT_WRITE, MAP_WFLAGS, file, cursize);
+    if ((void *)buffer == MAP_FAILED)
+      {
+mmap_error:
+       rv = errno;
+       FREE (output);
+       close (file);
+       return rv;
+      }
+#else    
+    buffer = (char *)malloc (buffer_size);
+    if (buffer == 0)
+      {
+       rv = errno;
+       FREE (output);
+       close (file);
+       return rv;
+      }
+#endif
+
+    for (j = 0, i = history_length - nelements; i < history_length; i++)
+      {
+       if (history_write_timestamps && the_history[i]->timestamp && the_history[i]->timestamp[0])
+         {
+           strcpy (buffer + j, the_history[i]->timestamp);
+           j += strlen (the_history[i]->timestamp);
+           buffer[j++] = '\n';
+         }
+       strcpy (buffer + j, the_history[i]->line);
+       j += strlen (the_history[i]->line);
+       buffer[j++] = '\n';
+      }
+
+#ifdef HISTORY_USE_MMAP
+    if (msync (buffer, buffer_size, 0) != 0 || munmap (buffer, buffer_size) != 0)
+      rv = errno;
+#else
+    if (write (file, buffer, buffer_size) < 0)
+      rv = errno;
+    free (buffer);
+#endif
+  }
+
+  close (file);
+
+  FREE (output);
+
+  return (rv);
+}
+
+/* Append NELEMENT entries to FILENAME.  The entries appended are from
+   the end of the list minus NELEMENTs up to the end of the list. */
+int
+append_history (nelements, filename)
+     int nelements;
+     const char *filename;
+{
+  return (history_do_write (filename, nelements, HISTORY_APPEND));
+}
+
+/* Overwrite FILENAME with the current history.  If FILENAME is NULL,
+   then write the history list to ~/.history.  Values returned
+   are as in read_history ().*/
+int
+write_history (filename)
+     const char *filename;
+{
+  return (history_do_write (filename, history_length, HISTORY_OVERWRITE));
+}
diff --git a/histlib.h b/histlib.h
new file mode 100644 (file)
index 0000000..c39af71
--- /dev/null
+++ b/histlib.h
@@ -0,0 +1,82 @@
+/* histlib.h -- internal definitions for the history library. */
+/* Copyright (C) 1989, 1992 Free Software Foundation, Inc.
+
+   This file contains the GNU History Library (the Library), a set of
+   routines for managing the text of previously typed lines.
+
+   The Library 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.
+
+   The Library is distributed in the hope that it will be useful, but
+   WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   General Public License for more details.
+
+   The GNU General Public License is often shipped with GNU software, and
+   is generally kept in a file called COPYING or LICENSE.  If you do not
+   have a copy of the license, write to the Free Software Foundation,
+   59 Temple Place, Suite 330, Boston, MA 02111 USA. */
+
+#if !defined (_HISTLIB_H_)
+#define _HISTLIB_H_
+
+#if defined (HAVE_STRING_H)
+#  include <string.h>
+#else
+#  include <strings.h>
+#endif /* !HAVE_STRING_H */
+
+#if !defined (STREQ)
+#define STREQ(a, b)    (((a)[0] == (b)[0]) && (strcmp ((a), (b)) == 0))
+#define STREQN(a, b, n) (((n) == 0) ? (1) \
+                                   : ((a)[0] == (b)[0]) && (strncmp ((a), (b), (n)) == 0))
+#endif
+
+#ifndef savestring
+#define savestring(x) strcpy (xmalloc (1 + strlen (x)), (x))
+#endif
+
+#ifndef whitespace
+#define whitespace(c) (((c) == ' ') || ((c) == '\t'))
+#endif
+
+#ifndef _rl_digit_p
+#define _rl_digit_p(c)  ((c) >= '0' && (c) <= '9')
+#endif
+
+#ifndef _rl_digit_value
+#define _rl_digit_value(c) ((c) - '0')
+#endif
+
+#ifndef member
+#  ifndef strchr
+extern char *strchr ();
+#  endif
+#define member(c, s) ((c) ? ((char *)strchr ((s), (c)) != (char *)NULL) : 0)
+#endif
+
+#ifndef FREE
+#  define FREE(x)      if (x) free (x)
+#endif
+
+/* Possible history errors passed to hist_error. */
+#define EVENT_NOT_FOUND 0
+#define BAD_WORD_SPEC  1
+#define SUBST_FAILED   2
+#define BAD_MODIFIER   3
+#define NO_PREV_SUBST  4
+
+/* Possible definitions for history starting point specification. */
+#define ANCHORED_SEARCH 1
+#define NON_ANCHORED_SEARCH 0
+
+/* Possible definitions for what style of writing the history file we want. */
+#define HISTORY_APPEND 0
+#define HISTORY_OVERWRITE 1
+
+/* Some variable definitions shared across history source files. */
+extern int history_offset;
+
+#endif /* !_HISTLIB_H_ */
diff --git a/history.c b/history.c
new file mode 100644 (file)
index 0000000..1ccf4db
--- /dev/null
+++ b/history.c
@@ -0,0 +1,518 @@
+/* history.c -- standalone history library */
+
+/* Copyright (C) 1989-2005 Free Software Foundation, Inc.
+
+   This file contains the GNU History Library (the Library), a set of
+   routines for managing the text of previously typed lines.
+
+   The Library 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.
+
+   The Library is distributed in the hope that it will be useful, but
+   WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   General Public License for more details.
+
+   The GNU General Public License is often shipped with GNU software, and
+   is generally kept in a file called COPYING or LICENSE.  If you do not
+   have a copy of the license, write to the Free Software Foundation,
+   59 Temple Place, Suite 330, Boston, MA 02111 USA. */
+
+/* The goal is to make the implementation transparent, so that you
+   don't have to know what data types are used, just what functions
+   you can call.  I think I have done that. */
+#define READLINE_LIBRARY
+
+#if defined (HAVE_CONFIG_H)
+#  include <config.h>
+#endif
+
+#include <stdio.h>
+
+#if defined (HAVE_STDLIB_H)
+#  include <stdlib.h>
+#else
+#  include "ansi_stdlib.h"
+#endif /* HAVE_STDLIB_H */
+
+#if defined (HAVE_UNISTD_H)
+#  ifdef _MINIX
+#    include <sys/types.h>
+#  endif
+#  include <unistd.h>
+#endif
+
+#include "history.h"
+#include "histlib.h"
+
+#include "xmalloc.h"
+
+/* The number of slots to increase the_history by. */
+#define DEFAULT_HISTORY_GROW_SIZE 50
+
+static char *hist_inittime PARAMS((void));
+
+/* **************************************************************** */
+/*                                                                 */
+/*                     History Functions                           */
+/*                                                                 */
+/* **************************************************************** */
+
+/* An array of HIST_ENTRY.  This is where we store the history. */
+static HIST_ENTRY **the_history = (HIST_ENTRY **)NULL;
+
+/* Non-zero means that we have enforced a limit on the amount of
+   history that we save. */
+static int history_stifled;
+
+/* The current number of slots allocated to the input_history. */
+static int history_size;
+
+/* If HISTORY_STIFLED is non-zero, then this is the maximum number of
+   entries to remember. */
+int history_max_entries;
+int max_input_history; /* backwards compatibility */
+
+/* The current location of the interactive history pointer.  Just makes
+   life easier for outside callers. */
+int history_offset;
+
+/* The number of strings currently stored in the history list. */
+int history_length;
+
+/* The logical `base' of the history array.  It defaults to 1. */
+int history_base = 1;
+
+/* Return the current HISTORY_STATE of the history. */
+HISTORY_STATE *
+history_get_history_state ()
+{
+  HISTORY_STATE *state;
+
+  state = (HISTORY_STATE *)xmalloc (sizeof (HISTORY_STATE));
+  state->entries = the_history;
+  state->offset = history_offset;
+  state->length = history_length;
+  state->size = history_size;
+  state->flags = 0;
+  if (history_stifled)
+    state->flags |= HS_STIFLED;
+
+  return (state);
+}
+
+/* Set the state of the current history array to STATE. */
+void
+history_set_history_state (state)
+     HISTORY_STATE *state;
+{
+  the_history = state->entries;
+  history_offset = state->offset;
+  history_length = state->length;
+  history_size = state->size;
+  if (state->flags & HS_STIFLED)
+    history_stifled = 1;
+}
+
+/* Begin a session in which the history functions might be used.  This
+   initializes interactive variables. */
+void
+using_history ()
+{
+  history_offset = history_length;
+}
+
+/* Return the number of bytes that the primary history entries are using.
+   This just adds up the lengths of the_history->lines and the associated
+   timestamps. */
+int
+history_total_bytes ()
+{
+  register int i, result;
+
+  for (i = result = 0; the_history && the_history[i]; i++)
+    result += HISTENT_BYTES (the_history[i]);
+
+  return (result);
+}
+
+/* Returns the magic number which says what history element we are
+   looking at now.  In this implementation, it returns history_offset. */
+int
+where_history ()
+{
+  return (history_offset);
+}
+
+/* Make the current history item be the one at POS, an absolute index.
+   Returns zero if POS is out of range, else non-zero. */
+int
+history_set_pos (pos)
+     int pos;
+{
+  if (pos > history_length || pos < 0 || !the_history)
+    return (0);
+  history_offset = pos;
+  return (1);
+}
+/* Return the current history array.  The caller has to be carefull, since this
+   is the actual array of data, and could be bashed or made corrupt easily.
+   The array is terminated with a NULL pointer. */
+HIST_ENTRY **
+history_list ()
+{
+  return (the_history);
+}
+
+/* Return the history entry at the current position, as determined by
+   history_offset.  If there is no entry there, return a NULL pointer. */
+HIST_ENTRY *
+current_history ()
+{
+  return ((history_offset == history_length) || the_history == 0)
+               ? (HIST_ENTRY *)NULL
+               : the_history[history_offset];
+}
+
+/* Back up history_offset to the previous history entry, and return
+   a pointer to that entry.  If there is no previous entry then return
+   a NULL pointer. */
+HIST_ENTRY *
+previous_history ()
+{
+  return history_offset ? the_history[--history_offset] : (HIST_ENTRY *)NULL;
+}
+
+/* Move history_offset forward to the next history entry, and return
+   a pointer to that entry.  If there is no next entry then return a
+   NULL pointer. */
+HIST_ENTRY *
+next_history ()
+{
+  return (history_offset == history_length) ? (HIST_ENTRY *)NULL : the_history[++history_offset];
+}
+
+/* Return the history entry which is logically at OFFSET in the history array.
+   OFFSET is relative to history_base. */
+HIST_ENTRY *
+history_get (offset)
+     int offset;
+{
+  int local_index;
+
+  local_index = offset - history_base;
+  return (local_index >= history_length || local_index < 0 || the_history == 0)
+               ? (HIST_ENTRY *)NULL
+               : the_history[local_index];
+}
+
+HIST_ENTRY *
+alloc_history_entry (string, ts)
+     char *string;
+     char *ts;
+{
+  HIST_ENTRY *temp;
+
+  temp = (HIST_ENTRY *)xmalloc (sizeof (HIST_ENTRY));
+
+  temp->line = string ? savestring (string) : string;
+  temp->data = (char *)NULL;
+  temp->timestamp = ts;
+
+  return temp;
+}
+
+time_t
+history_get_time (hist)
+     HIST_ENTRY *hist;
+{
+  char *ts;
+  time_t t;
+
+  if (hist == 0 || hist->timestamp == 0)
+    return 0;
+  ts = hist->timestamp;
+  if (ts[0] != history_comment_char)
+    return 0;
+  t = (time_t) atol (ts + 1);          /* XXX - should use strtol() here */
+  return t;
+}
+
+static char *
+hist_inittime ()
+{
+  time_t t;
+  char ts[64], *ret;
+
+  t = (time_t) time ((time_t *)0);
+#if defined (HAVE_VSNPRINTF)           /* assume snprintf if vsnprintf exists */
+  snprintf (ts, sizeof (ts) - 1, "X%lu", (unsigned long) t);
+#else
+  sprintf (ts, "X%lu", (unsigned long) t);
+#endif
+  ret = savestring (ts);
+  ret[0] = history_comment_char;
+
+  return ret;
+}
+
+/* Place STRING at the end of the history list.  The data field
+   is  set to NULL. */
+void
+add_history (string)
+     const char *string;
+{
+  HIST_ENTRY *temp;
+
+  if (history_stifled && (history_length == history_max_entries))
+    {
+      register int i;
+
+      /* If the history is stifled, and history_length is zero,
+        and it equals history_max_entries, we don't save items. */
+      if (history_length == 0)
+       return;
+
+      /* If there is something in the slot, then remove it. */
+      if (the_history[0])
+       (void) free_history_entry (the_history[0]);
+
+      /* Copy the rest of the entries, moving down one slot. */
+      for (i = 0; i < history_length; i++)
+       the_history[i] = the_history[i + 1];
+
+      history_base++;
+    }
+  else
+    {
+      if (history_size == 0)
+       {
+         history_size = DEFAULT_HISTORY_GROW_SIZE;
+         the_history = (HIST_ENTRY **)xmalloc (history_size * sizeof (HIST_ENTRY *));
+         history_length = 1;
+       }
+      else
+       {
+         if (history_length == (history_size - 1))
+           {
+             history_size += DEFAULT_HISTORY_GROW_SIZE;
+             the_history = (HIST_ENTRY **)
+               xrealloc (the_history, history_size * sizeof (HIST_ENTRY *));
+           }
+         history_length++;
+       }
+    }
+
+  temp = alloc_history_entry (string, hist_inittime ());
+
+  the_history[history_length] = (HIST_ENTRY *)NULL;
+  the_history[history_length - 1] = temp;
+}
+
+/* Change the time stamp of the most recent history entry to STRING. */
+void
+add_history_time (string)
+     const char *string;
+{
+  HIST_ENTRY *hs;
+
+  hs = the_history[history_length - 1];
+  FREE (hs->timestamp);
+  hs->timestamp = savestring (string);
+}
+
+/* Free HIST and return the data so the calling application can free it
+   if necessary and desired. */
+histdata_t
+free_history_entry (hist)
+     HIST_ENTRY *hist;
+{
+  histdata_t x;
+
+  if (hist == 0)
+    return ((histdata_t) 0);
+  FREE (hist->line);
+  FREE (hist->timestamp);
+  x = hist->data;
+  free (hist);
+  return (x);
+}
+
+HIST_ENTRY *
+copy_history_entry (hist)
+     HIST_ENTRY *hist;
+{
+  HIST_ENTRY *ret;
+  char *ts;
+
+  if (hist == 0)
+    return hist;
+
+  ret = alloc_history_entry (hist->line, (char *)NULL);
+
+  ts = hist->timestamp ? savestring (hist->timestamp) : hist->timestamp;
+  ret->timestamp = ts;
+
+  ret->data = hist->data;
+
+  return ret;
+}
+  
+/* Make the history entry at WHICH have LINE and DATA.  This returns
+   the old entry so you can dispose of the data.  In the case of an
+   invalid WHICH, a NULL pointer is returned. */
+HIST_ENTRY *
+replace_history_entry (which, line, data)
+     int which;
+     const char *line;
+     histdata_t data;
+{
+  HIST_ENTRY *temp, *old_value;
+
+  if (which < 0 || which >= history_length)
+    return ((HIST_ENTRY *)NULL);
+
+  temp = (HIST_ENTRY *)xmalloc (sizeof (HIST_ENTRY));
+  old_value = the_history[which];
+
+  temp->line = savestring (line);
+  temp->data = data;
+  temp->timestamp = savestring (old_value->timestamp);
+  the_history[which] = temp;
+
+  return (old_value);
+}
+
+/* Replace the DATA in the specified history entries, replacing OLD with
+   NEW.  WHICH says which one(s) to replace:  WHICH == -1 means to replace
+   all of the history entries where entry->data == OLD; WHICH == -2 means
+   to replace the `newest' history entry where entry->data == OLD; and
+   WHICH >= 0 means to replace that particular history entry's data, as
+   long as it matches OLD. */
+void
+replace_history_data (which,old, new)
+     int which;
+     histdata_t *old, *new;
+{
+  HIST_ENTRY *entry;
+  register int i, last;
+
+  if (which < -2 || which >= history_length || history_length == 0 || the_history == 0)
+    return;
+
+  if (which >= 0)
+    {
+      entry = the_history[which];
+      if (entry && entry->data == old)
+       entry->data = new;
+      return;
+    }
+
+  last = -1;
+  for (i = 0; i < history_length; i++)
+    {
+      entry = the_history[i];
+      if (entry == 0)
+       continue;
+      if (entry->data == old)
+       {
+         last = i;
+         if (which == -1)
+           entry->data = new;
+       }
+    }
+  if (which == -2 && last >= 0)
+    {
+      entry = the_history[last];
+      entry->data = new;       /* XXX - we don't check entry->old */
+    }
+}      
+  
+/* Remove history element WHICH from the history.  The removed
+   element is returned to you so you can free the line, data,
+   and containing structure. */
+HIST_ENTRY *
+remove_history (which)
+     int which;
+{
+  HIST_ENTRY *return_value;
+  register int i;
+
+  if (which < 0 || which >= history_length || history_length ==  0 || the_history == 0)
+    return ((HIST_ENTRY *)NULL);
+
+  return_value = the_history[which];
+
+  for (i = which; i < history_length; i++)
+    the_history[i] = the_history[i + 1];
+
+  history_length--;
+
+  return (return_value);
+}
+
+/* Stifle the history list, remembering only MAX number of lines. */
+void
+stifle_history (max)
+     int max;
+{
+  register int i, j;
+
+  if (max < 0)
+    max = 0;
+
+  if (history_length > max)
+    {
+      /* This loses because we cannot free the data. */
+      for (i = 0, j = history_length - max; i < j; i++)
+       free_history_entry (the_history[i]);
+
+      history_base = i;
+      for (j = 0, i = history_length - max; j < max; i++, j++)
+       the_history[j] = the_history[i];
+      the_history[j] = (HIST_ENTRY *)NULL;
+      history_length = j;
+    }
+
+  history_stifled = 1;
+  max_input_history = history_max_entries = max;
+}
+
+/* Stop stifling the history.  This returns the previous maximum
+   number of history entries.  The value is positive if the history
+   was stifled,  negative if it wasn't. */
+int
+unstifle_history ()
+{
+  if (history_stifled)
+    {
+      history_stifled = 0;
+      return (history_max_entries);
+    }
+  else
+    return (-history_max_entries);
+}
+
+int
+history_is_stifled ()
+{
+  return (history_stifled);
+}
+
+void
+clear_history ()
+{
+  register int i;
+
+  /* This loses because we cannot free the data. */
+  for (i = 0; i < history_length; i++)
+    {
+      free_history_entry (the_history[i]);
+      the_history[i] = (HIST_ENTRY *)NULL;
+    }
+
+  history_offset = history_length = 0;
+}
diff --git a/history.h b/history.h
new file mode 100644 (file)
index 0000000..14ca2a9
--- /dev/null
+++ b/history.h
@@ -0,0 +1,266 @@
+/* history.h -- the names of functions that you can call in history. */
+/* Copyright (C) 1989-2003 Free Software Foundation, Inc.
+
+   This file contains the GNU History Library (the Library), a set of
+   routines for managing the text of previously typed lines.
+
+   The Library 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.
+
+   The Library is distributed in the hope that it will be useful, but
+   WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   General Public License for more details.
+
+   The GNU General Public License is often shipped with GNU software, and
+   is generally kept in a file called COPYING or LICENSE.  If you do not
+   have a copy of the license, write to the Free Software Foundation,
+   59 Temple Place, Suite 330, Boston, MA 02111 USA. */
+
+#ifndef _HISTORY_H_
+#define _HISTORY_H_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <time.h>              /* XXX - for history timestamp code */
+
+#if defined READLINE_LIBRARY
+#  include "rlstdc.h"
+#  include "rltypedefs.h"
+#else
+#  include <readline/rlstdc.h>
+#  include <readline/rltypedefs.h>
+#endif
+
+#ifdef __STDC__
+typedef void *histdata_t;
+#else
+typedef char *histdata_t;
+#endif
+
+/* The structure used to store a history entry. */
+typedef struct _hist_entry {
+  char *line;
+  char *timestamp;             /* char * rather than time_t for read/write */
+  histdata_t data;
+} HIST_ENTRY;
+
+/* Size of the history-library-managed space in history entry HS. */
+#define HISTENT_BYTES(hs)      (strlen ((hs)->line) + strlen ((hs)->timestamp))
+
+/* A structure used to pass the current state of the history stuff around. */
+typedef struct _hist_state {
+  HIST_ENTRY **entries;                /* Pointer to the entries themselves. */
+  int offset;                  /* The location pointer within this array. */
+  int length;                  /* Number of elements within this array. */
+  int size;                    /* Number of slots allocated to this array. */
+  int flags;
+} HISTORY_STATE;
+
+/* Flag values for the `flags' member of HISTORY_STATE. */
+#define HS_STIFLED     0x01
+
+/* Initialization and state management. */
+
+/* Begin a session in which the history functions might be used.  This
+   just initializes the interactive variables. */
+extern void using_history PARAMS((void));
+
+/* Return the current HISTORY_STATE of the history. */
+extern HISTORY_STATE *history_get_history_state PARAMS((void));
+
+/* Set the state of the current history array to STATE. */
+extern void history_set_history_state PARAMS((HISTORY_STATE *));
+
+/* Manage the history list. */
+
+/* Place STRING at the end of the history list.
+   The associated data field (if any) is set to NULL. */
+extern void add_history PARAMS((const char *));
+
+/* Change the timestamp associated with the most recent history entry to
+   STRING. */
+extern void add_history_time PARAMS((const char *));
+
+/* A reasonably useless function, only here for completeness.  WHICH
+   is the magic number that tells us which element to delete.  The
+   elements are numbered from 0. */
+extern HIST_ENTRY *remove_history PARAMS((int));
+
+/* Free the history entry H and return any application-specific data
+   associated with it. */
+extern histdata_t free_history_entry PARAMS((HIST_ENTRY *));
+
+/* Make the history entry at WHICH have LINE and DATA.  This returns
+   the old entry so you can dispose of the data.  In the case of an
+   invalid WHICH, a NULL pointer is returned. */
+extern HIST_ENTRY *replace_history_entry PARAMS((int, const char *, histdata_t));
+
+/* Clear the history list and start over. */
+extern void clear_history PARAMS((void));
+
+/* Stifle the history list, remembering only MAX number of entries. */
+extern void stifle_history PARAMS((int));
+
+/* Stop stifling the history.  This returns the previous amount the
+   history was stifled by.  The value is positive if the history was
+   stifled, negative if it wasn't. */
+extern int unstifle_history PARAMS((void));
+
+/* Return 1 if the history is stifled, 0 if it is not. */
+extern int history_is_stifled PARAMS((void));
+
+/* Information about the history list. */
+
+/* Return a NULL terminated array of HIST_ENTRY which is the current input
+   history.  Element 0 of this list is the beginning of time.  If there
+   is no history, return NULL. */
+extern HIST_ENTRY **history_list PARAMS((void));
+
+/* Returns the number which says what history element we are now
+   looking at.  */
+extern int where_history PARAMS((void));
+  
+/* Return the history entry at the current position, as determined by
+   history_offset.  If there is no entry there, return a NULL pointer. */
+extern HIST_ENTRY *current_history PARAMS((void));
+
+/* Return the history entry which is logically at OFFSET in the history
+   array.  OFFSET is relative to history_base. */
+extern HIST_ENTRY *history_get PARAMS((int));
+
+/* Return the timestamp associated with the HIST_ENTRY * passed as an
+   argument */
+extern time_t history_get_time PARAMS((HIST_ENTRY *));
+
+/* Return the number of bytes that the primary history entries are using.
+   This just adds up the lengths of the_history->lines. */
+extern int history_total_bytes PARAMS((void));
+
+/* Moving around the history list. */
+
+/* Set the position in the history list to POS. */
+extern int history_set_pos PARAMS((int));
+
+/* Back up history_offset to the previous history entry, and return
+   a pointer to that entry.  If there is no previous entry, return
+   a NULL pointer. */
+extern HIST_ENTRY *previous_history PARAMS((void));
+
+/* Move history_offset forward to the next item in the input_history,
+   and return the a pointer to that entry.  If there is no next entry,
+   return a NULL pointer. */
+extern HIST_ENTRY *next_history PARAMS((void));
+
+/* Searching the history list. */
+
+/* Search the history for STRING, starting at history_offset.
+   If DIRECTION < 0, then the search is through previous entries,
+   else through subsequent.  If the string is found, then
+   current_history () is the history entry, and the value of this function
+   is the offset in the line of that history entry that the string was
+   found in.  Otherwise, nothing is changed, and a -1 is returned. */
+extern int history_search PARAMS((const char *, int));
+
+/* Search the history for STRING, starting at history_offset.
+   The search is anchored: matching lines must begin with string.
+   DIRECTION is as in history_search(). */
+extern int history_search_prefix PARAMS((const char *, int));
+
+/* Search for STRING in the history list, starting at POS, an
+   absolute index into the list.  DIR, if negative, says to search
+   backwards from POS, else forwards.
+   Returns the absolute index of the history element where STRING
+   was found, or -1 otherwise. */
+extern int history_search_pos PARAMS((const char *, int, int));
+
+/* Managing the history file. */
+
+/* Add the contents of FILENAME to the history list, a line at a time.
+   If FILENAME is NULL, then read from ~/.history.  Returns 0 if
+   successful, or errno if not. */
+extern int read_history PARAMS((const char *));
+
+/* Read a range of lines from FILENAME, adding them to the history list.
+   Start reading at the FROM'th line and end at the TO'th.  If FROM
+   is zero, start at the beginning.  If TO is less than FROM, read
+   until the end of the file.  If FILENAME is NULL, then read from
+   ~/.history.  Returns 0 if successful, or errno if not. */
+extern int read_history_range PARAMS((const char *, int, int));
+
+/* Write the current history to FILENAME.  If FILENAME is NULL,
+   then write the history list to ~/.history.  Values returned
+   are as in read_history ().  */
+extern int write_history PARAMS((const char *));
+
+/* Append NELEMENT entries to FILENAME.  The entries appended are from
+   the end of the list minus NELEMENTs up to the end of the list. */
+extern int append_history PARAMS((int, const char *));
+
+/* Truncate the history file, leaving only the last NLINES lines. */
+extern int history_truncate_file PARAMS((const char *, int));
+
+/* History expansion. */
+
+/* Expand the string STRING, placing the result into OUTPUT, a pointer
+   to a string.  Returns:
+
+   0) If no expansions took place (or, if the only change in
+      the text was the de-slashifying of the history expansion
+      character)
+   1) If expansions did take place
+  -1) If there was an error in expansion.
+   2) If the returned line should just be printed.
+
+  If an error ocurred in expansion, then OUTPUT contains a descriptive
+  error message. */
+extern int history_expand PARAMS((char *, char **));
+
+/* Extract a string segment consisting of the FIRST through LAST
+   arguments present in STRING.  Arguments are broken up as in
+   the shell. */
+extern char *history_arg_extract PARAMS((int, int, const char *));
+
+/* Return the text of the history event beginning at the current
+   offset into STRING.  Pass STRING with *INDEX equal to the
+   history_expansion_char that begins this specification.
+   DELIMITING_QUOTE is a character that is allowed to end the string
+   specification for what to search for in addition to the normal
+   characters `:', ` ', `\t', `\n', and sometimes `?'. */
+extern char *get_history_event PARAMS((const char *, int *, int));
+
+/* Return an array of tokens, much as the shell might.  The tokens are
+   parsed out of STRING. */
+extern char **history_tokenize PARAMS((const char *));
+
+/* Exported history variables. */
+extern int history_base;
+extern int history_length;
+extern int history_max_entries;
+extern char history_expansion_char;
+extern char history_subst_char;
+extern char *history_word_delimiters;
+extern char history_comment_char;
+extern char *history_no_expand_chars;
+extern char *history_search_delimiter_chars;
+extern int history_quotes_inhibit_expansion;
+
+extern int history_write_timestamps;
+
+/* Backwards compatibility */
+extern int max_input_history;
+
+/* If set, this function is called to decide whether or not a particular
+   history expansion should be treated as a special case for the calling
+   application and not expanded. */
+extern rl_linebuf_func_t *history_inhibit_expansion_function;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* !_HISTORY_H_ */
diff --git a/histsearch.c b/histsearch.c
new file mode 100644 (file)
index 0000000..1cc5875
--- /dev/null
@@ -0,0 +1,195 @@
+/* histsearch.c -- searching the history list. */
+
+/* Copyright (C) 1989, 1992 Free Software Foundation, Inc.
+
+   This file contains the GNU History Library (the Library), a set of
+   routines for managing the text of previously typed lines.
+
+   The Library 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.
+
+   The Library is distributed in the hope that it will be useful, but
+   WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   General Public License for more details.
+
+   The GNU General Public License is often shipped with GNU software, and
+   is generally kept in a file called COPYING or LICENSE.  If you do not
+   have a copy of the license, write to the Free Software Foundation,
+   59 Temple Place, Suite 330, Boston, MA 02111 USA. */
+
+#define READLINE_LIBRARY
+
+#if defined (HAVE_CONFIG_H)
+#  include <config.h>
+#endif
+
+#include <stdio.h>
+#if defined (HAVE_STDLIB_H)
+#  include <stdlib.h>
+#else
+#  include "ansi_stdlib.h"
+#endif /* HAVE_STDLIB_H */
+
+#if defined (HAVE_UNISTD_H)
+#  ifdef _MINIX
+#    include <sys/types.h>
+#  endif
+#  include <unistd.h>
+#endif
+
+#include "history.h"
+#include "histlib.h"
+
+/* The list of alternate characters that can delimit a history search
+   string. */
+char *history_search_delimiter_chars = (char *)NULL;
+
+static int history_search_internal PARAMS((const char *, int, int));
+
+/* Search the history for STRING, starting at history_offset.
+   If DIRECTION < 0, then the search is through previous entries, else
+   through subsequent.  If ANCHORED is non-zero, the string must
+   appear at the beginning of a history line, otherwise, the string
+   may appear anywhere in the line.  If the string is found, then
+   current_history () is the history entry, and the value of this
+   function is the offset in the line of that history entry that the
+   string was found in.  Otherwise, nothing is changed, and a -1 is
+   returned. */
+
+static int
+history_search_internal (string, direction, anchored)
+     const char *string;
+     int direction, anchored;
+{
+  register int i, reverse;
+  register char *line;
+  register int line_index;
+  int string_len;
+  HIST_ENTRY **the_history;    /* local */
+
+  i = history_offset;
+  reverse = (direction < 0);
+
+  /* Take care of trivial cases first. */
+  if (string == 0 || *string == '\0')
+    return (-1);
+
+  if (!history_length || ((i >= history_length) && !reverse))
+    return (-1);
+
+  if (reverse && (i >= history_length))
+    i = history_length - 1;
+
+#define NEXT_LINE() do { if (reverse) i--; else i++; } while (0)
+
+  the_history = history_list ();
+  string_len = strlen (string);
+  while (1)
+    {
+      /* Search each line in the history list for STRING. */
+
+      /* At limit for direction? */
+      if ((reverse && i < 0) || (!reverse && i == history_length))
+       return (-1);
+
+      line = the_history[i]->line;
+      line_index = strlen (line);
+
+      /* If STRING is longer than line, no match. */
+      if (string_len > line_index)
+       {
+         NEXT_LINE ();
+         continue;
+       }
+
+      /* Handle anchored searches first. */
+      if (anchored == ANCHORED_SEARCH)
+       {
+         if (STREQN (string, line, string_len))
+           {
+             history_offset = i;
+             return (0);
+           }
+
+         NEXT_LINE ();
+         continue;
+       }
+
+      /* Do substring search. */
+      if (reverse)
+       {
+         line_index -= string_len;
+
+         while (line_index >= 0)
+           {
+             if (STREQN (string, line + line_index, string_len))
+               {
+                 history_offset = i;
+                 return (line_index);
+               }
+             line_index--;
+           }
+       }
+      else
+       {
+         register int limit;
+
+         limit = line_index - string_len + 1;
+         line_index = 0;
+
+         while (line_index < limit)
+           {
+             if (STREQN (string, line + line_index, string_len))
+               {
+                 history_offset = i;
+                 return (line_index);
+               }
+             line_index++;
+           }
+       }
+      NEXT_LINE ();
+    }
+}
+
+/* Do a non-anchored search for STRING through the history in DIRECTION. */
+int
+history_search (string, direction)
+     const char *string;
+     int direction;
+{
+  return (history_search_internal (string, direction, NON_ANCHORED_SEARCH));
+}
+
+/* Do an anchored search for string through the history in DIRECTION. */
+int
+history_search_prefix (string, direction)
+     const char *string;
+     int direction;
+{
+  return (history_search_internal (string, direction, ANCHORED_SEARCH));
+}
+
+/* Search for STRING in the history list.  DIR is < 0 for searching
+   backwards.  POS is an absolute index into the history list at
+   which point to begin searching. */
+int
+history_search_pos (string, dir, pos)
+     const char *string;
+     int dir, pos;
+{
+  int ret, old;
+
+  old = where_history ();
+  history_set_pos (pos);
+  if (history_search (string, dir) == -1)
+    {
+      history_set_pos (old);
+      return (-1);
+    }
+  ret = where_history ();
+  history_set_pos (old);
+  return ret;
+}
diff --git a/input.c b/input.c
new file mode 100644 (file)
index 0000000..da5d771
--- /dev/null
+++ b/input.c
@@ -0,0 +1,583 @@
+/* input.c -- character input functions for readline. */
+
+/* Copyright (C) 1994-2005 Free Software Foundation, Inc.
+
+   This file is part of the GNU Readline Library, a library for
+   reading lines of text with interactive input and history editing.
+
+   The GNU Readline Library 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.
+
+   The GNU Readline Library is distributed in the hope that it will be
+   useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+   of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   The GNU General Public License is often shipped with GNU software, and
+   is generally kept in a file called COPYING or LICENSE.  If you do not
+   have a copy of the license, write to the Free Software Foundation,
+   59 Temple Place, Suite 330, Boston, MA 02111 USA. */
+#define READLINE_LIBRARY
+
+#if defined (__TANDEM)
+#  include <floss.h>
+#endif
+
+#if defined (HAVE_CONFIG_H)
+#  include <config.h>
+#endif
+
+#include <sys/types.h>
+#include <fcntl.h>
+#if defined (HAVE_SYS_FILE_H)
+#  include <sys/file.h>
+#endif /* HAVE_SYS_FILE_H */
+
+#if defined (HAVE_UNISTD_H)
+#  include <unistd.h>
+#endif /* HAVE_UNISTD_H */
+
+#if defined (HAVE_STDLIB_H)
+#  include <stdlib.h>
+#else
+#  include "ansi_stdlib.h"
+#endif /* HAVE_STDLIB_H */
+
+#if defined (HAVE_SELECT)
+#  if !defined (HAVE_SYS_SELECT_H) || !defined (M_UNIX)
+#    include <sys/time.h>
+#  endif
+#endif /* HAVE_SELECT */
+#if defined (HAVE_SYS_SELECT_H)
+#  include <sys/select.h>
+#endif
+
+#if defined (FIONREAD_IN_SYS_IOCTL)
+#  include <sys/ioctl.h>
+#endif
+
+#include <stdio.h>
+#include <errno.h>
+
+#if !defined (errno)
+extern int errno;
+#endif /* !errno */
+
+/* System-specific feature definitions and include files. */
+#include "rldefs.h"
+#include "rlmbutil.h"
+
+/* Some standard library routines. */
+#include "readline.h"
+
+#include "rlprivate.h"
+#include "rlshell.h"
+#include "xmalloc.h"
+
+/* What kind of non-blocking I/O do we have? */
+#if !defined (O_NDELAY) && defined (O_NONBLOCK)
+#  define O_NDELAY O_NONBLOCK  /* Posix style */
+#endif
+
+/* Non-null means it is a pointer to a function to run while waiting for
+   character input. */
+rl_hook_func_t *rl_event_hook = (rl_hook_func_t *)NULL;
+
+rl_getc_func_t *rl_getc_function = rl_getc;
+
+static int _keyboard_input_timeout = 100000;           /* 0.1 seconds; it's in usec */
+
+static int ibuffer_space PARAMS((void));
+static int rl_get_char PARAMS((int *));
+static int rl_gather_tyi PARAMS((void));
+
+/* **************************************************************** */
+/*                                                                 */
+/*                     Character Input Buffering                   */
+/*                                                                 */
+/* **************************************************************** */
+
+static int pop_index, push_index;
+static unsigned char ibuffer[512];
+static int ibuffer_len = sizeof (ibuffer) - 1;
+
+#define any_typein (push_index != pop_index)
+
+int
+_rl_any_typein ()
+{
+  return any_typein;
+}
+
+/* Return the amount of space available in the buffer for stuffing
+   characters. */
+static int
+ibuffer_space ()
+{
+  if (pop_index > push_index)
+    return (pop_index - push_index - 1);
+  else
+    return (ibuffer_len - (push_index - pop_index));
+}
+
+/* Get a key from the buffer of characters to be read.
+   Return the key in KEY.
+   Result is KEY if there was a key, or 0 if there wasn't. */
+static int
+rl_get_char (key)
+     int *key;
+{
+  if (push_index == pop_index)
+    return (0);
+
+  *key = ibuffer[pop_index++];
+
+  if (pop_index >= ibuffer_len)
+    pop_index = 0;
+
+  return (1);
+}
+
+/* Stuff KEY into the *front* of the input buffer.
+   Returns non-zero if successful, zero if there is
+   no space left in the buffer. */
+int
+_rl_unget_char (key)
+     int key;
+{
+  if (ibuffer_space ())
+    {
+      pop_index--;
+      if (pop_index < 0)
+       pop_index = ibuffer_len - 1;
+      ibuffer[pop_index] = key;
+      return (1);
+    }
+  return (0);
+}
+
+int
+_rl_pushed_input_available ()
+{
+  return (push_index != pop_index);
+}
+
+/* If a character is available to be read, then read it and stuff it into
+   IBUFFER.  Otherwise, just return.  Returns number of characters read
+   (0 if none available) and -1 on error (EIO). */
+static int
+rl_gather_tyi ()
+{
+  int tty;
+  register int tem, result;
+  int chars_avail, k;
+  char input;
+#if defined(HAVE_SELECT)
+  fd_set readfds, exceptfds;
+  struct timeval timeout;
+#endif
+
+  chars_avail = 0;
+  tty = fileno (rl_instream);
+
+#if defined (HAVE_SELECT)
+  FD_ZERO (&readfds);
+  FD_ZERO (&exceptfds);
+  FD_SET (tty, &readfds);
+  FD_SET (tty, &exceptfds);
+  timeout.tv_sec = 0;
+  timeout.tv_usec = _keyboard_input_timeout;
+  result = select (tty + 1, &readfds, (fd_set *)NULL, &exceptfds, &timeout);
+  if (result <= 0)
+    return 0;  /* Nothing to read. */
+#endif
+
+  result = -1;
+#if defined (FIONREAD)
+  errno = 0;
+  result = ioctl (tty, FIONREAD, &chars_avail);
+  if (result == -1 && errno == EIO)
+    return -1;
+#endif
+
+#if defined (O_NDELAY)
+  if (result == -1)
+    {
+      tem = fcntl (tty, F_GETFL, 0);
+
+      fcntl (tty, F_SETFL, (tem | O_NDELAY));
+      chars_avail = read (tty, &input, 1);
+
+      fcntl (tty, F_SETFL, tem);
+      if (chars_avail == -1 && errno == EAGAIN)
+       return 0;
+      if (chars_avail == 0)    /* EOF */
+       {
+         rl_stuff_char (EOF);
+         return (0);
+       }
+    }
+#endif /* O_NDELAY */
+
+#if defined (__MINGW32__)
+  /* Use getch/_kbhit to check for available console input, in the same way
+     that we read it normally. */
+   chars_avail = isatty (tty) ? _kbhit () : 0;
+   result = 0;
+#endif
+
+  /* If there's nothing available, don't waste time trying to read
+     something. */
+  if (chars_avail <= 0)
+    return 0;
+
+  tem = ibuffer_space ();
+
+  if (chars_avail > tem)
+    chars_avail = tem;
+
+  /* One cannot read all of the available input.  I can only read a single
+     character at a time, or else programs which require input can be
+     thwarted.  If the buffer is larger than one character, I lose.
+     Damn! */
+  if (tem < ibuffer_len)
+    chars_avail = 0;
+
+  if (result != -1)
+    {
+      while (chars_avail--)
+       {
+         k = (*rl_getc_function) (rl_instream);
+         rl_stuff_char (k);
+         if (k == NEWLINE || k == RETURN)
+           break;
+       }
+    }
+  else
+    {
+      if (chars_avail)
+       rl_stuff_char (input);
+    }
+
+  return 1;
+}
+
+int
+rl_set_keyboard_input_timeout (u)
+     int u;
+{
+  int o;
+
+  o = _keyboard_input_timeout;
+  if (u >= 0)
+    _keyboard_input_timeout = u;
+  return (o);
+}
+
+/* Is there input available to be read on the readline input file
+   descriptor?  Only works if the system has select(2) or FIONREAD.
+   Uses the value of _keyboard_input_timeout as the timeout; if another
+   readline function wants to specify a timeout and not leave it up to
+   the user, it should use _rl_input_queued(timeout_value_in_microseconds)
+   instead. */
+int
+_rl_input_available ()
+{
+#if defined(HAVE_SELECT)
+  fd_set readfds, exceptfds;
+  struct timeval timeout;
+#endif
+#if !defined (HAVE_SELECT) && defined(FIONREAD)
+  int chars_avail;
+#endif
+  int tty;
+
+  tty = fileno (rl_instream);
+
+#if defined (HAVE_SELECT)
+  FD_ZERO (&readfds);
+  FD_ZERO (&exceptfds);
+  FD_SET (tty, &readfds);
+  FD_SET (tty, &exceptfds);
+  timeout.tv_sec = 0;
+  timeout.tv_usec = _keyboard_input_timeout;
+  return (select (tty + 1, &readfds, (fd_set *)NULL, &exceptfds, &timeout) > 0);
+#else
+
+#if defined (FIONREAD)
+  if (ioctl (tty, FIONREAD, &chars_avail) == 0)
+    return (chars_avail);
+#endif
+
+#endif
+
+#if defined (__MINGW32__)
+  if (isatty (tty))
+    return (_kbhit ());
+#endif
+
+  return 0;
+}
+
+int
+_rl_input_queued (t)
+     int t;
+{
+  int old_timeout, r;
+
+  old_timeout = rl_set_keyboard_input_timeout (t);
+  r = _rl_input_available ();
+  rl_set_keyboard_input_timeout (old_timeout);
+  return r;
+}
+
+void
+_rl_insert_typein (c)
+     int c;     
+{      
+  int key, t, i;
+  char *string;
+
+  i = key = 0;
+  string = (char *)xmalloc (ibuffer_len + 1);
+  string[i++] = (char) c;
+
+  while ((t = rl_get_char (&key)) &&
+        _rl_keymap[key].type == ISFUNC &&
+        _rl_keymap[key].function == rl_insert)
+    string[i++] = key;
+
+  if (t)
+    _rl_unget_char (key);
+
+  string[i] = '\0';
+  rl_insert_text (string);
+  free (string);
+}
+
+/* Add KEY to the buffer of characters to be read.  Returns 1 if the
+   character was stuffed correctly; 0 otherwise. */
+int
+rl_stuff_char (key)
+     int key;
+{
+  if (ibuffer_space () == 0)
+    return 0;
+
+  if (key == EOF)
+    {
+      key = NEWLINE;
+      rl_pending_input = EOF;
+      RL_SETSTATE (RL_STATE_INPUTPENDING);
+    }
+  ibuffer[push_index++] = key;
+  if (push_index >= ibuffer_len)
+    push_index = 0;
+
+  return 1;
+}
+
+/* Make C be the next command to be executed. */
+int
+rl_execute_next (c)
+     int c;
+{
+  rl_pending_input = c;
+  RL_SETSTATE (RL_STATE_INPUTPENDING);
+  return 0;
+}
+
+/* Clear any pending input pushed with rl_execute_next() */
+int
+rl_clear_pending_input ()
+{
+  rl_pending_input = 0;
+  RL_UNSETSTATE (RL_STATE_INPUTPENDING);
+  return 0;
+}
+
+/* **************************************************************** */
+/*                                                                 */
+/*                          Character Input                        */
+/*                                                                 */
+/* **************************************************************** */
+
+/* Read a key, including pending input. */
+int
+rl_read_key ()
+{
+  int c;
+
+  rl_key_sequence_length++;
+
+  if (rl_pending_input)
+    {
+      c = rl_pending_input;
+      rl_clear_pending_input ();
+    }
+  else
+    {
+      /* If input is coming from a macro, then use that. */
+      if (c = _rl_next_macro_key ())
+       return (c);
+
+      /* If the user has an event function, then call it periodically. */
+      if (rl_event_hook)
+       {
+         while (rl_event_hook && rl_get_char (&c) == 0)
+           {
+             (*rl_event_hook) ();
+             if (rl_done)              /* XXX - experimental */
+               return ('\n');
+             if (rl_gather_tyi () < 0) /* XXX - EIO */
+               {
+                 rl_done = 1;
+                 return ('\n');
+               }
+           }
+       }
+      else
+       {
+         if (rl_get_char (&c) == 0)
+           c = (*rl_getc_function) (rl_instream);
+       }
+    }
+
+  return (c);
+}
+
+int
+rl_getc (stream)
+     FILE *stream;
+{
+  int result;
+  unsigned char c;
+
+  while (1)
+    {
+#if defined (__MINGW32__)
+      if (isatty (fileno (stream)))
+       return (getch ());
+#endif
+      result = read (fileno (stream), &c, sizeof (unsigned char));
+
+      if (result == sizeof (unsigned char))
+       return (c);
+
+      /* If zero characters are returned, then the file that we are
+        reading from is empty!  Return EOF in that case. */
+      if (result == 0)
+       return (EOF);
+
+#if defined (__BEOS__)
+      if (errno == EINTR)
+       continue;
+#endif
+
+#if defined (EWOULDBLOCK)
+#  define X_EWOULDBLOCK EWOULDBLOCK
+#else
+#  define X_EWOULDBLOCK -99
+#endif
+
+#if defined (EAGAIN)
+#  define X_EAGAIN EAGAIN
+#else
+#  define X_EAGAIN -99
+#endif
+
+      if (errno == X_EWOULDBLOCK || errno == X_EAGAIN)
+       {
+         if (sh_unset_nodelay_mode (fileno (stream)) < 0)
+           return (EOF);
+         continue;
+       }
+
+#undef X_EWOULDBLOCK
+#undef X_EAGAIN
+
+      /* If the error that we received was SIGINT, then try again,
+        this is simply an interrupted system call to read ().
+        Otherwise, some error ocurred, also signifying EOF. */
+      if (errno != EINTR)
+       return (RL_ISSTATE (RL_STATE_READCMD) ? READERR : EOF);
+    }
+}
+
+#if defined (HANDLE_MULTIBYTE)
+/* read multibyte char */
+int
+_rl_read_mbchar (mbchar, size)
+     char *mbchar;
+     int size;
+{
+  int mb_len = 0;
+  size_t mbchar_bytes_length;
+  wchar_t wc;
+  mbstate_t ps, ps_back;
+
+  memset(&ps, 0, sizeof (mbstate_t));
+  memset(&ps_back, 0, sizeof (mbstate_t));
+  
+  while (mb_len < size)
+    {
+      RL_SETSTATE(RL_STATE_MOREINPUT);
+      mbchar[mb_len++] = rl_read_key ();
+      RL_UNSETSTATE(RL_STATE_MOREINPUT);
+
+      mbchar_bytes_length = mbrtowc (&wc, mbchar, mb_len, &ps);
+      if (mbchar_bytes_length == (size_t)(-1))
+       break;          /* invalid byte sequence for the current locale */
+      else if (mbchar_bytes_length == (size_t)(-2))
+       {
+         /* shorted bytes */
+         ps = ps_back;
+         continue;
+       } 
+      else if (mbchar_bytes_length == 0)
+       {
+         mbchar[0] = '\0';     /* null wide character */
+         mb_len = 1;
+         break;
+       }
+      else if (mbchar_bytes_length > (size_t)(0))
+       break;
+    }
+
+  return mb_len;
+}
+
+/* Read a multibyte-character string whose first character is FIRST into
+   the buffer MB of length MLEN.  Returns the last character read, which
+   may be FIRST.  Used by the search functions, among others.  Very similar
+   to _rl_read_mbchar. */
+int
+_rl_read_mbstring (first, mb, mlen)
+     int first;
+     char *mb;
+     int mlen;
+{
+  int i, c;
+  mbstate_t ps;
+
+  c = first;
+  memset (mb, 0, mlen);
+  for (i = 0; i < mlen; i++)
+    {
+      mb[i] = (char)c;
+      memset (&ps, 0, sizeof (mbstate_t));
+      if (_rl_get_char_len (mb, &ps) == -2)
+       {
+         /* Read more for multibyte character */
+         RL_SETSTATE (RL_STATE_MOREINPUT);
+         c = rl_read_key ();
+         RL_UNSETSTATE (RL_STATE_MOREINPUT);
+       }
+      else
+       break;
+    }
+  return c;
+}
+#endif /* HANDLE_MULTIBYTE */
diff --git a/isearch.c b/isearch.c
new file mode 100644 (file)
index 0000000..9f67bfc
--- /dev/null
+++ b/isearch.c
@@ -0,0 +1,666 @@
+/* **************************************************************** */
+/*                                                                 */
+/*                     I-Search and Searching                      */
+/*                                                                 */
+/* **************************************************************** */
+
+/* Copyright (C) 1987-2005 Free Software Foundation, Inc.
+
+   This file contains the Readline Library (the Library), a set of
+   routines for providing Emacs style line input to programs that ask
+   for it.
+
+   The Library 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.
+
+   The Library is distributed in the hope that it will be useful, but
+   WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   General Public License for more details.
+
+   The GNU General Public License is often shipped with GNU software, and
+   is generally kept in a file called COPYING or LICENSE.  If you do not
+   have a copy of the license, write to the Free Software Foundation,
+   59 Temple Place, Suite 330, Boston, MA 02111 USA. */
+#define READLINE_LIBRARY
+
+#if defined (HAVE_CONFIG_H)
+#  include <config.h>
+#endif
+
+#include <sys/types.h>
+
+#include <stdio.h>
+
+#if defined (HAVE_UNISTD_H)
+#  include <unistd.h>
+#endif
+
+#if defined (HAVE_STDLIB_H)
+#  include <stdlib.h>
+#else
+#  include "ansi_stdlib.h"
+#endif
+
+#include "rldefs.h"
+#include "rlmbutil.h"
+
+#include "readline.h"
+#include "history.h"
+
+#include "rlprivate.h"
+#include "xmalloc.h"
+
+/* Variables exported to other files in the readline library. */
+char *_rl_isearch_terminators = (char *)NULL;
+
+_rl_search_cxt *_rl_iscxt = 0;
+
+/* Variables imported from other files in the readline library. */
+extern HIST_ENTRY *_rl_saved_line_for_history;
+
+static int rl_search_history PARAMS((int, int));
+
+static _rl_search_cxt *_rl_isearch_init PARAMS((int));
+static void _rl_isearch_fini PARAMS((_rl_search_cxt *));
+static int _rl_isearch_cleanup PARAMS((_rl_search_cxt *, int));
+
+/* Last line found by the current incremental search, so we don't `find'
+   identical lines many times in a row.  Now part of isearch context. */
+/* static char *prev_line_found; */
+
+/* Last search string and its length. */
+static char *last_isearch_string;
+static int last_isearch_string_len;
+
+static char *default_isearch_terminators = "\033\012";
+
+_rl_search_cxt *
+_rl_scxt_alloc (type, flags)
+     int type, flags;
+{
+  _rl_search_cxt *cxt;
+
+  cxt = (_rl_search_cxt *)xmalloc (sizeof (_rl_search_cxt));
+
+  cxt->type = type;
+  cxt->sflags = flags;
+
+  cxt->search_string = 0;
+  cxt->search_string_size = cxt->search_string_index = 0;
+
+  cxt->lines = 0;
+  cxt->allocated_line = 0;
+  cxt->hlen = cxt->hindex = 0;
+
+  cxt->save_point = rl_point;
+  cxt->save_mark = rl_mark;
+  cxt->save_line = where_history ();
+  cxt->last_found_line = cxt->save_line;
+  cxt->prev_line_found = 0;
+
+  cxt->save_undo_list = 0;
+
+  cxt->history_pos = 0;
+  cxt->direction = 0;
+
+  cxt->lastc = 0;
+
+  cxt->sline = 0;
+  cxt->sline_len = cxt->sline_index = 0;
+
+  cxt->search_terminators = 0;
+
+  return cxt;
+}
+
+void
+_rl_scxt_dispose (cxt, flags)
+     _rl_search_cxt *cxt;
+     int flags;
+{
+  FREE (cxt->search_string);
+  FREE (cxt->allocated_line);
+  FREE (cxt->lines);
+
+  free (cxt);
+}
+
+/* Search backwards through the history looking for a string which is typed
+   interactively.  Start with the current line. */
+int
+rl_reverse_search_history (sign, key)
+     int sign, key;
+{
+  return (rl_search_history (-sign, key));
+}
+
+/* Search forwards through the history looking for a string which is typed
+   interactively.  Start with the current line. */
+int
+rl_forward_search_history (sign, key)
+     int sign, key;
+{
+  return (rl_search_history (sign, key));
+}
+
+/* Display the current state of the search in the echo-area.
+   SEARCH_STRING contains the string that is being searched for,
+   DIRECTION is zero for forward, or non-zero for reverse,
+   WHERE is the history list number of the current line.  If it is
+   -1, then this line is the starting one. */
+static void
+rl_display_search (search_string, reverse_p, where)
+     char *search_string;
+     int reverse_p, where;
+{
+  char *message;
+  int msglen, searchlen;
+
+  searchlen = (search_string && *search_string) ? strlen (search_string) : 0;
+
+  message = (char *)xmalloc (searchlen + 33);
+  msglen = 0;
+
+#if defined (NOTDEF)
+  if (where != -1)
+    {
+      sprintf (message, "[%d]", where + history_base);
+      msglen = strlen (message);
+    }
+#endif /* NOTDEF */
+
+  message[msglen++] = '(';
+
+  if (reverse_p)
+    {
+      strcpy (message + msglen, "reverse-");
+      msglen += 8;
+    }
+
+  strcpy (message + msglen, "i-search)`");
+  msglen += 10;
+
+  if (search_string)
+    {
+      strcpy (message + msglen, search_string);
+      msglen += searchlen;
+    }
+
+  strcpy (message + msglen, "': ");
+
+  rl_message ("%s", message);
+  free (message);
+  (*rl_redisplay_function) ();
+}
+
+static _rl_search_cxt *
+_rl_isearch_init (direction)
+     int direction;
+{
+  _rl_search_cxt *cxt;
+  register int i;
+  HIST_ENTRY **hlist;
+
+  cxt = _rl_scxt_alloc (RL_SEARCH_ISEARCH, 0);
+  if (direction < 0)
+    cxt->sflags |= SF_REVERSE;
+
+  cxt->search_terminators = _rl_isearch_terminators ? _rl_isearch_terminators
+                                               : default_isearch_terminators;
+
+  /* Create an arrary of pointers to the lines that we want to search. */
+  hlist = history_list ();
+  rl_maybe_replace_line ();
+  i = 0;
+  if (hlist)
+    for (i = 0; hlist[i]; i++);
+
+  /* Allocate space for this many lines, +1 for the current input line,
+     and remember those lines. */
+  cxt->lines = (char **)xmalloc ((1 + (cxt->hlen = i)) * sizeof (char *));
+  for (i = 0; i < cxt->hlen; i++)
+    cxt->lines[i] = hlist[i]->line;
+
+  if (_rl_saved_line_for_history)
+    cxt->lines[i] = _rl_saved_line_for_history->line;
+  else
+    {
+      /* Keep track of this so we can free it. */
+      cxt->allocated_line = (char *)xmalloc (1 + strlen (rl_line_buffer));
+      strcpy (cxt->allocated_line, &rl_line_buffer[0]);
+      cxt->lines[i] = cxt->allocated_line;
+    }
+
+  cxt->hlen++;
+
+  /* The line where we start the search. */
+  cxt->history_pos = cxt->save_line;
+
+  rl_save_prompt ();
+
+  /* Initialize search parameters. */
+  cxt->search_string = (char *)xmalloc (cxt->search_string_size = 128);
+  cxt->search_string[cxt->search_string_index = 0] = '\0';
+
+  /* Normalize DIRECTION into 1 or -1. */
+  cxt->direction = (direction >= 0) ? 1 : -1;
+
+  cxt->sline = rl_line_buffer;
+  cxt->sline_len = strlen (cxt->sline);
+  cxt->sline_index = rl_point;
+
+  _rl_iscxt = cxt;             /* save globally */
+
+  return cxt;
+}
+
+static void
+_rl_isearch_fini (cxt)
+     _rl_search_cxt *cxt;
+{
+  /* First put back the original state. */
+  strcpy (rl_line_buffer, cxt->lines[cxt->save_line]);
+
+  rl_restore_prompt ();
+
+  /* Save the search string for possible later use. */
+  FREE (last_isearch_string);
+  last_isearch_string = cxt->search_string;
+  last_isearch_string_len = cxt->search_string_index;
+  cxt->search_string = 0;
+
+  if (cxt->last_found_line < cxt->save_line)
+    rl_get_previous_history (cxt->save_line - cxt->last_found_line, 0);
+  else
+    rl_get_next_history (cxt->last_found_line - cxt->save_line, 0);
+
+  /* If the string was not found, put point at the end of the last matching
+     line.  If last_found_line == orig_line, we didn't find any matching
+     history lines at all, so put point back in its original position. */
+  if (cxt->sline_index < 0)
+    {
+      if (cxt->last_found_line == cxt->save_line)
+       cxt->sline_index = cxt->save_point;
+      else
+       cxt->sline_index = strlen (rl_line_buffer);
+      rl_mark = cxt->save_mark;
+    }
+
+  rl_point = cxt->sline_index;
+  /* Don't worry about where to put the mark here; rl_get_previous_history
+     and rl_get_next_history take care of it. */
+
+  rl_clear_message ();
+}
+
+int
+_rl_search_getchar (cxt)
+     _rl_search_cxt *cxt;
+{
+  int c;
+
+  /* Read a key and decide how to proceed. */
+  RL_SETSTATE(RL_STATE_MOREINPUT);
+  c = cxt->lastc = rl_read_key ();
+  RL_UNSETSTATE(RL_STATE_MOREINPUT);
+
+#if defined (HANDLE_MULTIBYTE)
+  if (MB_CUR_MAX > 1 && rl_byte_oriented == 0)
+    c = cxt->lastc = _rl_read_mbstring (cxt->lastc, cxt->mb, MB_LEN_MAX);
+#endif
+
+  return c;
+}
+
+/* Process just-read character C according to isearch context CXT.  Return
+   -1 if the caller should just free the context and return, 0 if we should
+   break out of the loop, and 1 if we should continue to read characters. */
+int
+_rl_isearch_dispatch (cxt, c)
+     _rl_search_cxt *cxt;
+     int c;
+{
+  int n, wstart, wlen, limit, cval;
+  rl_command_func_t *f;
+
+  f = (rl_command_func_t *)NULL;
+ /* Translate the keys we do something with to opcodes. */
+  if (c >= 0 && _rl_keymap[c].type == ISFUNC)
+    {
+      f = _rl_keymap[c].function;
+
+      if (f == rl_reverse_search_history)
+       cxt->lastc = (cxt->sflags & SF_REVERSE) ? -1 : -2;
+      else if (f == rl_forward_search_history)
+       cxt->lastc = (cxt->sflags & SF_REVERSE) ? -2 : -1;
+      else if (f == rl_rubout)
+       cxt->lastc = -3;
+      else if (c == CTRL ('G'))
+       cxt->lastc = -4;
+      else if (c == CTRL ('W'))        /* XXX */
+       cxt->lastc = -5;
+      else if (c == CTRL ('Y'))        /* XXX */
+       cxt->lastc = -6;
+    }
+
+  /* The characters in isearch_terminators (set from the user-settable
+     variable isearch-terminators) are used to terminate the search but
+     not subsequently execute the character as a command.  The default
+     value is "\033\012" (ESC and C-J). */
+  if (strchr (cxt->search_terminators, cxt->lastc))
+    {
+      /* ESC still terminates the search, but if there is pending
+        input or if input arrives within 0.1 seconds (on systems
+        with select(2)) it is used as a prefix character
+        with rl_execute_next.  WATCH OUT FOR THIS!  This is intended
+        to allow the arrow keys to be used like ^F and ^B are used
+        to terminate the search and execute the movement command.
+        XXX - since _rl_input_available depends on the application-
+        settable keyboard timeout value, this could alternatively
+        use _rl_input_queued(100000) */
+      if (cxt->lastc == ESC && _rl_input_available ())
+       rl_execute_next (ESC);
+      return (0);
+    }
+
+#define ENDSRCH_CHAR(c) \
+  ((CTRL_CHAR (c) || META_CHAR (c) || (c) == RUBOUT) && ((c) != CTRL ('G')))
+
+#if defined (HANDLE_MULTIBYTE)
+  if (MB_CUR_MAX > 1 && rl_byte_oriented == 0)
+    {
+      if (cxt->lastc >= 0 && (cxt->mb[0] && cxt->mb[1] == '\0') && ENDSRCH_CHAR (cxt->lastc))
+       {
+         /* This sets rl_pending_input to c; it will be picked up the next
+            time rl_read_key is called. */
+         rl_execute_next (cxt->lastc);
+         return (0);
+       }
+    }
+  else
+#endif
+    if (cxt->lastc >= 0 && ENDSRCH_CHAR (cxt->lastc))
+      {
+       /* This sets rl_pending_input to LASTC; it will be picked up the next
+          time rl_read_key is called. */
+       rl_execute_next (cxt->lastc);
+       return (0);
+      }
+
+  /* Now dispatch on the character.  `Opcodes' affect the search string or
+     state.  Other characters are added to the string.  */
+  switch (cxt->lastc)
+    {
+    /* search again */
+    case -1:
+      if (cxt->search_string_index == 0)
+       {
+         if (last_isearch_string)
+           {
+             cxt->search_string_size = 64 + last_isearch_string_len;
+             cxt->search_string = (char *)xrealloc (cxt->search_string, cxt->search_string_size);
+             strcpy (cxt->search_string, last_isearch_string);
+             cxt->search_string_index = last_isearch_string_len;
+             rl_display_search (cxt->search_string, (cxt->sflags & SF_REVERSE), -1);
+             break;
+           }
+         return (1);
+       }
+      else if (cxt->sflags & SF_REVERSE)
+       cxt->sline_index--;
+      else if (cxt->sline_index != cxt->sline_len)
+       cxt->sline_index++;
+      else
+       rl_ding ();
+      break;
+
+    /* switch directions */
+    case -2:
+      cxt->direction = -cxt->direction;
+      if (cxt->direction < 0)
+       cxt->sflags |= SF_REVERSE;
+      else
+       cxt->sflags &= ~SF_REVERSE;
+      break;
+
+    /* delete character from search string. */
+    case -3:   /* C-H, DEL */
+      /* This is tricky.  To do this right, we need to keep a
+        stack of search positions for the current search, with
+        sentinels marking the beginning and end.  But this will
+        do until we have a real isearch-undo. */
+      if (cxt->search_string_index == 0)
+       rl_ding ();
+      else
+       cxt->search_string[--cxt->search_string_index] = '\0';
+      break;
+
+    case -4:   /* C-G, abort */
+      rl_replace_line (cxt->lines[cxt->save_line], 0);
+      rl_point = cxt->save_point;
+      rl_mark = cxt->save_mark;
+      rl_restore_prompt();
+      rl_clear_message ();
+
+      return -1;
+
+    case -5:   /* C-W */
+      /* skip over portion of line we already matched and yank word */
+      wstart = rl_point + cxt->search_string_index;
+      if (wstart >= rl_end)
+       {
+         rl_ding ();
+         break;
+       }
+
+      /* if not in a word, move to one. */
+      cval = _rl_char_value (rl_line_buffer, wstart);
+      if (_rl_walphabetic (cval) == 0)
+       {
+         rl_ding ();
+         break;
+       }
+      n = MB_NEXTCHAR (rl_line_buffer, wstart, 1, MB_FIND_NONZERO);;
+      while (n < rl_end)
+       {
+         cval = _rl_char_value (rl_line_buffer, n);
+         if (_rl_walphabetic (cval) == 0)
+           break;
+         n = MB_NEXTCHAR (rl_line_buffer, n, 1, MB_FIND_NONZERO);;
+       }
+      wlen = n - wstart + 1;
+      if (cxt->search_string_index + wlen + 1 >= cxt->search_string_size)
+       {
+         cxt->search_string_size += wlen + 1;
+         cxt->search_string = (char *)xrealloc (cxt->search_string, cxt->search_string_size);
+       }
+      for (; wstart < n; wstart++)
+       cxt->search_string[cxt->search_string_index++] = rl_line_buffer[wstart];
+      cxt->search_string[cxt->search_string_index] = '\0';
+      break;
+
+    case -6:   /* C-Y */
+      /* skip over portion of line we already matched and yank rest */
+      wstart = rl_point + cxt->search_string_index;
+      if (wstart >= rl_end)
+       {
+         rl_ding ();
+         break;
+       }
+      n = rl_end - wstart + 1;
+      if (cxt->search_string_index + n + 1 >= cxt->search_string_size)
+       {
+         cxt->search_string_size += n + 1;
+         cxt->search_string = (char *)xrealloc (cxt->search_string, cxt->search_string_size);
+       }
+      for (n = wstart; n < rl_end; n++)
+       cxt->search_string[cxt->search_string_index++] = rl_line_buffer[n];
+      cxt->search_string[cxt->search_string_index] = '\0';
+      break;
+
+    /* Add character to search string and continue search. */
+    default:
+      if (cxt->search_string_index + 2 >= cxt->search_string_size)
+       {
+         cxt->search_string_size += 128;
+         cxt->search_string = (char *)xrealloc (cxt->search_string, cxt->search_string_size);
+       }
+#if defined (HANDLE_MULTIBYTE)
+      if (MB_CUR_MAX > 1 && rl_byte_oriented == 0)
+       {
+         int j, l;
+         for (j = 0, l = strlen (cxt->mb); j < l; )
+           cxt->search_string[cxt->search_string_index++] = cxt->mb[j++];
+       }
+      else
+#endif
+       cxt->search_string[cxt->search_string_index++] = c;
+      cxt->search_string[cxt->search_string_index] = '\0';
+      break;
+    }
+
+  for (cxt->sflags &= ~(SF_FOUND|SF_FAILED);; )
+    {
+      limit = cxt->sline_len - cxt->search_string_index + 1;
+
+      /* Search the current line. */
+      while ((cxt->sflags & SF_REVERSE) ? (cxt->sline_index >= 0) : (cxt->sline_index < limit))
+       {
+         if (STREQN (cxt->search_string, cxt->sline + cxt->sline_index, cxt->search_string_index))
+           {
+             cxt->sflags |= SF_FOUND;
+             break;
+           }
+         else
+           cxt->sline_index += cxt->direction;
+       }
+      if (cxt->sflags & SF_FOUND)
+       break;
+
+      /* Move to the next line, but skip new copies of the line
+        we just found and lines shorter than the string we're
+        searching for. */
+      do
+       {
+         /* Move to the next line. */
+         cxt->history_pos += cxt->direction;
+
+         /* At limit for direction? */
+         if ((cxt->sflags & SF_REVERSE) ? (cxt->history_pos < 0) : (cxt->history_pos == cxt->hlen))
+           {
+             cxt->sflags |= SF_FAILED;
+             break;
+           }
+
+         /* We will need these later. */
+         cxt->sline = cxt->lines[cxt->history_pos];
+         cxt->sline_len = strlen (cxt->sline);
+       }
+      while ((cxt->prev_line_found && STREQ (cxt->prev_line_found, cxt->lines[cxt->history_pos])) ||
+            (cxt->search_string_index > cxt->sline_len));
+
+      if (cxt->sflags & SF_FAILED)
+       break;
+
+      /* Now set up the line for searching... */
+      cxt->sline_index = (cxt->sflags & SF_REVERSE) ? cxt->sline_len - cxt->search_string_index : 0;
+    }
+
+  if (cxt->sflags & SF_FAILED)
+    {
+      /* We cannot find the search string.  Ding the bell. */
+      rl_ding ();
+      cxt->history_pos = cxt->last_found_line;
+      return 1;
+    }
+
+  /* We have found the search string.  Just display it.  But don't
+     actually move there in the history list until the user accepts
+     the location. */
+  if (cxt->sflags & SF_FOUND)
+    {
+      cxt->prev_line_found = cxt->lines[cxt->history_pos];
+      rl_replace_line (cxt->lines[cxt->history_pos], 0);
+      rl_point = cxt->sline_index;
+      cxt->last_found_line = cxt->history_pos;
+      rl_display_search (cxt->search_string, (cxt->sflags & SF_REVERSE), (cxt->history_pos == cxt->save_line) ? -1 : cxt->history_pos);
+    }
+
+  return 1;
+}
+
+static int
+_rl_isearch_cleanup (cxt, r)
+     _rl_search_cxt *cxt;
+     int r;
+{
+  if (r >= 0)
+    _rl_isearch_fini (cxt);
+  _rl_scxt_dispose (cxt, 0);
+  _rl_iscxt = 0;
+
+  RL_UNSETSTATE(RL_STATE_ISEARCH);
+
+  return (r != 0);
+}
+
+/* Search through the history looking for an interactively typed string.
+   This is analogous to i-search.  We start the search in the current line.
+   DIRECTION is which direction to search; >= 0 means forward, < 0 means
+   backwards. */
+static int
+rl_search_history (direction, invoking_key)
+     int direction, invoking_key;
+{
+  _rl_search_cxt *cxt;         /* local for now, but saved globally */
+  int c, r;
+
+  RL_SETSTATE(RL_STATE_ISEARCH);
+  cxt = _rl_isearch_init (direction);
+
+  rl_display_search (cxt->search_string, (cxt->sflags & SF_REVERSE), -1);
+
+  /* If we are using the callback interface, all we do is set up here and
+      return.  The key is that we leave RL_STATE_ISEARCH set. */
+  if (RL_ISSTATE (RL_STATE_CALLBACK))
+    return (0);
+
+  r = -1;
+  for (;;)
+    {
+      c = _rl_search_getchar (cxt);
+      /* We might want to handle EOF here (c == 0) */
+      r = _rl_isearch_dispatch (cxt, cxt->lastc);
+      if (r <= 0)
+        break;
+    }
+
+  /* The searching is over.  The user may have found the string that she
+     was looking for, or else she may have exited a failing search.  If
+     LINE_INDEX is -1, then that shows that the string searched for was
+     not found.  We use this to determine where to place rl_point. */
+  return (_rl_isearch_cleanup (cxt, r));
+}
+
+#if defined (READLINE_CALLBACKS)
+/* Called from the callback functions when we are ready to read a key.  The
+   callback functions know to call this because RL_ISSTATE(RL_STATE_ISEARCH).
+   If _rl_isearch_dispatch finishes searching, this function is responsible
+   for turning off RL_STATE_ISEARCH, which it does using _rl_isearch_cleanup. */
+int
+_rl_isearch_callback (cxt)
+     _rl_search_cxt *cxt;
+{
+  int c, r;
+
+  c = _rl_search_getchar (cxt);
+  /* We might want to handle EOF here */
+  r = _rl_isearch_dispatch (cxt, cxt->lastc);
+
+  return (r <= 0) ? _rl_isearch_cleanup (cxt, r) : 0;
+}
+#endif
diff --git a/keymaps.c b/keymaps.c
new file mode 100644 (file)
index 0000000..70d0cc0
--- /dev/null
+++ b/keymaps.c
@@ -0,0 +1,149 @@
+/* keymaps.c -- Functions and keymaps for the GNU Readline library. */
+
+/* Copyright (C) 1988,1989 Free Software Foundation, Inc.
+
+   This file is part of GNU Readline, a library for reading lines
+   of text with interactive input and history editing.
+
+   Readline 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.
+
+   Readline 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 Readline; see the file COPYING.  If not, write to the Free
+   Software Foundation, 59 Temple Place, Suite 330, Boston, MA 02111 USA. */
+#define READLINE_LIBRARY
+
+#if defined (HAVE_CONFIG_H)
+#  include <config.h>
+#endif
+
+#if defined (HAVE_STDLIB_H)
+#  include <stdlib.h>
+#else
+#  include "ansi_stdlib.h"
+#endif /* HAVE_STDLIB_H */
+
+#include <stdio.h>     /* for FILE * definition for readline.h */
+
+#include "readline.h"
+#include "rlconf.h"
+
+#include "emacs_keymap.c"
+
+#if defined (VI_MODE)
+#include "vi_keymap.c"
+#endif
+
+#include "xmalloc.h"
+
+/* **************************************************************** */
+/*                                                                 */
+/*                   Functions for manipulating Keymaps.           */
+/*                                                                 */
+/* **************************************************************** */
+
+
+/* Return a new, empty keymap.
+   Free it with free() when you are done. */
+Keymap
+rl_make_bare_keymap ()
+{
+  register int i;
+  Keymap keymap = (Keymap)xmalloc (KEYMAP_SIZE * sizeof (KEYMAP_ENTRY));
+
+  for (i = 0; i < KEYMAP_SIZE; i++)
+    {
+      keymap[i].type = ISFUNC;
+      keymap[i].function = (rl_command_func_t *)NULL;
+    }
+
+#if 0
+  for (i = 'A'; i < ('Z' + 1); i++)
+    {
+      keymap[i].type = ISFUNC;
+      keymap[i].function = rl_do_lowercase_version;
+    }
+#endif
+
+  return (keymap);
+}
+
+/* Return a new keymap which is a copy of MAP. */
+Keymap
+rl_copy_keymap (map)
+     Keymap map;
+{
+  register int i;
+  Keymap temp;
+
+  temp = rl_make_bare_keymap ();
+  for (i = 0; i < KEYMAP_SIZE; i++)
+    {
+      temp[i].type = map[i].type;
+      temp[i].function = map[i].function;
+    }
+  return (temp);
+}
+
+/* Return a new keymap with the printing characters bound to rl_insert,
+   the uppercase Meta characters bound to run their lowercase equivalents,
+   and the Meta digits bound to produce numeric arguments. */
+Keymap
+rl_make_keymap ()
+{
+  register int i;
+  Keymap newmap;
+
+  newmap = rl_make_bare_keymap ();
+
+  /* All ASCII printing characters are self-inserting. */
+  for (i = ' '; i < 127; i++)
+    newmap[i].function = rl_insert;
+
+  newmap[TAB].function = rl_insert;
+  newmap[RUBOUT].function = rl_rubout; /* RUBOUT == 127 */
+  newmap[CTRL('H')].function = rl_rubout;
+
+#if KEYMAP_SIZE > 128
+  /* Printing characters in ISO Latin-1 and some 8-bit character sets. */
+  for (i = 128; i < 256; i++)
+    newmap[i].function = rl_insert;
+#endif /* KEYMAP_SIZE > 128 */
+
+  return (newmap);
+}
+
+/* Free the storage associated with MAP. */
+void
+rl_discard_keymap (map)
+     Keymap map;
+{
+  int i;
+
+  if (!map)
+    return;
+
+  for (i = 0; i < KEYMAP_SIZE; i++)
+    {
+      switch (map[i].type)
+       {
+       case ISFUNC:
+         break;
+
+       case ISKMAP:
+         rl_discard_keymap ((Keymap)map[i].function);
+         break;
+
+       case ISMACR:
+         free ((char *)map[i].function);
+         break;
+       }
+    }
+}
diff --git a/keymaps.h b/keymaps.h
new file mode 100644 (file)
index 0000000..66fa2a5
--- /dev/null
+++ b/keymaps.h
@@ -0,0 +1,103 @@
+/* keymaps.h -- Manipulation of readline keymaps. */
+
+/* Copyright (C) 1987, 1989, 1992 Free Software Foundation, Inc.
+
+   This file is part of the GNU Readline Library, a library for
+   reading lines of text with interactive input and history editing.
+
+   The GNU Readline Library 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.
+
+   The GNU Readline Library is distributed in the hope that it will be
+   useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+   of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   The GNU General Public License is often shipped with GNU software, and
+   is generally kept in a file called COPYING or LICENSE.  If you do not
+   have a copy of the license, write to the Free Software Foundation,
+   59 Temple Place, Suite 330, Boston, MA 02111 USA. */
+
+#ifndef _KEYMAPS_H_
+#define _KEYMAPS_H_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#if defined (READLINE_LIBRARY)
+#  include "rlstdc.h"
+#  include "chardefs.h"
+#  include "rltypedefs.h"
+#else
+#  include <readline/rlstdc.h>
+#  include <readline/chardefs.h>
+#  include <readline/rltypedefs.h>
+#endif
+
+/* A keymap contains one entry for each key in the ASCII set.
+   Each entry consists of a type and a pointer.
+   FUNCTION is the address of a function to run, or the
+   address of a keymap to indirect through.
+   TYPE says which kind of thing FUNCTION is. */
+typedef struct _keymap_entry {
+  char type;
+  rl_command_func_t *function;
+} KEYMAP_ENTRY;
+
+/* This must be large enough to hold bindings for all of the characters
+   in a desired character set (e.g, 128 for ASCII, 256 for ISO Latin-x,
+   and so on) plus one for subsequence matching. */
+#define KEYMAP_SIZE 257
+#define ANYOTHERKEY KEYMAP_SIZE-1
+
+/* I wanted to make the above structure contain a union of:
+   union { rl_command_func_t *function; struct _keymap_entry *keymap; } value;
+   but this made it impossible for me to create a static array.
+   Maybe I need C lessons. */
+
+typedef KEYMAP_ENTRY KEYMAP_ENTRY_ARRAY[KEYMAP_SIZE];
+typedef KEYMAP_ENTRY *Keymap;
+
+/* The values that TYPE can have in a keymap entry. */
+#define ISFUNC 0
+#define ISKMAP 1
+#define ISMACR 2
+
+extern KEYMAP_ENTRY_ARRAY emacs_standard_keymap, emacs_meta_keymap, emacs_ctlx_keymap;
+extern KEYMAP_ENTRY_ARRAY vi_insertion_keymap, vi_movement_keymap;
+
+/* Return a new, empty keymap.
+   Free it with free() when you are done. */
+extern Keymap rl_make_bare_keymap PARAMS((void));
+
+/* Return a new keymap which is a copy of MAP. */
+extern Keymap rl_copy_keymap PARAMS((Keymap));
+
+/* Return a new keymap with the printing characters bound to rl_insert,
+   the lowercase Meta characters bound to run their equivalents, and
+   the Meta digits bound to produce numeric arguments. */
+extern Keymap rl_make_keymap PARAMS((void));
+
+/* Free the storage associated with a keymap. */
+extern void rl_discard_keymap PARAMS((Keymap));
+
+/* These functions actually appear in bind.c */
+
+/* Return the keymap corresponding to a given name.  Names look like
+   `emacs' or `emacs-meta' or `vi-insert'.  */
+extern Keymap rl_get_keymap_by_name PARAMS((const char *));
+
+/* Return the current keymap. */
+extern Keymap rl_get_keymap PARAMS((void));
+
+/* Set the current keymap to MAP. */
+extern void rl_set_keymap PARAMS((Keymap));
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _KEYMAPS_H_ */
diff --git a/kill.c b/kill.c
new file mode 100644 (file)
index 0000000..031ddf4
--- /dev/null
+++ b/kill.c
@@ -0,0 +1,694 @@
+/* kill.c -- kill ring management. */
+
+/* Copyright (C) 1994 Free Software Foundation, Inc.
+
+   This file is part of the GNU Readline Library, a library for
+   reading lines of text with interactive input and history editing.
+
+   The GNU Readline Library 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.
+
+   The GNU Readline Library is distributed in the hope that it will be
+   useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+   of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   The GNU General Public License is often shipped with GNU software, and
+   is generally kept in a file called COPYING or LICENSE.  If you do not
+   have a copy of the license, write to the Free Software Foundation,
+   59 Temple Place, Suite 330, Boston, MA 02111 USA. */
+#define READLINE_LIBRARY
+
+#if defined (HAVE_CONFIG_H)
+#  include <config.h>
+#endif
+
+#include <sys/types.h>
+
+#if defined (HAVE_UNISTD_H)
+#  include <unistd.h>           /* for _POSIX_VERSION */
+#endif /* HAVE_UNISTD_H */
+
+#if defined (HAVE_STDLIB_H)
+#  include <stdlib.h>
+#else
+#  include "ansi_stdlib.h"
+#endif /* HAVE_STDLIB_H */
+
+#include <stdio.h>
+
+/* System-specific feature definitions and include files. */
+#include "rldefs.h"
+
+/* Some standard library routines. */
+#include "readline.h"
+#include "history.h"
+
+#include "rlprivate.h"
+#include "xmalloc.h"
+
+/* **************************************************************** */
+/*                                                                 */
+/*                     Killing Mechanism                           */
+/*                                                                 */
+/* **************************************************************** */
+
+/* What we assume for a max number of kills. */
+#define DEFAULT_MAX_KILLS 10
+
+/* The real variable to look at to find out when to flush kills. */
+static int rl_max_kills =  DEFAULT_MAX_KILLS;
+
+/* Where to store killed text. */
+static char **rl_kill_ring = (char **)NULL;
+
+/* Where we are in the kill ring. */
+static int rl_kill_index;
+
+/* How many slots we have in the kill ring. */
+static int rl_kill_ring_length;
+
+static int _rl_copy_to_kill_ring PARAMS((char *, int));
+static int region_kill_internal PARAMS((int));
+static int _rl_copy_word_as_kill PARAMS((int, int));
+static int rl_yank_nth_arg_internal PARAMS((int, int, int));
+
+/* How to say that you only want to save a certain amount
+   of kill material. */
+int
+rl_set_retained_kills (num)
+     int num;
+{
+  return 0;
+}
+
+/* Add TEXT to the kill ring, allocating a new kill ring slot as necessary.
+   This uses TEXT directly, so the caller must not free it.  If APPEND is
+   non-zero, and the last command was a kill, the text is appended to the
+   current kill ring slot, otherwise prepended. */
+static int
+_rl_copy_to_kill_ring (text, append)
+     char *text;
+     int append;
+{
+  char *old, *new;
+  int slot;
+
+  /* First, find the slot to work with. */
+  if (_rl_last_command_was_kill == 0)
+    {
+      /* Get a new slot.  */
+      if (rl_kill_ring == 0)
+       {
+         /* If we don't have any defined, then make one. */
+         rl_kill_ring = (char **)
+           xmalloc (((rl_kill_ring_length = 1) + 1) * sizeof (char *));
+         rl_kill_ring[slot = 0] = (char *)NULL;
+       }
+      else
+       {
+         /* We have to add a new slot on the end, unless we have
+            exceeded the max limit for remembering kills. */
+         slot = rl_kill_ring_length;
+         if (slot == rl_max_kills)
+           {
+             register int i;
+             free (rl_kill_ring[0]);
+             for (i = 0; i < slot; i++)
+               rl_kill_ring[i] = rl_kill_ring[i + 1];
+           }
+         else
+           {
+             slot = rl_kill_ring_length += 1;
+             rl_kill_ring = (char **)xrealloc (rl_kill_ring, slot * sizeof (char *));
+           }
+         rl_kill_ring[--slot] = (char *)NULL;
+       }
+    }
+  else
+    slot = rl_kill_ring_length - 1;
+
+  /* If the last command was a kill, prepend or append. */
+  if (_rl_last_command_was_kill && rl_editing_mode != vi_mode)
+    {
+      old = rl_kill_ring[slot];
+      new = (char *)xmalloc (1 + strlen (old) + strlen (text));
+
+      if (append)
+       {
+         strcpy (new, old);
+         strcat (new, text);
+       }
+      else
+       {
+         strcpy (new, text);
+         strcat (new, old);
+       }
+      free (old);
+      free (text);
+      rl_kill_ring[slot] = new;
+    }
+  else
+    rl_kill_ring[slot] = text;
+
+  rl_kill_index = slot;
+  return 0;
+}
+
+/* The way to kill something.  This appends or prepends to the last
+   kill, if the last command was a kill command.  if FROM is less
+   than TO, then the text is appended, otherwise prepended.  If the
+   last command was not a kill command, then a new slot is made for
+   this kill. */
+int
+rl_kill_text (from, to)
+     int from, to;
+{
+  char *text;
+
+  /* Is there anything to kill? */
+  if (from == to)
+    {
+      _rl_last_command_was_kill++;
+      return 0;
+    }
+
+  text = rl_copy_text (from, to);
+
+  /* Delete the copied text from the line. */
+  rl_delete_text (from, to);
+
+  _rl_copy_to_kill_ring (text, from < to);
+
+  _rl_last_command_was_kill++;
+  return 0;
+}
+
+/* Now REMEMBER!  In order to do prepending or appending correctly, kill
+   commands always make rl_point's original position be the FROM argument,
+   and rl_point's extent be the TO argument. */
+
+/* **************************************************************** */
+/*                                                                 */
+/*                     Killing Commands                            */
+/*                                                                 */
+/* **************************************************************** */
+
+/* Delete the word at point, saving the text in the kill ring. */
+int
+rl_kill_word (count, key)
+     int count, key;
+{
+  int orig_point;
+
+  if (count < 0)
+    return (rl_backward_kill_word (-count, key));
+  else
+    {
+      orig_point = rl_point;
+      rl_forward_word (count, key);
+
+      if (rl_point != orig_point)
+       rl_kill_text (orig_point, rl_point);
+
+      rl_point = orig_point;
+      if (rl_editing_mode == emacs_mode)
+       rl_mark = rl_point;
+    }
+  return 0;
+}
+
+/* Rubout the word before point, placing it on the kill ring. */
+int
+rl_backward_kill_word (count, ignore)
+     int count, ignore;
+{
+  int orig_point;
+
+  if (count < 0)
+    return (rl_kill_word (-count, ignore));
+  else
+    {
+      orig_point = rl_point;
+      rl_backward_word (count, ignore);
+
+      if (rl_point != orig_point)
+       rl_kill_text (orig_point, rl_point);
+
+      if (rl_editing_mode == emacs_mode)
+       rl_mark = rl_point;
+    }
+  return 0;
+}
+
+/* Kill from here to the end of the line.  If DIRECTION is negative, kill
+   back to the line start instead. */
+int
+rl_kill_line (direction, ignore)
+     int direction, ignore;
+{
+  int orig_point;
+
+  if (direction < 0)
+    return (rl_backward_kill_line (1, ignore));
+  else
+    {
+      orig_point = rl_point;
+      rl_end_of_line (1, ignore);
+      if (orig_point != rl_point)
+       rl_kill_text (orig_point, rl_point);
+      rl_point = orig_point;
+      if (rl_editing_mode == emacs_mode)
+       rl_mark = rl_point;
+    }
+  return 0;
+}
+
+/* Kill backwards to the start of the line.  If DIRECTION is negative, kill
+   forwards to the line end instead. */
+int
+rl_backward_kill_line (direction, ignore)
+     int direction, ignore;
+{
+  int orig_point;
+
+  if (direction < 0)
+    return (rl_kill_line (1, ignore));
+  else
+    {
+      if (!rl_point)
+       rl_ding ();
+      else
+       {
+         orig_point = rl_point;
+         rl_beg_of_line (1, ignore);
+         if (rl_point != orig_point)
+           rl_kill_text (orig_point, rl_point);
+         if (rl_editing_mode == emacs_mode)
+           rl_mark = rl_point;
+       }
+    }
+  return 0;
+}
+
+/* Kill the whole line, no matter where point is. */
+int
+rl_kill_full_line (count, ignore)
+     int count, ignore;
+{
+  rl_begin_undo_group ();
+  rl_point = 0;
+  rl_kill_text (rl_point, rl_end);
+  rl_mark = 0;
+  rl_end_undo_group ();
+  return 0;
+}
+
+/* The next two functions mimic unix line editing behaviour, except they
+   save the deleted text on the kill ring.  This is safer than not saving
+   it, and since we have a ring, nobody should get screwed. */
+
+/* This does what C-w does in Unix.  We can't prevent people from
+   using behaviour that they expect. */
+int
+rl_unix_word_rubout (count, key)
+     int count, key;
+{
+  int orig_point;
+
+  if (rl_point == 0)
+    rl_ding ();
+  else
+    {
+      orig_point = rl_point;
+      if (count <= 0)
+       count = 1;
+
+      while (count--)
+       {
+         while (rl_point && whitespace (rl_line_buffer[rl_point - 1]))
+           rl_point--;
+
+         while (rl_point && (whitespace (rl_line_buffer[rl_point - 1]) == 0))
+           rl_point--;
+       }
+
+      rl_kill_text (orig_point, rl_point);
+      if (rl_editing_mode == emacs_mode)
+       rl_mark = rl_point;
+    }
+
+  return 0;
+}
+
+/* This deletes one filename component in a Unix pathname.  That is, it
+   deletes backward to directory separator (`/') or whitespace.  */
+int
+rl_unix_filename_rubout (count, key)
+     int count, key;
+{
+  int orig_point, c;
+
+  if (rl_point == 0)
+    rl_ding ();
+  else
+    {
+      orig_point = rl_point;
+      if (count <= 0)
+       count = 1;
+
+      while (count--)
+       {
+         c = rl_line_buffer[rl_point - 1];
+         while (rl_point && (whitespace (c) || c == '/'))
+           {
+             rl_point--;
+             c = rl_line_buffer[rl_point - 1];
+           }
+
+         while (rl_point && (whitespace (c) == 0) && c != '/')
+           {
+             rl_point--;
+             c = rl_line_buffer[rl_point - 1];
+           }
+       }
+
+      rl_kill_text (orig_point, rl_point);
+      if (rl_editing_mode == emacs_mode)
+       rl_mark = rl_point;
+    }
+
+  return 0;
+}
+
+/* Here is C-u doing what Unix does.  You don't *have* to use these
+   key-bindings.  We have a choice of killing the entire line, or
+   killing from where we are to the start of the line.  We choose the
+   latter, because if you are a Unix weenie, then you haven't backspaced
+   into the line at all, and if you aren't, then you know what you are
+   doing. */
+int
+rl_unix_line_discard (count, key)
+     int count, key;
+{
+  if (rl_point == 0)
+    rl_ding ();
+  else
+    {
+      rl_kill_text (rl_point, 0);
+      rl_point = 0;
+      if (rl_editing_mode == emacs_mode)
+       rl_mark = rl_point;
+    }
+  return 0;
+}
+
+/* Copy the text in the `region' to the kill ring.  If DELETE is non-zero,
+   delete the text from the line as well. */
+static int
+region_kill_internal (delete)
+     int delete;
+{
+  char *text;
+
+  if (rl_mark != rl_point)
+    {
+      text = rl_copy_text (rl_point, rl_mark);
+      if (delete)
+       rl_delete_text (rl_point, rl_mark);
+      _rl_copy_to_kill_ring (text, rl_point < rl_mark);
+    }
+
+  _rl_last_command_was_kill++;
+  return 0;
+}
+
+/* Copy the text in the region to the kill ring. */
+int
+rl_copy_region_to_kill (count, ignore)
+     int count, ignore;
+{
+  return (region_kill_internal (0));
+}
+
+/* Kill the text between the point and mark. */
+int
+rl_kill_region (count, ignore)
+     int count, ignore;
+{
+  int r, npoint;
+
+  npoint = (rl_point < rl_mark) ? rl_point : rl_mark;
+  r = region_kill_internal (1);
+  _rl_fix_point (1);
+  rl_point = npoint;
+  return r;
+}
+
+/* Copy COUNT words to the kill ring.  DIR says which direction we look
+   to find the words. */
+static int
+_rl_copy_word_as_kill (count, dir)
+     int count, dir;
+{
+  int om, op, r;
+
+  om = rl_mark;
+  op = rl_point;
+
+  if (dir > 0)
+    rl_forward_word (count, 0);
+  else
+    rl_backward_word (count, 0);
+
+  rl_mark = rl_point;
+
+  if (dir > 0)
+    rl_backward_word (count, 0);
+  else
+    rl_forward_word (count, 0);
+
+  r = region_kill_internal (0);
+
+  rl_mark = om;
+  rl_point = op;
+
+  return r;
+}
+
+int
+rl_copy_forward_word (count, key)
+     int count, key;
+{
+  if (count < 0)
+    return (rl_copy_backward_word (-count, key));
+
+  return (_rl_copy_word_as_kill (count, 1));
+}
+
+int
+rl_copy_backward_word (count, key)
+     int count, key;
+{
+  if (count < 0)
+    return (rl_copy_forward_word (-count, key));
+
+  return (_rl_copy_word_as_kill (count, -1));
+}
+  
+/* Yank back the last killed text.  This ignores arguments. */
+int
+rl_yank (count, ignore)
+     int count, ignore;
+{
+  if (rl_kill_ring == 0)
+    {
+      _rl_abort_internal ();
+      return -1;
+    }
+
+  _rl_set_mark_at_pos (rl_point);
+  rl_insert_text (rl_kill_ring[rl_kill_index]);
+  return 0;
+}
+
+/* If the last command was yank, or yank_pop, and the text just
+   before point is identical to the current kill item, then
+   delete that text from the line, rotate the index down, and
+   yank back some other text. */
+int
+rl_yank_pop (count, key)
+     int count, key;
+{
+  int l, n;
+
+  if (((rl_last_func != rl_yank_pop) && (rl_last_func != rl_yank)) ||
+      !rl_kill_ring)
+    {
+      _rl_abort_internal ();
+      return -1;
+    }
+
+  l = strlen (rl_kill_ring[rl_kill_index]);
+  n = rl_point - l;
+  if (n >= 0 && STREQN (rl_line_buffer + n, rl_kill_ring[rl_kill_index], l))
+    {
+      rl_delete_text (n, rl_point);
+      rl_point = n;
+      rl_kill_index--;
+      if (rl_kill_index < 0)
+       rl_kill_index = rl_kill_ring_length - 1;
+      rl_yank (1, 0);
+      return 0;
+    }
+  else
+    {
+      _rl_abort_internal ();
+      return -1;
+    }
+}
+
+/* Yank the COUNTh argument from the previous history line, skipping
+   HISTORY_SKIP lines before looking for the `previous line'. */
+static int
+rl_yank_nth_arg_internal (count, ignore, history_skip)
+     int count, ignore, history_skip;
+{
+  register HIST_ENTRY *entry;
+  char *arg;
+  int i, pos;
+
+  pos = where_history ();
+
+  if (history_skip)
+    {
+      for (i = 0; i < history_skip; i++)
+       entry = previous_history ();
+    }
+
+  entry = previous_history ();
+
+  history_set_pos (pos);
+
+  if (entry == 0)
+    {
+      rl_ding ();
+      return -1;
+    }
+
+  arg = history_arg_extract (count, count, entry->line);
+  if (!arg || !*arg)
+    {
+      rl_ding ();
+      FREE (arg);
+      return -1;
+    }
+
+  rl_begin_undo_group ();
+
+  _rl_set_mark_at_pos (rl_point);
+
+#if defined (VI_MODE)
+  /* Vi mode always inserts a space before yanking the argument, and it
+     inserts it right *after* rl_point. */
+  if (rl_editing_mode == vi_mode)
+    {
+      rl_vi_append_mode (1, ignore);
+      rl_insert_text (" ");
+    }
+#endif /* VI_MODE */
+
+  rl_insert_text (arg);
+  free (arg);
+
+  rl_end_undo_group ();
+  return 0;
+}
+
+/* Yank the COUNTth argument from the previous history line. */
+int
+rl_yank_nth_arg (count, ignore)
+     int count, ignore;
+{
+  return (rl_yank_nth_arg_internal (count, ignore, 0));
+}
+
+/* Yank the last argument from the previous history line.  This `knows'
+   how rl_yank_nth_arg treats a count of `$'.  With an argument, this
+   behaves the same as rl_yank_nth_arg. */
+int
+rl_yank_last_arg (count, key)
+     int count, key;
+{
+  static int history_skip = 0;
+  static int explicit_arg_p = 0;
+  static int count_passed = 1;
+  static int direction = 1;
+  static int undo_needed = 0;
+  int retval;
+
+  if (rl_last_func != rl_yank_last_arg)
+    {
+      history_skip = 0;
+      explicit_arg_p = rl_explicit_arg;
+      count_passed = count;
+      direction = 1;
+    }
+  else
+    {
+      if (undo_needed)
+       rl_do_undo ();
+      if (count < 1)
+        direction = -direction;
+      history_skip += direction;
+      if (history_skip < 0)
+       history_skip = 0;
+    }
+  if (explicit_arg_p)
+    retval = rl_yank_nth_arg_internal (count_passed, key, history_skip);
+  else
+    retval = rl_yank_nth_arg_internal ('$', key, history_skip);
+
+  undo_needed = retval == 0;
+  return retval;
+}
+
+/* A special paste command for users of Cygnus's cygwin32. */
+#if defined (__CYGWIN__)
+#include <windows.h>
+
+int
+rl_paste_from_clipboard (count, key)
+     int count, key;
+{
+  char *data, *ptr;
+  int len;
+
+  if (OpenClipboard (NULL) == 0)
+    return (0);
+
+  data = (char *)GetClipboardData (CF_TEXT);
+  if (data)
+    {
+      ptr = strchr (data, '\r');
+      if (ptr)
+       {
+         len = ptr - data;
+         ptr = (char *)xmalloc (len + 1);
+         ptr[len] = '\0';
+         strncpy (ptr, data, len);
+       }
+      else
+        ptr = data;
+      _rl_set_mark_at_pos (rl_point);
+      rl_insert_text (ptr);
+      if (ptr != data)
+       free (ptr);
+      CloseClipboard ();
+    }
+  return (0);
+}
+#endif /* __CYGWIN__ */
diff --git a/macro.c b/macro.c
new file mode 100644 (file)
index 0000000..00cd58d
--- /dev/null
+++ b/macro.c
@@ -0,0 +1,271 @@
+/* macro.c -- keyboard macros for readline. */
+
+/* Copyright (C) 1994 Free Software Foundation, Inc.
+
+   This file is part of the GNU Readline Library, a library for
+   reading lines of text with interactive input and history editing.
+
+   The GNU Readline Library 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.
+
+   The GNU Readline Library is distributed in the hope that it will be
+   useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+   of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   The GNU General Public License is often shipped with GNU software, and
+   is generally kept in a file called COPYING or LICENSE.  If you do not
+   have a copy of the license, write to the Free Software Foundation,
+   59 Temple Place, Suite 330, Boston, MA 02111 USA. */
+#define READLINE_LIBRARY
+
+#if defined (HAVE_CONFIG_H)
+#  include <config.h>
+#endif
+
+#include <sys/types.h>
+
+#if defined (HAVE_UNISTD_H)
+#  include <unistd.h>           /* for _POSIX_VERSION */
+#endif /* HAVE_UNISTD_H */
+
+#if defined (HAVE_STDLIB_H)
+#  include <stdlib.h>
+#else
+#  include "ansi_stdlib.h"
+#endif /* HAVE_STDLIB_H */
+
+#include <stdio.h>
+
+/* System-specific feature definitions and include files. */
+#include "rldefs.h"
+
+/* Some standard library routines. */
+#include "readline.h"
+#include "history.h"
+
+#include "rlprivate.h"
+#include "xmalloc.h"
+
+/* **************************************************************** */
+/*                                                                 */
+/*                     Hacking Keyboard Macros                     */
+/*                                                                 */
+/* **************************************************************** */
+
+/* The currently executing macro string.  If this is non-zero,
+   then it is a malloc ()'ed string where input is coming from. */
+char *rl_executing_macro = (char *)NULL;
+
+/* The offset in the above string to the next character to be read. */
+static int executing_macro_index;
+
+/* The current macro string being built.  Characters get stuffed
+   in here by add_macro_char (). */
+static char *current_macro = (char *)NULL;
+
+/* The size of the buffer allocated to current_macro. */
+static int current_macro_size;
+
+/* The index at which characters are being added to current_macro. */
+static int current_macro_index;
+
+/* A structure used to save nested macro strings.
+   It is a linked list of string/index for each saved macro. */
+struct saved_macro {
+  struct saved_macro *next;
+  char *string;
+  int sindex;
+};
+
+/* The list of saved macros. */
+static struct saved_macro *macro_list = (struct saved_macro *)NULL;
+
+/* Set up to read subsequent input from STRING.
+   STRING is free ()'ed when we are done with it. */
+void
+_rl_with_macro_input (string)
+     char *string;
+{
+  _rl_push_executing_macro ();
+  rl_executing_macro = string;
+  executing_macro_index = 0;
+  RL_SETSTATE(RL_STATE_MACROINPUT);
+}
+
+/* Return the next character available from a macro, or 0 if
+   there are no macro characters. */
+int
+_rl_next_macro_key ()
+{
+  int c;
+
+  if (rl_executing_macro == 0)
+    return (0);
+
+  if (rl_executing_macro[executing_macro_index] == 0)
+    {
+      _rl_pop_executing_macro ();
+      return (_rl_next_macro_key ());
+    }
+
+#if defined (READLINE_CALLBACKS)
+  c = rl_executing_macro[executing_macro_index++];
+  if (RL_ISSTATE (RL_STATE_CALLBACK) && RL_ISSTATE (RL_STATE_READCMD|RL_STATE_MOREINPUT) && rl_executing_macro[executing_macro_index] == 0)
+      _rl_pop_executing_macro ();
+  return c;
+#else
+  return (rl_executing_macro[executing_macro_index++]);
+#endif
+}
+
+/* Save the currently executing macro on a stack of saved macros. */
+void
+_rl_push_executing_macro ()
+{
+  struct saved_macro *saver;
+
+  saver = (struct saved_macro *)xmalloc (sizeof (struct saved_macro));
+  saver->next = macro_list;
+  saver->sindex = executing_macro_index;
+  saver->string = rl_executing_macro;
+
+  macro_list = saver;
+}
+
+/* Discard the current macro, replacing it with the one
+   on the top of the stack of saved macros. */
+void
+_rl_pop_executing_macro ()
+{
+  struct saved_macro *macro;
+
+  FREE (rl_executing_macro);
+  rl_executing_macro = (char *)NULL;
+  executing_macro_index = 0;
+
+  if (macro_list)
+    {
+      macro = macro_list;
+      rl_executing_macro = macro_list->string;
+      executing_macro_index = macro_list->sindex;
+      macro_list = macro_list->next;
+      free (macro);
+    }
+
+  if (rl_executing_macro == 0)
+    RL_UNSETSTATE(RL_STATE_MACROINPUT);
+}
+
+/* Add a character to the macro being built. */
+void
+_rl_add_macro_char (c)
+     int c;
+{
+  if (current_macro_index + 1 >= current_macro_size)
+    {
+      if (current_macro == 0)
+       current_macro = (char *)xmalloc (current_macro_size = 25);
+      else
+       current_macro = (char *)xrealloc (current_macro, current_macro_size += 25);
+    }
+
+  current_macro[current_macro_index++] = c;
+  current_macro[current_macro_index] = '\0';
+}
+
+void
+_rl_kill_kbd_macro ()
+{
+  if (current_macro)
+    {
+      free (current_macro);
+      current_macro = (char *) NULL;
+    }
+  current_macro_size = current_macro_index = 0;
+
+  FREE (rl_executing_macro);
+  rl_executing_macro = (char *) NULL;
+  executing_macro_index = 0;
+
+  RL_UNSETSTATE(RL_STATE_MACRODEF);
+}
+
+/* Begin defining a keyboard macro.
+   Keystrokes are recorded as they are executed.
+   End the definition with rl_end_kbd_macro ().
+   If a numeric argument was explicitly typed, then append this
+   definition to the end of the existing macro, and start by
+   re-executing the existing macro. */
+int
+rl_start_kbd_macro (ignore1, ignore2)
+     int ignore1, ignore2;
+{
+  if (RL_ISSTATE (RL_STATE_MACRODEF))
+    {
+      _rl_abort_internal ();
+      return -1;
+    }
+
+  if (rl_explicit_arg)
+    {
+      if (current_macro)
+       _rl_with_macro_input (savestring (current_macro));
+    }
+  else
+    current_macro_index = 0;
+
+  RL_SETSTATE(RL_STATE_MACRODEF);
+  return 0;
+}
+
+/* Stop defining a keyboard macro.
+   A numeric argument says to execute the macro right now,
+   that many times, counting the definition as the first time. */
+int
+rl_end_kbd_macro (count, ignore)
+     int count, ignore;
+{
+  if (RL_ISSTATE (RL_STATE_MACRODEF) == 0)
+    {
+      _rl_abort_internal ();
+      return -1;
+    }
+
+  current_macro_index -= rl_key_sequence_length - 1;
+  current_macro[current_macro_index] = '\0';
+
+  RL_UNSETSTATE(RL_STATE_MACRODEF);
+
+  return (rl_call_last_kbd_macro (--count, 0));
+}
+
+/* Execute the most recently defined keyboard macro.
+   COUNT says how many times to execute it. */
+int
+rl_call_last_kbd_macro (count, ignore)
+     int count, ignore;
+{
+  if (current_macro == 0)
+    _rl_abort_internal ();
+
+  if (RL_ISSTATE (RL_STATE_MACRODEF))
+    {
+      rl_ding ();              /* no recursive macros */
+      current_macro[--current_macro_index] = '\0';     /* erase this char */
+      return 0;
+    }
+
+  while (count--)
+    _rl_with_macro_input (savestring (current_macro));
+  return 0;
+}
+
+void
+rl_push_macro_input (macro)
+     char *macro;
+{
+  _rl_with_macro_input (macro);
+}
diff --git a/mbutil.c b/mbutil.c
new file mode 100644 (file)
index 0000000..17dde53
--- /dev/null
+++ b/mbutil.c
@@ -0,0 +1,373 @@
+/* mbutil.c -- readline multibyte character utility functions */
+
+/* Copyright (C) 2001-2005 Free Software Foundation, Inc.
+
+   This file is part of the GNU Readline Library, a library for
+   reading lines of text with interactive input and history editing.
+
+   The GNU Readline Library 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.
+
+   The GNU Readline Library is distributed in the hope that it will be
+   useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+   of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   The GNU General Public License is often shipped with GNU software, and
+   is generally kept in a file called COPYING or LICENSE.  If you do not
+   have a copy of the license, write to the Free Software Foundation,
+   59 Temple Place, Suite 330, Boston, MA 02111 USA. */
+#define READLINE_LIBRARY
+
+#if defined (HAVE_CONFIG_H)
+#  include <config.h>
+#endif
+
+#include <sys/types.h>
+#include <fcntl.h>
+#include "posixjmp.h"
+
+#if defined (HAVE_UNISTD_H)
+#  include <unistd.h>     /* for _POSIX_VERSION */
+#endif /* HAVE_UNISTD_H */
+
+#if defined (HAVE_STDLIB_H)
+#  include <stdlib.h>
+#else
+#  include "ansi_stdlib.h"
+#endif /* HAVE_STDLIB_H */
+
+#include <stdio.h>
+#include <ctype.h>
+
+/* System-specific feature definitions and include files. */
+#include "rldefs.h"
+#include "rlmbutil.h"
+
+#if defined (TIOCSTAT_IN_SYS_IOCTL)
+#  include <sys/ioctl.h>
+#endif /* TIOCSTAT_IN_SYS_IOCTL */
+
+/* Some standard library routines. */
+#include "readline.h"
+
+#include "rlprivate.h"
+#include "xmalloc.h"
+
+/* Declared here so it can be shared between the readline and history
+   libraries. */
+#if defined (HANDLE_MULTIBYTE)
+int rl_byte_oriented = 0;
+#else
+int rl_byte_oriented = 1;
+#endif
+
+/* **************************************************************** */
+/*                                                                 */
+/*             Multibyte Character Utility Functions               */
+/*                                                                 */
+/* **************************************************************** */
+
+#if defined(HANDLE_MULTIBYTE)
+
+static int
+_rl_find_next_mbchar_internal (string, seed, count, find_non_zero)
+     char *string;
+     int seed, count, find_non_zero;
+{
+  size_t tmp;
+  mbstate_t ps;
+  int point;
+  wchar_t wc;
+
+  tmp = 0;
+
+  memset(&ps, 0, sizeof (mbstate_t));
+  if (seed < 0)
+    seed = 0;
+  if (count <= 0)
+    return seed;
+
+  point = seed + _rl_adjust_point (string, seed, &ps);
+  /* if this is true, means that seed was not pointed character
+     started byte.  So correct the point and consume count */
+  if (seed < point)
+    count--;
+
+  while (count > 0)  
+    {
+      tmp = mbrtowc (&wc, string+point, strlen(string + point), &ps);
+      if (MB_INVALIDCH ((size_t)tmp))
+       {
+         /* invalid bytes. asume a byte represents a character */
+         point++;
+         count--;
+         /* reset states. */
+         memset(&ps, 0, sizeof(mbstate_t));
+       }
+      else if (MB_NULLWCH (tmp))
+       break;                  /* found wide '\0' */
+      else
+       {
+         /* valid bytes */
+         point += tmp;
+         if (find_non_zero)
+           {
+             if (wcwidth (wc) == 0)
+               continue;
+             else
+               count--;
+           }
+         else
+           count--;
+       }
+    }
+
+  if (find_non_zero)
+    {
+      tmp = mbrtowc (&wc, string + point, strlen (string + point), &ps);
+      while (tmp > 0 && wcwidth (wc) == 0)
+       {
+         point += tmp;
+         tmp = mbrtowc (&wc, string + point, strlen (string + point), &ps);
+         if (MB_NULLWCH (tmp) || MB_INVALIDCH (tmp))
+           break;
+       }
+    }
+
+  return point;
+}
+
+static int
+_rl_find_prev_mbchar_internal (string, seed, find_non_zero)
+     char *string;
+     int seed, find_non_zero;
+{
+  mbstate_t ps;
+  int prev, non_zero_prev, point, length;
+  size_t tmp;
+  wchar_t wc;
+
+  memset(&ps, 0, sizeof(mbstate_t));
+  length = strlen(string);
+  
+  if (seed < 0)
+    return 0;
+  else if (length < seed)
+    return length;
+
+  prev = non_zero_prev = point = 0;
+  while (point < seed)
+    {
+      tmp = mbrtowc (&wc, string + point, length - point, &ps);
+      if (MB_INVALIDCH ((size_t)tmp))
+       {
+         /* in this case, bytes are invalid or shorted to compose
+            multibyte char, so assume that the first byte represents
+            a single character anyway. */
+         tmp = 1;
+         /* clear the state of the byte sequence, because
+            in this case effect of mbstate is undefined  */
+         memset(&ps, 0, sizeof (mbstate_t));
+
+         /* Since we're assuming that this byte represents a single
+            non-zero-width character, don't forget about it. */
+         prev = point;
+       }
+      else if (MB_NULLWCH (tmp))
+       break;                  /* Found '\0' char.  Can this happen? */
+      else
+       {
+         if (find_non_zero)
+           {
+             if (wcwidth (wc) != 0)
+               prev = point;
+           }
+         else
+           prev = point;  
+       }
+
+      point += tmp;
+    }
+
+  return prev;
+}
+
+/* return the number of bytes parsed from the multibyte sequence starting
+   at src, if a non-L'\0' wide character was recognized. It returns 0, 
+   if a L'\0' wide character was recognized. It  returns (size_t)(-1), 
+   if an invalid multibyte sequence was encountered. It returns (size_t)(-2) 
+   if it couldn't parse a complete  multibyte character.  */
+int
+_rl_get_char_len (src, ps)
+     char *src;
+     mbstate_t *ps;
+{
+  size_t tmp;
+
+  tmp = mbrlen((const char *)src, (size_t)strlen (src), ps);
+  if (tmp == (size_t)(-2))
+    {
+      /* shorted to compose multibyte char */
+      if (ps)
+       memset (ps, 0, sizeof(mbstate_t));
+      return -2;
+    }
+  else if (tmp == (size_t)(-1))
+    {
+      /* invalid to compose multibyte char */
+      /* initialize the conversion state */
+      if (ps)
+       memset (ps, 0, sizeof(mbstate_t));
+      return -1;
+    }
+  else if (tmp == (size_t)0)
+    return 0;
+  else
+    return (int)tmp;
+}
+
+/* compare the specified two characters. If the characters matched,
+   return 1. Otherwise return 0. */
+int
+_rl_compare_chars (buf1, pos1, ps1, buf2, pos2, ps2)
+     char *buf1;
+     int pos1;
+     mbstate_t *ps1;
+     char *buf2;
+     int pos2;
+     mbstate_t *ps2;
+{
+  int i, w1, w2;
+
+  if ((w1 = _rl_get_char_len (&buf1[pos1], ps1)) <= 0 || 
+       (w2 = _rl_get_char_len (&buf2[pos2], ps2)) <= 0 ||
+       (w1 != w2) ||
+       (buf1[pos1] != buf2[pos2]))
+    return 0;
+
+  for (i = 1; i < w1; i++)
+    if (buf1[pos1+i] != buf2[pos2+i])
+      return 0;
+
+  return 1;
+}
+
+/* adjust pointed byte and find mbstate of the point of string.
+   adjusted point will be point <= adjusted_point, and returns
+   differences of the byte(adjusted_point - point).
+   if point is invalied (point < 0 || more than string length),
+   it returns -1 */
+int
+_rl_adjust_point(string, point, ps)
+     char *string;
+     int point;
+     mbstate_t *ps;
+{
+  size_t tmp = 0;
+  int length;
+  int pos = 0;
+
+  length = strlen(string);
+  if (point < 0)
+    return -1;
+  if (length < point)
+    return -1;
+  
+  while (pos < point)
+    {
+      tmp = mbrlen (string + pos, length - pos, ps);
+      if (MB_INVALIDCH ((size_t)tmp))
+       {
+         /* in this case, bytes are invalid or shorted to compose
+            multibyte char, so assume that the first byte represents
+            a single character anyway. */
+         pos++;
+         /* clear the state of the byte sequence, because
+            in this case effect of mbstate is undefined  */
+         if (ps)
+           memset (ps, 0, sizeof (mbstate_t));
+       }
+      else if (MB_NULLWCH (tmp))
+       pos++;
+      else
+       pos += tmp;
+    }
+
+  return (pos - point);
+}
+
+int
+_rl_is_mbchar_matched (string, seed, end, mbchar, length)
+     char *string;
+     int seed, end;
+     char *mbchar;
+     int length;
+{
+  int i;
+
+  if ((end - seed) < length)
+    return 0;
+
+  for (i = 0; i < length; i++)
+    if (string[seed + i] != mbchar[i])
+      return 0;
+  return 1;
+}
+
+wchar_t
+_rl_char_value (buf, ind)
+     char *buf;
+     int ind;
+{
+  size_t tmp;
+  wchar_t wc;
+  mbstate_t ps;
+  int l;
+
+  if (MB_LEN_MAX == 1 || rl_byte_oriented)
+    return ((wchar_t) buf[ind]);
+  l = strlen (buf);
+  if (ind >= l - 1)
+    return ((wchar_t) buf[ind]);
+  memset (&ps, 0, sizeof (mbstate_t));
+  tmp = mbrtowc (&wc, buf + ind, l - ind, &ps);
+  if (MB_INVALIDCH (tmp) || MB_NULLWCH (tmp))  
+    return ((wchar_t) buf[ind]);
+  return wc;
+}
+#endif /* HANDLE_MULTIBYTE */
+
+/* Find next `count' characters started byte point of the specified seed.
+   If flags is MB_FIND_NONZERO, we look for non-zero-width multibyte
+   characters. */
+#undef _rl_find_next_mbchar
+int
+_rl_find_next_mbchar (string, seed, count, flags)
+     char *string;
+     int seed, count, flags;
+{
+#if defined (HANDLE_MULTIBYTE)
+  return _rl_find_next_mbchar_internal (string, seed, count, flags);
+#else
+  return (seed + count);
+#endif
+}
+
+/* Find previous character started byte point of the specified seed.
+   Returned point will be point <= seed.  If flags is MB_FIND_NONZERO,
+   we look for non-zero-width multibyte characters. */
+#undef _rl_find_prev_mbchar
+int
+_rl_find_prev_mbchar (string, seed, flags)
+     char *string;
+     int seed, flags;
+{
+#if defined (HANDLE_MULTIBYTE)
+  return _rl_find_prev_mbchar_internal (string, seed, flags);
+#else
+  return ((seed == 0) ? seed : seed - 1);
+#endif
+}
diff --git a/misc.c b/misc.c
new file mode 100644 (file)
index 0000000..94ecb25
--- /dev/null
+++ b/misc.c
@@ -0,0 +1,603 @@
+/* misc.c -- miscellaneous bindable readline functions. */
+
+/* Copyright (C) 1987-2005 Free Software Foundation, Inc.
+
+   This file is part of the GNU Readline Library, a library for
+   reading lines of text with interactive input and history editing.
+
+   The GNU Readline Library 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.
+
+   The GNU Readline Library is distributed in the hope that it will be
+   useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+   of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   The GNU General Public License is often shipped with GNU software, and
+   is generally kept in a file called COPYING or LICENSE.  If you do not
+   have a copy of the license, write to the Free Software Foundation,
+   59 Temple Place, Suite 330, Boston, MA 02111 USA. */
+#define READLINE_LIBRARY
+
+#if defined (HAVE_CONFIG_H)
+#  include <config.h>
+#endif
+
+#if defined (HAVE_UNISTD_H)
+#  include <unistd.h>
+#endif /* HAVE_UNISTD_H */
+
+#if defined (HAVE_STDLIB_H)
+#  include <stdlib.h>
+#else
+#  include "ansi_stdlib.h"
+#endif /* HAVE_STDLIB_H */
+
+#if defined (HAVE_LOCALE_H)
+#  include <locale.h>
+#endif
+
+#include <stdio.h>
+
+/* System-specific feature definitions and include files. */
+#include "rldefs.h"
+#include "rlmbutil.h"
+
+/* Some standard library routines. */
+#include "readline.h"
+#include "history.h"
+
+#include "rlprivate.h"
+#include "rlshell.h"
+#include "xmalloc.h"
+
+static int rl_digit_loop PARAMS((void));
+static void _rl_history_set_point PARAMS((void));
+
+/* Forward declarations used in this file */
+void _rl_free_history_entry PARAMS((HIST_ENTRY *));
+
+/* If non-zero, rl_get_previous_history and rl_get_next_history attempt
+   to preserve the value of rl_point from line to line. */
+int _rl_history_preserve_point = 0;
+
+_rl_arg_cxt _rl_argcxt;
+
+/* Saved target point for when _rl_history_preserve_point is set.  Special
+   value of -1 means that point is at the end of the line. */
+int _rl_history_saved_point = -1;
+
+/* **************************************************************** */
+/*                                                                 */
+/*                     Numeric Arguments                           */
+/*                                                                 */
+/* **************************************************************** */
+
+int
+_rl_arg_overflow ()
+{
+  if (rl_numeric_arg > 1000000)
+    {
+      _rl_argcxt = 0;
+      rl_explicit_arg = rl_numeric_arg = 0;
+      rl_ding ();
+      rl_restore_prompt ();
+      rl_clear_message ();
+      RL_UNSETSTATE(RL_STATE_NUMERICARG);
+      return 1;
+    }
+  return 0;
+}
+
+void
+_rl_arg_init ()
+{
+  rl_save_prompt ();
+  _rl_argcxt = 0;
+  RL_SETSTATE(RL_STATE_NUMERICARG);
+}
+
+int
+_rl_arg_getchar ()
+{
+  int c;
+
+  rl_message ("(arg: %d) ", rl_arg_sign * rl_numeric_arg);
+  RL_SETSTATE(RL_STATE_MOREINPUT);
+  c = rl_read_key ();
+  RL_UNSETSTATE(RL_STATE_MOREINPUT);
+
+  return c;
+}
+
+/* Process C as part of the current numeric argument.  Return -1 if the
+   argument should be aborted, 0 if we should not read any more chars, and
+   1 if we should continue to read chars. */
+int
+_rl_arg_dispatch (cxt, c)
+     _rl_arg_cxt cxt;
+     int c;
+{
+  int key, r;
+
+  key = c;
+
+  /* If we see a key bound to `universal-argument' after seeing digits,
+      it ends the argument but is otherwise ignored. */
+  if (_rl_keymap[c].type == ISFUNC && _rl_keymap[c].function == rl_universal_argument)
+    {
+      if ((cxt & NUM_SAWDIGITS) == 0)
+       {
+         rl_numeric_arg *= 4;
+         return 1;
+       }
+      else if (RL_ISSTATE (RL_STATE_CALLBACK))
+        {
+          _rl_argcxt |= NUM_READONE;
+          return 0;    /* XXX */
+        }
+      else
+       {
+         RL_SETSTATE(RL_STATE_MOREINPUT);
+         key = rl_read_key ();
+         RL_UNSETSTATE(RL_STATE_MOREINPUT);
+         rl_restore_prompt ();
+         rl_clear_message ();
+         RL_UNSETSTATE(RL_STATE_NUMERICARG);
+         return (_rl_dispatch (key, _rl_keymap));
+       }
+    }
+
+  c = UNMETA (c);
+
+  if (_rl_digit_p (c))
+    {
+      r = _rl_digit_value (c);         
+      rl_numeric_arg = rl_explicit_arg ? (rl_numeric_arg * 10) +  r : r;
+      rl_explicit_arg = 1;
+      _rl_argcxt |= NUM_SAWDIGITS;
+    }
+  else if (c == '-' && rl_explicit_arg == 0)
+    {
+      rl_numeric_arg = 1;
+      _rl_argcxt |= NUM_SAWMINUS;
+      rl_arg_sign = -1;
+    }
+  else
+    {
+      /* Make M-- command equivalent to M--1 command. */
+      if ((_rl_argcxt & NUM_SAWMINUS) && rl_numeric_arg == 1 && rl_explicit_arg == 0)
+       rl_explicit_arg = 1;
+      rl_restore_prompt ();
+      rl_clear_message ();
+      RL_UNSETSTATE(RL_STATE_NUMERICARG);
+
+      r = _rl_dispatch (key, _rl_keymap);
+      if (RL_ISSTATE (RL_STATE_CALLBACK))
+       {
+         /* At worst, this will cause an extra redisplay.  Otherwise,
+            we have to wait until the next character comes in. */
+         if (rl_done == 0)
+           (*rl_redisplay_function) ();
+         r = 0;
+       }
+      return r;
+    }
+
+  return 1;
+}
+
+/* Handle C-u style numeric args, as well as M--, and M-digits. */
+static int
+rl_digit_loop ()
+{
+  int c, r;
+
+  while (1)
+    {
+      if (_rl_arg_overflow ())
+       return 1;
+
+      c = _rl_arg_getchar ();
+
+      if (c < 0)
+       {
+         _rl_abort_internal ();
+         return -1;
+       }
+
+      r = _rl_arg_dispatch (_rl_argcxt, c);
+      if (r <= 0 || (RL_ISSTATE (RL_STATE_NUMERICARG) == 0))
+        break;
+    }
+
+  return r;
+}
+
+/* Create a default argument. */
+void
+_rl_reset_argument ()
+{
+  rl_numeric_arg = rl_arg_sign = 1;
+  rl_explicit_arg = 0;
+  _rl_argcxt = 0;
+}
+
+/* Start a numeric argument with initial value KEY */
+int
+rl_digit_argument (ignore, key)
+     int ignore, key;
+{
+  _rl_arg_init ();
+  if (RL_ISSTATE (RL_STATE_CALLBACK))
+    {
+      _rl_arg_dispatch (_rl_argcxt, key);
+      rl_message ("(arg: %d) ", rl_arg_sign * rl_numeric_arg);
+      return 0;
+    }
+  else
+    {
+      rl_execute_next (key);
+      return (rl_digit_loop ());
+    }
+}
+
+/* C-u, universal argument.  Multiply the current argument by 4.
+   Read a key.  If the key has nothing to do with arguments, then
+   dispatch on it.  If the key is the abort character then abort. */
+int
+rl_universal_argument (count, key)
+     int count, key;
+{
+  _rl_arg_init ();
+  rl_numeric_arg *= 4;
+
+  return (RL_ISSTATE (RL_STATE_CALLBACK) ? 0 : rl_digit_loop ());
+}
+
+int
+_rl_arg_callback (cxt)
+     _rl_arg_cxt cxt;
+{
+  int c, r;
+
+  c = _rl_arg_getchar ();
+
+  if (_rl_argcxt & NUM_READONE)
+    {
+      _rl_argcxt &= ~NUM_READONE;
+      rl_restore_prompt ();
+      rl_clear_message ();
+      RL_UNSETSTATE(RL_STATE_NUMERICARG);
+      rl_execute_next (c);
+      return 0;
+    }
+
+  r = _rl_arg_dispatch (cxt, c);
+  return (r != 1);
+}
+
+/* What to do when you abort reading an argument. */
+int
+rl_discard_argument ()
+{
+  rl_ding ();
+  rl_clear_message ();
+  _rl_reset_argument ();
+
+  return 0;
+}
+
+/* **************************************************************** */
+/*                                                                 */
+/*                     History Utilities                           */
+/*                                                                 */
+/* **************************************************************** */
+
+/* We already have a history library, and that is what we use to control
+   the history features of readline.  This is our local interface to
+   the history mechanism. */
+
+/* While we are editing the history, this is the saved
+   version of the original line. */
+HIST_ENTRY *_rl_saved_line_for_history = (HIST_ENTRY *)NULL;
+
+/* Set the history pointer back to the last entry in the history. */
+void
+_rl_start_using_history ()
+{
+  using_history ();
+  if (_rl_saved_line_for_history)
+    _rl_free_history_entry (_rl_saved_line_for_history);
+
+  _rl_saved_line_for_history = (HIST_ENTRY *)NULL;
+}
+
+/* Free the contents (and containing structure) of a HIST_ENTRY. */
+void
+_rl_free_history_entry (entry)
+     HIST_ENTRY *entry;
+{
+  if (entry == 0)
+    return;
+
+  FREE (entry->line);
+  FREE (entry->timestamp);
+
+  free (entry);
+}
+
+/* Perhaps put back the current line if it has changed. */
+int
+rl_maybe_replace_line ()
+{
+  HIST_ENTRY *temp;
+
+  temp = current_history ();
+  /* If the current line has changed, save the changes. */
+  if (temp && ((UNDO_LIST *)(temp->data) != rl_undo_list))
+    {
+      temp = replace_history_entry (where_history (), rl_line_buffer, (histdata_t)rl_undo_list);
+      free (temp->line);
+      FREE (temp->timestamp);
+      free (temp);
+    }
+  return 0;
+}
+
+/* Restore the _rl_saved_line_for_history if there is one. */
+int
+rl_maybe_unsave_line ()
+{
+  if (_rl_saved_line_for_history)
+    {
+      /* Can't call with `1' because rl_undo_list might point to an undo
+        list from a history entry, as in rl_replace_from_history() below. */
+      rl_replace_line (_rl_saved_line_for_history->line, 0);
+      rl_undo_list = (UNDO_LIST *)_rl_saved_line_for_history->data;
+      _rl_free_history_entry (_rl_saved_line_for_history);
+      _rl_saved_line_for_history = (HIST_ENTRY *)NULL;
+      rl_point = rl_end;       /* rl_replace_line sets rl_end */
+    }
+  else
+    rl_ding ();
+  return 0;
+}
+
+/* Save the current line in _rl_saved_line_for_history. */
+int
+rl_maybe_save_line ()
+{
+  if (_rl_saved_line_for_history == 0)
+    {
+      _rl_saved_line_for_history = (HIST_ENTRY *)xmalloc (sizeof (HIST_ENTRY));
+      _rl_saved_line_for_history->line = savestring (rl_line_buffer);
+      _rl_saved_line_for_history->timestamp = (char *)NULL;
+      _rl_saved_line_for_history->data = (char *)rl_undo_list;
+    }
+
+  return 0;
+}
+
+int
+_rl_free_saved_history_line ()
+{
+  if (_rl_saved_line_for_history)
+    {
+      _rl_free_history_entry (_rl_saved_line_for_history);
+      _rl_saved_line_for_history = (HIST_ENTRY *)NULL;
+    }
+  return 0;
+}
+
+static void
+_rl_history_set_point ()
+{
+  rl_point = (_rl_history_preserve_point && _rl_history_saved_point != -1)
+               ? _rl_history_saved_point
+               : rl_end;
+  if (rl_point > rl_end)
+    rl_point = rl_end;
+
+#if defined (VI_MODE)
+  if (rl_editing_mode == vi_mode && _rl_keymap != vi_insertion_keymap)
+    rl_point = 0;
+#endif /* VI_MODE */
+
+  if (rl_editing_mode == emacs_mode)
+    rl_mark = (rl_point == rl_end ? 0 : rl_end);
+}
+
+void
+rl_replace_from_history (entry, flags)
+     HIST_ENTRY *entry;
+     int flags;                        /* currently unused */
+{
+  /* Can't call with `1' because rl_undo_list might point to an undo list
+     from a history entry, just like we're setting up here. */
+  rl_replace_line (entry->line, 0);
+  rl_undo_list = (UNDO_LIST *)entry->data;
+  rl_point = rl_end;
+  rl_mark = 0;
+
+#if defined (VI_MODE)
+  if (rl_editing_mode == vi_mode)
+    {
+      rl_point = 0;
+      rl_mark = rl_end;
+    }
+#endif
+}  
+
+/* **************************************************************** */
+/*                                                                 */
+/*                     History Commands                            */
+/*                                                                 */
+/* **************************************************************** */
+
+/* Meta-< goes to the start of the history. */
+int
+rl_beginning_of_history (count, key)
+     int count, key;
+{
+  return (rl_get_previous_history (1 + where_history (), key));
+}
+
+/* Meta-> goes to the end of the history.  (The current line). */
+int
+rl_end_of_history (count, key)
+     int count, key;
+{
+  rl_maybe_replace_line ();
+  using_history ();
+  rl_maybe_unsave_line ();
+  return 0;
+}
+
+/* Move down to the next history line. */
+int
+rl_get_next_history (count, key)
+     int count, key;
+{
+  HIST_ENTRY *temp;
+
+  if (count < 0)
+    return (rl_get_previous_history (-count, key));
+
+  if (count == 0)
+    return 0;
+
+  rl_maybe_replace_line ();
+
+  /* either not saved by rl_newline or at end of line, so set appropriately. */
+  if (_rl_history_saved_point == -1 && (rl_point || rl_end))
+    _rl_history_saved_point = (rl_point == rl_end) ? -1 : rl_point;
+
+  temp = (HIST_ENTRY *)NULL;
+  while (count)
+    {
+      temp = next_history ();
+      if (!temp)
+       break;
+      --count;
+    }
+
+  if (temp == 0)
+    rl_maybe_unsave_line ();
+  else
+    {
+      rl_replace_from_history (temp, 0);
+      _rl_history_set_point ();
+    }
+  return 0;
+}
+
+/* Get the previous item out of our interactive history, making it the current
+   line.  If there is no previous history, just ding. */
+int
+rl_get_previous_history (count, key)
+     int count, key;
+{
+  HIST_ENTRY *old_temp, *temp;
+
+  if (count < 0)
+    return (rl_get_next_history (-count, key));
+
+  if (count == 0)
+    return 0;
+
+  /* either not saved by rl_newline or at end of line, so set appropriately. */
+  if (_rl_history_saved_point == -1 && (rl_point || rl_end))
+    _rl_history_saved_point = (rl_point == rl_end) ? -1 : rl_point;
+
+  /* If we don't have a line saved, then save this one. */
+  rl_maybe_save_line ();
+
+  /* If the current line has changed, save the changes. */
+  rl_maybe_replace_line ();
+
+  temp = old_temp = (HIST_ENTRY *)NULL;
+  while (count)
+    {
+      temp = previous_history ();
+      if (temp == 0)
+       break;
+
+      old_temp = temp;
+      --count;
+    }
+
+  /* If there was a large argument, and we moved back to the start of the
+     history, that is not an error.  So use the last value found. */
+  if (!temp && old_temp)
+    temp = old_temp;
+
+  if (temp == 0)
+    rl_ding ();
+  else
+    {
+      rl_replace_from_history (temp, 0);
+      _rl_history_set_point ();
+    }
+
+  return 0;
+}
+
+/* **************************************************************** */
+/*                                                                 */
+/*                         Editing Modes                           */
+/*                                                                 */
+/* **************************************************************** */
+/* How to toggle back and forth between editing modes. */
+int
+rl_vi_editing_mode (count, key)
+     int count, key;
+{
+#if defined (VI_MODE)
+  _rl_set_insert_mode (RL_IM_INSERT, 1);       /* vi mode ignores insert mode */
+  rl_editing_mode = vi_mode;
+  rl_vi_insertion_mode (1, key);
+#endif /* VI_MODE */
+
+  return 0;
+}
+
+int
+rl_emacs_editing_mode (count, key)
+     int count, key;
+{
+  rl_editing_mode = emacs_mode;
+  _rl_set_insert_mode (RL_IM_INSERT, 1); /* emacs mode default is insert mode */
+  _rl_keymap = emacs_standard_keymap;
+  return 0;
+}
+
+/* Function for the rest of the library to use to set insert/overwrite mode. */
+void
+_rl_set_insert_mode (im, force)
+     int im, force;
+{
+#ifdef CURSOR_MODE
+  _rl_set_cursor (im, force);
+#endif
+
+  rl_insert_mode = im;
+}
+
+/* Toggle overwrite mode.  A positive explicit argument selects overwrite
+   mode.  A negative or zero explicit argument selects insert mode. */
+int
+rl_overwrite_mode (count, key)
+     int count, key;
+{
+  if (rl_explicit_arg == 0)
+    _rl_set_insert_mode (rl_insert_mode ^ 1, 0);
+  else if (count > 0)
+    _rl_set_insert_mode (RL_IM_OVERWRITE, 0);
+  else
+    _rl_set_insert_mode (RL_IM_INSERT, 0);
+
+  return 0;
+}
diff --git a/nls.c b/nls.c
new file mode 100644 (file)
index 0000000..bcee875
--- /dev/null
+++ b/nls.c
@@ -0,0 +1,252 @@
+/* nls.c -- skeletal internationalization code. */
+
+/* Copyright (C) 1996 Free Software Foundation, Inc.
+
+   This file is part of the GNU Readline Library, a library for
+   reading lines of text with interactive input and history editing.
+
+   The GNU Readline Library 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.
+
+   The GNU Readline Library is distributed in the hope that it will be
+   useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+   of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   The GNU General Public License is often shipped with GNU software, and
+   is generally kept in a file called COPYING or LICENSE.  If you do not
+   have a copy of the license, write to the Free Software Foundation,
+   59 Temple Place, Suite 330, Boston, MA 02111 USA. */
+#define READLINE_LIBRARY
+
+#if defined (HAVE_CONFIG_H)
+#  include <config.h>
+#endif
+
+#include <sys/types.h>
+
+#include <stdio.h>
+
+#if defined (HAVE_UNISTD_H)
+#  include <unistd.h>
+#endif /* HAVE_UNISTD_H */
+
+#if defined (HAVE_STDLIB_H)
+#  include <stdlib.h>
+#else
+#  include "ansi_stdlib.h"
+#endif /* HAVE_STDLIB_H */
+
+#if defined (HAVE_LOCALE_H)
+#  include <locale.h>
+#endif
+
+#include <ctype.h>
+
+#include "rldefs.h"
+#include "readline.h"
+#include "rlshell.h"
+#include "rlprivate.h"
+
+#if !defined (HAVE_SETLOCALE)    
+/* A list of legal values for the LANG or LC_CTYPE environment variables.
+   If a locale name in this list is the value for the LC_ALL, LC_CTYPE,
+   or LANG environment variable (using the first of those with a value),
+   readline eight-bit mode is enabled. */
+static char *legal_lang_values[] =
+{
+ "iso88591",
+ "iso88592",
+ "iso88593",
+ "iso88594",
+ "iso88595",
+ "iso88596",
+ "iso88597",
+ "iso88598",
+ "iso88599",
+ "iso885910",
+ "koi8r",
+  0
+};
+
+static char *normalize_codeset PARAMS((char *));
+static char *find_codeset PARAMS((char *, size_t *));
+#endif /* !HAVE_SETLOCALE */
+
+static char *_rl_get_locale_var PARAMS((const char *));
+
+static char *
+_rl_get_locale_var (v)
+     const char *v;
+{
+  char *lspec;
+
+  lspec = sh_get_env_value ("LC_ALL");
+  if (lspec == 0 || *lspec == 0)
+    lspec = sh_get_env_value (v);
+  if (lspec == 0 || *lspec == 0)
+    lspec = sh_get_env_value ("LANG");
+
+  return lspec;
+}
+  
+/* Check for LC_ALL, LC_CTYPE, and LANG and use the first with a value
+   to decide the defaults for 8-bit character input and output.  Returns
+   1 if we set eight-bit mode. */
+int
+_rl_init_eightbit ()
+{
+/* If we have setlocale(3), just check the current LC_CTYPE category
+   value, and go into eight-bit mode if it's not C or POSIX. */
+#if defined (HAVE_SETLOCALE)
+  char *lspec, *t;
+
+  /* Set the LC_CTYPE locale category from environment variables. */
+  lspec = _rl_get_locale_var ("LC_CTYPE");
+  /* Since _rl_get_locale_var queries the right environment variables,
+     we query the current locale settings with setlocale(), and, if
+     that doesn't return anything, we set lspec to the empty string to
+     force the subsequent call to setlocale() to define the `native'
+     environment. */
+  if (lspec == 0 || *lspec == 0)
+    lspec = setlocale (LC_CTYPE, (char *)NULL);
+  if (lspec == 0)
+    lspec = "";
+  t = setlocale (LC_CTYPE, lspec);
+
+  if (t && *t && (t[0] != 'C' || t[1]) && (STREQ (t, "POSIX") == 0))
+    {
+      _rl_meta_flag = 1;
+      _rl_convert_meta_chars_to_ascii = 0;
+      _rl_output_meta_chars = 1;
+      return (1);
+    }
+  else
+    return (0);
+
+#else /* !HAVE_SETLOCALE */
+  char *lspec, *t;
+  int i;
+
+  /* We don't have setlocale.  Finesse it.  Check the environment for the
+     appropriate variables and set eight-bit mode if they have the right
+     values. */
+  lspec = _rl_get_locale_var ("LC_CTYPE");
+
+  if (lspec == 0 || (t = normalize_codeset (lspec)) == 0)
+    return (0);
+  for (i = 0; t && legal_lang_values[i]; i++)
+    if (STREQ (t, legal_lang_values[i]))
+      {
+       _rl_meta_flag = 1;
+       _rl_convert_meta_chars_to_ascii = 0;
+       _rl_output_meta_chars = 1;
+       break;
+      }
+  free (t);
+  return (legal_lang_values[i] ? 1 : 0);
+
+#endif /* !HAVE_SETLOCALE */
+}
+
+#if !defined (HAVE_SETLOCALE)
+static char *
+normalize_codeset (codeset)
+     char *codeset;
+{
+  size_t namelen, i;
+  int len, all_digits;
+  char *wp, *retval;
+
+  codeset = find_codeset (codeset, &namelen);
+
+  if (codeset == 0)
+    return (codeset);
+
+  all_digits = 1;
+  for (len = 0, i = 0; i < namelen; i++)
+    {
+      if (ISALNUM ((unsigned char)codeset[i]))
+       {
+         len++;
+         all_digits &= _rl_digit_p (codeset[i]);
+       }
+    }
+
+  retval = (char *)malloc ((all_digits ? 3 : 0) + len + 1);
+  if (retval == 0)
+    return ((char *)0);
+
+  wp = retval;
+  /* Add `iso' to beginning of an all-digit codeset */
+  if (all_digits)
+    {
+      *wp++ = 'i';
+      *wp++ = 's';
+      *wp++ = 'o';
+    }
+
+  for (i = 0; i < namelen; i++)
+    if (ISALPHA ((unsigned char)codeset[i]))
+      *wp++ = _rl_to_lower (codeset[i]);
+    else if (_rl_digit_p (codeset[i]))
+      *wp++ = codeset[i];
+  *wp = '\0';
+
+  return retval;
+}
+
+/* Isolate codeset portion of locale specification. */
+static char *
+find_codeset (name, lenp)
+     char *name;
+     size_t *lenp;
+{
+  char *cp, *language, *result;
+
+  cp = language = name;
+  result = (char *)0;
+
+  while (*cp && *cp != '_' && *cp != '@' && *cp != '+' && *cp != ',')
+    cp++;
+
+  /* This does not make sense: language has to be specified.  As
+     an exception we allow the variable to contain only the codeset
+     name.  Perhaps there are funny codeset names.  */
+  if (language == cp) 
+    {
+      *lenp = strlen (language);
+      result = language;
+    }
+  else
+    {
+      /* Next is the territory. */
+      if (*cp == '_')
+       do
+         ++cp;
+       while (*cp && *cp != '.' && *cp != '@' && *cp != '+' && *cp != ',' && *cp != '_');
+
+      /* Now, finally, is the codeset. */
+      result = cp;
+      if (*cp == '.')
+       do
+         ++cp;
+       while (*cp && *cp != '@');
+
+      if (cp - result > 2)
+       {
+         result++;
+         *lenp = cp - result;
+       }
+      else
+       {
+         *lenp = strlen (language);
+         result = language;
+       }
+    }
+
+  return result;
+}
+#endif /* !HAVE_SETLOCALE */
diff --git a/packaging/readline-5.2-001.patch b/packaging/readline-5.2-001.patch
new file mode 100644 (file)
index 0000000..826e6ab
--- /dev/null
@@ -0,0 +1,31 @@
+                          READLINE PATCH REPORT
+                          =====================
+
+Readline-Release: 5.2
+Patch-ID: readline52-001
+
+Bug-Reported-by:       ebb9@byu.net
+Bug-Reference-ID:      <45540862.9030900@byu.net>
+Bug-Reference-URL:     http://lists.gnu.org/archive/html/bug-bash/2006-11/msg00017.html
+                       http://lists.gnu.org/archive/html/bug-bash/2006-11/msg00016.html
+
+Bug-Description:
+
+In some cases, code that is intended to be used in the presence of multibyte
+characters is called when no such characters are present, leading to incorrect
+display position calculations and incorrect redisplay.
+
+Patch:
+
+*** ../readline-5.2/display.c  Thu Sep 14 14:20:12 2006
+--- ./display.c        Mon Nov 13 17:55:57 2006
+***************
+*** 2381,2384 ****
+--- 2409,2414 ----
+    if (end <= start)
+      return 0;
++   if (MB_CUR_MAX == 1 || rl_byte_oriented)
++     return (end - start);
+  
+    memset (&ps, 0, sizeof (mbstate_t));
+
diff --git a/packaging/readline-5.2-002.patch b/packaging/readline-5.2-002.patch
new file mode 100644 (file)
index 0000000..169a886
--- /dev/null
@@ -0,0 +1,49 @@
+                          READLINE PATCH REPORT
+                          =====================
+
+Readline-Release: 5.2
+Patch-ID: readline52-002
+
+Bug-Reported-by: Magnus Svensson <msvensson@mysql.com>
+Bug-Reference-ID: <45BDC44D.80609@mysql.com>
+Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-readline/2007-01/msg00002.html
+
+Bug-Description:
+
+Readline neglects to reallocate the array it uses to keep track of wrapped
+screen lines when increasing its size.  This will eventually result in
+segmentation faults when given sufficiently long input.
+
+Patch:
+
+*** ../readline-5.2-patched/display.c  Thu Sep 14 14:20:12 2006
+--- ./display.c        Fri Feb  2 20:23:17 2007
+***************
+*** 561,574 ****
+--- 561,586 ----
+        wrap_offset = prompt_invis_chars_first_line = 0;
+      }
+  
++ #if defined (HANDLE_MULTIBYTE)
+  #define CHECK_INV_LBREAKS() \
+        do { \
+       if (newlines >= (inv_lbsize - 2)) \
+         { \
+           inv_lbsize *= 2; \
+           inv_lbreaks = (int *)xrealloc (inv_lbreaks, inv_lbsize * sizeof (int)); \
++          _rl_wrapped_line = (int *)xrealloc (_rl_wrapped_line, inv_lbsize * sizeof (int)); \
+         } \
+        } while (0)
++ #else
++ #define CHECK_INV_LBREAKS() \
++       do { \
++      if (newlines >= (inv_lbsize - 2)) \
++        { \
++          inv_lbsize *= 2; \
++          inv_lbreaks = (int *)xrealloc (inv_lbreaks, inv_lbsize * sizeof (int)); \
++        } \
++       } while (0)
++ #endif /* HANDLE_MULTIBYTE */
+  
+  #if defined (HANDLE_MULTIBYTE)         
+  #define CHECK_LPOS() \
diff --git a/packaging/readline-5.2-003.patch b/packaging/readline-5.2-003.patch
new file mode 100644 (file)
index 0000000..fc3ba96
--- /dev/null
@@ -0,0 +1,37 @@
+                          READLINE PATCH REPORT
+                          =====================
+
+Readline-Release: 5.2
+Patch-ID: readline52-003
+
+Bug-Reported-by: Peter Volkov <torre_cremata@mail.ru>
+Bug-Reference-ID: <1171795523.8021.18.camel@localhost>
+Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-bash/2007-02/msg00054.html
+
+Bug-Description:
+
+When moving the cursor, bash sometimes misplaces the cursor when the prompt
+contains two or more multibyte characters.  The particular circumstance that
+uncovered the problem was having the (multibyte) current directory name in
+the prompt string.
+
+Patch:
+
+*** ../readline-5.2.2/display.c        Fri Jan 19 13:34:50 2007
+--- ./display.c        Sat Mar 10 17:25:44 2007
+***************
+*** 1745,1749 ****
+      {
+        dpos = _rl_col_width (data, 0, new);
+!       if (dpos > prompt_last_invisible)              /* XXX - don't use woff here */
+       {
+         dpos -= woff;
+--- 1745,1752 ----
+      {
+        dpos = _rl_col_width (data, 0, new);
+!       /* Use NEW when comparing against the last invisible character in the
+!       prompt string, since they're both buffer indices and DPOS is a
+!       desired display position. */
+!       if (new > prompt_last_invisible)               /* XXX - don't use woff here */
+       {
+         dpos -= woff;
diff --git a/packaging/readline-5.2-004.patch b/packaging/readline-5.2-004.patch
new file mode 100644 (file)
index 0000000..b338bda
--- /dev/null
@@ -0,0 +1,70 @@
+                          READLINE PATCH REPORT
+                          =====================
+
+Readline-Release: 5.2
+Patch-ID: readline52-004
+
+Bug-Reported-by: Peter Volkov <torre_cremata@mail.ru>
+Bug-Reference-ID: <1173636022.7039.36.camel@localhost>
+Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-bash/2007-03/msg00039.html
+
+Bug-Description:
+
+When restoring the original prompt after finishing an incremental search,
+bash sometimes places the cursor incorrectly if the primary prompt contains
+invisible characters.
+
+Patch:
+
+*** ../readline-5.2.3/display.c        Fri Apr 20 13:30:16 2007
+--- ./display.c        Fri Apr 20 15:17:01 2007
+***************
+*** 1599,1604 ****
+         if (temp > 0)
+           {
+             _rl_output_some_chars (nfd, temp);
+!            _rl_last_c_pos += _rl_col_width (nfd, 0, temp);;
+           }
+       }
+--- 1599,1618 ----
+         if (temp > 0)
+           {
++            /* If nfd begins at the prompt, or before the invisible
++               characters in the prompt, we need to adjust _rl_last_c_pos
++               in a multibyte locale to account for the wrap offset and
++               set cpos_adjusted accordingly. */
+             _rl_output_some_chars (nfd, temp);
+!            if (MB_CUR_MAX > 1 && rl_byte_oriented == 0)
+!              {
+!                   _rl_last_c_pos += _rl_col_width (nfd, 0, temp);
+!                   if (current_line == 0 && wrap_offset &&  ((nfd - new) <= prompt_last_invisible))
+!                  {
+!                    _rl_last_c_pos -= wrap_offset;
+!                    cpos_adjusted = 1;
+!                  }
+!              }
+!               else
+!                 _rl_last_c_pos += temp;
+           }
+       }
+***************
+*** 1608,1613 ****
+--- 1622,1639 ----
+         if (temp > 0)
+           {
++            /* If nfd begins at the prompt, or before the invisible
++               characters in the prompt, we need to adjust _rl_last_c_pos
++               in a multibyte locale to account for the wrap offset and
++               set cpos_adjusted accordingly. */
+             _rl_output_some_chars (nfd, temp);
+             _rl_last_c_pos += col_temp;               /* XXX */
++            if (MB_CUR_MAX > 1 && rl_byte_oriented == 0)
++              {
++                if (current_line == 0 && wrap_offset &&  ((nfd - new) <= prompt_last_invisible))
++                  {
++                    _rl_last_c_pos -= wrap_offset;
++                    cpos_adjusted = 1;
++                  }
++              }
+           }
+         lendiff = (oe - old) - (ne - new);
diff --git a/packaging/readline-5.2-005.patch b/packaging/readline-5.2-005.patch
new file mode 100644 (file)
index 0000000..24ab655
--- /dev/null
@@ -0,0 +1,328 @@
+                          READLINE PATCH REPORT
+                          =====================
+
+Readline-Release: 5.2
+Patch-ID: readline52-005
+
+Bug-Reported-by:        Thomas Loeber <ifp@loeber1.de>
+Bug-Reference-ID:       <200703082223.08919.ifp@loeber1.de>
+Bug-Reference-URL:     http://lists.gnu.org/archive/html/bug-bash/2007-03/msg00036.html
+
+Bug-Description:
+
+When rl_read_key returns -1, indicating that readline's controlling terminal
+has been invalidated for some reason (e.g., receiving a SIGHUP), the error
+status was not reported correctly to the caller.  This could cause input
+loops. 
+
+Patch:
+
+*** ../readline-5.2/complete.c Fri Jul 28 11:35:49 2006
+--- ./complete.c       Tue Mar 13 08:50:16 2007
+***************
+*** 429,433 ****
+        if (c == 'n' || c == 'N' || c == RUBOUT)
+       return (0);
+!       if (c == ABORT_CHAR)
+       _rl_abort_internal ();
+        if (for_pager && (c == NEWLINE || c == RETURN))
+--- 440,444 ----
+        if (c == 'n' || c == 'N' || c == RUBOUT)
+       return (0);
+!       if (c == ABORT_CHAR || c < 0)
+       _rl_abort_internal ();
+        if (for_pager && (c == NEWLINE || c == RETURN))
+*** ../readline-5.2/input.c    Wed Aug 16 15:15:16 2006
+--- ./input.c  Wed May  2 16:07:59 2007
+***************
+*** 514,518 ****
+       int size;
+  {
+!   int mb_len = 0;
+    size_t mbchar_bytes_length;
+    wchar_t wc;
+--- 522,526 ----
+       int size;
+  {
+!   int mb_len, c;
+    size_t mbchar_bytes_length;
+    wchar_t wc;
+***************
+*** 521,531 ****
+    memset(&ps, 0, sizeof (mbstate_t));
+    memset(&ps_back, 0, sizeof (mbstate_t));
+!   
+    while (mb_len < size)
+      {
+        RL_SETSTATE(RL_STATE_MOREINPUT);
+!       mbchar[mb_len++] = rl_read_key ();
+        RL_UNSETSTATE(RL_STATE_MOREINPUT);
+  
+        mbchar_bytes_length = mbrtowc (&wc, mbchar, mb_len, &ps);
+        if (mbchar_bytes_length == (size_t)(-1))
+--- 529,545 ----
+    memset(&ps, 0, sizeof (mbstate_t));
+    memset(&ps_back, 0, sizeof (mbstate_t));
+! 
+!   mb_len = 0;  
+    while (mb_len < size)
+      {
+        RL_SETSTATE(RL_STATE_MOREINPUT);
+!       c = rl_read_key ();
+        RL_UNSETSTATE(RL_STATE_MOREINPUT);
+  
++       if (c < 0)
++      break;
++ 
++       mbchar[mb_len++] = c;
++ 
+        mbchar_bytes_length = mbrtowc (&wc, mbchar, mb_len, &ps);
+        if (mbchar_bytes_length == (size_t)(-1))
+***************
+*** 565,569 ****
+    c = first;
+    memset (mb, 0, mlen);
+!   for (i = 0; i < mlen; i++)
+      {
+        mb[i] = (char)c;
+--- 579,583 ----
+    c = first;
+    memset (mb, 0, mlen);
+!   for (i = 0; c >= 0 && i < mlen; i++)
+      {
+        mb[i] = (char)c;
+*** ../readline-5.2/isearch.c  Mon Dec 26 17:18:53 2005
+--- ./isearch.c        Fri Mar  9 14:30:59 2007
+***************
+*** 328,333 ****
+  
+    f = (rl_command_func_t *)NULL;
+!  
+!  /* Translate the keys we do something with to opcodes. */
+    if (c >= 0 && _rl_keymap[c].type == ISFUNC)
+      {
+--- 328,340 ----
+  
+    f = (rl_command_func_t *)NULL;
+! 
+!   if (c < 0)
+!     {
+!       cxt->sflags |= SF_FAILED;
+!       cxt->history_pos = cxt->last_found_line;
+!       return -1;
+!     }
+! 
+!   /* Translate the keys we do something with to opcodes. */
+    if (c >= 0 && _rl_keymap[c].type == ISFUNC)
+      {
+*** ../readline-5.2/misc.c     Mon Dec 26 17:20:46 2005
+--- ./misc.c   Fri Mar  9 14:44:11 2007
+***************
+*** 147,150 ****
+--- 147,152 ----
+         rl_clear_message ();
+         RL_UNSETSTATE(RL_STATE_NUMERICARG);
++        if (key < 0)
++          return -1;
+         return (_rl_dispatch (key, _rl_keymap));
+       }
+*** ../readline-5.2/readline.c Wed Aug 16 15:00:36 2006
+--- ./readline.c       Fri Mar  9 14:47:24 2007
+***************
+*** 646,649 ****
+--- 669,677 ----
+      {
+        nkey = _rl_subseq_getchar (cxt->okey);
++       if (nkey < 0)
++      {
++        _rl_abort_internal ();
++        return -1;
++      }
+        r = _rl_dispatch_subseq (nkey, cxt->dmap, cxt->subseq_arg);
+        cxt->flags |= KSEQ_DISPATCHED;
+*** ../readline-5.2/text.c     Fri Jul 28 11:55:27 2006
+--- ./text.c   Sun Mar 25 13:41:38 2007
+***************
+*** 858,861 ****
+--- 864,870 ----
+    RL_UNSETSTATE(RL_STATE_MOREINPUT);
+  
++   if (c < 0)
++     return -1;
++ 
+  #if defined (HANDLE_SIGNALS)
+    if (RL_ISSTATE (RL_STATE_CALLBACK) == 0)
+***************
+*** 1521,1524 ****
+--- 1530,1536 ----
+    mb_len = _rl_read_mbchar (mbchar, MB_LEN_MAX);
+  
++   if (mb_len <= 0)
++     return -1;
++ 
+    if (count < 0)
+      return (_rl_char_search_internal (-count, bdir, mbchar, mb_len));
+***************
+*** 1537,1540 ****
+--- 1549,1555 ----
+    RL_UNSETSTATE(RL_STATE_MOREINPUT);
+  
++   if (c < 0)
++     return -1;
++ 
+    if (count < 0)
+      return (_rl_char_search_internal (-count, bdir, c));
+*** ../readline-5.2/vi_mode.c  Sat Jul 29 16:42:28 2006
+--- ./vi_mode.c        Fri Mar  9 15:02:11 2007
+***************
+*** 887,890 ****
+--- 887,897 ----
+    c = rl_read_key ();
+    RL_UNSETSTATE(RL_STATE_MOREINPUT);
++ 
++   if (c < 0)
++     {
++       *nextkey = 0;
++       return -1;
++     }
++ 
+    *nextkey = c;
+  
+***************
+*** 903,906 ****
+--- 910,918 ----
+         c = rl_read_key ();   /* real command */
+         RL_UNSETSTATE(RL_STATE_MOREINPUT);
++        if (c < 0)
++          {
++            *nextkey = 0;
++            return -1;
++          }
+         *nextkey = c;
+       }
+***************
+*** 1225,1236 ****
+       _rl_callback_generic_arg *data;
+  {
+  #if defined (HANDLE_MULTIBYTE)
+!   _rl_vi_last_search_mblen = _rl_read_mbchar (_rl_vi_last_search_mbchar, MB_LEN_MAX);
+  #else
+    RL_SETSTATE(RL_STATE_MOREINPUT);
+!   _rl_vi_last_search_char = rl_read_key ();
+    RL_UNSETSTATE(RL_STATE_MOREINPUT);
+  #endif
+  
+    _rl_callback_func = 0;
+    _rl_want_redisplay = 1;
+--- 1243,1262 ----
+       _rl_callback_generic_arg *data;
+  {
++   int c;
+  #if defined (HANDLE_MULTIBYTE)
+!   c = _rl_vi_last_search_mblen = _rl_read_mbchar (_rl_vi_last_search_mbchar, MB_LEN_MAX);
+  #else
+    RL_SETSTATE(RL_STATE_MOREINPUT);
+!   c = rl_read_key ();
+    RL_UNSETSTATE(RL_STATE_MOREINPUT);
+  #endif
+  
++   if (c <= 0)
++     return -1;
++ 
++ #if !defined (HANDLE_MULTIBYTE)
++   _rl_vi_last_search_char = c;
++ #endif
++ 
+    _rl_callback_func = 0;
+    _rl_want_redisplay = 1;
+***************
+*** 1248,1251 ****
+--- 1274,1278 ----
+       int count, key;
+  {
++   int c;
+  #if defined (HANDLE_MULTIBYTE)
+    static char *target;
+***************
+*** 1294,1302 ****
+       {
+  #if defined (HANDLE_MULTIBYTE)
+!        _rl_vi_last_search_mblen = _rl_read_mbchar (_rl_vi_last_search_mbchar, MB_LEN_MAX);
+  #else
+         RL_SETSTATE(RL_STATE_MOREINPUT);
+!        _rl_vi_last_search_char = rl_read_key ();
+         RL_UNSETSTATE(RL_STATE_MOREINPUT);
+  #endif
+       }
+--- 1321,1335 ----
+       {
+  #if defined (HANDLE_MULTIBYTE)
+!        c = _rl_read_mbchar (_rl_vi_last_search_mbchar, MB_LEN_MAX);
+!        if (c <= 0)
+!          return -1;
+!        _rl_vi_last_search_mblen = c;
+  #else
+         RL_SETSTATE(RL_STATE_MOREINPUT);
+!        c = rl_read_key ();
+         RL_UNSETSTATE(RL_STATE_MOREINPUT);
++        if (c < 0)
++          return -1;
++        _rl_vi_last_search_char = c;
+  #endif
+       }
+***************
+*** 1468,1471 ****
+--- 1501,1507 ----
+    RL_UNSETSTATE(RL_STATE_MOREINPUT);
+  
++   if (c < 0)
++     return -1;
++ 
+  #if defined (HANDLE_MULTIBYTE)
+    if (MB_CUR_MAX > 1 && rl_byte_oriented == 0)
+***************
+*** 1486,1489 ****
+--- 1522,1528 ----
+    _rl_vi_last_replacement = c = _rl_vi_callback_getchar (mb, MB_LEN_MAX);
+  
++   if (c < 0)
++     return -1;
++ 
+    _rl_callback_func = 0;
+    _rl_want_redisplay = 1;
+***************
+*** 1517,1520 ****
+--- 1556,1562 ----
+      _rl_vi_last_replacement = c = _rl_vi_callback_getchar (mb, MB_LEN_MAX);
+  
++   if (c < 0)
++     return -1;
++ 
+    return (_rl_vi_change_char (count, c, mb));
+  }
+***************
+*** 1651,1655 ****
+    RL_UNSETSTATE(RL_STATE_MOREINPUT);
+  
+!   if (ch < 'a' || ch > 'z')
+      {
+        rl_ding ();
+--- 1693,1697 ----
+    RL_UNSETSTATE(RL_STATE_MOREINPUT);
+  
+!   if (ch < 0 || ch < 'a' || ch > 'z')        /* make test against 0 explicit */
+      {
+        rl_ding ();
+***************
+*** 1703,1707 ****
+        return 0;
+      }
+!   else if (ch < 'a' || ch > 'z')
+      {
+        rl_ding ();
+--- 1745,1749 ----
+        return 0;
+      }
+!   else if (ch < 0 || ch < 'a' || ch > 'z')   /* make test against 0 explicit */
+      {
+        rl_ding ();
diff --git a/packaging/readline-5.2-006.patch b/packaging/readline-5.2-006.patch
new file mode 100644 (file)
index 0000000..fbd06cb
--- /dev/null
@@ -0,0 +1,62 @@
+                          READLINE PATCH REPORT
+                          =====================
+
+Readline-Release: 5.2
+Patch-ID: readline52-006
+
+Bug-Reported-by:        Peter Volkov <torre_cremata@mail.ru>
+Bug-Reference-ID:       <1178376645.9063.25.camel@localhost>
+Bug-Reference-URL:      http://bugs.gentoo.org/177095
+
+Bug-Description:
+
+The readline display code miscalculated the screen position when performing
+a redisplay in which the new text occupies more screen space that the old,
+but takes fewer bytes to do so (e.g., when replacing a shorter string
+containing multibyte characters with a longer one containing only ASCII).
+
+Patch:
+
+*** ../readline-5.2/display.c  Thu Apr 26 11:38:22 2007
+--- ./display.c        Thu Jul 12 23:10:10 2007
+***************
+*** 1519,1527 ****
+        /* Non-zero if we're increasing the number of lines. */
+        int gl = current_line >= _rl_vis_botlin && inv_botlin > _rl_vis_botlin;
+        /* Sometimes it is cheaper to print the characters rather than
+        use the terminal's capabilities.  If we're growing the number
+        of lines, make sure we actually cause the new line to wrap
+        around on auto-wrapping terminals. */
+!       if (_rl_terminal_can_insert && ((2 * col_temp) >= col_lendiff || _rl_term_IC) && (!_rl_term_autowrap || !gl))
+       {
+         /* If lendiff > prompt_visible_length and _rl_last_c_pos == 0 and
+--- 1568,1596 ----
+        /* Non-zero if we're increasing the number of lines. */
+        int gl = current_line >= _rl_vis_botlin && inv_botlin > _rl_vis_botlin;
++       /* If col_lendiff is > 0, implying that the new string takes up more
++       screen real estate than the old, but lendiff is < 0, meaning that it
++       takes fewer bytes, we need to just output the characters starting
++       from the first difference.  These will overwrite what is on the
++       display, so there's no reason to do a smart update.  This can really
++       only happen in a multibyte environment. */
++       if (lendiff < 0)
++      {
++        _rl_output_some_chars (nfd, temp);
++        _rl_last_c_pos += _rl_col_width (nfd, 0, temp);
++        /* If nfd begins before any invisible characters in the prompt,
++           adjust _rl_last_c_pos to account for wrap_offset and set
++           cpos_adjusted to let the caller know. */
++        if (current_line == 0 && wrap_offset && ((nfd - new) <= prompt_last_invisible))
++          {
++            _rl_last_c_pos -= wrap_offset;
++            cpos_adjusted = 1;
++          }
++        return;
++      }
+        /* Sometimes it is cheaper to print the characters rather than
+        use the terminal's capabilities.  If we're growing the number
+        of lines, make sure we actually cause the new line to wrap
+        around on auto-wrapping terminals. */
+!       else if (_rl_terminal_can_insert && ((2 * col_temp) >= col_lendiff || _rl_term_IC) && (!_rl_term_autowrap || !gl))
+       {
+         /* If lendiff > prompt_visible_length and _rl_last_c_pos == 0 and
diff --git a/packaging/readline-5.2-007.patch b/packaging/readline-5.2-007.patch
new file mode 100644 (file)
index 0000000..6c2d0d1
--- /dev/null
@@ -0,0 +1,65 @@
+                          READLINE PATCH REPORT
+                          =====================
+
+Readline-Release: 5.2
+Patch-ID: readline52-007
+
+Bug-Reported-by:        Tom Bjorkholm <tom.bjorkholm@ericsson.com>
+Bug-Reference-ID:       <AEA1A32F001C6B4F98614B5B80D7647D01C075E9@esealmw115.eemea.ericsson.se>
+Bug-Reference-URL:     http://lists.gnu.org/archive/html/bug-readline/2007-04/msg00004.html
+
+
+Bug-Description:
+
+An off-by-one error in readline's input buffering caused readline to drop
+each 511th character of buffered input (e.g., when pasting a large amount
+of data into a terminal window).
+
+Patch:
+
+*** ../readline-5.2/input.c    Wed Aug 16 15:15:16 2006
+--- ./input.c  Tue Jul 17 09:24:21 2007
+***************
+*** 134,139 ****
+  
+    *key = ibuffer[pop_index++];
+! 
+    if (pop_index >= ibuffer_len)
+      pop_index = 0;
+  
+--- 134,142 ----
+  
+    *key = ibuffer[pop_index++];
+! #if 0
+    if (pop_index >= ibuffer_len)
++ #else
++   if (pop_index > ibuffer_len)
++ #endif
+      pop_index = 0;
+  
+***************
+*** 251,255 ****
+       {
+         k = (*rl_getc_function) (rl_instream);
+!        rl_stuff_char (k);
+         if (k == NEWLINE || k == RETURN)
+           break;
+--- 254,259 ----
+       {
+         k = (*rl_getc_function) (rl_instream);
+!        if (rl_stuff_char (k) == 0)
+!          break;                      /* some problem; no more room */
+         if (k == NEWLINE || k == RETURN)
+           break;
+***************
+*** 374,378 ****
+--- 378,386 ----
+      }
+    ibuffer[push_index++] = key;
++ #if 0
+    if (push_index >= ibuffer_len)
++ #else
++   if (push_index > ibuffer_len)
++ #endif
+      push_index = 0;
+  
diff --git a/packaging/readline-5.2-008.patch b/packaging/readline-5.2-008.patch
new file mode 100644 (file)
index 0000000..e6090e7
--- /dev/null
@@ -0,0 +1,70 @@
+                          READLINE PATCH REPORT
+                          =====================
+
+Readline-Release: 5.2
+Patch-ID: readline52-008
+
+Bug-Reported-by:       dAniel hAhler <ubuntu@thequod.de>
+Bug-Reference-ID:      <4702ED8A.5000503@thequod.de>
+Bug-Reference-URL:     https://bugs.launchpad.net/ubuntu/+source/bash/+bug/119938
+
+Bug-Description:
+
+When updating the display after displaying, for instance, a list of possible
+completions, readline will place the cursor at the wrong position if the
+prompt contains invisible characters and a newline.
+
+Patch:
+
+*** ../readline-5.2-patched/display.c  Mon Aug  6 14:26:29 2007
+--- ./display.c        Wed Oct 10 22:43:58 2007
+***************
+*** 1049,1053 ****
+             else
+               tx = nleft;
+!            if (_rl_last_c_pos > tx)
+               {
+                 _rl_backspace (_rl_last_c_pos - tx);  /* XXX */
+--- 1049,1053 ----
+             else
+               tx = nleft;
+!            if (tx >= 0 && _rl_last_c_pos > tx)
+               {
+                 _rl_backspace (_rl_last_c_pos - tx);  /* XXX */
+***************
+*** 1205,1209 ****
+  {
+    register char *ofd, *ols, *oe, *nfd, *nls, *ne;
+!   int temp, lendiff, wsatend, od, nd;
+    int current_invis_chars;
+    int col_lendiff, col_temp;
+--- 1205,1209 ----
+  {
+    register char *ofd, *ols, *oe, *nfd, *nls, *ne;
+!   int temp, lendiff, wsatend, od, nd, o_cpos;
+    int current_invis_chars;
+    int col_lendiff, col_temp;
+***************
+*** 1466,1469 ****
+--- 1466,1471 ----
+      }
+  
++   o_cpos = _rl_last_c_pos;
++ 
+    /* When this function returns, _rl_last_c_pos is correct, and an absolute
+       cursor postion in multibyte mode, but a buffer index when not in a
+***************
+*** 1475,1479 ****
+       invisible characters in the prompt string.  Let's see if setting this when
+       we make sure we're at the end of the drawn prompt string works. */
+!   if (current_line == 0 && MB_CUR_MAX > 1 && rl_byte_oriented == 0 && _rl_last_c_pos == prompt_physical_chars)
+      cpos_adjusted = 1;
+  #endif
+--- 1477,1483 ----
+       invisible characters in the prompt string.  Let's see if setting this when
+       we make sure we're at the end of the drawn prompt string works. */
+!   if (current_line == 0 && MB_CUR_MAX > 1 && rl_byte_oriented == 0 && 
+!       (_rl_last_c_pos > 0 || o_cpos > 0) &&
+!       _rl_last_c_pos == prompt_physical_chars)
+      cpos_adjusted = 1;
+  #endif
diff --git a/packaging/readline-5.2-009.patch b/packaging/readline-5.2-009.patch
new file mode 100644 (file)
index 0000000..acde75f
--- /dev/null
@@ -0,0 +1,45 @@
+                          READLINE PATCH REPORT
+                          =====================
+
+Readline-Release: 5.2
+Patch-ID: readline52-009
+
+Bug-Reported-by:       dAniel hAhler <ubuntu@thequod.de>
+Bug-Reference-ID:
+Bug-Reference-URL:
+
+Bug-Description:
+
+Under some circumstances, readline will incorrectly display a prompt string
+containing invisible characters after the final newline.
+
+Patch:
+
+*** ../readline-5.2-patched/display.c  2007-08-25 13:47:08.000000000 -0400
+--- ./display.c        2007-11-10 17:51:29.000000000 -0500
+***************
+*** 392,396 ****
+        local_prompt = expand_prompt (p, &prompt_visible_length,
+                                      &prompt_last_invisible,
+!                                     (int *)NULL,
+                                      &prompt_physical_chars);
+        c = *t; *t = '\0';
+--- 420,424 ----
+        local_prompt = expand_prompt (p, &prompt_visible_length,
+                                      &prompt_last_invisible,
+!                                     &prompt_invis_chars_first_line,
+                                      &prompt_physical_chars);
+        c = *t; *t = '\0';
+***************
+*** 399,403 ****
+        local_prompt_prefix = expand_prompt (prompt, &prompt_prefix_length,
+                                                  (int *)NULL,
+!                                                 &prompt_invis_chars_first_line,
+                                                  (int *)NULL);
+        *t = c;
+--- 427,431 ----
+        local_prompt_prefix = expand_prompt (prompt, &prompt_prefix_length,
+                                                  (int *)NULL,
+!                                                 (int *)NULL,
+                                                  (int *)NULL);
+        *t = c;
diff --git a/packaging/readline-5.2-010.patch b/packaging/readline-5.2-010.patch
new file mode 100644 (file)
index 0000000..a9595f2
--- /dev/null
@@ -0,0 +1,47 @@
+                          READLINE PATCH REPORT
+                          =====================
+
+Readline-Release: 5.2
+Patch-ID: readline52-010
+
+Bug-Reported-by:       Miroslav Lichvar <mlichvar@redhat.com>
+Bug-Reference-ID:      Fri, 02 Nov 2007 14:07:45 +0100
+Bug-Reference-URL:     http://lists.gnu.org/archive/html/bug-readline/2007-11/msg00000.html
+
+Bug-Description:
+
+In certain cases when outputting characters at the end of the line,
+e.g., when displaying the prompt string, readline positions the cursor
+incorrectly if the prompt string contains invisible characters and the
+text being drawn begins before the last invisible character in the line.
+
+Patch:
+
+*** ../readline-5.2-patched/display.c  2007-08-25 13:47:08.000000000 -0400
+--- ./display.c        2007-11-10 17:51:29.000000000 -0500
+***************
+*** 1566,1574 ****
+         else
+           {
+-            /* We have horizontal scrolling and we are not inserting at
+-               the end.  We have invisible characters in this line.  This
+-               is a dumb update. */
+             _rl_output_some_chars (nfd, temp);
+             _rl_last_c_pos += col_temp;
+             return;
+           }
+--- 1619,1632 ----
+         else
+           {
+             _rl_output_some_chars (nfd, temp);
+             _rl_last_c_pos += col_temp;
++            /* If nfd begins before any invisible characters in the prompt,
++               adjust _rl_last_c_pos to account for wrap_offset and set
++               cpos_adjusted to let the caller know. */
++            if (current_line == 0 && wrap_offset && ((nfd - new) <= prompt_last_invisible))
++              {
++                _rl_last_c_pos -= wrap_offset;
++                cpos_adjusted = 1;
++              }
+             return;
+           }
diff --git a/packaging/readline-5.2-011.patch b/packaging/readline-5.2-011.patch
new file mode 100644 (file)
index 0000000..963632e
--- /dev/null
@@ -0,0 +1,32 @@
+                          READLINE PATCH REPORT
+                          =====================
+
+Readline-Release: 5.2
+Patch-ID: readline52-011
+
+Bug-Reported-by:       Uwe Doering <gemini@geminix.org>
+Bug-Reference-ID:      <46F3DD72.2090801@geminix.org>
+Bug-Reference-URL:     http://lists.gnu.org/archive/html/bug-bash/2007-09/msg00102.html
+
+Bug-Description:
+
+There is an off-by-one error in the code that buffers characters received
+very quickly in succession, causing characters to be dropped.
+
+Patch:
+
+*** ../readline-5.2-patched/input.c    2007-08-25 13:47:10.000000000 -0400
+--- ./input.c  2007-10-12 22:55:25.000000000 -0400
+***************
+*** 155,159 ****
+        pop_index--;
+        if (pop_index < 0)
+!      pop_index = ibuffer_len - 1;
+        ibuffer[pop_index] = key;
+        return (1);
+--- 155,159 ----
+        pop_index--;
+        if (pop_index < 0)
+!      pop_index = ibuffer_len;
+        ibuffer[pop_index] = key;
+        return (1);
diff --git a/packaging/readline-5.2-012.patch b/packaging/readline-5.2-012.patch
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/packaging/readline-5.2-013.patch b/packaging/readline-5.2-013.patch
new file mode 100644 (file)
index 0000000..16e5049
--- /dev/null
@@ -0,0 +1,135 @@
+                          READLINE PATCH REPORT
+                          =====================
+
+Readline-Release: 5.2
+Patch-ID: readline52-013
+
+Bug-Reported-by:       slinkp <stuff@slinkp.com>
+Bug-Reference-ID:      <da52a26a-9f38-4861-a918-14d3482b539d@c65g2000hsa.googlegroups.com>
+Bug-Reference-URL:     http://lists.gnu.org/archive/html/bug-bash/2008-05/msg00085.html
+
+Bug-Description:
+
+The presence of invisible characters in a prompt longer than the screenwidth
+with invisible characters on the first and last prompt lines caused readline
+to place the cursor in the wrong physical location.
+
+Patch:
+
+*** ../readline-5.2-patched/display.c  2007-12-14 21:12:40.000000000 -0500
+--- ./display.c        2008-10-23 09:39:46.000000000 -0400
+***************
+*** 911,914 ****
+--- 944,951 ----
+            OFFSET (which has already been calculated above).  */
+  
++ #define INVIS_FIRST()        (prompt_physical_chars > _rl_screenwidth ? prompt_invis_chars_first_line : wrap_offset)
++ #define WRAP_OFFSET(line, offset)  ((line == 0) \
++                                      ? (offset ? INVIS_FIRST() : 0) \
++                                      : ((line == prompt_last_screen_line) ? wrap_offset-prompt_invis_chars_first_line : 0))
+  #define W_OFFSET(line, offset) ((line) == 0 ? offset : 0)
+  #define VIS_LLEN(l)  ((l) > _rl_vis_botlin ? 0 : (vis_lbreaks[l+1] - vis_lbreaks[l]))
+***************
+*** 945,949 ****
+                 _rl_last_c_pos > wrap_offset &&
+                 o_cpos < prompt_last_invisible)
+!              _rl_last_c_pos -= wrap_offset;
+                 
+             /* If this is the line with the prompt, we might need to
+--- 982,992 ----
+                 _rl_last_c_pos > wrap_offset &&
+                 o_cpos < prompt_last_invisible)
+!              _rl_last_c_pos -= prompt_invis_chars_first_line;        /* XXX - was wrap_offset */
+!            else if (linenum == prompt_last_screen_line && prompt_physical_chars > _rl_screenwidth &&
+!                      (MB_CUR_MAX > 1 && rl_byte_oriented == 0) &&
+!                      cpos_adjusted == 0 &&
+!                      _rl_last_c_pos != o_cpos &&
+!                      _rl_last_c_pos > (prompt_last_invisible - _rl_screenwidth - prompt_invis_chars_first_line))
+!              _rl_last_c_pos -= (wrap_offset-prompt_invis_chars_first_line);
+                 
+             /* If this is the line with the prompt, we might need to
+***************
+*** 1205,1209 ****
+  {
+    register char *ofd, *ols, *oe, *nfd, *nls, *ne;
+!   int temp, lendiff, wsatend, od, nd, o_cpos;
+    int current_invis_chars;
+    int col_lendiff, col_temp;
+--- 1264,1268 ----
+  {
+    register char *ofd, *ols, *oe, *nfd, *nls, *ne;
+!   int temp, lendiff, wsatend, od, nd, twidth, o_cpos;
+    int current_invis_chars;
+    int col_lendiff, col_temp;
+***************
+*** 1221,1225 ****
+      temp = _rl_last_c_pos;
+    else
+!     temp = _rl_last_c_pos - W_OFFSET(_rl_last_v_pos, visible_wrap_offset);
+    if (temp == _rl_screenwidth && _rl_term_autowrap && !_rl_horizontal_scroll_mode
+       && _rl_last_v_pos == current_line - 1)
+--- 1280,1284 ----
+      temp = _rl_last_c_pos;
+    else
+!     temp = _rl_last_c_pos - WRAP_OFFSET (_rl_last_v_pos, visible_wrap_offset);
+    if (temp == _rl_screenwidth && _rl_term_autowrap && !_rl_horizontal_scroll_mode
+       && _rl_last_v_pos == current_line - 1)
+***************
+*** 1587,1599 ****
+           {
+             _rl_output_some_chars (nfd + lendiff, temp - lendiff);
+- #if 1
+            /* XXX -- this bears closer inspection.  Fixes a redisplay bug
+               reported against bash-3.0-alpha by Andreas Schwab involving
+               multibyte characters and prompt strings with invisible
+               characters, but was previously disabled. */
+!            _rl_last_c_pos += _rl_col_width (nfd+lendiff, 0, temp-col_lendiff);
+! #else
+!            _rl_last_c_pos += _rl_col_width (nfd+lendiff, 0, temp-lendiff);
+! #endif
+           }
+       }
+--- 1648,1660 ----
+           {
+             _rl_output_some_chars (nfd + lendiff, temp - lendiff);
+            /* XXX -- this bears closer inspection.  Fixes a redisplay bug
+               reported against bash-3.0-alpha by Andreas Schwab involving
+               multibyte characters and prompt strings with invisible
+               characters, but was previously disabled. */
+!            if (MB_CUR_MAX > 1 && rl_byte_oriented == 0)
+!              twidth = _rl_col_width (nfd+lendiff, 0, temp-col_lendiff);
+!            else
+!              twidth = temp - lendiff;
+!            _rl_last_c_pos += twidth;
+           }
+       }
+***************
+*** 1789,1793 ****
+    int cpos, dpos;            /* current and desired cursor positions */
+  
+!   woff = W_OFFSET (_rl_last_v_pos, wrap_offset);
+    cpos = _rl_last_c_pos;
+  #if defined (HANDLE_MULTIBYTE)
+--- 1850,1854 ----
+    int cpos, dpos;            /* current and desired cursor positions */
+  
+!   woff = WRAP_OFFSET (_rl_last_v_pos, wrap_offset);
+    cpos = _rl_last_c_pos;
+  #if defined (HANDLE_MULTIBYTE)
+***************
+*** 1803,1807 ****
+        prompt string, since they're both buffer indices and DPOS is a
+        desired display position. */
+!       if (new > prompt_last_invisible)               /* XXX - don't use woff here */
+       {
+         dpos -= woff;
+--- 1864,1872 ----
+        prompt string, since they're both buffer indices and DPOS is a
+        desired display position. */
+!       if ((new > prompt_last_invisible) ||           /* XXX - don't use woff here */
+!        (prompt_physical_chars > _rl_screenwidth &&
+!         _rl_last_v_pos == prompt_last_screen_line &&
+!         wrap_offset != woff &&
+!         new > (prompt_last_invisible-_rl_screenwidth-wrap_offset)))
+       {
+         dpos -= woff;
diff --git a/packaging/readline-attribute.patch b/packaging/readline-attribute.patch
new file mode 100644 (file)
index 0000000..85ea964
--- /dev/null
@@ -0,0 +1,30 @@
+diff -urNad readline5-5.2~/readline.h readline5-5.2/readline.h
+--- readline5-5.2~/readline.h  2006-08-16 21:16:59.000000000 +0200
++++ readline5-5.2/readline.h   2006-10-28 14:03:36.000000000 +0200
+@@ -373,7 +373,7 @@
+ extern int rl_crlf PARAMS((void));
+ #if defined (USE_VARARGS) && defined (PREFER_STDARG)
+-extern int rl_message (const char *, ...)  __attribute__((__format__ (printf, 1, 2)));
++extern int rl_message (const char *, ...)  __rl_attribute__((__format__ (printf, 1, 2)));
+ #else
+ extern int rl_message ();
+ #endif
+diff -urNad readline5-5.2~/rlstdc.h readline5-5.2/rlstdc.h
+--- readline5-5.2~/rlstdc.h    2003-05-30 21:08:02.000000000 +0200
++++ readline5-5.2/rlstdc.h     2006-10-28 14:03:36.000000000 +0200
+@@ -36,10 +36,10 @@
+ #  endif
+ #endif
+-#ifndef __attribute__
+-#  if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 8)
+-#    define __attribute__(x)
+-#  endif
++#if defined(__GNUC__) && __GNUC__ >= 2
++#  define __rl_attribute__(x) __attribute__(x)
++#else
++#  define __rl_attribute__(x)
+ #endif
+ #endif /* !_RL_STDC_H_ */
diff --git a/packaging/readline-header.patch b/packaging/readline-header.patch
new file mode 100644 (file)
index 0000000..33e039e
--- /dev/null
@@ -0,0 +1,22 @@
+diff -urNad readline5-5.2~/history.h readline5-5.2/history.h
+--- readline5-5.2~/history.h   2003-07-31 14:38:44.000000000 +0200
++++ readline5-5.2/history.h    2006-10-28 14:06:20.000000000 +0200
+@@ -32,6 +32,7 @@
+ #  include "rlstdc.h"
+ #  include "rltypedefs.h"
+ #else
++#  include <stdio.h>
+ #  include <readline/rlstdc.h>
+ #  include <readline/rltypedefs.h>
+ #endif
+diff -urNad readline5-5.2~/readline.h readline5-5.2/readline.h
+--- readline5-5.2~/readline.h  2006-08-16 21:16:59.000000000 +0200
++++ readline5-5.2/readline.h   2006-10-28 14:06:20.000000000 +0200
+@@ -33,6 +33,7 @@
+ #  include "keymaps.h"
+ #  include "tilde.h"
+ #else
++#  include <stdio.h>
+ #  include <readline/rlstdc.h>
+ #  include <readline/rltypedefs.h>
+ #  include <readline/keymaps.h>
diff --git a/packaging/readline-no-cross-check.patch b/packaging/readline-no-cross-check.patch
new file mode 100644 (file)
index 0000000..0971cf9
--- /dev/null
@@ -0,0 +1,12 @@
+diff -urNad readline5-5.2~/configure readline5-5.2/configure
+--- readline5-5.2~/configure   2006-09-28 18:04:36.000000000 +0200
++++ readline5-5.2/configure    2006-10-28 14:20:05.000000000 +0200
+@@ -1938,7 +1938,7 @@
+ echo $ECHO_N "checking whether the C compiler works... $ECHO_C" >&6
+ # FIXME: These cross compiler hacks should be removed for Autoconf 3.0
+ # If not cross compiling, check that we can run a simple program.
+-if test "$cross_compiling" != yes; then
++if false && test "$cross_compiling" != yes; then
+   if { ac_try='./$ac_file'
+   { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+   (eval $ac_try) 2>&5
diff --git a/packaging/readline-no-rpath.patch b/packaging/readline-no-rpath.patch
new file mode 100644 (file)
index 0000000..12b1713
--- /dev/null
@@ -0,0 +1,12 @@
+diff -urNad readline5-5.2~/support/shobj-conf readline5-5.2/support/shobj-conf
+--- readline5-5.2~/support/shobj-conf  2006-04-11 15:15:43.000000000 +0200
++++ readline5-5.2/support/shobj-conf   2006-10-28 14:21:36.000000000 +0200
+@@ -110,7 +110,7 @@
+       SHOBJ_LD='${CC}'
+       SHOBJ_LDFLAGS='-shared -Wl,-soname,$@'
+-      SHLIB_XLDFLAGS='-Wl,-rpath,$(libdir) -Wl,-soname,`basename $@ $(SHLIB_MINOR)`'
++      SHLIB_XLDFLAGS='-Wl,-soname,`basename $@ $(SHLIB_MINOR)`'
+       SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)$(SHLIB_MINOR)'
+       ;;
diff --git a/packaging/readline.spec b/packaging/readline.spec
new file mode 100644 (file)
index 0000000..9af84c0
--- /dev/null
@@ -0,0 +1,131 @@
+Summary: A library for editing typed command lines
+Name: readline
+Version: 5.2
+Release: 13.24
+License: GPLv2+
+Group: System/Libraries
+URL: http://cnswww.cns.cwru.edu/php/chet/readline/rltop.html
+Source: ftp://ftp.gnu.org/gnu/readline/readline-%{version}.tar.gz
+
+Patch1: readline-5.2-001.patch
+Patch2: readline-5.2-002.patch
+Patch3: readline-5.2-003.patch
+Patch4: readline-5.2-004.patch
+Patch5: readline-5.2-005.patch
+Patch6: readline-5.2-006.patch
+Patch7: readline-5.2-007.patch
+Patch8: readline-5.2-008.patch
+Patch9: readline-5.2-009.patch
+Patch10: readline-5.2-010.patch
+Patch11: readline-5.2-011.patch
+Patch12: readline-5.2-012.patch
+Patch13: readline-5.2-013.patch
+Patch14: readline-attribute.patch
+Patch15: readline-header.patch
+Patch16: readline-no-cross-check.patch
+Patch17: readline-no-rpath.patch
+
+BuildRequires: ncurses-devel
+
+%description
+The Readline library provides a set of functions that allow users to
+edit command lines. Both Emacs and vi editing modes are available. The
+Readline library includes additional functions for maintaining a list
+of previously-entered command lines for recalling or editing those
+lines, and for performing csh-like history expansion on previous
+commands.
+
+%package devel
+Summary: Files needed to develop programs which use the readline library
+Group: Development/Libraries
+Requires: %{name} = %{version}-%{release}
+Requires: ncurses-devel
+
+%description devel
+The Readline library provides a set of functions that allow users to
+edit typed command lines. If you want to develop programs that will
+use the readline library, you need to have the readline-devel package
+installed. You also need to have the readline package installed.
+
+%package static
+Summary: Static libraries for the readline library
+Group: Development/Libraries
+Requires: %{name}-devel = %{version}-%{release}
+
+%description static
+The readline-static package contains the static version of the readline
+library.
+
+%prep
+%setup -q
+%patch1 -p1 -b .001
+%patch2 -p0 -b .002
+%patch3 -p0 -b .003
+%patch4 -p0 -b .004
+%patch5 -p0 -b .005
+%patch6 -p0 -b .006
+%patch7 -p0 -b .007
+%patch8 -p0 -b .008
+%patch9 -p0 -b .009
+%patch10 -p0 -b .010
+%patch11 -p0 -b .011
+%patch12 -p0 -b .012
+%patch13 -p1 -b .013
+%patch14 -p1 -b .attribute
+%patch15 -p1 -b .header
+%patch16 -p1 -b .no-cross-check
+%patch17 -p1 -b .no-rpath
+
+pushd examples
+rm -f rlfe/configure
+iconv -f iso8859-1 -t utf8 -o rl-fgets.c{_,}
+touch -r rl-fgets.c{,_}
+mv -f rl-fgets.c{_,}
+popd
+
+%build
+export CPPFLAGS="-I%{_includedir}/ncurses"
+%configure
+make %{?_smp_mflags}
+
+%install
+rm -rf $RPM_BUILD_ROOT
+
+make DESTDIR=$RPM_BUILD_ROOT install
+
+mkdir $RPM_BUILD_ROOT/%{_lib}
+mv $RPM_BUILD_ROOT%{_libdir}/libreadline.so.* $RPM_BUILD_ROOT/%{_lib}
+for l in $RPM_BUILD_ROOT%{_libdir}/libreadline.so; do
+    ln -sf $(echo %{_libdir} | \
+        sed 's,\(^/\|\)[^/][^/]*,..,g')/%{_lib}/$(readlink $l) $l
+done
+
+rm -f $RPM_BUILD_ROOT%{_infodir}/dir
+
+%clean
+rm -rf $RPM_BUILD_ROOT
+
+%post -p /sbin/ldconfig
+
+%postun -p /sbin/ldconfig
+
+
+%docs_package
+
+
+%files
+%defattr(-,root,root,-)
+%doc COPYING 
+/%{_lib}/libreadline*.so.*
+%{_libdir}/libhistory*.so.*
+
+%files devel
+%defattr(-,root,root,-)
+%doc examples/*.c examples/*.h examples/rlfe
+%{_includedir}/readline
+%{_libdir}/lib*.so
+
+%files static
+%defattr(-,root,root,-)
+%{_libdir}/lib*.a
+
diff --git a/parens.c b/parens.c
new file mode 100644 (file)
index 0000000..737f767
--- /dev/null
+++ b/parens.c
@@ -0,0 +1,183 @@
+/* parens.c -- Implementation of matching parentheses feature. */
+
+/* Copyright (C) 1987, 1989, 1992 Free Software Foundation, Inc.
+
+   This file is part of the GNU Readline Library, a library for
+   reading lines of text with interactive input and history editing.
+
+   The GNU Readline Library 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.
+
+   The GNU Readline Library is distributed in the hope that it will be
+   useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+   of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   The GNU General Public License is often shipped with GNU software, and
+   is generally kept in a file called COPYING or LICENSE.  If you do not
+   have a copy of the license, write to the Free Software Foundation,
+   59 Temple Place, Suite 330, Boston, MA 02111 USA. */
+#define READLINE_LIBRARY
+
+#if defined (__TANDEM)
+#  include <floss.h>
+#endif
+
+#include "rlconf.h"
+
+#if defined (HAVE_CONFIG_H)
+#  include <config.h>
+#endif
+
+#include <stdio.h>
+#include <sys/types.h>
+
+#if defined (HAVE_UNISTD_H)
+#  include <unistd.h>
+#endif
+
+#if defined (FD_SET) && !defined (HAVE_SELECT)
+#  define HAVE_SELECT
+#endif
+
+#if defined (HAVE_SELECT)
+#  include <sys/time.h>
+#endif /* HAVE_SELECT */
+#if defined (HAVE_SYS_SELECT_H)
+#  include <sys/select.h>
+#endif
+
+#if defined (HAVE_STRING_H)
+#  include <string.h>
+#else /* !HAVE_STRING_H */
+#  include <strings.h>
+#endif /* !HAVE_STRING_H */
+
+#if !defined (strchr) && !defined (__STDC__)
+extern char *strchr (), *strrchr ();
+#endif /* !strchr && !__STDC__ */
+
+#include "readline.h"
+#include "rlprivate.h"
+
+static int find_matching_open PARAMS((char *, int, int));
+
+/* Non-zero means try to blink the matching open parenthesis when the
+   close parenthesis is inserted. */
+#if defined (HAVE_SELECT)
+int rl_blink_matching_paren = 1;
+#else /* !HAVE_SELECT */
+int rl_blink_matching_paren = 0;
+#endif /* !HAVE_SELECT */
+
+static int _paren_blink_usec = 500000;
+
+/* Change emacs_standard_keymap to have bindings for paren matching when
+   ON_OR_OFF is 1, change them back to self_insert when ON_OR_OFF == 0. */
+void
+_rl_enable_paren_matching (on_or_off)
+     int on_or_off;
+{
+  if (on_or_off)
+    {  /* ([{ */
+      rl_bind_key_in_map (')', rl_insert_close, emacs_standard_keymap);
+      rl_bind_key_in_map (']', rl_insert_close, emacs_standard_keymap);
+      rl_bind_key_in_map ('}', rl_insert_close, emacs_standard_keymap);
+    }
+  else
+    {  /* ([{ */
+      rl_bind_key_in_map (')', rl_insert, emacs_standard_keymap);
+      rl_bind_key_in_map (']', rl_insert, emacs_standard_keymap);
+      rl_bind_key_in_map ('}', rl_insert, emacs_standard_keymap);
+    }
+}
+
+int
+rl_set_paren_blink_timeout (u)
+     int u;
+{
+  int o;
+
+  o = _paren_blink_usec;
+  if (u > 0)
+    _paren_blink_usec = u;
+  return (o);
+}
+
+int
+rl_insert_close (count, invoking_key)
+     int count, invoking_key;
+{
+  if (rl_explicit_arg || !rl_blink_matching_paren)
+    _rl_insert_char (count, invoking_key);
+  else
+    {
+#if defined (HAVE_SELECT)
+      int orig_point, match_point, ready;
+      struct timeval timer;
+      fd_set readfds;
+
+      _rl_insert_char (1, invoking_key);
+      (*rl_redisplay_function) ();
+      match_point =
+       find_matching_open (rl_line_buffer, rl_point - 2, invoking_key);
+
+      /* Emacs might message or ring the bell here, but I don't. */
+      if (match_point < 0)
+       return -1;
+
+      FD_ZERO (&readfds);
+      FD_SET (fileno (rl_instream), &readfds);
+      timer.tv_sec = 0;
+      timer.tv_usec = _paren_blink_usec;
+
+      orig_point = rl_point;
+      rl_point = match_point;
+      (*rl_redisplay_function) ();
+      ready = select (1, &readfds, (fd_set *)NULL, (fd_set *)NULL, &timer);
+      rl_point = orig_point;
+#else /* !HAVE_SELECT */
+      _rl_insert_char (count, invoking_key);
+#endif /* !HAVE_SELECT */
+    }
+  return 0;
+}
+
+static int
+find_matching_open (string, from, closer)
+     char *string;
+     int from, closer;
+{
+  register int i;
+  int opener, level, delimiter;
+
+  switch (closer)
+    {
+    case ']': opener = '['; break;
+    case '}': opener = '{'; break;
+    case ')': opener = '('; break;
+    default:
+      return (-1);
+    }
+
+  level = 1;                   /* The closer passed in counts as 1. */
+  delimiter = 0;               /* Delimited state unknown. */
+
+  for (i = from; i > -1; i--)
+    {
+      if (delimiter && (string[i] == delimiter))
+       delimiter = 0;
+      else if (rl_basic_quote_characters && strchr (rl_basic_quote_characters, string[i]))
+       delimiter = string[i];
+      else if (!delimiter && (string[i] == closer))
+       level++;
+      else if (!delimiter && (string[i] == opener))
+       level--;
+
+      if (!level)
+       break;
+    }
+  return (i);
+}
diff --git a/posixdir.h b/posixdir.h
new file mode 100644 (file)
index 0000000..91f6d96
--- /dev/null
@@ -0,0 +1,61 @@
+/* posixdir.h -- Posix directory reading includes and defines. */
+
+/* Copyright (C) 1987,1991 Free Software Foundation, Inc.
+
+   This file is part of GNU Bash, the Bourne Again SHell.
+
+   Bash 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.
+
+   Bash 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 Bash; see the file COPYING.  If not, write to the Free
+   Software Foundation, 59 Temple Place, Suite 330, Boston, MA 02111 USA. */
+
+/* This file should be included instead of <dirent.h> or <sys/dir.h>. */
+
+#if !defined (_POSIXDIR_H_)
+#define _POSIXDIR_H_
+
+#if defined (HAVE_DIRENT_H)
+#  include <dirent.h>
+#  if defined (HAVE_STRUCT_DIRENT_D_NAMLEN)
+#    define D_NAMLEN(d)        ((d)->d_namlen)
+#  else
+#    define D_NAMLEN(d)   (strlen ((d)->d_name))
+#  endif /* !HAVE_STRUCT_DIRENT_D_NAMLEN */
+#else
+#  if defined (HAVE_SYS_NDIR_H)
+#    include <sys/ndir.h>
+#  endif
+#  if defined (HAVE_SYS_DIR_H)
+#    include <sys/dir.h>
+#  endif
+#  if defined (HAVE_NDIR_H)
+#    include <ndir.h>
+#  endif
+#  if !defined (dirent)
+#    define dirent direct
+#  endif /* !dirent */
+#  define D_NAMLEN(d)   ((d)->d_namlen)
+#endif /* !HAVE_DIRENT_H */
+
+#if defined (HAVE_STRUCT_DIRENT_D_INO) && !defined (HAVE_STRUCT_DIRENT_D_FILENO)
+#  define d_fileno d_ino
+#endif
+
+#if defined (_POSIX_SOURCE) && (!defined (HAVE_STRUCT_DIRENT_D_INO) || defined (BROKEN_DIRENT_D_INO))
+/* Posix does not require that the d_ino field be present, and some
+   systems do not provide it. */
+#  define REAL_DIR_ENTRY(dp) 1
+#else
+#  define REAL_DIR_ENTRY(dp) (dp->d_ino != 0)
+#endif /* _POSIX_SOURCE */
+
+#endif /* !_POSIXDIR_H_ */
diff --git a/posixjmp.h b/posixjmp.h
new file mode 100644 (file)
index 0000000..b52aa00
--- /dev/null
@@ -0,0 +1,40 @@
+/* posixjmp.h -- wrapper for setjmp.h with changes for POSIX systems. */
+
+/* Copyright (C) 1987,1991 Free Software Foundation, Inc.
+
+   This file is part of GNU Bash, the Bourne Again SHell.
+
+   Bash 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.
+
+   Bash 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 Bash; see the file COPYING.  If not, write to the Free
+   Software Foundation, 59 Temple Place, Suite 330, Boston, MA 02111 USA. */
+
+#ifndef _POSIXJMP_H_
+#define _POSIXJMP_H_
+
+#include <setjmp.h>
+
+/* This *must* be included *after* config.h */
+
+#if defined (HAVE_POSIX_SIGSETJMP)
+#  define procenv_t    sigjmp_buf
+#  if !defined (__OPENNT)
+#    undef setjmp
+#    define setjmp(x)  sigsetjmp((x), 1)
+#    undef longjmp
+#    define longjmp(x, n)      siglongjmp((x), (n))
+#  endif /* !__OPENNT */
+#else
+#  define procenv_t    jmp_buf
+#endif
+
+#endif /* _POSIXJMP_H_ */
diff --git a/posixstat.h b/posixstat.h
new file mode 100644 (file)
index 0000000..c93b528
--- /dev/null
@@ -0,0 +1,142 @@
+/* posixstat.h -- Posix stat(2) definitions for systems that
+   don't have them. */
+
+/* Copyright (C) 1987,1991 Free Software Foundation, Inc.
+
+   This file is part of GNU Bash, the Bourne Again SHell.
+
+   Bash 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.
+
+   Bash 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 Bash; see the file COPYING.  If not, write to the Free
+   Software Foundation, 59 Temple Place, Suite 330, Boston, MA 02111 USA. */
+
+/* This file should be included instead of <sys/stat.h>.
+   It relies on the local sys/stat.h to work though. */
+#if !defined (_POSIXSTAT_H_)
+#define _POSIXSTAT_H_
+
+#include <sys/stat.h>
+
+#if defined (STAT_MACROS_BROKEN)
+#  undef S_ISBLK
+#  undef S_ISCHR
+#  undef S_ISDIR
+#  undef S_ISFIFO
+#  undef S_ISREG
+#  undef S_ISLNK
+#endif /* STAT_MACROS_BROKEN */
+
+/* These are guaranteed to work only on isc386 */
+#if !defined (S_IFDIR) && !defined (S_ISDIR)
+#  define S_IFDIR 0040000
+#endif /* !S_IFDIR && !S_ISDIR */
+#if !defined (S_IFMT)
+#  define S_IFMT  0170000
+#endif /* !S_IFMT */
+
+/* Posix 1003.1 5.6.1.1 <sys/stat.h> file types */
+
+/* Some Posix-wannabe systems define _S_IF* macros instead of S_IF*, but
+   do not provide the S_IS* macros that Posix requires. */
+
+#if defined (_S_IFMT) && !defined (S_IFMT)
+#define S_IFMT _S_IFMT
+#endif
+#if defined (_S_IFIFO) && !defined (S_IFIFO)
+#define S_IFIFO _S_IFIFO
+#endif
+#if defined (_S_IFCHR) && !defined (S_IFCHR)
+#define S_IFCHR _S_IFCHR
+#endif
+#if defined (_S_IFDIR) && !defined (S_IFDIR)
+#define S_IFDIR _S_IFDIR
+#endif
+#if defined (_S_IFBLK) && !defined (S_IFBLK)
+#define S_IFBLK _S_IFBLK
+#endif
+#if defined (_S_IFREG) && !defined (S_IFREG)
+#define S_IFREG _S_IFREG
+#endif
+#if defined (_S_IFLNK) && !defined (S_IFLNK)
+#define S_IFLNK _S_IFLNK
+#endif
+#if defined (_S_IFSOCK) && !defined (S_IFSOCK)
+#define S_IFSOCK _S_IFSOCK
+#endif
+
+/* Test for each symbol individually and define the ones necessary (some
+   systems claiming Posix compatibility define some but not all). */
+
+#if defined (S_IFBLK) && !defined (S_ISBLK)
+#define        S_ISBLK(m)      (((m)&S_IFMT) == S_IFBLK)       /* block device */
+#endif
+
+#if defined (S_IFCHR) && !defined (S_ISCHR)
+#define        S_ISCHR(m)      (((m)&S_IFMT) == S_IFCHR)       /* character device */
+#endif
+
+#if defined (S_IFDIR) && !defined (S_ISDIR)
+#define        S_ISDIR(m)      (((m)&S_IFMT) == S_IFDIR)       /* directory */
+#endif
+
+#if defined (S_IFREG) && !defined (S_ISREG)
+#define        S_ISREG(m)      (((m)&S_IFMT) == S_IFREG)       /* file */
+#endif
+
+#if defined (S_IFIFO) && !defined (S_ISFIFO)
+#define        S_ISFIFO(m)     (((m)&S_IFMT) == S_IFIFO)       /* fifo - named pipe */
+#endif
+
+#if defined (S_IFLNK) && !defined (S_ISLNK)
+#define        S_ISLNK(m)      (((m)&S_IFMT) == S_IFLNK)       /* symbolic link */
+#endif
+
+#if defined (S_IFSOCK) && !defined (S_ISSOCK)
+#define        S_ISSOCK(m)     (((m)&S_IFMT) == S_IFSOCK)      /* socket */
+#endif
+
+/*
+ * POSIX 1003.1 5.6.1.2 <sys/stat.h> File Modes
+ */
+
+#if !defined (S_IRWXU)
+#  if !defined (S_IREAD)
+#    define S_IREAD    00400
+#    define S_IWRITE   00200
+#    define S_IEXEC    00100
+#  endif /* S_IREAD */
+
+#  if !defined (S_IRUSR)
+#    define S_IRUSR    S_IREAD                 /* read, owner */
+#    define S_IWUSR    S_IWRITE                /* write, owner */
+#    define S_IXUSR    S_IEXEC                 /* execute, owner */
+
+#    define S_IRGRP    (S_IREAD  >> 3)         /* read, group */
+#    define S_IWGRP    (S_IWRITE >> 3)         /* write, group */
+#    define S_IXGRP    (S_IEXEC  >> 3)         /* execute, group */
+
+#    define S_IROTH    (S_IREAD  >> 6)         /* read, other */
+#    define S_IWOTH    (S_IWRITE >> 6)         /* write, other */
+#    define S_IXOTH    (S_IEXEC  >> 6)         /* execute, other */
+#  endif /* !S_IRUSR */
+
+#  define S_IRWXU      (S_IRUSR | S_IWUSR | S_IXUSR)
+#  define S_IRWXG      (S_IRGRP | S_IWGRP | S_IXGRP)
+#  define S_IRWXO      (S_IROTH | S_IWOTH | S_IXOTH)
+#endif /* !S_IRWXU */
+
+/* These are non-standard, but are used in builtins.c$symbolic_umask() */
+#define S_IRUGO                (S_IRUSR | S_IRGRP | S_IROTH)
+#define S_IWUGO                (S_IWUSR | S_IWGRP | S_IWOTH)
+#define S_IXUGO                (S_IXUSR | S_IXGRP | S_IXOTH)
+
+#endif /* _POSIXSTAT_H_ */
diff --git a/readline.c b/readline.c
new file mode 100644 (file)
index 0000000..c2b7400
--- /dev/null
@@ -0,0 +1,1214 @@
+/* readline.c -- a general facility for reading lines of input
+   with emacs style editing and completion. */
+
+/* Copyright (C) 1987-2005 Free Software Foundation, Inc.
+
+   This file is part of the GNU Readline Library, a library for
+   reading lines of text with interactive input and history editing.
+
+   The GNU Readline Library 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.
+
+   The GNU Readline Library is distributed in the hope that it will be
+   useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+   of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   The GNU General Public License is often shipped with GNU software, and
+   is generally kept in a file called COPYING or LICENSE.  If you do not
+   have a copy of the license, write to the Free Software Foundation,
+   59 Temple Place, Suite 330, Boston, MA 02111 USA. */
+#define READLINE_LIBRARY
+
+#if defined (HAVE_CONFIG_H)
+#  include <config.h>
+#endif
+
+#include <sys/types.h>
+#include "posixstat.h"
+#include <fcntl.h>
+#if defined (HAVE_SYS_FILE_H)
+#  include <sys/file.h>
+#endif /* HAVE_SYS_FILE_H */
+
+#if defined (HAVE_UNISTD_H)
+#  include <unistd.h>
+#endif /* HAVE_UNISTD_H */
+
+#if defined (HAVE_STDLIB_H)
+#  include <stdlib.h>
+#else
+#  include "ansi_stdlib.h"
+#endif /* HAVE_STDLIB_H */
+
+#if defined (HAVE_LOCALE_H)
+#  include <locale.h>
+#endif
+
+#include <stdio.h>
+#include "posixjmp.h"
+#include <errno.h>
+
+#if !defined (errno)
+extern int errno;
+#endif /* !errno */
+
+/* System-specific feature definitions and include files. */
+#include "rldefs.h"
+#include "rlmbutil.h"
+
+#if defined (__EMX__)
+#  define INCL_DOSPROCESS
+#  include <os2.h>
+#endif /* __EMX__ */
+
+/* Some standard library routines. */
+#include "readline.h"
+#include "history.h"
+
+#include "rlprivate.h"
+#include "rlshell.h"
+#include "xmalloc.h"
+
+#ifndef RL_LIBRARY_VERSION
+#  define RL_LIBRARY_VERSION "5.1"
+#endif
+
+#ifndef RL_READLINE_VERSION
+#  define RL_READLINE_VERSION  0x0501
+#endif
+
+extern void _rl_free_history_entry PARAMS((HIST_ENTRY *));
+
+/* Forward declarations used in this file. */
+static char *readline_internal PARAMS((void));
+static void readline_initialize_everything PARAMS((void));
+
+static void bind_arrow_keys_internal PARAMS((Keymap));
+static void bind_arrow_keys PARAMS((void));
+
+static void readline_default_bindings PARAMS((void));
+static void reset_default_bindings PARAMS((void));
+
+static int _rl_subseq_result PARAMS((int, Keymap, int, int));
+static int _rl_subseq_getchar PARAMS((int));
+
+/* **************************************************************** */
+/*                                                                 */
+/*                     Line editing input utility                  */
+/*                                                                 */
+/* **************************************************************** */
+
+const char *rl_library_version = RL_LIBRARY_VERSION;
+
+int rl_readline_version = RL_READLINE_VERSION;
+
+/* True if this is `real' readline as opposed to some stub substitute. */
+int rl_gnu_readline_p = 1;
+
+/* A pointer to the keymap that is currently in use.
+   By default, it is the standard emacs keymap. */
+Keymap _rl_keymap = emacs_standard_keymap;
+
+
+/* The current style of editing. */
+int rl_editing_mode = emacs_mode;
+
+/* The current insert mode:  input (the default) or overwrite */
+int rl_insert_mode = RL_IM_DEFAULT;
+
+/* Non-zero if we called this function from _rl_dispatch().  It's present
+   so functions can find out whether they were called from a key binding
+   or directly from an application. */
+int rl_dispatching;
+
+/* Non-zero if the previous command was a kill command. */
+int _rl_last_command_was_kill = 0;
+
+/* The current value of the numeric argument specified by the user. */
+int rl_numeric_arg = 1;
+
+/* Non-zero if an argument was typed. */
+int rl_explicit_arg = 0;
+
+/* Temporary value used while generating the argument. */
+int rl_arg_sign = 1;
+
+/* Non-zero means we have been called at least once before. */
+static int rl_initialized;
+
+#if 0
+/* If non-zero, this program is running in an EMACS buffer. */
+static int running_in_emacs;
+#endif
+
+/* Flags word encapsulating the current readline state. */
+int rl_readline_state = RL_STATE_NONE;
+
+/* The current offset in the current input line. */
+int rl_point;
+
+/* Mark in the current input line. */
+int rl_mark;
+
+/* Length of the current input line. */
+int rl_end;
+
+/* Make this non-zero to return the current input_line. */
+int rl_done;
+
+/* The last function executed by readline. */
+rl_command_func_t *rl_last_func = (rl_command_func_t *)NULL;
+
+/* Top level environment for readline_internal (). */
+procenv_t readline_top_level;
+
+/* The streams we interact with. */
+FILE *_rl_in_stream, *_rl_out_stream;
+
+/* The names of the streams that we do input and output to. */
+FILE *rl_instream = (FILE *)NULL;
+FILE *rl_outstream = (FILE *)NULL;
+
+/* Non-zero means echo characters as they are read.  Defaults to no echo;
+   set to 1 if there is a controlling terminal, we can get its attributes,
+   and the attributes include `echo'.  Look at rltty.c:prepare_terminal_settings
+   for the code that sets it. */
+int readline_echoing_p = 0;
+
+/* Current prompt. */
+char *rl_prompt = (char *)NULL;
+int rl_visible_prompt_length = 0;
+
+/* Set to non-zero by calling application if it has already printed rl_prompt
+   and does not want readline to do it the first time. */
+int rl_already_prompted = 0;
+
+/* The number of characters read in order to type this complete command. */
+int rl_key_sequence_length = 0;
+
+/* If non-zero, then this is the address of a function to call just
+   before readline_internal_setup () prints the first prompt. */
+rl_hook_func_t *rl_startup_hook = (rl_hook_func_t *)NULL;
+
+/* If non-zero, this is the address of a function to call just before
+   readline_internal_setup () returns and readline_internal starts
+   reading input characters. */
+rl_hook_func_t *rl_pre_input_hook = (rl_hook_func_t *)NULL;
+
+/* What we use internally.  You should always refer to RL_LINE_BUFFER. */
+static char *the_line;
+
+/* The character that can generate an EOF.  Really read from
+   the terminal driver... just defaulted here. */
+int _rl_eof_char = CTRL ('D');
+
+/* Non-zero makes this the next keystroke to read. */
+int rl_pending_input = 0;
+
+/* Pointer to a useful terminal name. */
+const char *rl_terminal_name = (const char *)NULL;
+
+/* Non-zero means to always use horizontal scrolling in line display. */
+int _rl_horizontal_scroll_mode = 0;
+
+/* Non-zero means to display an asterisk at the starts of history lines
+   which have been modified. */
+int _rl_mark_modified_lines = 0;  
+
+/* The style of `bell' notification preferred.  This can be set to NO_BELL,
+   AUDIBLE_BELL, or VISIBLE_BELL. */
+int _rl_bell_preference = AUDIBLE_BELL;
+     
+/* String inserted into the line by rl_insert_comment (). */
+char *_rl_comment_begin;
+
+/* Keymap holding the function currently being executed. */
+Keymap rl_executing_keymap;
+
+/* Keymap we're currently using to dispatch. */
+Keymap _rl_dispatching_keymap;
+
+/* Non-zero means to erase entire line, including prompt, on empty input lines. */
+int rl_erase_empty_line = 0;
+
+/* Non-zero means to read only this many characters rather than up to a
+   character bound to accept-line. */
+int rl_num_chars_to_read;
+
+/* Line buffer and maintenence. */
+char *rl_line_buffer = (char *)NULL;
+int rl_line_buffer_len = 0;
+
+/* Key sequence `contexts' */
+_rl_keyseq_cxt *_rl_kscxt = 0;
+
+/* Forward declarations used by the display, termcap, and history code. */
+
+/* **************************************************************** */
+/*                                                                 */
+/*                     `Forward' declarations                      */
+/*                                                                 */
+/* **************************************************************** */
+
+/* Non-zero means do not parse any lines other than comments and
+   parser directives. */
+unsigned char _rl_parsing_conditionalized_out = 0;
+
+/* Non-zero means to convert characters with the meta bit set to
+   escape-prefixed characters so we can indirect through
+   emacs_meta_keymap or vi_escape_keymap. */
+int _rl_convert_meta_chars_to_ascii = 1;
+
+/* Non-zero means to output characters with the meta bit set directly
+   rather than as a meta-prefixed escape sequence. */
+int _rl_output_meta_chars = 0;
+
+/* Non-zero means to look at the termios special characters and bind
+   them to equivalent readline functions at startup. */
+int _rl_bind_stty_chars = 1;
+
+/* **************************************************************** */
+/*                                                                 */
+/*                     Top Level Functions                         */
+/*                                                                 */
+/* **************************************************************** */
+
+/* Non-zero means treat 0200 bit in terminal input as Meta bit. */
+int _rl_meta_flag = 0; /* Forward declaration */
+
+/* Set up the prompt and expand it.  Called from readline() and
+   rl_callback_handler_install (). */
+int
+rl_set_prompt (prompt)
+     const char *prompt;
+{
+  FREE (rl_prompt);
+  rl_prompt = prompt ? savestring (prompt) : (char *)NULL;
+  rl_display_prompt = rl_prompt ? rl_prompt : "";
+
+  rl_visible_prompt_length = rl_expand_prompt (rl_prompt);
+  return 0;
+}
+  
+/* Read a line of input.  Prompt with PROMPT.  An empty PROMPT means
+   none.  A return value of NULL means that EOF was encountered. */
+char *
+readline (prompt)
+     const char *prompt;
+{
+  char *value;
+
+  /* If we are at EOF return a NULL string. */
+  if (rl_pending_input == EOF)
+    {
+      rl_clear_pending_input ();
+      return ((char *)NULL);
+    }
+
+  rl_set_prompt (prompt);
+
+  rl_initialize ();
+  if (rl_prep_term_function)
+    (*rl_prep_term_function) (_rl_meta_flag);
+
+#if defined (HANDLE_SIGNALS)
+  rl_set_signals ();
+#endif
+
+  value = readline_internal ();
+  if (rl_deprep_term_function)
+    (*rl_deprep_term_function) ();
+
+#if defined (HANDLE_SIGNALS)
+  rl_clear_signals ();
+#endif
+
+  return (value);
+}
+
+#if defined (READLINE_CALLBACKS)
+#  define STATIC_CALLBACK
+#else
+#  define STATIC_CALLBACK static
+#endif
+
+STATIC_CALLBACK void
+readline_internal_setup ()
+{
+  char *nprompt;
+
+  _rl_in_stream = rl_instream;
+  _rl_out_stream = rl_outstream;
+
+  if (rl_startup_hook)
+    (*rl_startup_hook) ();
+
+  /* If we're not echoing, we still want to at least print a prompt, because
+     rl_redisplay will not do it for us.  If the calling application has a
+     custom redisplay function, though, let that function handle it. */
+  if (readline_echoing_p == 0 && rl_redisplay_function == rl_redisplay)
+    {
+      if (rl_prompt && rl_already_prompted == 0)
+       {
+         nprompt = _rl_strip_prompt (rl_prompt);
+         fprintf (_rl_out_stream, "%s", nprompt);
+         fflush (_rl_out_stream);
+         free (nprompt);
+       }
+    }
+  else
+    {
+      if (rl_prompt && rl_already_prompted)
+       rl_on_new_line_with_prompt ();
+      else
+       rl_on_new_line ();
+      (*rl_redisplay_function) ();
+    }
+
+#if defined (VI_MODE)
+  if (rl_editing_mode == vi_mode)
+    rl_vi_insertion_mode (1, 'i');
+#endif /* VI_MODE */
+
+  if (rl_pre_input_hook)
+    (*rl_pre_input_hook) ();
+}
+
+STATIC_CALLBACK char *
+readline_internal_teardown (eof)
+     int eof;
+{
+  char *temp;
+  HIST_ENTRY *entry;
+
+  /* Restore the original of this history line, iff the line that we
+     are editing was originally in the history, AND the line has changed. */
+  entry = current_history ();
+
+  if (entry && rl_undo_list)
+    {
+      temp = savestring (the_line);
+      rl_revert_line (1, 0);
+      entry = replace_history_entry (where_history (), the_line, (histdata_t)NULL);
+      _rl_free_history_entry (entry);
+
+      strcpy (the_line, temp);
+      free (temp);
+    }
+
+  /* At any rate, it is highly likely that this line has an undo list.  Get
+     rid of it now. */
+  if (rl_undo_list)
+    rl_free_undo_list ();
+
+  /* Restore normal cursor, if available. */
+  _rl_set_insert_mode (RL_IM_INSERT, 0);
+
+  return (eof ? (char *)NULL : savestring (the_line));
+}
+
+void
+_rl_internal_char_cleanup ()
+{
+#if defined (VI_MODE)
+  /* In vi mode, when you exit insert mode, the cursor moves back
+     over the previous character.  We explicitly check for that here. */
+  if (rl_editing_mode == vi_mode && _rl_keymap == vi_movement_keymap)
+    rl_vi_check ();
+#endif /* VI_MODE */
+
+  if (rl_num_chars_to_read && rl_end >= rl_num_chars_to_read)
+    {
+      (*rl_redisplay_function) ();
+      _rl_want_redisplay = 0;
+      rl_newline (1, '\n');
+    }
+
+  if (rl_done == 0)
+    {
+      (*rl_redisplay_function) ();
+      _rl_want_redisplay = 0;
+    }
+
+  /* If the application writer has told us to erase the entire line if
+     the only character typed was something bound to rl_newline, do so. */
+  if (rl_erase_empty_line && rl_done && rl_last_func == rl_newline &&
+      rl_point == 0 && rl_end == 0)
+    _rl_erase_entire_line ();
+}
+
+STATIC_CALLBACK int
+#if defined (READLINE_CALLBACKS)
+readline_internal_char ()
+#else
+readline_internal_charloop ()
+#endif
+{
+  static int lastc, eof_found;
+  int c, code, lk;
+
+  lastc = -1;
+  eof_found = 0;
+
+#if !defined (READLINE_CALLBACKS)
+  while (rl_done == 0)
+    {
+#endif
+      lk = _rl_last_command_was_kill;
+
+      code = setjmp (readline_top_level);
+
+      if (code)
+       {
+         (*rl_redisplay_function) ();
+         _rl_want_redisplay = 0;
+         /* If we get here, we're not being called from something dispatched
+            from _rl_callback_read_char(), which sets up its own value of
+            readline_top_level (saving and restoring the old, of course), so
+            we can just return here. */
+         if (RL_ISSTATE (RL_STATE_CALLBACK))
+           return (0);
+       }
+
+      if (rl_pending_input == 0)
+       {
+         /* Then initialize the argument and number of keys read. */
+         _rl_reset_argument ();
+         rl_key_sequence_length = 0;
+       }
+
+      RL_SETSTATE(RL_STATE_READCMD);
+      c = rl_read_key ();
+      RL_UNSETSTATE(RL_STATE_READCMD);
+
+      /* look at input.c:rl_getc() for the circumstances under which this will
+        be returned; punt immediately on read error without converting it to
+        a newline. */
+      if (c == READERR)
+       {
+#if defined (READLINE_CALLBACKS)
+         RL_SETSTATE(RL_STATE_DONE);
+         return (rl_done = 1);
+#else
+         eof_found = 1;
+         break;
+#endif
+       }
+
+      /* EOF typed to a non-blank line is a <NL>. */
+      if (c == EOF && rl_end)
+       c = NEWLINE;
+
+      /* The character _rl_eof_char typed to blank line, and not as the
+        previous character is interpreted as EOF. */
+      if (((c == _rl_eof_char && lastc != c) || c == EOF) && !rl_end)
+       {
+#if defined (READLINE_CALLBACKS)
+         RL_SETSTATE(RL_STATE_DONE);
+         return (rl_done = 1);
+#else
+         eof_found = 1;
+         break;
+#endif
+       }
+
+      lastc = c;
+      _rl_dispatch ((unsigned char)c, _rl_keymap);
+
+      /* If there was no change in _rl_last_command_was_kill, then no kill
+        has taken place.  Note that if input is pending we are reading
+        a prefix command, so nothing has changed yet. */
+      if (rl_pending_input == 0 && lk == _rl_last_command_was_kill)
+       _rl_last_command_was_kill = 0;
+
+      _rl_internal_char_cleanup ();
+
+#if defined (READLINE_CALLBACKS)
+      return 0;
+#else
+    }
+
+  return (eof_found);
+#endif
+}
+
+#if defined (READLINE_CALLBACKS)
+static int
+readline_internal_charloop ()
+{
+  int eof = 1;
+
+  while (rl_done == 0)
+    eof = readline_internal_char ();
+  return (eof);
+}
+#endif /* READLINE_CALLBACKS */
+
+/* Read a line of input from the global rl_instream, doing output on
+   the global rl_outstream.
+   If rl_prompt is non-null, then that is our prompt. */
+static char *
+readline_internal ()
+{
+  int eof;
+
+  readline_internal_setup ();
+  eof = readline_internal_charloop ();
+  return (readline_internal_teardown (eof));
+}
+
+void
+_rl_init_line_state ()
+{
+  rl_point = rl_end = rl_mark = 0;
+  the_line = rl_line_buffer;
+  the_line[0] = 0;
+}
+
+void
+_rl_set_the_line ()
+{
+  the_line = rl_line_buffer;
+}
+
+#if defined (READLINE_CALLBACKS)
+_rl_keyseq_cxt *
+_rl_keyseq_cxt_alloc ()
+{
+  _rl_keyseq_cxt *cxt;
+
+  cxt = (_rl_keyseq_cxt *)xmalloc (sizeof (_rl_keyseq_cxt));
+
+  cxt->flags = cxt->subseq_arg = cxt->subseq_retval = 0;
+
+  cxt->okey = 0;
+  cxt->ocxt = _rl_kscxt;
+  cxt->childval = 42;          /* sentinel value */
+
+  return cxt;
+}
+
+void
+_rl_keyseq_cxt_dispose (cxt)
+    _rl_keyseq_cxt *cxt;
+{
+  free (cxt);
+}
+
+void
+_rl_keyseq_chain_dispose ()
+{
+  _rl_keyseq_cxt *cxt;
+
+  while (_rl_kscxt)
+    {
+      cxt = _rl_kscxt;
+      _rl_kscxt = _rl_kscxt->ocxt;
+      _rl_keyseq_cxt_dispose (cxt);
+    }
+}
+#endif
+
+static int
+_rl_subseq_getchar (key)
+     int key;
+{
+  int k;
+
+  if (key == ESC)
+    RL_SETSTATE(RL_STATE_METANEXT);
+  RL_SETSTATE(RL_STATE_MOREINPUT);
+  k = rl_read_key ();
+  RL_UNSETSTATE(RL_STATE_MOREINPUT);
+  if (key == ESC)
+    RL_UNSETSTATE(RL_STATE_METANEXT);
+
+  return k;
+}
+
+#if defined (READLINE_CALLBACKS)
+int
+_rl_dispatch_callback (cxt)
+     _rl_keyseq_cxt *cxt;
+{
+  int nkey, r;
+
+  /* For now */
+#if 1
+  /* The first time this context is used, we want to read input and dispatch
+     on it.  When traversing the chain of contexts back `up', we want to use
+     the value from the next context down.  We're simulating recursion using
+     a chain of contexts. */
+  if ((cxt->flags & KSEQ_DISPATCHED) == 0)
+    {
+      nkey = _rl_subseq_getchar (cxt->okey);
+      r = _rl_dispatch_subseq (nkey, cxt->dmap, cxt->subseq_arg);
+      cxt->flags |= KSEQ_DISPATCHED;
+    }
+  else
+    r = cxt->childval;
+#else
+  r = _rl_dispatch_subseq (nkey, cxt->dmap, cxt->subseq_arg);
+#endif
+
+  /* For now */
+  r = _rl_subseq_result (r, cxt->oldmap, cxt->okey, (cxt->flags & KSEQ_SUBSEQ));
+
+  if (r == 0)                  /* success! */
+    {
+      _rl_keyseq_chain_dispose ();
+      RL_UNSETSTATE (RL_STATE_MULTIKEY);
+      return r;
+    }
+
+  if (r != -3)                 /* magic value that says we added to the chain */
+    _rl_kscxt = cxt->ocxt;
+  if (_rl_kscxt)
+    _rl_kscxt->childval = r;
+  if (r != -3)
+    _rl_keyseq_cxt_dispose (cxt);
+
+  return r;
+}
+#endif /* READLINE_CALLBACKS */
+  
+/* Do the command associated with KEY in MAP.
+   If the associated command is really a keymap, then read
+   another key, and dispatch into that map. */
+int
+_rl_dispatch (key, map)
+     register int key;
+     Keymap map;
+{
+  _rl_dispatching_keymap = map;
+  return _rl_dispatch_subseq (key, map, 0);
+}
+
+int
+_rl_dispatch_subseq (key, map, got_subseq)
+     register int key;
+     Keymap map;
+     int got_subseq;
+{
+  int r, newkey;
+  char *macro;
+  rl_command_func_t *func;
+#if defined (READLINE_CALLBACKS)
+  _rl_keyseq_cxt *cxt;
+#endif
+
+  if (META_CHAR (key) && _rl_convert_meta_chars_to_ascii)
+    {
+      if (map[ESC].type == ISKMAP)
+       {
+         if (RL_ISSTATE (RL_STATE_MACRODEF))
+           _rl_add_macro_char (ESC);
+         map = FUNCTION_TO_KEYMAP (map, ESC);
+         key = UNMETA (key);
+         rl_key_sequence_length += 2;
+         return (_rl_dispatch (key, map));
+       }
+      else
+       rl_ding ();
+      return 0;
+    }
+
+  if (RL_ISSTATE (RL_STATE_MACRODEF))
+    _rl_add_macro_char (key);
+
+  r = 0;
+  switch (map[key].type)
+    {
+    case ISFUNC:
+      func = map[key].function;
+      if (func)
+       {
+         /* Special case rl_do_lowercase_version (). */
+         if (func == rl_do_lowercase_version)
+           return (_rl_dispatch (_rl_to_lower (key), map));
+
+         rl_executing_keymap = map;
+
+         rl_dispatching = 1;
+         RL_SETSTATE(RL_STATE_DISPATCHING);
+         (*map[key].function)(rl_numeric_arg * rl_arg_sign, key);
+         RL_UNSETSTATE(RL_STATE_DISPATCHING);
+         rl_dispatching = 0;
+
+         /* If we have input pending, then the last command was a prefix
+            command.  Don't change the state of rl_last_func.  Otherwise,
+            remember the last command executed in this variable. */
+         if (rl_pending_input == 0 && map[key].function != rl_digit_argument)
+           rl_last_func = map[key].function;
+       }
+      else if (map[ANYOTHERKEY].function)
+       {
+         /* OK, there's no function bound in this map, but there is a
+            shadow function that was overridden when the current keymap
+            was created.  Return -2 to note  that. */
+         _rl_unget_char  (key);
+         return -2;
+       }
+      else if (got_subseq)
+       {
+         /* Return -1 to note that we're in a subsequence, but  we don't
+            have a matching key, nor was one overridden.  This means
+            we need to back up the recursion chain and find the last
+            subsequence that is bound to a function. */
+         _rl_unget_char (key);
+         return -1;
+       }
+      else
+       {
+#if defined (READLINE_CALLBACKS)
+         RL_UNSETSTATE (RL_STATE_MULTIKEY);
+         _rl_keyseq_chain_dispose ();
+#endif
+         _rl_abort_internal ();
+         return -1;
+       }
+      break;
+
+    case ISKMAP:
+      if (map[key].function != 0)
+       {
+#if defined (VI_MODE)
+         /* The only way this test will be true is if a subsequence has been
+            bound starting with ESC, generally the arrow keys.  What we do is
+            check whether there's input in the queue, which there generally
+            will be if an arrow key has been pressed, and, if there's not,
+            just dispatch to (what we assume is) rl_vi_movement_mode right
+            away.  This is essentially an input test with a zero timeout. */
+         if (rl_editing_mode == vi_mode && key == ESC && map == vi_insertion_keymap
+             && _rl_input_queued (0) == 0)
+           return (_rl_dispatch (ANYOTHERKEY, FUNCTION_TO_KEYMAP (map, key)));
+#endif
+
+         rl_key_sequence_length++;
+         _rl_dispatching_keymap = FUNCTION_TO_KEYMAP (map, key);
+
+         /* Allocate new context here.  Use linked contexts (linked through
+            cxt->ocxt) to simulate recursion */
+#if defined (READLINE_CALLBACKS)
+         if (RL_ISSTATE (RL_STATE_CALLBACK))
+           {
+             /* Return 0 only the first time, to indicate success to
+                _rl_callback_read_char.  The rest of the time, we're called
+                from _rl_dispatch_callback, so we return 3 to indicate
+                special handling is necessary. */
+             r = RL_ISSTATE (RL_STATE_MULTIKEY) ? -3 : 0;
+             cxt = _rl_keyseq_cxt_alloc ();
+
+             if (got_subseq)
+               cxt->flags |= KSEQ_SUBSEQ;
+             cxt->okey = key;
+             cxt->oldmap = map;
+             cxt->dmap = _rl_dispatching_keymap;
+             cxt->subseq_arg = got_subseq || cxt->dmap[ANYOTHERKEY].function;
+
+             RL_SETSTATE (RL_STATE_MULTIKEY);
+             _rl_kscxt = cxt;
+
+             return r;         /* don't indicate immediate success */
+           }
+#endif
+
+         newkey = _rl_subseq_getchar (key);
+         if (newkey < 0)
+           {
+             _rl_abort_internal ();
+             return -1;
+           }
+
+         r = _rl_dispatch_subseq (newkey, _rl_dispatching_keymap, got_subseq || map[ANYOTHERKEY].function);
+         return _rl_subseq_result (r, map, key, got_subseq);
+       }
+      else
+       {
+         _rl_abort_internal ();
+         return -1;
+       }
+      break;
+
+    case ISMACR:
+      if (map[key].function != 0)
+       {
+         macro = savestring ((char *)map[key].function);
+         _rl_with_macro_input (macro);
+         return 0;
+       }
+      break;
+    }
+#if defined (VI_MODE)
+  if (rl_editing_mode == vi_mode && _rl_keymap == vi_movement_keymap &&
+      key != ANYOTHERKEY &&
+      _rl_vi_textmod_command (key))
+    _rl_vi_set_last (key, rl_numeric_arg, rl_arg_sign);
+#endif
+
+  return (r);
+}
+
+static int
+_rl_subseq_result (r, map, key, got_subseq)
+     int r;
+     Keymap map;
+     int key, got_subseq;
+{
+  Keymap m;
+  int type, nt;
+  rl_command_func_t *func, *nf;
+  
+  if (r == -2)
+    /* We didn't match anything, and the keymap we're indexed into
+       shadowed a function previously bound to that prefix.  Call
+       the function.  The recursive call to _rl_dispatch_subseq has
+       already taken care of pushing any necessary input back onto
+       the input queue with _rl_unget_char. */
+    {
+      m = _rl_dispatching_keymap;
+      type = m[ANYOTHERKEY].type;
+      func = m[ANYOTHERKEY].function;
+      if (type == ISFUNC && func == rl_do_lowercase_version)
+       r = _rl_dispatch (_rl_to_lower (key), map);
+      else if (type == ISFUNC && func == rl_insert)
+       {
+         /* If the function that was shadowed was self-insert, we
+            somehow need a keymap with map[key].func == self-insert.
+            Let's use this one. */
+         nt = m[key].type;
+         nf = m[key].function;
+
+         m[key].type = type;
+         m[key].function = func;
+         r = _rl_dispatch (key, m);
+         m[key].type = nt;
+         m[key].function = nf;
+       }
+      else
+       r = _rl_dispatch (ANYOTHERKEY, m);
+    }
+  else if (r && map[ANYOTHERKEY].function)
+    {
+      /* We didn't match (r is probably -1), so return something to
+        tell the caller that it should try ANYOTHERKEY for an
+        overridden function. */
+      _rl_unget_char (key);
+      _rl_dispatching_keymap = map;
+      return -2;
+    }
+  else if (r && got_subseq)
+    {
+      /* OK, back up the chain. */
+      _rl_unget_char (key);
+      _rl_dispatching_keymap = map;
+      return -1;
+    }
+
+  return r;
+}
+
+/* **************************************************************** */
+/*                                                                 */
+/*                     Initializations                             */
+/*                                                                 */
+/* **************************************************************** */
+
+/* Initialize readline (and terminal if not already). */
+int
+rl_initialize ()
+{
+  /* If we have never been called before, initialize the
+     terminal and data structures. */
+  if (!rl_initialized)
+    {
+      RL_SETSTATE(RL_STATE_INITIALIZING);
+      readline_initialize_everything ();
+      RL_UNSETSTATE(RL_STATE_INITIALIZING);
+      rl_initialized++;
+      RL_SETSTATE(RL_STATE_INITIALIZED);
+    }
+
+  /* Initalize the current line information. */
+  _rl_init_line_state ();
+
+  /* We aren't done yet.  We haven't even gotten started yet! */
+  rl_done = 0;
+  RL_UNSETSTATE(RL_STATE_DONE);
+
+  /* Tell the history routines what is going on. */
+  _rl_start_using_history ();
+
+  /* Make the display buffer match the state of the line. */
+  rl_reset_line_state ();
+
+  /* No such function typed yet. */
+  rl_last_func = (rl_command_func_t *)NULL;
+
+  /* Parsing of key-bindings begins in an enabled state. */
+  _rl_parsing_conditionalized_out = 0;
+
+#if defined (VI_MODE)
+  if (rl_editing_mode == vi_mode)
+    _rl_vi_initialize_line ();
+#endif
+
+  /* Each line starts in insert mode (the default). */
+  _rl_set_insert_mode (RL_IM_DEFAULT, 1);
+
+  return 0;
+}
+
+#if 0
+#if defined (__EMX__)
+static void
+_emx_build_environ ()
+{
+  TIB *tibp;
+  PIB *pibp;
+  char *t, **tp;
+  int c;
+
+  DosGetInfoBlocks (&tibp, &pibp);
+  t = pibp->pib_pchenv;
+  for (c = 1; *t; c++)
+    t += strlen (t) + 1;
+  tp = environ = (char **)xmalloc ((c + 1) * sizeof (char *));
+  t = pibp->pib_pchenv;
+  while (*t)
+    {
+      *tp++ = t;
+      t += strlen (t) + 1;
+    }
+  *tp = 0;
+}
+#endif /* __EMX__ */
+#endif
+
+/* Initialize the entire state of the world. */
+static void
+readline_initialize_everything ()
+{
+#if 0
+#if defined (__EMX__)
+  if (environ == 0)
+    _emx_build_environ ();
+#endif
+#endif
+
+#if 0
+  /* Find out if we are running in Emacs -- UNUSED. */
+  running_in_emacs = sh_get_env_value ("EMACS") != (char *)0;
+#endif
+
+  /* Set up input and output if they are not already set up. */
+  if (!rl_instream)
+    rl_instream = stdin;
+
+  if (!rl_outstream)
+    rl_outstream = stdout;
+
+  /* Bind _rl_in_stream and _rl_out_stream immediately.  These values
+     may change, but they may also be used before readline_internal ()
+     is called. */
+  _rl_in_stream = rl_instream;
+  _rl_out_stream = rl_outstream;
+
+  /* Allocate data structures. */
+  if (rl_line_buffer == 0)
+    rl_line_buffer = (char *)xmalloc (rl_line_buffer_len = DEFAULT_BUFFER_SIZE);
+
+  /* Initialize the terminal interface. */
+  if (rl_terminal_name == 0)
+    rl_terminal_name = sh_get_env_value ("TERM");
+  _rl_init_terminal_io (rl_terminal_name);
+
+  /* Bind tty characters to readline functions. */
+  readline_default_bindings ();
+
+  /* Initialize the function names. */
+  rl_initialize_funmap ();
+
+  /* Decide whether we should automatically go into eight-bit mode. */
+  _rl_init_eightbit ();
+      
+  /* Read in the init file. */
+  rl_read_init_file ((char *)NULL);
+
+  /* XXX */
+  if (_rl_horizontal_scroll_mode && _rl_term_autowrap)
+    {
+      _rl_screenwidth--;
+      _rl_screenchars -= _rl_screenheight;
+    }
+
+  /* Override the effect of any `set keymap' assignments in the
+     inputrc file. */
+  rl_set_keymap_from_edit_mode ();
+
+  /* Try to bind a common arrow key prefix, if not already bound. */
+  bind_arrow_keys ();
+
+  /* Enable the meta key, if this terminal has one. */
+  if (_rl_enable_meta)
+    _rl_enable_meta_key ();
+
+  /* If the completion parser's default word break characters haven't
+     been set yet, then do so now. */
+  if (rl_completer_word_break_characters == (char *)NULL)
+    rl_completer_word_break_characters = (char *)rl_basic_word_break_characters;
+}
+
+/* If this system allows us to look at the values of the regular
+   input editing characters, then bind them to their readline
+   equivalents, iff the characters are not bound to keymaps. */
+static void
+readline_default_bindings ()
+{
+  if (_rl_bind_stty_chars)
+    rl_tty_set_default_bindings (_rl_keymap);
+}
+
+/* Reset the default bindings for the terminal special characters we're
+   interested in back to rl_insert and read the new ones. */
+static void
+reset_default_bindings ()
+{
+  if (_rl_bind_stty_chars)
+    {
+      rl_tty_unset_default_bindings (_rl_keymap);
+      rl_tty_set_default_bindings (_rl_keymap);
+    }
+}
+
+/* Bind some common arrow key sequences in MAP. */
+static void
+bind_arrow_keys_internal (map)
+     Keymap map;
+{
+  Keymap xkeymap;
+
+  xkeymap = _rl_keymap;
+  _rl_keymap = map;
+
+#if defined (__MSDOS__)
+  rl_bind_keyseq_if_unbound ("\033[0A", rl_get_previous_history);
+  rl_bind_keyseq_if_unbound ("\033[0B", rl_backward_char);
+  rl_bind_keyseq_if_unbound ("\033[0C", rl_forward_char);
+  rl_bind_keyseq_if_unbound ("\033[0D", rl_get_next_history);
+#endif
+
+  rl_bind_keyseq_if_unbound ("\033[A", rl_get_previous_history);
+  rl_bind_keyseq_if_unbound ("\033[B", rl_get_next_history);
+  rl_bind_keyseq_if_unbound ("\033[C", rl_forward_char);
+  rl_bind_keyseq_if_unbound ("\033[D", rl_backward_char);
+  rl_bind_keyseq_if_unbound ("\033[H", rl_beg_of_line);
+  rl_bind_keyseq_if_unbound ("\033[F", rl_end_of_line);
+
+  rl_bind_keyseq_if_unbound ("\033OA", rl_get_previous_history);
+  rl_bind_keyseq_if_unbound ("\033OB", rl_get_next_history);
+  rl_bind_keyseq_if_unbound ("\033OC", rl_forward_char);
+  rl_bind_keyseq_if_unbound ("\033OD", rl_backward_char);
+  rl_bind_keyseq_if_unbound ("\033OH", rl_beg_of_line);
+  rl_bind_keyseq_if_unbound ("\033OF", rl_end_of_line);
+
+#if defined (__MINGW32__)
+  rl_bind_keyseq_if_unbound ("\340H", rl_get_previous_history);
+  rl_bind_keyseq_if_unbound ("\340P", rl_get_next_history);
+  rl_bind_keyseq_if_unbound ("\340M", rl_forward_char);
+  rl_bind_keyseq_if_unbound ("\340K", rl_backward_char);
+#endif
+
+  _rl_keymap = xkeymap;
+}
+
+/* Try and bind the common arrow key prefixes after giving termcap and
+   the inputrc file a chance to bind them and create `real' keymaps
+   for the arrow key prefix. */
+static void
+bind_arrow_keys ()
+{
+  bind_arrow_keys_internal (emacs_standard_keymap);
+
+#if defined (VI_MODE)
+  bind_arrow_keys_internal (vi_movement_keymap);
+  bind_arrow_keys_internal (vi_insertion_keymap);
+#endif
+}
+
+/* **************************************************************** */
+/*                                                                 */
+/*             Saving and Restoring Readline's state               */
+/*                                                                 */
+/* **************************************************************** */
+
+int
+rl_save_state (sp)
+     struct readline_state *sp;
+{
+  if (sp == 0)
+    return -1;
+
+  sp->point = rl_point;
+  sp->end = rl_end;
+  sp->mark = rl_mark;
+  sp->buffer = rl_line_buffer;
+  sp->buflen = rl_line_buffer_len;
+  sp->ul = rl_undo_list;
+  sp->prompt = rl_prompt;
+
+  sp->rlstate = rl_readline_state;
+  sp->done = rl_done;
+  sp->kmap = _rl_keymap;
+
+  sp->lastfunc = rl_last_func;
+  sp->insmode = rl_insert_mode;
+  sp->edmode = rl_editing_mode;
+  sp->kseqlen = rl_key_sequence_length;
+  sp->inf = rl_instream;
+  sp->outf = rl_outstream;
+  sp->pendingin = rl_pending_input;
+  sp->macro = rl_executing_macro;
+
+  sp->catchsigs = rl_catch_signals;
+  sp->catchsigwinch = rl_catch_sigwinch;
+
+  return (0);
+}
+
+int
+rl_restore_state (sp)
+     struct readline_state *sp;
+{
+  if (sp == 0)
+    return -1;
+
+  rl_point = sp->point;
+  rl_end = sp->end;
+  rl_mark = sp->mark;
+  the_line = rl_line_buffer = sp->buffer;
+  rl_line_buffer_len = sp->buflen;
+  rl_undo_list = sp->ul;
+  rl_prompt = sp->prompt;
+
+  rl_readline_state = sp->rlstate;
+  rl_done = sp->done;
+  _rl_keymap = sp->kmap;
+
+  rl_last_func = sp->lastfunc;
+  rl_insert_mode = sp->insmode;
+  rl_editing_mode = sp->edmode;
+  rl_key_sequence_length = sp->kseqlen;
+  rl_instream = sp->inf;
+  rl_outstream = sp->outf;
+  rl_pending_input = sp->pendingin;
+  rl_executing_macro = sp->macro;
+
+  rl_catch_signals = sp->catchsigs;
+  rl_catch_sigwinch = sp->catchsigwinch;
+
+  return (0);
+}
diff --git a/readline.h b/readline.h
new file mode 100644 (file)
index 0000000..b71bf98
--- /dev/null
@@ -0,0 +1,853 @@
+/* Readline.h -- the names of functions callable from within readline. */
+
+/* Copyright (C) 1987-2005 Free Software Foundation, Inc.
+
+   This file is part of the GNU Readline Library, a library for
+   reading lines of text with interactive input and history editing.
+
+   The GNU Readline Library 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.
+
+   The GNU Readline Library is distributed in the hope that it will be
+   useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+   of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   The GNU General Public License is often shipped with GNU software, and
+   is generally kept in a file called COPYING or LICENSE.  If you do not
+   have a copy of the license, write to the Free Software Foundation,
+   59 Temple Place, Suite 330, Boston, MA 02111 USA. */
+
+#if !defined (_READLINE_H_)
+#define _READLINE_H_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#if defined (READLINE_LIBRARY)
+#  include "rlstdc.h"
+#  include "rltypedefs.h"
+#  include "keymaps.h"
+#  include "tilde.h"
+#else
+#  include <readline/rlstdc.h>
+#  include <readline/rltypedefs.h>
+#  include <readline/keymaps.h>
+#  include <readline/tilde.h>
+#endif
+
+/* Hex-encoded Readline version number. */
+#define RL_READLINE_VERSION    0x0502          /* Readline 5.2 */
+#define RL_VERSION_MAJOR       5
+#define RL_VERSION_MINOR       2
+
+/* Readline data structures. */
+
+/* Maintaining the state of undo.  We remember individual deletes and inserts
+   on a chain of things to do. */
+
+/* The actions that undo knows how to undo.  Notice that UNDO_DELETE means
+   to insert some text, and UNDO_INSERT means to delete some text.   I.e.,
+   the code tells undo what to undo, not how to undo it. */
+enum undo_code { UNDO_DELETE, UNDO_INSERT, UNDO_BEGIN, UNDO_END };
+
+/* What an element of THE_UNDO_LIST looks like. */
+typedef struct undo_list {
+  struct undo_list *next;
+  int start, end;              /* Where the change took place. */
+  char *text;                  /* The text to insert, if undoing a delete. */
+  enum undo_code what;         /* Delete, Insert, Begin, End. */
+} UNDO_LIST;
+
+/* The current undo list for RL_LINE_BUFFER. */
+extern UNDO_LIST *rl_undo_list;
+
+/* The data structure for mapping textual names to code addresses. */
+typedef struct _funmap {
+  const char *name;
+  rl_command_func_t *function;
+} FUNMAP;
+
+extern FUNMAP **funmap;
+
+/* **************************************************************** */
+/*                                                                 */
+/*          Functions available to bind to key sequences           */
+/*                                                                 */
+/* **************************************************************** */
+
+/* Bindable commands for numeric arguments. */
+extern int rl_digit_argument PARAMS((int, int));
+extern int rl_universal_argument PARAMS((int, int));
+
+/* Bindable commands for moving the cursor. */
+extern int rl_forward_byte PARAMS((int, int));
+extern int rl_forward_char PARAMS((int, int));
+extern int rl_forward PARAMS((int, int));
+extern int rl_backward_byte PARAMS((int, int));
+extern int rl_backward_char PARAMS((int, int));
+extern int rl_backward PARAMS((int, int));
+extern int rl_beg_of_line PARAMS((int, int));
+extern int rl_end_of_line PARAMS((int, int));
+extern int rl_forward_word PARAMS((int, int));
+extern int rl_backward_word PARAMS((int, int));
+extern int rl_refresh_line PARAMS((int, int));
+extern int rl_clear_screen PARAMS((int, int));
+extern int rl_arrow_keys PARAMS((int, int));
+
+/* Bindable commands for inserting and deleting text. */
+extern int rl_insert PARAMS((int, int));
+extern int rl_quoted_insert PARAMS((int, int));
+extern int rl_tab_insert PARAMS((int, int));
+extern int rl_newline PARAMS((int, int));
+extern int rl_do_lowercase_version PARAMS((int, int));
+extern int rl_rubout PARAMS((int, int));
+extern int rl_delete PARAMS((int, int));
+extern int rl_rubout_or_delete PARAMS((int, int));
+extern int rl_delete_horizontal_space PARAMS((int, int));
+extern int rl_delete_or_show_completions PARAMS((int, int));
+extern int rl_insert_comment PARAMS((int, int));
+
+/* Bindable commands for changing case. */
+extern int rl_upcase_word PARAMS((int, int));
+extern int rl_downcase_word PARAMS((int, int));
+extern int rl_capitalize_word PARAMS((int, int));
+
+/* Bindable commands for transposing characters and words. */
+extern int rl_transpose_words PARAMS((int, int));
+extern int rl_transpose_chars PARAMS((int, int));
+
+/* Bindable commands for searching within a line. */
+extern int rl_char_search PARAMS((int, int));
+extern int rl_backward_char_search PARAMS((int, int));
+
+/* Bindable commands for readline's interface to the command history. */
+extern int rl_beginning_of_history PARAMS((int, int));
+extern int rl_end_of_history PARAMS((int, int));
+extern int rl_get_next_history PARAMS((int, int));
+extern int rl_get_previous_history PARAMS((int, int));
+
+/* Bindable commands for managing the mark and region. */
+extern int rl_set_mark PARAMS((int, int));
+extern int rl_exchange_point_and_mark PARAMS((int, int));
+
+/* Bindable commands to set the editing mode (emacs or vi). */
+extern int rl_vi_editing_mode PARAMS((int, int));
+extern int rl_emacs_editing_mode PARAMS((int, int));
+
+/* Bindable commands to change the insert mode (insert or overwrite) */
+extern int rl_overwrite_mode PARAMS((int, int));
+
+/* Bindable commands for managing key bindings. */
+extern int rl_re_read_init_file PARAMS((int, int));
+extern int rl_dump_functions PARAMS((int, int));
+extern int rl_dump_macros PARAMS((int, int));
+extern int rl_dump_variables PARAMS((int, int));
+
+/* Bindable commands for word completion. */
+extern int rl_complete PARAMS((int, int));
+extern int rl_possible_completions PARAMS((int, int));
+extern int rl_insert_completions PARAMS((int, int));
+extern int rl_menu_complete PARAMS((int, int));
+
+/* Bindable commands for killing and yanking text, and managing the kill ring. */
+extern int rl_kill_word PARAMS((int, int));
+extern int rl_backward_kill_word PARAMS((int, int));
+extern int rl_kill_line PARAMS((int, int));
+extern int rl_backward_kill_line PARAMS((int, int));
+extern int rl_kill_full_line PARAMS((int, int));
+extern int rl_unix_word_rubout PARAMS((int, int));
+extern int rl_unix_filename_rubout PARAMS((int, int));
+extern int rl_unix_line_discard PARAMS((int, int));
+extern int rl_copy_region_to_kill PARAMS((int, int));
+extern int rl_kill_region PARAMS((int, int));
+extern int rl_copy_forward_word PARAMS((int, int));
+extern int rl_copy_backward_word PARAMS((int, int));
+extern int rl_yank PARAMS((int, int));
+extern int rl_yank_pop PARAMS((int, int));
+extern int rl_yank_nth_arg PARAMS((int, int));
+extern int rl_yank_last_arg PARAMS((int, int));
+/* Not available unless __CYGWIN__ is defined. */
+#ifdef __CYGWIN__
+extern int rl_paste_from_clipboard PARAMS((int, int));
+#endif
+
+/* Bindable commands for incremental searching. */
+extern int rl_reverse_search_history PARAMS((int, int));
+extern int rl_forward_search_history PARAMS((int, int));
+
+/* Bindable keyboard macro commands. */
+extern int rl_start_kbd_macro PARAMS((int, int));
+extern int rl_end_kbd_macro PARAMS((int, int));
+extern int rl_call_last_kbd_macro PARAMS((int, int));
+
+/* Bindable undo commands. */
+extern int rl_revert_line PARAMS((int, int));
+extern int rl_undo_command PARAMS((int, int));
+
+/* Bindable tilde expansion commands. */
+extern int rl_tilde_expand PARAMS((int, int));
+
+/* Bindable terminal control commands. */
+extern int rl_restart_output PARAMS((int, int));
+extern int rl_stop_output PARAMS((int, int));
+
+/* Miscellaneous bindable commands. */
+extern int rl_abort PARAMS((int, int));
+extern int rl_tty_status PARAMS((int, int));
+
+/* Bindable commands for incremental and non-incremental history searching. */
+extern int rl_history_search_forward PARAMS((int, int));
+extern int rl_history_search_backward PARAMS((int, int));
+extern int rl_noninc_forward_search PARAMS((int, int));
+extern int rl_noninc_reverse_search PARAMS((int, int));
+extern int rl_noninc_forward_search_again PARAMS((int, int));
+extern int rl_noninc_reverse_search_again PARAMS((int, int));
+
+/* Bindable command used when inserting a matching close character. */
+extern int rl_insert_close PARAMS((int, int));
+
+/* Not available unless READLINE_CALLBACKS is defined. */
+extern void rl_callback_handler_install PARAMS((const char *, rl_vcpfunc_t *));
+extern void rl_callback_read_char PARAMS((void));
+extern void rl_callback_handler_remove PARAMS((void));
+
+/* Things for vi mode. Not available unless readline is compiled -DVI_MODE. */
+/* VI-mode bindable commands. */
+extern int rl_vi_redo PARAMS((int, int));
+extern int rl_vi_undo PARAMS((int, int));
+extern int rl_vi_yank_arg PARAMS((int, int));
+extern int rl_vi_fetch_history PARAMS((int, int));
+extern int rl_vi_search_again PARAMS((int, int));
+extern int rl_vi_search PARAMS((int, int));
+extern int rl_vi_complete PARAMS((int, int));
+extern int rl_vi_tilde_expand PARAMS((int, int));
+extern int rl_vi_prev_word PARAMS((int, int));
+extern int rl_vi_next_word PARAMS((int, int));
+extern int rl_vi_end_word PARAMS((int, int));
+extern int rl_vi_insert_beg PARAMS((int, int));
+extern int rl_vi_append_mode PARAMS((int, int));
+extern int rl_vi_append_eol PARAMS((int, int));
+extern int rl_vi_eof_maybe PARAMS((int, int));
+extern int rl_vi_insertion_mode PARAMS((int, int));
+extern int rl_vi_movement_mode PARAMS((int, int));
+extern int rl_vi_arg_digit PARAMS((int, int));
+extern int rl_vi_change_case PARAMS((int, int));
+extern int rl_vi_put PARAMS((int, int));
+extern int rl_vi_column PARAMS((int, int));
+extern int rl_vi_delete_to PARAMS((int, int));
+extern int rl_vi_change_to PARAMS((int, int));
+extern int rl_vi_yank_to PARAMS((int, int));
+extern int rl_vi_rubout PARAMS((int, int));
+extern int rl_vi_delete PARAMS((int, int));
+extern int rl_vi_back_to_indent PARAMS((int, int));
+extern int rl_vi_first_print PARAMS((int, int));
+extern int rl_vi_char_search PARAMS((int, int));
+extern int rl_vi_match PARAMS((int, int));
+extern int rl_vi_change_char PARAMS((int, int));
+extern int rl_vi_subst PARAMS((int, int));
+extern int rl_vi_overstrike PARAMS((int, int));
+extern int rl_vi_overstrike_delete PARAMS((int, int));
+extern int rl_vi_replace PARAMS((int, int));
+extern int rl_vi_set_mark PARAMS((int, int));
+extern int rl_vi_goto_mark PARAMS((int, int));
+
+/* VI-mode utility functions. */
+extern int rl_vi_check PARAMS((void));
+extern int rl_vi_domove PARAMS((int, int *));
+extern int rl_vi_bracktype PARAMS((int));
+
+extern void rl_vi_start_inserting PARAMS((int, int, int));
+
+/* VI-mode pseudo-bindable commands, used as utility functions. */
+extern int rl_vi_fWord PARAMS((int, int));
+extern int rl_vi_bWord PARAMS((int, int));
+extern int rl_vi_eWord PARAMS((int, int));
+extern int rl_vi_fword PARAMS((int, int));
+extern int rl_vi_bword PARAMS((int, int));
+extern int rl_vi_eword PARAMS((int, int));
+
+/* **************************************************************** */
+/*                                                                 */
+/*                     Well Published Functions                    */
+/*                                                                 */
+/* **************************************************************** */
+
+/* Readline functions. */
+/* Read a line of input.  Prompt with PROMPT.  A NULL PROMPT means none. */
+extern char *readline PARAMS((const char *));
+
+extern int rl_set_prompt PARAMS((const char *));
+extern int rl_expand_prompt PARAMS((char *));
+
+extern int rl_initialize PARAMS((void));
+
+/* Undocumented; unused by readline */
+extern int rl_discard_argument PARAMS((void));
+
+/* Utility functions to bind keys to readline commands. */
+extern int rl_add_defun PARAMS((const char *, rl_command_func_t *, int));
+extern int rl_bind_key PARAMS((int, rl_command_func_t *));
+extern int rl_bind_key_in_map PARAMS((int, rl_command_func_t *, Keymap));
+extern int rl_unbind_key PARAMS((int));
+extern int rl_unbind_key_in_map PARAMS((int, Keymap));
+extern int rl_bind_key_if_unbound PARAMS((int, rl_command_func_t *));
+extern int rl_bind_key_if_unbound_in_map PARAMS((int, rl_command_func_t *, Keymap));
+extern int rl_unbind_function_in_map PARAMS((rl_command_func_t *, Keymap));
+extern int rl_unbind_command_in_map PARAMS((const char *, Keymap));
+extern int rl_bind_keyseq PARAMS((const char *, rl_command_func_t *));
+extern int rl_bind_keyseq_in_map PARAMS((const char *, rl_command_func_t *, Keymap));
+extern int rl_bind_keyseq_if_unbound PARAMS((const char *, rl_command_func_t *));
+extern int rl_bind_keyseq_if_unbound_in_map PARAMS((const char *, rl_command_func_t *, Keymap));
+extern int rl_generic_bind PARAMS((int, const char *, char *, Keymap));
+
+extern char *rl_variable_value PARAMS((const char *));
+extern int rl_variable_bind PARAMS((const char *, const char *));
+
+/* Backwards compatibility, use rl_bind_keyseq_in_map instead. */
+extern int rl_set_key PARAMS((const char *, rl_command_func_t *, Keymap));
+
+/* Backwards compatibility, use rl_generic_bind instead. */
+extern int rl_macro_bind PARAMS((const char *, const char *, Keymap));
+
+/* Undocumented in the texinfo manual; not really useful to programs. */
+extern int rl_translate_keyseq PARAMS((const char *, char *, int *));
+extern char *rl_untranslate_keyseq PARAMS((int));
+
+extern rl_command_func_t *rl_named_function PARAMS((const char *));
+extern rl_command_func_t *rl_function_of_keyseq PARAMS((const char *, Keymap, int *));
+
+extern void rl_list_funmap_names PARAMS((void));
+extern char **rl_invoking_keyseqs_in_map PARAMS((rl_command_func_t *, Keymap));
+extern char **rl_invoking_keyseqs PARAMS((rl_command_func_t *));
+extern void rl_function_dumper PARAMS((int));
+extern void rl_macro_dumper PARAMS((int));
+extern void rl_variable_dumper PARAMS((int));
+
+extern int rl_read_init_file PARAMS((const char *));
+extern int rl_parse_and_bind PARAMS((char *));
+
+/* Functions for manipulating keymaps. */
+extern Keymap rl_make_bare_keymap PARAMS((void));
+extern Keymap rl_copy_keymap PARAMS((Keymap));
+extern Keymap rl_make_keymap PARAMS((void));
+extern void rl_discard_keymap PARAMS((Keymap));
+
+extern Keymap rl_get_keymap_by_name PARAMS((const char *));
+extern char *rl_get_keymap_name PARAMS((Keymap));
+extern void rl_set_keymap PARAMS((Keymap));
+extern Keymap rl_get_keymap PARAMS((void));
+/* Undocumented; used internally only. */
+extern void rl_set_keymap_from_edit_mode PARAMS((void));
+extern char *rl_get_keymap_name_from_edit_mode PARAMS((void));
+
+/* Functions for manipulating the funmap, which maps command names to functions. */
+extern int rl_add_funmap_entry PARAMS((const char *, rl_command_func_t *));
+extern const char **rl_funmap_names PARAMS((void));
+/* Undocumented, only used internally -- there is only one funmap, and this
+   function may be called only once. */
+extern void rl_initialize_funmap PARAMS((void));
+
+/* Utility functions for managing keyboard macros. */
+extern void rl_push_macro_input PARAMS((char *));
+
+/* Functions for undoing, from undo.c */
+extern void rl_add_undo PARAMS((enum undo_code, int, int, char *));
+extern void rl_free_undo_list PARAMS((void));
+extern int rl_do_undo PARAMS((void));
+extern int rl_begin_undo_group PARAMS((void));
+extern int rl_end_undo_group PARAMS((void));
+extern int rl_modifying PARAMS((int, int));
+
+/* Functions for redisplay. */
+extern void rl_redisplay PARAMS((void));
+extern int rl_on_new_line PARAMS((void));
+extern int rl_on_new_line_with_prompt PARAMS((void));
+extern int rl_forced_update_display PARAMS((void));
+extern int rl_clear_message PARAMS((void));
+extern int rl_reset_line_state PARAMS((void));
+extern int rl_crlf PARAMS((void));
+
+#if defined (USE_VARARGS) && defined (PREFER_STDARG)
+extern int rl_message (const char *, ...)  __attribute__((__format__ (printf, 1, 2)));
+#else
+extern int rl_message ();
+#endif
+
+extern int rl_show_char PARAMS((int));
+
+/* Undocumented in texinfo manual. */
+extern int rl_character_len PARAMS((int, int));
+
+/* Save and restore internal prompt redisplay information. */
+extern void rl_save_prompt PARAMS((void));
+extern void rl_restore_prompt PARAMS((void));
+
+/* Modifying text. */
+extern void rl_replace_line PARAMS((const char *, int));
+extern int rl_insert_text PARAMS((const char *));
+extern int rl_delete_text PARAMS((int, int));
+extern int rl_kill_text PARAMS((int, int));
+extern char *rl_copy_text PARAMS((int, int));
+
+/* Terminal and tty mode management. */
+extern void rl_prep_terminal PARAMS((int));
+extern void rl_deprep_terminal PARAMS((void));
+extern void rl_tty_set_default_bindings PARAMS((Keymap));
+extern void rl_tty_unset_default_bindings PARAMS((Keymap));
+
+extern int rl_reset_terminal PARAMS((const char *));
+extern void rl_resize_terminal PARAMS((void));
+extern void rl_set_screen_size PARAMS((int, int));
+extern void rl_get_screen_size PARAMS((int *, int *));
+extern void rl_reset_screen_size PARAMS((void));
+
+extern char *rl_get_termcap PARAMS((const char *));
+
+/* Functions for character input. */
+extern int rl_stuff_char PARAMS((int));
+extern int rl_execute_next PARAMS((int));
+extern int rl_clear_pending_input PARAMS((void));
+extern int rl_read_key PARAMS((void));
+extern int rl_getc PARAMS((FILE *));
+extern int rl_set_keyboard_input_timeout PARAMS((int));
+
+/* `Public' utility functions . */
+extern void rl_extend_line_buffer PARAMS((int));
+extern int rl_ding PARAMS((void));
+extern int rl_alphabetic PARAMS((int));
+
+/* Readline signal handling, from signals.c */
+extern int rl_set_signals PARAMS((void));
+extern int rl_clear_signals PARAMS((void));
+extern void rl_cleanup_after_signal PARAMS((void));
+extern void rl_reset_after_signal PARAMS((void));
+extern void rl_free_line_state PARAMS((void));
+extern int rl_set_paren_blink_timeout PARAMS((int));
+
+/* Undocumented. */
+extern int rl_maybe_save_line PARAMS((void));
+extern int rl_maybe_unsave_line PARAMS((void));
+extern int rl_maybe_replace_line PARAMS((void));
+
+/* Completion functions. */
+extern int rl_complete_internal PARAMS((int));
+extern void rl_display_match_list PARAMS((char **, int, int));
+
+extern char **rl_completion_matches PARAMS((const char *, rl_compentry_func_t *));
+extern char *rl_username_completion_function PARAMS((const char *, int));
+extern char *rl_filename_completion_function PARAMS((const char *, int));
+
+extern int rl_completion_mode PARAMS((rl_command_func_t *));
+
+#if 0
+/* Backwards compatibility (compat.c).  These will go away sometime. */
+extern void free_undo_list PARAMS((void));
+extern int maybe_save_line PARAMS((void));
+extern int maybe_unsave_line PARAMS((void));
+extern int maybe_replace_line PARAMS((void));
+
+extern int ding PARAMS((void));
+extern int alphabetic PARAMS((int));
+extern int crlf PARAMS((void));
+
+extern char **completion_matches PARAMS((char *, rl_compentry_func_t *));
+extern char *username_completion_function PARAMS((const char *, int));
+extern char *filename_completion_function PARAMS((const char *, int));
+#endif
+
+/* **************************************************************** */
+/*                                                                 */
+/*                     Well Published Variables                    */
+/*                                                                 */
+/* **************************************************************** */
+
+/* The version of this incarnation of the readline library. */
+extern const char *rl_library_version;         /* e.g., "4.2" */
+extern int rl_readline_version;                        /* e.g., 0x0402 */
+
+/* True if this is real GNU readline. */
+extern int rl_gnu_readline_p;
+
+/* Flags word encapsulating the current readline state. */
+extern int rl_readline_state;
+
+/* Says which editing mode readline is currently using.  1 means emacs mode;
+   0 means vi mode. */
+extern int rl_editing_mode;
+
+/* Insert or overwrite mode for emacs mode.  1 means insert mode; 0 means
+   overwrite mode.  Reset to insert mode on each input line. */
+extern int rl_insert_mode;
+
+/* The name of the calling program.  You should initialize this to
+   whatever was in argv[0].  It is used when parsing conditionals. */
+extern const char *rl_readline_name;
+
+/* The prompt readline uses.  This is set from the argument to
+   readline (), and should not be assigned to directly. */
+extern char *rl_prompt;
+
+/* The line buffer that is in use. */
+extern char *rl_line_buffer;
+
+/* The location of point, and end. */
+extern int rl_point;
+extern int rl_end;
+
+/* The mark, or saved cursor position. */
+extern int rl_mark;
+
+/* Flag to indicate that readline has finished with the current input
+   line and should return it. */
+extern int rl_done;
+
+/* If set to a character value, that will be the next keystroke read. */
+extern int rl_pending_input;
+
+/* Non-zero if we called this function from _rl_dispatch().  It's present
+   so functions can find out whether they were called from a key binding
+   or directly from an application. */
+extern int rl_dispatching;
+
+/* Non-zero if the user typed a numeric argument before executing the
+   current function. */
+extern int rl_explicit_arg;
+
+/* The current value of the numeric argument specified by the user. */
+extern int rl_numeric_arg;
+
+/* The address of the last command function Readline executed. */
+extern rl_command_func_t *rl_last_func;
+
+/* The name of the terminal to use. */
+extern const char *rl_terminal_name;
+
+/* The input and output streams. */
+extern FILE *rl_instream;
+extern FILE *rl_outstream;
+
+/* If non-zero, Readline gives values of LINES and COLUMNS from the environment
+   greater precedence than values fetched from the kernel when computing the
+   screen dimensions. */
+extern int rl_prefer_env_winsize;
+
+/* If non-zero, then this is the address of a function to call just
+   before readline_internal () prints the first prompt. */
+extern rl_hook_func_t *rl_startup_hook;
+
+/* If non-zero, this is the address of a function to call just before
+   readline_internal_setup () returns and readline_internal starts
+   reading input characters. */
+extern rl_hook_func_t *rl_pre_input_hook;
+      
+/* The address of a function to call periodically while Readline is
+   awaiting character input, or NULL, for no event handling. */
+extern rl_hook_func_t *rl_event_hook;
+
+/* The address of the function to call to fetch a character from the current
+   Readline input stream */
+extern rl_getc_func_t *rl_getc_function;
+
+extern rl_voidfunc_t *rl_redisplay_function;
+
+extern rl_vintfunc_t *rl_prep_term_function;
+extern rl_voidfunc_t *rl_deprep_term_function;
+
+/* Dispatch variables. */
+extern Keymap rl_executing_keymap;
+extern Keymap rl_binding_keymap;
+
+/* Display variables. */
+/* If non-zero, readline will erase the entire line, including any prompt,
+   if the only thing typed on an otherwise-blank line is something bound to
+   rl_newline. */
+extern int rl_erase_empty_line;
+
+/* If non-zero, the application has already printed the prompt (rl_prompt)
+   before calling readline, so readline should not output it the first time
+   redisplay is done. */
+extern int rl_already_prompted;
+
+/* A non-zero value means to read only this many characters rather than
+   up to a character bound to accept-line. */
+extern int rl_num_chars_to_read;
+
+/* The text of a currently-executing keyboard macro. */
+extern char *rl_executing_macro;
+
+/* Variables to control readline signal handling. */
+/* If non-zero, readline will install its own signal handlers for
+   SIGINT, SIGTERM, SIGQUIT, SIGALRM, SIGTSTP, SIGTTIN, and SIGTTOU. */
+extern int rl_catch_signals;
+
+/* If non-zero, readline will install a signal handler for SIGWINCH
+   that also attempts to call any calling application's SIGWINCH signal
+   handler.  Note that the terminal is not cleaned up before the
+   application's signal handler is called; use rl_cleanup_after_signal()
+   to do that. */
+extern int rl_catch_sigwinch;
+
+/* Completion variables. */
+/* Pointer to the generator function for completion_matches ().
+   NULL means to use rl_filename_completion_function (), the default
+   filename completer. */
+extern rl_compentry_func_t *rl_completion_entry_function;
+
+/* If rl_ignore_some_completions_function is non-NULL it is the address
+   of a function to call after all of the possible matches have been
+   generated, but before the actual completion is done to the input line.
+   The function is called with one argument; a NULL terminated array
+   of (char *).  If your function removes any of the elements, they
+   must be free()'ed. */
+extern rl_compignore_func_t *rl_ignore_some_completions_function;
+
+/* Pointer to alternative function to create matches.
+   Function is called with TEXT, START, and END.
+   START and END are indices in RL_LINE_BUFFER saying what the boundaries
+   of TEXT are.
+   If this function exists and returns NULL then call the value of
+   rl_completion_entry_function to try to match, otherwise use the
+   array of strings returned. */
+extern rl_completion_func_t *rl_attempted_completion_function;
+
+/* The basic list of characters that signal a break between words for the
+   completer routine.  The initial contents of this variable is what
+   breaks words in the shell, i.e. "n\"\\'`@$>". */
+extern const char *rl_basic_word_break_characters;
+
+/* The list of characters that signal a break between words for
+   rl_complete_internal.  The default list is the contents of
+   rl_basic_word_break_characters.  */
+extern /*const*/ char *rl_completer_word_break_characters;
+
+/* Hook function to allow an application to set the completion word
+   break characters before readline breaks up the line.  Allows
+   position-dependent word break characters. */
+extern rl_cpvfunc_t *rl_completion_word_break_hook;
+
+/* List of characters which can be used to quote a substring of the line.
+   Completion occurs on the entire substring, and within the substring   
+   rl_completer_word_break_characters are treated as any other character,
+   unless they also appear within this list. */
+extern const char *rl_completer_quote_characters;
+
+/* List of quote characters which cause a word break. */
+extern const char *rl_basic_quote_characters;
+
+/* List of characters that need to be quoted in filenames by the completer. */
+extern const char *rl_filename_quote_characters;
+
+/* List of characters that are word break characters, but should be left
+   in TEXT when it is passed to the completion function.  The shell uses
+   this to help determine what kind of completing to do. */
+extern const char *rl_special_prefixes;
+
+/* If non-zero, then this is the address of a function to call when
+   completing on a directory name.  The function is called with
+   the address of a string (the current directory name) as an arg.  It
+   changes what is displayed when the possible completions are printed
+   or inserted. */
+extern rl_icppfunc_t *rl_directory_completion_hook;
+
+/* If non-zero, this is the address of a function to call when completing
+   a directory name.  This function takes the address of the directory name
+   to be modified as an argument.  Unlike rl_directory_completion_hook, it
+   only modifies the directory name used in opendir(2), not what is displayed
+   when the possible completions are printed or inserted.  It is called
+   before rl_directory_completion_hook.  I'm not happy with how this works
+   yet, so it's undocumented. */
+extern rl_icppfunc_t *rl_directory_rewrite_hook;
+
+/* Backwards compatibility with previous versions of readline. */
+#define rl_symbolic_link_hook rl_directory_completion_hook
+
+/* If non-zero, then this is the address of a function to call when
+   completing a word would normally display the list of possible matches.
+   This function is called instead of actually doing the display.
+   It takes three arguments: (char **matches, int num_matches, int max_length)
+   where MATCHES is the array of strings that matched, NUM_MATCHES is the
+   number of strings in that array, and MAX_LENGTH is the length of the
+   longest string in that array. */
+extern rl_compdisp_func_t *rl_completion_display_matches_hook;
+
+/* Non-zero means that the results of the matches are to be treated
+   as filenames.  This is ALWAYS zero on entry, and can only be changed
+   within a completion entry finder function. */
+extern int rl_filename_completion_desired;
+
+/* Non-zero means that the results of the matches are to be quoted using
+   double quotes (or an application-specific quoting mechanism) if the
+   filename contains any characters in rl_word_break_chars.  This is
+   ALWAYS non-zero on entry, and can only be changed within a completion
+   entry finder function. */
+extern int rl_filename_quoting_desired;
+
+/* Set to a function to quote a filename in an application-specific fashion.
+   Called with the text to quote, the type of match found (single or multiple)
+   and a pointer to the quoting character to be used, which the function can
+   reset if desired. */
+extern rl_quote_func_t *rl_filename_quoting_function;
+
+/* Function to call to remove quoting characters from a filename.  Called
+   before completion is attempted, so the embedded quotes do not interfere
+   with matching names in the file system. */
+extern rl_dequote_func_t *rl_filename_dequoting_function;
+
+/* Function to call to decide whether or not a word break character is
+   quoted.  If a character is quoted, it does not break words for the
+   completer. */
+extern rl_linebuf_func_t *rl_char_is_quoted_p;
+
+/* Non-zero means to suppress normal filename completion after the
+   user-specified completion function has been called. */
+extern int rl_attempted_completion_over;
+
+/* Set to a character describing the type of completion being attempted by
+   rl_complete_internal; available for use by application completion
+   functions. */
+extern int rl_completion_type;
+
+/* Up to this many items will be displayed in response to a
+   possible-completions call.  After that, we ask the user if she
+   is sure she wants to see them all.  The default value is 100. */
+extern int rl_completion_query_items;
+
+/* Character appended to completed words when at the end of the line.  The
+   default is a space.  Nothing is added if this is '\0'. */
+extern int rl_completion_append_character;
+
+/* If set to non-zero by an application completion function,
+   rl_completion_append_character will not be appended. */
+extern int rl_completion_suppress_append;
+
+/* Set to any quote character readline thinks it finds before any application
+   completion function is called. */
+extern int rl_completion_quote_character;
+
+/* Set to a non-zero value if readline found quoting anywhere in the word to
+   be completed; set before any application completion function is called. */
+extern int rl_completion_found_quote;
+
+/* If non-zero, the completion functions don't append any closing quote.
+   This is set to 0 by rl_complete_internal and may be changed by an
+   application-specific completion function. */
+extern int rl_completion_suppress_quote;
+
+/* If non-zero, a slash will be appended to completed filenames that are
+   symbolic links to directory names, subject to the value of the
+   mark-directories variable (which is user-settable).  This exists so
+   that application completion functions can override the user's preference
+   (set via the mark-symlinked-directories variable) if appropriate.
+   It's set to the value of _rl_complete_mark_symlink_dirs in
+   rl_complete_internal before any application-specific completion
+   function is called, so without that function doing anything, the user's
+   preferences are honored. */
+extern int rl_completion_mark_symlink_dirs;
+
+/* If non-zero, then disallow duplicates in the matches. */
+extern int rl_ignore_completion_duplicates;
+
+/* If this is non-zero, completion is (temporarily) inhibited, and the
+   completion character will be inserted as any other. */
+extern int rl_inhibit_completion;
+
+/* Input error; can be returned by (*rl_getc_function) if readline is reading
+   a top-level command (RL_ISSTATE (RL_STATE_READCMD)). */
+#define READERR                        (-2)
+
+/* Definitions available for use by readline clients. */
+#define RL_PROMPT_START_IGNORE '\001'
+#define RL_PROMPT_END_IGNORE   '\002'
+
+/* Possible values for do_replace argument to rl_filename_quoting_function,
+   called by rl_complete_internal. */
+#define NO_MATCH        0
+#define SINGLE_MATCH    1
+#define MULT_MATCH      2
+
+/* Possible state values for rl_readline_state */
+#define RL_STATE_NONE          0x000000                /* no state; before first call */
+
+#define RL_STATE_INITIALIZING  0x000001        /* initializing */
+#define RL_STATE_INITIALIZED   0x000002        /* initialization done */
+#define RL_STATE_TERMPREPPED   0x000004        /* terminal is prepped */
+#define RL_STATE_READCMD       0x000008        /* reading a command key */
+#define RL_STATE_METANEXT      0x000010        /* reading input after ESC */
+#define RL_STATE_DISPATCHING   0x000020        /* dispatching to a command */
+#define RL_STATE_MOREINPUT     0x000040        /* reading more input in a command function */
+#define RL_STATE_ISEARCH       0x000080        /* doing incremental search */
+#define RL_STATE_NSEARCH       0x000100        /* doing non-inc search */
+#define RL_STATE_SEARCH                0x000200        /* doing a history search */
+#define RL_STATE_NUMERICARG    0x000400        /* reading numeric argument */
+#define RL_STATE_MACROINPUT    0x000800        /* getting input from a macro */
+#define RL_STATE_MACRODEF      0x001000        /* defining keyboard macro */
+#define RL_STATE_OVERWRITE     0x002000        /* overwrite mode */
+#define RL_STATE_COMPLETING    0x004000        /* doing completion */
+#define RL_STATE_SIGHANDLER    0x008000        /* in readline sighandler */
+#define RL_STATE_UNDOING       0x010000        /* doing an undo */
+#define RL_STATE_INPUTPENDING  0x020000        /* rl_execute_next called */
+#define RL_STATE_TTYCSAVED     0x040000        /* tty special chars saved */
+#define RL_STATE_CALLBACK      0x080000        /* using the callback interface */
+#define RL_STATE_VIMOTION      0x100000        /* reading vi motion arg */
+#define RL_STATE_MULTIKEY      0x200000        /* reading multiple-key command */
+#define RL_STATE_VICMDONCE     0x400000        /* entered vi command mode at least once */
+
+#define RL_STATE_DONE          0x800000        /* done; accepted line */
+
+#define RL_SETSTATE(x)         (rl_readline_state |= (x))
+#define RL_UNSETSTATE(x)       (rl_readline_state &= ~(x))
+#define RL_ISSTATE(x)          (rl_readline_state & (x))
+
+struct readline_state {
+  /* line state */
+  int point;
+  int end;
+  int mark;
+  char *buffer;
+  int buflen;
+  UNDO_LIST *ul;
+  char *prompt;
+
+  /* global state */
+  int rlstate;
+  int done;
+  Keymap kmap;
+
+  /* input state */
+  rl_command_func_t *lastfunc;
+  int insmode;
+  int edmode;
+  int kseqlen;
+  FILE *inf;
+  FILE *outf;
+  int pendingin;
+  char *macro;
+
+  /* signal state */
+  int catchsigs;
+  int catchsigwinch;
+
+  /* search state */
+
+  /* completion state */
+
+  /* options state */
+
+  /* reserved for future expansion, so the struct size doesn't change */
+  char reserved[64];
+};
+
+extern int rl_save_state PARAMS((struct readline_state *));
+extern int rl_restore_state PARAMS((struct readline_state *));
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _READLINE_H_ */
diff --git a/rlconf.h b/rlconf.h
new file mode 100644 (file)
index 0000000..ff3929e
--- /dev/null
+++ b/rlconf.h
@@ -0,0 +1,63 @@
+/* rlconf.h -- readline configuration definitions */
+
+/* Copyright (C) 1994 Free Software Foundation, Inc.
+
+   This file contains the Readline Library (the Library), a set of
+   routines for providing Emacs style line input to programs that ask
+   for it.
+
+   The Library 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.
+
+   The Library is distributed in the hope that it will be useful, but
+   WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   General Public License for more details.
+
+   The GNU General Public License is often shipped with GNU software, and
+   is generally kept in a file called COPYING or LICENSE.  If you do not
+   have a copy of the license, write to the Free Software Foundation,
+   59 Temple Place, Suite 330, Boston, MA 02111 USA. */
+
+#if !defined (_RLCONF_H_)
+#define _RLCONF_H_
+
+/* Define this if you want the vi-mode editing available. */
+#define VI_MODE
+
+/* Define this to get an indication of file type when listing completions. */
+#define VISIBLE_STATS
+
+/* This definition is needed by readline.c, rltty.c, and signals.c. */
+/* If on, then readline handles signals in a way that doesn't screw. */
+#define HANDLE_SIGNALS
+
+/* Ugly but working hack for binding prefix meta. */
+#define PREFIX_META_HACK
+
+/* The next-to-last-ditch effort file name for a user-specific init file. */
+#define DEFAULT_INPUTRC "~/.inputrc"
+
+/* The ultimate last-ditch filenname for an init file -- system-wide. */
+#define SYS_INPUTRC "/etc/inputrc"
+
+/* If defined, expand tabs to spaces. */
+#define DISPLAY_TABS
+
+/* If defined, use the terminal escape sequence to move the cursor forward
+   over a character when updating the line rather than rewriting it. */
+/* #define HACK_TERMCAP_MOTION */
+
+/* The string inserted by the `insert comment' command. */
+#define RL_COMMENT_BEGIN_DEFAULT "#"
+
+/* Define this if you want code that allows readline to be used in an
+   X `callback' style. */
+#define READLINE_CALLBACKS
+
+/* Define this if you want the cursor to indicate insert or overwrite mode. */
+/* #define CURSOR_MODE */
+
+#endif /* _RLCONF_H_ */
diff --git a/rldefs.h b/rldefs.h
new file mode 100644 (file)
index 0000000..0f6c874
--- /dev/null
+++ b/rldefs.h
@@ -0,0 +1,160 @@
+/* rldefs.h -- an attempt to isolate some of the system-specific defines
+   for readline.  This should be included after any files that define
+   system-specific constants like _POSIX_VERSION or USG. */
+
+/* Copyright (C) 1987-2005 Free Software Foundation, Inc.
+
+   This file contains the Readline Library (the Library), a set of
+   routines for providing Emacs style line input to programs that ask
+   for it.
+
+   The Library 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.
+
+   The Library is distributed in the hope that it will be useful, but
+   WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   General Public License for more details.
+
+   The GNU General Public License is often shipped with GNU software, and
+   is generally kept in a file called COPYING or LICENSE.  If you do not
+   have a copy of the license, write to the Free Software Foundation,
+   59 Temple Place, Suite 330, Boston, MA 02111 USA. */
+
+#if !defined (_RLDEFS_H_)
+#define _RLDEFS_H_
+
+#if defined (HAVE_CONFIG_H)
+#  include "config.h"
+#endif
+
+#include "rlstdc.h"
+
+#if defined (_POSIX_VERSION) && !defined (TERMIOS_MISSING)
+#  define TERMIOS_TTY_DRIVER
+#else
+#  if defined (HAVE_TERMIO_H)
+#    define TERMIO_TTY_DRIVER
+#  else
+#    if !defined (__MINGW32__)
+#      define NEW_TTY_DRIVER
+#    else
+#      define NO_TTY_DRIVER
+#    endif
+#  endif
+#endif
+
+/* Posix macro to check file in statbuf for directory-ness.
+   This requires that <sys/stat.h> be included before this test. */
+#if defined (S_IFDIR) && !defined (S_ISDIR)
+#  define S_ISDIR(m) (((m)&S_IFMT) == S_IFDIR)
+#endif
+
+/* Decide which flavor of the header file describing the C library
+   string functions to include and include it. */
+
+#if defined (HAVE_STRING_H)
+#  include <string.h>
+#else /* !HAVE_STRING_H */
+#  include <strings.h>
+#endif /* !HAVE_STRING_H */
+
+#if !defined (strchr) && !defined (__STDC__)
+extern char *strchr (), *strrchr ();
+#endif /* !strchr && !__STDC__ */
+
+#if defined (PREFER_STDARG)
+#  include <stdarg.h>
+#else
+#  if defined (PREFER_VARARGS)
+#    include <varargs.h>
+#  endif
+#endif
+
+#if defined (HAVE_STRCASECMP)
+#define _rl_stricmp strcasecmp
+#define _rl_strnicmp strncasecmp
+#else
+extern int _rl_stricmp PARAMS((char *, char *));
+extern int _rl_strnicmp PARAMS((char *, char *, int));
+#endif
+
+#if defined (HAVE_STRPBRK) && !defined (HAVE_MULTIBYTE)
+#  define _rl_strpbrk(a,b)     strpbrk((a),(b))
+#else
+extern char *_rl_strpbrk PARAMS((const char *, const char *));
+#endif
+
+#if !defined (emacs_mode)
+#  define no_mode -1
+#  define vi_mode 0
+#  define emacs_mode 1
+#endif
+
+#if !defined (RL_IM_INSERT)
+#  define RL_IM_INSERT         1
+#  define RL_IM_OVERWRITE      0
+#
+#  define RL_IM_DEFAULT                RL_IM_INSERT
+#endif
+
+/* If you cast map[key].function to type (Keymap) on a Cray,
+   the compiler takes the value of map[key].function and
+   divides it by 4 to convert between pointer types (pointers
+   to functions and pointers to structs are different sizes).
+   This is not what is wanted. */
+#if defined (CRAY)
+#  define FUNCTION_TO_KEYMAP(map, key) (Keymap)((int)map[key].function)
+#  define KEYMAP_TO_FUNCTION(data)     (rl_command_func_t *)((int)(data))
+#else
+#  define FUNCTION_TO_KEYMAP(map, key) (Keymap)(map[key].function)
+#  define KEYMAP_TO_FUNCTION(data)     (rl_command_func_t *)(data)
+#endif
+
+#ifndef savestring
+#define savestring(x) strcpy ((char *)xmalloc (1 + strlen (x)), (x))
+#endif
+
+/* Possible values for _rl_bell_preference. */
+#define NO_BELL 0
+#define AUDIBLE_BELL 1
+#define VISIBLE_BELL 2
+
+/* Definitions used when searching the line for characters. */
+/* NOTE: it is necessary that opposite directions are inverses */
+#define        FTO      1              /* forward to */
+#define BTO    -1              /* backward to */
+#define FFIND   2              /* forward find */
+#define BFIND  -2              /* backward find */
+
+/* Possible values for the found_quote flags word used by the completion
+   functions.  It says what kind of (shell-like) quoting we found anywhere
+   in the line. */
+#define RL_QF_SINGLE_QUOTE     0x01
+#define RL_QF_DOUBLE_QUOTE     0x02
+#define RL_QF_BACKSLASH                0x04
+#define RL_QF_OTHER_QUOTE      0x08
+
+/* Default readline line buffer length. */
+#define DEFAULT_BUFFER_SIZE 256
+
+#if !defined (STREQ)
+#define STREQ(a, b)    (((a)[0] == (b)[0]) && (strcmp ((a), (b)) == 0))
+#define STREQN(a, b, n)        (((n) == 0) ? (1) \
+                                   : ((a)[0] == (b)[0]) && (strncmp ((a), (b), (n)) == 0))
+#endif
+
+#if !defined (FREE)
+#  define FREE(x)      if (x) free (x)
+#endif
+
+#if !defined (SWAP)
+#  define SWAP(s, e)  do { int t; t = s; s = e; e = t; } while (0)
+#endif
+
+/* CONFIGURATION SECTION */
+#include "rlconf.h"
+
+#endif /* !_RLDEFS_H_ */
diff --git a/rlmbutil.h b/rlmbutil.h
new file mode 100644 (file)
index 0000000..dd317e2
--- /dev/null
@@ -0,0 +1,155 @@
+/* rlmbutil.h -- utility functions for multibyte characters. */
+
+/* Copyright (C) 2001 Free Software Foundation, Inc.
+
+   This file is part of the GNU Readline Library, a library for
+   reading lines of text with interactive input and history editing.
+
+   The GNU Readline Library 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.
+
+   The GNU Readline Library is distributed in the hope that it will be
+   useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+   of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   The GNU General Public License is often shipped with GNU software, and
+   is generally kept in a file called COPYING or LICENSE.  If you do not
+   have a copy of the license, write to the Free Software Foundation,
+   59 Temple Place, Suite 330, Boston, MA 02111 USA. */
+
+#if !defined (_RL_MBUTIL_H_)
+#define _RL_MBUTIL_H_
+
+#include "rlstdc.h"
+
+/************************************************/
+/* check multibyte capability for I18N code     */
+/************************************************/
+
+/* For platforms which support the ISO C amendement 1 functionality we
+   support user defined character classes.  */
+   /* Solaris 2.5 has a bug: <wchar.h> must be included before <wctype.h>.  */
+#if defined (HAVE_WCTYPE_H) && defined (HAVE_WCHAR_H) && defined (HAVE_LOCALE_H)
+#  include <wchar.h>
+#  include <wctype.h>
+#  if defined (HAVE_ISWCTYPE) && \
+      defined (HAVE_ISWLOWER) && \
+      defined (HAVE_ISWUPPER) && \
+      defined (HAVE_MBSRTOWCS) && \
+      defined (HAVE_MBRTOWC) && \
+      defined (HAVE_MBRLEN) && \
+      defined (HAVE_TOWLOWER) && \
+      defined (HAVE_TOWUPPER) && \
+      defined (HAVE_WCHAR_T) && \
+      defined (HAVE_WCWIDTH)
+     /* system is supposed to support XPG5 */
+#    define HANDLE_MULTIBYTE      1
+#  endif
+#endif
+
+/* If we don't want multibyte chars even on a system that supports them, let
+   the configuring user turn multibyte support off. */
+#if defined (NO_MULTIBYTE_SUPPORT)
+#  undef HANDLE_MULTIBYTE
+#endif
+
+/* Some systems, like BeOS, have multibyte encodings but lack mbstate_t.  */
+#if HANDLE_MULTIBYTE && !defined (HAVE_MBSTATE_T)
+#  define wcsrtombs(dest, src, len, ps) (wcsrtombs) (dest, src, len, 0)
+#  define mbsrtowcs(dest, src, len, ps) (mbsrtowcs) (dest, src, len, 0)
+#  define wcrtomb(s, wc, ps) (wcrtomb) (s, wc, 0)
+#  define mbrtowc(pwc, s, n, ps) (mbrtowc) (pwc, s, n, 0)
+#  define mbrlen(s, n, ps) (mbrlen) (s, n, 0)
+#  define mbstate_t int
+#endif
+
+/* Make sure MB_LEN_MAX is at least 16 on systems that claim to be able to
+   handle multibyte chars (some systems define MB_LEN_MAX as 1) */
+#ifdef HANDLE_MULTIBYTE
+#  include <limits.h>
+#  if defined(MB_LEN_MAX) && (MB_LEN_MAX < 16)
+#    undef MB_LEN_MAX
+#  endif
+#  if !defined (MB_LEN_MAX)
+#    define MB_LEN_MAX 16
+#  endif
+#endif
+
+/************************************************/
+/* end of multibyte capability checks for I18N  */
+/************************************************/
+
+/*
+ * Flags for _rl_find_prev_mbchar and _rl_find_next_mbchar:
+ *
+ * MB_FIND_ANY         find any multibyte character
+ * MB_FIND_NONZERO     find a non-zero-width multibyte character
+ */
+
+#define MB_FIND_ANY    0x00
+#define MB_FIND_NONZERO        0x01
+
+extern int _rl_find_prev_mbchar PARAMS((char *, int, int));
+extern int _rl_find_next_mbchar PARAMS((char *, int, int, int));
+
+#ifdef HANDLE_MULTIBYTE
+
+extern int _rl_compare_chars PARAMS((char *, int, mbstate_t *, char *, int, mbstate_t *));
+extern int _rl_get_char_len PARAMS((char *, mbstate_t *));
+extern int _rl_adjust_point PARAMS((char *, int, mbstate_t *));
+
+extern int _rl_read_mbchar PARAMS((char *, int));
+extern int _rl_read_mbstring PARAMS((int, char *, int));
+
+extern int _rl_is_mbchar_matched PARAMS((char *, int, int, char *, int));
+
+extern wchar_t _rl_char_value PARAMS((char *, int));
+extern int _rl_walphabetic PARAMS((wchar_t));
+
+#define _rl_to_wupper(wc)      (iswlower (wc) ? towupper (wc) : (wc))
+#define _rl_to_wlower(wc)      (iswupper (wc) ? towlower (wc) : (wc))
+
+#define MB_NEXTCHAR(b,s,c,f) \
+       ((MB_CUR_MAX > 1 && rl_byte_oriented == 0) \
+               ? _rl_find_next_mbchar ((b), (s), (c), (f)) \
+               : ((s) + (c)))
+#define MB_PREVCHAR(b,s,f) \
+       ((MB_CUR_MAX > 1 && rl_byte_oriented == 0) \
+               ? _rl_find_prev_mbchar ((b), (s), (f)) \
+               : ((s) - 1))
+
+#define MB_INVALIDCH(x)                ((x) == (size_t)-1 || (x) == (size_t)-2)
+#define MB_NULLWCH(x)          ((x) == 0)
+
+#else /* !HANDLE_MULTIBYTE */
+
+#undef MB_LEN_MAX
+#undef MB_CUR_MAX
+
+#define MB_LEN_MAX     1
+#define MB_CUR_MAX     1
+
+#define _rl_find_prev_mbchar(b, i, f)          (((i) == 0) ? (i) : ((i) - 1))
+#define _rl_find_next_mbchar(b, i1, i2, f)     ((i1) + (i2))
+
+#define _rl_char_value(buf,ind)        ((buf)[(ind)])
+
+#define _rl_walphabetic(c)     (rl_alphabetic (c))
+
+#define _rl_to_wupper(c)       (_rl_to_upper (c))
+#define _rl_to_wlower(c)       (_rl_to_lower (c))
+
+#define MB_NEXTCHAR(b,s,c,f)   ((s) + (c))
+#define MB_PREVCHAR(b,s,f)     ((s) - 1)
+
+#define MB_INVALIDCH(x)                (0)
+#define MB_NULLWCH(x)          (0)
+
+#endif /* !HANDLE_MULTIBYTE */
+
+extern int rl_byte_oriented;
+
+#endif /* _RL_MBUTIL_H_ */
diff --git a/rlprivate.h b/rlprivate.h
new file mode 100644 (file)
index 0000000..64aa7bd
--- /dev/null
@@ -0,0 +1,425 @@
+/* rlprivate.h -- functions and variables global to the readline library,
+                 but not intended for use by applications. */
+
+/* Copyright (C) 1999-2005 Free Software Foundation, Inc.
+
+   This file is part of the GNU Readline Library, a library for
+   reading lines of text with interactive input and history editing.
+
+   The GNU Readline Library 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.
+
+   The GNU Readline Library is distributed in the hope that it will be
+   useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+   of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   The GNU General Public License is often shipped with GNU software, and
+   is generally kept in a file called COPYING or LICENSE.  If you do not
+   have a copy of the license, write to the Free Software Foundation,
+   59 Temple Place, Suite 330, Boston, MA 02111 USA. */
+
+#if !defined (_RL_PRIVATE_H_)
+#define _RL_PRIVATE_H_
+
+#include "rlconf.h"    /* for VISIBLE_STATS */
+#include "rlstdc.h"
+#include "posixjmp.h"  /* defines procenv_t */
+
+/*************************************************************************
+ *                                                                      *
+ * Global structs undocumented in texinfo manual and not in readline.h   *
+ *                                                                      *
+ *************************************************************************/
+/* search types */
+#define RL_SEARCH_ISEARCH      0x01            /* incremental search */
+#define RL_SEARCH_NSEARCH      0x02            /* non-incremental search */
+#define RL_SEARCH_CSEARCH      0x04            /* intra-line char search */
+
+/* search flags */
+#define SF_REVERSE             0x01
+#define SF_FOUND               0x02
+#define SF_FAILED              0x04
+
+typedef struct  __rl_search_context
+{
+  int type;
+  int sflags;
+
+  char *search_string;
+  int search_string_index;
+  int search_string_size;
+
+  char **lines;
+  char *allocated_line;    
+  int hlen;
+  int hindex;
+
+  int save_point;
+  int save_mark;
+  int save_line;
+  int last_found_line;
+  char *prev_line_found;
+
+  UNDO_LIST *save_undo_list;
+
+  int history_pos;
+  int direction;
+
+  int lastc;
+#if defined (HANDLE_MULTIBYTE)
+  char mb[MB_LEN_MAX];
+#endif
+
+  char *sline;
+  int sline_len;
+  int sline_index;
+
+  char  *search_terminators;
+} _rl_search_cxt;
+
+/* Callback data for reading numeric arguments */
+#define NUM_SAWMINUS   0x01
+#define NUM_SAWDIGITS  0x02
+#define NUM_READONE    0x04
+
+typedef int _rl_arg_cxt;
+
+/* A context for reading key sequences longer than a single character when
+   using the callback interface. */
+#define KSEQ_DISPATCHED        0x01
+#define KSEQ_SUBSEQ    0x02
+#define KSEQ_RECURSIVE 0x04
+
+typedef struct __rl_keyseq_context
+{
+  int flags;
+  int subseq_arg;
+  int subseq_retval;           /* XXX */
+  Keymap dmap;
+
+  Keymap oldmap;
+  int okey;
+  struct __rl_keyseq_context *ocxt;
+  int childval;
+} _rl_keyseq_cxt;
+
+  /* fill in more as needed */
+/* `Generic' callback data and functions */
+typedef struct __rl_callback_generic_arg 
+{
+  int count;
+  int i1, i2;
+  /* add here as needed */
+} _rl_callback_generic_arg;
+
+typedef int _rl_callback_func_t PARAMS((_rl_callback_generic_arg *));
+
+/*************************************************************************
+ *                                                                      *
+ * Global functions undocumented in texinfo manual and not in readline.h *
+ *                                                                      *
+ *************************************************************************/
+
+/*************************************************************************
+ *                                                                      *
+ * Global variables undocumented in texinfo manual and not in readline.h *
+ *                                                                      *
+ *************************************************************************/
+
+/* complete.c */
+extern int rl_complete_with_tilde_expansion;
+#if defined (VISIBLE_STATS)
+extern int rl_visible_stats;
+#endif /* VISIBLE_STATS */
+
+/* readline.c */
+extern int rl_line_buffer_len;
+extern int rl_arg_sign;
+extern int rl_visible_prompt_length;
+extern int readline_echoing_p;
+extern int rl_key_sequence_length;
+extern int rl_byte_oriented;
+
+extern _rl_keyseq_cxt *_rl_kscxt;
+
+/* display.c */
+extern int rl_display_fixed;
+
+/* parens.c */
+extern int rl_blink_matching_paren;
+
+/*************************************************************************
+ *                                                                      *
+ * Global functions and variables unsed and undocumented                *
+ *                                                                      *
+ *************************************************************************/
+
+/* kill.c */
+extern int rl_set_retained_kills PARAMS((int));
+
+/* terminal.c */
+extern void _rl_set_screen_size PARAMS((int, int));
+
+/* undo.c */
+extern int _rl_fix_last_undo_of_type PARAMS((int, int, int));
+
+/* util.c */
+extern char *_rl_savestring PARAMS((const char *));
+
+/*************************************************************************
+ *                                                                      *
+ * Functions and variables private to the readline library              *
+ *                                                                      *
+ *************************************************************************/
+
+/* NOTE: Functions and variables prefixed with `_rl_' are
+   pseudo-global: they are global so they can be shared
+   between files in the readline library, but are not intended
+   to be visible to readline callers. */
+
+/*************************************************************************
+ * Undocumented private functions                                       *
+ *************************************************************************/
+
+#if defined(READLINE_CALLBACKS)
+
+/* readline.c */
+extern void readline_internal_setup PARAMS((void));
+extern char *readline_internal_teardown PARAMS((int));
+extern int readline_internal_char PARAMS((void));
+
+extern _rl_keyseq_cxt *_rl_keyseq_cxt_alloc PARAMS((void));
+extern void _rl_keyseq_cxt_dispose PARAMS((_rl_keyseq_cxt *));
+extern void _rl_keyseq_chain_dispose PARAMS((void));
+
+extern int _rl_dispatch_callback PARAMS((_rl_keyseq_cxt *));
+     
+/* callback.c */
+extern _rl_callback_generic_arg *_rl_callback_data_alloc PARAMS((int));
+extern void _rl_callback_data_dispose PARAMS((_rl_callback_generic_arg *));
+
+#endif /* READLINE_CALLBACKS */
+
+/* bind.c */
+
+/* complete.c */
+extern char _rl_find_completion_word PARAMS((int *, int *));
+extern void _rl_free_match_list PARAMS((char **));
+
+/* display.c */
+extern char *_rl_strip_prompt PARAMS((char *));
+extern void _rl_move_cursor_relative PARAMS((int, const char *));
+extern void _rl_move_vert PARAMS((int));
+extern void _rl_save_prompt PARAMS((void));
+extern void _rl_restore_prompt PARAMS((void));
+extern char *_rl_make_prompt_for_search PARAMS((int));
+extern void _rl_erase_at_end_of_line PARAMS((int));
+extern void _rl_clear_to_eol PARAMS((int));
+extern void _rl_clear_screen PARAMS((void));
+extern void _rl_update_final PARAMS((void));
+extern void _rl_redisplay_after_sigwinch PARAMS((void));
+extern void _rl_clean_up_for_exit PARAMS((void));
+extern void _rl_erase_entire_line PARAMS((void));
+extern int _rl_current_display_line PARAMS((void));
+
+/* input.c */
+extern int _rl_any_typein PARAMS((void));
+extern int _rl_input_available PARAMS((void));
+extern int _rl_input_queued PARAMS((int));
+extern void _rl_insert_typein PARAMS((int));
+extern int _rl_unget_char PARAMS((int));
+extern int _rl_pushed_input_available PARAMS((void));
+
+/* isearch.c */
+extern _rl_search_cxt *_rl_scxt_alloc PARAMS((int, int));
+extern void _rl_scxt_dispose PARAMS((_rl_search_cxt *, int));
+
+extern int _rl_isearch_dispatch PARAMS((_rl_search_cxt *, int));
+extern int _rl_isearch_callback PARAMS((_rl_search_cxt *));
+
+extern int _rl_search_getchar PARAMS((_rl_search_cxt *));
+
+/* macro.c */
+extern void _rl_with_macro_input PARAMS((char *));
+extern int _rl_next_macro_key PARAMS((void));
+extern void _rl_push_executing_macro PARAMS((void));
+extern void _rl_pop_executing_macro PARAMS((void));
+extern void _rl_add_macro_char PARAMS((int));
+extern void _rl_kill_kbd_macro PARAMS((void));
+
+/* misc.c */
+extern int _rl_arg_overflow PARAMS((void));
+extern void _rl_arg_init PARAMS((void));
+extern int _rl_arg_getchar PARAMS((void));
+extern int _rl_arg_callback PARAMS((_rl_arg_cxt));
+extern void _rl_reset_argument PARAMS((void));
+
+extern void _rl_start_using_history PARAMS((void));
+extern int _rl_free_saved_history_line PARAMS((void));
+extern void _rl_set_insert_mode PARAMS((int, int));
+
+/* nls.c */
+extern int _rl_init_eightbit PARAMS((void));
+
+/* parens.c */
+extern void _rl_enable_paren_matching PARAMS((int));
+
+/* readline.c */
+extern void _rl_init_line_state PARAMS((void));
+extern void _rl_set_the_line PARAMS((void));
+extern int _rl_dispatch PARAMS((int, Keymap));
+extern int _rl_dispatch_subseq PARAMS((int, Keymap, int));
+extern void _rl_internal_char_cleanup PARAMS((void));
+
+/* rltty.c */
+extern int _rl_disable_tty_signals PARAMS((void));
+extern int _rl_restore_tty_signals PARAMS((void));
+
+/* search.c */
+extern int _rl_nsearch_callback PARAMS((_rl_search_cxt *));
+
+/* terminal.c */
+extern void _rl_get_screen_size PARAMS((int, int));
+extern int _rl_init_terminal_io PARAMS((const char *));
+#ifdef _MINIX
+extern void _rl_output_character_function PARAMS((int));
+#else
+extern int _rl_output_character_function PARAMS((int));
+#endif
+extern void _rl_output_some_chars PARAMS((const char *, int));
+extern int _rl_backspace PARAMS((int));
+extern void _rl_enable_meta_key PARAMS((void));
+extern void _rl_control_keypad PARAMS((int));
+extern void _rl_set_cursor PARAMS((int, int));
+
+/* text.c */
+extern void _rl_fix_point PARAMS((int));
+extern int _rl_replace_text PARAMS((const char *, int, int));
+extern int _rl_insert_char PARAMS((int, int));
+extern int _rl_overwrite_char PARAMS((int, int));
+extern int _rl_overwrite_rubout PARAMS((int, int));
+extern int _rl_rubout_char PARAMS((int, int));
+#if defined (HANDLE_MULTIBYTE)
+extern int _rl_char_search_internal PARAMS((int, int, char *, int));
+#else
+extern int _rl_char_search_internal PARAMS((int, int, int));
+#endif
+extern int _rl_set_mark_at_pos PARAMS((int));
+
+/* undo.c */
+extern UNDO_LIST *_rl_copy_undo_entry PARAMS((UNDO_LIST *));
+extern UNDO_LIST *_rl_copy_undo_list PARAMS((UNDO_LIST *));
+
+/* util.c */
+extern int _rl_abort_internal PARAMS((void));
+extern char *_rl_strindex PARAMS((const char *, const char *));
+extern int _rl_qsort_string_compare PARAMS((char **, char **));
+extern int (_rl_uppercase_p) PARAMS((int));
+extern int (_rl_lowercase_p) PARAMS((int));
+extern int (_rl_pure_alphabetic) PARAMS((int));
+extern int (_rl_digit_p) PARAMS((int));
+extern int (_rl_to_lower) PARAMS((int));
+extern int (_rl_to_upper) PARAMS((int));
+extern int (_rl_digit_value) PARAMS((int));
+
+/* vi_mode.c */
+extern void _rl_vi_initialize_line PARAMS((void));
+extern void _rl_vi_reset_last PARAMS((void));
+extern void _rl_vi_set_last PARAMS((int, int, int));
+extern int _rl_vi_textmod_command PARAMS((int));
+extern void _rl_vi_done_inserting PARAMS((void));
+
+/*************************************************************************
+ * Undocumented private variables                                       *
+ *************************************************************************/
+
+/* bind.c */
+extern const char *_rl_possible_control_prefixes[];
+extern const char *_rl_possible_meta_prefixes[];
+
+/* callback.c */
+extern _rl_callback_func_t *_rl_callback_func;
+extern _rl_callback_generic_arg *_rl_callback_data;
+
+/* complete.c */
+extern int _rl_complete_show_all;
+extern int _rl_complete_show_unmodified;
+extern int _rl_complete_mark_directories;
+extern int _rl_complete_mark_symlink_dirs;
+extern int _rl_print_completions_horizontally;
+extern int _rl_completion_case_fold;
+extern int _rl_match_hidden_files;
+extern int _rl_page_completions;
+
+/* display.c */
+extern int _rl_vis_botlin;
+extern int _rl_last_c_pos;
+extern int _rl_suppress_redisplay;
+extern int _rl_want_redisplay;
+extern char *rl_display_prompt;
+
+/* isearch.c */
+extern char *_rl_isearch_terminators;
+
+extern _rl_search_cxt *_rl_iscxt;
+
+/* macro.c */
+extern char *_rl_executing_macro;
+
+/* misc.c */
+extern int _rl_history_preserve_point;
+extern int _rl_history_saved_point;
+
+extern _rl_arg_cxt _rl_argcxt;
+
+/* readline.c */
+extern int _rl_horizontal_scroll_mode;
+extern int _rl_mark_modified_lines;
+extern int _rl_bell_preference;
+extern int _rl_meta_flag;
+extern int _rl_convert_meta_chars_to_ascii;
+extern int _rl_output_meta_chars;
+extern int _rl_bind_stty_chars;
+extern char *_rl_comment_begin;
+extern unsigned char _rl_parsing_conditionalized_out;
+extern Keymap _rl_keymap;
+extern FILE *_rl_in_stream;
+extern FILE *_rl_out_stream;
+extern int _rl_last_command_was_kill;
+extern int _rl_eof_char;
+extern procenv_t readline_top_level;
+
+/* search.c */
+extern _rl_search_cxt *_rl_nscxt;
+
+/* terminal.c */
+extern int _rl_enable_keypad;
+extern int _rl_enable_meta;
+extern char *_rl_term_clreol;
+extern char *_rl_term_clrpag;
+extern char *_rl_term_im;
+extern char *_rl_term_ic;
+extern char *_rl_term_ei;
+extern char *_rl_term_DC;
+extern char *_rl_term_up;
+extern char *_rl_term_dc;
+extern char *_rl_term_cr;
+extern char *_rl_term_IC;
+extern char *_rl_term_forward_char;
+extern int _rl_screenheight;
+extern int _rl_screenwidth;
+extern int _rl_screenchars;
+extern int _rl_terminal_can_insert;
+extern int _rl_term_autowrap;
+
+/* undo.c */
+extern int _rl_doing_an_undo;
+extern int _rl_undo_group_level;
+
+/* vi_mode.c */
+extern int _rl_vi_last_command;
+
+#endif /* _RL_PRIVATE_H_ */
diff --git a/rlshell.h b/rlshell.h
new file mode 100644 (file)
index 0000000..3c03fba
--- /dev/null
+++ b/rlshell.h
@@ -0,0 +1,34 @@
+/* rlshell.h -- utility functions normally provided by bash. */
+
+/* Copyright (C) 1999 Free Software Foundation, Inc.
+
+   This file is part of the GNU Readline Library, a library for
+   reading lines of text with interactive input and history editing.
+
+   The GNU Readline Library 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.
+
+   The GNU Readline Library is distributed in the hope that it will be
+   useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+   of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   The GNU General Public License is often shipped with GNU software, and
+   is generally kept in a file called COPYING or LICENSE.  If you do not
+   have a copy of the license, write to the Free Software Foundation,
+   59 Temple Place, Suite 330, Boston, MA 02111 USA. */
+
+#if !defined (_RL_SHELL_H_)
+#define _RL_SHELL_H_
+
+#include "rlstdc.h"
+
+extern char *sh_single_quote PARAMS((char *));
+extern void sh_set_lines_and_columns PARAMS((int, int));
+extern char *sh_get_env_value PARAMS((const char *));
+extern char *sh_get_home_dir PARAMS((void));
+extern int sh_unset_nodelay_mode PARAMS((int));
+
+#endif /* _RL_SHELL_H_ */
diff --git a/rlstdc.h b/rlstdc.h
new file mode 100644 (file)
index 0000000..847fa9c
--- /dev/null
+++ b/rlstdc.h
@@ -0,0 +1,45 @@
+/* stdc.h -- macros to make source compile on both ANSI C and K&R C
+   compilers. */
+
+/* Copyright (C) 1993 Free Software Foundation, Inc.
+
+   This file is part of GNU Bash, the Bourne Again SHell.
+
+   Bash 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.
+
+   Bash 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 Bash; see the file COPYING.  If not, write to the Free
+   Software Foundation, 59 Temple Place, Suite 330, Boston, MA 02111 USA. */
+
+#if !defined (_RL_STDC_H_)
+#define _RL_STDC_H_
+
+/* Adapted from BSD /usr/include/sys/cdefs.h. */
+
+/* A function can be defined using prototypes and compile on both ANSI C
+   and traditional C compilers with something like this:
+       extern char *func PARAMS((char *, char *, int)); */
+
+#if !defined (PARAMS)
+#  if defined (__STDC__) || defined (__GNUC__) || defined (__cplusplus)
+#    define PARAMS(protos) protos
+#  else
+#    define PARAMS(protos) ()
+#  endif
+#endif
+
+#ifndef __attribute__
+#  if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 8)
+#    define __attribute__(x)
+#  endif
+#endif
+
+#endif /* !_RL_STDC_H_ */
diff --git a/rltty.c b/rltty.c
new file mode 100644 (file)
index 0000000..0a570f8
--- /dev/null
+++ b/rltty.c
@@ -0,0 +1,1034 @@
+/* rltty.c -- functions to prepare and restore the terminal for readline's
+   use. */
+
+/* Copyright (C) 1992-2005 Free Software Foundation, Inc.
+
+   This file is part of the GNU Readline Library, a library for
+   reading lines of text with interactive input and history editing.
+
+   The GNU Readline Library 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.
+
+   The GNU Readline Library is distributed in the hope that it will be
+   useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+   of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   The GNU General Public License is often shipped with GNU software, and
+   is generally kept in a file called COPYING or LICENSE.  If you do not
+   have a copy of the license, write to the Free Software Foundation,
+   59 Temple Place, Suite 330, Boston, MA 02111 USA. */
+#define READLINE_LIBRARY
+
+#if defined (HAVE_CONFIG_H)
+#  include <config.h>
+#endif
+
+#include <sys/types.h>
+#include <signal.h>
+#include <errno.h>
+#include <stdio.h>
+
+#if defined (HAVE_UNISTD_H)
+#  include <unistd.h>
+#endif /* HAVE_UNISTD_H */
+
+#include "rldefs.h"
+
+#if defined (GWINSZ_IN_SYS_IOCTL)
+#  include <sys/ioctl.h>
+#endif /* GWINSZ_IN_SYS_IOCTL */
+
+#include "rltty.h"
+#include "readline.h"
+#include "rlprivate.h"
+
+#if !defined (errno)
+extern int errno;
+#endif /* !errno */
+
+rl_vintfunc_t *rl_prep_term_function = rl_prep_terminal;
+rl_voidfunc_t *rl_deprep_term_function = rl_deprep_terminal;
+
+static void block_sigint PARAMS((void));
+static void release_sigint PARAMS((void));
+
+static void set_winsize PARAMS((int));
+
+/* **************************************************************** */
+/*                                                                 */
+/*                        Signal Management                        */
+/*                                                                 */
+/* **************************************************************** */
+
+#if defined (HAVE_POSIX_SIGNALS)
+static sigset_t sigint_set, sigint_oset;
+#else /* !HAVE_POSIX_SIGNALS */
+#  if defined (HAVE_BSD_SIGNALS)
+static int sigint_oldmask;
+#  endif /* HAVE_BSD_SIGNALS */
+#endif /* !HAVE_POSIX_SIGNALS */
+
+static int sigint_blocked;
+
+/* Cause SIGINT to not be delivered until the corresponding call to
+   release_sigint(). */
+static void
+block_sigint ()
+{
+  if (sigint_blocked)
+    return;
+
+#if defined (HAVE_POSIX_SIGNALS)
+  sigemptyset (&sigint_set);
+  sigemptyset (&sigint_oset);
+  sigaddset (&sigint_set, SIGINT);
+  sigprocmask (SIG_BLOCK, &sigint_set, &sigint_oset);
+#else /* !HAVE_POSIX_SIGNALS */
+#  if defined (HAVE_BSD_SIGNALS)
+  sigint_oldmask = sigblock (sigmask (SIGINT));
+#  else /* !HAVE_BSD_SIGNALS */
+#    if defined (HAVE_USG_SIGHOLD)
+  sighold (SIGINT);
+#    endif /* HAVE_USG_SIGHOLD */
+#  endif /* !HAVE_BSD_SIGNALS */
+#endif /* !HAVE_POSIX_SIGNALS */
+
+  sigint_blocked = 1;
+}
+
+/* Allow SIGINT to be delivered. */
+static void
+release_sigint ()
+{
+  if (sigint_blocked == 0)
+    return;
+
+#if defined (HAVE_POSIX_SIGNALS)
+  sigprocmask (SIG_SETMASK, &sigint_oset, (sigset_t *)NULL);
+#else
+#  if defined (HAVE_BSD_SIGNALS)
+  sigsetmask (sigint_oldmask);
+#  else /* !HAVE_BSD_SIGNALS */
+#    if defined (HAVE_USG_SIGHOLD)
+  sigrelse (SIGINT);
+#    endif /* HAVE_USG_SIGHOLD */
+#  endif /* !HAVE_BSD_SIGNALS */
+#endif /* !HAVE_POSIX_SIGNALS */
+
+  sigint_blocked = 0;
+}
+
+/* **************************************************************** */
+/*                                                                 */
+/*                   Saving and Restoring the TTY                  */
+/*                                                                 */
+/* **************************************************************** */
+
+/* Non-zero means that the terminal is in a prepped state. */
+static int terminal_prepped;
+
+static _RL_TTY_CHARS _rl_tty_chars, _rl_last_tty_chars;
+
+/* If non-zero, means that this process has called tcflow(fd, TCOOFF)
+   and output is suspended. */
+#if defined (__ksr1__)
+static int ksrflow;
+#endif
+
+/* Dummy call to force a backgrounded readline to stop before it tries
+   to get the tty settings. */
+static void
+set_winsize (tty)
+     int tty;
+{
+#if defined (TIOCGWINSZ)
+  struct winsize w;
+
+  if (ioctl (tty, TIOCGWINSZ, &w) == 0)
+      (void) ioctl (tty, TIOCSWINSZ, &w);
+#endif /* TIOCGWINSZ */
+}
+
+#if defined (NO_TTY_DRIVER)
+/* Nothing */
+#elif defined (NEW_TTY_DRIVER)
+
+/* Values for the `flags' field of a struct bsdtty.  This tells which
+   elements of the struct bsdtty have been fetched from the system and
+   are valid. */
+#define SGTTY_SET      0x01
+#define LFLAG_SET      0x02
+#define TCHARS_SET     0x04
+#define LTCHARS_SET    0x08
+
+struct bsdtty {
+  struct sgttyb sgttyb;        /* Basic BSD tty driver information. */
+  int lflag;           /* Local mode flags, like LPASS8. */
+#if defined (TIOCGETC)
+  struct tchars tchars;        /* Terminal special characters, including ^S and ^Q. */
+#endif
+#if defined (TIOCGLTC)
+  struct ltchars ltchars; /* 4.2 BSD editing characters */
+#endif
+  int flags;           /* Bitmap saying which parts of the struct are valid. */
+};
+
+#define TIOTYPE struct bsdtty
+
+static TIOTYPE otio;
+
+static void save_tty_chars PARAMS((TIOTYPE *));
+static int _get_tty_settings PARAMS((int, TIOTYPE *));
+static int get_tty_settings PARAMS((int, TIOTYPE *));
+static int _set_tty_settings PARAMS((int, TIOTYPE *));
+static int set_tty_settings PARAMS((int, TIOTYPE *));
+
+static void prepare_terminal_settings PARAMS((int, TIOTYPE, TIOTYPE *));
+
+static void set_special_char PARAMS((Keymap, TIOTYPE *, int, rl_command_func_t));
+
+static void
+save_tty_chars (tiop)
+     TIOTYPE *tiop;
+{
+  _rl_last_tty_chars = _rl_tty_chars;
+
+  if (tiop->flags & SGTTY_SET)
+    {
+      _rl_tty_chars.t_erase = tiop->sgttyb.sg_erase;
+      _rl_tty_chars.t_kill = tiop->sgttyb.sg_kill;
+    }
+
+  if (tiop->flags & TCHARS_SET)
+    {
+      _rl_tty_chars.t_intr = tiop->tchars.t_intrc;
+      _rl_tty_chars.t_quit = tiop->tchars.t_quitc;
+      _rl_tty_chars.t_start = tiop->tchars.t_startc;
+      _rl_tty_chars.t_stop = tiop->tchars.t_stopc;
+      _rl_tty_chars.t_eof = tiop->tchars.t_eofc;
+      _rl_tty_chars.t_eol = '\n';
+      _rl_tty_chars.t_eol2 = tiop->tchars.t_brkc;
+    }
+
+  if (tiop->flags & LTCHARS_SET)
+    {
+      _rl_tty_chars.t_susp = tiop->ltchars.t_suspc;
+      _rl_tty_chars.t_dsusp = tiop->ltchars.t_dsuspc;
+      _rl_tty_chars.t_reprint = tiop->ltchars.t_rprntc;
+      _rl_tty_chars.t_flush = tiop->ltchars.t_flushc;
+      _rl_tty_chars.t_werase = tiop->ltchars.t_werasc;
+      _rl_tty_chars.t_lnext = tiop->ltchars.t_lnextc;
+    }
+
+  _rl_tty_chars.t_status = -1;
+}
+
+static int
+get_tty_settings (tty, tiop)
+     int tty;
+     TIOTYPE *tiop;
+{
+  set_winsize (tty);
+
+  tiop->flags = tiop->lflag = 0;
+
+  errno = 0;
+  if (ioctl (tty, TIOCGETP, &(tiop->sgttyb)) < 0)
+    return -1;
+  tiop->flags |= SGTTY_SET;
+
+#if defined (TIOCLGET)
+  if (ioctl (tty, TIOCLGET, &(tiop->lflag)) == 0)
+    tiop->flags |= LFLAG_SET;
+#endif
+
+#if defined (TIOCGETC)
+  if (ioctl (tty, TIOCGETC, &(tiop->tchars)) == 0)
+    tiop->flags |= TCHARS_SET;
+#endif
+
+#if defined (TIOCGLTC)
+  if (ioctl (tty, TIOCGLTC, &(tiop->ltchars)) == 0)
+    tiop->flags |= LTCHARS_SET;
+#endif
+
+  return 0;
+}
+
+static int
+set_tty_settings (tty, tiop)
+     int tty;
+     TIOTYPE *tiop;
+{
+  if (tiop->flags & SGTTY_SET)
+    {
+      ioctl (tty, TIOCSETN, &(tiop->sgttyb));
+      tiop->flags &= ~SGTTY_SET;
+    }
+  readline_echoing_p = 1;
+
+#if defined (TIOCLSET)
+  if (tiop->flags & LFLAG_SET)
+    {
+      ioctl (tty, TIOCLSET, &(tiop->lflag));
+      tiop->flags &= ~LFLAG_SET;
+    }
+#endif
+
+#if defined (TIOCSETC)
+  if (tiop->flags & TCHARS_SET)
+    {
+      ioctl (tty, TIOCSETC, &(tiop->tchars));
+      tiop->flags &= ~TCHARS_SET;
+    }
+#endif
+
+#if defined (TIOCSLTC)
+  if (tiop->flags & LTCHARS_SET)
+    {
+      ioctl (tty, TIOCSLTC, &(tiop->ltchars));
+      tiop->flags &= ~LTCHARS_SET;
+    }
+#endif
+
+  return 0;
+}
+
+static void
+prepare_terminal_settings (meta_flag, oldtio, tiop)
+     int meta_flag;
+     TIOTYPE oldtio, *tiop;
+{
+  readline_echoing_p = (oldtio.sgttyb.sg_flags & ECHO);
+
+  /* Copy the original settings to the structure we're going to use for
+     our settings. */
+  tiop->sgttyb = oldtio.sgttyb;
+  tiop->lflag = oldtio.lflag;
+#if defined (TIOCGETC)
+  tiop->tchars = oldtio.tchars;
+#endif
+#if defined (TIOCGLTC)
+  tiop->ltchars = oldtio.ltchars;
+#endif
+  tiop->flags = oldtio.flags;
+
+  /* First, the basic settings to put us into character-at-a-time, no-echo
+     input mode. */
+  tiop->sgttyb.sg_flags &= ~(ECHO | CRMOD);
+  tiop->sgttyb.sg_flags |= CBREAK;
+
+  /* If this terminal doesn't care how the 8th bit is used, then we can
+     use it for the meta-key.  If only one of even or odd parity is
+     specified, then the terminal is using parity, and we cannot. */
+#if !defined (ANYP)
+#  define ANYP (EVENP | ODDP)
+#endif
+  if (((oldtio.sgttyb.sg_flags & ANYP) == ANYP) ||
+      ((oldtio.sgttyb.sg_flags & ANYP) == 0))
+    {
+      tiop->sgttyb.sg_flags |= ANYP;
+
+      /* Hack on local mode flags if we can. */
+#if defined (TIOCLGET)
+#  if defined (LPASS8)
+      tiop->lflag |= LPASS8;
+#  endif /* LPASS8 */
+#endif /* TIOCLGET */
+    }
+
+#if defined (TIOCGETC)
+#  if defined (USE_XON_XOFF)
+  /* Get rid of terminal output start and stop characters. */
+  tiop->tchars.t_stopc = -1; /* C-s */
+  tiop->tchars.t_startc = -1; /* C-q */
+
+  /* If there is an XON character, bind it to restart the output. */
+  if (oldtio.tchars.t_startc != -1)
+    rl_bind_key (oldtio.tchars.t_startc, rl_restart_output);
+#  endif /* USE_XON_XOFF */
+
+  /* If there is an EOF char, bind _rl_eof_char to it. */
+  if (oldtio.tchars.t_eofc != -1)
+    _rl_eof_char = oldtio.tchars.t_eofc;
+
+#  if defined (NO_KILL_INTR)
+  /* Get rid of terminal-generated SIGQUIT and SIGINT. */
+  tiop->tchars.t_quitc = -1; /* C-\ */
+  tiop->tchars.t_intrc = -1; /* C-c */
+#  endif /* NO_KILL_INTR */
+#endif /* TIOCGETC */
+
+#if defined (TIOCGLTC)
+  /* Make the interrupt keys go away.  Just enough to make people happy. */
+  tiop->ltchars.t_dsuspc = -1; /* C-y */
+  tiop->ltchars.t_lnextc = -1; /* C-v */
+#endif /* TIOCGLTC */
+}
+
+#else  /* !defined (NEW_TTY_DRIVER) */
+
+#if !defined (VMIN)
+#  define VMIN VEOF
+#endif
+
+#if !defined (VTIME)
+#  define VTIME VEOL
+#endif
+
+#if defined (TERMIOS_TTY_DRIVER)
+#  define TIOTYPE struct termios
+#  define DRAIN_OUTPUT(fd)     tcdrain (fd)
+#  define GETATTR(tty, tiop)   (tcgetattr (tty, tiop))
+#  ifdef M_UNIX
+#    define SETATTR(tty, tiop) (tcsetattr (tty, TCSANOW, tiop))
+#  else
+#    define SETATTR(tty, tiop) (tcsetattr (tty, TCSADRAIN, tiop))
+#  endif /* !M_UNIX */
+#else
+#  define TIOTYPE struct termio
+#  define DRAIN_OUTPUT(fd)
+#  define GETATTR(tty, tiop)   (ioctl (tty, TCGETA, tiop))
+#  define SETATTR(tty, tiop)   (ioctl (tty, TCSETAW, tiop))
+#endif /* !TERMIOS_TTY_DRIVER */
+
+static TIOTYPE otio;
+
+static void save_tty_chars PARAMS((TIOTYPE *));
+static int _get_tty_settings PARAMS((int, TIOTYPE *));
+static int get_tty_settings PARAMS((int, TIOTYPE *));
+static int _set_tty_settings PARAMS((int, TIOTYPE *));
+static int set_tty_settings PARAMS((int, TIOTYPE *));
+
+static void prepare_terminal_settings PARAMS((int, TIOTYPE, TIOTYPE *));
+
+static void set_special_char PARAMS((Keymap, TIOTYPE *, int, rl_command_func_t));
+static void _rl_bind_tty_special_chars PARAMS((Keymap, TIOTYPE));
+
+#if defined (FLUSHO)
+#  define OUTPUT_BEING_FLUSHED(tp)  (tp->c_lflag & FLUSHO)
+#else
+#  define OUTPUT_BEING_FLUSHED(tp)  0
+#endif
+
+static void
+save_tty_chars (tiop)
+     TIOTYPE *tiop;
+{
+  _rl_last_tty_chars = _rl_tty_chars;
+
+  _rl_tty_chars.t_eof = tiop->c_cc[VEOF];
+  _rl_tty_chars.t_eol = tiop->c_cc[VEOL];
+#ifdef VEOL2
+  _rl_tty_chars.t_eol2 = tiop->c_cc[VEOL2];
+#endif
+  _rl_tty_chars.t_erase = tiop->c_cc[VERASE];
+#ifdef VWERASE
+  _rl_tty_chars.t_werase = tiop->c_cc[VWERASE];
+#endif
+  _rl_tty_chars.t_kill = tiop->c_cc[VKILL];
+#ifdef VREPRINT
+  _rl_tty_chars.t_reprint = tiop->c_cc[VREPRINT];
+#endif
+  _rl_tty_chars.t_intr = tiop->c_cc[VINTR];
+  _rl_tty_chars.t_quit = tiop->c_cc[VQUIT];
+#ifdef VSUSP
+  _rl_tty_chars.t_susp = tiop->c_cc[VSUSP];
+#endif
+#ifdef VDSUSP
+  _rl_tty_chars.t_dsusp = tiop->c_cc[VDSUSP];
+#endif
+#ifdef VSTART
+  _rl_tty_chars.t_start = tiop->c_cc[VSTART];
+#endif
+#ifdef VSTOP
+  _rl_tty_chars.t_stop = tiop->c_cc[VSTOP];
+#endif
+#ifdef VLNEXT
+  _rl_tty_chars.t_lnext = tiop->c_cc[VLNEXT];
+#endif
+#ifdef VDISCARD
+  _rl_tty_chars.t_flush = tiop->c_cc[VDISCARD];
+#endif
+#ifdef VSTATUS
+  _rl_tty_chars.t_status = tiop->c_cc[VSTATUS];
+#endif
+}
+
+#if defined (_AIX) || defined (_AIX41)
+/* Currently this is only used on AIX */
+static void
+rltty_warning (msg)
+     char *msg;
+{
+  fprintf (stderr, "readline: warning: %s\n", msg);
+}
+#endif
+
+#if defined (_AIX)
+void
+setopost(tp)
+TIOTYPE *tp;
+{
+  if ((tp->c_oflag & OPOST) == 0)
+    {
+      rltty_warning ("turning on OPOST for terminal\r");
+      tp->c_oflag |= OPOST|ONLCR;
+    }
+}
+#endif
+
+static int
+_get_tty_settings (tty, tiop)
+     int tty;
+     TIOTYPE *tiop;
+{
+  int ioctl_ret;
+
+  while (1)
+    {
+      ioctl_ret = GETATTR (tty, tiop);
+      if (ioctl_ret < 0)
+       {
+         if (errno != EINTR)
+           return -1;
+         else
+           continue;
+       }
+      if (OUTPUT_BEING_FLUSHED (tiop))
+       {
+#if defined (FLUSHO) && defined (_AIX41)
+         rltty_warning ("turning off output flushing");
+         tiop->c_lflag &= ~FLUSHO;
+         break;
+#else
+         continue;
+#endif
+       }
+      break;
+    }
+
+  return 0;
+}
+
+static int
+get_tty_settings (tty, tiop)
+     int tty;
+     TIOTYPE *tiop;
+{
+  set_winsize (tty);
+
+  errno = 0;
+  if (_get_tty_settings (tty, tiop) < 0)
+    return -1;
+
+#if defined (_AIX)
+  setopost(tiop);
+#endif
+
+  return 0;
+}
+
+static int
+_set_tty_settings (tty, tiop)
+     int tty;
+     TIOTYPE *tiop;
+{
+  while (SETATTR (tty, tiop) < 0)
+    {
+      if (errno != EINTR)
+       return -1;
+      errno = 0;
+    }
+  return 0;
+}
+
+static int
+set_tty_settings (tty, tiop)
+     int tty;
+     TIOTYPE *tiop;
+{
+  if (_set_tty_settings (tty, tiop) < 0)
+    return -1;
+    
+#if 0
+
+#if defined (TERMIOS_TTY_DRIVER)
+#  if defined (__ksr1__)
+  if (ksrflow)
+    {
+      ksrflow = 0;
+      tcflow (tty, TCOON);
+    }
+#  else /* !ksr1 */
+  tcflow (tty, TCOON);         /* Simulate a ^Q. */
+#  endif /* !ksr1 */
+#else
+  ioctl (tty, TCXONC, 1);      /* Simulate a ^Q. */
+#endif /* !TERMIOS_TTY_DRIVER */
+
+#endif /* 0 */
+
+  return 0;
+}
+
+static void
+prepare_terminal_settings (meta_flag, oldtio, tiop)
+     int meta_flag;
+     TIOTYPE oldtio, *tiop;
+{
+  readline_echoing_p = (oldtio.c_lflag & ECHO);
+
+  tiop->c_lflag &= ~(ICANON | ECHO);
+
+  if ((unsigned char) oldtio.c_cc[VEOF] != (unsigned char) _POSIX_VDISABLE)
+    _rl_eof_char = oldtio.c_cc[VEOF];
+
+#if defined (USE_XON_XOFF)
+#if defined (IXANY)
+  tiop->c_iflag &= ~(IXON | IXOFF | IXANY);
+#else
+  /* `strict' Posix systems do not define IXANY. */
+  tiop->c_iflag &= ~(IXON | IXOFF);
+#endif /* IXANY */
+#endif /* USE_XON_XOFF */
+
+  /* Only turn this off if we are using all 8 bits. */
+  if (((tiop->c_cflag & CSIZE) == CS8) || meta_flag)
+    tiop->c_iflag &= ~(ISTRIP | INPCK);
+
+  /* Make sure we differentiate between CR and NL on input. */
+  tiop->c_iflag &= ~(ICRNL | INLCR);
+
+#if !defined (HANDLE_SIGNALS)
+  tiop->c_lflag &= ~ISIG;
+#else
+  tiop->c_lflag |= ISIG;
+#endif
+
+  tiop->c_cc[VMIN] = 1;
+  tiop->c_cc[VTIME] = 0;
+
+#if defined (FLUSHO)
+  if (OUTPUT_BEING_FLUSHED (tiop))
+    {
+      tiop->c_lflag &= ~FLUSHO;
+      oldtio.c_lflag &= ~FLUSHO;
+    }
+#endif
+
+  /* Turn off characters that we need on Posix systems with job control,
+     just to be sure.  This includes ^Y and ^V.  This should not really
+     be necessary.  */
+#if defined (TERMIOS_TTY_DRIVER) && defined (_POSIX_VDISABLE)
+
+#if defined (VLNEXT)
+  tiop->c_cc[VLNEXT] = _POSIX_VDISABLE;
+#endif
+
+#if defined (VDSUSP)
+  tiop->c_cc[VDSUSP] = _POSIX_VDISABLE;
+#endif
+
+#endif /* TERMIOS_TTY_DRIVER && _POSIX_VDISABLE */
+}
+#endif  /* !NEW_TTY_DRIVER */
+
+/* Put the terminal in CBREAK mode so that we can detect key presses. */
+#if defined (NO_TTY_DRIVER)
+void
+rl_prep_terminal (meta_flag)
+     int meta_flag;
+{
+  readline_echoing_p = 1;
+}
+
+void
+rl_deprep_terminal ()
+{
+}
+
+#else /* ! NO_TTY_DRIVER */
+void
+rl_prep_terminal (meta_flag)
+     int meta_flag;
+{
+  int tty;
+  TIOTYPE tio;
+
+  if (terminal_prepped)
+    return;
+
+  /* Try to keep this function from being INTerrupted. */
+  block_sigint ();
+
+  tty = fileno (rl_instream);
+
+  if (get_tty_settings (tty, &tio) < 0)
+    {
+#if defined (ENOTSUP)
+      /* MacOS X, at least, lies about the value of errno if tcgetattr fails. */
+      if (errno == ENOTTY || errno == ENOTSUP)
+#else
+      if (errno == ENOTTY)
+#endif
+       readline_echoing_p = 1;         /* XXX */
+      release_sigint ();
+      return;
+    }
+
+  otio = tio;
+
+  if (_rl_bind_stty_chars)
+    {
+#if defined (VI_MODE)
+      /* If editing in vi mode, make sure we restore the bindings in the
+        insertion keymap no matter what keymap we ended up in. */
+      if (rl_editing_mode == vi_mode)
+       rl_tty_unset_default_bindings (vi_insertion_keymap);
+      else
+#endif
+       rl_tty_unset_default_bindings (_rl_keymap);
+    }
+  save_tty_chars (&otio);
+  RL_SETSTATE(RL_STATE_TTYCSAVED);
+  if (_rl_bind_stty_chars)
+    {
+#if defined (VI_MODE)
+      /* If editing in vi mode, make sure we set the bindings in the
+        insertion keymap no matter what keymap we ended up in. */
+      if (rl_editing_mode == vi_mode)
+       _rl_bind_tty_special_chars (vi_insertion_keymap, tio);  
+      else
+#endif
+       _rl_bind_tty_special_chars (_rl_keymap, tio);
+    }
+
+  prepare_terminal_settings (meta_flag, otio, &tio);
+
+  if (set_tty_settings (tty, &tio) < 0)
+    {
+      release_sigint ();
+      return;
+    }
+
+  if (_rl_enable_keypad)
+    _rl_control_keypad (1);
+
+  fflush (rl_outstream);
+  terminal_prepped = 1;
+  RL_SETSTATE(RL_STATE_TERMPREPPED);
+
+  release_sigint ();
+}
+
+/* Restore the terminal's normal settings and modes. */
+void
+rl_deprep_terminal ()
+{
+  int tty;
+
+  if (!terminal_prepped)
+    return;
+
+  /* Try to keep this function from being interrupted. */
+  block_sigint ();
+
+  tty = fileno (rl_instream);
+
+  if (_rl_enable_keypad)
+    _rl_control_keypad (0);
+
+  fflush (rl_outstream);
+
+  if (set_tty_settings (tty, &otio) < 0)
+    {
+      release_sigint ();
+      return;
+    }
+
+  terminal_prepped = 0;
+  RL_UNSETSTATE(RL_STATE_TERMPREPPED);
+
+  release_sigint ();
+}
+#endif /* !NO_TTY_DRIVER */
+\f
+/* **************************************************************** */
+/*                                                                 */
+/*                     Bogus Flow Control                          */
+/*                                                                 */
+/* **************************************************************** */
+
+int
+rl_restart_output (count, key)
+     int count, key;
+{
+#if defined (__MINGW32__)
+  return 0;
+#else /* !__MING32__ */
+
+  int fildes = fileno (rl_outstream);
+#if defined (TIOCSTART)
+#if defined (apollo)
+  ioctl (&fildes, TIOCSTART, 0);
+#else
+  ioctl (fildes, TIOCSTART, 0);
+#endif /* apollo */
+
+#else /* !TIOCSTART */
+#  if defined (TERMIOS_TTY_DRIVER)
+#    if defined (__ksr1__)
+  if (ksrflow)
+    {
+      ksrflow = 0;
+      tcflow (fildes, TCOON);
+    }
+#    else /* !ksr1 */
+  tcflow (fildes, TCOON);              /* Simulate a ^Q. */
+#    endif /* !ksr1 */
+#  else /* !TERMIOS_TTY_DRIVER */
+#    if defined (TCXONC)
+  ioctl (fildes, TCXONC, TCOON);
+#    endif /* TCXONC */
+#  endif /* !TERMIOS_TTY_DRIVER */
+#endif /* !TIOCSTART */
+
+  return 0;
+#endif /* !__MINGW32__ */
+}
+
+int
+rl_stop_output (count, key)
+     int count, key;
+{
+#if defined (__MINGW32__)
+  return 0;
+#else
+
+  int fildes = fileno (rl_instream);
+
+#if defined (TIOCSTOP)
+# if defined (apollo)
+  ioctl (&fildes, TIOCSTOP, 0);
+# else
+  ioctl (fildes, TIOCSTOP, 0);
+# endif /* apollo */
+#else /* !TIOCSTOP */
+# if defined (TERMIOS_TTY_DRIVER)
+#  if defined (__ksr1__)
+  ksrflow = 1;
+#  endif /* ksr1 */
+  tcflow (fildes, TCOOFF);
+# else
+#   if defined (TCXONC)
+  ioctl (fildes, TCXONC, TCOON);
+#   endif /* TCXONC */
+# endif /* !TERMIOS_TTY_DRIVER */
+#endif /* !TIOCSTOP */
+
+  return 0;
+#endif /* !__MINGW32__ */
+}
+
+/* **************************************************************** */
+/*                                                                 */
+/*                     Default Key Bindings                        */
+/*                                                                 */
+/* **************************************************************** */
+
+#if !defined (NO_TTY_DRIVER)
+#define SET_SPECIAL(sc, func)  set_special_char(kmap, &ttybuff, sc, func)
+#endif
+
+#if defined (NO_TTY_DRIVER)
+
+#define SET_SPECIAL(sc, func)
+#define RESET_SPECIAL(c)
+
+#elif defined (NEW_TTY_DRIVER)
+static void
+set_special_char (kmap, tiop, sc, func)
+     Keymap kmap;
+     TIOTYPE *tiop;
+     int sc;
+     rl_command_func_t *func;
+{
+  if (sc != -1 && kmap[(unsigned char)sc].type == ISFUNC)
+    kmap[(unsigned char)sc].function = func;
+}
+
+#define RESET_SPECIAL(c) \
+  if (c != -1 && kmap[(unsigned char)c].type == ISFUNC)
+    kmap[(unsigned char)c].function = rl_insert;
+
+static void
+_rl_bind_tty_special_chars (kmap, ttybuff)
+     Keymap kmap;
+     TIOTYPE ttybuff;
+{
+  if (ttybuff.flags & SGTTY_SET)
+    {
+      SET_SPECIAL (ttybuff.sgttyb.sg_erase, rl_rubout);
+      SET_SPECIAL (ttybuff.sgttyb.sg_kill, rl_unix_line_discard);
+    }
+
+#  if defined (TIOCGLTC)
+  if (ttybuff.flags & LTCHARS_SET)
+    {
+      SET_SPECIAL (ttybuff.ltchars.t_werasc, rl_unix_word_rubout);
+      SET_SPECIAL (ttybuff.ltchars.t_lnextc, rl_quoted_insert);
+    }
+#  endif /* TIOCGLTC */
+}
+
+#else /* !NEW_TTY_DRIVER */
+static void
+set_special_char (kmap, tiop, sc, func)
+     Keymap kmap;
+     TIOTYPE *tiop;
+     int sc;
+     rl_command_func_t *func;
+{
+  unsigned char uc;
+
+  uc = tiop->c_cc[sc];
+  if (uc != (unsigned char)_POSIX_VDISABLE && kmap[uc].type == ISFUNC)
+    kmap[uc].function = func;
+}
+
+/* used later */
+#define RESET_SPECIAL(uc) \
+  if (uc != (unsigned char)_POSIX_VDISABLE && kmap[uc].type == ISFUNC) \
+    kmap[uc].function = rl_insert;
+
+static void
+_rl_bind_tty_special_chars (kmap, ttybuff)
+     Keymap kmap;
+     TIOTYPE ttybuff;
+{
+  SET_SPECIAL (VERASE, rl_rubout);
+  SET_SPECIAL (VKILL, rl_unix_line_discard);
+
+#  if defined (VLNEXT) && defined (TERMIOS_TTY_DRIVER)
+  SET_SPECIAL (VLNEXT, rl_quoted_insert);
+#  endif /* VLNEXT && TERMIOS_TTY_DRIVER */
+
+#  if defined (VWERASE) && defined (TERMIOS_TTY_DRIVER)
+  SET_SPECIAL (VWERASE, rl_unix_word_rubout);
+#  endif /* VWERASE && TERMIOS_TTY_DRIVER */
+}
+
+#endif /* !NEW_TTY_DRIVER */
+
+/* Set the system's default editing characters to their readline equivalents
+   in KMAP.  Should be static, now that we have rl_tty_set_default_bindings. */
+void
+rltty_set_default_bindings (kmap)
+     Keymap kmap;
+{
+#if !defined (NO_TTY_DRIVER)
+  TIOTYPE ttybuff;
+  int tty;
+
+  tty = fileno (rl_instream);
+
+  if (get_tty_settings (tty, &ttybuff) == 0)
+    _rl_bind_tty_special_chars (kmap, ttybuff);
+#endif
+}
+
+/* New public way to set the system default editing chars to their readline
+   equivalents. */
+void
+rl_tty_set_default_bindings (kmap)
+     Keymap kmap;
+{
+  rltty_set_default_bindings (kmap);
+}
+
+/* Rebind all of the tty special chars that readline worries about back
+   to self-insert.  Call this before saving the current terminal special
+   chars with save_tty_chars().  This only works on POSIX termios or termio
+   systems. */
+void
+rl_tty_unset_default_bindings (kmap)
+     Keymap kmap;
+{
+  /* Don't bother before we've saved the tty special chars at least once. */
+  if (RL_ISSTATE(RL_STATE_TTYCSAVED) == 0)
+    return;
+
+  RESET_SPECIAL (_rl_tty_chars.t_erase);
+  RESET_SPECIAL (_rl_tty_chars.t_kill);
+
+#  if defined (VLNEXT) && defined (TERMIOS_TTY_DRIVER)
+  RESET_SPECIAL (_rl_tty_chars.t_lnext);
+#  endif /* VLNEXT && TERMIOS_TTY_DRIVER */
+
+#  if defined (VWERASE) && defined (TERMIOS_TTY_DRIVER)
+  RESET_SPECIAL (_rl_tty_chars.t_werase);
+#  endif /* VWERASE && TERMIOS_TTY_DRIVER */
+}
+
+#if defined (HANDLE_SIGNALS)
+
+#if defined (NEW_TTY_DRIVER) || defined (NO_TTY_DRIVER)
+int
+_rl_disable_tty_signals ()
+{
+  return 0;
+}
+
+int
+_rl_restore_tty_signals ()
+{
+  return 0;
+}
+#else
+
+static TIOTYPE sigstty, nosigstty;
+static int tty_sigs_disabled = 0;
+
+int
+_rl_disable_tty_signals ()
+{
+  if (tty_sigs_disabled)
+    return 0;
+
+  if (_get_tty_settings (fileno (rl_instream), &sigstty) < 0)
+    return -1;
+
+  nosigstty = sigstty;
+
+  nosigstty.c_lflag &= ~ISIG;
+  nosigstty.c_iflag &= ~IXON;
+
+  if (_set_tty_settings (fileno (rl_instream), &nosigstty) < 0)
+    return (_set_tty_settings (fileno (rl_instream), &sigstty));
+
+  tty_sigs_disabled = 1;
+  return 0;
+}
+
+int
+_rl_restore_tty_signals ()
+{
+  int r;
+
+  if (tty_sigs_disabled == 0)
+    return 0;
+
+  r = _set_tty_settings (fileno (rl_instream), &sigstty);
+
+  if (r == 0)
+    tty_sigs_disabled = 0;
+
+  return r;
+}
+#endif /* !NEW_TTY_DRIVER */
+
+#endif /* HANDLE_SIGNALS */
diff --git a/rltty.h b/rltty.h
new file mode 100644 (file)
index 0000000..142e96b
--- /dev/null
+++ b/rltty.h
@@ -0,0 +1,82 @@
+/* rltty.h - tty driver-related definitions used by some library files. */
+
+/* Copyright (C) 1995 Free Software Foundation, Inc.
+
+   This file contains the Readline Library (the Library), a set of
+   routines for providing Emacs style line input to programs that ask
+   for it.
+
+   The Library 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.
+
+   The Library is distributed in the hope that it will be useful, but
+   WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   General Public License for more details.
+
+   The GNU General Public License is often shipped with GNU software, and
+   is generally kept in a file called COPYING or LICENSE.  If you do not
+   have a copy of the license, write to the Free Software Foundation,
+   59 Temple Place, Suite 330, Boston, MA 02111 USA. */
+
+#if !defined (_RLTTY_H_)
+#define _RLTTY_H_
+
+/* Posix systems use termios and the Posix signal functions. */
+#if defined (TERMIOS_TTY_DRIVER)
+#  include <termios.h>
+#endif /* TERMIOS_TTY_DRIVER */
+
+/* System V machines use termio. */
+#if defined (TERMIO_TTY_DRIVER)
+#  include <termio.h>
+#  if !defined (TCOON)
+#    define TCOON 1
+#  endif
+#endif /* TERMIO_TTY_DRIVER */
+
+/* Other (BSD) machines use sgtty. */
+#if defined (NEW_TTY_DRIVER)
+#  include <sgtty.h>
+#endif
+
+#include "rlwinsize.h"
+
+/* Define _POSIX_VDISABLE if we are not using the `new' tty driver and
+   it is not already defined.  It is used both to determine if a
+   special character is disabled and to disable certain special
+   characters.  Posix systems should set to 0, USG systems to -1. */
+#if !defined (NEW_TTY_DRIVER) && !defined (_POSIX_VDISABLE)
+#  if defined (_SVR4_VDISABLE)
+#    define _POSIX_VDISABLE _SVR4_VDISABLE
+#  else
+#    if defined (_POSIX_VERSION)
+#      define _POSIX_VDISABLE 0
+#    else /* !_POSIX_VERSION */
+#      define _POSIX_VDISABLE -1
+#    endif /* !_POSIX_VERSION */
+#  endif /* !_SVR4_DISABLE */
+#endif /* !NEW_TTY_DRIVER && !_POSIX_VDISABLE */
+
+typedef struct _rl_tty_chars {
+  unsigned char t_eof;
+  unsigned char t_eol;
+  unsigned char t_eol2;
+  unsigned char t_erase;
+  unsigned char t_werase;
+  unsigned char t_kill;
+  unsigned char t_reprint;
+  unsigned char t_intr;
+  unsigned char t_quit;
+  unsigned char t_susp;
+  unsigned char t_dsusp;
+  unsigned char t_start;
+  unsigned char t_stop;
+  unsigned char t_lnext;
+  unsigned char t_flush;
+  unsigned char t_status;
+} _RL_TTY_CHARS;
+
+#endif /* _RLTTY_H_ */
diff --git a/rltypedefs.h b/rltypedefs.h
new file mode 100644 (file)
index 0000000..862bdb8
--- /dev/null
@@ -0,0 +1,94 @@
+/* rltypedefs.h -- Type declarations for readline functions. */
+
+/* Copyright (C) 2000-2004 Free Software Foundation, Inc.
+
+   This file is part of the GNU Readline Library, a library for
+   reading lines of text with interactive input and history editing.
+
+   The GNU Readline Library 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.
+
+   The GNU Readline Library is distributed in the hope that it will be
+   useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+   of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   The GNU General Public License is often shipped with GNU software, and
+   is generally kept in a file called COPYING or LICENSE.  If you do not
+   have a copy of the license, write to the Free Software Foundation,
+   59 Temple Place, Suite 330, Boston, MA 02111 USA. */
+
+#ifndef _RL_TYPEDEFS_H_
+#define _RL_TYPEDEFS_H_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Old-style */
+
+#if !defined (_FUNCTION_DEF)
+#  define _FUNCTION_DEF
+
+typedef int Function ();
+typedef void VFunction ();
+typedef char *CPFunction ();
+typedef char **CPPFunction ();
+
+#endif /* _FUNCTION_DEF */
+
+/* New style. */
+
+#if !defined (_RL_FUNCTION_TYPEDEF)
+#  define _RL_FUNCTION_TYPEDEF
+
+/* Bindable functions */
+typedef int rl_command_func_t PARAMS((int, int));
+
+/* Typedefs for the completion system */
+typedef char *rl_compentry_func_t PARAMS((const char *, int));
+typedef char **rl_completion_func_t PARAMS((const char *, int, int));
+
+typedef char *rl_quote_func_t PARAMS((char *, int, char *));
+typedef char *rl_dequote_func_t PARAMS((char *, int));
+
+typedef int rl_compignore_func_t PARAMS((char **));
+
+typedef void rl_compdisp_func_t PARAMS((char **, int, int));
+
+/* Type for input and pre-read hook functions like rl_event_hook */
+typedef int rl_hook_func_t PARAMS((void));
+
+/* Input function type */
+typedef int rl_getc_func_t PARAMS((FILE *));
+
+/* Generic function that takes a character buffer (which could be the readline
+   line buffer) and an index into it (which could be rl_point) and returns
+   an int. */
+typedef int rl_linebuf_func_t PARAMS((char *, int));
+
+/* `Generic' function pointer typedefs */
+typedef int rl_intfunc_t PARAMS((int));
+#define rl_ivoidfunc_t rl_hook_func_t
+typedef int rl_icpfunc_t PARAMS((char *));
+typedef int rl_icppfunc_t PARAMS((char **));
+
+typedef void rl_voidfunc_t PARAMS((void));
+typedef void rl_vintfunc_t PARAMS((int));
+typedef void rl_vcpfunc_t PARAMS((char *));
+typedef void rl_vcppfunc_t PARAMS((char **));
+
+typedef char *rl_cpvfunc_t PARAMS((void));
+typedef char *rl_cpifunc_t PARAMS((int));
+typedef char *rl_cpcpfunc_t PARAMS((char  *));
+typedef char *rl_cpcppfunc_t PARAMS((char  **));
+
+#endif /* _RL_FUNCTION_TYPEDEF */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _RL_TYPEDEFS_H_ */
diff --git a/rlwinsize.h b/rlwinsize.h
new file mode 100644 (file)
index 0000000..7838154
--- /dev/null
@@ -0,0 +1,57 @@
+/* rlwinsize.h -- an attempt to isolate some of the system-specific defines
+   for `struct winsize' and TIOCGWINSZ. */
+
+/* Copyright (C) 1997 Free Software Foundation, Inc.
+
+   This file contains the Readline Library (the Library), a set of
+   routines for providing Emacs style line input to programs that ask
+   for it.
+
+   The Library 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.
+
+   The Library is distributed in the hope that it will be useful, but
+   WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   General Public License for more details.
+
+   The GNU General Public License is often shipped with GNU software, and
+   is generally kept in a file called COPYING or LICENSE.  If you do not
+   have a copy of the license, write to the Free Software Foundation,
+   59 Temple Place, Suite 330, Boston, MA 02111 USA. */
+
+#if !defined (_RLWINSIZE_H_)
+#define _RLWINSIZE_H_
+
+#if defined (HAVE_CONFIG_H)
+#  include "config.h"
+#endif
+
+/* Try to find the definitions of `struct winsize' and TIOGCWINSZ */
+
+#if defined (GWINSZ_IN_SYS_IOCTL) && !defined (TIOCGWINSZ)
+#  include <sys/ioctl.h>
+#endif /* GWINSZ_IN_SYS_IOCTL && !TIOCGWINSZ */
+
+#if defined (STRUCT_WINSIZE_IN_TERMIOS) && !defined (STRUCT_WINSIZE_IN_SYS_IOCTL)
+#  include <termios.h>
+#endif /* STRUCT_WINSIZE_IN_TERMIOS && !STRUCT_WINSIZE_IN_SYS_IOCTL */
+
+/* Not in either of the standard places, look around. */
+#if !defined (STRUCT_WINSIZE_IN_TERMIOS) && !defined (STRUCT_WINSIZE_IN_SYS_IOCTL)
+#  if defined (HAVE_SYS_STREAM_H)
+#    include <sys/stream.h>
+#  endif /* HAVE_SYS_STREAM_H */
+#  if defined (HAVE_SYS_PTEM_H) /* SVR4.2, at least, has it here */
+#    include <sys/ptem.h>
+#    define _IO_PTEM_H          /* work around SVR4.2 1.1.4 bug */
+#  endif /* HAVE_SYS_PTEM_H */
+#  if defined (HAVE_SYS_PTE_H)  /* ??? */
+#    include <sys/pte.h>
+#  endif /* HAVE_SYS_PTE_H */
+#endif /* !STRUCT_WINSIZE_IN_TERMIOS && !STRUCT_WINSIZE_IN_SYS_IOCTL */
+
+#endif /* _RL_WINSIZE_H */
+
diff --git a/rrr b/rrr
new file mode 100644 (file)
index 0000000..02c84e0
--- /dev/null
+++ b/rrr
@@ -0,0 +1,111 @@
+From VM Tue Dec 19 16:21:59 2006
+Content-Length: 1192
+X-VM-v5-Data: ([nil nil nil nil nil nil nil nil nil]
+       ["1192" "Friday" "15" "December" "2006" "12:01:08" "-0500" "Chet Ramey" "chet.ramey@case.edu" nil "41" "Readline-5.2 Official Patch 1" "^From:" nil nil "12" nil nil nil nil nil nil nil nil nil]
+       nil)
+Received: from cartero.cs.tu-berlin.de (cartero.cs.tu-berlin.de [130.149.17.20])
+       by mail.cs.tu-berlin.de (8.9.3p2/8.9.3) with ESMTP id SAA09442
+       for <doko@cs.tu-berlin.de>; Fri, 15 Dec 2006 18:06:50 +0100 (MET)
+Received: from localhost (localhost [127.0.0.1])
+       by localhost-10025.cs.tu-berlin.de (Postfix) with ESMTP id B7AA91AA2D
+       for <doko@cs.tu-berlin.de>; Fri, 15 Dec 2006 18:06:50 +0100 (MET)
+Received: from cartero.cs.tu-berlin.de ([127.0.0.1])
+ by localhost (mail.cs.tu-berlin.de [127.0.0.1]) (amavisd-new, port 10024)
+ with ESMTP id 07325-16 for <doko@cs.tu-berlin.de>;
+ Fri, 15 Dec 2006 18:06:46 +0100 (MET) 14822
+Received: from master.debian.org (master.debian.org [70.103.162.29])
+       by cartero.cs.tu-berlin.de (Postfix) with ESMTP
+       for <doko@cs.tu-berlin.de>; Fri, 15 Dec 2006 18:06:42 +0100 (MET)
+Received: from lists.gnu.org ([199.232.76.165])
+       by master.debian.org with esmtp (Exim 4.50)
+       id 1GvGW5-00007e-Pq
+       for doko@cs.tu-berlin.de; Fri, 15 Dec 2006 17:06:38 +0000
+Received: from localhost ([127.0.0.1] helo=lists.gnu.org)
+       by lists.gnu.org with esmtp (Exim 4.43)
+       id 1GvGW3-0001AV-BJ
+       for doko@debian.org; Fri, 15 Dec 2006 12:06:35 -0500
+Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43)
+       id 1GvGRS-00073b-6a
+       for bug-bash@gnu.org; Fri, 15 Dec 2006 12:01:50 -0500
+Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43)
+       id 1GvGRQ-000729-Qz
+       for bug-bash@gnu.org; Fri, 15 Dec 2006 12:01:48 -0500
+Received: from [199.232.76.173] (helo=monty-python.gnu.org)
+       by lists.gnu.org with esmtp (Exim 4.43)
+       id 1GvGRO-0006zn-No; Fri, 15 Dec 2006 12:01:46 -0500
+Received: from [129.22.105.34] (helo=mpv4.tis.cwru.edu)
+       by monty-python.gnu.org with esmtps (TLS-1.0:RSA_3DES_EDE_CBC_SHA:24)
+       (Exim 4.52) id 1GvGRM-00051Q-Ul; Fri, 15 Dec 2006 12:01:45 -0500
+Received: from caleb.ins.cwru.edu (caleb.INS.CWRU.Edu [129.22.8.211])
+       by mpv4.tis.cwru.edu (MOS 3.8.2-GA) with SMTP id BWZ92380;
+       Fri, 15 Dec 2006 12:01:44 -0500 (EST)
+Message-ID: <061215170108.AA06326.SM@caleb.ins.cwru.edu>
+Read-Receipt-To: chet.ramey@case.edu
+MIME-Version: 1.0
+Content-Type: text/plain; charset=us-ascii
+X-BeenThere: bug-bash@gnu.org
+X-Mailman-Version: 2.1.5
+Precedence: list
+Reply-To: chet.ramey@case.edu
+List-Id: Bug reports for the GNU Bourne Again SHell <bug-bash.gnu.org>
+List-Unsubscribe: <http://lists.gnu.org/mailman/listinfo/bug-bash>,
+       <mailto:bug-bash-request@gnu.org?subject=unsubscribe>
+List-Archive: <http://lists.gnu.org/pipermail/bug-bash>
+List-Post: <mailto:bug-bash@gnu.org>
+List-Help: <mailto:bug-bash-request@gnu.org?subject=help>
+List-Subscribe: <http://lists.gnu.org/mailman/listinfo/bug-bash>,
+       <mailto:bug-bash-request@gnu.org?subject=subscribe>
+Errors-To: bug-bash-bounces+doko=debian.org@gnu.org
+X-Virus-Scanned: by amavisd-new at cs.tu-berlin.de (including spamassassin)
+X-Spam-Status: No, score=-2.598 required=3 addr=doko@cs.tu-berlin.de
+ tests=[BAYES_00=-2.599, UNPARSEABLE_RELAY=0.001]
+X-Spam-Score: -2.598
+X-Spam-Level: 
+From: Chet Ramey <chet.ramey@case.edu>
+Sender: bug-bash-bounces+doko=debian.org@gnu.org
+To: bug-bash@gnu.org, bug-readline@gnu.org
+Cc: chet@case.edu
+Subject: Readline-5.2 Official Patch 1
+Date: Fri, 15 Dec 2006 12:01:08 -0500
+
+                          READLINE PATCH REPORT
+                          =====================
+
+Readline-Release: 5.2
+Patch-ID: readline52-001
+
+Bug-Reported-by:       ebb9@byu.net
+Bug-Reference-ID:      <45540862.9030900@byu.net>
+Bug-Reference-URL:     http://lists.gnu.org/archive/html/bug-bash/2006-11/msg00017.html
+                       http://lists.gnu.org/archive/html/bug-bash/2006-11/msg00016.html
+
+Bug-Description:
+
+In some cases, code that is intended to be used in the presence of multibyte
+characters is called when no such characters are present, leading to incorrect
+display position calculations and incorrect redisplay.
+
+Patch:
+
+*** ../readline-5.2/display.c  Thu Sep 14 14:20:12 2006
+--- display.c  Mon Nov 13 17:55:57 2006
+***************
+*** 2381,2384 ****
+--- 2409,2414 ----
+    if (end <= start)
+      return 0;
++   if (MB_CUR_MAX == 1 || rl_byte_oriented)
++     return (end - start);
+  
+    memset (&ps, 0, sizeof (mbstate_t));
+
+-- 
+``The lyf so short, the craft so long to lerne.'' - Chaucer
+                      Live Strong.  No day but today.
+Chet Ramey, ITS, CWRU    chet@case.edu    http://cnswww.cns.cwru.edu/~chet/
+
+
+_______________________________________________
+Bug-bash mailing list
+Bug-bash@gnu.org
+http://lists.gnu.org/mailman/listinfo/bug-bash
diff --git a/savestring.c b/savestring.c
new file mode 100644 (file)
index 0000000..820428d
--- /dev/null
@@ -0,0 +1,37 @@
+/* savestring.c  */
+
+/* Copyright (C) 1998,2003 Free Software Foundation, Inc.
+
+   This file is part of the GNU Readline Library, a library for
+   reading lines of text with interactive input and history editing.
+
+   The GNU Readline Library 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.
+
+   The GNU Readline Library is distributed in the hope that it will be
+   useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+   of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   The GNU General Public License is often shipped with GNU software, and
+   is generally kept in a file called COPYING or LICENSE.  If you do not
+   have a copy of the license, write to the Free Software Foundation,
+   59 Temple Place, Suite 330, Boston, MA 02111 USA. */
+#define READLINE_LIBRARY
+
+#include <config.h>
+#ifdef HAVE_STRING_H
+#  include <string.h>
+#endif
+#include "xmalloc.h"
+
+/* Backwards compatibility, now that savestring has been removed from
+   all `public' readline header files. */
+char *
+savestring (s)
+     const char *s;
+{
+  return ((char *)strcpy ((char *)xmalloc (1 + strlen (s)), (s)));
+}
diff --git a/search.c b/search.c
new file mode 100644 (file)
index 0000000..33cc4fc
--- /dev/null
+++ b/search.c
@@ -0,0 +1,571 @@
+/* search.c - code for non-incremental searching in emacs and vi modes. */
+
+/* Copyright (C) 1992-2005 Free Software Foundation, Inc.
+
+   This file is part of the Readline Library (the Library), a set of
+   routines for providing Emacs style line input to programs that ask
+   for it.
+
+   The Library 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.
+
+   The Library is distributed in the hope that it will be useful, but
+   WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   General Public License for more details.
+
+   The GNU General Public License is often shipped with GNU software, and
+   is generally kept in a file called COPYING or LICENSE.  If you do not
+   have a copy of the license, write to the Free Software Foundation,
+   59 Temple Place, Suite 330, Boston, MA 02111 USA. */
+#define READLINE_LIBRARY
+
+#if defined (HAVE_CONFIG_H)
+#  include <config.h>
+#endif
+
+#include <sys/types.h>
+#include <stdio.h>
+
+#if defined (HAVE_UNISTD_H)
+#  include <unistd.h>
+#endif
+
+#if defined (HAVE_STDLIB_H)
+#  include <stdlib.h>
+#else
+#  include "ansi_stdlib.h"
+#endif
+
+#include "rldefs.h"
+#include "rlmbutil.h"
+
+#include "readline.h"
+#include "history.h"
+
+#include "rlprivate.h"
+#include "xmalloc.h"
+
+#ifdef abs
+#  undef abs
+#endif
+#define abs(x)         (((x) >= 0) ? (x) : -(x))
+
+_rl_search_cxt *_rl_nscxt = 0;
+
+extern HIST_ENTRY *_rl_saved_line_for_history;
+
+/* Functions imported from the rest of the library. */
+extern int _rl_free_history_entry PARAMS((HIST_ENTRY *));
+
+static char *noninc_search_string = (char *) NULL;
+static int noninc_history_pos;
+
+static char *prev_line_found = (char *) NULL;
+
+static int rl_history_search_len;
+static int rl_history_search_pos;
+static char *history_search_string;
+static int history_string_size;
+
+static void make_history_line_current PARAMS((HIST_ENTRY *));
+static int noninc_search_from_pos PARAMS((char *, int, int));
+static int noninc_dosearch PARAMS((char *, int));
+static int noninc_search PARAMS((int, int));
+static int rl_history_search_internal PARAMS((int, int));
+static void rl_history_search_reinit PARAMS((void));
+
+static _rl_search_cxt *_rl_nsearch_init PARAMS((int, int));
+static int _rl_nsearch_cleanup PARAMS((_rl_search_cxt *, int));
+static void _rl_nsearch_abort PARAMS((_rl_search_cxt *));
+static int _rl_nsearch_dispatch PARAMS((_rl_search_cxt *, int));
+
+/* Make the data from the history entry ENTRY be the contents of the
+   current line.  This doesn't do anything with rl_point; the caller
+   must set it. */
+static void
+make_history_line_current (entry)
+     HIST_ENTRY *entry;
+{
+  _rl_replace_text (entry->line, 0, rl_end);
+  _rl_fix_point (1);
+#if defined (VI_MODE)
+  if (rl_editing_mode == vi_mode)
+    /* POSIX.2 says that the `U' command doesn't affect the copy of any
+       command lines to the edit line.  We're going to implement that by
+       making the undo list start after the matching line is copied to the
+       current editing buffer. */
+    rl_free_undo_list ();
+#endif
+
+  if (_rl_saved_line_for_history)
+    _rl_free_history_entry (_rl_saved_line_for_history);
+  _rl_saved_line_for_history = (HIST_ENTRY *)NULL;
+}
+
+/* Search the history list for STRING starting at absolute history position
+   POS.  If STRING begins with `^', the search must match STRING at the
+   beginning of a history line, otherwise a full substring match is performed
+   for STRING.  DIR < 0 means to search backwards through the history list,
+   DIR >= 0 means to search forward. */
+static int
+noninc_search_from_pos (string, pos, dir)
+     char *string;
+     int pos, dir;
+{
+  int ret, old;
+
+  if (pos < 0)
+    return -1;
+
+  old = where_history ();
+  if (history_set_pos (pos) == 0)
+    return -1;
+
+  RL_SETSTATE(RL_STATE_SEARCH);
+  if (*string == '^')
+    ret = history_search_prefix (string + 1, dir);
+  else
+    ret = history_search (string, dir);
+  RL_UNSETSTATE(RL_STATE_SEARCH);
+
+  if (ret != -1)
+    ret = where_history ();
+
+  history_set_pos (old);
+  return (ret);
+}
+
+/* Search for a line in the history containing STRING.  If DIR is < 0, the
+   search is backwards through previous entries, else through subsequent
+   entries.  Returns 1 if the search was successful, 0 otherwise. */
+static int
+noninc_dosearch (string, dir)
+     char *string;
+     int dir;
+{
+  int oldpos, pos;
+  HIST_ENTRY *entry;
+
+  if (string == 0 || *string == '\0' || noninc_history_pos < 0)
+    {
+      rl_ding ();
+      return 0;
+    }
+
+  pos = noninc_search_from_pos (string, noninc_history_pos + dir, dir);
+  if (pos == -1)
+    {
+      /* Search failed, current history position unchanged. */
+      rl_maybe_unsave_line ();
+      rl_clear_message ();
+      rl_point = 0;
+      rl_ding ();
+      return 0;
+    }
+
+  noninc_history_pos = pos;
+
+  oldpos = where_history ();
+  history_set_pos (noninc_history_pos);
+  entry = current_history ();
+#if defined (VI_MODE)
+  if (rl_editing_mode != vi_mode)
+#endif
+    history_set_pos (oldpos);
+
+  make_history_line_current (entry);
+
+  rl_point = 0;
+  rl_mark = rl_end;
+
+  rl_clear_message ();
+  return 1;
+}
+
+static _rl_search_cxt *
+_rl_nsearch_init (dir, pchar)
+     int dir, pchar;
+{
+  _rl_search_cxt *cxt;
+  char *p;
+
+  cxt = _rl_scxt_alloc (RL_SEARCH_NSEARCH, 0);
+  if (dir < 0)
+    cxt->sflags |= SF_REVERSE;         /* not strictly needed */
+
+  cxt->direction = dir;
+  cxt->history_pos = cxt->save_line;
+
+  rl_maybe_save_line ();
+
+  /* Clear the undo list, since reading the search string should create its
+     own undo list, and the whole list will end up being freed when we
+     finish reading the search string. */
+  rl_undo_list = 0;
+
+  /* Use the line buffer to read the search string. */
+  rl_line_buffer[0] = 0;
+  rl_end = rl_point = 0;
+
+  p = _rl_make_prompt_for_search (pchar ? pchar : ':');
+  rl_message ("%s", p, 0);
+  free (p);
+
+  RL_SETSTATE(RL_STATE_NSEARCH);
+
+  _rl_nscxt = cxt;
+
+  return cxt;
+}
+
+static int
+_rl_nsearch_cleanup (cxt, r)
+     _rl_search_cxt *cxt;
+     int r;
+{
+  _rl_scxt_dispose (cxt, 0);
+  _rl_nscxt = 0;
+
+  RL_UNSETSTATE(RL_STATE_NSEARCH);
+
+  return (r != 1);
+}
+
+static void
+_rl_nsearch_abort (cxt)
+     _rl_search_cxt *cxt;
+{
+  rl_maybe_unsave_line ();
+  rl_clear_message ();
+  rl_point = cxt->save_point;
+  rl_mark = cxt->save_mark;
+  rl_restore_prompt ();
+
+  RL_UNSETSTATE (RL_STATE_NSEARCH);
+}
+
+/* Process just-read character C according to search context CXT.  Return -1
+   if the caller should abort the search, 0 if we should break out of the
+   loop, and 1 if we should continue to read characters. */
+static int
+_rl_nsearch_dispatch (cxt, c)
+     _rl_search_cxt *cxt;
+     int c;
+{
+  switch (c)
+    {
+    case CTRL('W'):
+      rl_unix_word_rubout (1, c);
+      break;
+
+    case CTRL('U'):
+      rl_unix_line_discard (1, c);
+      break;
+
+    case RETURN:
+    case NEWLINE:
+      return 0;
+
+    case CTRL('H'):
+    case RUBOUT:
+      if (rl_point == 0)
+       {
+         _rl_nsearch_abort (cxt);
+         return -1;
+       }
+      _rl_rubout_char (1, c);
+      break;
+
+    case CTRL('C'):
+    case CTRL('G'):
+      rl_ding ();
+      _rl_nsearch_abort (cxt);
+      return -1;
+
+    default:
+#if defined (HANDLE_MULTIBYTE)
+      if (MB_CUR_MAX > 1 && rl_byte_oriented == 0)
+       rl_insert_text (cxt->mb);
+      else
+#endif
+       _rl_insert_char (1, c);
+      break;
+    }
+
+  (*rl_redisplay_function) ();
+  return 1;
+}
+
+/* Perform one search according to CXT, using NONINC_SEARCH_STRING.  Return
+   -1 if the search should be aborted, any other value means to clean up
+   using _rl_nsearch_cleanup ().  Returns 1 if the search was successful,
+   0 otherwise. */
+static int
+_rl_nsearch_dosearch (cxt)
+     _rl_search_cxt *cxt;
+{
+  rl_mark = cxt->save_mark;
+
+  /* If rl_point == 0, we want to re-use the previous search string and
+     start from the saved history position.  If there's no previous search
+     string, punt. */
+  if (rl_point == 0)
+    {
+      if (noninc_search_string == 0)
+       {
+         rl_ding ();
+         rl_restore_prompt ();
+         RL_UNSETSTATE (RL_STATE_NSEARCH);
+         return -1;
+       }
+    }
+  else
+    {
+      /* We want to start the search from the current history position. */
+      noninc_history_pos = cxt->save_line;
+      FREE (noninc_search_string);
+      noninc_search_string = savestring (rl_line_buffer);
+
+      /* If we don't want the subsequent undo list generated by the search
+        matching a history line to include the contents of the search string,
+        we need to clear rl_line_buffer here.  For now, we just clear the
+        undo list generated by reading the search string.  (If the search
+        fails, the old undo list will be restored by rl_maybe_unsave_line.) */
+      rl_free_undo_list ();
+    }
+
+  rl_restore_prompt ();
+  return (noninc_dosearch (noninc_search_string, cxt->direction));
+}
+
+/* Search non-interactively through the history list.  DIR < 0 means to
+   search backwards through the history of previous commands; otherwise
+   the search is for commands subsequent to the current position in the
+   history list.  PCHAR is the character to use for prompting when reading
+   the search string; if not specified (0), it defaults to `:'. */
+static int
+noninc_search (dir, pchar)
+     int dir;
+     int pchar;
+{
+  _rl_search_cxt *cxt;
+  int c, r;
+
+  cxt = _rl_nsearch_init (dir, pchar);
+
+  if (RL_ISSTATE (RL_STATE_CALLBACK))
+    return (0);
+
+  /* Read the search string. */
+  r = 0;
+  while (1)
+    {
+      c = _rl_search_getchar (cxt);
+
+      if (c == 0)
+       break;
+
+      r = _rl_nsearch_dispatch (cxt, c);
+      if (r < 0)
+        return 1;
+      else if (r == 0)
+       break;        
+    }
+
+  r = _rl_nsearch_dosearch (cxt);
+  return ((r >= 0) ? _rl_nsearch_cleanup (cxt, r) : (r != 1));
+}
+
+/* Search forward through the history list for a string.  If the vi-mode
+   code calls this, KEY will be `?'. */
+int
+rl_noninc_forward_search (count, key)
+     int count, key;
+{
+  return noninc_search (1, (key == '?') ? '?' : 0);
+}
+
+/* Reverse search the history list for a string.  If the vi-mode code
+   calls this, KEY will be `/'. */
+int
+rl_noninc_reverse_search (count, key)
+     int count, key;
+{
+  return noninc_search (-1, (key == '/') ? '/' : 0);
+}
+
+/* Search forward through the history list for the last string searched
+   for.  If there is no saved search string, abort. */
+int
+rl_noninc_forward_search_again (count, key)
+     int count, key;
+{
+  int r;
+
+  if (!noninc_search_string)
+    {
+      rl_ding ();
+      return (-1);
+    }
+  r = noninc_dosearch (noninc_search_string, 1);
+  return (r != 1);
+}
+
+/* Reverse search in the history list for the last string searched
+   for.  If there is no saved search string, abort. */
+int
+rl_noninc_reverse_search_again (count, key)
+     int count, key;
+{
+  int r;
+
+  if (!noninc_search_string)
+    {
+      rl_ding ();
+      return (-1);
+    }
+  r = noninc_dosearch (noninc_search_string, -1);
+  return (r != 1);
+}
+
+#if defined (READLINE_CALLBACKS)
+int
+_rl_nsearch_callback (cxt)
+     _rl_search_cxt *cxt;
+{
+  int c, r;
+
+  c = _rl_search_getchar (cxt);
+  r = _rl_nsearch_dispatch (cxt, c);
+  if (r != 0)
+    return 1;
+
+  r = _rl_nsearch_dosearch (cxt);
+  return ((r >= 0) ? _rl_nsearch_cleanup (cxt, r) : (r != 1));
+}
+#endif
+  
+static int
+rl_history_search_internal (count, dir)
+     int count, dir;
+{
+  HIST_ENTRY *temp;
+  int ret, oldpos;
+
+  rl_maybe_save_line ();
+  temp = (HIST_ENTRY *)NULL;
+
+  /* Search COUNT times through the history for a line whose prefix
+     matches history_search_string.  When this loop finishes, TEMP,
+     if non-null, is the history line to copy into the line buffer. */
+  while (count)
+    {
+      ret = noninc_search_from_pos (history_search_string, rl_history_search_pos + dir, dir);
+      if (ret == -1)
+       break;
+
+      /* Get the history entry we found. */
+      rl_history_search_pos = ret;
+      oldpos = where_history ();
+      history_set_pos (rl_history_search_pos);
+      temp = current_history ();
+      history_set_pos (oldpos);
+
+      /* Don't find multiple instances of the same line. */
+      if (prev_line_found && STREQ (prev_line_found, temp->line))
+        continue;
+      prev_line_found = temp->line;
+      count--;
+    }
+
+  /* If we didn't find anything at all, return. */
+  if (temp == 0)
+    {
+      rl_maybe_unsave_line ();
+      rl_ding ();
+      /* If you don't want the saved history line (last match) to show up
+         in the line buffer after the search fails, change the #if 0 to
+         #if 1 */
+#if 0
+      if (rl_point > rl_history_search_len)
+        {
+          rl_point = rl_end = rl_history_search_len;
+          rl_line_buffer[rl_end] = '\0';
+          rl_mark = 0;
+        }
+#else
+      rl_point = rl_history_search_len;        /* rl_maybe_unsave_line changes it */
+      rl_mark = rl_end;
+#endif
+      return 1;
+    }
+
+  /* Copy the line we found into the current line buffer. */
+  make_history_line_current (temp);
+
+  rl_point = rl_history_search_len;
+  rl_mark = rl_end;
+
+  return 0;
+}
+
+static void
+rl_history_search_reinit ()
+{
+  rl_history_search_pos = where_history ();
+  rl_history_search_len = rl_point;
+  prev_line_found = (char *)NULL;
+  if (rl_point)
+    {
+      if (rl_history_search_len >= history_string_size - 2)
+       {
+         history_string_size = rl_history_search_len + 2;
+         history_search_string = (char *)xrealloc (history_search_string, history_string_size);
+       }
+      history_search_string[0] = '^';
+      strncpy (history_search_string + 1, rl_line_buffer, rl_point);
+      history_search_string[rl_point + 1] = '\0';
+    }
+  _rl_free_saved_history_line ();
+}
+
+/* Search forward in the history for the string of characters
+   from the start of the line to rl_point.  This is a non-incremental
+   search. */
+int
+rl_history_search_forward (count, ignore)
+     int count, ignore;
+{
+  if (count == 0)
+    return (0);
+
+  if (rl_last_func != rl_history_search_forward &&
+      rl_last_func != rl_history_search_backward)
+    rl_history_search_reinit ();
+
+  if (rl_history_search_len == 0)
+    return (rl_get_next_history (count, ignore));
+  return (rl_history_search_internal (abs (count), (count > 0) ? 1 : -1));
+}
+
+/* Search backward through the history for the string of characters
+   from the start of the line to rl_point.  This is a non-incremental
+   search. */
+int
+rl_history_search_backward (count, ignore)
+     int count, ignore;
+{
+  if (count == 0)
+    return (0);
+
+  if (rl_last_func != rl_history_search_forward &&
+      rl_last_func != rl_history_search_backward)
+    rl_history_search_reinit ();
+
+  if (rl_history_search_len == 0)
+    return (rl_get_previous_history (count, ignore));
+  return (rl_history_search_internal (abs (count), (count > 0) ? -1 : 1));
+}
diff --git a/shell.c b/shell.c
new file mode 100644 (file)
index 0000000..346f811
--- /dev/null
+++ b/shell.c
@@ -0,0 +1,208 @@
+/* shell.c -- readline utility functions that are normally provided by
+             bash when readline is linked as part of the shell. */
+
+/* Copyright (C) 1997 Free Software Foundation, Inc.
+
+   This file is part of the GNU Readline Library, a library for
+   reading lines of text with interactive input and history editing.
+
+   The GNU Readline Library 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.
+
+   The GNU Readline Library is distributed in the hope that it will be
+   useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+   of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   The GNU General Public License is often shipped with GNU software, and
+   is generally kept in a file called COPYING or LICENSE.  If you do not
+   have a copy of the license, write to the Free Software Foundation,
+   59 Temple Place, Suite 330, Boston, MA 02111 USA. */
+#define READLINE_LIBRARY
+
+#if defined (HAVE_CONFIG_H)
+#  include <config.h>
+#endif
+
+#include <sys/types.h>
+
+#if defined (HAVE_UNISTD_H)
+#  include <unistd.h>
+#endif /* HAVE_UNISTD_H */
+
+#if defined (HAVE_STDLIB_H)
+#  include <stdlib.h>
+#else
+#  include "ansi_stdlib.h"
+#endif /* HAVE_STDLIB_H */
+
+#if defined (HAVE_STRING_H)
+#  include <string.h>
+#else
+#  include <strings.h>
+#endif /* !HAVE_STRING_H */
+
+#if defined (HAVE_LIMITS_H)
+#  include <limits.h>
+#endif
+
+#if defined (HAVE_FCNTL_H)
+#include <fcntl.h>
+#endif
+#if defined (HAVE_PWD_H)
+#include <pwd.h>
+#endif
+
+#include <stdio.h>
+
+#include "rlstdc.h"
+#include "rlshell.h"
+#include "xmalloc.h"
+
+#if defined (HAVE_GETPWUID) && !defined (HAVE_GETPW_DECLS)
+extern struct passwd *getpwuid PARAMS((uid_t));
+#endif /* HAVE_GETPWUID && !HAVE_GETPW_DECLS */
+
+#ifndef NULL
+#  define NULL 0
+#endif
+
+#ifndef CHAR_BIT
+#  define CHAR_BIT 8
+#endif
+
+/* Nonzero if the integer type T is signed.  */
+#define TYPE_SIGNED(t) (! ((t) 0 < (t) -1))
+
+/* Bound on length of the string representing an integer value of type T.
+   Subtract one for the sign bit if T is signed;
+   302 / 1000 is log10 (2) rounded up;
+   add one for integer division truncation;
+   add one more for a minus sign if t is signed.  */
+#define INT_STRLEN_BOUND(t) \
+  ((sizeof (t) * CHAR_BIT - TYPE_SIGNED (t)) * 302 / 1000 \
+   + 1 + TYPE_SIGNED (t))
+
+/* All of these functions are resolved from bash if we are linking readline
+   as part of bash. */
+
+/* Does shell-like quoting using single quotes. */
+char *
+sh_single_quote (string)
+     char *string;
+{
+  register int c;
+  char *result, *r, *s;
+
+  result = (char *)xmalloc (3 + (4 * strlen (string)));
+  r = result;
+  *r++ = '\'';
+
+  for (s = string; s && (c = *s); s++)
+    {
+      *r++ = c;
+
+      if (c == '\'')
+       {
+         *r++ = '\\';  /* insert escaped single quote */
+         *r++ = '\'';
+         *r++ = '\'';  /* start new quoted string */
+       }
+    }
+
+  *r++ = '\'';
+  *r = '\0';
+
+  return (result);
+}
+
+/* Set the environment variables LINES and COLUMNS to lines and cols,
+   respectively. */
+void
+sh_set_lines_and_columns (lines, cols)
+     int lines, cols;
+{
+  char *b;
+
+#if defined (HAVE_SETENV)
+  b = (char *)xmalloc (INT_STRLEN_BOUND (int) + 1);
+  sprintf (b, "%d", lines);
+  setenv ("LINES", b, 1);
+  free (b);
+
+  b = (char *)xmalloc (INT_STRLEN_BOUND (int) + 1);
+  sprintf (b, "%d", cols);
+  setenv ("COLUMNS", b, 1);
+  free (b);
+#else /* !HAVE_SETENV */
+#  if defined (HAVE_PUTENV)
+  b = (char *)xmalloc (INT_STRLEN_BOUND (int) + sizeof ("LINES=") + 1);
+  sprintf (b, "LINES=%d", lines);
+  putenv (b);
+
+  b = (char *)xmalloc (INT_STRLEN_BOUND (int) + sizeof ("COLUMNS=") + 1);
+  sprintf (b, "COLUMNS=%d", cols);
+  putenv (b);
+#  endif /* HAVE_PUTENV */
+#endif /* !HAVE_SETENV */
+}
+
+char *
+sh_get_env_value (varname)
+     const char *varname;
+{
+  return ((char *)getenv (varname));
+}
+
+char *
+sh_get_home_dir ()
+{
+  char *home_dir;
+  struct passwd *entry;
+
+  home_dir = (char *)NULL;
+#if defined (HAVE_GETPWUID)
+  entry = getpwuid (getuid ());
+  if (entry)
+    home_dir = entry->pw_dir;
+#endif
+  return (home_dir);
+}
+
+#if !defined (O_NDELAY)
+#  if defined (FNDELAY)
+#    define O_NDELAY FNDELAY
+#  endif
+#endif
+
+int
+sh_unset_nodelay_mode (fd)
+     int fd;
+{
+#if defined (HAVE_FCNTL)
+  int flags, bflags;
+
+  if ((flags = fcntl (fd, F_GETFL, 0)) < 0)
+    return -1;
+
+  bflags = 0;
+
+#ifdef O_NONBLOCK
+  bflags |= O_NONBLOCK;
+#endif
+
+#ifdef O_NDELAY
+  bflags |= O_NDELAY;
+#endif
+
+  if (flags & bflags)
+    {
+      flags &= ~bflags;
+      return (fcntl (fd, F_SETFL, flags));
+    }
+#endif
+
+  return 0;
+}
diff --git a/shlib/Makefile.in b/shlib/Makefile.in
new file mode 100644 (file)
index 0000000..c2225d6
--- /dev/null
@@ -0,0 +1,454 @@
+## -*- text -*- ##
+# Makefile for the GNU readline library shared library support.
+#
+# Copyright (C) 1998-2003 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111 USA.
+
+PACKAGE = @PACKAGE_NAME@
+VERSION = @PACKAGE_VERSION@
+
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+
+RL_LIBRARY_VERSION = @LIBVERSION@
+RL_LIBRARY_NAME = readline
+
+srcdir = @srcdir@
+VPATH = .:@top_srcdir@
+topdir = @top_srcdir@
+BUILD_DIR = @BUILD_DIR@
+
+INSTALL = @INSTALL@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_DATA = @INSTALL_DATA@
+
+CC = @CC@
+RANLIB = @RANLIB@
+AR = @AR@
+ARFLAGS = @ARFLAGS@
+RM = rm -f
+CP = cp
+MV = mv
+LN = ln
+
+SHELL = @MAKE_SHELL@
+
+host_os = @host_os@
+
+prefix = @prefix@
+exec_prefix = @exec_prefix@
+includedir = @includedir@
+bindir = @bindir@
+libdir = @libdir@
+datadir = @datadir@
+localedir = $(datadir)/locale
+
+# Support an alternate destination root directory for package building
+DESTDIR =
+
+CFLAGS = @CFLAGS@
+LOCAL_CFLAGS = @LOCAL_CFLAGS@ -DRL_LIBRARY_VERSION='"$(RL_LIBRARY_VERSION)"'
+CPPFLAGS = @CPPFLAGS@
+LDFLAGS = @LDFLAGS@ @LOCAL_LDFLAGS@ @CFLAGS@
+
+DEFS = @DEFS@ @CROSS_COMPILE@
+LOCAL_DEFS = @LOCAL_DEFS@
+
+#
+# These values are generated for configure by ${topdir}/support/shobj-conf.
+# If your system is not supported by that script, but includes facilities for
+# dynamic loading of shared objects, please update the script and send the
+# changes to bash-maintainers@gnu.org.
+#
+SHOBJ_CC = @SHOBJ_CC@
+SHOBJ_CFLAGS = @SHOBJ_CFLAGS@
+SHOBJ_LD = @SHOBJ_LD@
+
+SHOBJ_LDFLAGS = @SHOBJ_LDFLAGS@
+SHOBJ_XLDFLAGS = @SHOBJ_XLDFLAGS@
+SHOBJ_LIBS = @SHOBJ_LIBS@
+
+SHLIB_XLDFLAGS = @LDFLAGS@ @SHLIB_XLDFLAGS@
+SHLIB_LIBS = @SHLIB_LIBS@
+
+SHLIB_DOT = @SHLIB_DOT@
+SHLIB_LIBPREF = @SHLIB_LIBPREF@
+SHLIB_LIBSUFF = @SHLIB_LIBSUFF@
+
+SHLIB_LIBVERSION = @SHLIB_LIBVERSION@
+SHLIB_DLLVERSION = @SHLIB_DLLVERSION@
+
+SHLIB_STATUS = @SHLIB_STATUS@
+
+TERMCAP_LIB = @TERMCAP_LIB@
+
+# shared library versioning
+SHLIB_MAJOR=           @SHLIB_MAJOR@
+# shared library systems like SVR4's do not use minor versions
+SHLIB_MINOR=           .@SHLIB_MINOR@
+
+# For libraries which include headers from other libraries.
+INCLUDES = -I. -I.. -I$(topdir)
+
+CCFLAGS = $(DEFS) $(LOCAL_DEFS) $(CPPFLAGS) $(INCLUDES) $(LOCAL_CFLAGS) $(CFLAGS)
+
+.SUFFIXES:     .so
+
+.c.so:
+       ${RM} $@
+       $(SHOBJ_CC) -c $(CCFLAGS) $(SHOBJ_CFLAGS) -o $*.o $< 
+       $(MV) $*.o $@
+
+# The name of the main library target.
+
+SHARED_READLINE = $(SHLIB_LIBPREF)readline$(SHLIB_DOT)$(SHLIB_LIBVERSION)
+SHARED_HISTORY = $(SHLIB_LIBPREF)history$(SHLIB_DOT)$(SHLIB_LIBVERSION)
+SHARED_LIBS = $(SHARED_READLINE) $(SHARED_HISTORY)
+
+# The C code source files for this library.
+CSOURCES = $(topdir)/readline.c $(topdir)/funmap.c $(topdir)/keymaps.c \
+          $(topdir)/vi_mode.c $(topdir)/parens.c $(topdir)/rltty.c \
+          $(topdir)/complete.c $(topdir)/bind.c $(topdir)/isearch.c \
+          $(topdir)/display.c $(topdir)/signals.c $(topdir)/emacs_keymap.c \
+          $(topdir)/vi_keymap.c $(topdir)/util.c $(topdir)/kill.c \
+          $(topdir)/undo.c $(topdir)/macro.c $(topdir)/input.c \
+          $(topdir)/callback.c $(topdir)/terminal.c $(topdir)/xmalloc.c \
+          $(topdir)/history.c $(topdir)/histsearch.c $(topdir)/histexpand.c \
+          $(topdir)/histfile.c $(topdir)/nls.c $(topdir)/search.c \
+          $(topdir)/shell.c $(topdir)/savestring.c $(topdir)/tilde.c \
+          $(topdir)/text.c $(topdir)/misc.c $(topdir)/compat.c \
+          $(topdir)/mbutil.c
+
+# The header files for this library.
+HSOURCES = readline.h rldefs.h chardefs.h keymaps.h history.h histlib.h \
+          posixstat.h posixdir.h posixjmp.h tilde.h rlconf.h rltty.h \
+          ansi_stdlib.h tcap.h xmalloc.h rlprivate.h rlshell.h rlmbutil.h
+
+SHARED_HISTOBJ = history.so histexpand.so histfile.so histsearch.so shell.so \
+                mbutil.so
+SHARED_TILDEOBJ = tilde.so
+SHARED_OBJ = readline.so vi_mode.so funmap.so keymaps.so parens.so search.so \
+         rltty.so complete.so bind.so isearch.so display.so signals.so \
+         util.so kill.so undo.so macro.so input.so callback.so terminal.so \
+         text.so nls.so misc.so xmalloc.so $(SHARED_HISTOBJ) $(SHARED_TILDEOBJ) \
+         compat.so
+
+##########################################################################
+
+all: $(SHLIB_STATUS)
+
+supported: $(SHARED_LIBS)
+
+unsupported:
+       @echo "Your system and compiler (${host_os}-${CC}) are not supported by the"
+       @echo "${topdir}/support/shobj-conf script."
+       @echo "If your operating system provides facilities for creating"
+       @echo "shared libraries, please update the script and re-run configure."
+       @echo "Please send the changes you made to bash-maintainers@gnu.org"
+       @echo "for inclusion in future bash and readline releases."
+
+$(SHARED_READLINE):    $(SHARED_OBJ)
+       $(RM) $@
+       $(SHOBJ_LD) ${SHOBJ_LDFLAGS} ${SHLIB_XLDFLAGS} -o $@ $(SHARED_OBJ) $(SHLIB_LIBS)
+
+$(SHARED_HISTORY):     $(SHARED_HISTOBJ) xmalloc.so
+       $(RM) $@
+       $(SHOBJ_LD) ${SHOBJ_LDFLAGS} ${SHLIB_XLDFLAGS} -o $@ $(SHARED_HISTOBJ) xmalloc.so $(SHLIB_LIBS)
+
+# Since tilde.c is shared between readline and bash, make sure we compile 
+# it with the right flags when it's built as part of readline
+tilde.so:        tilde.c
+       ${RM} $@
+       $(SHOBJ_CC) -c $(CCFLAGS) $(SHOBJ_CFLAGS) -DREADLINE_LIBRARY -c -o tilde.o $(topdir)/tilde.c
+       $(MV) tilde.o $@
+
+installdirs: $(topdir)/support/mkdirs
+       -$(SHELL) $(topdir)/support/mkdirs $(DESTDIR)$(libdir)
+
+install: installdirs $(SHLIB_STATUS)
+       $(SHELL) $(topdir)/support/shlib-install -O $(host_os) -d $(DESTDIR)$(libdir) -b $(DESTDIR)$(bindir) -i "$(INSTALL_DATA)" $(SHARED_HISTORY)
+       $(SHELL) $(topdir)/support/shlib-install -O $(host_os) -d $(DESTDIR)$(libdir) -b $(DESTDIR)$(bindir) -i "$(INSTALL_DATA)" $(SHARED_READLINE)
+       @echo install: you may need to run ldconfig
+
+uninstall:
+       $(SHELL) $(topdir)/support/shlib-install -O $(host_os) -d $(DESTDIR)$(libdir) -b $(DESTDIR)$(bindir) -U $(SHARED_HISTORY)
+       $(SHELL) $(topdir)/support/shlib-install -O $(host_os) -d $(DESTDIR)$(libdir) -b $(DESTDIR)$(bindir) -U $(SHARED_READLINE)
+       @echo uninstall: you may need to run ldconfig
+
+clean mostlyclean:     force
+       $(RM) $(SHARED_OBJ) $(SHARED_LIBS)
+
+distclean maintainer-clean: clean
+       $(RM) Makefile
+
+force:
+
+# Tell versions [3.59,3.63) of GNU make not to export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
+
+# Dependencies
+bind.so: $(topdir)/ansi_stdlib.h $(topdir)/posixstat.h
+bind.so: $(topdir)/rldefs.h ${BUILD_DIR}/config.h $(topdir)/rlconf.h
+bind.so: $(topdir)/readline.h $(topdir)/keymaps.h $(topdir)/chardefs.h
+bind.so: $(topdir)/rltypedefs.h
+bind.so: $(topdir)/tilde.h $(topdir)/history.h
+compat.so: $(topdir)/rlstdc.h
+callback.so: $(topdir)/rlconf.h
+callback.so: $(topdir)/rldefs.h ${BUILD_DIR}/config.h
+callback.so: $(topdir)/readline.h $(topdir)/keymaps.h $(topdir)/chardefs.h
+callback.so: $(topdir)/rltypedefs.h
+callback.so: $(topdir)/tilde.h
+complete.so: $(topdir)/ansi_stdlib.h posixdir.h $(topdir)/posixstat.h
+complete.so: $(topdir)/rldefs.h ${BUILD_DIR}/config.h $(topdir)/rlconf.h
+complete.so: $(topdir)/readline.h $(topdir)/keymaps.h $(topdir)/chardefs.h
+complete.so: $(topdir)/rltypedefs.h
+complete.so: $(topdir)/tilde.h
+display.so: $(topdir)/ansi_stdlib.h $(topdir)/posixstat.h
+display.so: $(topdir)/rldefs.h ${BUILD_DIR}/config.h $(topdir)/rlconf.h
+display.so: $(topdir)/tcap.h
+display.so: $(topdir)/readline.h $(topdir)/keymaps.h $(topdir)/chardefs.h
+display.so: $(topdir)/rltypedefs.h
+display.so: $(topdir)/tilde.h $(topdir)/history.h
+funmap.so: $(topdir)/readline.h $(topdir)/keymaps.h $(topdir)/chardefs.h
+funmap.so: $(topdir)/rltypedefs.h
+funmap.so: $(topdir)/rlconf.h $(topdir)/ansi_stdlib.h
+funmap.so: ${BUILD_DIR}/config.h $(topdir)/tilde.h
+histexpand.so: $(topdir)/ansi_stdlib.h
+histexpand.so: $(topdir)/history.h $(topdir)/histlib.h $(topdir)/rltypedefs.h
+histexpand.so: ${BUILD_DIR}/config.h
+histfile.so: $(topdir)/ansi_stdlib.h
+histfile.so: $(topdir)/history.h $(topdir)/histlib.h $(topdir)/rltypedefs.h
+histfile.so: ${BUILD_DIR}/config.h
+history.so: $(topdir)/ansi_stdlib.h
+history.so: $(topdir)/history.h $(topdir)/histlib.h $(topdir)/rltypedefs.h
+history.so: ${BUILD_DIR}/config.h
+histsearch.so: $(topdir)/ansi_stdlib.h
+histsearch.so: $(topdir)/history.h $(topdir)/histlib.h $(topdir)/rltypedefs.h
+histsearch.so: ${BUILD_DIR}/config.h
+input.so: $(topdir)/ansi_stdlib.h
+input.so: $(topdir)/rldefs.h ${BUILD_DIR}/config.h $(topdir)/rlconf.h
+input.so: $(topdir)/readline.h $(topdir)/keymaps.h $(topdir)/chardefs.h
+input.so: $(topdir)/rltypedefs.h
+input.so: $(topdir)/tilde.h
+isearch.so: $(topdir)/rldefs.h ${BUILD_DIR}/config.h $(topdir)/rlconf.h
+isearch.so: $(topdir)/readline.h $(topdir)/keymaps.h $(topdir)/chardefs.h
+isearch.so: $(topdir)/rltypedefs.h
+isearch.so: $(topdir)/ansi_stdlib.h $(topdir)/history.h $(topdir)/tilde.h
+keymaps.so: emacs_keymap.c vi_keymap.c
+keymaps.so: $(topdir)/keymaps.h $(topdir)/chardefs.h $(topdir)/rlconf.h
+keymaps.so: $(topdir)/readline.h $(topdir)/keymaps.h $(topdir)/chardefs.h
+keymaps.so: $(topdir)/rltypedefs.h
+keymaps.so: ${BUILD_DIR}/config.h $(topdir)/ansi_stdlib.h $(topdir)/tilde.h
+kill.so: $(topdir)/ansi_stdlib.h
+kill.so: $(topdir)/rldefs.h ${BUILD_DIR}/config.h $(topdir)/rlconf.h
+kill.so: $(topdir)/readline.h $(topdir)/keymaps.h $(topdir)/chardefs.h
+kill.so: $(topdir)/tilde.h $(topdir)/history.h  $(topdir)/rltypedefs.h
+macro.so: $(topdir)/ansi_stdlib.h
+macro.so: $(topdir)/rldefs.h ${BUILD_DIR}/config.h $(topdir)/rlconf.h
+macro.so: $(topdir)/readline.h $(topdir)/keymaps.h $(topdir)/chardefs.h
+macro.so: $(topdir)/tilde.h $(topdir)/history.h $(topdir)/rltypedefs.h
+mbutil.so: $(topdir)/rldefs.h ${BUILD_DIR}/config.h $(topdir)/rlconf.h
+mbutil.so: $(topdir)/readline.h $(topdir)/keymaps.h $(topdir)/rltypedefs.h
+mbutil.so: $(topdir)/chardefs.h $(topdir)/rlstdc.h
+misc.so: $(topdir)/readline.h $(topdir)/keymaps.h $(topdir)/chardefs.h
+misc.so: $(topdir)/rldefs.h ${BUILD_DIR}/config.h $(topdir)/rlconf.h
+misc.so: $(topdir)/rltypedefs.h
+misc.so: $(topdir)/history.h $(topdir)/tilde.h $(topdir)/ansi_stdlib.h
+nls.so: $(topdir)/ansi_stdlib.h
+nls.so: $(topdir)/rldefs.h ${BUILD_DIR}/config.h $(topdir)/rlconf.h
+nls.o: $(topdir)/readline.h $(topdir)/keymaps.h $(topdir)/chardefs.h
+nls.o: $(topdir)/rltypedefs.h
+nls.o: $(topdir)/tilde.h $(topdir)/history.h $(topdir)/rlstdc.h  
+parens.so: $(topdir)/rlconf.h ${BUILD_DIR}/config.h
+parens.so: $(topdir)/readline.h $(topdir)/keymaps.h $(topdir)/chardefs.h
+parens.so: $(topdir)/rltypedefs.h
+parens.so: $(topdir)/tilde.h
+rltty.so: $(topdir)/rldefs.h ${BUILD_DIR}/config.h $(topdir)/rlconf.h
+rltty.so: $(topdir)/rltty.h $(topdir)/tilde.h
+rltty.so: $(topdir)/readline.h $(topdir)/keymaps.h $(topdir)/chardefs.h
+rltty.so: $(topdir)/rltypedefs.h
+search.so: $(topdir)/rldefs.h ${BUILD_DIR}/config.h $(topdir)/rlconf.h
+search.so: $(topdir)/readline.h $(topdir)/keymaps.h $(topdir)/chardefs.h
+search.so: $(topdir)/ansi_stdlib.h $(topdir)/history.h $(topdir)/tilde.h
+search.so: $(topdir)/rltypedefs.h
+signals.so: $(topdir)/rldefs.h ${BUILD_DIR}/config.h $(topdir)/rlconf.h
+signals.so: $(topdir)/readline.h $(topdir)/keymaps.h $(topdir)/chardefs.h
+signals.so: $(topdir)/history.h $(topdir)/tilde.h
+signals.so: $(topdir)/rltypedefs.h
+terminal.so: $(topdir)/rldefs.h ${BUILD_DIR}/config.h $(topdir)/rlconf.h
+terminal.so: $(topdir)/tcap.h
+terminal.so: $(topdir)/readline.h $(topdir)/keymaps.h $(topdir)/chardefs.h
+terminal.so: $(topdir)/tilde.h $(topdir)/history.h
+terminal.so: $(topdir)/rltypedefs.h
+text.so: $(topdir)/readline.h $(topdir)/keymaps.h $(topdir)/chardefs.h
+text.so: $(topdir)/rldefs.h ${BUILD_DIR}/config.h $(topdir)/rlconf.h
+text.so: $(topdir)/rltypedefs.h
+text.so: $(topdir)/history.h $(topdir)/tilde.h $(topdir)/ansi_stdlib.h
+tilde.so: $(topdir)/ansi_stdlib.h ${BUILD_DIR}/config.h $(topdir)/tilde.h
+undo.so: $(topdir)/ansi_stdlib.h
+undo.so: $(topdir)/rldefs.h ${BUILD_DIR}/config.h $(topdir)/rlconf.h
+undo.so: $(topdir)/readline.h $(topdir)/keymaps.h $(topdir)/chardefs.h
+undo.so: $(topdir)/rltypedefs.h
+undo.so: $(topdir)/tilde.h $(topdir)/history.h
+util.so: $(topdir)/posixjmp.h $(topdir)/ansi_stdlib.h
+util.so: $(topdir)/rldefs.h ${BUILD_DIR}/config.h $(topdir)/rlconf.h
+util.so: $(topdir)/readline.h $(topdir)/keymaps.h $(topdir)/chardefs.h
+util.so: $(topdir)/rltypedefs.h $(topdir)/tilde.h
+vi_mode.so: $(topdir)/rldefs.h ${BUILD_DIR}/config.h $(topdir)/rlconf.h
+vi_mode.so: $(topdir)/readline.h $(topdir)/keymaps.h $(topdir)/chardefs.h
+vi_mode.so: $(topdir)/history.h $(topdir)/ansi_stdlib.h $(topdir)/tilde.h
+vi_mode.so: $(topdir)/rltypedefs.h
+xmalloc.so: ${BUILD_DIR}/config.h
+xmalloc.so: $(topdir)/ansi_stdlib.h
+
+bind.so: $(topdir)/rlshell.h
+histfile.so: $(topdir)/rlshell.h
+nls.so: $(topdir)/rlshell.h
+readline.so: $(topdir)/rlshell.h
+shell.so: $(topdir)/rlshell.h
+terminal.so: $(topdir)/rlshell.h
+histexpand.so: $(topdir)/rlshell.h
+
+bind.so: $(topdir)/rlprivate.h
+callback.so: $(topdir)/rlprivate.h
+complete.so: $(topdir)/rlprivate.h
+display.so: $(topdir)/rlprivate.h
+input.so: $(topdir)/rlprivate.h
+isearch.so: $(topdir)/rlprivate.h
+kill.so: $(topdir)/rlprivate.h
+macro.so: $(topdir)/rlprivate.h
+mbutil.so: $(topdir)/rlprivate.h
+misc.so: $(topdir)/rlprivate.h
+nls.so: $(topdir)/rlprivate.h   
+parens.so: $(topdir)/rlprivate.h
+readline.so: $(topdir)/rlprivate.h
+rltty.so: $(topdir)/rlprivate.h 
+search.so: $(topdir)/rlprivate.h
+signals.so: $(topdir)/rlprivate.h
+terminal.so: $(topdir)/rlprivate.h
+text.so: $(topdir)/rlprivate.h
+undo.so: $(topdir)/rlprivate.h
+util.so: $(topdir)/rlprivate.h
+vi_mode.so: $(topdir)/rlprivate.h
+
+bind.so: $(topdir)/xmalloc.h
+complete.so: $(topdir)/xmalloc.h
+display.so: $(topdir)/xmalloc.h
+funmap.so: $(topdir)/xmalloc.h
+histexpand.so: $(topdir)/xmalloc.h
+histfile.so: $(topdir)/xmalloc.h
+history.so: $(topdir)/xmalloc.h
+input.so: $(topdir)/xmalloc.h
+isearch.so: $(topdir)/xmalloc.h
+keymaps.so: $(topdir)/xmalloc.h
+kill.so: $(topdir)/xmalloc.h
+macro.so: $(topdir)/xmalloc.h
+mbutil.so: $(topdir)/xmalloc.h
+misc.so: $(topdir)/xmalloc.h
+readline.so: $(topdir)/xmalloc.h
+savestring.so: $(topdir)/xmalloc.h
+search.so: $(topdir)/xmalloc.h
+shell.so: $(topdir)/xmalloc.h
+terminal.so: $(topdir)/xmalloc.h
+text.so: $(topdir)/xmalloc.h
+tilde.so: $(topdir)/xmalloc.h
+undo.so: $(topdir)/xmalloc.h
+util.so: $(topdir)/xmalloc.h
+vi_mode.so: $(topdir)/xmalloc.h
+xmalloc.so: $(topdir)/xmalloc.h
+
+complete.o: $(topdir)/rlmbutil.h
+display.o: $(topdir)/rlmbutil.h
+histexpand.o: $(topdir)/rlmbutil.h
+input.o: $(topdir)/rlmbutil.h
+isearch.o: $(topdir)/rlmbutil.h
+mbutil.o: $(topdir)/rlmbutil.h
+misc.o: $(topdir)/rlmbutil.h
+readline.o: $(topdir)/rlmbutil.h
+search.o: $(topdir)/rlmbutil.h
+text.o: $(topdir)/rlmbutil.h
+vi_mode.o: $(topdir)/rlmbutil.h
+
+bind.so: $(topdir)/bind.c
+callback.so: $(topdir)/callback.c
+compat.so: $(topdir)/compat.c
+complete.so: $(topdir)/complete.c
+display.so: $(topdir)/display.c
+funmap.so: $(topdir)/funmap.c
+input.so: $(topdir)/input.c
+isearch.so: $(topdir)/isearch.c
+keymaps.so: $(topdir)/keymaps.c $(topdir)/emacs_keymap.c $(topdir)/vi_keymap.c
+kill.so: $(topdir)/kill.c
+macro.so: $(topdir)/macro.c
+mbutil.so: $(topdir)/mbutil.c
+misc.so: $(topdir)/mbutil.c
+nls.so: $(topdir)/nls.c
+parens.so: $(topdir)/parens.c
+readline.so: $(topdir)/readline.c
+rltty.so: $(topdir)/rltty.c
+savestring.so: $(topdir)/savestring.c
+search.so: $(topdir)/search.c
+shell.so: $(topdir)/shell.c
+signals.so: $(topdir)/signals.c
+terminal.so: $(topdir)/terminal.c
+text.so: $(topdir)/text.c
+tilde.so: $(topdir)/tilde.c
+undo.so: $(topdir)/undo.c
+util.so: $(topdir)/util.c
+vi_mode.so: $(topdir)/vi_mode.c
+xmalloc.so: $(topdir)/xmalloc.c
+
+histexpand.so: $(topdir)/histexpand.c
+histfile.so: $(topdir)/histfile.c
+history.so: $(topdir)/history.c
+histsearch.so: $(topdir)/histsearch.c
+
+bind.so: bind.c
+callback.so: callback.c
+comapt.so: compat.c
+complete.so: complete.c
+display.so: display.c
+funmap.so: funmap.c
+input.so: input.c
+isearch.so: isearch.c
+keymaps.so: keymaps.c emacs_keymap.c vi_keymap.c
+kill.so: kill.c
+macro.so: macro.c
+mbutil.so: mbutil.c
+misc.so: misc.c
+nls.so: nls.c
+parens.so: parens.c
+readline.so: readline.c
+rltty.so: rltty.c
+savestring.so: savestring.c
+search.so: search.c
+signals.so: signals.c
+shell.so: shell.c
+terminal.so: terminal.c
+text.so: text.c
+tilde.so: tilde.c
+undo.so: undo.c
+util.so: util.c
+vi_mode.so: vi_mode.c
+xmalloc.so: xmalloc.c
+
+histexpand.so: histexpand.c
+histfile.so: histfile.c
+history.so: history.c
+histsearch.so: histsearch.c
diff --git a/signals.c b/signals.c
new file mode 100644 (file)
index 0000000..54f2a64
--- /dev/null
+++ b/signals.c
@@ -0,0 +1,466 @@
+/* signals.c -- signal handling support for readline. */
+
+/* Copyright (C) 1987-2005 Free Software Foundation, Inc.
+
+   This file is part of the GNU Readline Library, a library for
+   reading lines of text with interactive input and history editing.
+
+   The GNU Readline Library 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.
+
+   The GNU Readline Library is distributed in the hope that it will be
+   useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+   of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   The GNU General Public License is often shipped with GNU software, and
+   is generally kept in a file called COPYING or LICENSE.  If you do not
+   have a copy of the license, write to the Free Software Foundation,
+   59 Temple Place, Suite 330, Boston, MA 02111 USA. */
+#define READLINE_LIBRARY
+
+#if defined (HAVE_CONFIG_H)
+#  include <config.h>
+#endif
+
+#include <stdio.h>             /* Just for NULL.  Yuck. */
+#include <sys/types.h>
+#include <signal.h>
+
+#if defined (HAVE_UNISTD_H)
+#  include <unistd.h>
+#endif /* HAVE_UNISTD_H */
+
+/* System-specific feature definitions and include files. */
+#include "rldefs.h"
+
+#if defined (GWINSZ_IN_SYS_IOCTL)
+#  include <sys/ioctl.h>
+#endif /* GWINSZ_IN_SYS_IOCTL */
+
+#if defined (HANDLE_SIGNALS)
+/* Some standard library routines. */
+#include "readline.h"
+#include "history.h"
+
+#include "rlprivate.h"
+
+#if !defined (RETSIGTYPE)
+#  if defined (VOID_SIGHANDLER)
+#    define RETSIGTYPE void
+#  else
+#    define RETSIGTYPE int
+#  endif /* !VOID_SIGHANDLER */
+#endif /* !RETSIGTYPE */
+
+#if defined (VOID_SIGHANDLER)
+#  define SIGHANDLER_RETURN return
+#else
+#  define SIGHANDLER_RETURN return (0)
+#endif
+
+/* This typedef is equivalent to the one for Function; it allows us
+   to say SigHandler *foo = signal (SIGKILL, SIG_IGN); */
+typedef RETSIGTYPE SigHandler ();
+
+#if defined (HAVE_POSIX_SIGNALS)
+typedef struct sigaction sighandler_cxt;
+#  define rl_sigaction(s, nh, oh)      sigaction(s, nh, oh)
+#else
+typedef struct { SigHandler *sa_handler; int sa_mask, sa_flags; } sighandler_cxt;
+#  define sigemptyset(m)
+#endif /* !HAVE_POSIX_SIGNALS */
+
+#ifndef SA_RESTART
+#  define SA_RESTART 0
+#endif
+
+static SigHandler *rl_set_sighandler PARAMS((int, SigHandler *, sighandler_cxt *));
+static void rl_maybe_set_sighandler PARAMS((int, SigHandler *, sighandler_cxt *));
+
+/* Exported variables for use by applications. */
+
+/* If non-zero, readline will install its own signal handlers for
+   SIGINT, SIGTERM, SIGQUIT, SIGALRM, SIGTSTP, SIGTTIN, and SIGTTOU. */
+int rl_catch_signals = 1;
+
+/* If non-zero, readline will install a signal handler for SIGWINCH. */
+#ifdef SIGWINCH
+int rl_catch_sigwinch = 1;
+#else
+int rl_catch_sigwinch = 0;     /* for the readline state struct in readline.c */
+#endif
+
+static int signals_set_flag;
+static int sigwinch_set_flag;
+
+/* **************************************************************** */
+/*                                                                 */
+/*                        Signal Handling                          */
+/*                                                                 */
+/* **************************************************************** */
+
+static sighandler_cxt old_int, old_term, old_alrm, old_quit;
+#if defined (SIGTSTP)
+static sighandler_cxt old_tstp, old_ttou, old_ttin;
+#endif
+#if defined (SIGWINCH)
+static sighandler_cxt old_winch;
+#endif
+
+/* Readline signal handler functions. */
+
+static RETSIGTYPE
+rl_signal_handler (sig)
+     int sig;
+{
+#if defined (HAVE_POSIX_SIGNALS)
+  sigset_t set;
+#else /* !HAVE_POSIX_SIGNALS */
+#  if defined (HAVE_BSD_SIGNALS)
+  long omask;
+#  else /* !HAVE_BSD_SIGNALS */
+  sighandler_cxt dummy_cxt;    /* needed for rl_set_sighandler call */
+#  endif /* !HAVE_BSD_SIGNALS */
+#endif /* !HAVE_POSIX_SIGNALS */
+
+  RL_SETSTATE(RL_STATE_SIGHANDLER);
+
+#if !defined (HAVE_BSD_SIGNALS) && !defined (HAVE_POSIX_SIGNALS)
+  /* Since the signal will not be blocked while we are in the signal
+     handler, ignore it until rl_clear_signals resets the catcher. */
+#  if defined (SIGALRM)
+  if (sig == SIGINT || sig == SIGALRM)
+#  else
+  if (sig == SIGINT)
+#  endif
+    rl_set_sighandler (sig, SIG_IGN, &dummy_cxt);
+#endif /* !HAVE_BSD_SIGNALS && !HAVE_POSIX_SIGNALS */
+
+  switch (sig)
+    {
+    case SIGINT:
+      rl_free_line_state ();
+      /* FALLTHROUGH */
+
+    case SIGTERM:
+#if defined (SIGTSTP)
+    case SIGTSTP:
+    case SIGTTOU:
+    case SIGTTIN:
+#endif /* SIGTSTP */
+#if defined (SIGALRM)
+    case SIGALRM:
+#endif
+#if defined (SIGQUIT)
+    case SIGQUIT:
+#endif
+      rl_cleanup_after_signal ();
+
+#if defined (HAVE_POSIX_SIGNALS)
+      sigemptyset (&set);
+      sigprocmask (SIG_BLOCK, (sigset_t *)NULL, &set);
+      sigdelset (&set, sig);
+#else /* !HAVE_POSIX_SIGNALS */
+#  if defined (HAVE_BSD_SIGNALS)
+      omask = sigblock (0);
+#  endif /* HAVE_BSD_SIGNALS */
+#endif /* !HAVE_POSIX_SIGNALS */
+
+#if defined (__EMX__)
+      signal (sig, SIG_ACK);
+#endif
+
+#if defined (HAVE_KILL)
+      kill (getpid (), sig);
+#else
+      raise (sig);             /* assume we have raise */
+#endif
+
+      /* Let the signal that we just sent through.  */
+#if defined (HAVE_POSIX_SIGNALS)
+      sigprocmask (SIG_SETMASK, &set, (sigset_t *)NULL);
+#else /* !HAVE_POSIX_SIGNALS */
+#  if defined (HAVE_BSD_SIGNALS)
+      sigsetmask (omask & ~(sigmask (sig)));
+#  endif /* HAVE_BSD_SIGNALS */
+#endif /* !HAVE_POSIX_SIGNALS */
+
+      rl_reset_after_signal ();
+    }
+
+  RL_UNSETSTATE(RL_STATE_SIGHANDLER);
+  SIGHANDLER_RETURN;
+}
+
+#if defined (SIGWINCH)
+static RETSIGTYPE
+rl_sigwinch_handler (sig)
+     int sig;
+{
+  SigHandler *oh;
+
+#if defined (MUST_REINSTALL_SIGHANDLERS)
+  sighandler_cxt dummy_winch;
+
+  /* We don't want to change old_winch -- it holds the state of SIGWINCH
+     disposition set by the calling application.  We need this state
+     because we call the application's SIGWINCH handler after updating
+     our own idea of the screen size. */
+  rl_set_sighandler (SIGWINCH, rl_sigwinch_handler, &dummy_winch);
+#endif
+
+  RL_SETSTATE(RL_STATE_SIGHANDLER);
+  rl_resize_terminal ();
+
+  /* If another sigwinch handler has been installed, call it. */
+  oh = (SigHandler *)old_winch.sa_handler;
+  if (oh &&  oh != (SigHandler *)SIG_IGN && oh != (SigHandler *)SIG_DFL)
+    (*oh) (sig);
+
+  RL_UNSETSTATE(RL_STATE_SIGHANDLER);
+  SIGHANDLER_RETURN;
+}
+#endif  /* SIGWINCH */
+
+/* Functions to manage signal handling. */
+
+#if !defined (HAVE_POSIX_SIGNALS)
+static int
+rl_sigaction (sig, nh, oh)
+     int sig;
+     sighandler_cxt *nh, *oh;
+{
+  oh->sa_handler = signal (sig, nh->sa_handler);
+  return 0;
+}
+#endif /* !HAVE_POSIX_SIGNALS */
+
+/* Set up a readline-specific signal handler, saving the old signal
+   information in OHANDLER.  Return the old signal handler, like
+   signal(). */
+static SigHandler *
+rl_set_sighandler (sig, handler, ohandler)
+     int sig;
+     SigHandler *handler;
+     sighandler_cxt *ohandler;
+{
+  sighandler_cxt old_handler;
+#if defined (HAVE_POSIX_SIGNALS)
+  struct sigaction act;
+
+  act.sa_handler = handler;
+  act.sa_flags = (sig == SIGWINCH) ? SA_RESTART : 0;
+  sigemptyset (&act.sa_mask);
+  sigemptyset (&ohandler->sa_mask);
+  sigaction (sig, &act, &old_handler);
+#else
+  old_handler.sa_handler = (SigHandler *)signal (sig, handler);
+#endif /* !HAVE_POSIX_SIGNALS */
+
+  /* XXX -- assume we have memcpy */
+  /* If rl_set_signals is called twice in a row, don't set the old handler to
+     rl_signal_handler, because that would cause infinite recursion. */
+  if (handler != rl_signal_handler || old_handler.sa_handler != rl_signal_handler)
+    memcpy (ohandler, &old_handler, sizeof (sighandler_cxt));
+
+  return (ohandler->sa_handler);
+}
+
+static void
+rl_maybe_set_sighandler (sig, handler, ohandler)
+     int sig;
+     SigHandler *handler;
+     sighandler_cxt *ohandler;
+{
+  sighandler_cxt dummy;
+  SigHandler *oh;
+
+  sigemptyset (&dummy.sa_mask);
+  oh = rl_set_sighandler (sig, handler, ohandler);
+  if (oh == (SigHandler *)SIG_IGN)
+    rl_sigaction (sig, ohandler, &dummy);
+}
+
+int
+rl_set_signals ()
+{
+  sighandler_cxt dummy;
+  SigHandler *oh;
+#if defined (HAVE_POSIX_SIGNALS)
+  static int sigmask_set = 0;
+  static sigset_t bset, oset;
+#endif
+
+#if defined (HAVE_POSIX_SIGNALS)
+  if (rl_catch_signals && sigmask_set == 0)
+    {
+      sigemptyset (&bset);
+
+      sigaddset (&bset, SIGINT);
+      sigaddset (&bset, SIGINT);
+#if defined (SIGQUIT)
+      sigaddset (&bset, SIGQUIT);
+#endif
+#if defined (SIGALRM)
+      sigaddset (&bset, SIGALRM);
+#endif
+#if defined (SIGTSTP)
+      sigaddset (&bset, SIGTSTP);
+#endif
+#if defined (SIGTTIN)
+      sigaddset (&bset, SIGTTIN);
+#endif
+#if defined (SIGTTOU)
+      sigaddset (&bset, SIGTTOU);
+#endif
+      sigmask_set = 1;
+    }      
+#endif /* HAVE_POSIX_SIGNALS */
+
+  if (rl_catch_signals && signals_set_flag == 0)
+    {
+#if defined (HAVE_POSIX_SIGNALS)
+      sigemptyset (&oset);
+      sigprocmask (SIG_BLOCK, &bset, &oset);
+#endif
+
+      rl_maybe_set_sighandler (SIGINT, rl_signal_handler, &old_int);
+      rl_maybe_set_sighandler (SIGTERM, rl_signal_handler, &old_term);
+#if defined (SIGQUIT)
+      rl_maybe_set_sighandler (SIGQUIT, rl_signal_handler, &old_quit);
+#endif
+
+#if defined (SIGALRM)
+      oh = rl_set_sighandler (SIGALRM, rl_signal_handler, &old_alrm);
+      if (oh == (SigHandler *)SIG_IGN)
+       rl_sigaction (SIGALRM, &old_alrm, &dummy);
+#if defined (HAVE_POSIX_SIGNALS) && defined (SA_RESTART)
+      /* If the application using readline has already installed a signal
+        handler with SA_RESTART, SIGALRM will cause reads to be restarted
+        automatically, so readline should just get out of the way.  Since
+        we tested for SIG_IGN above, we can just test for SIG_DFL here. */
+      if (oh != (SigHandler *)SIG_DFL && (old_alrm.sa_flags & SA_RESTART))
+       rl_sigaction (SIGALRM, &old_alrm, &dummy);
+#endif /* HAVE_POSIX_SIGNALS */
+#endif /* SIGALRM */
+
+#if defined (SIGTSTP)
+      rl_maybe_set_sighandler (SIGTSTP, rl_signal_handler, &old_tstp);
+#endif /* SIGTSTP */
+
+#if defined (SIGTTOU)
+      rl_maybe_set_sighandler (SIGTTOU, rl_signal_handler, &old_ttou);
+#endif /* SIGTTOU */
+
+#if defined (SIGTTIN)
+      rl_maybe_set_sighandler (SIGTTIN, rl_signal_handler, &old_ttin);
+#endif /* SIGTTIN */
+
+      signals_set_flag = 1;
+
+#if defined (HAVE_POSIX_SIGNALS)
+      sigprocmask (SIG_SETMASK, &oset, (sigset_t *)NULL);
+#endif
+    }
+
+#if defined (SIGWINCH)
+  if (rl_catch_sigwinch && sigwinch_set_flag == 0)
+    {
+      rl_maybe_set_sighandler (SIGWINCH, rl_sigwinch_handler, &old_winch);
+      sigwinch_set_flag = 1;
+    }
+#endif /* SIGWINCH */
+
+  return 0;
+}
+
+int
+rl_clear_signals ()
+{
+  sighandler_cxt dummy;
+
+  if (rl_catch_signals && signals_set_flag == 1)
+    {
+      sigemptyset (&dummy.sa_mask);
+
+      rl_sigaction (SIGINT, &old_int, &dummy);
+      rl_sigaction (SIGTERM, &old_term, &dummy);
+#if defined (SIGQUIT)
+      rl_sigaction (SIGQUIT, &old_quit, &dummy);
+#endif
+#if defined (SIGALRM)
+      rl_sigaction (SIGALRM, &old_alrm, &dummy);
+#endif
+
+#if defined (SIGTSTP)
+      rl_sigaction (SIGTSTP, &old_tstp, &dummy);
+#endif /* SIGTSTP */
+
+#if defined (SIGTTOU)
+      rl_sigaction (SIGTTOU, &old_ttou, &dummy);
+#endif /* SIGTTOU */
+
+#if defined (SIGTTIN)
+      rl_sigaction (SIGTTIN, &old_ttin, &dummy);
+#endif /* SIGTTIN */
+
+      signals_set_flag = 0;
+    }
+
+#if defined (SIGWINCH)
+  if (rl_catch_sigwinch && sigwinch_set_flag == 1)
+    {
+      sigemptyset (&dummy.sa_mask);
+      rl_sigaction (SIGWINCH, &old_winch, &dummy);
+      sigwinch_set_flag = 0;
+    }
+#endif
+
+  return 0;
+}
+
+/* Clean up the terminal and readline state after catching a signal, before
+   resending it to the calling application. */
+void
+rl_cleanup_after_signal ()
+{
+  _rl_clean_up_for_exit ();
+  if (rl_deprep_term_function)
+    (*rl_deprep_term_function) ();
+  rl_clear_pending_input ();
+  rl_clear_signals ();
+}
+
+/* Reset the terminal and readline state after a signal handler returns. */
+void
+rl_reset_after_signal ()
+{
+  if (rl_prep_term_function)
+    (*rl_prep_term_function) (_rl_meta_flag);
+  rl_set_signals ();
+}
+
+/* Free up the readline variable line state for the current line (undo list,
+   any partial history entry, any keyboard macros in progress, and any
+   numeric arguments in process) after catching a signal, before calling
+   rl_cleanup_after_signal(). */ 
+void
+rl_free_line_state ()
+{
+  register HIST_ENTRY *entry;
+
+  rl_free_undo_list ();
+
+  entry = current_history ();
+  if (entry)
+    entry->data = (char *)NULL;
+
+  _rl_kill_kbd_macro ();
+  rl_clear_message ();
+  _rl_reset_argument ();
+}
+
+#endif  /* HANDLE_SIGNALS */
diff --git a/support/config.guess b/support/config.guess
new file mode 100755 (executable)
index 0000000..6d90d6f
--- /dev/null
@@ -0,0 +1,1403 @@
+#! /bin/sh
+# Attempt to guess a canonical system name.
+#   Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
+#   2000, 2001, 2002 Free Software Foundation, Inc.
+
+timestamp='2002-11-30'
+
+# This file 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.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+# Originally written by Per Bothner <per@bothner.com>.
+# Please send patches to <config-patches@gnu.org>.  Submit a context
+# diff and a properly formatted ChangeLog entry.
+#
+# This script attempts to guess a canonical system name similar to
+# config.sub.  If it succeeds, it prints the system name on stdout, and
+# exits with 0.  Otherwise, it exits with 1.
+#
+# The plan is that this can be called by configure scripts if you
+# don't specify an explicit build system type.
+
+me=`echo "$0" | sed -e 's,.*/,,'`
+
+usage="\
+Usage: $0 [OPTION]
+
+Output the configuration name of the system \`$me' is run on.
+
+Operation modes:
+  -h, --help         print this help, then exit
+  -t, --time-stamp   print date of last modification, then exit
+  -v, --version      print version number, then exit
+
+Report bugs and patches to <config-patches@gnu.org>."
+
+version="\
+GNU config.guess ($timestamp)
+
+Originally written by Per Bothner.
+Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001
+Free Software Foundation, Inc.
+
+This is free software; see the source for copying conditions.  There is NO
+warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
+
+help="
+Try \`$me --help' for more information."
+
+# Parse command line
+while test $# -gt 0 ; do
+  case $1 in
+    --time-stamp | --time* | -t )
+       echo "$timestamp" ; exit 0 ;;
+    --version | -v )
+       echo "$version" ; exit 0 ;;
+    --help | --h* | -h )
+       echo "$usage"; exit 0 ;;
+    -- )     # Stop option processing
+       shift; break ;;
+    - )        # Use stdin as input.
+       break ;;
+    -* )
+       echo "$me: invalid option $1$help" >&2
+       exit 1 ;;
+    * )
+       break ;;
+  esac
+done
+
+if test $# != 0; then
+  echo "$me: too many arguments$help" >&2
+  exit 1
+fi
+
+trap 'exit 1' 1 2 15
+
+# CC_FOR_BUILD -- compiler used by this script. Note that the use of a
+# compiler to aid in system detection is discouraged as it requires
+# temporary files to be created and, as you can see below, it is a
+# headache to deal with in a portable fashion.
+
+# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still
+# use `HOST_CC' if defined, but it is deprecated.
+
+# This shell variable is my proudest work .. or something. --bje
+
+set_cc_for_build='tmpdir=${TMPDIR-/tmp}/config-guess-$$ ;
+(old=`umask` && umask 077 && mkdir $tmpdir && umask $old && unset old)
+   || (echo "$me: cannot create $tmpdir" >&2 && exit 1) ;
+dummy=$tmpdir/dummy ;
+files="$dummy.c $dummy.o $dummy.rel $dummy" ;
+trap '"'"'rm -f $files; rmdir $tmpdir; exit 1'"'"' 1 2 15 ;
+case $CC_FOR_BUILD,$HOST_CC,$CC in
+ ,,)    echo "int x;" > $dummy.c ;
+       for c in cc gcc c89 c99 ; do
+         if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then
+            CC_FOR_BUILD="$c"; break ;
+         fi ;
+       done ;
+       rm -f $files ;
+       if test x"$CC_FOR_BUILD" = x ; then
+         CC_FOR_BUILD=no_compiler_found ;
+       fi
+       ;;
+ ,,*)   CC_FOR_BUILD=$CC ;;
+ ,*,*)  CC_FOR_BUILD=$HOST_CC ;;
+esac ;
+unset files'
+
+# This is needed to find uname on a Pyramid OSx when run in the BSD universe.
+# (ghazi@noc.rutgers.edu 1994-08-24)
+if (test -f /.attbin/uname) >/dev/null 2>&1 ; then
+       PATH=$PATH:/.attbin ; export PATH
+fi
+
+UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown
+UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown
+UNAME_SYSTEM=`(uname -s) 2>/dev/null`  || UNAME_SYSTEM=unknown
+UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown
+
+# Note: order is significant - the case branches are not exclusive.
+
+case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
+    *:NetBSD:*:*)
+       # NetBSD (nbsd) targets should (where applicable) match one or
+       # more of the tupples: *-*-netbsdelf*, *-*-netbsdaout*,
+       # *-*-netbsdecoff* and *-*-netbsd*.  For targets that recently
+       # switched to ELF, *-*-netbsd* would select the old
+       # object file format.  This provides both forward
+       # compatibility and a consistent mechanism for selecting the
+       # object file format.
+       #
+       # Note: NetBSD doesn't particularly care about the vendor
+       # portion of the name.  We always set it to "unknown".
+       sysctl="sysctl -n hw.machine_arch"
+       UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \
+           /usr/sbin/$sysctl 2>/dev/null || echo unknown)`
+       case "${UNAME_MACHINE_ARCH}" in
+           armeb) machine=armeb-unknown ;;
+           arm*) machine=arm-unknown ;;
+           sh3el) machine=shl-unknown ;;
+           sh3eb) machine=sh-unknown ;;
+           *) machine=${UNAME_MACHINE_ARCH}-unknown ;;
+       esac
+       # The Operating System including object format, if it has switched
+       # to ELF recently, or will in the future.
+       case "${UNAME_MACHINE_ARCH}" in
+           arm*|i386|m68k|ns32k|sh3*|sparc|vax)
+               eval $set_cc_for_build
+               if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \
+                       | grep __ELF__ >/dev/null
+               then
+                   # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout).
+                   # Return netbsd for either.  FIX?
+                   os=netbsd
+               else
+                   os=netbsdelf
+               fi
+               ;;
+           *)
+               os=netbsd
+               ;;
+       esac
+       # The OS release
+       # Debian GNU/NetBSD machines have a different userland, and
+       # thus, need a distinct triplet. However, they do not need
+       # kernel version information, so it can be replaced with a
+       # suitable tag, in the style of linux-gnu.
+       case "${UNAME_VERSION}" in
+           Debian*)
+               release='-gnu'
+               ;;
+           *)
+               release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'`
+               ;;
+       esac
+       # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM:
+       # contains redundant information, the shorter form:
+       # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used.
+       echo "${machine}-${os}${release}"
+       exit 0 ;;
+    amiga:OpenBSD:*:*)
+       echo m68k-unknown-openbsd${UNAME_RELEASE}
+       exit 0 ;;
+    arc:OpenBSD:*:*)
+       echo mipsel-unknown-openbsd${UNAME_RELEASE}
+       exit 0 ;;
+    hp300:OpenBSD:*:*)
+       echo m68k-unknown-openbsd${UNAME_RELEASE}
+       exit 0 ;;
+    mac68k:OpenBSD:*:*)
+       echo m68k-unknown-openbsd${UNAME_RELEASE}
+       exit 0 ;;
+    macppc:OpenBSD:*:*)
+       echo powerpc-unknown-openbsd${UNAME_RELEASE}
+       exit 0 ;;
+    mvme68k:OpenBSD:*:*)
+       echo m68k-unknown-openbsd${UNAME_RELEASE}
+       exit 0 ;;
+    mvme88k:OpenBSD:*:*)
+       echo m88k-unknown-openbsd${UNAME_RELEASE}
+       exit 0 ;;
+    mvmeppc:OpenBSD:*:*)
+       echo powerpc-unknown-openbsd${UNAME_RELEASE}
+       exit 0 ;;
+    pmax:OpenBSD:*:*)
+       echo mipsel-unknown-openbsd${UNAME_RELEASE}
+       exit 0 ;;
+    sgi:OpenBSD:*:*)
+       echo mipseb-unknown-openbsd${UNAME_RELEASE}
+       exit 0 ;;
+    sun3:OpenBSD:*:*)
+       echo m68k-unknown-openbsd${UNAME_RELEASE}
+       exit 0 ;;
+    wgrisc:OpenBSD:*:*)
+       echo mipsel-unknown-openbsd${UNAME_RELEASE}
+       exit 0 ;;
+    *:OpenBSD:*:*)
+       echo ${UNAME_MACHINE}-unknown-openbsd${UNAME_RELEASE}
+       exit 0 ;;
+    alpha:OSF1:*:*)
+       if test $UNAME_RELEASE = "V4.0"; then
+               UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'`
+       fi
+       # A Vn.n version is a released version.
+       # A Tn.n version is a released field test version.
+       # A Xn.n version is an unreleased experimental baselevel.
+       # 1.2 uses "1.2" for uname -r.
+       eval $set_cc_for_build
+       cat <<EOF >$dummy.s
+       .data
+\$Lformat:
+       .byte 37,100,45,37,120,10,0     # "%d-%x\n"
+
+       .text
+       .globl main
+       .align 4
+       .ent main
+main:
+       .frame \$30,16,\$26,0
+       ldgp \$29,0(\$27)
+       .prologue 1
+       .long 0x47e03d80 # implver \$0
+       lda \$2,-1
+       .long 0x47e20c21 # amask \$2,\$1
+       lda \$16,\$Lformat
+       mov \$0,\$17
+       not \$1,\$18
+       jsr \$26,printf
+       ldgp \$29,0(\$26)
+       mov 0,\$16
+       jsr \$26,exit
+       .end main
+EOF
+       $CC_FOR_BUILD -o $dummy $dummy.s 2>/dev/null
+       if test "$?" = 0 ; then
+               case `$dummy` in
+                       0-0)
+                               UNAME_MACHINE="alpha"
+                               ;;
+                       1-0)
+                               UNAME_MACHINE="alphaev5"
+                               ;;
+                       1-1)
+                               UNAME_MACHINE="alphaev56"
+                               ;;
+                       1-101)
+                               UNAME_MACHINE="alphapca56"
+                               ;;
+                       2-303)
+                               UNAME_MACHINE="alphaev6"
+                               ;;
+                       2-307)
+                               UNAME_MACHINE="alphaev67"
+                               ;;
+                       2-1307)
+                               UNAME_MACHINE="alphaev68"
+                               ;;
+                       3-1307)
+                               UNAME_MACHINE="alphaev7"
+                               ;;
+               esac
+       fi
+       rm -f $dummy.s $dummy && rmdir $tmpdir
+       echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[VTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
+       exit 0 ;;
+    Alpha\ *:Windows_NT*:*)
+       # How do we know it's Interix rather than the generic POSIX subsystem?
+       # Should we change UNAME_MACHINE based on the output of uname instead
+       # of the specific Alpha model?
+       echo alpha-pc-interix
+       exit 0 ;;
+    21064:Windows_NT:50:3)
+       echo alpha-dec-winnt3.5
+       exit 0 ;;
+    Amiga*:UNIX_System_V:4.0:*)
+       echo m68k-unknown-sysv4
+       exit 0;;
+    *:[Aa]miga[Oo][Ss]:*:*)
+       echo ${UNAME_MACHINE}-unknown-amigaos
+       exit 0 ;;
+    *:[Mm]orph[Oo][Ss]:*:*)
+       echo ${UNAME_MACHINE}-unknown-morphos
+       exit 0 ;;
+    *:OS/390:*:*)
+       echo i370-ibm-openedition
+       exit 0 ;;
+    arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*)
+       echo arm-acorn-riscix${UNAME_RELEASE}
+       exit 0;;
+    SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*)
+       echo hppa1.1-hitachi-hiuxmpp
+       exit 0;;
+    Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*)
+       # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE.
+       if test "`(/bin/universe) 2>/dev/null`" = att ; then
+               echo pyramid-pyramid-sysv3
+       else
+               echo pyramid-pyramid-bsd
+       fi
+       exit 0 ;;
+    NILE*:*:*:dcosx)
+       echo pyramid-pyramid-svr4
+       exit 0 ;;
+    DRS?6000:UNIX_SV:4.2*:7*)
+       case `/usr/bin/uname -p` in
+           sparc) echo sparc-icl-nx7 && exit 0 ;;
+       esac ;;
+    sun4H:SunOS:5.*:*)
+       echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+       exit 0 ;;
+    sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*)
+       echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+       exit 0 ;;
+    i86pc:SunOS:5.*:*)
+       echo i386-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+       exit 0 ;;
+    sun4*:SunOS:6*:*)
+       # According to config.sub, this is the proper way to canonicalize
+       # SunOS6.  Hard to guess exactly what SunOS6 will be like, but
+       # it's likely to be more like Solaris than SunOS4.
+       echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+       exit 0 ;;
+    sun4*:SunOS:*:*)
+       case "`/usr/bin/arch -k`" in
+           Series*|S4*)
+               UNAME_RELEASE=`uname -v`
+               ;;
+       esac
+       # Japanese Language versions have a version number like `4.1.3-JL'.
+       echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'`
+       exit 0 ;;
+    sun3*:SunOS:*:*)
+       echo m68k-sun-sunos${UNAME_RELEASE}
+       exit 0 ;;
+    sun*:*:4.2BSD:*)
+       UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null`
+       test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3
+       case "`/bin/arch`" in
+           sun3)
+               echo m68k-sun-sunos${UNAME_RELEASE}
+               ;;
+           sun4)
+               echo sparc-sun-sunos${UNAME_RELEASE}
+               ;;
+       esac
+       exit 0 ;;
+    aushp:SunOS:*:*)
+       echo sparc-auspex-sunos${UNAME_RELEASE}
+       exit 0 ;;
+    # The situation for MiNT is a little confusing.  The machine name
+    # can be virtually everything (everything which is not
+    # "atarist" or "atariste" at least should have a processor
+    # > m68000).  The system name ranges from "MiNT" over "FreeMiNT"
+    # to the lowercase version "mint" (or "freemint").  Finally
+    # the system name "TOS" denotes a system which is actually not
+    # MiNT.  But MiNT is downward compatible to TOS, so this should
+    # be no problem.
+    atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*)
+        echo m68k-atari-mint${UNAME_RELEASE}
+       exit 0 ;;
+    atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*)
+       echo m68k-atari-mint${UNAME_RELEASE}
+        exit 0 ;;
+    *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*)
+        echo m68k-atari-mint${UNAME_RELEASE}
+       exit 0 ;;
+    milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*)
+        echo m68k-milan-mint${UNAME_RELEASE}
+        exit 0 ;;
+    hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*)
+        echo m68k-hades-mint${UNAME_RELEASE}
+        exit 0 ;;
+    *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*)
+        echo m68k-unknown-mint${UNAME_RELEASE}
+        exit 0 ;;
+    powerpc:machten:*:*)
+       echo powerpc-apple-machten${UNAME_RELEASE}
+       exit 0 ;;
+    RISC*:Mach:*:*)
+       echo mips-dec-mach_bsd4.3
+       exit 0 ;;
+    RISC*:ULTRIX:*:*)
+       echo mips-dec-ultrix${UNAME_RELEASE}
+       exit 0 ;;
+    VAX*:ULTRIX*:*:*)
+       echo vax-dec-ultrix${UNAME_RELEASE}
+       exit 0 ;;
+    2020:CLIX:*:* | 2430:CLIX:*:*)
+       echo clipper-intergraph-clix${UNAME_RELEASE}
+       exit 0 ;;
+    mips:*:*:UMIPS | mips:*:*:RISCos)
+       eval $set_cc_for_build
+       sed 's/^        //' << EOF >$dummy.c
+#ifdef __cplusplus
+#include <stdio.h>  /* for printf() prototype */
+       int main (int argc, char *argv[]) {
+#else
+       int main (argc, argv) int argc; char *argv[]; {
+#endif
+       #if defined (host_mips) && defined (MIPSEB)
+       #if defined (SYSTYPE_SYSV)
+         printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0);
+       #endif
+       #if defined (SYSTYPE_SVR4)
+         printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0);
+       #endif
+       #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD)
+         printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0);
+       #endif
+       #endif
+         exit (-1);
+       }
+EOF
+       $CC_FOR_BUILD -o $dummy $dummy.c \
+         && $dummy `echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` \
+         && rm -f $dummy.c $dummy && rmdir $tmpdir && exit 0
+       rm -f $dummy.c $dummy && rmdir $tmpdir
+       echo mips-mips-riscos${UNAME_RELEASE}
+       exit 0 ;;
+    Motorola:PowerMAX_OS:*:*)
+       echo powerpc-motorola-powermax
+       exit 0 ;;
+    Motorola:*:4.3:PL8-*)
+       echo powerpc-harris-powermax
+       exit 0 ;;
+    Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*)
+       echo powerpc-harris-powermax
+       exit 0 ;;
+    Night_Hawk:Power_UNIX:*:*)
+       echo powerpc-harris-powerunix
+       exit 0 ;;
+    m88k:CX/UX:7*:*)
+       echo m88k-harris-cxux7
+       exit 0 ;;
+    m88k:*:4*:R4*)
+       echo m88k-motorola-sysv4
+       exit 0 ;;
+    m88k:*:3*:R3*)
+       echo m88k-motorola-sysv3
+       exit 0 ;;
+    AViiON:dgux:*:*)
+        # DG/UX returns AViiON for all architectures
+        UNAME_PROCESSOR=`/usr/bin/uname -p`
+       if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ]
+       then
+           if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \
+              [ ${TARGET_BINARY_INTERFACE}x = x ]
+           then
+               echo m88k-dg-dgux${UNAME_RELEASE}
+           else
+               echo m88k-dg-dguxbcs${UNAME_RELEASE}
+           fi
+       else
+           echo i586-dg-dgux${UNAME_RELEASE}
+       fi
+       exit 0 ;;
+    M88*:DolphinOS:*:*)        # DolphinOS (SVR3)
+       echo m88k-dolphin-sysv3
+       exit 0 ;;
+    M88*:*:R3*:*)
+       # Delta 88k system running SVR3
+       echo m88k-motorola-sysv3
+       exit 0 ;;
+    XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3)
+       echo m88k-tektronix-sysv3
+       exit 0 ;;
+    Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD)
+       echo m68k-tektronix-bsd
+       exit 0 ;;
+    *:IRIX*:*:*)
+       echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'`
+       exit 0 ;;
+    ????????:AIX?:[12].1:2)   # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX.
+       echo romp-ibm-aix      # uname -m gives an 8 hex-code CPU id
+       exit 0 ;;              # Note that: echo "'`uname -s`'" gives 'AIX '
+    i*86:AIX:*:*)
+       echo i386-ibm-aix
+       exit 0 ;;
+    ia64:AIX:*:*)
+       if [ -x /usr/bin/oslevel ] ; then
+               IBM_REV=`/usr/bin/oslevel`
+       else
+               IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}
+       fi
+       echo ${UNAME_MACHINE}-ibm-aix${IBM_REV}
+       exit 0 ;;
+    *:AIX:2:3)
+       if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then
+               eval $set_cc_for_build
+               sed 's/^                //' << EOF >$dummy.c
+               #include <sys/systemcfg.h>
+
+               main()
+                       {
+                       if (!__power_pc())
+                               exit(1);
+                       puts("powerpc-ibm-aix3.2.5");
+                       exit(0);
+                       }
+EOF
+               $CC_FOR_BUILD -o $dummy $dummy.c && $dummy && rm -f $dummy.c $dummy && rmdir $tmpdir && exit 0
+               rm -f $dummy.c $dummy && rmdir $tmpdir
+               echo rs6000-ibm-aix3.2.5
+       elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then
+               echo rs6000-ibm-aix3.2.4
+       else
+               echo rs6000-ibm-aix3.2
+       fi
+       exit 0 ;;
+    *:AIX:*:[45])
+       IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'`
+       if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then
+               IBM_ARCH=rs6000
+       else
+               IBM_ARCH=powerpc
+       fi
+       if [ -x /usr/bin/oslevel ] ; then
+               IBM_REV=`/usr/bin/oslevel`
+       else
+               IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}
+       fi
+       echo ${IBM_ARCH}-ibm-aix${IBM_REV}
+       exit 0 ;;
+    *:AIX:*:*)
+       echo rs6000-ibm-aix
+       exit 0 ;;
+    ibmrt:4.4BSD:*|romp-ibm:BSD:*)
+       echo romp-ibm-bsd4.4
+       exit 0 ;;
+    ibmrt:*BSD:*|romp-ibm:BSD:*)            # covers RT/PC BSD and
+       echo romp-ibm-bsd${UNAME_RELEASE}   # 4.3 with uname added to
+       exit 0 ;;                           # report: romp-ibm BSD 4.3
+    *:BOSX:*:*)
+       echo rs6000-bull-bosx
+       exit 0 ;;
+    DPX/2?00:B.O.S.:*:*)
+       echo m68k-bull-sysv3
+       exit 0 ;;
+    9000/[34]??:4.3bsd:1.*:*)
+       echo m68k-hp-bsd
+       exit 0 ;;
+    hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*)
+       echo m68k-hp-bsd4.4
+       exit 0 ;;
+    9000/[34678]??:HP-UX:*:*)
+       HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`
+       case "${UNAME_MACHINE}" in
+           9000/31? )            HP_ARCH=m68000 ;;
+           9000/[34]?? )         HP_ARCH=m68k ;;
+           9000/[678][0-9][0-9])
+               if [ -x /usr/bin/getconf ]; then
+                   sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null`
+                    sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null`
+                    case "${sc_cpu_version}" in
+                      523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0
+                      528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1
+                      532)                      # CPU_PA_RISC2_0
+                        case "${sc_kernel_bits}" in
+                          32) HP_ARCH="hppa2.0n" ;;
+                          64) HP_ARCH="hppa2.0w" ;;
+                         '') HP_ARCH="hppa2.0" ;;   # HP-UX 10.20
+                        esac ;;
+                    esac
+               fi
+               if [ "${HP_ARCH}" = "" ]; then
+                   eval $set_cc_for_build
+                   sed 's/^              //' << EOF >$dummy.c
+
+              #define _HPUX_SOURCE
+              #include <stdlib.h>
+              #include <unistd.h>
+
+              int main ()
+              {
+              #if defined(_SC_KERNEL_BITS)
+                  long bits = sysconf(_SC_KERNEL_BITS);
+              #endif
+                  long cpu  = sysconf (_SC_CPU_VERSION);
+
+                  switch (cpu)
+               {
+               case CPU_PA_RISC1_0: puts ("hppa1.0"); break;
+               case CPU_PA_RISC1_1: puts ("hppa1.1"); break;
+               case CPU_PA_RISC2_0:
+              #if defined(_SC_KERNEL_BITS)
+                   switch (bits)
+                       {
+                       case 64: puts ("hppa2.0w"); break;
+                       case 32: puts ("hppa2.0n"); break;
+                       default: puts ("hppa2.0"); break;
+                       } break;
+              #else  /* !defined(_SC_KERNEL_BITS) */
+                   puts ("hppa2.0"); break;
+              #endif
+               default: puts ("hppa1.0"); break;
+               }
+                  exit (0);
+              }
+EOF
+                   (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy`
+                   if test -z "$HP_ARCH"; then HP_ARCH=hppa; fi
+                   rm -f $dummy.c $dummy && rmdir $tmpdir
+               fi ;;
+       esac
+       echo ${HP_ARCH}-hp-hpux${HPUX_REV}
+       exit 0 ;;
+    ia64:HP-UX:*:*)
+       HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`
+       echo ia64-hp-hpux${HPUX_REV}
+       exit 0 ;;
+    3050*:HI-UX:*:*)
+       eval $set_cc_for_build
+       sed 's/^        //' << EOF >$dummy.c
+       #include <unistd.h>
+       int
+       main ()
+       {
+         long cpu = sysconf (_SC_CPU_VERSION);
+         /* The order matters, because CPU_IS_HP_MC68K erroneously returns
+            true for CPU_PA_RISC1_0.  CPU_IS_PA_RISC returns correct
+            results, however.  */
+         if (CPU_IS_PA_RISC (cpu))
+           {
+             switch (cpu)
+               {
+                 case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break;
+                 case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break;
+                 case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break;
+                 default: puts ("hppa-hitachi-hiuxwe2"); break;
+               }
+           }
+         else if (CPU_IS_HP_MC68K (cpu))
+           puts ("m68k-hitachi-hiuxwe2");
+         else puts ("unknown-hitachi-hiuxwe2");
+         exit (0);
+       }
+EOF
+       $CC_FOR_BUILD -o $dummy $dummy.c && $dummy && rm -f $dummy.c $dummy && rmdir $tmpdir && exit 0
+       rm -f $dummy.c $dummy && rmdir $tmpdir
+       echo unknown-hitachi-hiuxwe2
+       exit 0 ;;
+    9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* )
+       echo hppa1.1-hp-bsd
+       exit 0 ;;
+    9000/8??:4.3bsd:*:*)
+       echo hppa1.0-hp-bsd
+       exit 0 ;;
+    *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*)
+       echo hppa1.0-hp-mpeix
+       exit 0 ;;
+    hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* )
+       echo hppa1.1-hp-osf
+       exit 0 ;;
+    hp8??:OSF1:*:*)
+       echo hppa1.0-hp-osf
+       exit 0 ;;
+    i*86:OSF1:*:*)
+       if [ -x /usr/sbin/sysversion ] ; then
+           echo ${UNAME_MACHINE}-unknown-osf1mk
+       else
+           echo ${UNAME_MACHINE}-unknown-osf1
+       fi
+       exit 0 ;;
+    parisc*:Lites*:*:*)
+       echo hppa1.1-hp-lites
+       exit 0 ;;
+    C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*)
+       echo c1-convex-bsd
+        exit 0 ;;
+    C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*)
+       if getsysinfo -f scalar_acc
+       then echo c32-convex-bsd
+       else echo c2-convex-bsd
+       fi
+        exit 0 ;;
+    C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*)
+       echo c34-convex-bsd
+        exit 0 ;;
+    C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*)
+       echo c38-convex-bsd
+        exit 0 ;;
+    C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*)
+       echo c4-convex-bsd
+        exit 0 ;;
+    CRAY*Y-MP:*:*:*)
+       echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+       exit 0 ;;
+    CRAY*[A-Z]90:*:*:*)
+       echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \
+       | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \
+             -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \
+             -e 's/\.[^.]*$/.X/'
+       exit 0 ;;
+    CRAY*TS:*:*:*)
+       echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+       exit 0 ;;
+    CRAY*T3D:*:*:*)
+       echo alpha-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+       exit 0 ;;
+    CRAY*T3E:*:*:*)
+       echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+       exit 0 ;;
+    CRAY*SV1:*:*:*)
+       echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+       exit 0 ;;
+    F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*)
+       FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
+        FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`
+        FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'`
+        echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
+        exit 0 ;;
+    i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*)
+       echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE}
+       exit 0 ;;
+    sparc*:BSD/OS:*:*)
+       echo sparc-unknown-bsdi${UNAME_RELEASE}
+       exit 0 ;;
+    *:BSD/OS:*:*)
+       echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE}
+       exit 0 ;;
+    amd64:FreeBSD:*:*)
+       echo x86_64-unknown-freebsd
+       exit 0 ;;
+    *:FreeBSD:*:*)
+       # Determine whether the default compiler uses glibc.
+       eval $set_cc_for_build
+       sed 's/^        //' << EOF >$dummy.c
+       #include <features.h>
+       #if __GLIBC__ >= 2
+       LIBC=gnu
+       #else
+       LIBC=
+       #endif
+EOF
+       eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^LIBC=`
+       rm -f $dummy.c && rmdir $tmpdir
+       echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`${LIBC:+-$LIBC}
+       exit 0 ;;
+    i*:CYGWIN*:*)
+       echo ${UNAME_MACHINE}-pc-cygwin
+       exit 0 ;;
+    i*:MINGW*:*)
+       echo ${UNAME_MACHINE}-pc-mingw32
+       exit 0 ;;
+    i*:PW*:*)
+       echo ${UNAME_MACHINE}-pc-pw32
+       exit 0 ;;
+    x86:Interix*:3*)
+       echo i586-pc-interix3
+       exit 0 ;;
+    [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*)
+       echo i${UNAME_MACHINE}-pc-mks
+       exit 0 ;;
+    i*:Windows_NT*:* | Pentium*:Windows_NT*:*)
+       # How do we know it's Interix rather than the generic POSIX subsystem?
+       # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we
+       # UNAME_MACHINE based on the output of uname instead of i386?
+       echo i586-pc-interix
+       exit 0 ;;
+    i*:UWIN*:*)
+       echo ${UNAME_MACHINE}-pc-uwin
+       exit 0 ;;
+    p*:CYGWIN*:*)
+       echo powerpcle-unknown-cygwin
+       exit 0 ;;
+    prep*:SunOS:5.*:*)
+       echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+       exit 0 ;;
+    *:GNU:*:*)
+       echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'`
+       exit 0 ;;
+    i*86:Minix:*:*)
+       echo ${UNAME_MACHINE}-pc-minix
+       exit 0 ;;
+    arm*:Linux:*:*)
+       echo ${UNAME_MACHINE}-unknown-linux-gnu
+       exit 0 ;;
+    ia64:Linux:*:*)
+       echo ${UNAME_MACHINE}-unknown-linux-gnu
+       exit 0 ;;
+    m68*:Linux:*:*)
+       echo ${UNAME_MACHINE}-unknown-linux-gnu
+       exit 0 ;;
+    mips:Linux:*:*)
+       eval $set_cc_for_build
+       sed 's/^        //' << EOF >$dummy.c
+       #undef CPU
+       #undef mips
+       #undef mipsel
+       #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL)
+       CPU=mipsel
+       #else
+       #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB)
+       CPU=mips
+       #else
+       CPU=
+       #endif
+       #endif
+EOF
+       eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^CPU=`
+       rm -f $dummy.c && rmdir $tmpdir
+       test x"${CPU}" != x && echo "${CPU}-unknown-linux-gnu" && exit 0
+       ;;
+    mips64:Linux:*:*)
+       eval $set_cc_for_build
+       sed 's/^        //' << EOF >$dummy.c
+       #undef CPU
+       #undef mips64
+       #undef mips64el
+       #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL)
+       CPU=mips64el
+       #else
+       #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB)
+       CPU=mips64
+       #else
+       CPU=
+       #endif
+       #endif
+EOF
+       eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^CPU=`
+       rm -f $dummy.c && rmdir $tmpdir
+       test x"${CPU}" != x && echo "${CPU}-unknown-linux-gnu" && exit 0
+       ;;
+    ppc:Linux:*:*)
+       echo powerpc-unknown-linux-gnu
+       exit 0 ;;
+    ppc64:Linux:*:*)
+       echo powerpc64-unknown-linux-gnu
+       exit 0 ;;
+    alpha:Linux:*:*)
+       case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in
+         EV5)   UNAME_MACHINE=alphaev5 ;;
+         EV56)  UNAME_MACHINE=alphaev56 ;;
+         PCA56) UNAME_MACHINE=alphapca56 ;;
+         PCA57) UNAME_MACHINE=alphapca56 ;;
+         EV6)   UNAME_MACHINE=alphaev6 ;;
+         EV67)  UNAME_MACHINE=alphaev67 ;;
+         EV68*) UNAME_MACHINE=alphaev68 ;;
+        esac
+       objdump --private-headers /bin/sh | grep ld.so.1 >/dev/null
+       if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi
+       echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC}
+       exit 0 ;;
+    parisc:Linux:*:* | hppa:Linux:*:*)
+       # Look for CPU level
+       case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in
+         PA7*) echo hppa1.1-unknown-linux-gnu ;;
+         PA8*) echo hppa2.0-unknown-linux-gnu ;;
+         *)    echo hppa-unknown-linux-gnu ;;
+       esac
+       exit 0 ;;
+    parisc64:Linux:*:* | hppa64:Linux:*:*)
+       echo hppa64-unknown-linux-gnu
+       exit 0 ;;
+    s390:Linux:*:* | s390x:Linux:*:*)
+       echo ${UNAME_MACHINE}-ibm-linux
+       exit 0 ;;
+    sh*:Linux:*:*)
+       echo ${UNAME_MACHINE}-unknown-linux-gnu
+       exit 0 ;;
+    sparc:Linux:*:* | sparc64:Linux:*:*)
+       echo ${UNAME_MACHINE}-unknown-linux-gnu
+       exit 0 ;;
+    x86_64:Linux:*:*)
+       echo x86_64-unknown-linux-gnu
+       exit 0 ;;
+    i*86:Linux:*:*)
+       # The BFD linker knows what the default object file format is, so
+       # first see if it will tell us. cd to the root directory to prevent
+       # problems with other programs or directories called `ld' in the path.
+       # Set LC_ALL=C to ensure ld outputs messages in English.
+       ld_supported_targets=`cd /; LC_ALL=C ld --help 2>&1 \
+                        | sed -ne '/supported targets:/!d
+                                   s/[         ][      ]*/ /g
+                                   s/.*supported targets: *//
+                                   s/ .*//
+                                   p'`
+        case "$ld_supported_targets" in
+         elf32-i386)
+               TENTATIVE="${UNAME_MACHINE}-pc-linux-gnu"
+               ;;
+         a.out-i386-linux)
+               echo "${UNAME_MACHINE}-pc-linux-gnuaout"
+               exit 0 ;;
+         coff-i386)
+               echo "${UNAME_MACHINE}-pc-linux-gnucoff"
+               exit 0 ;;
+         "")
+               # Either a pre-BFD a.out linker (linux-gnuoldld) or
+               # one that does not give us useful --help.
+               echo "${UNAME_MACHINE}-pc-linux-gnuoldld"
+               exit 0 ;;
+       esac
+       # Determine whether the default compiler is a.out or elf
+       eval $set_cc_for_build
+       sed 's/^        //' << EOF >$dummy.c
+       #include <features.h>
+       #ifdef __ELF__
+       # ifdef __GLIBC__
+       #  if __GLIBC__ >= 2
+       LIBC=gnu
+       #  else
+       LIBC=gnulibc1
+       #  endif
+       # else
+       LIBC=gnulibc1
+       # endif
+       #else
+       #ifdef __INTEL_COMPILER
+       LIBC=gnu
+       #else
+       LIBC=gnuaout
+       #endif
+       #endif
+EOF
+       eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^LIBC=`
+       rm -f $dummy.c && rmdir $tmpdir
+       test x"${LIBC}" != x && echo "${UNAME_MACHINE}-pc-linux-${LIBC}" && exit 0
+       test x"${TENTATIVE}" != x && echo "${TENTATIVE}" && exit 0
+       ;;
+    i*86:DYNIX/ptx:4*:*)
+       # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there.
+       # earlier versions are messed up and put the nodename in both
+       # sysname and nodename.
+       echo i386-sequent-sysv4
+       exit 0 ;;
+    i*86:UNIX_SV:4.2MP:2.*)
+        # Unixware is an offshoot of SVR4, but it has its own version
+        # number series starting with 2...
+        # I am not positive that other SVR4 systems won't match this,
+       # I just have to hope.  -- rms.
+        # Use sysv4.2uw... so that sysv4* matches it.
+       echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION}
+       exit 0 ;;
+    i*86:OS/2:*:*)
+       # If we were able to find `uname', then EMX Unix compatibility
+       # is probably installed.
+       echo ${UNAME_MACHINE}-pc-os2-emx
+       exit 0 ;;
+    i*86:XTS-300:*:STOP)
+       echo ${UNAME_MACHINE}-unknown-stop
+       exit 0 ;;
+    i*86:atheos:*:*)
+       echo ${UNAME_MACHINE}-unknown-atheos
+       exit 0 ;;
+    i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.0*:*)
+       echo i386-unknown-lynxos${UNAME_RELEASE}
+       exit 0 ;;
+    i*86:*DOS:*:*)
+       echo ${UNAME_MACHINE}-pc-msdosdjgpp
+       exit 0 ;;
+    i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*)
+       UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'`
+       if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then
+               echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL}
+       else
+               echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL}
+       fi
+       exit 0 ;;
+    i*86:*:5:[78]*)
+       case `/bin/uname -X | grep "^Machine"` in
+           *486*)           UNAME_MACHINE=i486 ;;
+           *Pentium)        UNAME_MACHINE=i586 ;;
+           *Pent*|*Celeron) UNAME_MACHINE=i686 ;;
+       esac
+       echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION}
+       exit 0 ;;
+    i*86:*:3.2:*)
+       if test -f /usr/options/cb.name; then
+               UNAME_REL=`sed -n 's/.*Version //p' </usr/options/cb.name`
+               echo ${UNAME_MACHINE}-pc-isc$UNAME_REL
+       elif /bin/uname -X 2>/dev/null >/dev/null ; then
+               UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')`
+               (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486
+               (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \
+                       && UNAME_MACHINE=i586
+               (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \
+                       && UNAME_MACHINE=i686
+               (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \
+                       && UNAME_MACHINE=i686
+               echo ${UNAME_MACHINE}-pc-sco$UNAME_REL
+       else
+               echo ${UNAME_MACHINE}-pc-sysv32
+       fi
+       exit 0 ;;
+    pc:*:*:*)
+       # Left here for compatibility:
+        # uname -m prints for DJGPP always 'pc', but it prints nothing about
+        # the processor, so we play safe by assuming i386.
+       echo i386-pc-msdosdjgpp
+        exit 0 ;;
+    Intel:Mach:3*:*)
+       echo i386-pc-mach3
+       exit 0 ;;
+    paragon:*:*:*)
+       echo i860-intel-osf1
+       exit 0 ;;
+    i860:*:4.*:*) # i860-SVR4
+       if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then
+         echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4
+       else # Add other i860-SVR4 vendors below as they are discovered.
+         echo i860-unknown-sysv${UNAME_RELEASE}  # Unknown i860-SVR4
+       fi
+       exit 0 ;;
+    mini*:CTIX:SYS*5:*)
+       # "miniframe"
+       echo m68010-convergent-sysv
+       exit 0 ;;
+    mc68k:UNIX:SYSTEM5:3.51m)
+       echo m68k-convergent-sysv
+       exit 0 ;;
+    M680?0:D-NIX:5.3:*)
+       echo m68k-diab-dnix
+       exit 0 ;;
+    M68*:*:R3V[567]*:*)
+       test -r /sysV68 && echo 'm68k-motorola-sysv' && exit 0 ;;
+    3[34]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0)
+       OS_REL=''
+       test -r /etc/.relid \
+       && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid`
+       /bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+         && echo i486-ncr-sysv4.3${OS_REL} && exit 0
+       /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \
+         && echo i586-ncr-sysv4.3${OS_REL} && exit 0 ;;
+    3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*)
+        /bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+          && echo i486-ncr-sysv4 && exit 0 ;;
+    m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*)
+       echo m68k-unknown-lynxos${UNAME_RELEASE}
+       exit 0 ;;
+    mc68030:UNIX_System_V:4.*:*)
+       echo m68k-atari-sysv4
+       exit 0 ;;
+    TSUNAMI:LynxOS:2.*:*)
+       echo sparc-unknown-lynxos${UNAME_RELEASE}
+       exit 0 ;;
+    rs6000:LynxOS:2.*:*)
+       echo rs6000-unknown-lynxos${UNAME_RELEASE}
+       exit 0 ;;
+    PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.0*:*)
+       echo powerpc-unknown-lynxos${UNAME_RELEASE}
+       exit 0 ;;
+    SM[BE]S:UNIX_SV:*:*)
+       echo mips-dde-sysv${UNAME_RELEASE}
+       exit 0 ;;
+    RM*:ReliantUNIX-*:*:*)
+       echo mips-sni-sysv4
+       exit 0 ;;
+    RM*:SINIX-*:*:*)
+       echo mips-sni-sysv4
+       exit 0 ;;
+    *:SINIX-*:*:*)
+       if uname -p 2>/dev/null >/dev/null ; then
+               UNAME_MACHINE=`(uname -p) 2>/dev/null`
+               echo ${UNAME_MACHINE}-sni-sysv4
+       else
+               echo ns32k-sni-sysv
+       fi
+       exit 0 ;;
+    PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort
+                      # says <Richard.M.Bartel@ccMail.Census.GOV>
+        echo i586-unisys-sysv4
+        exit 0 ;;
+    *:UNIX_System_V:4*:FTX*)
+       # From Gerald Hewes <hewes@openmarket.com>.
+       # How about differentiating between stratus architectures? -djm
+       echo hppa1.1-stratus-sysv4
+       exit 0 ;;
+    *:*:*:FTX*)
+       # From seanf@swdc.stratus.com.
+       echo i860-stratus-sysv4
+       exit 0 ;;
+    *:VOS:*:*)
+       # From Paul.Green@stratus.com.
+       echo hppa1.1-stratus-vos
+       exit 0 ;;
+    mc68*:A/UX:*:*)
+       echo m68k-apple-aux${UNAME_RELEASE}
+       exit 0 ;;
+    news*:NEWS-OS:6*:*)
+       echo mips-sony-newsos6
+       exit 0 ;;
+    R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*)
+       if [ -d /usr/nec ]; then
+               echo mips-nec-sysv${UNAME_RELEASE}
+       else
+               echo mips-unknown-sysv${UNAME_RELEASE}
+       fi
+        exit 0 ;;
+    BeBox:BeOS:*:*)    # BeOS running on hardware made by Be, PPC only.
+       echo powerpc-be-beos
+       exit 0 ;;
+    BeMac:BeOS:*:*)    # BeOS running on Mac or Mac clone, PPC only.
+       echo powerpc-apple-beos
+       exit 0 ;;
+    BePC:BeOS:*:*)     # BeOS running on Intel PC compatible.
+       echo i586-pc-beos
+       exit 0 ;;
+    SX-4:SUPER-UX:*:*)
+       echo sx4-nec-superux${UNAME_RELEASE}
+       exit 0 ;;
+    SX-5:SUPER-UX:*:*)
+       echo sx5-nec-superux${UNAME_RELEASE}
+       exit 0 ;;
+    SX-6:SUPER-UX:*:*)
+       echo sx6-nec-superux${UNAME_RELEASE}
+       exit 0 ;;
+    Power*:Rhapsody:*:*)
+       echo powerpc-apple-rhapsody${UNAME_RELEASE}
+       exit 0 ;;
+    *:Rhapsody:*:*)
+       echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE}
+       exit 0 ;;
+    *:Darwin:*:*)
+       echo `uname -p`-apple-darwin${UNAME_RELEASE}
+       exit 0 ;;
+    *:procnto*:*:* | *:QNX:[0123456789]*:*)
+       UNAME_PROCESSOR=`uname -p`
+       if test "$UNAME_PROCESSOR" = "x86"; then
+               UNAME_PROCESSOR=i386
+               UNAME_MACHINE=pc
+       fi
+       echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE}
+       exit 0 ;;
+    *:QNX:*:4*)
+       echo i386-pc-qnx
+       exit 0 ;;
+    NSR-[DGKLNPTVWXY]:NONSTOP_KERNEL:*:*)
+       echo nsr-tandem-nsk${UNAME_RELEASE}
+       exit 0 ;;
+    *:NonStop-UX:*:*)
+       echo mips-compaq-nonstopux
+       exit 0 ;;
+    BS2000:POSIX*:*:*)
+       echo bs2000-siemens-sysv
+       exit 0 ;;
+    DS/*:UNIX_System_V:*:*)
+       echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE}
+       exit 0 ;;
+    *:Plan9:*:*)
+       # "uname -m" is not consistent, so use $cputype instead. 386
+       # is converted to i386 for consistency with other x86
+       # operating systems.
+       if test "$cputype" = "386"; then
+           UNAME_MACHINE=i386
+       else
+           UNAME_MACHINE="$cputype"
+       fi
+       echo ${UNAME_MACHINE}-unknown-plan9
+       exit 0 ;;
+    *:TOPS-10:*:*)
+       echo pdp10-unknown-tops10
+       exit 0 ;;
+    *:TENEX:*:*)
+       echo pdp10-unknown-tenex
+       exit 0 ;;
+    KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*)
+       echo pdp10-dec-tops20
+       exit 0 ;;
+    XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*)
+       echo pdp10-xkl-tops20
+       exit 0 ;;
+    *:TOPS-20:*:*)
+       echo pdp10-unknown-tops20
+       exit 0 ;;
+    *:ITS:*:*)
+       echo pdp10-unknown-its
+       exit 0 ;;
+esac
+
+#echo '(No uname command or uname output not recognized.)' 1>&2
+#echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2
+
+eval $set_cc_for_build
+cat >$dummy.c <<EOF
+#ifdef _SEQUENT_
+# include <sys/types.h>
+# include <sys/utsname.h>
+#endif
+main ()
+{
+#if defined (sony)
+#if defined (MIPSEB)
+  /* BFD wants "bsd" instead of "newsos".  Perhaps BFD should be changed,
+     I don't know....  */
+  printf ("mips-sony-bsd\n"); exit (0);
+#else
+#include <sys/param.h>
+  printf ("m68k-sony-newsos%s\n",
+#ifdef NEWSOS4
+          "4"
+#else
+         ""
+#endif
+         ); exit (0);
+#endif
+#endif
+
+#if defined (__arm) && defined (__acorn) && defined (__unix)
+  printf ("arm-acorn-riscix"); exit (0);
+#endif
+
+#if defined (hp300) && !defined (hpux)
+  printf ("m68k-hp-bsd\n"); exit (0);
+#endif
+
+#if defined (NeXT)
+#if !defined (__ARCHITECTURE__)
+#define __ARCHITECTURE__ "m68k"
+#endif
+  int version;
+  version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`;
+  if (version < 4)
+    printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version);
+  else
+    printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version);
+  exit (0);
+#endif
+
+#if defined (MULTIMAX) || defined (n16)
+#if defined (UMAXV)
+  printf ("ns32k-encore-sysv\n"); exit (0);
+#else
+#if defined (CMU)
+  printf ("ns32k-encore-mach\n"); exit (0);
+#else
+  printf ("ns32k-encore-bsd\n"); exit (0);
+#endif
+#endif
+#endif
+
+#if defined (__386BSD__)
+  printf ("i386-pc-bsd\n"); exit (0);
+#endif
+
+#if defined (sequent)
+#if defined (i386)
+  printf ("i386-sequent-dynix\n"); exit (0);
+#endif
+#if defined (ns32000)
+  printf ("ns32k-sequent-dynix\n"); exit (0);
+#endif
+#endif
+
+#if defined (_SEQUENT_)
+    struct utsname un;
+
+    uname(&un);
+
+    if (strncmp(un.version, "V2", 2) == 0) {
+       printf ("i386-sequent-ptx2\n"); exit (0);
+    }
+    if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */
+       printf ("i386-sequent-ptx1\n"); exit (0);
+    }
+    printf ("i386-sequent-ptx\n"); exit (0);
+
+#endif
+
+#if defined (vax)
+# if !defined (ultrix)
+#  include <sys/param.h>
+#  if defined (BSD)
+#   if BSD == 43
+      printf ("vax-dec-bsd4.3\n"); exit (0);
+#   else
+#    if BSD == 199006
+      printf ("vax-dec-bsd4.3reno\n"); exit (0);
+#    else
+      printf ("vax-dec-bsd\n"); exit (0);
+#    endif
+#   endif
+#  else
+    printf ("vax-dec-bsd\n"); exit (0);
+#  endif
+# else
+    printf ("vax-dec-ultrix\n"); exit (0);
+# endif
+#endif
+
+#if defined (alliant) && defined (i860)
+  printf ("i860-alliant-bsd\n"); exit (0);
+#endif
+
+  exit (1);
+}
+EOF
+
+$CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && $dummy && rm -f $dummy.c $dummy && rmdir $tmpdir && exit 0
+rm -f $dummy.c $dummy && rmdir $tmpdir
+
+# Apollos put the system type in the environment.
+
+test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit 0; }
+
+# Convex versions that predate uname can use getsysinfo(1)
+
+if [ -x /usr/convex/getsysinfo ]
+then
+    case `getsysinfo -f cpu_type` in
+    c1*)
+       echo c1-convex-bsd
+       exit 0 ;;
+    c2*)
+       if getsysinfo -f scalar_acc
+       then echo c32-convex-bsd
+       else echo c2-convex-bsd
+       fi
+       exit 0 ;;
+    c34*)
+       echo c34-convex-bsd
+       exit 0 ;;
+    c38*)
+       echo c38-convex-bsd
+       exit 0 ;;
+    c4*)
+       echo c4-convex-bsd
+       exit 0 ;;
+    esac
+fi
+
+cat >&2 <<EOF
+$0: unable to guess system type
+
+This script, last modified $timestamp, has failed to recognize
+the operating system you are using. It is advised that you
+download the most up to date version of the config scripts from
+
+    ftp://ftp.gnu.org/pub/gnu/config/
+
+If the version you run ($0) is already up to date, please
+send the following data and any information you think might be
+pertinent to <config-patches@gnu.org> in order to provide the needed
+information to handle your system.
+
+config.guess timestamp = $timestamp
+
+uname -m = `(uname -m) 2>/dev/null || echo unknown`
+uname -r = `(uname -r) 2>/dev/null || echo unknown`
+uname -s = `(uname -s) 2>/dev/null || echo unknown`
+uname -v = `(uname -v) 2>/dev/null || echo unknown`
+
+/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null`
+/bin/uname -X     = `(/bin/uname -X) 2>/dev/null`
+
+hostinfo               = `(hostinfo) 2>/dev/null`
+/bin/universe          = `(/bin/universe) 2>/dev/null`
+/usr/bin/arch -k       = `(/usr/bin/arch -k) 2>/dev/null`
+/bin/arch              = `(/bin/arch) 2>/dev/null`
+/usr/bin/oslevel       = `(/usr/bin/oslevel) 2>/dev/null`
+/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null`
+
+UNAME_MACHINE = ${UNAME_MACHINE}
+UNAME_RELEASE = ${UNAME_RELEASE}
+UNAME_SYSTEM  = ${UNAME_SYSTEM}
+UNAME_VERSION = ${UNAME_VERSION}
+EOF
+
+exit 1
+
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "timestamp='"
+# time-stamp-format: "%:y-%02m-%02d"
+# time-stamp-end: "'"
+# End:
diff --git a/support/config.rpath b/support/config.rpath
new file mode 100755 (executable)
index 0000000..fa24bfc
--- /dev/null
@@ -0,0 +1,548 @@
+#! /bin/sh
+# Output a system dependent set of variables, describing how to set the
+# run time search path of shared libraries in an executable.
+#
+#   Copyright 1996-2003 Free Software Foundation, Inc.
+#   Taken from GNU libtool, 2001
+#   Originally by Gordon Matzigkeit <gord@gnu.ai.mit.edu>, 1996
+#
+#   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.
+#
+#   As a special exception to the GNU General Public License, if you
+#   distribute this file as part of a program that contains a
+#   configuration script generated by Autoconf, you may include it under
+#   the same distribution terms that you use for the rest of that program.
+#
+# The first argument passed to this file is the canonical host specification,
+#    CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM
+# or
+#    CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM
+# The environment variables CC, GCC, LDFLAGS, LD, with_gnu_ld
+# should be set by the caller.
+#
+# The set of defined variables is at the end of this script.
+
+# Known limitations:
+# - On IRIX 6.5 with CC="cc", the run time search patch must not be longer
+#   than 256 bytes, otherwise the compiler driver will dump core. The only
+#   known workaround is to choose shorter directory names for the build
+#   directory and/or the installation directory.
+
+# All known linkers require a `.a' archive for static linking (except M$VC,
+# which needs '.lib').
+libext=a
+shrext=.so
+
+host="$1"
+host_cpu=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'`
+host_vendor=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'`
+host_os=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
+
+# Code taken from libtool.m4's AC_LIBTOOL_PROG_COMPILER_PIC.
+
+wl=
+if test "$GCC" = yes; then
+  wl='-Wl,'
+else
+  case "$host_os" in
+    aix*)
+      wl='-Wl,'
+      ;;
+    mingw* | pw32* | os2*)
+      ;;
+    hpux9* | hpux10* | hpux11*)
+      wl='-Wl,'
+      ;;
+    irix5* | irix6* | nonstopux*)
+      wl='-Wl,'
+      ;;
+    newsos6)
+      ;;
+    linux*)
+      case $CC in
+        icc|ecc)
+          wl='-Wl,'
+          ;;
+        ccc)
+          wl='-Wl,'
+          ;;
+      esac
+      ;;
+    osf3* | osf4* | osf5*)
+      wl='-Wl,'
+      ;;
+    sco3.2v5*)
+      ;;
+    solaris*)
+      wl='-Wl,'
+      ;;
+    sunos4*)
+      wl='-Qoption ld '
+      ;;
+    sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*)
+      wl='-Wl,'
+      ;;
+    sysv4*MP*)
+      ;;
+    uts4*)
+      ;;
+  esac
+fi
+
+# Code taken from libtool.m4's AC_LIBTOOL_PROG_LD_SHLIBS.
+
+hardcode_libdir_flag_spec=
+hardcode_libdir_separator=
+hardcode_direct=no
+hardcode_minus_L=no
+
+case "$host_os" in
+  cygwin* | mingw* | pw32*)
+    # FIXME: the MSVC++ port hasn't been tested in a loooong time
+    # When not using gcc, we currently assume that we are using
+    # Microsoft Visual C++.
+    if test "$GCC" != yes; then
+      with_gnu_ld=no
+    fi
+    ;;
+  openbsd*)
+    with_gnu_ld=no
+    ;;
+esac
+
+ld_shlibs=yes
+if test "$with_gnu_ld" = yes; then
+  case "$host_os" in
+    aix3* | aix4* | aix5*)
+      # On AIX/PPC, the GNU linker is very broken
+      if test "$host_cpu" != ia64; then
+        ld_shlibs=no
+      fi
+      ;;
+    amigaos*)
+      hardcode_libdir_flag_spec='-L$libdir'
+      hardcode_minus_L=yes
+      # Samuel A. Falvo II <kc5tja@dolphin.openprojects.net> reports
+      # that the semantics of dynamic libraries on AmigaOS, at least up
+      # to version 4, is to share data among multiple programs linked
+      # with the same dynamic library.  Since this doesn't match the
+      # behavior of shared libraries on other platforms, we can use
+      # them.
+      ld_shlibs=no
+      ;;
+    beos*)
+      if $LD --help 2>&1 | egrep ': supported targets:.* elf' > /dev/null; then
+        :
+      else
+        ld_shlibs=no
+      fi
+      ;;
+    cygwin* | mingw* | pw32*)
+      # hardcode_libdir_flag_spec is actually meaningless, as there is
+      # no search path for DLLs.
+      hardcode_libdir_flag_spec='-L$libdir'
+      if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then
+        :
+      else
+        ld_shlibs=no
+      fi
+      ;;
+    netbsd*)
+      ;;
+    solaris* | sysv5*)
+      if $LD -v 2>&1 | egrep 'BFD 2\.8' > /dev/null; then
+        ld_shlibs=no
+      elif $LD --help 2>&1 | egrep ': supported targets:.* elf' > /dev/null; then
+        :
+      else
+        ld_shlibs=no
+      fi
+      ;;
+    sunos4*)
+      hardcode_direct=yes
+      ;;
+    *)
+      if $LD --help 2>&1 | egrep ': supported targets:.* elf' > /dev/null; then
+        :
+      else
+        ld_shlibs=no
+      fi
+      ;;
+  esac
+  if test "$ld_shlibs" = yes; then
+    # Unlike libtool, we use -rpath here, not --rpath, since the documented
+    # option of GNU ld is called -rpath, not --rpath.
+    hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+  fi
+else
+  case "$host_os" in
+    aix3*)
+      # Note: this linker hardcodes the directories in LIBPATH if there
+      # are no directories specified by -L.
+      hardcode_minus_L=yes
+      if test "$GCC" = yes; then
+        # Neither direct hardcoding nor static linking is supported with a
+        # broken collect2.
+        hardcode_direct=unsupported
+      fi
+      ;;
+    aix4* | aix5*)
+      if test "$host_cpu" = ia64; then
+        # On IA64, the linker does run time linking by default, so we don't
+        # have to do anything special.
+        aix_use_runtimelinking=no
+      else
+        aix_use_runtimelinking=no
+        # Test if we are trying to use run time linking or normal
+        # AIX style linking. If -brtl is somewhere in LDFLAGS, we
+        # need to do runtime linking.
+        case $host_os in aix4.[23]|aix4.[23].*|aix5*)
+          for ld_flag in $LDFLAGS; do
+            if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then
+              aix_use_runtimelinking=yes
+              break
+            fi
+          done
+        esac
+      fi
+      hardcode_direct=yes
+      hardcode_libdir_separator=':'
+      if test "$GCC" = yes; then
+        case $host_os in aix4.[012]|aix4.[012].*)
+          collect2name=`${CC} -print-prog-name=collect2`
+          if test -f "$collect2name" && \
+            strings "$collect2name" | grep resolve_lib_name >/dev/null
+          then
+            # We have reworked collect2
+            hardcode_direct=yes
+          else
+            # We have old collect2
+            hardcode_direct=unsupported
+            hardcode_minus_L=yes
+            hardcode_libdir_flag_spec='-L$libdir'
+            hardcode_libdir_separator=
+          fi
+        esac
+      fi
+      # Begin _LT_AC_SYS_LIBPATH_AIX.
+      echo 'int main () { return 0; }' > conftest.c
+      ${CC} ${LDFLAGS} conftest.c -o conftest
+      aix_libpath=`dump -H conftest 2>/dev/null | sed -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0  *\(.*\)$/\1/; p; }
+}'`
+      if test -z "$aix_libpath"; then
+        aix_libpath=`dump -HX64 conftest 2>/dev/null | sed -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0  *\(.*\)$/\1/; p; }
+}'`
+      fi
+      if test -z "$aix_libpath"; then
+        aix_libpath="/usr/lib:/lib"
+      fi
+      rm -f conftest.c conftest
+      # End _LT_AC_SYS_LIBPATH_AIX.
+      if test "$aix_use_runtimelinking" = yes; then
+        hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath"
+      else
+        if test "$host_cpu" = ia64; then
+          hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib'
+        else
+          hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath"
+        fi
+      fi
+      ;;
+    amigaos*)
+      hardcode_libdir_flag_spec='-L$libdir'
+      hardcode_minus_L=yes
+      # see comment about different semantics on the GNU ld section
+      ld_shlibs=no
+      ;;
+    bsdi4*)
+      ;;
+    cygwin* | mingw* | pw32*)
+      # When not using gcc, we currently assume that we are using
+      # Microsoft Visual C++.
+      # hardcode_libdir_flag_spec is actually meaningless, as there is
+      # no search path for DLLs.
+      hardcode_libdir_flag_spec=' '
+      libext=lib
+      ;;
+    darwin* | rhapsody*)
+      if $CC -v 2>&1 | grep 'Apple' >/dev/null ; then
+        hardcode_direct=no
+      fi
+      ;;
+    dgux*)
+      hardcode_libdir_flag_spec='-L$libdir'
+      ;;
+    freebsd1*)
+      ld_shlibs=no
+      ;;
+    freebsd2.2*)
+      hardcode_libdir_flag_spec='-R$libdir'
+      hardcode_direct=yes
+      ;;
+    freebsd2*)
+      hardcode_direct=yes
+      hardcode_minus_L=yes
+      ;;
+    freebsd*)
+      hardcode_libdir_flag_spec='-R$libdir'
+      hardcode_direct=yes
+      ;;
+    hpux9*)
+      hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
+      hardcode_libdir_separator=:
+      hardcode_direct=yes
+      # hardcode_minus_L: Not really in the search PATH,
+      # but as the default location of the library.
+      hardcode_minus_L=yes
+      ;;
+    hpux10* | hpux11*)
+      if test "$with_gnu_ld" = no; then
+        case "$host_cpu" in
+          hppa*64*)
+            hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
+            hardcode_libdir_separator=:
+            hardcode_direct=no
+            ;;
+          ia64*)
+            hardcode_libdir_flag_spec='-L$libdir'
+            hardcode_direct=no
+            # hardcode_minus_L: Not really in the search PATH,
+            # but as the default location of the library.
+            hardcode_minus_L=yes
+            ;;
+          *)
+            hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
+            hardcode_libdir_separator=:
+            hardcode_direct=yes
+            # hardcode_minus_L: Not really in the search PATH,
+            # but as the default location of the library.
+            hardcode_minus_L=yes
+            ;;
+        esac
+      fi
+      ;;
+    irix5* | irix6* | nonstopux*)
+      hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+      hardcode_libdir_separator=:
+      ;;
+    netbsd*)
+      hardcode_libdir_flag_spec='-R$libdir'
+      hardcode_direct=yes
+      ;;
+    newsos6)
+      hardcode_direct=yes
+      hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+      hardcode_libdir_separator=:
+      ;;
+    openbsd*)
+      hardcode_direct=yes
+      if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+        hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
+      else
+        case "$host_os" in
+          openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*)
+            hardcode_libdir_flag_spec='-R$libdir'
+            ;;
+          *)
+            hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
+            ;;
+        esac
+      fi
+      ;;
+    os2*)
+      hardcode_libdir_flag_spec='-L$libdir'
+      hardcode_minus_L=yes
+      ;;
+    osf3*)
+      hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+      hardcode_libdir_separator=:
+      ;;
+    osf4* | osf5*)
+      if test "$GCC" = yes; then
+        hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+      else
+        # Both cc and cxx compiler support -rpath directly
+        hardcode_libdir_flag_spec='-rpath $libdir'
+      fi
+      hardcode_libdir_separator=:
+      ;;
+    sco3.2v5*)
+      ;;
+    solaris*)
+      hardcode_libdir_flag_spec='-R$libdir'
+      ;;
+    sunos4*)
+      hardcode_libdir_flag_spec='-L$libdir'
+      hardcode_direct=yes
+      hardcode_minus_L=yes
+      ;;
+    sysv4)
+      case $host_vendor in
+        sni)
+          hardcode_direct=yes # is this really true???
+          ;;
+        siemens)
+          hardcode_direct=no
+          ;;
+        motorola)
+          hardcode_direct=no #Motorola manual says yes, but my tests say they lie
+          ;;
+      esac
+      ;;
+    sysv4.3*)
+      ;;
+    sysv4*MP*)
+      if test -d /usr/nec; then
+        ld_shlibs=yes
+      fi
+      ;;
+    sysv4.2uw2*)
+      hardcode_direct=yes
+      hardcode_minus_L=no
+      ;;
+    sysv5OpenUNIX8* | sysv5UnixWare7* |  sysv5uw[78]* | unixware7*)
+      ;;
+    sysv5*)
+      hardcode_libdir_flag_spec=
+      ;;
+    uts4*)
+      hardcode_libdir_flag_spec='-L$libdir'
+      ;;
+    *)
+      ld_shlibs=no
+      ;;
+  esac
+fi
+
+# Check dynamic linker characteristics
+# Code taken from libtool.m4's AC_LIBTOOL_SYS_DYNAMIC_LINKER.
+libname_spec='lib$name'
+case "$host_os" in
+  aix3*)
+    ;;
+  aix4* | aix5*)
+    ;;
+  amigaos*)
+    ;;
+  beos*)
+    ;;
+  bsdi4*)
+    ;;
+  cygwin* | mingw* | pw32*)
+    shrext=.dll
+    ;;
+  darwin* | rhapsody*)
+    shrext=.dylib
+    ;;
+  dgux*)
+    ;;
+  freebsd1*)
+    ;;
+  freebsd*)
+    ;;
+  gnu*)
+    ;;
+  hpux9* | hpux10* | hpux11*)
+    case "$host_cpu" in
+      ia64*)
+        shrext=.so
+        ;;
+      hppa*64*)
+        shrext=.sl
+        ;;
+      *)
+        shrext=.sl
+        ;;
+    esac
+    ;;
+  irix5* | irix6* | nonstopux*)
+    case "$host_os" in
+      irix5* | nonstopux*)
+        libsuff= shlibsuff=
+        ;;
+      *)
+        case $LD in
+          *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= ;;
+          *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 ;;
+          *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 ;;
+          *) libsuff= shlibsuff= ;;
+        esac
+        ;;
+    esac
+    ;;
+  linux*oldld* | linux*aout* | linux*coff*)
+    ;;
+  linux*)
+    ;;
+  netbsd*)
+    ;;
+  newsos6)
+    ;;
+  nto-qnx)
+    ;;
+  openbsd*)
+    ;;
+  os2*)
+    libname_spec='$name'
+    shrext=.dll
+    ;;
+  osf3* | osf4* | osf5*)
+    ;;
+  sco3.2v5*)
+    ;;
+  solaris*)
+    ;;
+  sunos4*)
+    ;;
+  sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*)
+    ;;
+  sysv4*MP*)
+    ;;
+  uts4*)
+    ;;
+esac
+
+sed_quote_subst='s/\(["`$\\]\)/\\\1/g'
+escaped_wl=`echo "X$wl" | sed -e 's/^X//' -e "$sed_quote_subst"`
+shlibext=`echo "$shrext" | sed -e 's,^\.,,'`
+escaped_hardcode_libdir_flag_spec=`echo "X$hardcode_libdir_flag_spec" | sed -e 's/^X//' -e "$sed_quote_subst"`
+
+sed -e 's/^\([a-zA-Z0-9_]*\)=/acl_cv_\1=/' <<EOF
+
+# How to pass a linker flag through the compiler.
+wl="$escaped_wl"
+
+# Static library suffix (normally "a").
+libext="$libext"
+
+# Shared library suffix (normally "so").
+shlibext="$shlibext"
+
+# Flag to hardcode \$libdir into a binary during linking.
+# This must work even if \$libdir does not exist.
+hardcode_libdir_flag_spec="$escaped_hardcode_libdir_flag_spec"
+
+# Whether we need a single -rpath flag with a separated argument.
+hardcode_libdir_separator="$hardcode_libdir_separator"
+
+# Set to yes if using DIR/libNAME.so during linking hardcodes DIR into the
+# resulting binary.
+hardcode_direct="$hardcode_direct"
+
+# Set to yes if using the -LDIR flag during linking hardcodes DIR into the
+# resulting binary.
+hardcode_minus_L="$hardcode_minus_L"
+
+EOF
diff --git a/support/config.sub b/support/config.sub
new file mode 100755 (executable)
index 0000000..aefb7e1
--- /dev/null
@@ -0,0 +1,1470 @@
+#! /bin/sh
+# Configuration validation subroutine script.
+#   Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
+#   2000, 2001, 2002 Free Software Foundation, Inc.
+
+timestamp='2002-11-30'
+
+# This file is (in principle) common to ALL GNU software.
+# The presence of a machine in this file suggests that SOME GNU software
+# can handle that machine.  It does not imply ALL GNU software can.
+#
+# This file is free software; you can redistribute it and/or modify
+# 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.
+
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+# Please send patches to <config-patches@gnu.org>.  Submit a context
+# diff and a properly formatted ChangeLog entry.
+#
+# Configuration subroutine to validate and canonicalize a configuration type.
+# Supply the specified configuration type as an argument.
+# If it is invalid, we print an error message on stderr and exit with code 1.
+# Otherwise, we print the canonical config type on stdout and succeed.
+
+# This file is supposed to be the same for all GNU packages
+# and recognize all the CPU types, system types and aliases
+# that are meaningful with *any* GNU software.
+# Each package is responsible for reporting which valid configurations
+# it does not support.  The user should be able to distinguish
+# a failure to support a valid configuration from a meaningless
+# configuration.
+
+# The goal of this file is to map all the various variations of a given
+# machine specification into a single specification in the form:
+#      CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM
+# or in some cases, the newer four-part form:
+#      CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM
+# It is wrong to echo any other type of specification.
+
+me=`echo "$0" | sed -e 's,.*/,,'`
+
+usage="\
+Usage: $0 [OPTION] CPU-MFR-OPSYS
+       $0 [OPTION] ALIAS
+
+Canonicalize a configuration name.
+
+Operation modes:
+  -h, --help         print this help, then exit
+  -t, --time-stamp   print date of last modification, then exit
+  -v, --version      print version number, then exit
+
+Report bugs and patches to <config-patches@gnu.org>."
+
+version="\
+GNU config.sub ($timestamp)
+
+Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001
+Free Software Foundation, Inc.
+
+This is free software; see the source for copying conditions.  There is NO
+warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
+
+help="
+Try \`$me --help' for more information."
+
+# Parse command line
+while test $# -gt 0 ; do
+  case $1 in
+    --time-stamp | --time* | -t )
+       echo "$timestamp" ; exit 0 ;;
+    --version | -v )
+       echo "$version" ; exit 0 ;;
+    --help | --h* | -h )
+       echo "$usage"; exit 0 ;;
+    -- )     # Stop option processing
+       shift; break ;;
+    - )        # Use stdin as input.
+       break ;;
+    -* )
+       echo "$me: invalid option $1$help"
+       exit 1 ;;
+
+    *local*)
+       # First pass through any local machine types.
+       echo $1
+       exit 0;;
+
+    * )
+       break ;;
+  esac
+done
+
+case $# in
+ 0) echo "$me: missing argument$help" >&2
+    exit 1;;
+ 1) ;;
+ *) echo "$me: too many arguments$help" >&2
+    exit 1;;
+esac
+
+# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any).
+# Here we must recognize all the valid KERNEL-OS combinations.
+maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'`
+case $maybe_os in
+  nto-qnx* | linux-gnu* | freebsd*-gnu* | netbsd*-gnu* | storm-chaos* | os2-emx* | rtmk-nova*)
+    os=-$maybe_os
+    basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`
+    ;;
+  *)
+    basic_machine=`echo $1 | sed 's/-[^-]*$//'`
+    if [ $basic_machine != $1 ]
+    then os=`echo $1 | sed 's/.*-/-/'`
+    else os=; fi
+    ;;
+esac
+
+### Let's recognize common machines as not being operating systems so
+### that things like config.sub decstation-3100 work.  We also
+### recognize some manufacturers as not being operating systems, so we
+### can provide default operating systems below.
+case $os in
+       -sun*os*)
+               # Prevent following clause from handling this invalid input.
+               ;;
+       -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \
+       -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \
+       -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \
+       -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\
+       -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \
+       -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \
+       -apple | -axis)
+               os=
+               basic_machine=$1
+               ;;
+       -sim | -cisco | -oki | -wec | -winbond)
+               os=
+               basic_machine=$1
+               ;;
+       -scout)
+               ;;
+       -wrs)
+               os=-vxworks
+               basic_machine=$1
+               ;;
+       -chorusos*)
+               os=-chorusos
+               basic_machine=$1
+               ;;
+       -chorusrdb)
+               os=-chorusrdb
+               basic_machine=$1
+               ;;
+       -hiux*)
+               os=-hiuxwe2
+               ;;
+       -sco5)
+               os=-sco3.2v5
+               basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+               ;;
+       -sco4)
+               os=-sco3.2v4
+               basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+               ;;
+       -sco3.2.[4-9]*)
+               os=`echo $os | sed -e 's/sco3.2./sco3.2v/'`
+               basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+               ;;
+       -sco3.2v[4-9]*)
+               # Don't forget version if it is 3.2v4 or newer.
+               basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+               ;;
+       -sco*)
+               os=-sco3.2v2
+               basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+               ;;
+       -udk*)
+               basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+               ;;
+       -isc)
+               os=-isc2.2
+               basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+               ;;
+       -clix*)
+               basic_machine=clipper-intergraph
+               ;;
+       -isc*)
+               basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+               ;;
+       -lynx*)
+               os=-lynxos
+               ;;
+       -ptx*)
+               basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'`
+               ;;
+       -windowsnt*)
+               os=`echo $os | sed -e 's/windowsnt/winnt/'`
+               ;;
+       -psos*)
+               os=-psos
+               ;;
+       -mint | -mint[0-9]*)
+               basic_machine=m68k-atari
+               os=-mint
+               ;;
+esac
+
+# Decode aliases for certain CPU-COMPANY combinations.
+case $basic_machine in
+       # Recognize the basic CPU types without company name.
+       # Some are omitted here because they have special meanings below.
+       1750a | 580 \
+       | a29k \
+       | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \
+       | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \
+       | arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr \
+       | clipper \
+       | d10v | d30v | dlx | dsp16xx \
+       | fr30 | frv \
+       | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \
+       | i370 | i860 | i960 | ia64 \
+       | ip2k \
+       | m32r | m68000 | m68k | m88k | mcore \
+       | mips | mipsbe | mipseb | mipsel | mipsle \
+       | mips16 \
+       | mips64 | mips64el \
+       | mips64vr | mips64vrel \
+       | mips64orion | mips64orionel \
+       | mips64vr4100 | mips64vr4100el \
+       | mips64vr4300 | mips64vr4300el \
+       | mips64vr5000 | mips64vr5000el \
+       | mipsisa32 | mipsisa32el \
+       | mipsisa64 | mipsisa64el \
+       | mipsisa64sb1 | mipsisa64sb1el \
+       | mipsisa64sr71k | mipsisa64sr71kel \
+       | mipstx39 | mipstx39el \
+       | mn10200 | mn10300 \
+       | ns16k | ns32k \
+       | openrisc | or32 \
+       | pdp10 | pdp11 | pj | pjl \
+       | powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \
+       | pyramid \
+       | sh | sh[1234] | sh3e | sh[34]eb | shbe | shle | sh[1234]le | sh3ele \
+       | sh64 | sh64le \
+       | sparc | sparc64 | sparc86x | sparclet | sparclite | sparcv9 | sparcv9b \
+       | strongarm \
+       | tahoe | thumb | tic80 | tron \
+       | v850 | v850e \
+       | we32k \
+       | x86 | xscale | xstormy16 | xtensa \
+       | z8k)
+               basic_machine=$basic_machine-unknown
+               ;;
+       m6811 | m68hc11 | m6812 | m68hc12)
+               # Motorola 68HC11/12.
+               basic_machine=$basic_machine-unknown
+               os=-none
+               ;;
+       m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k)
+               ;;
+
+       # We use `pc' rather than `unknown'
+       # because (1) that's what they normally are, and
+       # (2) the word "unknown" tends to confuse beginning users.
+       i*86 | x86_64 | amd64)
+         basic_machine=$basic_machine-pc
+         ;;
+       # Object if more than one company name word.
+       *-*-*)
+               echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
+               exit 1
+               ;;
+       # Recognize the basic CPU types with company name.
+       580-* \
+       | a29k-* \
+       | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \
+       | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \
+       | alphapca5[67]-* | alpha64pca5[67]-* | arc-* \
+       | amd64-* \
+       | arm-*  | armbe-* | armle-* | armeb-* | armv*-* \
+       | avr-* \
+       | bs2000-* \
+       | c[123]* | c30-* | [cjt]90-* | c4x-* | c54x-* \
+       | clipper-* | cydra-* \
+       | d10v-* | d30v-* | dlx-* \
+       | elxsi-* \
+       | f30[01]-* | f700-* | fr30-* | frv-* | fx80-* \
+       | h8300-* | h8500-* \
+       | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \
+       | i*86-* | i860-* | i960-* | ia64-* \
+       | ip2k-* \
+       | m32r-* \
+       | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \
+       | m88110-* | m88k-* | mcore-* \
+       | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \
+       | mips16-* \
+       | mips64-* | mips64el-* \
+       | mips64vr-* | mips64vrel-* \
+       | mips64orion-* | mips64orionel-* \
+       | mips64vr4100-* | mips64vr4100el-* \
+       | mips64vr4300-* | mips64vr4300el-* \
+       | mips64vr5000-* | mips64vr5000el-* \
+       | mipsisa32-* | mipsisa32el-* \
+       | mipsisa64-* | mipsisa64el-* \
+       | mipsisa64sb1-* | mipsisa64sb1el-* \
+       | mipsisa64sr71k-* | mipsisa64sr71kel-* \
+       | mipstx39 | mipstx39el \
+       | none-* | np1-* | ns16k-* | ns32k-* \
+       | orion-* \
+       | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \
+       | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \
+       | pyramid-* \
+       | romp-* | rs6000-* \
+       | sh-* | sh[1234]-* | sh3e-* | sh[34]eb-* | shbe-* \
+       | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \
+       | sparc-* | sparc64-* | sparc86x-* | sparclet-* | sparclite-* \
+       | sparcv9-* | sparcv9b-* | strongarm-* | sv1-* | sx?-* \
+       | tahoe-* | thumb-* | tic30-* | tic4x-* | tic54x-* | tic80-* | tron-* \
+       | v850-* | v850e-* | vax-* \
+       | we32k-* \
+       | x86-* | x86_64-* | xps100-* | xscale-* | xstormy16-* \
+       | xtensa-* \
+       | ymp-* \
+       | z8k-*)
+               ;;
+       # Recognize the various machine names and aliases which stand
+       # for a CPU type and a company and sometimes even an OS.
+       386bsd)
+               basic_machine=i386-unknown
+               os=-bsd
+               ;;
+       3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc)
+               basic_machine=m68000-att
+               ;;
+       3b*)
+               basic_machine=we32k-att
+               ;;
+       a29khif)
+               basic_machine=a29k-amd
+               os=-udi
+               ;;
+       adobe68k)
+               basic_machine=m68010-adobe
+               os=-scout
+               ;;
+       alliant | fx80)
+               basic_machine=fx80-alliant
+               ;;
+       altos | altos3068)
+               basic_machine=m68k-altos
+               ;;
+       am29k)
+               basic_machine=a29k-none
+               os=-bsd
+               ;;
+       amdahl)
+               basic_machine=580-amdahl
+               os=-sysv
+               ;;
+       amiga | amiga-*)
+               basic_machine=m68k-unknown
+               ;;
+       amigaos | amigados)
+               basic_machine=m68k-unknown
+               os=-amigaos
+               ;;
+       amigaunix | amix)
+               basic_machine=m68k-unknown
+               os=-sysv4
+               ;;
+       apollo68)
+               basic_machine=m68k-apollo
+               os=-sysv
+               ;;
+       apollo68bsd)
+               basic_machine=m68k-apollo
+               os=-bsd
+               ;;
+       aux)
+               basic_machine=m68k-apple
+               os=-aux
+               ;;
+       balance)
+               basic_machine=ns32k-sequent
+               os=-dynix
+               ;;
+       c90)
+               basic_machine=c90-cray
+               os=-unicos
+               ;;
+       convex-c1)
+               basic_machine=c1-convex
+               os=-bsd
+               ;;
+       convex-c2)
+               basic_machine=c2-convex
+               os=-bsd
+               ;;
+       convex-c32)
+               basic_machine=c32-convex
+               os=-bsd
+               ;;
+       convex-c34)
+               basic_machine=c34-convex
+               os=-bsd
+               ;;
+       convex-c38)
+               basic_machine=c38-convex
+               os=-bsd
+               ;;
+       cray | j90)
+               basic_machine=j90-cray
+               os=-unicos
+               ;;
+       crds | unos)
+               basic_machine=m68k-crds
+               ;;
+       cris | cris-* | etrax*)
+               basic_machine=cris-axis
+               ;;
+       da30 | da30-*)
+               basic_machine=m68k-da30
+               ;;
+       decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn)
+               basic_machine=mips-dec
+               ;;
+       decsystem10* | dec10*)
+               basic_machine=pdp10-dec
+               os=-tops10
+               ;;
+       decsystem20* | dec20*)
+               basic_machine=pdp10-dec
+               os=-tops20
+               ;;
+       delta | 3300 | motorola-3300 | motorola-delta \
+             | 3300-motorola | delta-motorola)
+               basic_machine=m68k-motorola
+               ;;
+       delta88)
+               basic_machine=m88k-motorola
+               os=-sysv3
+               ;;
+       dpx20 | dpx20-*)
+               basic_machine=rs6000-bull
+               os=-bosx
+               ;;
+       dpx2* | dpx2*-bull)
+               basic_machine=m68k-bull
+               os=-sysv3
+               ;;
+       ebmon29k)
+               basic_machine=a29k-amd
+               os=-ebmon
+               ;;
+       elxsi)
+               basic_machine=elxsi-elxsi
+               os=-bsd
+               ;;
+       encore | umax | mmax)
+               basic_machine=ns32k-encore
+               ;;
+       es1800 | OSE68k | ose68k | ose | OSE)
+               basic_machine=m68k-ericsson
+               os=-ose
+               ;;
+       fx2800)
+               basic_machine=i860-alliant
+               ;;
+       genix)
+               basic_machine=ns32k-ns
+               ;;
+       gmicro)
+               basic_machine=tron-gmicro
+               os=-sysv
+               ;;
+       go32)
+               basic_machine=i386-pc
+               os=-go32
+               ;;
+       h3050r* | hiux*)
+               basic_machine=hppa1.1-hitachi
+               os=-hiuxwe2
+               ;;
+       h8300hms)
+               basic_machine=h8300-hitachi
+               os=-hms
+               ;;
+       h8300xray)
+               basic_machine=h8300-hitachi
+               os=-xray
+               ;;
+       h8500hms)
+               basic_machine=h8500-hitachi
+               os=-hms
+               ;;
+       harris)
+               basic_machine=m88k-harris
+               os=-sysv3
+               ;;
+       hp300-*)
+               basic_machine=m68k-hp
+               ;;
+       hp300bsd)
+               basic_machine=m68k-hp
+               os=-bsd
+               ;;
+       hp300hpux)
+               basic_machine=m68k-hp
+               os=-hpux
+               ;;
+       hp3k9[0-9][0-9] | hp9[0-9][0-9])
+               basic_machine=hppa1.0-hp
+               ;;
+       hp9k2[0-9][0-9] | hp9k31[0-9])
+               basic_machine=m68000-hp
+               ;;
+       hp9k3[2-9][0-9])
+               basic_machine=m68k-hp
+               ;;
+       hp9k6[0-9][0-9] | hp6[0-9][0-9])
+               basic_machine=hppa1.0-hp
+               ;;
+       hp9k7[0-79][0-9] | hp7[0-79][0-9])
+               basic_machine=hppa1.1-hp
+               ;;
+       hp9k78[0-9] | hp78[0-9])
+               # FIXME: really hppa2.0-hp
+               basic_machine=hppa1.1-hp
+               ;;
+       hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893)
+               # FIXME: really hppa2.0-hp
+               basic_machine=hppa1.1-hp
+               ;;
+       hp9k8[0-9][13679] | hp8[0-9][13679])
+               basic_machine=hppa1.1-hp
+               ;;
+       hp9k8[0-9][0-9] | hp8[0-9][0-9])
+               basic_machine=hppa1.0-hp
+               ;;
+       hppa-next)
+               os=-nextstep3
+               ;;
+       hppaosf)
+               basic_machine=hppa1.1-hp
+               os=-osf
+               ;;
+       hppro)
+               basic_machine=hppa1.1-hp
+               os=-proelf
+               ;;
+       i370-ibm* | ibm*)
+               basic_machine=i370-ibm
+               ;;
+# I'm not sure what "Sysv32" means.  Should this be sysv3.2?
+       i*86v32)
+               basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+               os=-sysv32
+               ;;
+       i*86v4*)
+               basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+               os=-sysv4
+               ;;
+       i*86v)
+               basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+               os=-sysv
+               ;;
+       i*86sol2)
+               basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+               os=-solaris2
+               ;;
+       i386mach)
+               basic_machine=i386-mach
+               os=-mach
+               ;;
+       i386-vsta | vsta)
+               basic_machine=i386-unknown
+               os=-vsta
+               ;;
+       iris | iris4d)
+               basic_machine=mips-sgi
+               case $os in
+                   -irix*)
+                       ;;
+                   *)
+                       os=-irix4
+                       ;;
+               esac
+               ;;
+       isi68 | isi)
+               basic_machine=m68k-isi
+               os=-sysv
+               ;;
+       m88k-omron*)
+               basic_machine=m88k-omron
+               ;;
+       magnum | m3230)
+               basic_machine=mips-mips
+               os=-sysv
+               ;;
+       merlin)
+               basic_machine=ns32k-utek
+               os=-sysv
+               ;;
+       mingw32)
+               basic_machine=i386-pc
+               os=-mingw32
+               ;;
+       miniframe)
+               basic_machine=m68000-convergent
+               ;;
+       *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*)
+               basic_machine=m68k-atari
+               os=-mint
+               ;;
+       mips3*-*)
+               basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`
+               ;;
+       mips3*)
+               basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown
+               ;;
+       mmix*)
+               basic_machine=mmix-knuth
+               os=-mmixware
+               ;;
+       monitor)
+               basic_machine=m68k-rom68k
+               os=-coff
+               ;;
+       morphos)
+               basic_machine=powerpc-unknown
+               os=-morphos
+               ;;
+       msdos)
+               basic_machine=i386-pc
+               os=-msdos
+               ;;
+       mvs)
+               basic_machine=i370-ibm
+               os=-mvs
+               ;;
+       ncr3000)
+               basic_machine=i486-ncr
+               os=-sysv4
+               ;;
+       netbsd386)
+               basic_machine=i386-unknown
+               os=-netbsd
+               ;;
+       netwinder)
+               basic_machine=armv4l-rebel
+               os=-linux
+               ;;
+       news | news700 | news800 | news900)
+               basic_machine=m68k-sony
+               os=-newsos
+               ;;
+       news1000)
+               basic_machine=m68030-sony
+               os=-newsos
+               ;;
+       news-3600 | risc-news)
+               basic_machine=mips-sony
+               os=-newsos
+               ;;
+       necv70)
+               basic_machine=v70-nec
+               os=-sysv
+               ;;
+       next | m*-next )
+               basic_machine=m68k-next
+               case $os in
+                   -nextstep* )
+                       ;;
+                   -ns2*)
+                     os=-nextstep2
+                       ;;
+                   *)
+                     os=-nextstep3
+                       ;;
+               esac
+               ;;
+       nh3000)
+               basic_machine=m68k-harris
+               os=-cxux
+               ;;
+       nh[45]000)
+               basic_machine=m88k-harris
+               os=-cxux
+               ;;
+       nindy960)
+               basic_machine=i960-intel
+               os=-nindy
+               ;;
+       mon960)
+               basic_machine=i960-intel
+               os=-mon960
+               ;;
+       nonstopux)
+               basic_machine=mips-compaq
+               os=-nonstopux
+               ;;
+       np1)
+               basic_machine=np1-gould
+               ;;
+       nsr-tandem)
+               basic_machine=nsr-tandem
+               ;;
+       op50n-* | op60c-*)
+               basic_machine=hppa1.1-oki
+               os=-proelf
+               ;;
+       or32 | or32-*)
+               basic_machine=or32-unknown
+               os=-coff
+               ;;
+       OSE68000 | ose68000)
+               basic_machine=m68000-ericsson
+               os=-ose
+               ;;
+       os68k)
+               basic_machine=m68k-none
+               os=-os68k
+               ;;
+       pa-hitachi)
+               basic_machine=hppa1.1-hitachi
+               os=-hiuxwe2
+               ;;
+       paragon)
+               basic_machine=i860-intel
+               os=-osf
+               ;;
+       pbd)
+               basic_machine=sparc-tti
+               ;;
+       pbb)
+               basic_machine=m68k-tti
+               ;;
+       pc532 | pc532-*)
+               basic_machine=ns32k-pc532
+               ;;
+       pentium | p5 | k5 | k6 | nexgen | viac3)
+               basic_machine=i586-pc
+               ;;
+       pentiumpro | p6 | 6x86 | athlon | athlon_*)
+               basic_machine=i686-pc
+               ;;
+       pentiumii | pentium2)
+               basic_machine=i686-pc
+               ;;
+       pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*)
+               basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'`
+               ;;
+       pentiumpro-* | p6-* | 6x86-* | athlon-*)
+               basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
+               ;;
+       pentiumii-* | pentium2-*)
+               basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
+               ;;
+       pn)
+               basic_machine=pn-gould
+               ;;
+       power)  basic_machine=power-ibm
+               ;;
+       ppc)    basic_machine=powerpc-unknown
+               ;;
+       ppc-*)  basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'`
+               ;;
+       ppcle | powerpclittle | ppc-le | powerpc-little)
+               basic_machine=powerpcle-unknown
+               ;;
+       ppcle-* | powerpclittle-*)
+               basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'`
+               ;;
+       ppc64)  basic_machine=powerpc64-unknown
+               ;;
+       ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'`
+               ;;
+       ppc64le | powerpc64little | ppc64-le | powerpc64-little)
+               basic_machine=powerpc64le-unknown
+               ;;
+       ppc64le-* | powerpc64little-*)
+               basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'`
+               ;;
+       ps2)
+               basic_machine=i386-ibm
+               ;;
+       pw32)
+               basic_machine=i586-unknown
+               os=-pw32
+               ;;
+       rom68k)
+               basic_machine=m68k-rom68k
+               os=-coff
+               ;;
+       rm[46]00)
+               basic_machine=mips-siemens
+               ;;
+       rtpc | rtpc-*)
+               basic_machine=romp-ibm
+               ;;
+       s390 | s390-*)
+               basic_machine=s390-ibm
+               ;;
+       s390x | s390x-*)
+               basic_machine=s390x-ibm
+               ;;
+       sa29200)
+               basic_machine=a29k-amd
+               os=-udi
+               ;;
+       sb1)
+               basic_machine=mipsisa64sb1-unknown
+               ;;
+       sb1el)
+               basic_machine=mipsisa64sb1el-unknown
+               ;;
+       sequent)
+               basic_machine=i386-sequent
+               ;;
+       sh)
+               basic_machine=sh-hitachi
+               os=-hms
+               ;;
+       sparclite-wrs | simso-wrs)
+               basic_machine=sparclite-wrs
+               os=-vxworks
+               ;;
+       sps7)
+               basic_machine=m68k-bull
+               os=-sysv2
+               ;;
+       spur)
+               basic_machine=spur-unknown
+               ;;
+       st2000)
+               basic_machine=m68k-tandem
+               ;;
+       stratus)
+               basic_machine=i860-stratus
+               os=-sysv4
+               ;;
+       sun2)
+               basic_machine=m68000-sun
+               ;;
+       sun2os3)
+               basic_machine=m68000-sun
+               os=-sunos3
+               ;;
+       sun2os4)
+               basic_machine=m68000-sun
+               os=-sunos4
+               ;;
+       sun3os3)
+               basic_machine=m68k-sun
+               os=-sunos3
+               ;;
+       sun3os4)
+               basic_machine=m68k-sun
+               os=-sunos4
+               ;;
+       sun4os3)
+               basic_machine=sparc-sun
+               os=-sunos3
+               ;;
+       sun4os4)
+               basic_machine=sparc-sun
+               os=-sunos4
+               ;;
+       sun4sol2)
+               basic_machine=sparc-sun
+               os=-solaris2
+               ;;
+       sun3 | sun3-*)
+               basic_machine=m68k-sun
+               ;;
+       sun4)
+               basic_machine=sparc-sun
+               ;;
+       sun386 | sun386i | roadrunner)
+               basic_machine=i386-sun
+               ;;
+       sv1)
+               basic_machine=sv1-cray
+               os=-unicos
+               ;;
+       symmetry)
+               basic_machine=i386-sequent
+               os=-dynix
+               ;;
+       t3d)
+               basic_machine=alpha-cray
+               os=-unicos
+               ;;
+       t3e)
+               basic_machine=alphaev5-cray
+               os=-unicos
+               ;;
+       t90)
+               basic_machine=t90-cray
+               os=-unicos
+               ;;
+        tic4x | c4x*)
+               basic_machine=tic4x-unknown
+               os=-coff
+               ;;
+       tic54x | c54x*)
+               basic_machine=tic54x-unknown
+               os=-coff
+               ;;
+       tx39)
+               basic_machine=mipstx39-unknown
+               ;;
+       tx39el)
+               basic_machine=mipstx39el-unknown
+               ;;
+       toad1)
+               basic_machine=pdp10-xkl
+               os=-tops20
+               ;;
+       tower | tower-32)
+               basic_machine=m68k-ncr
+               ;;
+       udi29k)
+               basic_machine=a29k-amd
+               os=-udi
+               ;;
+       ultra3)
+               basic_machine=a29k-nyu
+               os=-sym1
+               ;;
+       v810 | necv810)
+               basic_machine=v810-nec
+               os=-none
+               ;;
+       vaxv)
+               basic_machine=vax-dec
+               os=-sysv
+               ;;
+       vms)
+               basic_machine=vax-dec
+               os=-vms
+               ;;
+       vpp*|vx|vx-*)
+               basic_machine=f301-fujitsu
+               ;;
+       vxworks960)
+               basic_machine=i960-wrs
+               os=-vxworks
+               ;;
+       vxworks68)
+               basic_machine=m68k-wrs
+               os=-vxworks
+               ;;
+       vxworks29k)
+               basic_machine=a29k-wrs
+               os=-vxworks
+               ;;
+       w65*)
+               basic_machine=w65-wdc
+               os=-none
+               ;;
+       w89k-*)
+               basic_machine=hppa1.1-winbond
+               os=-proelf
+               ;;
+       xps | xps100)
+               basic_machine=xps100-honeywell
+               ;;
+       ymp)
+               basic_machine=ymp-cray
+               os=-unicos
+               ;;
+       z8k-*-coff)
+               basic_machine=z8k-unknown
+               os=-sim
+               ;;
+       none)
+               basic_machine=none-none
+               os=-none
+               ;;
+
+# Here we handle the default manufacturer of certain CPU types.  It is in
+# some cases the only manufacturer, in others, it is the most popular.
+       w89k)
+               basic_machine=hppa1.1-winbond
+               ;;
+       op50n)
+               basic_machine=hppa1.1-oki
+               ;;
+       op60c)
+               basic_machine=hppa1.1-oki
+               ;;
+       romp)
+               basic_machine=romp-ibm
+               ;;
+       rs6000)
+               basic_machine=rs6000-ibm
+               ;;
+       vax)
+               basic_machine=vax-dec
+               ;;
+       pdp10)
+               # there are many clones, so DEC is not a safe bet
+               basic_machine=pdp10-unknown
+               ;;
+       pdp11)
+               basic_machine=pdp11-dec
+               ;;
+       we32k)
+               basic_machine=we32k-att
+               ;;
+       sh3 | sh4 | sh3eb | sh4eb | sh[1234]le | sh3ele)
+               basic_machine=sh-unknown
+               ;;
+       sh64)
+               basic_machine=sh64-unknown
+               ;;
+       sparc | sparcv9 | sparcv9b)
+               basic_machine=sparc-sun
+               ;;
+       cydra)
+               basic_machine=cydra-cydrome
+               ;;
+       orion)
+               basic_machine=orion-highlevel
+               ;;
+       orion105)
+               basic_machine=clipper-highlevel
+               ;;
+       mac | mpw | mac-mpw)
+               basic_machine=m68k-apple
+               ;;
+       pmac | pmac-mpw)
+               basic_machine=powerpc-apple
+               ;;
+       *-unknown)
+               # Make sure to match an already-canonicalized machine name.
+               ;;
+       *)
+               echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
+               exit 1
+               ;;
+esac
+
+# Here we canonicalize certain aliases for manufacturers.
+case $basic_machine in
+       *-digital*)
+               basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'`
+               ;;
+       *-commodore*)
+               basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'`
+               ;;
+       *)
+               ;;
+esac
+
+# Decode manufacturer-specific aliases for certain operating systems.
+
+if [ x"$os" != x"" ]
+then
+case $os in
+        # First match some system type aliases
+        # that might get confused with valid system types.
+       # -solaris* is a basic system type, with this one exception.
+       -solaris1 | -solaris1.*)
+               os=`echo $os | sed -e 's|solaris1|sunos4|'`
+               ;;
+       -solaris)
+               os=-solaris2
+               ;;
+       -svr4*)
+               os=-sysv4
+               ;;
+       -unixware*)
+               os=-sysv4.2uw
+               ;;
+       -gnu/linux*)
+               os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'`
+               ;;
+       # First accept the basic system types.
+       # The portable systems comes first.
+       # Each alternative MUST END IN A *, to match a version number.
+       # -sysv* is not here because it comes later, after sysvr4.
+       -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \
+             | -*vms* | -sco* | -esix* | -isc* | -aix* | -sunos | -sunos[34]*\
+             | -hpux* | -unos* | -osf* | -luna* | -dgux* | -solaris* | -sym* \
+             | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \
+             | -aos* \
+             | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \
+             | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \
+             | -hiux* | -386bsd* | -netbsd* | -openbsd* | -freebsd* | -riscix* \
+             | -lynxos* | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \
+             | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \
+             | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \
+             | -chorusos* | -chorusrdb* \
+             | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \
+             | -mingw32* | -linux-gnu* | -uxpv* | -beos* | -mpeix* | -udk* \
+             | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \
+             | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \
+             | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \
+             | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \
+             | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \
+             | -powermax* | -dnix*)
+       # Remember, each alternative MUST END IN *, to match a version number.
+               ;;
+       -qnx*)
+               case $basic_machine in
+                   x86-* | i*86-*)
+                       ;;
+                   *)
+                       os=-nto$os
+                       ;;
+               esac
+               ;;
+       -nto-qnx*)
+               ;;
+       -nto*)
+               os=`echo $os | sed -e 's|nto|nto-qnx|'`
+               ;;
+       -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \
+             | -windows* | -osx | -abug | -netware* | -os9* | -beos* \
+             | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*)
+               ;;
+       -mac*)
+               os=`echo $os | sed -e 's|mac|macos|'`
+               ;;
+       -linux*)
+               os=`echo $os | sed -e 's|linux|linux-gnu|'`
+               ;;
+       -sunos5*)
+               os=`echo $os | sed -e 's|sunos5|solaris2|'`
+               ;;
+       -sunos6*)
+               os=`echo $os | sed -e 's|sunos6|solaris3|'`
+               ;;
+       -opened*)
+               os=-openedition
+               ;;
+       -wince*)
+               os=-wince
+               ;;
+       -osfrose*)
+               os=-osfrose
+               ;;
+       -osf*)
+               os=-osf
+               ;;
+       -utek*)
+               os=-bsd
+               ;;
+       -dynix*)
+               os=-bsd
+               ;;
+       -acis*)
+               os=-aos
+               ;;
+       -atheos*)
+               os=-atheos
+               ;;
+       -386bsd)
+               os=-bsd
+               ;;
+       -ctix* | -uts*)
+               os=-sysv
+               ;;
+       -nova*)
+               os=-rtmk-nova
+               ;;
+       -ns2 )
+               os=-nextstep2
+               ;;
+       -nsk*)
+               os=-nsk
+               ;;
+       # Preserve the version number of sinix5.
+       -sinix5.*)
+               os=`echo $os | sed -e 's|sinix|sysv|'`
+               ;;
+       -sinix*)
+               os=-sysv4
+               ;;
+       -triton*)
+               os=-sysv3
+               ;;
+       -oss*)
+               os=-sysv3
+               ;;
+       -svr4)
+               os=-sysv4
+               ;;
+       -svr3)
+               os=-sysv3
+               ;;
+       -sysvr4)
+               os=-sysv4
+               ;;
+       # This must come after -sysvr4.
+       -sysv*)
+               ;;
+       -ose*)
+               os=-ose
+               ;;
+       -es1800*)
+               os=-ose
+               ;;
+       -xenix)
+               os=-xenix
+               ;;
+       -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)
+               os=-mint
+               ;;
+       -none)
+               ;;
+       *)
+               # Get rid of the `-' at the beginning of $os.
+               os=`echo $os | sed 's/[^-]*-//'`
+               echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2
+               exit 1
+               ;;
+esac
+else
+
+# Here we handle the default operating systems that come with various machines.
+# The value should be what the vendor currently ships out the door with their
+# machine or put another way, the most popular os provided with the machine.
+
+# Note that if you're going to try to match "-MANUFACTURER" here (say,
+# "-sun"), then you have to tell the case statement up towards the top
+# that MANUFACTURER isn't an operating system.  Otherwise, code above
+# will signal an error saying that MANUFACTURER isn't an operating
+# system, and we'll never get to this point.
+
+case $basic_machine in
+       *-acorn)
+               os=-riscix1.2
+               ;;
+       arm*-rebel)
+               os=-linux
+               ;;
+       arm*-semi)
+               os=-aout
+               ;;
+       # This must come before the *-dec entry.
+       pdp10-*)
+               os=-tops20
+               ;;
+       pdp11-*)
+               os=-none
+               ;;
+       *-dec | vax-*)
+               os=-ultrix4.2
+               ;;
+       m68*-apollo)
+               os=-domain
+               ;;
+       i386-sun)
+               os=-sunos4.0.2
+               ;;
+       m68000-sun)
+               os=-sunos3
+               # This also exists in the configure program, but was not the
+               # default.
+               # os=-sunos4
+               ;;
+       m68*-cisco)
+               os=-aout
+               ;;
+       mips*-cisco)
+               os=-elf
+               ;;
+       mips*-*)
+               os=-elf
+               ;;
+       or32-*)
+               os=-coff
+               ;;
+       *-tti)  # must be before sparc entry or we get the wrong os.
+               os=-sysv3
+               ;;
+       sparc-* | *-sun)
+               os=-sunos4.1.1
+               ;;
+       *-be)
+               os=-beos
+               ;;
+       *-ibm)
+               os=-aix
+               ;;
+       *-wec)
+               os=-proelf
+               ;;
+       *-winbond)
+               os=-proelf
+               ;;
+       *-oki)
+               os=-proelf
+               ;;
+       *-hp)
+               os=-hpux
+               ;;
+       *-hitachi)
+               os=-hiux
+               ;;
+       i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent)
+               os=-sysv
+               ;;
+       *-cbm)
+               os=-amigaos
+               ;;
+       *-dg)
+               os=-dgux
+               ;;
+       *-dolphin)
+               os=-sysv3
+               ;;
+       m68k-ccur)
+               os=-rtu
+               ;;
+       m88k-omron*)
+               os=-luna
+               ;;
+       *-next )
+               os=-nextstep
+               ;;
+       *-sequent)
+               os=-ptx
+               ;;
+       *-crds)
+               os=-unos
+               ;;
+       *-ns)
+               os=-genix
+               ;;
+       i370-*)
+               os=-mvs
+               ;;
+       *-next)
+               os=-nextstep3
+               ;;
+       *-gould)
+               os=-sysv
+               ;;
+       *-highlevel)
+               os=-bsd
+               ;;
+       *-encore)
+               os=-bsd
+               ;;
+       *-sgi)
+               os=-irix
+               ;;
+       *-siemens)
+               os=-sysv4
+               ;;
+       *-masscomp)
+               os=-rtu
+               ;;
+       f30[01]-fujitsu | f700-fujitsu)
+               os=-uxpv
+               ;;
+       *-rom68k)
+               os=-coff
+               ;;
+       *-*bug)
+               os=-coff
+               ;;
+       *-apple)
+               os=-macos
+               ;;
+       *-atari*)
+               os=-mint
+               ;;
+       *)
+               os=-none
+               ;;
+esac
+fi
+
+# Here we handle the case where we know the os, and the CPU type, but not the
+# manufacturer.  We pick the logical manufacturer.
+vendor=unknown
+case $basic_machine in
+       *-unknown)
+               case $os in
+                       -riscix*)
+                               vendor=acorn
+                               ;;
+                       -sunos*)
+                               vendor=sun
+                               ;;
+                       -aix*)
+                               vendor=ibm
+                               ;;
+                       -beos*)
+                               vendor=be
+                               ;;
+                       -hpux*)
+                               vendor=hp
+                               ;;
+                       -mpeix*)
+                               vendor=hp
+                               ;;
+                       -hiux*)
+                               vendor=hitachi
+                               ;;
+                       -unos*)
+                               vendor=crds
+                               ;;
+                       -dgux*)
+                               vendor=dg
+                               ;;
+                       -luna*)
+                               vendor=omron
+                               ;;
+                       -genix*)
+                               vendor=ns
+                               ;;
+                       -mvs* | -opened*)
+                               vendor=ibm
+                               ;;
+                       -ptx*)
+                               vendor=sequent
+                               ;;
+                       -vxsim* | -vxworks* | -windiss*)
+                               vendor=wrs
+                               ;;
+                       -aux*)
+                               vendor=apple
+                               ;;
+                       -hms*)
+                               vendor=hitachi
+                               ;;
+                       -mpw* | -macos*)
+                               vendor=apple
+                               ;;
+                       -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)
+                               vendor=atari
+                               ;;
+                       -vos*)
+                               vendor=stratus
+                               ;;
+               esac
+               basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"`
+               ;;
+esac
+
+echo $basic_machine$os
+exit 0
+
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "timestamp='"
+# time-stamp-format: "%:y-%02m-%02d"
+# time-stamp-end: "'"
+# End:
diff --git a/support/install.sh b/support/install.sh
new file mode 100755 (executable)
index 0000000..0cac004
--- /dev/null
@@ -0,0 +1,247 @@
+#!/bin/sh
+#
+# install - install a program, script, or datafile
+# This comes from X11R5.
+#
+# $XConsortium: install.sh,v 1.2 89/12/18 14:47:22 jim Exp $
+#
+# Copyright 1991 by the Massachusetts Institute of Technology
+#
+# Permission to use, copy, modify, distribute, and sell this software and its
+# documentation for any purpose is hereby granted without fee, provided that
+# the above copyright notice appear in all copies and that both that
+# copyright notice and this permission notice appear in supporting
+# documentation, and that the name of M.I.T. not be used in advertising or
+# publicity pertaining to distribution of the software without specific,
+# written prior permission.  M.I.T. makes no representations about the
+# suitability of this software for any purpose.  It is provided "as is"
+# without express or implied warranty.
+#
+# This script is compatible with the BSD install script, but was written
+# from scratch.
+#
+
+# set DOITPROG to echo to test this script
+
+# Don't use :- since 4.3BSD and earlier shells don't like it.
+doit="${DOITPROG-}"
+
+
+# put in absolute paths if you don't have them in your path; or use env. vars.
+
+mvprog="${MVPROG-mv}"
+cpprog="${CPPROG-cp}"
+chmodprog="${CHMODPROG-chmod}"
+chownprog="${CHOWNPROG-chown}"
+chgrpprog="${CHGRPPROG-chgrp}"
+stripprog="${STRIPPROG-strip}"
+rmprog="${RMPROG-rm}"
+mkdirprog="${MKDIRPROG-mkdir}"
+
+tranformbasename=""
+transform_arg=""
+instcmd="$mvprog"
+chmodcmd="$chmodprog 0755"
+chowncmd=""
+chgrpcmd=""
+stripcmd=""
+rmcmd="$rmprog -f"
+mvcmd="$mvprog"
+src=""
+dst=""
+dir_arg=""
+
+while [ x"$1" != x ]; do
+    case $1 in
+       -c) instcmd="$cpprog"
+           shift
+           continue;;
+
+       -d) dir_arg=true
+           shift
+           continue;;
+
+       -m) chmodcmd="$chmodprog $2"
+           shift
+           shift
+           continue;;
+
+       -o) chowncmd="$chownprog $2"
+           shift
+           shift
+           continue;;
+
+       -g) chgrpcmd="$chgrpprog $2"
+           shift
+           shift
+           continue;;
+
+       -s) stripcmd="$stripprog"
+           shift
+           continue;;
+
+       -t=*) transformarg=`echo $1 | sed 's/-t=//'`
+           shift
+           continue;;
+
+       -b=*) transformbasename=`echo $1 | sed 's/-b=//'`
+           shift
+           continue;;
+
+       *)  if [ x"$src" = x ]
+           then
+               src=$1
+           else
+               # this colon is to work around a 386BSD /bin/sh bug
+               :
+               dst=$1
+           fi
+           shift
+           continue;;
+    esac
+done
+
+if [ x"$src" = x ]
+then
+       echo "install:  no input file specified"
+       exit 1
+else
+       true
+fi
+
+if [ x"$dir_arg" != x ]; then
+       dst=$src
+       src=""
+       
+       if [ -d $dst ]; then
+               instcmd=:
+       else
+               instcmd=mkdir
+       fi
+else
+
+# Waiting for this to be detected by the "$instcmd $src $dsttmp" command
+# might cause directories to be created, which would be especially bad 
+# if $src (and thus $dsttmp) contains '*'.
+
+       if [ -f $src -o -d $src ]
+       then
+               true
+       else
+               echo "install:  $src does not exist"
+               exit 1
+       fi
+       
+       if [ x"$dst" = x ]
+       then
+               echo "install:  no destination specified"
+               exit 1
+       else
+               true
+       fi
+
+# If destination is a directory, append the input filename; if your system
+# does not like double slashes in filenames, you may need to add some logic
+
+       if [ -d $dst ]
+       then
+               dst="$dst"/`basename $src`
+       else
+               true
+       fi
+fi
+
+## this sed command emulates the dirname command
+dstdir=`echo $dst | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'`
+
+# Make sure that the destination directory exists.
+#  this part is taken from Noah Friedman's mkinstalldirs script
+
+# Skip lots of stat calls in the usual case.
+if [ ! -d "$dstdir" ]; then
+defaultIFS='   
+'
+IFS="${IFS-${defaultIFS}}"
+
+oIFS="${IFS}"
+# Some sh's can't handle IFS=/ for some reason.
+IFS='%'
+set - `echo ${dstdir} | sed -e 's@/@%@g' -e 's@^%@/@'`
+IFS="${oIFS}"
+
+pathcomp=''
+
+while [ $# -ne 0 ] ; do
+       pathcomp="${pathcomp}${1}"
+       shift
+
+       if [ ! -d "${pathcomp}" ] ;
+        then
+               $mkdirprog "${pathcomp}"
+       else
+               true
+       fi
+
+       pathcomp="${pathcomp}/"
+done
+fi
+
+if [ x"$dir_arg" != x ]
+then
+       $doit $instcmd $dst &&
+
+       if [ x"$chowncmd" != x ]; then $doit $chowncmd $dst; else true ; fi &&
+       if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dst; else true ; fi &&
+       if [ x"$stripcmd" != x ]; then $doit $stripcmd $dst; else true ; fi &&
+       if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dst; else true ; fi
+else
+
+# If we're going to rename the final executable, determine the name now.
+
+       if [ x"$transformarg" = x ] 
+       then
+               dstfile=`basename $dst`
+       else
+               dstfile=`basename $dst $transformbasename | 
+                       sed $transformarg`$transformbasename
+       fi
+
+# don't allow the sed command to completely eliminate the filename
+
+       if [ x"$dstfile" = x ] 
+       then
+               dstfile=`basename $dst`
+       else
+               true
+       fi
+
+# Make a temp file name in the proper directory.
+
+       dsttmp=$dstdir/#inst.$$#
+
+# Move or copy the file name to the temp name
+
+       $doit $instcmd $src $dsttmp &&
+
+       trap "rm -f ${dsttmp}" 0 &&
+
+# and set any options; do chmod last to preserve setuid bits
+
+# If any of these fail, we abort the whole thing.  If we want to
+# ignore errors from any of these, just make sure not to ignore
+# errors from the above "$doit $instcmd $src $dsttmp" command.
+
+       if [ x"$chowncmd" != x ]; then $doit $chowncmd $dsttmp; else true;fi &&
+       if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dsttmp; else true;fi &&
+       if [ x"$stripcmd" != x ]; then $doit $stripcmd $dsttmp; else true;fi &&
+       if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dsttmp; else true;fi &&
+
+# Now rename the file to the real destination.
+
+       $doit $rmcmd -f $dstdir/$dstfile &&
+       $doit $mvcmd $dsttmp $dstdir/$dstfile 
+
+fi &&
+
+
+exit 0
diff --git a/support/mkdirs b/support/mkdirs
new file mode 100755 (executable)
index 0000000..ce4fb23
--- /dev/null
@@ -0,0 +1,48 @@
+#! /bin/sh
+#
+# mkdirs - a work-alike for `mkdir -p'
+#
+# Chet Ramey
+# chet@po.cwru.edu
+
+# Copyright (C) 1996-2002 Free Software Foundation, Inc.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111 USA.
+
+for dir
+do
+
+       test -d "$dir" && continue
+
+       tomake=$dir
+       while test -n "$dir" ; do
+               # dir=${dir%/*}
+               # dir=`expr "$dir" ':' '\(/.*\)/[^/]*'`
+               if dir=`expr "$dir" ':' '\(.*\)/[^/]*'`; then
+                       tomake="$dir $tomake"
+               else
+                       dir=
+               fi
+       done
+
+       for d in $tomake
+       do
+               test -d "$d" && continue
+               echo mkdir "$d"
+               mkdir "$d"
+       done
+done
+
+exit 0
diff --git a/support/mkdist b/support/mkdist
new file mode 100755 (executable)
index 0000000..06e6155
--- /dev/null
@@ -0,0 +1,120 @@
+#! /bin/bash -
+#
+# mkdist - make a distribution directory from a master manifest file
+#
+# usage: mkdist [-m manifest] [-s srcdir] [-r rootname] [-v] version
+#
+# SRCDIR defaults to src
+# MANIFEST defaults to $SRCDIR/MANIFEST
+#
+# Chet Ramey
+# chet@po.cwru.edu
+
+# Copyright (C) 1996-2002 Free Software Foundation, Inc.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111 USA.
+
+SRCDIR=src
+ROOTNAME=bash
+
+usage()
+{
+       echo usage: mkdist [-m manifest] [-s srcdir] [-r rootname] [-v] version 1>&2
+       exit 2
+}
+
+vmsg()
+{
+       if [ -n "$verbose" ]; then
+               echo mkdist: "$@"
+       fi
+}
+
+while getopts m:s:r:v name
+do
+       case $name in
+       m)      MANIFEST=$OPTARG ;;
+       s)      SRCDIR=$OPTARG ;;
+       r)      ROOTNAME=$OPTARG ;;
+       v)      verbose=yes ;;
+       ?)      usage ;;
+       esac
+done
+
+: ${MANIFEST:=$SRCDIR/MANIFEST}
+
+vmsg using $MANIFEST
+
+shift $(( $OPTIND - 1 ))
+
+if [ $# -lt 1 ]; then
+       usage
+fi
+
+version=$1
+newdir=${ROOTNAME}-$version
+
+vmsg creating distribution for $ROOTNAME version $version in $newdir
+
+if [ ! -d $newdir ]; then
+       mkdir $newdir || { echo $0: cannot make directory $newdir 1>&2 ; exit 1; }
+fi
+
+dirmode=755
+filmode=644
+
+while read fname type mode
+do
+       [ -z "$fname" ] && continue
+
+       case "$fname" in
+       \#*)    continue ;;
+       esac
+
+       case "$type" in
+       d)      mkdir $newdir/$fname ;;
+       f)      cp -p $SRCDIR/$fname $newdir/$fname ;;
+       s)      ln -s $mode $newdir/$fname ; mode= ;;           # symlink
+       l)      ln $mode $newdir/$fname ; mode= ;;              # hard link
+       *)      echo "unknown file type $type" 1>&2 ;;
+       esac
+
+       if [ -n "$mode" ]; then
+               chmod $mode $newdir/$fname
+       fi
+
+done < $MANIFEST
+
+# cut off the `-alpha' in something like `2.0-alpha', leaving just the
+# numeric version
+#version=${version%%-*}
+
+#case "$version" in
+#*.*.*)        vers=${version%.*} ;;
+#*.*)  vers=${version} ;;
+#esac
+
+#echo $vers > $newdir/.distribution
+
+#case "$version" in
+#*.*.*)        plevel=${version##*.} ;;
+#*)    plevel=0 ;;
+#esac
+#[ -z "$plevel" ] && plevel=0
+#echo ${plevel} > $newdir/.patchlevel
+
+vmsg $newdir created
+
+exit 0
diff --git a/support/mkinstalldirs b/support/mkinstalldirs
new file mode 100755 (executable)
index 0000000..d2d5f21
--- /dev/null
@@ -0,0 +1,111 @@
+#! /bin/sh
+# mkinstalldirs --- make directory hierarchy
+# Author: Noah Friedman <friedman@prep.ai.mit.edu>
+# Created: 1993-05-16
+# Public domain
+
+errstatus=0
+dirmode=""
+
+usage="\
+Usage: mkinstalldirs [-h] [--help] [-m mode] dir ..."
+
+# process command line arguments
+while test $# -gt 0 ; do
+  case $1 in
+    -h | --help | --h*)         # -h for help
+      echo "$usage" 1>&2
+      exit 0
+      ;;
+    -m)                         # -m PERM arg
+      shift
+      test $# -eq 0 && { echo "$usage" 1>&2; exit 1; }
+      dirmode=$1
+      shift
+      ;;
+    --)                         # stop option processing
+      shift
+      break
+      ;;
+    -*)                         # unknown option
+      echo "$usage" 1>&2
+      exit 1
+      ;;
+    *)                          # first non-opt arg
+      break
+      ;;
+  esac
+done
+
+for file
+do
+  if test -d "$file"; then
+    shift
+  else
+    break
+  fi
+done
+
+case $# in
+  0) exit 0 ;;
+esac
+
+case $dirmode in
+  '')
+    if mkdir -p -- . 2>/dev/null; then
+      echo "mkdir -p -- $*"
+      exec mkdir -p -- "$@"
+    fi
+    ;;
+  *)
+    if mkdir -m "$dirmode" -p -- . 2>/dev/null; then
+      echo "mkdir -m $dirmode -p -- $*"
+      exec mkdir -m "$dirmode" -p -- "$@"
+    fi
+    ;;
+esac
+
+for file
+do
+  set fnord `echo ":$file" | sed -ne 's/^:\//#/;s/^://;s/\// /g;s/^#/\//;p'`
+  shift
+
+  pathcomp=
+  for d
+  do
+    pathcomp="$pathcomp$d"
+    case $pathcomp in
+      -*) pathcomp=./$pathcomp ;;
+    esac
+
+    if test ! -d "$pathcomp"; then
+      echo "mkdir $pathcomp"
+
+      mkdir "$pathcomp" || lasterr=$?
+
+      if test ! -d "$pathcomp"; then
+       errstatus=$lasterr
+      else
+       if test ! -z "$dirmode"; then
+         echo "chmod $dirmode $pathcomp"
+         lasterr=""
+         chmod "$dirmode" "$pathcomp" || lasterr=$?
+
+         if test ! -z "$lasterr"; then
+           errstatus=$lasterr
+         fi
+       fi
+      fi
+    fi
+
+    pathcomp="$pathcomp/"
+  done
+done
+
+exit $errstatus
+
+# Local Variables:
+# mode: shell-script
+# sh-indentation: 2
+# End:
+# mkinstalldirs ends here
diff --git a/support/shlib-install b/support/shlib-install
new file mode 100755 (executable)
index 0000000..790f53e
--- /dev/null
@@ -0,0 +1,196 @@
+#! /bin/sh
+#
+# shlib-install - install a shared library and do any necessary host-specific
+#                post-installation configuration (like ldconfig)
+#
+# usage: shlib-install [-D] -O host_os -d installation-dir [-b bin-dir] -i install-prog [-U] library
+#
+# Chet Ramey
+# chet@po.cwru.edu
+
+#
+# defaults
+#
+INSTALLDIR=/usr/local/lib
+LDCONFIG=ldconfig
+
+PROGNAME=`basename $0`
+USAGE="$PROGNAME [-D] -O host_os -d installation-dir [-b bin-dir] -i install-prog [-U] library"
+
+# process options
+
+while [ $# -gt 0 ]; do
+       case "$1" in
+       -O)     shift; host_os="$1"; shift ;;
+       -d)     shift; INSTALLDIR="$1"; shift ;;
+       -b)     shift; BINDIR="$1" ; shift ;;
+       -i)     shift; INSTALLPROG="$1" ; shift ;;
+       -D)     echo=echo ; shift ;;
+       -U)     uninstall=true ; shift ;;
+       -*)     echo "$USAGE" >&2 ; exit 2;;
+       *)      break ;;
+       esac
+done
+
+# set install target name
+LIBNAME="$1"
+
+if [ -z "$LIBNAME" ]; then
+       echo "$USAGE" >&2
+       exit 2
+fi
+
+OLDSUFF=old
+MV=mv
+RM="rm -f"
+LN="ln -s"
+
+# pre-install
+
+if [ -z "$uninstall" ]; then
+       ${echo} $RM ${INSTALLDIR}/${LIBNAME}.${OLDSUFF}
+       if [ -f "$INSTALLDIR/$LIBNAME" ]; then
+               ${echo} $MV $INSTALLDIR/$LIBNAME ${INSTALLDIR}/${LIBNAME}.${OLDSUFF}
+       fi
+fi
+
+# install/uninstall
+
+if [ -z "$uninstall" ] ; then
+       ${echo} eval ${INSTALLPROG} $LIBNAME ${INSTALLDIR}/${LIBNAME}
+else
+       ${echo} ${RM} ${INSTALLDIR}/${LIBNAME}
+fi
+
+# post-install/uninstall
+
+# HP-UX and Darwin/MacOS X require that a shared library have execute permission
+# Linux does, too, and ldd warns about it
+# Cygwin installs both a dll (which must go in $BINDIR) and an implicit
+# link library (in $libdir)
+case "$host_os" in
+hpux*|darwin*|macosx*|linux*)
+       if [ -z "$uninstall" ]; then
+               chmod 555 ${INSTALLDIR}/${LIBNAME}
+       fi ;;
+cygwin*)
+       IMPLIBNAME=`echo ${LIBNAME} \
+               | sed -e 's,^cyg,lib,' -e 's,[0-9]*.dll$,.dll.a,'`
+       if [ -z "$uninstall" ]; then
+               ${echo} $RM ${BINDIR}/${LIBNAME}.${OLDSUFF}
+               if [ -f "$BINDIR/$LIBNAME" ]; then
+                       ${echo} $MV $BINDIR/$LIBNAME $BINDIR/$LIBNAME.$OLDSUFF
+               fi
+               ${echo} $MV ${INSTALLDIR}/${LIBNAME} ${BINDIR}/${LIBNAME}
+               ${echo} chmod a+x ${BINDIR}/${LIBNAME}
+               ${echo} eval ${INSTALLPROG} ${LIBNAME}.a \
+                       ${INSTALLDIR}/${IMPLIBNAME}
+       else
+               ${echo} ${RM} ${BINDIR}/${LIBNAME}
+               ${echo} ${RM} ${INSTALLDIR}/${IMPLIBNAME}
+       fi ;;
+
+*)     ;;
+esac
+
+case "$LIBNAME" in
+*.*.[0-9].[0-9])       # libname.so.M.N
+       LINK2=`echo $LIBNAME | sed 's:\(.*\..*\.[0-9]\)\.[0-9]:\1:'`    # libname.so.M
+       LINK1=`echo $LIBNAME | sed 's:\(.*\..*\)\.[0-9]\.[0-9]:\1:'`    # libname.so
+       ;;
+*.*.[0-9])             # libname.so.M
+       LINK1=`echo $LIBNAME | sed 's:\(.*\..*\)\.[0-9]:\1:'`           # libname.so
+       ;;
+*.[0-9])               # libname.M
+       LINK1=`echo $LIBNAME | sed 's:\(.*\)\.[0-9]:\1:'`               # libname
+       ;;
+*.[0-9].[0-9].dylib)   # libname.M.N.dylib
+       LINK2=`echo $LIBNAME | sed 's:\(.*\.[0-9]\)\.[0-9]:\1:'`        # libname.M.dylib
+       LINK1=`echo $LIBNAME | sed 's:\(.*\)\.[0-9]\.[0-9]:\1:'`        # libname.dylib
+esac
+
+INSTALL_LINK1='${echo} cd $INSTALLDIR && ${echo} ${LN} $LIBNAME $LINK1'
+INSTALL_LINK2='${echo} cd $INSTALLDIR && ${echo} ${LN} $LIBNAME $LINK2'
+
+#
+# Create symlinks to the installed library.  This section is incomplete.
+#
+case "$host_os" in
+*linux*)
+       # libname.so.M -> libname.so.M.N
+       ${echo} ${RM} ${INSTALLDIR}/$LINK2
+       if [ -z "$uninstall" ]; then
+               eval $INSTALL_LINK2
+       fi
+
+       # libname.so -> libname.so.M
+       ${echo} ${RM} ${INSTALLDIR}/$LINK1
+       if [ -z "$uninstall" ]; then
+               ${echo} cd $INSTALLDIR && ${echo} ${LN} $LINK2 $LINK1
+       fi
+       ;;
+
+bsdi4*|*gnu*|darwin*|macosx*|k*bsd*-gnu)
+       # libname.so.M -> libname.so.M.N
+       ${echo} ${RM} ${INSTALLDIR}/$LINK2
+       if [ -z "$uninstall" ]; then
+               eval $INSTALL_LINK2
+       fi
+
+       # libname.so -> libname.so.M.N
+       ${echo} ${RM} ${INSTALLDIR}/$LINK1
+       if [ -z "$uninstall" ]; then
+               eval $INSTALL_LINK1
+       fi
+       ;;
+
+solaris2*|aix4.[2-9]*|osf*|irix[56]*|sysv[45]*|dgux*)
+       # libname.so -> libname.so.M
+       ${echo} ${RM} ${INSTALLDIR}/$LINK1
+       if [ -z "$uninstall" ]; then
+               eval $INSTALL_LINK1
+       fi
+       ;;
+
+
+# FreeBSD 3.x and above can have either a.out or ELF shared libraries
+freebsd[3-9]*|freebsdelf[3-9]*|freebsdaout[3-9]*)
+       if [ -x /usr/bin/objformat ] && [ "`/usr/bin/objformat`" = "elf" ]; then
+               # libname.so -> libname.so.M
+               ${echo} ${RM} ${INSTALLDIR}/$LINK1
+               if [ -z "$uninstall" ]; then
+                       eval $INSTALL_LINK1
+               fi
+       else
+               # libname.so.M -> libname.so.M.N
+               ${echo} ${RM} ${INSTALLDIR}/$LINK2
+               if [ -z "$uninstall" ]; then
+                       eval $INSTALL_LINK2
+               fi
+
+               # libname.so -> libname.so.M.N
+               ${echo} ${RM} ${INSTALLDIR}/$LINK1
+               if [ -z "$uninstall" ]; then
+                       eval $INSTALL_LINK1
+               fi
+       fi
+       ;;
+
+hpux1*)
+       # libname.sl -> libname.M
+       ${echo} ${RM} ${INSTALLDIR}/$LINK1.sl
+       if [ -z "$uninstall" ]; then
+               eval $INSTALL_LINK1
+       fi
+       ;;
+
+cygwin*)
+       # Links to .dlls don't work.  Hence shobj-conf used DLLVERSION.dll
+       # instead of so.SHLIB_MAJOR.SHLIB_MINOR.  The postinstall above
+       # took care of everything else.
+       ;;
+
+*)     ;;
+esac
+
+exit 0
diff --git a/support/shobj-conf b/support/shobj-conf
new file mode 100755 (executable)
index 0000000..ef7863a
--- /dev/null
@@ -0,0 +1,547 @@
+#! /bin/sh
+#
+# shobj-conf -- output a series of variable assignments to be substituted
+#              into a Makefile by configure which specify system-dependent
+#              information for creating shared objects that may be loaded
+#              into bash with `enable -f'
+#
+# usage: shobj-conf [-C compiler] -c host_cpu -o host_os -v host_vendor
+#
+# Chet Ramey
+# chet@po.cwru.edu
+
+# Copyright (C) 1996-2002 Free Software Foundation, Inc.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111 USA.
+
+#
+# defaults
+#
+SHOBJ_STATUS=supported
+SHLIB_STATUS=supported
+
+SHOBJ_CC=cc
+SHOBJ_CFLAGS=
+SHOBJ_LD=
+SHOBJ_LDFLAGS=
+SHOBJ_XLDFLAGS=
+SHOBJ_LIBS=
+
+SHLIB_XLDFLAGS=
+SHLIB_LIBS=
+
+SHLIB_DOT='.'
+SHLIB_LIBPREF='lib'
+SHLIB_LIBSUFF='so'
+
+SHLIB_LIBVERSION='$(SHLIB_LIBSUFF)'
+SHLIB_DLLVERSION='$(SHLIB_MAJOR)'
+
+PROGNAME=`basename $0`
+USAGE="$PROGNAME [-C compiler] -c host_cpu -o host_os -v host_vendor"
+
+while [ $# -gt 0 ]; do
+       case "$1" in
+       -C)     shift; SHOBJ_CC="$1"; shift ;;
+       -c)     shift; host_cpu="$1"; shift ;;
+       -o)     shift; host_os="$1"; shift ;;
+       -v)     shift; host_vendor="$1"; shift ;;
+       *)      echo "$USAGE" >&2 ; exit 2;;
+       esac
+done
+
+case "${host_os}-${SHOBJ_CC}" in
+sunos4*-*gcc*)
+       SHOBJ_CFLAGS=-fpic
+       SHOBJ_LD=/usr/bin/ld
+       SHOBJ_LDFLAGS='-assert pure-text'
+
+       SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)$(SHLIB_MINOR)'
+       ;;
+
+sunos4*)
+       SHOBJ_CFLAGS=-pic
+       SHOBJ_LD=/usr/bin/ld
+       SHOBJ_LDFLAGS='-assert pure-text'
+
+       SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)$(SHLIB_MINOR)'
+       ;;
+
+sunos5*-*gcc*|solaris2*-*gcc*)
+       SHOBJ_CFLAGS=-fpic
+       SHOBJ_LD='${CC}'
+       ld_used=`gcc -print-prog-name=ld`
+       if ${ld_used} -V 2>&1 | grep GNU >/dev/null 2>&1; then
+               # This line works for the GNU ld
+               SHOBJ_LDFLAGS='-shared -Wl,-h,$@'
+       else
+               # This line works for the Solaris linker in /usr/ccs/bin/ld
+               SHOBJ_LDFLAGS='-shared -Wl,-i -Wl,-h,$@'
+       fi
+
+#      SHLIB_XLDFLAGS='-R $(libdir)'
+       SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)'
+       ;;
+
+sunos5*|solaris2*)
+       SHOBJ_CFLAGS='-K pic'
+       SHOBJ_LD=/usr/ccs/bin/ld
+       SHOBJ_LDFLAGS='-G -dy -z text -i -h $@'
+
+#      SHLIB_XLDFLAGS='-R $(libdir)'
+       SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)'
+       ;;
+
+# All versions of Linux or the semi-mythical GNU Hurd.
+linux*-*|gnu*-*|k*bsd*-gnu-*)
+       SHOBJ_CFLAGS=-fPIC
+       SHOBJ_LD='${CC}'
+       SHOBJ_LDFLAGS='-shared -Wl,-soname,$@'
+
+       SHLIB_XLDFLAGS='-Wl,-rpath,$(libdir) -Wl,-soname,`basename $@ $(SHLIB_MINOR)`'
+       SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)$(SHLIB_MINOR)'
+       ;;
+
+freebsd2* | netbsd*)
+       SHOBJ_CFLAGS=-fpic
+       SHOBJ_LD=ld
+       SHOBJ_LDFLAGS='-x -Bshareable'
+
+       SHLIB_XLDFLAGS='-R$(libdir)'
+       SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)$(SHLIB_MINOR)'
+       ;;
+
+# FreeBSD-3.x ELF
+freebsd[3-9]*|freebsdelf[3-9]*|freebsdaout[3-9]*|dragonfly*)
+       SHOBJ_CFLAGS=-fpic
+       SHOBJ_LD='${CC}'
+
+       if [ -x /usr/bin/objformat ] && [ "`/usr/bin/objformat`" = "elf" ]; then
+               SHOBJ_LDFLAGS='-shared -Wl,-soname,$@'
+
+               SHLIB_XLDFLAGS='-Wl,-rpath,$(libdir)'
+               SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)'
+       else
+               SHOBJ_LDFLAGS='-shared'
+
+               SHLIB_XLDFLAGS='-R$(libdir)'
+               SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)$(SHLIB_MINOR)'
+       fi
+       ;;
+
+# Darwin/MacOS X
+darwin8*)
+       SHOBJ_STATUS=supported
+       SHLIB_STATUS=supported
+       
+       SHOBJ_CFLAGS='-fno-common'
+
+       SHOBJ_LD='MACOSX_DEPLOYMENT_TARGET=10.3 ${CC}'
+
+       SHLIB_LIBVERSION='$(SHLIB_MAJOR)$(SHLIB_MINOR).$(SHLIB_LIBSUFF)'
+       SHLIB_LIBSUFF='dylib'
+
+       SHOBJ_LDFLAGS='-undefined dynamic_lookup'
+       SHLIB_XLDFLAGS='-dynamiclib -arch_only `/usr/bin/arch` -install_name $(libdir)/$@ -current_version $(SHLIB_MAJOR)$(SHLIB_MINOR) -compatibility_version $(SHLIB_MAJOR) -v'
+
+       SHLIB_LIBS='-lncurses'  # see if -lcurses works on MacOS X 10.1 
+       ;;
+
+darwin*|macosx*)
+       SHOBJ_STATUS=unsupported
+       SHLIB_STATUS=supported
+
+       SHOBJ_CFLAGS='-fno-common'
+
+       SHOBJ_LD='${CC}'
+
+       SHLIB_LIBVERSION='$(SHLIB_MAJOR)$(SHLIB_MINOR).$(SHLIB_LIBSUFF)'
+       SHLIB_LIBSUFF='dylib'
+
+       case "${host_os}" in
+       darwin[78]*)    SHOBJ_LDFLAGS=''
+                       SHLIB_XLDFLAGS='-dynamiclib -arch_only `/usr/bin/arch` -install_name $(libdir)/$@ -current_version $(SHLIB_MAJOR)$(SHLIB_MINOR) -compatibility_version $(SHLIB_MAJOR) -v'
+                       ;;
+       *)              SHOBJ_LDFLAGS='-dynamic'
+                       SHLIB_XLDFLAGS='-arch_only `/usr/bin/arch` -install_name $(libdir)/$@ -current_version $(SHLIB_MAJOR)$(SHLIB_MINOR) -compatibility_version $(SHLIB_MAJOR) -v'
+                       ;;
+       esac
+
+       SHLIB_LIBS='-lncurses'  # see if -lcurses works on MacOS X 10.1 
+       ;;
+
+openbsd*)
+       SHOBJ_CFLAGS=-fPIC
+       SHOBJ_LD='${CC}'
+       SHOBJ_LDFLAGS='-shared'
+
+       SHLIB_XLDFLAGS='-R$(libdir)'
+       SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)$(SHLIB_MINOR)'
+       ;;
+
+bsdi2*)
+       SHOBJ_CC=shlicc2
+       SHOBJ_CFLAGS=
+       SHOBJ_LD=ld
+       SHOBJ_LDFLAGS=-r
+       SHOBJ_LIBS=-lc_s.2.1.0
+
+       # BSD/OS 2.x and 3.x `shared libraries' are too much of a pain in
+       # the ass -- they require changing {/usr/lib,etc}/shlib.map on
+       # each system, and the library creation process is byzantine
+       SHLIB_STATUS=unsupported
+       ;;
+
+bsdi3*)
+       SHOBJ_CC=shlicc2
+       SHOBJ_CFLAGS=
+       SHOBJ_LD=ld
+       SHOBJ_LDFLAGS=-r
+       SHOBJ_LIBS=-lc_s.3.0.0
+
+       # BSD/OS 2.x and 3.x `shared libraries' are too much of a pain in
+       # the ass -- they require changing {/usr/lib,etc}/shlib.map on
+       # each system, and the library creation process is byzantine
+       SHLIB_STATUS=unsupported
+       ;;
+
+bsdi4*)
+       # BSD/OS 4.x now supports ELF and SunOS-style dynamically-linked
+       # shared libraries.  gcc 2.x is the standard compiler, and the
+       # `normal' gcc options should work as they do in Linux.
+
+       SHOBJ_CFLAGS=-fPIC
+       SHOBJ_LD='${CC}'
+       SHOBJ_LDFLAGS='-shared -Wl,-soname,$@'
+
+       SHLIB_XLDFLAGS='-Wl,-soname,`basename $@ $(SHLIB_MINOR)`'
+       SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)$(SHLIB_MINOR)'
+       ;;
+
+osf*-*gcc*)
+       # Fix to use gcc linker driver from bfischer@TechFak.Uni-Bielefeld.DE
+       SHOBJ_LD='${CC}'
+       SHOBJ_LDFLAGS='-shared -Wl,-soname,$@'
+
+       SHLIB_XLDFLAGS='-rpath $(libdir)'
+       SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)'
+       ;;
+
+osf*)
+       SHOBJ_LD=ld
+       SHOBJ_LDFLAGS='-shared -soname $@ -expect_unresolved "*"'
+
+       SHLIB_XLDFLAGS='-rpath $(libdir)'
+       SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)'
+       ;;
+
+aix4.[2-9]*-*gcc*)             # lightly tested by jik@cisco.com
+       SHOBJ_CFLAGS=-fpic
+       SHOBJ_LD='ld'
+       SHOBJ_LDFLAGS='-bdynamic -bnoentry -bexpall'
+       SHOBJ_XLDFLAGS='-G'
+
+       SHLIB_XLDFLAGS='-bM:SRE'
+       SHLIB_LIBS='-lcurses -lc'
+       SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)'
+       ;;
+
+aix4.[2-9]*)
+       SHOBJ_CFLAGS=-K
+       SHOBJ_LD='ld'
+       SHOBJ_LDFLAGS='-bdynamic -bnoentry -bexpall'
+       SHOBJ_XLDFLAGS='-G'
+
+       SHLIB_XLDFLAGS='-bM:SRE'
+       SHLIB_LIBS='-lcurses -lc'
+       SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)'
+       ;;
+
+#
+# THE FOLLOWING ARE UNTESTED -- and some may not support the dlopen interface
+#
+irix[56]*-*gcc*)
+       SHOBJ_CFLAGS='-fpic'
+       SHOBJ_LD='${CC}'
+       SHOBJ_LDFLAGS='-shared -Wl,-soname,$@'
+
+       SHLIB_XLDFLAGS='-Wl,-rpath,$(libdir)'
+       SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)'
+       ;;
+
+irix[56]*)
+       SHOBJ_CFLAGS='-K PIC'
+       SHOBJ_LD=ld
+#      SHOBJ_LDFLAGS='-call_shared -hidden_symbol -no_unresolved -soname $@'
+#      Change from David Kaelbling <drk@sgi.com>.  If you have problems,
+#      remove the `-no_unresolved'
+       SHOBJ_LDFLAGS='-shared -no_unresolved -soname $@'
+
+       SHLIB_XLDFLAGS='-rpath $(libdir)'
+       SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)'
+       ;;
+
+hpux9*-*gcc*)
+       # must use gcc; the bundled cc cannot compile PIC code
+       SHOBJ_CFLAGS='-fpic'
+       SHOBJ_LD='${CC}'
+       SHOBJ_LDFLAGS='-shared -Wl,-b -Wl,+s'
+
+       SHLIB_XLDFLAGS='-Wl,+b,$(libdir)'
+       SHLIB_LIBSUFF='sl'
+       SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)'
+       ;;
+
+hpux9*)
+       SHOBJ_STATUS=unsupported
+       SHLIB_STATUS=unsupported
+
+       # If you are using the HP ANSI C compiler, you can uncomment and use
+       # this code (I have not tested it)
+#      SHOBJ_STATUS=supported
+#      SHLIB_STATUS=supported
+#
+#      SHOBJ_CFLAGS='+z'
+#      SHOBJ_LD='ld'
+#      SHOBJ_LDFLAGS='-b +s'
+#
+#      SHLIB_XLDFLAGS='+b $(libdir)'
+#      SHLIB_LIBSUFF='sl'
+#      SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)'      
+
+       ;;
+
+hpux10*-*gcc*)
+       # must use gcc; the bundled cc cannot compile PIC code
+       SHOBJ_CFLAGS='-fpic'
+       SHOBJ_LD='${CC}'
+       # if you have problems linking here, moving the `-Wl,+h,$@' from
+       # SHLIB_XLDFLAGS to SHOBJ_LDFLAGS has been reported to work
+       SHOBJ_LDFLAGS='-shared -Wl,-b -Wl,+s'
+
+       SHLIB_XLDFLAGS='-Wl,+h,$@ -Wl,+b,$(libdir)'
+       SHLIB_LIBSUFF='sl'
+       SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)'
+       ;;
+
+hpux10*)
+       SHOBJ_STATUS=unsupported
+       SHLIB_STATUS=unsupported
+
+       # If you are using the HP ANSI C compiler, you can uncomment and use
+       # this code (I have not tested it)
+#      SHOBJ_STATUS=supported
+#      SHLIB_STATUS=supported
+#
+#      SHOBJ_CFLAGS='+z'
+#      SHOBJ_LD='ld'
+#      SHOBJ_LDFLAGS='-b +s +h $@'
+#
+#      SHLIB_XLDFLAGS='+b $(libdir)'
+#      SHLIB_LIBSUFF='sl'
+#      SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)'      
+
+       ;;
+
+hpux11*-*gcc*)
+       # must use gcc; the bundled cc cannot compile PIC code
+       SHOBJ_CFLAGS='-fpic'
+       SHOBJ_LD='${CC}'
+#      SHOBJ_LDFLAGS='-shared -Wl,-b -Wl,-B,symbolic -Wl,+s -Wl,+std -Wl,+h,$@'
+       SHOBJ_LDFLAGS='-shared -fpic -Wl,-b -Wl,+s -Wl,+h,$@'
+
+       SHLIB_XLDFLAGS='-Wl,+b,$(libdir)'
+       SHLIB_LIBSUFF='sl'
+       SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)'
+       ;;
+
+hpux11*)
+       SHOBJ_STATUS=unsupported
+       SHLIB_STATUS=unsupported
+
+       # If you are using the HP ANSI C compiler, you can uncomment and use
+       # this code (I have not tested it)
+#      SHOBJ_STATUS=supported
+#      SHLIB_STATUS=supported
+#
+#      SHOBJ_CFLAGS='+z'
+#      SHOBJ_LD='ld'
+#      SHOBJ_LDFLAGS='-b +s +h $@'
+#
+#      SHLIB_XLDFLAGS='+b $(libdir)'
+#      SHLIB_LIBSUFF='sl'
+#      SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)'      
+
+       ;;
+
+sysv4*-*gcc*)
+       SHOBJ_CFLAGS=-shared
+       SHOBJ_LDFLAGS='-shared -h $@'
+       SHOBJ_LD='${CC}'
+
+       SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)'
+       ;;
+
+sysv4*)
+       SHOBJ_CFLAGS='-K PIC'
+       SHOBJ_LD=ld
+       SHOBJ_LDFLAGS='-dy -z text -G -h $@'
+
+       SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)'
+       ;;
+
+sco3.2v5*-*gcc*)
+       SHOBJ_CFLAGS='-fpic'            # DEFAULTS TO ELF
+       SHOBJ_LD='${CC}'
+       SHOBJ_LDFLAGS='-shared'
+
+       SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)'
+       ;;
+
+sco3.2v5*)
+       SHOBJ_CFLAGS='-K pic -b elf'
+       SHOBJ_LD=ld
+       SHOBJ_LDFLAGS='-G -b elf -dy -z text -h $@'
+
+       SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)'
+       ;;
+
+sysv5uw7*-*gcc*)
+       SHOBJ_CFLAGS='-fpic'
+       SHOBJ_LD='${CC}'
+       SHOBJ_LDFLAGS='-shared'
+
+       SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)'
+       ;;
+
+sysv5uw7*)
+       SHOBJ_CFLAGS='-K PIC'
+       SHOBJ_LD=ld
+       SHOBJ_LDFLAGS='-G -dy -z text -h $@'
+
+       SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)'
+       ;;
+
+sysv5UnixWare*-*gcc*)
+       SHOBJ_CFLAGS=-fpic
+       SHOBJ_LD='${CC}'
+       SHOBJ_LDFLAGS='-shared'
+
+       SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)'
+       ;;
+
+sysv5UnixWare*)
+       SHOBJ_CFLAGS='-K PIC'
+       SHOBJ_LD=ld
+       SHOBJ_LDFLAGS='-G -dy -z text -h $@'
+
+       SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)'
+       ;;
+
+sysv5OpenUNIX*-*gcc*)
+       SHOBJ_CFLAGS=-fpic
+       SHOBJ_LD='${CC}'
+       SHOBJ_LDFLAGS='-shared'
+
+       SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)'
+       ;;
+
+sysv5OpenUNIX*)
+       SHOBJ_CFLAGS='-K PIC'
+       SHOBJ_LD=ld
+       SHOBJ_LDFLAGS='-G -dy -z text -h $@'
+
+       SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)'
+       ;;
+
+dgux*-*gcc*)
+       SHOBJ_CFLAGS=-fpic
+       SHOBJ_LD='${CC}'
+       SHOBJ_LDFLAGS='-shared'
+
+       SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)'
+       ;;
+
+dgux*)
+       SHOBJ_CFLAGS='-K pic'
+       SHOBJ_LD=ld
+       SHOBJ_LDFLAGS='-G -dy -h $@'
+
+       SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)'
+       ;;
+
+msdos*)
+       SHOBJ_STATUS=unsupported
+       SHLIB_STATUS=unsupported
+       ;;
+
+cygwin*)
+       SHOBJ_LD='$(CC)'
+        SHOBJ_LDFLAGS='-shared -Wl,--enable-auto-import -Wl,--enable-auto-image-base -Wl,--export-all -Wl,--out-implib=$(@).a'
+        SHLIB_LIBPREF='cyg'
+        SHLIB_LIBSUFF='dll'
+        SHLIB_LIBVERSION='$(SHLIB_DLLVERSION).$(SHLIB_LIBSUFF)'
+        SHLIB_LIBS='$(TERMCAP_LIB)'
+
+       SHLIB_DOT=
+        # For official cygwin releases, DLLVERSION will be defined in the
+        # environment of configure, and will be incremented any time the API
+        # changes in a non-backwards compatible manner.  Otherwise, it is just
+        # SHLIB_MAJOR.
+        if [ -n "$DLLVERSION" ] ; then
+               SHLIB_DLLVERSION="$DLLVERSION"
+        fi
+       ;;
+
+#
+# Rely on correct gcc configuration for everything else
+#
+*-*gcc*)
+       SHOBJ_CFLAGS=-fpic
+       SHOBJ_LD='${CC}'
+       SHOBJ_LDFLAGS='-shared'
+
+       SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)'
+       ;;
+
+*)
+       SHOBJ_STATUS=unsupported
+       SHLIB_STATUS=unsupported
+       ;;
+
+esac
+
+echo SHOBJ_CC=\'"$SHOBJ_CC"\'
+echo SHOBJ_CFLAGS=\'"$SHOBJ_CFLAGS"\'
+echo SHOBJ_LD=\'"$SHOBJ_LD"\'
+echo SHOBJ_LDFLAGS=\'"$SHOBJ_LDFLAGS"\'
+echo SHOBJ_XLDFLAGS=\'"$SHOBJ_XLDFLAGS"\'
+echo SHOBJ_LIBS=\'"$SHOBJ_LIBS"\'
+
+echo SHLIB_XLDFLAGS=\'"$SHLIB_XLDFLAGS"\'
+echo SHLIB_LIBS=\'"$SHLIB_LIBS"\'
+
+echo SHLIB_DOT=\'"$SHLIB_DOT"\'
+
+echo SHLIB_LIBPREF=\'"$SHLIB_LIBPREF"\'
+echo SHLIB_LIBSUFF=\'"$SHLIB_LIBSUFF"\'
+
+echo SHLIB_LIBVERSION=\'"$SHLIB_LIBVERSION"\'
+echo SHLIB_DLLVERSION=\'"$SHLIB_DLLVERSION"\'
+
+echo SHOBJ_STATUS=\'"$SHOBJ_STATUS"\'
+echo SHLIB_STATUS=\'"$SHLIB_STATUS"\'
+
+exit 0
diff --git a/support/wcwidth.c b/support/wcwidth.c
new file mode 100644 (file)
index 0000000..ace9a3a
--- /dev/null
@@ -0,0 +1,236 @@
+/*
+ * This is an implementation of wcwidth() and wcswidth() as defined in
+ * "The Single UNIX Specification, Version 2, The Open Group, 1997"
+ * <http://www.UNIX-systems.org/online.html>
+ *
+ * Markus Kuhn -- 2001-09-08 -- public domain
+ */
+
+#include <wchar.h>
+
+struct interval {
+  unsigned short first;
+  unsigned short last;
+};
+
+/* auxiliary function for binary search in interval table */
+static int bisearch(wchar_t ucs, const struct interval *table, int max) {
+  int min = 0;
+  int mid;
+
+  if (ucs < table[0].first || ucs > table[max].last)
+    return 0;
+  while (max >= min) {
+    mid = (min + max) / 2;
+    if (ucs > table[mid].last)
+      min = mid + 1;
+    else if (ucs < table[mid].first)
+      max = mid - 1;
+    else
+      return 1;
+  }
+
+  return 0;
+}
+
+
+/* The following functions define the column width of an ISO 10646
+ * character as follows:
+ *
+ *    - The null character (U+0000) has a column width of 0.
+ *
+ *    - Other C0/C1 control characters and DEL will lead to a return
+ *      value of -1.
+ *
+ *    - Non-spacing and enclosing combining characters (general
+ *      category code Mn or Me in the Unicode database) have a
+ *      column width of 0.
+ *
+ *    - Other format characters (general category code Cf in the Unicode
+ *      database) and ZERO WIDTH SPACE (U+200B) have a column width of 0.
+ *
+ *    - Hangul Jamo medial vowels and final consonants (U+1160-U+11FF)
+ *      have a column width of 0.
+ *
+ *    - Spacing characters in the East Asian Wide (W) or East Asian
+ *      FullWidth (F) category as defined in Unicode Technical
+ *      Report #11 have a column width of 2.
+ *
+ *    - All remaining characters (including all printable
+ *      ISO 8859-1 and WGL4 characters, Unicode control characters,
+ *      etc.) have a column width of 1.
+ *
+ * This implementation assumes that wchar_t characters are encoded
+ * in ISO 10646.
+ */
+
+int wcwidth(wchar_t ucs)
+{
+  /* sorted list of non-overlapping intervals of non-spacing characters */
+  static const struct interval combining[] = {
+    { 0x0300, 0x034E }, { 0x0360, 0x0362 }, { 0x0483, 0x0486 },
+    { 0x0488, 0x0489 }, { 0x0591, 0x05A1 }, { 0x05A3, 0x05B9 },
+    { 0x05BB, 0x05BD }, { 0x05BF, 0x05BF }, { 0x05C1, 0x05C2 },
+    { 0x05C4, 0x05C4 }, { 0x064B, 0x0655 }, { 0x0670, 0x0670 },
+    { 0x06D6, 0x06E4 }, { 0x06E7, 0x06E8 }, { 0x06EA, 0x06ED },
+    { 0x070F, 0x070F }, { 0x0711, 0x0711 }, { 0x0730, 0x074A },
+    { 0x07A6, 0x07B0 }, { 0x0901, 0x0902 }, { 0x093C, 0x093C },
+    { 0x0941, 0x0948 }, { 0x094D, 0x094D }, { 0x0951, 0x0954 },
+    { 0x0962, 0x0963 }, { 0x0981, 0x0981 }, { 0x09BC, 0x09BC },
+    { 0x09C1, 0x09C4 }, { 0x09CD, 0x09CD }, { 0x09E2, 0x09E3 },
+    { 0x0A02, 0x0A02 }, { 0x0A3C, 0x0A3C }, { 0x0A41, 0x0A42 },
+    { 0x0A47, 0x0A48 }, { 0x0A4B, 0x0A4D }, { 0x0A70, 0x0A71 },
+    { 0x0A81, 0x0A82 }, { 0x0ABC, 0x0ABC }, { 0x0AC1, 0x0AC5 },
+    { 0x0AC7, 0x0AC8 }, { 0x0ACD, 0x0ACD }, { 0x0B01, 0x0B01 },
+    { 0x0B3C, 0x0B3C }, { 0x0B3F, 0x0B3F }, { 0x0B41, 0x0B43 },
+    { 0x0B4D, 0x0B4D }, { 0x0B56, 0x0B56 }, { 0x0B82, 0x0B82 },
+    { 0x0BC0, 0x0BC0 }, { 0x0BCD, 0x0BCD }, { 0x0C3E, 0x0C40 },
+    { 0x0C46, 0x0C48 }, { 0x0C4A, 0x0C4D }, { 0x0C55, 0x0C56 },
+    { 0x0CBF, 0x0CBF }, { 0x0CC6, 0x0CC6 }, { 0x0CCC, 0x0CCD },
+    { 0x0D41, 0x0D43 }, { 0x0D4D, 0x0D4D }, { 0x0DCA, 0x0DCA },
+    { 0x0DD2, 0x0DD4 }, { 0x0DD6, 0x0DD6 }, { 0x0E31, 0x0E31 },
+    { 0x0E34, 0x0E3A }, { 0x0E47, 0x0E4E }, { 0x0EB1, 0x0EB1 },
+    { 0x0EB4, 0x0EB9 }, { 0x0EBB, 0x0EBC }, { 0x0EC8, 0x0ECD },
+    { 0x0F18, 0x0F19 }, { 0x0F35, 0x0F35 }, { 0x0F37, 0x0F37 },
+    { 0x0F39, 0x0F39 }, { 0x0F71, 0x0F7E }, { 0x0F80, 0x0F84 },
+    { 0x0F86, 0x0F87 }, { 0x0F90, 0x0F97 }, { 0x0F99, 0x0FBC },
+    { 0x0FC6, 0x0FC6 }, { 0x102D, 0x1030 }, { 0x1032, 0x1032 },
+    { 0x1036, 0x1037 }, { 0x1039, 0x1039 }, { 0x1058, 0x1059 },
+    { 0x1160, 0x11FF }, { 0x17B7, 0x17BD }, { 0x17C6, 0x17C6 },
+    { 0x17C9, 0x17D3 }, { 0x180B, 0x180E }, { 0x18A9, 0x18A9 },
+    { 0x200B, 0x200F }, { 0x202A, 0x202E }, { 0x206A, 0x206F },
+    { 0x20D0, 0x20E3 }, { 0x302A, 0x302F }, { 0x3099, 0x309A },
+    { 0xFB1E, 0xFB1E }, { 0xFE20, 0xFE23 }, { 0xFEFF, 0xFEFF },
+    { 0xFFF9, 0xFFFB }
+  };
+
+  /* test for 8-bit control characters */
+  if (ucs == 0)
+    return 0;
+  if (ucs < 32 || (ucs >= 0x7f && ucs < 0xa0))
+    return -1;
+
+  /* binary search in table of non-spacing characters */
+  if (bisearch(ucs, combining,
+              sizeof(combining) / sizeof(struct interval) - 1))
+    return 0;
+
+  /* if we arrive here, ucs is not a combining or C0/C1 control character */
+
+  return 1 + 
+    (ucs >= 0x1100 &&
+     (ucs <= 0x115f ||                    /* Hangul Jamo init. consonants */
+      (ucs >= 0x2e80 && ucs <= 0xa4cf && (ucs & ~0x0011) != 0x300a &&
+       ucs != 0x303f) ||                  /* CJK ... Yi */
+      (ucs >= 0xac00 && ucs <= 0xd7a3) || /* Hangul Syllables */
+      (ucs >= 0xf900 && ucs <= 0xfaff) || /* CJK Compatibility Ideographs */
+      (ucs >= 0xfe30 && ucs <= 0xfe6f) || /* CJK Compatibility Forms */
+      (ucs >= 0xff00 && ucs <= 0xff5f) || /* Fullwidth Forms */
+      (ucs >= 0xffe0 && ucs <= 0xffe6) ||
+      (ucs >= 0x20000 && ucs <= 0x2ffff)));
+}
+
+
+int wcswidth(const wchar_t *pwcs, size_t n)
+{
+  int w, width = 0;
+
+  for (;*pwcs && n-- > 0; pwcs++)
+    if ((w = wcwidth(*pwcs)) < 0)
+      return -1;
+    else
+      width += w;
+
+  return width;
+}
+
+
+/*
+ * The following function is the same as wcwidth(), except that
+ * spacing characters in the East Asian Ambiguous (A) category as
+ * defined in Unicode Technical Report #11 have a column width of 2.
+ * This experimental variant might be useful for users of CJK legacy
+ * encodings who want to migrate to UCS. It is not otherwise
+ * recommended for general use.
+ */
+static int wcwidth_cjk(wchar_t ucs)
+{
+  /* sorted list of non-overlapping intervals of East Asian Ambiguous
+   * characters */
+  static const struct interval ambiguous[] = {
+    { 0x00A1, 0x00A1 }, { 0x00A4, 0x00A4 }, { 0x00A7, 0x00A8 },
+    { 0x00AA, 0x00AA }, { 0x00AD, 0x00AE }, { 0x00B0, 0x00B4 },
+    { 0x00B6, 0x00BA }, { 0x00BC, 0x00BF }, { 0x00C6, 0x00C6 },
+    { 0x00D0, 0x00D0 }, { 0x00D7, 0x00D8 }, { 0x00DE, 0x00E1 },
+    { 0x00E6, 0x00E6 }, { 0x00E8, 0x00EA }, { 0x00EC, 0x00ED },
+    { 0x00F0, 0x00F0 }, { 0x00F2, 0x00F3 }, { 0x00F7, 0x00FA },
+    { 0x00FC, 0x00FC }, { 0x00FE, 0x00FE }, { 0x0101, 0x0101 },
+    { 0x0111, 0x0111 }, { 0x0113, 0x0113 }, { 0x011B, 0x011B },
+    { 0x0126, 0x0127 }, { 0x012B, 0x012B }, { 0x0131, 0x0133 },
+    { 0x0138, 0x0138 }, { 0x013F, 0x0142 }, { 0x0144, 0x0144 },
+    { 0x0148, 0x014B }, { 0x014D, 0x014D }, { 0x0152, 0x0153 },
+    { 0x0166, 0x0167 }, { 0x016B, 0x016B }, { 0x01CE, 0x01CE },
+    { 0x01D0, 0x01D0 }, { 0x01D2, 0x01D2 }, { 0x01D4, 0x01D4 },
+    { 0x01D6, 0x01D6 }, { 0x01D8, 0x01D8 }, { 0x01DA, 0x01DA },
+    { 0x01DC, 0x01DC }, { 0x0251, 0x0251 }, { 0x0261, 0x0261 },
+    { 0x02C4, 0x02C4 }, { 0x02C7, 0x02C7 }, { 0x02C9, 0x02CB },
+    { 0x02CD, 0x02CD }, { 0x02D0, 0x02D0 }, { 0x02D8, 0x02DB },
+    { 0x02DD, 0x02DD }, { 0x02DF, 0x02DF }, { 0x0300, 0x034E },
+    { 0x0360, 0x0362 }, { 0x0391, 0x03A1 }, { 0x03A3, 0x03A9 },
+    { 0x03B1, 0x03C1 }, { 0x03C3, 0x03C9 }, { 0x0401, 0x0401 },
+    { 0x0410, 0x044F }, { 0x0451, 0x0451 }, { 0x2010, 0x2010 },
+    { 0x2013, 0x2016 }, { 0x2018, 0x2019 }, { 0x201C, 0x201D },
+    { 0x2020, 0x2022 }, { 0x2024, 0x2027 }, { 0x2030, 0x2030 },
+    { 0x2032, 0x2033 }, { 0x2035, 0x2035 }, { 0x203B, 0x203B },
+    { 0x203E, 0x203E }, { 0x2074, 0x2074 }, { 0x207F, 0x207F },
+    { 0x2081, 0x2084 }, { 0x20AC, 0x20AC }, { 0x2103, 0x2103 },
+    { 0x2105, 0x2105 }, { 0x2109, 0x2109 }, { 0x2113, 0x2113 },
+    { 0x2116, 0x2116 }, { 0x2121, 0x2122 }, { 0x2126, 0x2126 },
+    { 0x212B, 0x212B }, { 0x2153, 0x2155 }, { 0x215B, 0x215E },
+    { 0x2160, 0x216B }, { 0x2170, 0x2179 }, { 0x2190, 0x2199 },
+    { 0x21B8, 0x21B9 }, { 0x21D2, 0x21D2 }, { 0x21D4, 0x21D4 },
+    { 0x21E7, 0x21E7 }, { 0x2200, 0x2200 }, { 0x2202, 0x2203 },
+    { 0x2207, 0x2208 }, { 0x220B, 0x220B }, { 0x220F, 0x220F },
+    { 0x2211, 0x2211 }, { 0x2215, 0x2215 }, { 0x221A, 0x221A },
+    { 0x221D, 0x2220 }, { 0x2223, 0x2223 }, { 0x2225, 0x2225 },
+    { 0x2227, 0x222C }, { 0x222E, 0x222E }, { 0x2234, 0x2237 },
+    { 0x223C, 0x223D }, { 0x2248, 0x2248 }, { 0x224C, 0x224C },
+    { 0x2252, 0x2252 }, { 0x2260, 0x2261 }, { 0x2264, 0x2267 },
+    { 0x226A, 0x226B }, { 0x226E, 0x226F }, { 0x2282, 0x2283 },
+    { 0x2286, 0x2287 }, { 0x2295, 0x2295 }, { 0x2299, 0x2299 },
+    { 0x22A5, 0x22A5 }, { 0x22BF, 0x22BF }, { 0x2312, 0x2312 },
+    { 0x2329, 0x232A }, { 0x2460, 0x24BF }, { 0x24D0, 0x24E9 },
+    { 0x2500, 0x254B }, { 0x2550, 0x2574 }, { 0x2580, 0x258F },
+    { 0x2592, 0x2595 }, { 0x25A0, 0x25A1 }, { 0x25A3, 0x25A9 },
+    { 0x25B2, 0x25B3 }, { 0x25B6, 0x25B7 }, { 0x25BC, 0x25BD },
+    { 0x25C0, 0x25C1 }, { 0x25C6, 0x25C8 }, { 0x25CB, 0x25CB },
+    { 0x25CE, 0x25D1 }, { 0x25E2, 0x25E5 }, { 0x25EF, 0x25EF },
+    { 0x2605, 0x2606 }, { 0x2609, 0x2609 }, { 0x260E, 0x260F },
+    { 0x261C, 0x261C }, { 0x261E, 0x261E }, { 0x2640, 0x2640 },
+    { 0x2642, 0x2642 }, { 0x2660, 0x2661 }, { 0x2663, 0x2665 },
+    { 0x2667, 0x266A }, { 0x266C, 0x266D }, { 0x266F, 0x266F },
+    { 0x273D, 0x273D }, { 0x3008, 0x300B }, { 0x3014, 0x3015 },
+    { 0x3018, 0x301B }, { 0xFFFD, 0xFFFD }
+  };
+
+  /* binary search in table of non-spacing characters */
+  if (bisearch(ucs, ambiguous,
+              sizeof(ambiguous) / sizeof(struct interval) - 1))
+    return 2;
+
+  return wcwidth(ucs);
+}
+
+
+int wcswidth_cjk(const wchar_t *pwcs, size_t n)
+{
+  int w, width = 0;
+
+  for (;*pwcs && n-- > 0; pwcs++)
+    if ((w = wcwidth_cjk(*pwcs)) < 0)
+      return -1;
+    else
+      width += w;
+
+  return width;
+}
diff --git a/tcap.h b/tcap.h
new file mode 100644 (file)
index 0000000..58ab894
--- /dev/null
+++ b/tcap.h
@@ -0,0 +1,60 @@
+/* tcap.h -- termcap library functions and variables. */
+
+/* Copyright (C) 1996 Free Software Foundation, Inc.
+
+   This file contains the Readline Library (the Library), a set of
+   routines for providing Emacs style line input to programs that ask
+   for it.
+
+   The Library 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.
+
+   The Library is distributed in the hope that it will be useful, but
+   WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   General Public License for more details.
+
+   The GNU General Public License is often shipped with GNU software, and
+   is generally kept in a file called COPYING or LICENSE.  If you do not
+   have a copy of the license, write to the Free Software Foundation,
+   59 Temple Place, Suite 330, Boston, MA 02111 USA. */
+
+#if !defined (_RLTCAP_H_)
+#define _RLTCAP_H_
+
+#if defined (HAVE_CONFIG_H)
+#  include "config.h"
+#endif
+
+#if defined (HAVE_TERMCAP_H)
+#  if defined (__linux__) && !defined (SPEED_T_IN_SYS_TYPES)
+#    include "rltty.h"
+#  endif
+#  include <termcap.h>
+#else
+
+/* On Solaris2, sys/types.h #includes sys/reg.h, which #defines PC.
+   Unfortunately, PC is a global variable used by the termcap library. */
+#ifdef PC
+#  undef PC
+#endif
+
+extern char PC;
+extern char *UP, *BC;
+
+extern short ospeed;
+
+extern int tgetent ();
+extern int tgetflag ();
+extern int tgetnum ();
+extern char *tgetstr ();
+
+extern int tputs ();
+
+extern char *tgoto ();
+
+#endif /* HAVE_TERMCAP_H */
+
+#endif /* !_RLTCAP_H_ */
diff --git a/terminal.c b/terminal.c
new file mode 100644 (file)
index 0000000..547f6f5
--- /dev/null
@@ -0,0 +1,731 @@
+/* terminal.c -- controlling the terminal with termcap. */
+
+/* Copyright (C) 1996-2006 Free Software Foundation, Inc.
+
+   This file is part of the GNU Readline Library, a library for
+   reading lines of text with interactive input and history editing.
+
+   The GNU Readline Library 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.
+
+   The GNU Readline Library is distributed in the hope that it will be
+   useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+   of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   The GNU General Public License is often shipped with GNU software, and
+   is generally kept in a file called COPYING or LICENSE.  If you do not
+   have a copy of the license, write to the Free Software Foundation,
+   59 Temple Place, Suite 330, Boston, MA 02111 USA. */
+#define READLINE_LIBRARY
+
+#if defined (HAVE_CONFIG_H)
+#  include <config.h>
+#endif
+
+#include <sys/types.h>
+#include "posixstat.h"
+#include <fcntl.h>
+#if defined (HAVE_SYS_FILE_H)
+#  include <sys/file.h>
+#endif /* HAVE_SYS_FILE_H */
+
+#if defined (HAVE_UNISTD_H)
+#  include <unistd.h>
+#endif /* HAVE_UNISTD_H */
+
+#if defined (HAVE_STDLIB_H)
+#  include <stdlib.h>
+#else
+#  include "ansi_stdlib.h"
+#endif /* HAVE_STDLIB_H */
+
+#if defined (HAVE_LOCALE_H)
+#  include <locale.h>
+#endif
+
+#include <stdio.h>
+
+/* System-specific feature definitions and include files. */
+#include "rldefs.h"
+
+#if defined (GWINSZ_IN_SYS_IOCTL) && !defined (TIOCGWINSZ)
+#  include <sys/ioctl.h>
+#endif /* GWINSZ_IN_SYS_IOCTL && !TIOCGWINSZ */
+
+#include "rltty.h"
+#include "tcap.h"
+
+/* Some standard library routines. */
+#include "readline.h"
+#include "history.h"
+
+#include "rlprivate.h"
+#include "rlshell.h"
+#include "xmalloc.h"
+
+#if defined (__MINGW32__)
+#  include <windows.h>
+#  include <wincon.h>
+
+static void _win_get_screensize PARAMS((int *, int *));
+#endif
+
+#if defined (__EMX__)
+static void _emx_get_screensize PARAMS((int *, int *));
+#endif
+
+#define CUSTOM_REDISPLAY_FUNC() (rl_redisplay_function != rl_redisplay)
+#define CUSTOM_INPUT_FUNC() (rl_getc_function != rl_getc)
+
+/*  If the calling application sets this to a non-zero value, readline will
+    use the $LINES and $COLUMNS environment variables to set its idea of the
+    window size before interrogating the kernel. */
+int rl_prefer_env_winsize = 0;
+
+/* **************************************************************** */
+/*                                                                 */
+/*                     Terminal and Termcap                        */
+/*                                                                 */
+/* **************************************************************** */
+
+static char *term_buffer = (char *)NULL;
+static char *term_string_buffer = (char *)NULL;
+
+static int tcap_initialized;
+
+#if !defined (__linux__)
+#  if defined (__EMX__) || defined (NEED_EXTERN_PC)
+extern 
+#  endif /* __EMX__ || NEED_EXTERN_PC */
+char PC, *BC, *UP;
+#endif /* __linux__ */
+
+/* Some strings to control terminal actions.  These are output by tputs (). */
+char *_rl_term_clreol;
+char *_rl_term_clrpag;
+char *_rl_term_cr;
+char *_rl_term_backspace;
+char *_rl_term_goto;
+char *_rl_term_pc;
+
+/* Non-zero if we determine that the terminal can do character insertion. */
+int _rl_terminal_can_insert = 0;
+
+/* How to insert characters. */
+char *_rl_term_im;
+char *_rl_term_ei;
+char *_rl_term_ic;
+char *_rl_term_ip;
+char *_rl_term_IC;
+
+/* How to delete characters. */
+char *_rl_term_dc;
+char *_rl_term_DC;
+
+char *_rl_term_forward_char;
+
+/* How to go up a line. */
+char *_rl_term_up;
+
+/* A visible bell; char if the terminal can be made to flash the screen. */
+static char *_rl_visible_bell;
+
+/* Non-zero means the terminal can auto-wrap lines. */
+int _rl_term_autowrap = -1;
+
+/* Non-zero means that this terminal has a meta key. */
+static int term_has_meta;
+
+/* The sequences to write to turn on and off the meta key, if this
+   terminal has one. */
+static char *_rl_term_mm;
+static char *_rl_term_mo;
+
+/* The key sequences output by the arrow keys, if this terminal has any. */
+static char *_rl_term_ku;
+static char *_rl_term_kd;
+static char *_rl_term_kr;
+static char *_rl_term_kl;
+
+/* How to initialize and reset the arrow keys, if this terminal has any. */
+static char *_rl_term_ks;
+static char *_rl_term_ke;
+
+/* The key sequences sent by the Home and End keys, if any. */
+static char *_rl_term_kh;
+static char *_rl_term_kH;
+static char *_rl_term_at7;     /* @7 */
+
+/* Delete key */
+static char *_rl_term_kD;
+
+/* Insert key */
+static char *_rl_term_kI;
+
+/* Cursor control */
+static char *_rl_term_vs;      /* very visible */
+static char *_rl_term_ve;      /* normal */
+
+static void bind_termcap_arrow_keys PARAMS((Keymap));
+
+/* Variables that hold the screen dimensions, used by the display code. */
+int _rl_screenwidth, _rl_screenheight, _rl_screenchars;
+
+/* Non-zero means the user wants to enable the keypad. */
+int _rl_enable_keypad;
+
+/* Non-zero means the user wants to enable a meta key. */
+int _rl_enable_meta = 1;
+
+#if defined (__EMX__)
+static void
+_emx_get_screensize (swp, shp)
+     int *swp, *shp;
+{
+  int sz[2];
+
+  _scrsize (sz);
+
+  if (swp)
+    *swp = sz[0];
+  if (shp)
+    *shp = sz[1];
+}
+#endif
+
+#if defined (__MINGW32__)
+static void
+_win_get_screensize (swp, shp)
+     int *swp, *shp;
+{
+  HANDLE hConOut;
+  CONSOLE_SCREEN_BUFFER_INFO scr;
+
+  hConOut = GetStdHandle (STD_OUTPUT_HANDLE);
+  if (hConOut != INVALID_HANDLE_VALUE)
+    {
+      if (GetConsoleScreenBufferInfo (hConOut, &scr))
+       {
+         *swp = scr.dwSize.X;
+         *shp = scr.srWindow.Bottom - scr.srWindow.Top + 1;
+       }
+    }
+}
+#endif
+
+/* Get readline's idea of the screen size.  TTY is a file descriptor open
+   to the terminal.  If IGNORE_ENV is true, we do not pay attention to the
+   values of $LINES and $COLUMNS.  The tests for TERM_STRING_BUFFER being
+   non-null serve to check whether or not we have initialized termcap. */
+void
+_rl_get_screen_size (tty, ignore_env)
+     int tty, ignore_env;
+{
+  char *ss;
+#if defined (TIOCGWINSZ)
+  struct winsize window_size;
+#endif /* TIOCGWINSZ */
+  int wr, wc;
+
+  wr = wc = -1;
+#if defined (TIOCGWINSZ)
+  if (ioctl (tty, TIOCGWINSZ, &window_size) == 0)
+    {
+      wc = (int) window_size.ws_col;
+      wr = (int) window_size.ws_row;
+    }
+#endif /* TIOCGWINSZ */
+
+#if defined (__EMX__)
+  _emx_get_screensize (&wc, &wr);
+#elif defined (__MINGW32__)
+  _win_get_screensize (&wc, &wr);
+#endif
+
+  if (ignore_env || rl_prefer_env_winsize == 0)
+    {
+      _rl_screenwidth = wc;
+      _rl_screenheight = wr;
+    }
+  else
+    _rl_screenwidth = _rl_screenheight = -1;
+
+  /* Environment variable COLUMNS overrides setting of "co" if IGNORE_ENV
+     is unset.  If we prefer the environment, check it first before
+     assigning the value returned by the kernel. */
+  if (_rl_screenwidth <= 0)
+    {
+      if (ignore_env == 0 && (ss = sh_get_env_value ("COLUMNS")))
+       _rl_screenwidth = atoi (ss);
+
+      if (_rl_screenwidth <= 0)
+        _rl_screenwidth = wc;
+
+#if !defined (__DJGPP__)
+      if (_rl_screenwidth <= 0 && term_string_buffer)
+       _rl_screenwidth = tgetnum ("co");
+#endif
+    }
+
+  /* Environment variable LINES overrides setting of "li" if IGNORE_ENV
+     is unset. */
+  if (_rl_screenheight <= 0)
+    {
+      if (ignore_env == 0 && (ss = sh_get_env_value ("LINES")))
+       _rl_screenheight = atoi (ss);
+
+      if (_rl_screenheight <= 0)
+        _rl_screenheight = wr;
+
+#if !defined (__DJGPP__)
+      if (_rl_screenheight <= 0 && term_string_buffer)
+       _rl_screenheight = tgetnum ("li");
+#endif
+    }
+
+  /* If all else fails, default to 80x24 terminal. */
+  if (_rl_screenwidth <= 1)
+    _rl_screenwidth = 80;
+
+  if (_rl_screenheight <= 0)
+    _rl_screenheight = 24;
+
+  /* If we're being compiled as part of bash, set the environment
+     variables $LINES and $COLUMNS to new values.  Otherwise, just
+     do a pair of putenv () or setenv () calls. */
+  sh_set_lines_and_columns (_rl_screenheight, _rl_screenwidth);
+
+  if (_rl_term_autowrap == 0)
+    _rl_screenwidth--;
+
+  _rl_screenchars = _rl_screenwidth * _rl_screenheight;
+}
+
+void
+_rl_set_screen_size (rows, cols)
+     int rows, cols;
+{
+  if (_rl_term_autowrap == -1)
+    _rl_init_terminal_io (rl_terminal_name);
+
+  if (rows > 0)
+    _rl_screenheight = rows;
+  if (cols > 0)
+    {
+      _rl_screenwidth = cols;
+      if (_rl_term_autowrap == 0)
+       _rl_screenwidth--;
+    }
+
+  if (rows > 0 || cols > 0)
+    _rl_screenchars = _rl_screenwidth * _rl_screenheight;
+}
+
+void
+rl_set_screen_size (rows, cols)
+     int rows, cols;
+{
+  _rl_set_screen_size (rows, cols);
+}
+
+void
+rl_get_screen_size (rows, cols)
+     int *rows, *cols;
+{
+  if (rows)
+    *rows = _rl_screenheight;
+  if (cols)
+    *cols = _rl_screenwidth;
+}
+
+void
+rl_reset_screen_size ()
+{
+  _rl_get_screen_size (fileno (rl_instream), 0);
+}
+     
+void
+rl_resize_terminal ()
+{
+  if (readline_echoing_p)
+    {
+      _rl_get_screen_size (fileno (rl_instream), 1);
+      if (CUSTOM_REDISPLAY_FUNC ())
+       rl_forced_update_display ();
+      else
+       _rl_redisplay_after_sigwinch ();
+    }
+}
+
+struct _tc_string {
+     const char *tc_var;
+     char **tc_value;
+};
+
+/* This should be kept sorted, just in case we decide to change the
+   search algorithm to something smarter. */
+static struct _tc_string tc_strings[] =
+{
+  { "@7", &_rl_term_at7 },
+  { "DC", &_rl_term_DC },
+  { "IC", &_rl_term_IC },
+  { "ce", &_rl_term_clreol },
+  { "cl", &_rl_term_clrpag },
+  { "cr", &_rl_term_cr },
+  { "dc", &_rl_term_dc },
+  { "ei", &_rl_term_ei },
+  { "ic", &_rl_term_ic },
+  { "im", &_rl_term_im },
+  { "kD", &_rl_term_kD },      /* delete */
+  { "kH", &_rl_term_kH },      /* home down ?? */
+  { "kI", &_rl_term_kI },      /* insert */
+  { "kd", &_rl_term_kd },
+  { "ke", &_rl_term_ke },      /* end keypad mode */
+  { "kh", &_rl_term_kh },      /* home */
+  { "kl", &_rl_term_kl },
+  { "kr", &_rl_term_kr },
+  { "ks", &_rl_term_ks },      /* start keypad mode */
+  { "ku", &_rl_term_ku },
+  { "le", &_rl_term_backspace },
+  { "mm", &_rl_term_mm },
+  { "mo", &_rl_term_mo },
+  { "nd", &_rl_term_forward_char },
+  { "pc", &_rl_term_pc },
+  { "up", &_rl_term_up },
+  { "vb", &_rl_visible_bell },
+  { "vs", &_rl_term_vs },
+  { "ve", &_rl_term_ve },
+};
+
+#define NUM_TC_STRINGS (sizeof (tc_strings) / sizeof (struct _tc_string))
+
+/* Read the desired terminal capability strings into BP.  The capabilities
+   are described in the TC_STRINGS table. */
+static void
+get_term_capabilities (bp)
+     char **bp;
+{
+#if !defined (__DJGPP__)       /* XXX - doesn't DJGPP have a termcap library? */
+  register int i;
+
+  for (i = 0; i < NUM_TC_STRINGS; i++)
+    *(tc_strings[i].tc_value) = tgetstr ((char *)tc_strings[i].tc_var, bp);
+#endif
+  tcap_initialized = 1;
+}
+
+int
+_rl_init_terminal_io (terminal_name)
+     const char *terminal_name;
+{
+  const char *term;
+  char *buffer;
+  int tty, tgetent_ret;
+
+  term = terminal_name ? terminal_name : sh_get_env_value ("TERM");
+  _rl_term_clrpag = _rl_term_cr = _rl_term_clreol = (char *)NULL;
+  tty = rl_instream ? fileno (rl_instream) : 0;
+
+  if (term == 0)
+    term = "dumb";
+
+  /* I've separated this out for later work on not calling tgetent at all
+     if the calling application has supplied a custom redisplay function,
+     (and possibly if the application has supplied a custom input function). */
+  if (CUSTOM_REDISPLAY_FUNC())
+    {
+      tgetent_ret = -1;
+    }
+  else
+    {
+      if (term_string_buffer == 0)
+       term_string_buffer = (char *)xmalloc(2032);
+
+      if (term_buffer == 0)
+       term_buffer = (char *)xmalloc(4080);
+
+      buffer = term_string_buffer;
+
+      tgetent_ret = tgetent (term_buffer, term);
+    }
+
+  if (tgetent_ret <= 0)
+    {
+      FREE (term_string_buffer);
+      FREE (term_buffer);
+      buffer = term_buffer = term_string_buffer = (char *)NULL;
+
+      _rl_term_autowrap = 0;   /* used by _rl_get_screen_size */
+
+      /* Allow calling application to set default height and width, using
+        rl_set_screen_size */
+      if (_rl_screenwidth <= 0 || _rl_screenheight <= 0)
+       {
+#if defined (__EMX__)
+         _emx_get_screensize (&_rl_screenwidth, &_rl_screenheight);
+         _rl_screenwidth--;
+#else /* !__EMX__ */
+         _rl_get_screen_size (tty, 0);
+#endif /* !__EMX__ */
+       }
+
+      /* Defaults. */
+      if (_rl_screenwidth <= 0 || _rl_screenheight <= 0)
+        {
+         _rl_screenwidth = 79;
+         _rl_screenheight = 24;
+        }
+
+      /* Everything below here is used by the redisplay code (tputs). */
+      _rl_screenchars = _rl_screenwidth * _rl_screenheight;
+      _rl_term_cr = "\r";
+      _rl_term_im = _rl_term_ei = _rl_term_ic = _rl_term_IC = (char *)NULL;
+      _rl_term_up = _rl_term_dc = _rl_term_DC = _rl_visible_bell = (char *)NULL;
+      _rl_term_ku = _rl_term_kd = _rl_term_kl = _rl_term_kr = (char *)NULL;
+      _rl_term_kh = _rl_term_kH = _rl_term_kI = _rl_term_kD = (char *)NULL;
+      _rl_term_ks = _rl_term_ke = _rl_term_at7 = (char *)NULL;
+      _rl_term_mm = _rl_term_mo = (char *)NULL;
+      _rl_term_ve = _rl_term_vs = (char *)NULL;
+      _rl_term_forward_char = (char *)NULL;
+      _rl_terminal_can_insert = term_has_meta = 0;
+
+      /* Reasonable defaults for tgoto().  Readline currently only uses
+         tgoto if _rl_term_IC or _rl_term_DC is defined, but just in case we
+         change that later... */
+      PC = '\0';
+      BC = _rl_term_backspace = "\b";
+      UP = _rl_term_up;
+
+      return 0;
+    }
+
+  get_term_capabilities (&buffer);
+
+  /* Set up the variables that the termcap library expects the application
+     to provide. */
+  PC = _rl_term_pc ? *_rl_term_pc : 0;
+  BC = _rl_term_backspace;
+  UP = _rl_term_up;
+
+  if (!_rl_term_cr)
+    _rl_term_cr = "\r";
+
+  _rl_term_autowrap = tgetflag ("am") && tgetflag ("xn");
+
+  /* Allow calling application to set default height and width, using
+     rl_set_screen_size */
+  if (_rl_screenwidth <= 0 || _rl_screenheight <= 0)
+    _rl_get_screen_size (tty, 0);
+
+  /* "An application program can assume that the terminal can do
+      character insertion if *any one of* the capabilities `IC',
+      `im', `ic' or `ip' is provided."  But we can't do anything if
+      only `ip' is provided, so... */
+  _rl_terminal_can_insert = (_rl_term_IC || _rl_term_im || _rl_term_ic);
+
+  /* Check to see if this terminal has a meta key and clear the capability
+     variables if there is none. */
+  term_has_meta = (tgetflag ("km") || tgetflag ("MT"));
+  if (!term_has_meta)
+    _rl_term_mm = _rl_term_mo = (char *)NULL;
+
+  /* Attempt to find and bind the arrow keys.  Do not override already
+     bound keys in an overzealous attempt, however. */
+
+  bind_termcap_arrow_keys (emacs_standard_keymap);
+
+#if defined (VI_MODE)
+  bind_termcap_arrow_keys (vi_movement_keymap);
+  bind_termcap_arrow_keys (vi_insertion_keymap);
+#endif /* VI_MODE */
+
+  return 0;
+}
+
+/* Bind the arrow key sequences from the termcap description in MAP. */
+static void
+bind_termcap_arrow_keys (map)
+     Keymap map;
+{
+  Keymap xkeymap;
+
+  xkeymap = _rl_keymap;
+  _rl_keymap = map;
+
+  rl_bind_keyseq_if_unbound (_rl_term_ku, rl_get_previous_history);
+  rl_bind_keyseq_if_unbound (_rl_term_kd, rl_get_next_history);
+  rl_bind_keyseq_if_unbound (_rl_term_kr, rl_forward_char);
+  rl_bind_keyseq_if_unbound (_rl_term_kl, rl_backward_char);
+
+  rl_bind_keyseq_if_unbound (_rl_term_kh, rl_beg_of_line);     /* Home */
+  rl_bind_keyseq_if_unbound (_rl_term_at7, rl_end_of_line);    /* End */
+
+  rl_bind_keyseq_if_unbound (_rl_term_kD, rl_delete);
+
+  _rl_keymap = xkeymap;
+}
+
+char *
+rl_get_termcap (cap)
+     const char *cap;
+{
+  register int i;
+
+  if (tcap_initialized == 0)
+    return ((char *)NULL);
+  for (i = 0; i < NUM_TC_STRINGS; i++)
+    {
+      if (tc_strings[i].tc_var[0] == cap[0] && strcmp (tc_strings[i].tc_var, cap) == 0)
+        return *(tc_strings[i].tc_value);
+    }
+  return ((char *)NULL);
+}
+
+/* Re-initialize the terminal considering that the TERM/TERMCAP variable
+   has changed. */
+int
+rl_reset_terminal (terminal_name)
+     const char *terminal_name;
+{
+  _rl_screenwidth = _rl_screenheight = 0;
+  _rl_init_terminal_io (terminal_name);
+  return 0;
+}
+
+/* A function for the use of tputs () */
+#ifdef _MINIX
+void
+_rl_output_character_function (c)
+     int c;
+{
+  putc (c, _rl_out_stream);
+}
+#else /* !_MINIX */
+int
+_rl_output_character_function (c)
+     int c;
+{
+  return putc (c, _rl_out_stream);
+}
+#endif /* !_MINIX */
+
+/* Write COUNT characters from STRING to the output stream. */
+void
+_rl_output_some_chars (string, count)
+     const char *string;
+     int count;
+{
+  fwrite (string, 1, count, _rl_out_stream);
+}
+
+/* Move the cursor back. */
+int
+_rl_backspace (count)
+     int count;
+{
+  register int i;
+
+  if (_rl_term_backspace)
+    for (i = 0; i < count; i++)
+      tputs (_rl_term_backspace, 1, _rl_output_character_function);
+  else
+    for (i = 0; i < count; i++)
+      putc ('\b', _rl_out_stream);
+  return 0;
+}
+
+/* Move to the start of the next line. */
+int
+rl_crlf ()
+{
+#if defined (NEW_TTY_DRIVER)
+  if (_rl_term_cr)
+    tputs (_rl_term_cr, 1, _rl_output_character_function);
+#endif /* NEW_TTY_DRIVER */
+  putc ('\n', _rl_out_stream);
+  return 0;
+}
+
+/* Ring the terminal bell. */
+int
+rl_ding ()
+{
+  if (readline_echoing_p)
+    {
+      switch (_rl_bell_preference)
+        {
+       case NO_BELL:
+       default:
+         break;
+       case VISIBLE_BELL:
+         if (_rl_visible_bell)
+           {
+             tputs (_rl_visible_bell, 1, _rl_output_character_function);
+             break;
+           }
+         /* FALLTHROUGH */
+       case AUDIBLE_BELL:
+         fprintf (stderr, "\007");
+         fflush (stderr);
+         break;
+        }
+      return (0);
+    }
+  return (-1);
+}
+
+/* **************************************************************** */
+/*                                                                 */
+/*             Controlling the Meta Key and Keypad                 */
+/*                                                                 */
+/* **************************************************************** */
+
+void
+_rl_enable_meta_key ()
+{
+#if !defined (__DJGPP__)
+  if (term_has_meta && _rl_term_mm)
+    tputs (_rl_term_mm, 1, _rl_output_character_function);
+#endif
+}
+
+void
+_rl_control_keypad (on)
+     int on;
+{
+#if !defined (__DJGPP__)
+  if (on && _rl_term_ks)
+    tputs (_rl_term_ks, 1, _rl_output_character_function);
+  else if (!on && _rl_term_ke)
+    tputs (_rl_term_ke, 1, _rl_output_character_function);
+#endif
+}
+
+/* **************************************************************** */
+/*                                                                 */
+/*                     Controlling the Cursor                      */
+/*                                                                 */
+/* **************************************************************** */
+
+/* Set the cursor appropriately depending on IM, which is one of the
+   insert modes (insert or overwrite).  Insert mode gets the normal
+   cursor.  Overwrite mode gets a very visible cursor.  Only does
+   anything if we have both capabilities. */
+void
+_rl_set_cursor (im, force)
+     int im, force;
+{
+  if (_rl_term_ve && _rl_term_vs)
+    {
+      if (force || im != rl_insert_mode)
+       {
+         if (im == RL_IM_OVERWRITE)
+           tputs (_rl_term_vs, 1, _rl_output_character_function);
+         else
+           tputs (_rl_term_ve, 1, _rl_output_character_function);
+       }
+    }
+}
diff --git a/text.c b/text.c
new file mode 100644 (file)
index 0000000..399a48c
--- /dev/null
+++ b/text.c
@@ -0,0 +1,1637 @@
+/* text.c -- text handling commands for readline. */
+
+/* Copyright (C) 1987-2005 Free Software Foundation, Inc.
+
+   This file is part of the GNU Readline Library, a library for
+   reading lines of text with interactive input and history editing.
+
+   The GNU Readline Library 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.
+
+   The GNU Readline Library is distributed in the hope that it will be
+   useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+   of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   The GNU General Public License is often shipped with GNU software, and
+   is generally kept in a file called COPYING or LICENSE.  If you do not
+   have a copy of the license, write to the Free Software Foundation,
+   59 Temple Place, Suite 330, Boston, MA 02111 USA. */
+#define READLINE_LIBRARY
+
+#if defined (HAVE_CONFIG_H)
+#  include <config.h>
+#endif
+
+#if defined (HAVE_UNISTD_H)
+#  include <unistd.h>
+#endif /* HAVE_UNISTD_H */
+
+#if defined (HAVE_STDLIB_H)
+#  include <stdlib.h>
+#else
+#  include "ansi_stdlib.h"
+#endif /* HAVE_STDLIB_H */
+
+#if defined (HAVE_LOCALE_H)
+#  include <locale.h>
+#endif
+
+#include <stdio.h>
+
+/* System-specific feature definitions and include files. */
+#include "rldefs.h"
+#include "rlmbutil.h"
+
+#if defined (__EMX__)
+#  define INCL_DOSPROCESS
+#  include <os2.h>
+#endif /* __EMX__ */
+
+/* Some standard library routines. */
+#include "readline.h"
+#include "history.h"
+
+#include "rlprivate.h"
+#include "rlshell.h"
+#include "xmalloc.h"
+
+/* Forward declarations. */
+static int rl_change_case PARAMS((int, int));
+static int _rl_char_search PARAMS((int, int, int));
+
+#if defined (READLINE_CALLBACKS)
+static int _rl_insert_next_callback PARAMS((_rl_callback_generic_arg *));
+static int _rl_char_search_callback PARAMS((_rl_callback_generic_arg *));
+#endif
+
+/* **************************************************************** */
+/*                                                                 */
+/*                     Insert and Delete                           */
+/*                                                                 */
+/* **************************************************************** */
+
+/* Insert a string of text into the line at point.  This is the only
+   way that you should do insertion.  _rl_insert_char () calls this
+   function.  Returns the number of characters inserted. */
+int
+rl_insert_text (string)
+     const char *string;
+{
+  register int i, l;
+
+  l = (string && *string) ? strlen (string) : 0;
+  if (l == 0)
+    return 0;
+
+  if (rl_end + l >= rl_line_buffer_len)
+    rl_extend_line_buffer (rl_end + l);
+
+  for (i = rl_end; i >= rl_point; i--)
+    rl_line_buffer[i + l] = rl_line_buffer[i];
+  strncpy (rl_line_buffer + rl_point, string, l);
+
+  /* Remember how to undo this if we aren't undoing something. */
+  if (_rl_doing_an_undo == 0)
+    {
+      /* If possible and desirable, concatenate the undos. */
+      if ((l == 1) &&
+         rl_undo_list &&
+         (rl_undo_list->what == UNDO_INSERT) &&
+         (rl_undo_list->end == rl_point) &&
+         (rl_undo_list->end - rl_undo_list->start < 20))
+       rl_undo_list->end++;
+      else
+       rl_add_undo (UNDO_INSERT, rl_point, rl_point + l, (char *)NULL);
+    }
+  rl_point += l;
+  rl_end += l;
+  rl_line_buffer[rl_end] = '\0';
+  return l;
+}
+
+/* Delete the string between FROM and TO.  FROM is inclusive, TO is not.
+   Returns the number of characters deleted. */
+int
+rl_delete_text (from, to)
+     int from, to;
+{
+  register char *text;
+  register int diff, i;
+
+  /* Fix it if the caller is confused. */
+  if (from > to)
+    SWAP (from, to);
+
+  /* fix boundaries */
+  if (to > rl_end)
+    {
+      to = rl_end;
+      if (from > to)
+       from = to;
+    }
+  if (from < 0)
+    from = 0;
+
+  text = rl_copy_text (from, to);
+
+  /* Some versions of strncpy() can't handle overlapping arguments. */
+  diff = to - from;
+  for (i = from; i < rl_end - diff; i++)
+    rl_line_buffer[i] = rl_line_buffer[i + diff];
+
+  /* Remember how to undo this delete. */
+  if (_rl_doing_an_undo == 0)
+    rl_add_undo (UNDO_DELETE, from, to, text);
+  else
+    free (text);
+
+  rl_end -= diff;
+  rl_line_buffer[rl_end] = '\0';
+  return (diff);
+}
+
+/* Fix up point so that it is within the line boundaries after killing
+   text.  If FIX_MARK_TOO is non-zero, the mark is forced within line
+   boundaries also. */
+
+#define _RL_FIX_POINT(x) \
+       do { \
+       if (x > rl_end) \
+         x = rl_end; \
+       else if (x < 0) \
+         x = 0; \
+       } while (0)
+
+void
+_rl_fix_point (fix_mark_too)
+     int fix_mark_too;
+{
+  _RL_FIX_POINT (rl_point);
+  if (fix_mark_too)
+    _RL_FIX_POINT (rl_mark);
+}
+#undef _RL_FIX_POINT
+
+/* Replace the contents of the line buffer between START and END with
+   TEXT.  The operation is undoable.  To replace the entire line in an
+   undoable mode, use _rl_replace_text(text, 0, rl_end); */
+int
+_rl_replace_text (text, start, end)
+     const char *text;
+     int start, end;
+{
+  int n;
+
+  rl_begin_undo_group ();
+  rl_delete_text (start, end + 1);
+  rl_point = start;
+  n = rl_insert_text (text);
+  rl_end_undo_group ();
+
+  return n;
+}
+
+/* Replace the current line buffer contents with TEXT.  If CLEAR_UNDO is
+   non-zero, we free the current undo list. */
+void
+rl_replace_line (text, clear_undo)
+     const char *text;
+     int clear_undo;
+{
+  int len;
+
+  len = strlen (text);
+  if (len >= rl_line_buffer_len)
+    rl_extend_line_buffer (len);
+  strcpy (rl_line_buffer, text);
+  rl_end = len;
+
+  if (clear_undo)
+    rl_free_undo_list ();
+
+  _rl_fix_point (1);
+}
+
+/* **************************************************************** */
+/*                                                                 */
+/*                     Readline character functions                */
+/*                                                                 */
+/* **************************************************************** */
+
+/* This is not a gap editor, just a stupid line input routine.  No hair
+   is involved in writing any of the functions, and none should be. */
+
+/* Note that:
+
+   rl_end is the place in the string that we would place '\0';
+   i.e., it is always safe to place '\0' there.
+
+   rl_point is the place in the string where the cursor is.  Sometimes
+   this is the same as rl_end.
+
+   Any command that is called interactively receives two arguments.
+   The first is a count: the numeric arg pased to this command.
+   The second is the key which invoked this command.
+*/
+
+/* **************************************************************** */
+/*                                                                 */
+/*                     Movement Commands                           */
+/*                                                                 */
+/* **************************************************************** */
+
+/* Note that if you `optimize' the display for these functions, you cannot
+   use said functions in other functions which do not do optimizing display.
+   I.e., you will have to update the data base for rl_redisplay, and you
+   might as well let rl_redisplay do that job. */
+
+/* Move forward COUNT bytes. */
+int
+rl_forward_byte (count, key)
+     int count, key;
+{
+  if (count < 0)
+    return (rl_backward_byte (-count, key));
+
+  if (count > 0)
+    {
+      int end = rl_point + count;
+#if defined (VI_MODE)
+      int lend = rl_end > 0 ? rl_end - (rl_editing_mode == vi_mode) : rl_end;
+#else
+      int lend = rl_end;
+#endif
+
+      if (end > lend)
+       {
+         rl_point = lend;
+         rl_ding ();
+       }
+      else
+       rl_point = end;
+    }
+
+  if (rl_end < 0)
+    rl_end = 0;
+
+  return 0;
+}
+
+#if defined (HANDLE_MULTIBYTE)
+/* Move forward COUNT characters. */
+int
+rl_forward_char (count, key)
+     int count, key;
+{
+  int point;
+
+  if (MB_CUR_MAX == 1 || rl_byte_oriented)
+    return (rl_forward_byte (count, key));
+
+  if (count < 0)
+    return (rl_backward_char (-count, key));
+
+  if (count > 0)
+    {
+      point = _rl_find_next_mbchar (rl_line_buffer, rl_point, count, MB_FIND_NONZERO);
+
+#if defined (VI_MODE)
+      if (rl_end <= point && rl_editing_mode == vi_mode)
+       point = _rl_find_prev_mbchar (rl_line_buffer, rl_end, MB_FIND_NONZERO);
+#endif
+
+      if (rl_point == point)
+       rl_ding ();
+
+      rl_point = point;
+
+      if (rl_end < 0)
+       rl_end = 0;
+    }
+
+  return 0;
+}
+#else /* !HANDLE_MULTIBYTE */
+int
+rl_forward_char (count, key)
+     int count, key;
+{
+  return (rl_forward_byte (count, key));
+}
+#endif /* !HANDLE_MULTIBYTE */
+  
+/* Backwards compatibility. */
+int
+rl_forward (count, key)
+     int count, key;
+{
+  return (rl_forward_char (count, key));
+}
+
+/* Move backward COUNT bytes. */
+int
+rl_backward_byte (count, key)
+     int count, key;
+{
+  if (count < 0)
+    return (rl_forward_byte (-count, key));
+
+  if (count > 0)
+    {
+      if (rl_point < count)
+       {
+         rl_point = 0;
+         rl_ding ();
+       }
+      else
+       rl_point -= count;
+    }
+
+  if (rl_point < 0)
+    rl_point = 0;
+
+  return 0;
+}
+
+#if defined (HANDLE_MULTIBYTE)
+/* Move backward COUNT characters. */
+int
+rl_backward_char (count, key)
+     int count, key;
+{
+  int point;
+
+  if (MB_CUR_MAX == 1 || rl_byte_oriented)
+    return (rl_backward_byte (count, key));
+
+  if (count < 0)
+    return (rl_forward_char (-count, key));
+
+  if (count > 0)
+    {
+      point = rl_point;
+
+      while (count > 0 && point > 0)
+       {
+         point = _rl_find_prev_mbchar (rl_line_buffer, point, MB_FIND_NONZERO);
+         count--;
+       }
+      if (count > 0)
+       {
+         rl_point = 0;
+         rl_ding ();
+       }
+      else
+        rl_point = point;
+    }
+
+  return 0;
+}
+#else
+int
+rl_backward_char (count, key)
+     int count, key;
+{
+  return (rl_backward_byte (count, key));
+}
+#endif
+
+/* Backwards compatibility. */
+int
+rl_backward (count, key)
+     int count, key;
+{
+  return (rl_backward_char (count, key));
+}
+
+/* Move to the beginning of the line. */
+int
+rl_beg_of_line (count, key)
+     int count, key;
+{
+  rl_point = 0;
+  return 0;
+}
+
+/* Move to the end of the line. */
+int
+rl_end_of_line (count, key)
+     int count, key;
+{
+  rl_point = rl_end;
+  return 0;
+}
+
+/* Move forward a word.  We do what Emacs does.  Handles multibyte chars. */
+int
+rl_forward_word (count, key)
+     int count, key;
+{
+  int c;
+
+  if (count < 0)
+    return (rl_backward_word (-count, key));
+
+  while (count)
+    {
+      if (rl_point == rl_end)
+       return 0;
+
+      /* If we are not in a word, move forward until we are in one.
+        Then, move forward until we hit a non-alphabetic character. */
+      c = _rl_char_value (rl_line_buffer, rl_point);
+
+      if (_rl_walphabetic (c) == 0)
+       {
+         rl_point = MB_NEXTCHAR (rl_line_buffer, rl_point, 1, MB_FIND_NONZERO);
+         while (rl_point < rl_end)
+           {
+             c = _rl_char_value (rl_line_buffer, rl_point);
+             if (_rl_walphabetic (c))
+               break;
+             rl_point = MB_NEXTCHAR (rl_line_buffer, rl_point, 1, MB_FIND_NONZERO);
+           }
+       }
+
+      if (rl_point == rl_end)
+       return 0;
+
+      rl_point = MB_NEXTCHAR (rl_line_buffer, rl_point, 1, MB_FIND_NONZERO);
+      while (rl_point < rl_end)
+       {
+         c = _rl_char_value (rl_line_buffer, rl_point);
+         if (_rl_walphabetic (c) == 0)
+           break;
+         rl_point = MB_NEXTCHAR (rl_line_buffer, rl_point, 1, MB_FIND_NONZERO);
+       }
+
+      --count;
+    }
+
+  return 0;
+}
+
+/* Move backward a word.  We do what Emacs does.  Handles multibyte chars. */
+int
+rl_backward_word (count, key)
+     int count, key;
+{
+  int c, p;
+
+  if (count < 0)
+    return (rl_forward_word (-count, key));
+
+  while (count)
+    {
+      if (rl_point == 0)
+       return 0;
+
+      /* Like rl_forward_word (), except that we look at the characters
+        just before point. */
+
+      p = MB_PREVCHAR (rl_line_buffer, rl_point, MB_FIND_NONZERO);
+      c = _rl_char_value (rl_line_buffer, p);
+
+      if (_rl_walphabetic (c) == 0)
+       {
+         rl_point = p;
+         while (rl_point > 0)
+           {
+             p = MB_PREVCHAR (rl_line_buffer, rl_point, MB_FIND_NONZERO);
+             c = _rl_char_value (rl_line_buffer, p);
+             if (_rl_walphabetic (c))
+               break;
+             rl_point = p;
+           }
+       }
+
+      while (rl_point)
+       {
+         p = MB_PREVCHAR (rl_line_buffer, rl_point, MB_FIND_NONZERO);
+         c = _rl_char_value (rl_line_buffer, p);         
+         if (_rl_walphabetic (c) == 0)
+           break;
+         else
+           rl_point = p;
+       }
+
+      --count;
+    }
+
+  return 0;
+}
+
+/* Clear the current line.  Numeric argument to C-l does this. */
+int
+rl_refresh_line (ignore1, ignore2)
+     int ignore1, ignore2;
+{
+  int curr_line;
+
+  curr_line = _rl_current_display_line ();
+
+  _rl_move_vert (curr_line);
+  _rl_move_cursor_relative (0, rl_line_buffer);   /* XXX is this right */
+
+  _rl_clear_to_eol (0);                /* arg of 0 means to not use spaces */
+
+  rl_forced_update_display ();
+  rl_display_fixed = 1;
+
+  return 0;
+}
+
+/* C-l typed to a line without quoting clears the screen, and then reprints
+   the prompt and the current input line.  Given a numeric arg, redraw only
+   the current line. */
+int
+rl_clear_screen (count, key)
+     int count, key;
+{
+  if (rl_explicit_arg)
+    {
+      rl_refresh_line (count, key);
+      return 0;
+    }
+
+  _rl_clear_screen ();         /* calls termcap function to clear screen */
+  rl_forced_update_display ();
+  rl_display_fixed = 1;
+
+  return 0;
+}
+
+int
+rl_arrow_keys (count, c)
+     int count, c;
+{
+  int ch;
+
+  RL_SETSTATE(RL_STATE_MOREINPUT);
+  ch = rl_read_key ();
+  RL_UNSETSTATE(RL_STATE_MOREINPUT);
+
+  switch (_rl_to_upper (ch))
+    {
+    case 'A':
+      rl_get_previous_history (count, ch);
+      break;
+
+    case 'B':
+      rl_get_next_history (count, ch);
+      break;
+
+    case 'C':
+      if (MB_CUR_MAX > 1 && rl_byte_oriented == 0)
+       rl_forward_char (count, ch);
+      else
+       rl_forward_byte (count, ch);
+      break;
+
+    case 'D':
+      if (MB_CUR_MAX > 1 && rl_byte_oriented == 0)
+       rl_backward_char (count, ch);
+      else
+       rl_backward_byte (count, ch);
+      break;
+
+    default:
+      rl_ding ();
+    }
+
+  return 0;
+}
+
+/* **************************************************************** */
+/*                                                                 */
+/*                     Text commands                               */
+/*                                                                 */
+/* **************************************************************** */
+
+#ifdef HANDLE_MULTIBYTE
+static char pending_bytes[MB_LEN_MAX];
+static int pending_bytes_length = 0;
+static mbstate_t ps = {0};
+#endif
+
+/* Insert the character C at the current location, moving point forward.
+   If C introduces a multibyte sequence, we read the whole sequence and
+   then insert the multibyte char into the line buffer. */
+int
+_rl_insert_char (count, c)
+     int count, c;
+{
+  register int i;
+  char *string;
+#ifdef HANDLE_MULTIBYTE
+  int string_size;
+  char incoming[MB_LEN_MAX + 1];
+  int incoming_length = 0;
+  mbstate_t ps_back;
+  static int stored_count = 0;
+#endif
+
+  if (count <= 0)
+    return 0;
+
+#if defined (HANDLE_MULTIBYTE)
+  if (MB_CUR_MAX == 1 || rl_byte_oriented)
+    {
+      incoming[0] = c;
+      incoming[1] = '\0';
+      incoming_length = 1;
+    }
+  else
+    {
+      wchar_t wc;
+      size_t ret;
+
+      if (stored_count <= 0)
+       stored_count = count;
+      else
+       count = stored_count;
+
+      ps_back = ps;
+      pending_bytes[pending_bytes_length++] = c;
+      ret = mbrtowc (&wc, pending_bytes, pending_bytes_length, &ps);
+
+      if (ret == (size_t)-2)
+       {
+         /* Bytes too short to compose character, try to wait for next byte.
+            Restore the state of the byte sequence, because in this case the
+            effect of mbstate is undefined. */
+         ps = ps_back;
+         return 1;
+       }
+      else if (ret == (size_t)-1)
+       {
+         /* Invalid byte sequence for the current locale.  Treat first byte
+            as a single character. */
+         incoming[0] = pending_bytes[0];
+         incoming[1] = '\0';
+         incoming_length = 1;
+         pending_bytes_length--;
+         memmove (pending_bytes, pending_bytes + 1, pending_bytes_length);
+         /* Clear the state of the byte sequence, because in this case the
+            effect of mbstate is undefined. */
+         memset (&ps, 0, sizeof (mbstate_t));
+       }
+      else if (ret == (size_t)0)
+       {
+         incoming[0] = '\0';
+         incoming_length = 0;
+         pending_bytes_length--;
+         /* Clear the state of the byte sequence, because in this case the
+            effect of mbstate is undefined. */
+         memset (&ps, 0, sizeof (mbstate_t));
+       }
+      else
+       {
+         /* We successfully read a single multibyte character. */
+         memcpy (incoming, pending_bytes, pending_bytes_length);
+         incoming[pending_bytes_length] = '\0';
+         incoming_length = pending_bytes_length;
+         pending_bytes_length = 0;
+       }
+    }
+#endif /* HANDLE_MULTIBYTE */
+         
+  /* If we can optimize, then do it.  But don't let people crash
+     readline because of extra large arguments. */
+  if (count > 1 && count <= 1024)
+    {
+#if defined (HANDLE_MULTIBYTE)
+      string_size = count * incoming_length;
+      string = (char *)xmalloc (1 + string_size);
+
+      i = 0;
+      while (i < string_size)
+       {
+         strncpy (string + i, incoming, incoming_length);
+         i += incoming_length;
+       }
+      incoming_length = 0;
+      stored_count = 0;
+#else /* !HANDLE_MULTIBYTE */
+      string = (char *)xmalloc (1 + count);
+
+      for (i = 0; i < count; i++)
+       string[i] = c;
+#endif /* !HANDLE_MULTIBYTE */
+
+      string[i] = '\0';
+      rl_insert_text (string);
+      free (string);
+
+      return 0;
+    }
+
+  if (count > 1024)
+    {
+      int decreaser;
+#if defined (HANDLE_MULTIBYTE)
+      string_size = incoming_length * 1024;
+      string = (char *)xmalloc (1 + string_size);
+
+      i = 0;
+      while (i < string_size)
+       {
+         strncpy (string + i, incoming, incoming_length);
+         i += incoming_length;
+       }
+
+      while (count)
+       {
+         decreaser = (count > 1024) ? 1024 : count;
+         string[decreaser*incoming_length] = '\0';
+         rl_insert_text (string);
+         count -= decreaser;
+       }
+
+      free (string);
+      incoming_length = 0;
+      stored_count = 0;
+#else /* !HANDLE_MULTIBYTE */
+      char str[1024+1];
+
+      for (i = 0; i < 1024; i++)
+       str[i] = c;
+
+      while (count)
+       {
+         decreaser = (count > 1024 ? 1024 : count);
+         str[decreaser] = '\0';
+         rl_insert_text (str);
+         count -= decreaser;
+       }
+#endif /* !HANDLE_MULTIBYTE */
+
+      return 0;
+    }
+
+  if (MB_CUR_MAX == 1 || rl_byte_oriented)
+    {
+      /* We are inserting a single character.
+        If there is pending input, then make a string of all of the
+        pending characters that are bound to rl_insert, and insert
+        them all. */
+      if (_rl_any_typein ())
+       _rl_insert_typein (c);
+      else
+       {
+         /* Inserting a single character. */
+         char str[2];
+
+         str[1] = '\0';
+         str[0] = c;
+         rl_insert_text (str);
+       }
+    }
+#if defined (HANDLE_MULTIBYTE)
+  else
+    {
+      rl_insert_text (incoming);
+      stored_count = 0;
+    }
+#endif
+
+  return 0;
+}
+
+/* Overwrite the character at point (or next COUNT characters) with C.
+   If C introduces a multibyte character sequence, read the entire sequence
+   before starting the overwrite loop. */
+int
+_rl_overwrite_char (count, c)
+     int count, c;
+{
+  int i;
+#if defined (HANDLE_MULTIBYTE)
+  char mbkey[MB_LEN_MAX];
+  int k;
+
+  /* Read an entire multibyte character sequence to insert COUNT times. */
+  if (count > 0 && MB_CUR_MAX > 1 && rl_byte_oriented == 0)
+    k = _rl_read_mbstring (c, mbkey, MB_LEN_MAX);
+#endif
+
+  rl_begin_undo_group ();
+
+  for (i = 0; i < count; i++)
+    {
+#if defined (HANDLE_MULTIBYTE)
+      if (MB_CUR_MAX > 1 && rl_byte_oriented == 0)
+       rl_insert_text (mbkey);
+      else
+#endif
+       _rl_insert_char (1, c);
+
+      if (rl_point < rl_end)
+       rl_delete (1, c);
+    }
+
+  rl_end_undo_group ();
+
+  return 0;
+}
+
+int
+rl_insert (count, c)
+     int count, c;
+{
+  return (rl_insert_mode == RL_IM_INSERT ? _rl_insert_char (count, c)
+                                        : _rl_overwrite_char (count, c));
+}
+
+/* Insert the next typed character verbatim. */
+static int
+_rl_insert_next (count)
+     int count;
+{
+  int c;
+
+  RL_SETSTATE(RL_STATE_MOREINPUT);
+  c = rl_read_key ();
+  RL_UNSETSTATE(RL_STATE_MOREINPUT);
+
+#if defined (HANDLE_SIGNALS)
+  if (RL_ISSTATE (RL_STATE_CALLBACK) == 0)
+    _rl_restore_tty_signals ();
+#endif
+
+  return (_rl_insert_char (count, c));  
+}
+
+#if defined (READLINE_CALLBACKS)
+static int
+_rl_insert_next_callback (data)
+     _rl_callback_generic_arg *data;
+{
+  int count;
+
+  count = data->count;
+
+  /* Deregister function, let rl_callback_read_char deallocate data */
+  _rl_callback_func = 0;
+  _rl_want_redisplay = 1;
+  return _rl_insert_next (count);
+}
+#endif
+  
+int
+rl_quoted_insert (count, key)
+     int count, key;
+{
+  /* Let's see...should the callback interface futz with signal handling? */
+#if defined (HANDLE_SIGNALS)
+  if (RL_ISSTATE (RL_STATE_CALLBACK) == 0)
+    _rl_disable_tty_signals ();
+#endif
+
+#if defined (READLINE_CALLBACKS)
+  if (RL_ISSTATE (RL_STATE_CALLBACK))
+    {
+      _rl_callback_data = _rl_callback_data_alloc (count);
+      _rl_callback_func = _rl_insert_next_callback;
+      return (0);
+    }
+#endif
+      
+  return _rl_insert_next (count);
+}
+
+/* Insert a tab character. */
+int
+rl_tab_insert (count, key)
+     int count, key;
+{
+  return (_rl_insert_char (count, '\t'));
+}
+
+/* What to do when a NEWLINE is pressed.  We accept the whole line.
+   KEY is the key that invoked this command.  I guess it could have
+   meaning in the future. */
+int
+rl_newline (count, key)
+     int count, key;
+{
+  rl_done = 1;
+
+  if (_rl_history_preserve_point)
+    _rl_history_saved_point = (rl_point == rl_end) ? -1 : rl_point;
+
+  RL_SETSTATE(RL_STATE_DONE);
+
+#if defined (VI_MODE)
+  if (rl_editing_mode == vi_mode)
+    {
+      _rl_vi_done_inserting ();
+      if (_rl_vi_textmod_command (_rl_vi_last_command) == 0)   /* XXX */
+       _rl_vi_reset_last ();
+    }
+#endif /* VI_MODE */
+
+  /* If we've been asked to erase empty lines, suppress the final update,
+     since _rl_update_final calls rl_crlf(). */
+  if (rl_erase_empty_line && rl_point == 0 && rl_end == 0)
+    return 0;
+
+  if (readline_echoing_p)
+    _rl_update_final ();
+  return 0;
+}
+
+/* What to do for some uppercase characters, like meta characters,
+   and some characters appearing in emacs_ctlx_keymap.  This function
+   is just a stub, you bind keys to it and the code in _rl_dispatch ()
+   is special cased. */
+int
+rl_do_lowercase_version (ignore1, ignore2)
+     int ignore1, ignore2;
+{
+  return 0;
+}
+
+/* This is different from what vi does, so the code's not shared.  Emacs
+   rubout in overwrite mode has one oddity:  it replaces a control
+   character that's displayed as two characters (^X) with two spaces. */
+int
+_rl_overwrite_rubout (count, key)
+     int count, key;
+{
+  int opoint;
+  int i, l;
+
+  if (rl_point == 0)
+    {
+      rl_ding ();
+      return 1;
+    }
+
+  opoint = rl_point;
+
+  /* L == number of spaces to insert */
+  for (i = l = 0; i < count; i++)
+    {
+      rl_backward_char (1, key);
+      l += rl_character_len (rl_line_buffer[rl_point], rl_point);      /* not exactly right */
+    }
+
+  rl_begin_undo_group ();
+
+  if (count > 1 || rl_explicit_arg)
+    rl_kill_text (opoint, rl_point);
+  else
+    rl_delete_text (opoint, rl_point);
+
+  /* Emacs puts point at the beginning of the sequence of spaces. */
+  if (rl_point < rl_end)
+    {
+      opoint = rl_point;
+      _rl_insert_char (l, ' ');
+      rl_point = opoint;
+    }
+
+  rl_end_undo_group ();
+
+  return 0;
+}
+  
+/* Rubout the character behind point. */
+int
+rl_rubout (count, key)
+     int count, key;
+{
+  if (count < 0)
+    return (rl_delete (-count, key));
+
+  if (!rl_point)
+    {
+      rl_ding ();
+      return -1;
+    }
+
+  if (rl_insert_mode == RL_IM_OVERWRITE)
+    return (_rl_overwrite_rubout (count, key));
+
+  return (_rl_rubout_char (count, key));
+}
+
+int
+_rl_rubout_char (count, key)
+     int count, key;
+{
+  int orig_point;
+  unsigned char c;
+
+  /* Duplicated code because this is called from other parts of the library. */
+  if (count < 0)
+    return (rl_delete (-count, key));
+
+  if (rl_point == 0)
+    {
+      rl_ding ();
+      return -1;
+    }
+
+  orig_point = rl_point;
+  if (count > 1 || rl_explicit_arg)
+    {
+      rl_backward_char (count, key);
+      rl_kill_text (orig_point, rl_point);
+    }
+  else if (MB_CUR_MAX == 1 || rl_byte_oriented)
+    {
+      c = rl_line_buffer[--rl_point];
+      rl_delete_text (rl_point, orig_point);
+      /* The erase-at-end-of-line hack is of questionable merit now. */
+      if (rl_point == rl_end && ISPRINT (c) && _rl_last_c_pos)
+       {
+         int l;
+         l = rl_character_len (c, rl_point);
+         _rl_erase_at_end_of_line (l);
+       }
+    }
+  else
+    {
+      rl_point = _rl_find_prev_mbchar (rl_line_buffer, rl_point, MB_FIND_NONZERO);
+      rl_delete_text (rl_point, orig_point);
+    }
+
+  return 0;
+}
+
+/* Delete the character under the cursor.  Given a numeric argument,
+   kill that many characters instead. */
+int
+rl_delete (count, key)
+     int count, key;
+{
+  int xpoint;
+
+  if (count < 0)
+    return (_rl_rubout_char (-count, key));
+
+  if (rl_point == rl_end)
+    {
+      rl_ding ();
+      return -1;
+    }
+
+  if (count > 1 || rl_explicit_arg)
+    {
+      xpoint = rl_point;
+      if (MB_CUR_MAX > 1 && rl_byte_oriented == 0)
+       rl_forward_char (count, key);
+      else
+       rl_forward_byte (count, key);
+
+      rl_kill_text (xpoint, rl_point);
+      rl_point = xpoint;
+    }
+  else
+    {
+      xpoint = MB_NEXTCHAR (rl_line_buffer, rl_point, 1, MB_FIND_NONZERO);
+      rl_delete_text (rl_point, xpoint);
+    }
+  return 0;
+}
+
+/* Delete the character under the cursor, unless the insertion
+   point is at the end of the line, in which case the character
+   behind the cursor is deleted.  COUNT is obeyed and may be used
+   to delete forward or backward that many characters. */      
+int
+rl_rubout_or_delete (count, key)
+     int count, key;
+{
+  if (rl_end != 0 && rl_point == rl_end)
+    return (_rl_rubout_char (count, key));
+  else
+    return (rl_delete (count, key));
+}  
+
+/* Delete all spaces and tabs around point. */
+int
+rl_delete_horizontal_space (count, ignore)
+     int count, ignore;
+{
+  int start = rl_point;
+
+  while (rl_point && whitespace (rl_line_buffer[rl_point - 1]))
+    rl_point--;
+
+  start = rl_point;
+
+  while (rl_point < rl_end && whitespace (rl_line_buffer[rl_point]))
+    rl_point++;
+
+  if (start != rl_point)
+    {
+      rl_delete_text (start, rl_point);
+      rl_point = start;
+    }
+
+  if (rl_point < 0)
+    rl_point = 0;
+
+  return 0;
+}
+
+/* Like the tcsh editing function delete-char-or-list.  The eof character
+   is caught before this is invoked, so this really does the same thing as
+   delete-char-or-list-or-eof, as long as it's bound to the eof character. */
+int
+rl_delete_or_show_completions (count, key)
+     int count, key;
+{
+  if (rl_end != 0 && rl_point == rl_end)
+    return (rl_possible_completions (count, key));
+  else
+    return (rl_delete (count, key));
+}
+
+#ifndef RL_COMMENT_BEGIN_DEFAULT
+#define RL_COMMENT_BEGIN_DEFAULT "#"
+#endif
+
+/* Turn the current line into a comment in shell history.
+   A K*rn shell style function. */
+int
+rl_insert_comment (count, key)
+     int count, key;
+{
+  char *rl_comment_text;
+  int rl_comment_len;
+
+  rl_beg_of_line (1, key);
+  rl_comment_text = _rl_comment_begin ? _rl_comment_begin : RL_COMMENT_BEGIN_DEFAULT;
+
+  if (rl_explicit_arg == 0)
+    rl_insert_text (rl_comment_text);
+  else
+    {
+      rl_comment_len = strlen (rl_comment_text);
+      if (STREQN (rl_comment_text, rl_line_buffer, rl_comment_len))
+       rl_delete_text (rl_point, rl_point + rl_comment_len);
+      else
+       rl_insert_text (rl_comment_text);
+    }
+
+  (*rl_redisplay_function) ();
+  rl_newline (1, '\n');
+
+  return (0);
+}
+
+/* **************************************************************** */
+/*                                                                 */
+/*                     Changing Case                               */
+/*                                                                 */
+/* **************************************************************** */
+
+/* The three kinds of things that we know how to do. */
+#define UpCase 1
+#define DownCase 2
+#define CapCase 3
+
+/* Uppercase the word at point. */
+int
+rl_upcase_word (count, key)
+     int count, key;
+{
+  return (rl_change_case (count, UpCase));
+}
+
+/* Lowercase the word at point. */
+int
+rl_downcase_word (count, key)
+     int count, key;
+{
+  return (rl_change_case (count, DownCase));
+}
+
+/* Upcase the first letter, downcase the rest. */
+int
+rl_capitalize_word (count, key)
+     int count, key;
+{
+ return (rl_change_case (count, CapCase));
+}
+
+/* The meaty function.
+   Change the case of COUNT words, performing OP on them.
+   OP is one of UpCase, DownCase, or CapCase.
+   If a negative argument is given, leave point where it started,
+   otherwise, leave it where it moves to. */
+static int
+rl_change_case (count, op)
+     int count, op;
+{
+  int start, next, end;
+  int inword, c, nc, nop;
+#if defined (HANDLE_MULTIBYTE)
+  wchar_t wc, nwc;
+  char mb[MB_LEN_MAX+1];
+  int mlen;
+  mbstate_t mps;
+#endif
+
+  start = rl_point;
+  rl_forward_word (count, 0);
+  end = rl_point;
+
+  if (op != UpCase && op != DownCase && op != CapCase)
+    {
+      rl_ding ();
+      return -1;
+    }
+
+  if (count < 0)
+    SWAP (start, end);
+
+#if defined (HANDLE_MULTIBYTE)
+  memset (&mps, 0, sizeof (mbstate_t));
+#endif
+
+  /* We are going to modify some text, so let's prepare to undo it. */
+  rl_modifying (start, end);
+
+  inword = 0;
+  while (start < end)
+    {
+      c = _rl_char_value (rl_line_buffer, start);
+      /*  This assumes that the upper and lower case versions are the same width. */
+      next = MB_NEXTCHAR (rl_line_buffer, start, 1, MB_FIND_NONZERO);
+
+      if (_rl_walphabetic (c) == 0)
+       {
+         inword = 0;
+         start = next;
+         continue;
+       }
+
+      if (op == CapCase)
+       {
+         nop = inword ? DownCase : UpCase;
+         inword = 1;
+       }
+      else
+       nop = op;
+      if (MB_CUR_MAX == 1 || rl_byte_oriented || isascii (c))
+       {
+         nc = (nop == UpCase) ? _rl_to_upper (c) : _rl_to_lower (c);
+         rl_line_buffer[start] = nc;
+       }
+#if defined (HANDLE_MULTIBYTE)
+      else
+       {
+         mbrtowc (&wc, rl_line_buffer + start, end - start, &mps);
+         nwc = (nop == UpCase) ? _rl_to_wupper (wc) : _rl_to_wlower (wc);
+         if  (nwc != wc)       /*  just skip unchanged characters */
+           {
+             mlen = wcrtomb (mb, nwc, &mps);
+             if (mlen > 0)
+               mb[mlen] = '\0';
+             /* Assume the same width */
+             strncpy (rl_line_buffer + start, mb, mlen);
+           }
+       }
+#endif
+
+      start = next;
+    }
+
+  rl_point = end;
+  return 0;
+}
+
+/* **************************************************************** */
+/*                                                                 */
+/*                     Transposition                               */
+/*                                                                 */
+/* **************************************************************** */
+
+/* Transpose the words at point.  If point is at the end of the line,
+   transpose the two words before point. */
+int
+rl_transpose_words (count, key)
+     int count, key;
+{
+  char *word1, *word2;
+  int w1_beg, w1_end, w2_beg, w2_end;
+  int orig_point = rl_point;
+
+  if (!count)
+    return 0;
+
+  /* Find the two words. */
+  rl_forward_word (count, key);
+  w2_end = rl_point;
+  rl_backward_word (1, key);
+  w2_beg = rl_point;
+  rl_backward_word (count, key);
+  w1_beg = rl_point;
+  rl_forward_word (1, key);
+  w1_end = rl_point;
+
+  /* Do some check to make sure that there really are two words. */
+  if ((w1_beg == w2_beg) || (w2_beg < w1_end))
+    {
+      rl_ding ();
+      rl_point = orig_point;
+      return -1;
+    }
+
+  /* Get the text of the words. */
+  word1 = rl_copy_text (w1_beg, w1_end);
+  word2 = rl_copy_text (w2_beg, w2_end);
+
+  /* We are about to do many insertions and deletions.  Remember them
+     as one operation. */
+  rl_begin_undo_group ();
+
+  /* Do the stuff at word2 first, so that we don't have to worry
+     about word1 moving. */
+  rl_point = w2_beg;
+  rl_delete_text (w2_beg, w2_end);
+  rl_insert_text (word1);
+
+  rl_point = w1_beg;
+  rl_delete_text (w1_beg, w1_end);
+  rl_insert_text (word2);
+
+  /* This is exactly correct since the text before this point has not
+     changed in length. */
+  rl_point = w2_end;
+
+  /* I think that does it. */
+  rl_end_undo_group ();
+  free (word1);
+  free (word2);
+
+  return 0;
+}
+
+/* Transpose the characters at point.  If point is at the end of the line,
+   then transpose the characters before point. */
+int
+rl_transpose_chars (count, key)
+     int count, key;
+{
+#if defined (HANDLE_MULTIBYTE)
+  char *dummy;
+  int i;
+#else
+  char dummy[2];
+#endif
+  int char_length, prev_point;
+
+  if (count == 0)
+    return 0;
+
+  if (!rl_point || rl_end < 2)
+    {
+      rl_ding ();
+      return -1;
+    }
+
+  rl_begin_undo_group ();
+
+  if (rl_point == rl_end)
+    {
+      rl_point = MB_PREVCHAR (rl_line_buffer, rl_point, MB_FIND_NONZERO);
+      count = 1;
+    }
+
+  prev_point = rl_point;
+  rl_point = MB_PREVCHAR (rl_line_buffer, rl_point, MB_FIND_NONZERO);
+
+#if defined (HANDLE_MULTIBYTE)
+  char_length = prev_point - rl_point;
+  dummy = (char *)xmalloc (char_length + 1);
+  for (i = 0; i < char_length; i++)
+    dummy[i] = rl_line_buffer[rl_point + i];
+  dummy[i] = '\0';
+#else
+  dummy[0] = rl_line_buffer[rl_point];
+  dummy[char_length = 1] = '\0';
+#endif
+
+  rl_delete_text (rl_point, rl_point + char_length);
+
+  rl_point = _rl_find_next_mbchar (rl_line_buffer, rl_point, count, MB_FIND_NONZERO);
+
+  _rl_fix_point (0);
+  rl_insert_text (dummy);
+  rl_end_undo_group ();
+
+#if defined (HANDLE_MULTIBYTE)
+  free (dummy);
+#endif
+
+  return 0;
+}
+
+/* **************************************************************** */
+/*                                                                 */
+/*                     Character Searching                         */
+/*                                                                 */
+/* **************************************************************** */
+
+int
+#if defined (HANDLE_MULTIBYTE)
+_rl_char_search_internal (count, dir, smbchar, len)
+     int count, dir;
+     char *smbchar;
+     int len;
+#else
+_rl_char_search_internal (count, dir, schar)
+     int count, dir, schar;
+#endif
+{
+  int pos, inc;
+#if defined (HANDLE_MULTIBYTE)
+  int prepos;
+#endif
+
+  pos = rl_point;
+  inc = (dir < 0) ? -1 : 1;
+  while (count)
+    {
+      if ((dir < 0 && pos <= 0) || (dir > 0 && pos >= rl_end))
+       {
+         rl_ding ();
+         return -1;
+       }
+
+#if defined (HANDLE_MULTIBYTE)
+      pos = (inc > 0) ? _rl_find_next_mbchar (rl_line_buffer, pos, 1, MB_FIND_ANY)
+                     : _rl_find_prev_mbchar (rl_line_buffer, pos, MB_FIND_ANY);
+#else
+      pos += inc;
+#endif
+      do
+       {
+#if defined (HANDLE_MULTIBYTE)
+         if (_rl_is_mbchar_matched (rl_line_buffer, pos, rl_end, smbchar, len))
+#else
+         if (rl_line_buffer[pos] == schar)
+#endif
+           {
+             count--;
+             if (dir < 0)
+               rl_point = (dir == BTO) ? _rl_find_next_mbchar (rl_line_buffer, pos, 1, MB_FIND_ANY)
+                                       : pos;
+             else
+               rl_point = (dir == FTO) ? _rl_find_prev_mbchar (rl_line_buffer, pos, MB_FIND_ANY)
+                                       : pos;
+             break;
+           }
+#if defined (HANDLE_MULTIBYTE)
+         prepos = pos;
+#endif
+       }
+#if defined (HANDLE_MULTIBYTE)
+      while ((dir < 0) ? (pos = _rl_find_prev_mbchar (rl_line_buffer, pos, MB_FIND_ANY)) != prepos
+                      : (pos = _rl_find_next_mbchar (rl_line_buffer, pos, 1, MB_FIND_ANY)) != prepos);
+#else
+      while ((dir < 0) ? pos-- : ++pos < rl_end);
+#endif
+    }
+  return (0);
+}
+
+/* Search COUNT times for a character read from the current input stream.
+   FDIR is the direction to search if COUNT is non-negative; otherwise
+   the search goes in BDIR.  So much is dependent on HANDLE_MULTIBYTE
+   that there are two separate versions of this function. */
+#if defined (HANDLE_MULTIBYTE)
+static int
+_rl_char_search (count, fdir, bdir)
+     int count, fdir, bdir;
+{
+  char mbchar[MB_LEN_MAX];
+  int mb_len;
+
+  mb_len = _rl_read_mbchar (mbchar, MB_LEN_MAX);
+
+  if (count < 0)
+    return (_rl_char_search_internal (-count, bdir, mbchar, mb_len));
+  else
+    return (_rl_char_search_internal (count, fdir, mbchar, mb_len));
+}
+#else /* !HANDLE_MULTIBYTE */
+static int
+_rl_char_search (count, fdir, bdir)
+     int count, fdir, bdir;
+{
+  int c;
+
+  RL_SETSTATE(RL_STATE_MOREINPUT);
+  c = rl_read_key ();
+  RL_UNSETSTATE(RL_STATE_MOREINPUT);
+
+  if (count < 0)
+    return (_rl_char_search_internal (-count, bdir, c));
+  else
+    return (_rl_char_search_internal (count, fdir, c));
+}
+#endif /* !HANDLE_MULTIBYTE */
+
+#if defined (READLINE_CALLBACKS)
+static int
+_rl_char_search_callback (data)
+     _rl_callback_generic_arg *data;
+{
+  _rl_callback_func = 0;
+  _rl_want_redisplay = 1;
+
+  return (_rl_char_search (data->count, data->i1, data->i2));
+}
+#endif
+
+int
+rl_char_search (count, key)
+     int count, key;
+{
+#if defined (READLINE_CALLBACKS)
+  if (RL_ISSTATE (RL_STATE_CALLBACK))
+    {
+      _rl_callback_data = _rl_callback_data_alloc (count);
+      _rl_callback_data->i1 = FFIND;
+      _rl_callback_data->i2 = BFIND;
+      _rl_callback_func = _rl_char_search_callback;
+      return (0);
+    }
+#endif
+  
+  return (_rl_char_search (count, FFIND, BFIND));
+}
+
+int
+rl_backward_char_search (count, key)
+     int count, key;
+{
+#if defined (READLINE_CALLBACKS)
+  if (RL_ISSTATE (RL_STATE_CALLBACK))
+    {
+      _rl_callback_data = _rl_callback_data_alloc (count);
+      _rl_callback_data->i1 = BFIND;
+      _rl_callback_data->i2 = FFIND;
+      _rl_callback_func = _rl_char_search_callback;
+      return (0);
+    }
+#endif
+
+  return (_rl_char_search (count, BFIND, FFIND));
+}
+
+/* **************************************************************** */
+/*                                                                 */
+/*                The Mark and the Region.                         */
+/*                                                                 */
+/* **************************************************************** */
+
+/* Set the mark at POSITION. */
+int
+_rl_set_mark_at_pos (position)
+     int position;
+{
+  if (position > rl_end)
+    return -1;
+
+  rl_mark = position;
+  return 0;
+}
+
+/* A bindable command to set the mark. */
+int
+rl_set_mark (count, key)
+     int count, key;
+{
+  return (_rl_set_mark_at_pos (rl_explicit_arg ? count : rl_point));
+}
+
+/* Exchange the position of mark and point. */
+int
+rl_exchange_point_and_mark (count, key)
+     int count, key;
+{
+  if (rl_mark > rl_end)
+    rl_mark = -1;
+
+  if (rl_mark == -1)
+    {
+      rl_ding ();
+      return -1;
+    }
+  else
+    SWAP (rl_point, rl_mark);
+
+  return 0;
+}
diff --git a/tilde.c b/tilde.c
new file mode 100644 (file)
index 0000000..1b76c9f
--- /dev/null
+++ b/tilde.c
@@ -0,0 +1,502 @@
+/* tilde.c -- Tilde expansion code (~/foo := $HOME/foo). */
+
+/* Copyright (C) 1988,1989 Free Software Foundation, Inc.
+
+   This file is part of GNU Readline, a library for reading lines
+   of text with interactive input and history editing.
+
+   Readline 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.
+
+   Readline 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 Readline; see the file COPYING.  If not, write to the Free
+   Software Foundation, 59 Temple Place, Suite 330, Boston, MA 02111 USA. */
+
+#if defined (HAVE_CONFIG_H)
+#  include <config.h>
+#endif
+
+#if defined (HAVE_UNISTD_H)
+#  ifdef _MINIX
+#    include <sys/types.h>
+#  endif
+#  include <unistd.h>
+#endif
+
+#if defined (HAVE_STRING_H)
+#  include <string.h>
+#else /* !HAVE_STRING_H */
+#  include <strings.h>
+#endif /* !HAVE_STRING_H */  
+
+#if defined (HAVE_STDLIB_H)
+#  include <stdlib.h>
+#else
+#  include "ansi_stdlib.h"
+#endif /* HAVE_STDLIB_H */
+
+#include <sys/types.h>
+#if defined (HAVE_PWD_H)
+#include <pwd.h>
+#endif
+
+#include "tilde.h"
+
+#if defined (TEST) || defined (STATIC_MALLOC)
+static void *xmalloc (), *xrealloc ();
+#else
+#  include "xmalloc.h"
+#endif /* TEST || STATIC_MALLOC */
+
+#if !defined (HAVE_GETPW_DECLS)
+#  if defined (HAVE_GETPWUID)
+extern struct passwd *getpwuid PARAMS((uid_t));
+#  endif
+#  if defined (HAVE_GETPWNAM)
+extern struct passwd *getpwnam PARAMS((const char *));
+#  endif
+#endif /* !HAVE_GETPW_DECLS */
+
+#if !defined (savestring)
+#define savestring(x) strcpy ((char *)xmalloc (1 + strlen (x)), (x))
+#endif /* !savestring */
+
+#if !defined (NULL)
+#  if defined (__STDC__)
+#    define NULL ((void *) 0)
+#  else
+#    define NULL 0x0
+#  endif /* !__STDC__ */
+#endif /* !NULL */
+
+/* If being compiled as part of bash, these will be satisfied from
+   variables.o.  If being compiled as part of readline, they will
+   be satisfied from shell.o. */
+extern char *sh_get_home_dir PARAMS((void));
+extern char *sh_get_env_value PARAMS((const char *));
+
+/* The default value of tilde_additional_prefixes.  This is set to
+   whitespace preceding a tilde so that simple programs which do not
+   perform any word separation get desired behaviour. */
+static const char *default_prefixes[] =
+  { " ~", "\t~", (const char *)NULL };
+
+/* The default value of tilde_additional_suffixes.  This is set to
+   whitespace or newline so that simple programs which do not
+   perform any word separation get desired behaviour. */
+static const char *default_suffixes[] =
+  { " ", "\n", (const char *)NULL };
+
+/* If non-null, this contains the address of a function that the application
+   wants called before trying the standard tilde expansions.  The function
+   is called with the text sans tilde, and returns a malloc()'ed string
+   which is the expansion, or a NULL pointer if the expansion fails. */
+tilde_hook_func_t *tilde_expansion_preexpansion_hook = (tilde_hook_func_t *)NULL;
+
+/* If non-null, this contains the address of a function to call if the
+   standard meaning for expanding a tilde fails.  The function is called
+   with the text (sans tilde, as in "foo"), and returns a malloc()'ed string
+   which is the expansion, or a NULL pointer if there is no expansion. */
+tilde_hook_func_t *tilde_expansion_failure_hook = (tilde_hook_func_t *)NULL;
+
+/* When non-null, this is a NULL terminated array of strings which
+   are duplicates for a tilde prefix.  Bash uses this to expand
+   `=~' and `:~'. */
+char **tilde_additional_prefixes = (char **)default_prefixes;
+
+/* When non-null, this is a NULL terminated array of strings which match
+   the end of a username, instead of just "/".  Bash sets this to
+   `:' and `=~'. */
+char **tilde_additional_suffixes = (char **)default_suffixes;
+
+static int tilde_find_prefix PARAMS((const char *, int *));
+static int tilde_find_suffix PARAMS((const char *));
+static char *isolate_tilde_prefix PARAMS((const char *, int *));
+static char *glue_prefix_and_suffix PARAMS((char *, const char *, int));
+
+/* Find the start of a tilde expansion in STRING, and return the index of
+   the tilde which starts the expansion.  Place the length of the text
+   which identified this tilde starter in LEN, excluding the tilde itself. */
+static int
+tilde_find_prefix (string, len)
+     const char *string;
+     int *len;
+{
+  register int i, j, string_len;
+  register char **prefixes;
+
+  prefixes = tilde_additional_prefixes;
+
+  string_len = strlen (string);
+  *len = 0;
+
+  if (*string == '\0' || *string == '~')
+    return (0);
+
+  if (prefixes)
+    {
+      for (i = 0; i < string_len; i++)
+       {
+         for (j = 0; prefixes[j]; j++)
+           {
+             if (strncmp (string + i, prefixes[j], strlen (prefixes[j])) == 0)
+               {
+                 *len = strlen (prefixes[j]) - 1;
+                 return (i + *len);
+               }
+           }
+       }
+    }
+  return (string_len);
+}
+
+/* Find the end of a tilde expansion in STRING, and return the index of
+   the character which ends the tilde definition.  */
+static int
+tilde_find_suffix (string)
+     const char *string;
+{
+  register int i, j, string_len;
+  register char **suffixes;
+
+  suffixes = tilde_additional_suffixes;
+  string_len = strlen (string);
+
+  for (i = 0; i < string_len; i++)
+    {
+#if defined (__MSDOS__)
+      if (string[i] == '/' || string[i] == '\\' /* || !string[i] */)
+#else
+      if (string[i] == '/' /* || !string[i] */)
+#endif
+       break;
+
+      for (j = 0; suffixes && suffixes[j]; j++)
+       {
+         if (strncmp (string + i, suffixes[j], strlen (suffixes[j])) == 0)
+           return (i);
+       }
+    }
+  return (i);
+}
+
+/* Return a new string which is the result of tilde expanding STRING. */
+char *
+tilde_expand (string)
+     const char *string;
+{
+  char *result;
+  int result_size, result_index;
+
+  result_index = result_size = 0;
+  if (result = strchr (string, '~'))
+    result = (char *)xmalloc (result_size = (strlen (string) + 16));
+  else
+    result = (char *)xmalloc (result_size = (strlen (string) + 1));
+
+  /* Scan through STRING expanding tildes as we come to them. */
+  while (1)
+    {
+      register int start, end;
+      char *tilde_word, *expansion;
+      int len;
+
+      /* Make START point to the tilde which starts the expansion. */
+      start = tilde_find_prefix (string, &len);
+
+      /* Copy the skipped text into the result. */
+      if ((result_index + start + 1) > result_size)
+       result = (char *)xrealloc (result, 1 + (result_size += (start + 20)));
+
+      strncpy (result + result_index, string, start);
+      result_index += start;
+
+      /* Advance STRING to the starting tilde. */
+      string += start;
+
+      /* Make END be the index of one after the last character of the
+        username. */
+      end = tilde_find_suffix (string);
+
+      /* If both START and END are zero, we are all done. */
+      if (!start && !end)
+       break;
+
+      /* Expand the entire tilde word, and copy it into RESULT. */
+      tilde_word = (char *)xmalloc (1 + end);
+      strncpy (tilde_word, string, end);
+      tilde_word[end] = '\0';
+      string += end;
+
+      expansion = tilde_expand_word (tilde_word);
+      free (tilde_word);
+
+      len = strlen (expansion);
+#ifdef __CYGWIN__
+      /* Fix for Cygwin to prevent ~user/xxx from expanding to //xxx when
+        $HOME for `user' is /.  On cygwin, // denotes a network drive. */
+      if (len > 1 || *expansion != '/' || *string != '/')
+#endif
+       {
+         if ((result_index + len + 1) > result_size)
+           result = (char *)xrealloc (result, 1 + (result_size += (len + 20)));
+
+         strcpy (result + result_index, expansion);
+         result_index += len;
+       }
+      free (expansion);
+    }
+
+  result[result_index] = '\0';
+
+  return (result);
+}
+
+/* Take FNAME and return the tilde prefix we want expanded.  If LENP is
+   non-null, the index of the end of the prefix into FNAME is returned in
+   the location it points to. */
+static char *
+isolate_tilde_prefix (fname, lenp)
+     const char *fname;
+     int *lenp;
+{
+  char *ret;
+  int i;
+
+  ret = (char *)xmalloc (strlen (fname));
+#if defined (__MSDOS__)
+  for (i = 1; fname[i] && fname[i] != '/' && fname[i] != '\\'; i++)
+#else
+  for (i = 1; fname[i] && fname[i] != '/'; i++)
+#endif
+    ret[i - 1] = fname[i];
+  ret[i - 1] = '\0';
+  if (lenp)
+    *lenp = i;
+  return ret;
+}
+
+#if 0
+/* Public function to scan a string (FNAME) beginning with a tilde and find
+   the portion of the string that should be passed to the tilde expansion
+   function.  Right now, it just calls tilde_find_suffix and allocates new
+   memory, but it can be expanded to do different things later. */
+char *
+tilde_find_word (fname, flags, lenp)
+     const char *fname;
+     int flags, *lenp;
+{
+  int x;
+  char *r;
+
+  x = tilde_find_suffix (fname);
+  if (x == 0)
+    {
+      r = savestring (fname);
+      if (lenp)
+       *lenp = 0;
+    }
+  else
+    {
+      r = (char *)xmalloc (1 + x);
+      strncpy (r, fname, x);
+      r[x] = '\0';
+      if (lenp)
+       *lenp = x;
+    }
+
+  return r;
+}
+#endif
+
+/* Return a string that is PREFIX concatenated with SUFFIX starting at
+   SUFFIND. */
+static char *
+glue_prefix_and_suffix (prefix, suffix, suffind)
+     char *prefix;
+     const char *suffix;
+     int suffind;
+{
+  char *ret;
+  int plen, slen;
+
+  plen = (prefix && *prefix) ? strlen (prefix) : 0;
+  slen = strlen (suffix + suffind);
+  ret = (char *)xmalloc (plen + slen + 1);
+  if (plen)
+    strcpy (ret, prefix);
+  strcpy (ret + plen, suffix + suffind);
+  return ret;
+}
+
+/* Do the work of tilde expansion on FILENAME.  FILENAME starts with a
+   tilde.  If there is no expansion, call tilde_expansion_failure_hook.
+   This always returns a newly-allocated string, never static storage. */
+char *
+tilde_expand_word (filename)
+     const char *filename;
+{
+  char *dirname, *expansion, *username;
+  int user_len;
+  struct passwd *user_entry;
+
+  if (filename == 0)
+    return ((char *)NULL);
+
+  if (*filename != '~')
+    return (savestring (filename));
+
+  /* A leading `~/' or a bare `~' is *always* translated to the value of
+     $HOME or the home directory of the current user, regardless of any
+     preexpansion hook. */
+  if (filename[1] == '\0' || filename[1] == '/')
+    {
+      /* Prefix $HOME to the rest of the string. */
+      expansion = sh_get_env_value ("HOME");
+
+      /* If there is no HOME variable, look up the directory in
+        the password database. */
+      if (expansion == 0)
+       expansion = sh_get_home_dir ();
+
+      return (glue_prefix_and_suffix (expansion, filename, 1));
+    }
+
+  username = isolate_tilde_prefix (filename, &user_len);
+
+  if (tilde_expansion_preexpansion_hook)
+    {
+      expansion = (*tilde_expansion_preexpansion_hook) (username);
+      if (expansion)
+       {
+         dirname = glue_prefix_and_suffix (expansion, filename, user_len);
+         free (username);
+         free (expansion);
+         return (dirname);
+       }
+    }
+
+  /* No preexpansion hook, or the preexpansion hook failed.  Look in the
+     password database. */
+  dirname = (char *)NULL;
+#if defined (HAVE_GETPWNAM)
+  user_entry = getpwnam (username);
+#else
+  user_entry = 0;
+#endif
+  if (user_entry == 0)
+    {
+      /* If the calling program has a special syntax for expanding tildes,
+        and we couldn't find a standard expansion, then let them try. */
+      if (tilde_expansion_failure_hook)
+       {
+         expansion = (*tilde_expansion_failure_hook) (username);
+         if (expansion)
+           {
+             dirname = glue_prefix_and_suffix (expansion, filename, user_len);
+             free (expansion);
+           }
+       }
+      /* If we don't have a failure hook, or if the failure hook did not
+        expand the tilde, return a copy of what we were passed. */
+      if (dirname == 0)
+       dirname = savestring (filename);
+    }
+#if defined (HAVE_GETPWENT)
+  else
+    dirname = glue_prefix_and_suffix (user_entry->pw_dir, filename, user_len);
+#endif
+
+  free (username);
+#if defined (HAVE_GETPWENT)
+  endpwent ();
+#endif
+  return (dirname);
+}
+
+\f
+#if defined (TEST)
+#undef NULL
+#include <stdio.h>
+
+main (argc, argv)
+     int argc;
+     char **argv;
+{
+  char *result, line[512];
+  int done = 0;
+
+  while (!done)
+    {
+      printf ("~expand: ");
+      fflush (stdout);
+
+      if (!gets (line))
+       strcpy (line, "done");
+
+      if ((strcmp (line, "done") == 0) ||
+         (strcmp (line, "quit") == 0) ||
+         (strcmp (line, "exit") == 0))
+       {
+         done = 1;
+         break;
+       }
+
+      result = tilde_expand (line);
+      printf ("  --> %s\n", result);
+      free (result);
+    }
+  exit (0);
+}
+
+static void memory_error_and_abort ();
+
+static void *
+xmalloc (bytes)
+     size_t bytes;
+{
+  void *temp = (char *)malloc (bytes);
+
+  if (!temp)
+    memory_error_and_abort ();
+  return (temp);
+}
+
+static void *
+xrealloc (pointer, bytes)
+     void *pointer;
+     int bytes;
+{
+  void *temp;
+
+  if (!pointer)
+    temp = malloc (bytes);
+  else
+    temp = realloc (pointer, bytes);
+
+  if (!temp)
+    memory_error_and_abort ();
+
+  return (temp);
+}
+
+static void
+memory_error_and_abort ()
+{
+  fprintf (stderr, "readline: out of virtual memory\n");
+  abort ();
+}
+
+/*
+ * Local variables:
+ * compile-command: "gcc -g -DTEST -o tilde tilde.c"
+ * end:
+ */
+#endif /* TEST */
diff --git a/tilde.h b/tilde.h
new file mode 100644 (file)
index 0000000..c58ce20
--- /dev/null
+++ b/tilde.h
@@ -0,0 +1,81 @@
+/* tilde.h: Externally available variables and function in libtilde.a. */
+
+/* Copyright (C) 1992 Free Software Foundation, Inc.
+
+   This file contains the Readline Library (the Library), a set of
+   routines for providing Emacs style line input to programs that ask
+   for it.
+
+   The Library 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.
+
+   The Library is distributed in the hope that it will be useful, but
+   WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   General Public License for more details.
+
+   The GNU General Public License is often shipped with GNU software, and
+   is generally kept in a file called COPYING or LICENSE.  If you do not
+   have a copy of the license, write to the Free Software Foundation,
+   59 Temple Place, Suite 330, Boston, MA 02111 USA. */
+
+#if !defined (_TILDE_H_)
+#  define _TILDE_H_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* A function can be defined using prototypes and compile on both ANSI C
+   and traditional C compilers with something like this:
+       extern char *func PARAMS((char *, char *, int)); */
+
+#if !defined (PARAMS)
+#  if defined (__STDC__) || defined (__GNUC__) || defined (__cplusplus)
+#    define PARAMS(protos) protos
+#  else
+#    define PARAMS(protos) ()
+#  endif
+#endif
+
+typedef char *tilde_hook_func_t PARAMS((char *));
+
+/* If non-null, this contains the address of a function that the application
+   wants called before trying the standard tilde expansions.  The function
+   is called with the text sans tilde, and returns a malloc()'ed string
+   which is the expansion, or a NULL pointer if the expansion fails. */
+extern tilde_hook_func_t *tilde_expansion_preexpansion_hook;
+
+/* If non-null, this contains the address of a function to call if the
+   standard meaning for expanding a tilde fails.  The function is called
+   with the text (sans tilde, as in "foo"), and returns a malloc()'ed string
+   which is the expansion, or a NULL pointer if there is no expansion. */
+extern tilde_hook_func_t *tilde_expansion_failure_hook;
+
+/* When non-null, this is a NULL terminated array of strings which
+   are duplicates for a tilde prefix.  Bash uses this to expand
+   `=~' and `:~'. */
+extern char **tilde_additional_prefixes;
+
+/* When non-null, this is a NULL terminated array of strings which match
+   the end of a username, instead of just "/".  Bash sets this to
+   `:' and `=~'. */
+extern char **tilde_additional_suffixes;
+
+/* Return a new string which is the result of tilde expanding STRING. */
+extern char *tilde_expand PARAMS((const char *));
+
+/* Do the work of tilde expansion on FILENAME.  FILENAME starts with a
+   tilde.  If there is no expansion, call tilde_expansion_failure_hook. */
+extern char *tilde_expand_word PARAMS((const char *));
+
+/* Find the portion of the string beginning with ~ that should be expanded. */
+extern char *tilde_find_word PARAMS((const char *, int, int *));
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _TILDE_H_ */
diff --git a/undo.c b/undo.c
new file mode 100644 (file)
index 0000000..9d9bd25
--- /dev/null
+++ b/undo.c
@@ -0,0 +1,328 @@
+/* readline.c -- a general facility for reading lines of input
+   with emacs style editing and completion. */
+
+/* Copyright (C) 1987, 1989, 1992, 2006 Free Software Foundation, Inc.
+
+   This file is part of the GNU Readline Library, a library for
+   reading lines of text with interactive input and history editing.
+
+   The GNU Readline Library 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.
+
+   The GNU Readline Library is distributed in the hope that it will be
+   useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+   of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   The GNU General Public License is often shipped with GNU software, and
+   is generally kept in a file called COPYING or LICENSE.  If you do not
+   have a copy of the license, write to the Free Software Foundation,
+   59 Temple Place, Suite 330, Boston, MA 02111 USA. */
+#define READLINE_LIBRARY
+
+#if defined (HAVE_CONFIG_H)
+#  include <config.h>
+#endif
+
+#include <sys/types.h>
+
+#if defined (HAVE_UNISTD_H)
+#  include <unistd.h>           /* for _POSIX_VERSION */
+#endif /* HAVE_UNISTD_H */
+
+#if defined (HAVE_STDLIB_H)
+#  include <stdlib.h>
+#else
+#  include "ansi_stdlib.h"
+#endif /* HAVE_STDLIB_H */
+
+#include <stdio.h>
+
+/* System-specific feature definitions and include files. */
+#include "rldefs.h"
+
+/* Some standard library routines. */
+#include "readline.h"
+#include "history.h"
+
+#include "rlprivate.h"
+#include "xmalloc.h"
+
+extern void replace_history_data PARAMS((int, histdata_t *, histdata_t *));
+
+/* Non-zero tells rl_delete_text and rl_insert_text to not add to
+   the undo list. */
+int _rl_doing_an_undo = 0;
+
+/* How many unclosed undo groups we currently have. */
+int _rl_undo_group_level = 0;
+
+/* The current undo list for THE_LINE. */
+UNDO_LIST *rl_undo_list = (UNDO_LIST *)NULL;
+
+/* **************************************************************** */
+/*                                                                 */
+/*                     Undo, and Undoing                           */
+/*                                                                 */
+/* **************************************************************** */
+
+static UNDO_LIST *
+alloc_undo_entry (what, start, end, text)
+     enum undo_code what;
+     int start, end;
+     char *text;
+{
+  UNDO_LIST *temp;
+
+  temp = (UNDO_LIST *)xmalloc (sizeof (UNDO_LIST));
+  temp->what = what;
+  temp->start = start;
+  temp->end = end;
+  temp->text = text;
+
+  temp->next = (UNDO_LIST *)NULL;
+  return temp;
+}
+
+/* Remember how to undo something.  Concatenate some undos if that
+   seems right. */
+void
+rl_add_undo (what, start, end, text)
+     enum undo_code what;
+     int start, end;
+     char *text;
+{
+  UNDO_LIST *temp;
+
+  temp = alloc_undo_entry (what, start, end, text);
+  temp->next = rl_undo_list;
+  rl_undo_list = temp;
+}
+
+/* Free the existing undo list. */
+void
+rl_free_undo_list ()
+{
+  UNDO_LIST *release, *orig_list;
+
+  orig_list = rl_undo_list;
+  while (rl_undo_list)
+    {
+      release = rl_undo_list;
+      rl_undo_list = rl_undo_list->next;
+
+      if (release->what == UNDO_DELETE)
+       free (release->text);
+
+      free (release);
+    }
+  rl_undo_list = (UNDO_LIST *)NULL;
+  replace_history_data (-1, (histdata_t *)orig_list, (histdata_t *)NULL);
+}
+
+UNDO_LIST *
+_rl_copy_undo_entry (entry)
+     UNDO_LIST *entry;
+{
+  UNDO_LIST *new;
+
+  new = alloc_undo_entry (entry->what, entry->start, entry->end, (char *)NULL);
+  new->text = entry->text ? savestring (entry->text) : 0;
+  return new;
+}
+
+UNDO_LIST *
+_rl_copy_undo_list (head)
+     UNDO_LIST *head;
+{
+  UNDO_LIST *list, *new, *roving, *c;
+
+  list = head;
+  new = 0;
+  while (list)
+    {
+      c = _rl_copy_undo_entry (list);
+      if (new == 0)
+       roving = new = c;
+      else
+       {
+         roving->next = c;
+         roving = roving->next;
+       }
+      list = list->next;
+    }
+
+  roving->next = 0;
+  return new;
+}
+
+/* Undo the next thing in the list.  Return 0 if there
+   is nothing to undo, or non-zero if there was. */
+int
+rl_do_undo ()
+{
+  UNDO_LIST *release;
+  int waiting_for_begin, start, end;
+
+#define TRANS(i) ((i) == -1 ? rl_point : ((i) == -2 ? rl_end : (i)))
+
+  start = end = waiting_for_begin = 0;
+  do
+    {
+      if (!rl_undo_list)
+       return (0);
+
+      _rl_doing_an_undo = 1;
+      RL_SETSTATE(RL_STATE_UNDOING);
+
+      /* To better support vi-mode, a start or end value of -1 means
+        rl_point, and a value of -2 means rl_end. */
+      if (rl_undo_list->what == UNDO_DELETE || rl_undo_list->what == UNDO_INSERT)
+       {
+         start = TRANS (rl_undo_list->start);
+         end = TRANS (rl_undo_list->end);
+       }
+
+      switch (rl_undo_list->what)
+       {
+       /* Undoing deletes means inserting some text. */
+       case UNDO_DELETE:
+         rl_point = start;
+         rl_insert_text (rl_undo_list->text);
+         free (rl_undo_list->text);
+         break;
+
+       /* Undoing inserts means deleting some text. */
+       case UNDO_INSERT:
+         rl_delete_text (start, end);
+         rl_point = start;
+         break;
+
+       /* Undoing an END means undoing everything 'til we get to a BEGIN. */
+       case UNDO_END:
+         waiting_for_begin++;
+         break;
+
+       /* Undoing a BEGIN means that we are done with this group. */
+       case UNDO_BEGIN:
+         if (waiting_for_begin)
+           waiting_for_begin--;
+         else
+           rl_ding ();
+         break;
+       }
+
+      _rl_doing_an_undo = 0;
+      RL_UNSETSTATE(RL_STATE_UNDOING);
+
+      release = rl_undo_list;
+      rl_undo_list = rl_undo_list->next;
+      replace_history_data (-1, (histdata_t *)release, (histdata_t *)rl_undo_list);
+
+      free (release);
+    }
+  while (waiting_for_begin);
+
+  return (1);
+}
+#undef TRANS
+
+int
+_rl_fix_last_undo_of_type (type, start, end)
+     int type, start, end;
+{
+  UNDO_LIST *rl;
+
+  for (rl = rl_undo_list; rl; rl = rl->next)
+    {
+      if (rl->what == type)
+       {
+         rl->start = start;
+         rl->end = end;
+         return 0;
+       }
+    }
+  return 1;
+}
+
+/* Begin a group.  Subsequent undos are undone as an atomic operation. */
+int
+rl_begin_undo_group ()
+{
+  rl_add_undo (UNDO_BEGIN, 0, 0, 0);
+  _rl_undo_group_level++;
+  return 0;
+}
+
+/* End an undo group started with rl_begin_undo_group (). */
+int
+rl_end_undo_group ()
+{
+  rl_add_undo (UNDO_END, 0, 0, 0);
+  _rl_undo_group_level--;
+  return 0;
+}
+
+/* Save an undo entry for the text from START to END. */
+int
+rl_modifying (start, end)
+     int start, end;
+{
+  if (start > end)
+    {
+      SWAP (start, end);
+    }
+
+  if (start != end)
+    {
+      char *temp = rl_copy_text (start, end);
+      rl_begin_undo_group ();
+      rl_add_undo (UNDO_DELETE, start, end, temp);
+      rl_add_undo (UNDO_INSERT, start, end, (char *)NULL);
+      rl_end_undo_group ();
+    }
+  return 0;
+}
+
+/* Revert the current line to its previous state. */
+int
+rl_revert_line (count, key)
+     int count, key;
+{
+  if (!rl_undo_list)
+    rl_ding ();
+  else
+    {
+      while (rl_undo_list)
+       rl_do_undo ();
+#if defined (VI_MODE)
+      if (rl_editing_mode == vi_mode)
+       rl_point = rl_mark = 0;         /* rl_end should be set correctly */
+#endif
+    }
+    
+  return 0;
+}
+
+/* Do some undoing of things that were done. */
+int
+rl_undo_command (count, key)
+     int count, key;
+{
+  if (count < 0)
+    return 0;  /* Nothing to do. */
+
+  while (count)
+    {
+      if (rl_do_undo ())
+       count--;
+      else
+       {
+         rl_ding ();
+         break;
+       }
+    }
+  return 0;
+}
diff --git a/util.c b/util.c
new file mode 100644 (file)
index 0000000..e44ef64
--- /dev/null
+++ b/util.c
@@ -0,0 +1,355 @@
+/* util.c -- readline utility functions */
+
+/* Copyright (C) 1987-2005 Free Software Foundation, Inc.
+
+   This file is part of the GNU Readline Library, a library for
+   reading lines of text with interactive input and history editing.
+
+   The GNU Readline Library 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.
+
+   The GNU Readline Library is distributed in the hope that it will be
+   useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+   of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   The GNU General Public License is often shipped with GNU software, and
+   is generally kept in a file called COPYING or LICENSE.  If you do not
+   have a copy of the license, write to the Free Software Foundation,
+   59 Temple Place, Suite 330, Boston, MA 02111 USA. */
+#define READLINE_LIBRARY
+
+#if defined (HAVE_CONFIG_H)
+#  include <config.h>
+#endif
+
+#include <sys/types.h>
+#include <fcntl.h>
+#include "posixjmp.h"
+
+#if defined (HAVE_UNISTD_H)
+#  include <unistd.h>           /* for _POSIX_VERSION */
+#endif /* HAVE_UNISTD_H */
+
+#if defined (HAVE_STDLIB_H)
+#  include <stdlib.h>
+#else
+#  include "ansi_stdlib.h"
+#endif /* HAVE_STDLIB_H */
+
+#include <stdio.h>
+#include <ctype.h>
+
+/* System-specific feature definitions and include files. */
+#include "rldefs.h"
+#include "rlmbutil.h"
+
+#if defined (TIOCSTAT_IN_SYS_IOCTL)
+#  include <sys/ioctl.h>
+#endif /* TIOCSTAT_IN_SYS_IOCTL */
+
+/* Some standard library routines. */
+#include "readline.h"
+
+#include "rlprivate.h"
+#include "xmalloc.h"
+
+/* **************************************************************** */
+/*                                                                 */
+/*                     Utility Functions                           */
+/*                                                                 */
+/* **************************************************************** */
+
+/* Return 0 if C is not a member of the class of characters that belong
+   in words, or 1 if it is. */
+
+int _rl_allow_pathname_alphabetic_chars = 0;
+static const char *pathname_alphabetic_chars = "/-_=~.#$";
+
+int
+rl_alphabetic (c)
+     int c;
+{
+  if (ALPHABETIC (c))
+    return (1);
+
+  return (_rl_allow_pathname_alphabetic_chars &&
+           strchr (pathname_alphabetic_chars, c) != NULL);
+}
+
+#if defined (HANDLE_MULTIBYTE)
+int
+_rl_walphabetic (wc)
+     wchar_t wc;
+{
+  int c;
+
+  if (iswalnum (wc))
+    return (1);     
+
+  c = wc & 0177;
+  return (_rl_allow_pathname_alphabetic_chars &&
+           strchr (pathname_alphabetic_chars, c) != NULL);
+}
+#endif
+
+/* How to abort things. */
+int
+_rl_abort_internal ()
+{
+  rl_ding ();
+  rl_clear_message ();
+  _rl_reset_argument ();
+  rl_clear_pending_input ();
+
+  RL_UNSETSTATE (RL_STATE_MACRODEF);
+  while (rl_executing_macro)
+    _rl_pop_executing_macro ();
+
+  rl_last_func = (rl_command_func_t *)NULL;
+  longjmp (readline_top_level, 1);
+  return (0);
+}
+
+int
+rl_abort (count, key)
+     int count, key;
+{
+  return (_rl_abort_internal ());
+}
+
+int
+rl_tty_status (count, key)
+     int count, key;
+{
+#if defined (TIOCSTAT)
+  ioctl (1, TIOCSTAT, (char *)0);
+  rl_refresh_line (count, key);
+#else
+  rl_ding ();
+#endif
+  return 0;
+}
+
+/* Return a copy of the string between FROM and TO.
+   FROM is inclusive, TO is not. */
+char *
+rl_copy_text (from, to)
+     int from, to;
+{
+  register int length;
+  char *copy;
+
+  /* Fix it if the caller is confused. */
+  if (from > to)
+    SWAP (from, to);
+
+  length = to - from;
+  copy = (char *)xmalloc (1 + length);
+  strncpy (copy, rl_line_buffer + from, length);
+  copy[length] = '\0';
+  return (copy);
+}
+
+/* Increase the size of RL_LINE_BUFFER until it has enough space to hold
+   LEN characters. */
+void
+rl_extend_line_buffer (len)
+     int len;
+{
+  while (len >= rl_line_buffer_len)
+    {
+      rl_line_buffer_len += DEFAULT_BUFFER_SIZE;
+      rl_line_buffer = (char *)xrealloc (rl_line_buffer, rl_line_buffer_len);
+    }
+
+  _rl_set_the_line ();
+}
+
+
+/* A function for simple tilde expansion. */
+int
+rl_tilde_expand (ignore, key)
+     int ignore, key;
+{
+  register int start, end;
+  char *homedir, *temp;
+  int len;
+
+  end = rl_point;
+  start = end - 1;
+
+  if (rl_point == rl_end && rl_line_buffer[rl_point] == '~')
+    {
+      homedir = tilde_expand ("~");
+      _rl_replace_text (homedir, start, end);
+      return (0);
+    }
+  else if (rl_line_buffer[start] != '~')
+    {
+      for (; !whitespace (rl_line_buffer[start]) && start >= 0; start--)
+        ;
+      start++;
+    }
+
+  end = start;
+  do
+    end++;
+  while (whitespace (rl_line_buffer[end]) == 0 && end < rl_end);
+
+  if (whitespace (rl_line_buffer[end]) || end >= rl_end)
+    end--;
+
+  /* If the first character of the current word is a tilde, perform
+     tilde expansion and insert the result.  If not a tilde, do
+     nothing. */
+  if (rl_line_buffer[start] == '~')
+    {
+      len = end - start + 1;
+      temp = (char *)xmalloc (len + 1);
+      strncpy (temp, rl_line_buffer + start, len);
+      temp[len] = '\0';
+      homedir = tilde_expand (temp);
+      free (temp);
+
+      _rl_replace_text (homedir, start, end);
+    }
+
+  return (0);
+}
+
+/* **************************************************************** */
+/*                                                                 */
+/*                     String Utility Functions                    */
+/*                                                                 */
+/* **************************************************************** */
+
+/* Determine if s2 occurs in s1.  If so, return a pointer to the
+   match in s1.  The compare is case insensitive. */
+char *
+_rl_strindex (s1, s2)
+     register const char *s1, *s2;
+{
+  register int i, l, len;
+
+  for (i = 0, l = strlen (s2), len = strlen (s1); (len - i) >= l; i++)
+    if (_rl_strnicmp (s1 + i, s2, l) == 0)
+      return ((char *) (s1 + i));
+  return ((char *)NULL);
+}
+
+#ifndef HAVE_STRPBRK
+/* Find the first occurrence in STRING1 of any character from STRING2.
+   Return a pointer to the character in STRING1. */
+char *
+_rl_strpbrk (string1, string2)
+     const char *string1, *string2;
+{
+  register const char *scan;
+#if defined (HANDLE_MULTIBYTE)
+  mbstate_t ps;
+  register int i, v;
+
+  memset (&ps, 0, sizeof (mbstate_t));
+#endif
+
+  for (; *string1; string1++)
+    {
+      for (scan = string2; *scan; scan++)
+       {
+         if (*string1 == *scan)
+           return ((char *)string1);
+       }
+#if defined (HANDLE_MULTIBYTE)
+      if (MB_CUR_MAX > 1 && rl_byte_oriented == 0)
+       {
+         v = _rl_get_char_len (string1, &ps);
+         if (v > 1)
+           string1 += v - 1;   /* -1 to account for auto-increment in loop */
+       }
+#endif
+    }
+  return ((char *)NULL);
+}
+#endif
+
+#if !defined (HAVE_STRCASECMP)
+/* Compare at most COUNT characters from string1 to string2.  Case
+   doesn't matter. */
+int
+_rl_strnicmp (string1, string2, count)
+     char *string1, *string2;
+     int count;
+{
+  register char ch1, ch2;
+
+  while (count)
+    {
+      ch1 = *string1++;
+      ch2 = *string2++;
+      if (_rl_to_upper(ch1) == _rl_to_upper(ch2))
+       count--;
+      else
+        break;
+    }
+  return (count);
+}
+
+/* strcmp (), but caseless. */
+int
+_rl_stricmp (string1, string2)
+     char *string1, *string2;
+{
+  register char ch1, ch2;
+
+  while (*string1 && *string2)
+    {
+      ch1 = *string1++;
+      ch2 = *string2++;
+      if (_rl_to_upper(ch1) != _rl_to_upper(ch2))
+       return (1);
+    }
+  return (*string1 - *string2);
+}
+#endif /* !HAVE_STRCASECMP */
+
+/* Stupid comparison routine for qsort () ing strings. */
+int
+_rl_qsort_string_compare (s1, s2)
+  char **s1, **s2;
+{
+#if defined (HAVE_STRCOLL)
+  return (strcoll (*s1, *s2));
+#else
+  int result;
+
+  result = **s1 - **s2;
+  if (result == 0)
+    result = strcmp (*s1, *s2);
+
+  return result;
+#endif
+}
+
+/* Function equivalents for the macros defined in chardefs.h. */
+#define FUNCTION_FOR_MACRO(f)  int (f) (c) int c; { return f (c); }
+
+FUNCTION_FOR_MACRO (_rl_digit_p)
+FUNCTION_FOR_MACRO (_rl_digit_value)
+FUNCTION_FOR_MACRO (_rl_lowercase_p)
+FUNCTION_FOR_MACRO (_rl_pure_alphabetic)
+FUNCTION_FOR_MACRO (_rl_to_lower)
+FUNCTION_FOR_MACRO (_rl_to_upper)
+FUNCTION_FOR_MACRO (_rl_uppercase_p)
+
+/* Backwards compatibility, now that savestring has been removed from
+   all `public' readline header files. */
+#undef _rl_savestring
+char *
+_rl_savestring (s)
+     const char *s;
+{
+  return (strcpy ((char *)xmalloc (1 + (int)strlen (s)), (s)));
+}
diff --git a/vi_keymap.c b/vi_keymap.c
new file mode 100644 (file)
index 0000000..4b48c75
--- /dev/null
@@ -0,0 +1,877 @@
+/* vi_keymap.c -- the keymap for vi_mode in readline (). */
+
+/* Copyright (C) 1987, 1989, 1992 Free Software Foundation, Inc.
+
+   This file is part of the GNU Readline Library, a library for
+   reading lines of text with interactive input and history editing.
+
+   The GNU Readline Library 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.
+
+   The GNU Readline Library is distributed in the hope that it will be
+   useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+   of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   The GNU General Public License is often shipped with GNU software, and
+   is generally kept in a file called COPYING or LICENSE.  If you do not
+   have a copy of the license, write to the Free Software Foundation,
+   59 Temple Place, Suite 330, Boston, MA 02111 USA. */
+
+#if !defined (BUFSIZ)
+#include <stdio.h>
+#endif /* !BUFSIZ */
+
+#include "readline.h"
+
+#if 0
+extern KEYMAP_ENTRY_ARRAY vi_escape_keymap;
+#endif
+
+/* The keymap arrays for handling vi mode. */
+KEYMAP_ENTRY_ARRAY vi_movement_keymap = {
+  /* The regular control keys come first. */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* Control-@ */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* Control-a */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* Control-b */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* Control-c */
+  { ISFUNC, rl_vi_eof_maybe },                 /* Control-d */
+  { ISFUNC, rl_emacs_editing_mode },           /* Control-e */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* Control-f */
+  { ISFUNC, rl_abort },                                /* Control-g */
+  { ISFUNC, rl_backward_char },                        /* Control-h */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* Control-i */
+  { ISFUNC, rl_newline },                      /* Control-j */
+  { ISFUNC, rl_kill_line },                    /* Control-k */
+  { ISFUNC, rl_clear_screen },                 /* Control-l */
+  { ISFUNC, rl_newline },                      /* Control-m */
+  { ISFUNC, rl_get_next_history },             /* Control-n */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* Control-o */
+  { ISFUNC, rl_get_previous_history },         /* Control-p */
+  { ISFUNC, rl_quoted_insert },                        /* Control-q */
+  { ISFUNC, rl_reverse_search_history },       /* Control-r */
+  { ISFUNC, rl_forward_search_history },       /* Control-s */
+  { ISFUNC, rl_transpose_chars },              /* Control-t */
+  { ISFUNC, rl_unix_line_discard },            /* Control-u */
+  { ISFUNC, rl_quoted_insert },                        /* Control-v */
+  { ISFUNC, rl_unix_word_rubout },             /* Control-w */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* Control-x */
+  { ISFUNC, rl_yank },                         /* Control-y */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* Control-z */
+
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* Control-[ */ /* vi_escape_keymap */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* Control-\ */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* Control-] */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* Control-^ */
+  { ISFUNC, rl_vi_undo },                      /* Control-_ */
+
+  /* The start of printing characters. */
+  { ISFUNC, rl_forward_char },                 /* SPACE */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* ! */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* " */
+  { ISFUNC, rl_insert_comment },               /* # */
+  { ISFUNC, rl_end_of_line },                  /* $ */
+  { ISFUNC, rl_vi_match },                     /* % */
+  { ISFUNC, rl_vi_tilde_expand },              /* & */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* ' */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* ( */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* ) */
+  { ISFUNC, rl_vi_complete },                  /* * */
+  { ISFUNC, rl_get_next_history},              /* + */
+  { ISFUNC, rl_vi_char_search },               /* , */
+  { ISFUNC, rl_get_previous_history },         /* - */
+  { ISFUNC, rl_vi_redo },                      /* . */
+  { ISFUNC, rl_vi_search },                    /* / */
+
+  /* Regular digits. */
+  { ISFUNC, rl_beg_of_line },                  /* 0 */
+  { ISFUNC, rl_vi_arg_digit },                 /* 1 */
+  { ISFUNC, rl_vi_arg_digit },                 /* 2 */
+  { ISFUNC, rl_vi_arg_digit },                 /* 3 */
+  { ISFUNC, rl_vi_arg_digit },                 /* 4 */
+  { ISFUNC, rl_vi_arg_digit },                 /* 5 */
+  { ISFUNC, rl_vi_arg_digit },                 /* 6 */
+  { ISFUNC, rl_vi_arg_digit },                 /* 7 */
+  { ISFUNC, rl_vi_arg_digit },                 /* 8 */
+  { ISFUNC, rl_vi_arg_digit },                 /* 9 */
+
+  /* A little more punctuation. */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* : */
+  { ISFUNC, rl_vi_char_search },               /* ; */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* < */
+  { ISFUNC, rl_vi_complete },                  /* = */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* > */
+  { ISFUNC, rl_vi_search },                    /* ? */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* @ */
+
+  /* Uppercase alphabet. */
+  { ISFUNC, rl_vi_append_eol },                        /* A */
+  { ISFUNC, rl_vi_prev_word},                  /* B */
+  { ISFUNC, rl_vi_change_to },                 /* C */
+  { ISFUNC, rl_vi_delete_to },                 /* D */
+  { ISFUNC, rl_vi_end_word },                  /* E */
+  { ISFUNC, rl_vi_char_search },               /* F */
+  { ISFUNC, rl_vi_fetch_history },             /* G */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* H */
+  { ISFUNC, rl_vi_insert_beg },                        /* I */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* J */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* K */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* L */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* M */
+  { ISFUNC, rl_vi_search_again },              /* N */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* O */
+  { ISFUNC, rl_vi_put },                       /* P */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* Q */
+  { ISFUNC, rl_vi_replace },                   /* R */
+  { ISFUNC, rl_vi_subst },                     /* S */
+  { ISFUNC, rl_vi_char_search },               /* T */
+  { ISFUNC, rl_revert_line },                  /* U */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* V */
+  { ISFUNC, rl_vi_next_word },                 /* W */
+  { ISFUNC, rl_vi_rubout },                    /* X */
+  { ISFUNC, rl_vi_yank_to },                   /* Y */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* Z */
+
+  /* Some more punctuation. */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* [ */
+  { ISFUNC, rl_vi_complete },                  /* \ */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* ] */
+  { ISFUNC, rl_vi_first_print },               /* ^ */
+  { ISFUNC, rl_vi_yank_arg },                  /* _ */
+  { ISFUNC, rl_vi_goto_mark },                 /* ` */
+
+  /* Lowercase alphabet. */
+  { ISFUNC, rl_vi_append_mode },               /* a */
+  { ISFUNC, rl_vi_prev_word },                 /* b */
+  { ISFUNC, rl_vi_change_to },                 /* c */
+  { ISFUNC, rl_vi_delete_to },                 /* d */
+  { ISFUNC, rl_vi_end_word },                  /* e */
+  { ISFUNC, rl_vi_char_search },               /* f */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* g */
+  { ISFUNC, rl_backward_char },                        /* h */
+  { ISFUNC, rl_vi_insertion_mode },            /* i */
+  { ISFUNC, rl_get_next_history },             /* j */
+  { ISFUNC, rl_get_previous_history },         /* k */
+  { ISFUNC, rl_forward_char },                 /* l */
+  { ISFUNC, rl_vi_set_mark },                  /* m */
+  { ISFUNC, rl_vi_search_again },              /* n */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* o */
+  { ISFUNC, rl_vi_put },                       /* p */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* q */
+  { ISFUNC, rl_vi_change_char },               /* r */
+  { ISFUNC, rl_vi_subst },                     /* s */
+  { ISFUNC, rl_vi_char_search },               /* t */
+  { ISFUNC, rl_vi_undo },                      /* u */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* v */
+  { ISFUNC, rl_vi_next_word },                 /* w */
+  { ISFUNC, rl_vi_delete },                    /* x */
+  { ISFUNC, rl_vi_yank_to },                   /* y */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* z */
+
+  /* Final punctuation. */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* { */
+  { ISFUNC, rl_vi_column },                    /* | */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* } */
+  { ISFUNC, rl_vi_change_case },               /* ~ */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* RUBOUT */
+
+#if KEYMAP_SIZE > 128
+  /* Undefined keys. */
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 }
+#endif /* KEYMAP_SIZE > 128 */
+};
+
+
+KEYMAP_ENTRY_ARRAY vi_insertion_keymap = {
+  /* The regular control keys come first. */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* Control-@ */
+  { ISFUNC, rl_insert },                       /* Control-a */
+  { ISFUNC, rl_insert },                       /* Control-b */
+  { ISFUNC, rl_insert },                       /* Control-c */
+  { ISFUNC, rl_vi_eof_maybe },                 /* Control-d */
+  { ISFUNC, rl_insert },                       /* Control-e */
+  { ISFUNC, rl_insert },                       /* Control-f */
+  { ISFUNC, rl_insert },                       /* Control-g */
+  { ISFUNC, rl_rubout },                       /* Control-h */
+  { ISFUNC, rl_complete },                     /* Control-i */
+  { ISFUNC, rl_newline },                      /* Control-j */
+  { ISFUNC, rl_insert },                       /* Control-k */
+  { ISFUNC, rl_insert },                       /* Control-l */
+  { ISFUNC, rl_newline },                      /* Control-m */
+  { ISFUNC, rl_insert },                       /* Control-n */
+  { ISFUNC, rl_insert },                       /* Control-o */
+  { ISFUNC, rl_insert },                       /* Control-p */
+  { ISFUNC, rl_insert },                       /* Control-q */
+  { ISFUNC, rl_reverse_search_history },       /* Control-r */
+  { ISFUNC, rl_forward_search_history },       /* Control-s */
+  { ISFUNC, rl_transpose_chars },              /* Control-t */
+  { ISFUNC, rl_unix_line_discard },            /* Control-u */
+  { ISFUNC, rl_quoted_insert },                        /* Control-v */
+  { ISFUNC, rl_unix_word_rubout },             /* Control-w */
+  { ISFUNC, rl_insert },                       /* Control-x */
+  { ISFUNC, rl_yank },                         /* Control-y */
+  { ISFUNC, rl_insert },                       /* Control-z */
+
+  { ISFUNC, rl_vi_movement_mode },             /* Control-[ */
+  { ISFUNC, rl_insert },                       /* Control-\ */
+  { ISFUNC, rl_insert },                       /* Control-] */
+  { ISFUNC, rl_insert },                       /* Control-^ */
+  { ISFUNC, rl_vi_undo },                      /* Control-_ */
+
+  /* The start of printing characters. */
+  { ISFUNC, rl_insert },                       /* SPACE */
+  { ISFUNC, rl_insert },                       /* ! */
+  { ISFUNC, rl_insert },                       /* " */
+  { ISFUNC, rl_insert },                       /* # */
+  { ISFUNC, rl_insert },                       /* $ */
+  { ISFUNC, rl_insert },                       /* % */
+  { ISFUNC, rl_insert },                       /* & */
+  { ISFUNC, rl_insert },                       /* ' */
+  { ISFUNC, rl_insert },                       /* ( */
+  { ISFUNC, rl_insert },                       /* ) */
+  { ISFUNC, rl_insert },                       /* * */
+  { ISFUNC, rl_insert },                       /* + */
+  { ISFUNC, rl_insert },                       /* , */
+  { ISFUNC, rl_insert },                       /* - */
+  { ISFUNC, rl_insert },                       /* . */
+  { ISFUNC, rl_insert },                       /* / */
+
+  /* Regular digits. */
+  { ISFUNC, rl_insert },                       /* 0 */
+  { ISFUNC, rl_insert },                       /* 1 */
+  { ISFUNC, rl_insert },                       /* 2 */
+  { ISFUNC, rl_insert },                       /* 3 */
+  { ISFUNC, rl_insert },                       /* 4 */
+  { ISFUNC, rl_insert },                       /* 5 */
+  { ISFUNC, rl_insert },                       /* 6 */
+  { ISFUNC, rl_insert },                       /* 7 */
+  { ISFUNC, rl_insert },                       /* 8 */
+  { ISFUNC, rl_insert },                       /* 9 */
+
+  /* A little more punctuation. */
+  { ISFUNC, rl_insert },                       /* : */
+  { ISFUNC, rl_insert },                       /* ; */
+  { ISFUNC, rl_insert },                       /* < */
+  { ISFUNC, rl_insert },                       /* = */
+  { ISFUNC, rl_insert },                       /* > */
+  { ISFUNC, rl_insert },                       /* ? */
+  { ISFUNC, rl_insert },                       /* @ */
+
+  /* Uppercase alphabet. */
+  { ISFUNC, rl_insert },                       /* A */
+  { ISFUNC, rl_insert },                       /* B */
+  { ISFUNC, rl_insert },                       /* C */
+  { ISFUNC, rl_insert },                       /* D */
+  { ISFUNC, rl_insert },                       /* E */
+  { ISFUNC, rl_insert },                       /* F */
+  { ISFUNC, rl_insert },                       /* G */
+  { ISFUNC, rl_insert },                       /* H */
+  { ISFUNC, rl_insert },                       /* I */
+  { ISFUNC, rl_insert },                       /* J */
+  { ISFUNC, rl_insert },                       /* K */
+  { ISFUNC, rl_insert },                       /* L */
+  { ISFUNC, rl_insert },                       /* M */
+  { ISFUNC, rl_insert },                       /* N */
+  { ISFUNC, rl_insert },                       /* O */
+  { ISFUNC, rl_insert },                       /* P */
+  { ISFUNC, rl_insert },                       /* Q */
+  { ISFUNC, rl_insert },                       /* R */
+  { ISFUNC, rl_insert },                       /* S */
+  { ISFUNC, rl_insert },                       /* T */
+  { ISFUNC, rl_insert },                       /* U */
+  { ISFUNC, rl_insert },                       /* V */
+  { ISFUNC, rl_insert },                       /* W */
+  { ISFUNC, rl_insert },                       /* X */
+  { ISFUNC, rl_insert },                       /* Y */
+  { ISFUNC, rl_insert },                       /* Z */
+
+  /* Some more punctuation. */
+  { ISFUNC, rl_insert },                       /* [ */
+  { ISFUNC, rl_insert },                       /* \ */
+  { ISFUNC, rl_insert },                       /* ] */
+  { ISFUNC, rl_insert },                       /* ^ */
+  { ISFUNC, rl_insert },                       /* _ */
+  { ISFUNC, rl_insert },                       /* ` */
+
+  /* Lowercase alphabet. */
+  { ISFUNC, rl_insert },                       /* a */
+  { ISFUNC, rl_insert },                       /* b */
+  { ISFUNC, rl_insert },                       /* c */
+  { ISFUNC, rl_insert },                       /* d */
+  { ISFUNC, rl_insert },                       /* e */
+  { ISFUNC, rl_insert },                       /* f */
+  { ISFUNC, rl_insert },                       /* g */
+  { ISFUNC, rl_insert },                       /* h */
+  { ISFUNC, rl_insert },                       /* i */
+  { ISFUNC, rl_insert },                       /* j */
+  { ISFUNC, rl_insert },                       /* k */
+  { ISFUNC, rl_insert },                       /* l */
+  { ISFUNC, rl_insert },                       /* m */
+  { ISFUNC, rl_insert },                       /* n */
+  { ISFUNC, rl_insert },                       /* o */
+  { ISFUNC, rl_insert },                       /* p */
+  { ISFUNC, rl_insert },                       /* q */
+  { ISFUNC, rl_insert },                       /* r */
+  { ISFUNC, rl_insert },                       /* s */
+  { ISFUNC, rl_insert },                       /* t */
+  { ISFUNC, rl_insert },                       /* u */
+  { ISFUNC, rl_insert },                       /* v */
+  { ISFUNC, rl_insert },                       /* w */
+  { ISFUNC, rl_insert },                       /* x */
+  { ISFUNC, rl_insert },                       /* y */
+  { ISFUNC, rl_insert },                       /* z */
+
+  /* Final punctuation. */
+  { ISFUNC, rl_insert },                       /* { */
+  { ISFUNC, rl_insert },                       /* | */
+  { ISFUNC, rl_insert },                       /* } */
+  { ISFUNC, rl_insert },                       /* ~ */
+  { ISFUNC, rl_rubout },                       /* RUBOUT */
+
+#if KEYMAP_SIZE > 128
+  /* Pure 8-bit characters (128 - 159).
+     These might be used in some
+     character sets. */
+  { ISFUNC, rl_insert },       /* ? */
+  { ISFUNC, rl_insert },       /* ? */
+  { ISFUNC, rl_insert },       /* ? */
+  { ISFUNC, rl_insert },       /* ? */
+  { ISFUNC, rl_insert },       /* ? */
+  { ISFUNC, rl_insert },       /* ? */
+  { ISFUNC, rl_insert },       /* ? */
+  { ISFUNC, rl_insert },       /* ? */
+  { ISFUNC, rl_insert },       /* ? */
+  { ISFUNC, rl_insert },       /* ? */
+  { ISFUNC, rl_insert },       /* ? */
+  { ISFUNC, rl_insert },       /* ? */
+  { ISFUNC, rl_insert },       /* ? */
+  { ISFUNC, rl_insert },       /* ? */
+  { ISFUNC, rl_insert },       /* ? */
+  { ISFUNC, rl_insert },       /* ? */
+  { ISFUNC, rl_insert },       /* ? */
+  { ISFUNC, rl_insert },       /* ? */
+  { ISFUNC, rl_insert },       /* ? */
+  { ISFUNC, rl_insert },       /* ? */
+  { ISFUNC, rl_insert },       /* ? */
+  { ISFUNC, rl_insert },       /* ? */
+  { ISFUNC, rl_insert },       /* ? */
+  { ISFUNC, rl_insert },       /* ? */
+  { ISFUNC, rl_insert },       /* ? */
+  { ISFUNC, rl_insert },       /* ? */
+  { ISFUNC, rl_insert },       /* ? */
+  { ISFUNC, rl_insert },       /* ? */
+  { ISFUNC, rl_insert },       /* ? */
+  { ISFUNC, rl_insert },       /* ? */
+  { ISFUNC, rl_insert },       /* ? */
+  { ISFUNC, rl_insert },       /* ? */
+
+  /* ISO Latin-1 characters (160 - 255) */
+  { ISFUNC, rl_insert },       /* No-break space */
+  { ISFUNC, rl_insert },       /* Inverted exclamation mark */
+  { ISFUNC, rl_insert },       /* Cent sign */
+  { ISFUNC, rl_insert },       /* Pound sign */
+  { ISFUNC, rl_insert },       /* Currency sign */
+  { ISFUNC, rl_insert },       /* Yen sign */
+  { ISFUNC, rl_insert },       /* Broken bar */
+  { ISFUNC, rl_insert },       /* Section sign */
+  { ISFUNC, rl_insert },       /* Diaeresis */
+  { ISFUNC, rl_insert },       /* Copyright sign */
+  { ISFUNC, rl_insert },       /* Feminine ordinal indicator */
+  { ISFUNC, rl_insert },       /* Left pointing double angle quotation mark */
+  { ISFUNC, rl_insert },       /* Not sign */
+  { ISFUNC, rl_insert },       /* Soft hyphen */
+  { ISFUNC, rl_insert },       /* Registered sign */
+  { ISFUNC, rl_insert },       /* Macron */
+  { ISFUNC, rl_insert },       /* Degree sign */
+  { ISFUNC, rl_insert },       /* Plus-minus sign */
+  { ISFUNC, rl_insert },       /* Superscript two */
+  { ISFUNC, rl_insert },       /* Superscript three */
+  { ISFUNC, rl_insert },       /* Acute accent */
+  { ISFUNC, rl_insert },       /* Micro sign */
+  { ISFUNC, rl_insert },       /* Pilcrow sign */
+  { ISFUNC, rl_insert },       /* Middle dot */
+  { ISFUNC, rl_insert },       /* Cedilla */
+  { ISFUNC, rl_insert },       /* Superscript one */
+  { ISFUNC, rl_insert },       /* Masculine ordinal indicator */
+  { ISFUNC, rl_insert },       /* Right pointing double angle quotation mark */
+  { ISFUNC, rl_insert },       /* Vulgar fraction one quarter */
+  { ISFUNC, rl_insert },       /* Vulgar fraction one half */
+  { ISFUNC, rl_insert },       /* Vulgar fraction three quarters */
+  { ISFUNC, rl_insert },       /* Inverted questionk mark */
+  { ISFUNC, rl_insert },       /* Latin capital letter a with grave */
+  { ISFUNC, rl_insert },       /* Latin capital letter a with acute */
+  { ISFUNC, rl_insert },       /* Latin capital letter a with circumflex */
+  { ISFUNC, rl_insert },       /* Latin capital letter a with tilde */
+  { ISFUNC, rl_insert },       /* Latin capital letter a with diaeresis */
+  { ISFUNC, rl_insert },       /* Latin capital letter a with ring above */
+  { ISFUNC, rl_insert },       /* Latin capital letter ae */
+  { ISFUNC, rl_insert },       /* Latin capital letter c with cedilla */
+  { ISFUNC, rl_insert },       /* Latin capital letter e with grave */
+  { ISFUNC, rl_insert },       /* Latin capital letter e with acute */
+  { ISFUNC, rl_insert },       /* Latin capital letter e with circumflex */
+  { ISFUNC, rl_insert },       /* Latin capital letter e with diaeresis */
+  { ISFUNC, rl_insert },       /* Latin capital letter i with grave */
+  { ISFUNC, rl_insert },       /* Latin capital letter i with acute */
+  { ISFUNC, rl_insert },       /* Latin capital letter i with circumflex */
+  { ISFUNC, rl_insert },       /* Latin capital letter i with diaeresis */
+  { ISFUNC, rl_insert },       /* Latin capital letter eth (Icelandic) */
+  { ISFUNC, rl_insert },       /* Latin capital letter n with tilde */
+  { ISFUNC, rl_insert },       /* Latin capital letter o with grave */
+  { ISFUNC, rl_insert },       /* Latin capital letter o with acute */
+  { ISFUNC, rl_insert },       /* Latin capital letter o with circumflex */
+  { ISFUNC, rl_insert },       /* Latin capital letter o with tilde */
+  { ISFUNC, rl_insert },       /* Latin capital letter o with diaeresis */
+  { ISFUNC, rl_insert },       /* Multiplication sign */
+  { ISFUNC, rl_insert },       /* Latin capital letter o with stroke */
+  { ISFUNC, rl_insert },       /* Latin capital letter u with grave */
+  { ISFUNC, rl_insert },       /* Latin capital letter u with acute */
+  { ISFUNC, rl_insert },       /* Latin capital letter u with circumflex */
+  { ISFUNC, rl_insert },       /* Latin capital letter u with diaeresis */
+  { ISFUNC, rl_insert },       /* Latin capital letter Y with acute */
+  { ISFUNC, rl_insert },       /* Latin capital letter thorn (Icelandic) */
+  { ISFUNC, rl_insert },       /* Latin small letter sharp s (German) */
+  { ISFUNC, rl_insert },       /* Latin small letter a with grave */
+  { ISFUNC, rl_insert },       /* Latin small letter a with acute */
+  { ISFUNC, rl_insert },       /* Latin small letter a with circumflex */
+  { ISFUNC, rl_insert },       /* Latin small letter a with tilde */
+  { ISFUNC, rl_insert },       /* Latin small letter a with diaeresis */
+  { ISFUNC, rl_insert },       /* Latin small letter a with ring above */
+  { ISFUNC, rl_insert },       /* Latin small letter ae */
+  { ISFUNC, rl_insert },       /* Latin small letter c with cedilla */
+  { ISFUNC, rl_insert },       /* Latin small letter e with grave */
+  { ISFUNC, rl_insert },       /* Latin small letter e with acute */
+  { ISFUNC, rl_insert },       /* Latin small letter e with circumflex */
+  { ISFUNC, rl_insert },       /* Latin small letter e with diaeresis */
+  { ISFUNC, rl_insert },       /* Latin small letter i with grave */
+  { ISFUNC, rl_insert },       /* Latin small letter i with acute */
+  { ISFUNC, rl_insert },       /* Latin small letter i with circumflex */
+  { ISFUNC, rl_insert },       /* Latin small letter i with diaeresis */
+  { ISFUNC, rl_insert },       /* Latin small letter eth (Icelandic) */
+  { ISFUNC, rl_insert },       /* Latin small letter n with tilde */
+  { ISFUNC, rl_insert },       /* Latin small letter o with grave */
+  { ISFUNC, rl_insert },       /* Latin small letter o with acute */
+  { ISFUNC, rl_insert },       /* Latin small letter o with circumflex */
+  { ISFUNC, rl_insert },       /* Latin small letter o with tilde */
+  { ISFUNC, rl_insert },       /* Latin small letter o with diaeresis */
+  { ISFUNC, rl_insert },       /* Division sign */
+  { ISFUNC, rl_insert },       /* Latin small letter o with stroke */
+  { ISFUNC, rl_insert },       /* Latin small letter u with grave */
+  { ISFUNC, rl_insert },       /* Latin small letter u with acute */
+  { ISFUNC, rl_insert },       /* Latin small letter u with circumflex */
+  { ISFUNC, rl_insert },       /* Latin small letter u with diaeresis */
+  { ISFUNC, rl_insert },       /* Latin small letter y with acute */
+  { ISFUNC, rl_insert },       /* Latin small letter thorn (Icelandic) */
+  { ISFUNC, rl_insert }                /* Latin small letter y with diaeresis */
+#endif /* KEYMAP_SIZE > 128 */
+};
+
+/* Unused for the time being. */
+#if 0
+KEYMAP_ENTRY_ARRAY vi_escape_keymap = {
+  /* The regular control keys come first. */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* Control-@ */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* Control-a */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* Control-b */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* Control-c */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* Control-d */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* Control-e */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* Control-f */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* Control-g */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* Control-h */
+  { ISFUNC, rl_tab_insert},                    /* Control-i */
+  { ISFUNC, rl_emacs_editing_mode},            /* Control-j */
+  { ISFUNC, rl_kill_line },                    /* Control-k */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* Control-l */
+  { ISFUNC, rl_emacs_editing_mode},            /* Control-m */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* Control-n */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* Control-o */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* Control-p */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* Control-q */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* Control-r */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* Control-s */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* Control-t */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* Control-u */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* Control-v */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* Control-w */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* Control-x */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* Control-y */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* Control-z */
+
+  { ISFUNC, rl_vi_movement_mode },             /* Control-[ */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* Control-\ */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* Control-] */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* Control-^ */
+  { ISFUNC, rl_vi_undo },                      /* Control-_ */
+
+  /* The start of printing characters. */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* SPACE */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* ! */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* " */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* # */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* $ */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* % */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* & */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* ' */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* ( */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* ) */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* * */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* + */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* , */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* - */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* . */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* / */
+
+  /* Regular digits. */
+  { ISFUNC, rl_vi_arg_digit },                 /* 0 */
+  { ISFUNC, rl_vi_arg_digit },                 /* 1 */
+  { ISFUNC, rl_vi_arg_digit },                 /* 2 */
+  { ISFUNC, rl_vi_arg_digit },                 /* 3 */
+  { ISFUNC, rl_vi_arg_digit },                 /* 4 */
+  { ISFUNC, rl_vi_arg_digit },                 /* 5 */
+  { ISFUNC, rl_vi_arg_digit },                 /* 6 */
+  { ISFUNC, rl_vi_arg_digit },                 /* 7 */
+  { ISFUNC, rl_vi_arg_digit },                 /* 8 */
+  { ISFUNC, rl_vi_arg_digit },                 /* 9 */
+
+  /* A little more punctuation. */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* : */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* ; */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* < */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* = */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* > */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* ? */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* @ */
+
+  /* Uppercase alphabet. */
+  { ISFUNC, rl_do_lowercase_version },         /* A */
+  { ISFUNC, rl_do_lowercase_version },         /* B */
+  { ISFUNC, rl_do_lowercase_version },         /* C */
+  { ISFUNC, rl_do_lowercase_version },         /* D */
+  { ISFUNC, rl_do_lowercase_version },         /* E */
+  { ISFUNC, rl_do_lowercase_version },         /* F */
+  { ISFUNC, rl_do_lowercase_version },         /* G */
+  { ISFUNC, rl_do_lowercase_version },         /* H */
+  { ISFUNC, rl_do_lowercase_version },         /* I */
+  { ISFUNC, rl_do_lowercase_version },         /* J */
+  { ISFUNC, rl_do_lowercase_version },         /* K */
+  { ISFUNC, rl_do_lowercase_version },         /* L */
+  { ISFUNC, rl_do_lowercase_version },         /* M */
+  { ISFUNC, rl_do_lowercase_version },         /* N */
+  { ISFUNC, rl_do_lowercase_version },         /* O */
+  { ISFUNC, rl_do_lowercase_version },         /* P */
+  { ISFUNC, rl_do_lowercase_version },         /* Q */
+  { ISFUNC, rl_do_lowercase_version },         /* R */
+  { ISFUNC, rl_do_lowercase_version },         /* S */
+  { ISFUNC, rl_do_lowercase_version },         /* T */
+  { ISFUNC, rl_do_lowercase_version },         /* U */
+  { ISFUNC, rl_do_lowercase_version },         /* V */
+  { ISFUNC, rl_do_lowercase_version },         /* W */
+  { ISFUNC, rl_do_lowercase_version },         /* X */
+  { ISFUNC, rl_do_lowercase_version },         /* Y */
+  { ISFUNC, rl_do_lowercase_version },         /* Z */
+
+  /* Some more punctuation. */
+  { ISFUNC, rl_arrow_keys },                   /* [ */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* \ */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* ] */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* ^ */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* _ */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* ` */
+
+  /* Lowercase alphabet. */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* a */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* b */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* c */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* d */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* e */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* f */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* g */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* h */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* i */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* j */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* k */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* l */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* m */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* n */
+  { ISFUNC, rl_arrow_keys },                   /* o */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* p */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* q */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* r */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* s */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* t */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* u */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* v */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* w */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* x */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* y */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* z */
+
+  /* Final punctuation. */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* { */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* | */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* } */
+  { ISFUNC, (rl_command_func_t *)0x0 },                /* ~ */
+  { ISFUNC, rl_backward_kill_word },           /* RUBOUT */
+
+#if KEYMAP_SIZE > 128
+  /* Undefined keys. */
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 },
+  { ISFUNC, (rl_command_func_t *)0x0 }
+#endif /* KEYMAP_SIZE > 128 */
+};
+#endif
diff --git a/vi_mode.c b/vi_mode.c
new file mode 100644 (file)
index 0000000..d0b7e33
--- /dev/null
+++ b/vi_mode.c
@@ -0,0 +1,1748 @@
+/* vi_mode.c -- A vi emulation mode for Bash.
+   Derived from code written by Jeff Sparkes (jsparkes@bnr.ca).  */
+
+/* Copyright (C) 1987-2005 Free Software Foundation, Inc.
+
+   This file is part of the GNU Readline Library, a library for
+   reading lines of text with interactive input and history editing.
+
+   The GNU Readline Library 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.
+
+   The GNU Readline Library is distributed in the hope that it will be
+   useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+   of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   The GNU General Public License is often shipped with GNU software, and
+   is generally kept in a file called COPYING or LICENSE.  If you do not
+   have a copy of the license, write to the Free Software Foundation,
+   59 Temple Place, Suite 330, Boston, MA 02111 USA. */
+#define READLINE_LIBRARY
+
+/* **************************************************************** */
+/*                                                                 */
+/*                     VI Emulation Mode                           */
+/*                                                                 */
+/* **************************************************************** */
+#include "rlconf.h"
+
+#if defined (VI_MODE)
+
+#if defined (HAVE_CONFIG_H)
+#  include <config.h>
+#endif
+
+#include <sys/types.h>
+
+#if defined (HAVE_STDLIB_H)
+#  include <stdlib.h>
+#else
+#  include "ansi_stdlib.h"
+#endif /* HAVE_STDLIB_H */
+
+#if defined (HAVE_UNISTD_H)
+#  include <unistd.h>
+#endif
+
+#include <stdio.h>
+
+/* Some standard library routines. */
+#include "rldefs.h"
+#include "rlmbutil.h"
+
+#include "readline.h"
+#include "history.h"
+
+#include "rlprivate.h"
+#include "xmalloc.h"
+
+#ifndef member
+#define member(c, s) ((c) ? (char *)strchr ((s), (c)) != (char *)NULL : 0)
+#endif
+
+int _rl_vi_last_command = 'i'; /* default `.' puts you in insert mode */
+
+/* Non-zero means enter insertion mode. */
+static int _rl_vi_doing_insert;
+
+/* Command keys which do movement for xxx_to commands. */
+static const char *vi_motion = " hl^$0ftFT;,%wbeWBE|";
+
+/* Keymap used for vi replace characters.  Created dynamically since
+   rarely used. */
+static Keymap vi_replace_map;
+
+/* The number of characters inserted in the last replace operation. */
+static int vi_replace_count;
+
+/* If non-zero, we have text inserted after a c[motion] command that put
+   us implicitly into insert mode.  Some people want this text to be
+   attached to the command so that it is `redoable' with `.'. */
+static int vi_continued_command;
+static char *vi_insert_buffer;
+static int vi_insert_buffer_size;
+
+static int _rl_vi_last_repeat = 1;
+static int _rl_vi_last_arg_sign = 1;
+static int _rl_vi_last_motion;
+#if defined (HANDLE_MULTIBYTE)
+static char _rl_vi_last_search_mbchar[MB_LEN_MAX];
+static int _rl_vi_last_search_mblen;
+#else
+static int _rl_vi_last_search_char;
+#endif
+static int _rl_vi_last_replacement;
+
+static int _rl_vi_last_key_before_insert;
+
+static int vi_redoing;
+
+/* Text modification commands.  These are the `redoable' commands. */
+static const char *vi_textmod = "_*\\AaIiCcDdPpYyRrSsXx~";
+
+/* Arrays for the saved marks. */
+static int vi_mark_chars['z' - 'a' + 1];
+
+static void _rl_vi_stuff_insert PARAMS((int));
+static void _rl_vi_save_insert PARAMS((UNDO_LIST *));
+
+static void _rl_vi_backup PARAMS((void));
+
+static int _rl_vi_arg_dispatch PARAMS((int));
+static int rl_digit_loop1 PARAMS((void));
+
+static int _rl_vi_set_mark PARAMS((void));
+static int _rl_vi_goto_mark PARAMS((void));
+
+static void _rl_vi_append_forward PARAMS((int));
+
+static int _rl_vi_callback_getchar PARAMS((char *, int));
+
+#if defined (READLINE_CALLBACKS)
+static int _rl_vi_callback_set_mark PARAMS((_rl_callback_generic_arg *));
+static int _rl_vi_callback_goto_mark PARAMS((_rl_callback_generic_arg *));
+static int _rl_vi_callback_change_char PARAMS((_rl_callback_generic_arg *));
+static int _rl_vi_callback_char_search PARAMS((_rl_callback_generic_arg *));
+#endif
+
+void
+_rl_vi_initialize_line ()
+{
+  register int i;
+
+  for (i = 0; i < sizeof (vi_mark_chars) / sizeof (int); i++)
+    vi_mark_chars[i] = -1;
+
+  RL_UNSETSTATE(RL_STATE_VICMDONCE);
+}
+
+void
+_rl_vi_reset_last ()
+{
+  _rl_vi_last_command = 'i';
+  _rl_vi_last_repeat = 1;
+  _rl_vi_last_arg_sign = 1;
+  _rl_vi_last_motion = 0;
+}
+
+void
+_rl_vi_set_last (key, repeat, sign)
+     int key, repeat, sign;
+{
+  _rl_vi_last_command = key;
+  _rl_vi_last_repeat = repeat;
+  _rl_vi_last_arg_sign = sign;
+}
+
+/* A convenience function that calls _rl_vi_set_last to save the last command
+   information and enters insertion mode. */
+void
+rl_vi_start_inserting (key, repeat, sign)
+     int key, repeat, sign;
+{
+  _rl_vi_set_last (key, repeat, sign);
+  rl_vi_insertion_mode (1, key);
+}
+
+/* Is the command C a VI mode text modification command? */
+int
+_rl_vi_textmod_command (c)
+     int c;
+{
+  return (member (c, vi_textmod));
+}
+
+static void
+_rl_vi_stuff_insert (count)
+     int count;
+{
+  rl_begin_undo_group ();
+  while (count--)
+    rl_insert_text (vi_insert_buffer);
+  rl_end_undo_group ();
+}
+
+/* Bound to `.'.  Called from command mode, so we know that we have to
+   redo a text modification command.  The default for _rl_vi_last_command
+   puts you back into insert mode. */
+int
+rl_vi_redo (count, c)
+     int count, c;
+{
+  int r;
+
+  if (!rl_explicit_arg)
+    {
+      rl_numeric_arg = _rl_vi_last_repeat;
+      rl_arg_sign = _rl_vi_last_arg_sign;
+    }
+
+  r = 0;
+  vi_redoing = 1;
+  /* If we're redoing an insert with `i', stuff in the inserted text
+     and do not go into insertion mode. */
+  if (_rl_vi_last_command == 'i' && vi_insert_buffer && *vi_insert_buffer)
+    {
+      _rl_vi_stuff_insert (count);
+      /* And back up point over the last character inserted. */
+      if (rl_point > 0)
+       _rl_vi_backup ();
+    }
+  /* Ditto for redoing an insert with `a', but move forward a character first
+     like the `a' command does. */
+  else if (_rl_vi_last_command == 'a' && vi_insert_buffer && *vi_insert_buffer)
+    {
+      _rl_vi_append_forward ('a');
+      _rl_vi_stuff_insert (count);
+      if (rl_point > 0)
+       _rl_vi_backup ();
+    }
+  else
+    r = _rl_dispatch (_rl_vi_last_command, _rl_keymap);
+  vi_redoing = 0;
+
+  return (r);
+}
+
+/* A placeholder for further expansion. */
+int
+rl_vi_undo (count, key)
+     int count, key;
+{
+  return (rl_undo_command (count, key));
+}
+    
+/* Yank the nth arg from the previous line into this line at point. */
+int
+rl_vi_yank_arg (count, key)
+     int count, key;
+{
+  /* Readline thinks that the first word on a line is the 0th, while vi
+     thinks the first word on a line is the 1st.  Compensate. */
+  if (rl_explicit_arg)
+    rl_yank_nth_arg (count - 1, 0);
+  else
+    rl_yank_nth_arg ('$', 0);
+
+  return (0);
+}
+
+/* With an argument, move back that many history lines, else move to the
+   beginning of history. */
+int
+rl_vi_fetch_history (count, c)
+     int count, c;
+{
+  int wanted;
+
+  /* Giving an argument of n means we want the nth command in the history
+     file.  The command number is interpreted the same way that the bash
+     `history' command does it -- that is, giving an argument count of 450
+     to this command would get the command listed as number 450 in the
+     output of `history'. */
+  if (rl_explicit_arg)
+    {
+      wanted = history_base + where_history () - count;
+      if (wanted <= 0)
+        rl_beginning_of_history (0, 0);
+      else
+        rl_get_previous_history (wanted, c);
+    }
+  else
+    rl_beginning_of_history (count, 0);
+  return (0);
+}
+
+/* Search again for the last thing searched for. */
+int
+rl_vi_search_again (count, key)
+     int count, key;
+{
+  switch (key)
+    {
+    case 'n':
+      rl_noninc_reverse_search_again (count, key);
+      break;
+
+    case 'N':
+      rl_noninc_forward_search_again (count, key);
+      break;
+    }
+  return (0);
+}
+
+/* Do a vi style search. */
+int
+rl_vi_search (count, key)
+     int count, key;
+{
+  switch (key)
+    {
+    case '?':
+      _rl_free_saved_history_line ();
+      rl_noninc_forward_search (count, key);
+      break;
+
+    case '/':
+      _rl_free_saved_history_line ();
+      rl_noninc_reverse_search (count, key);
+      break;
+
+    default:
+      rl_ding ();
+      break;
+    }
+  return (0);
+}
+
+/* Completion, from vi's point of view. */
+int
+rl_vi_complete (ignore, key)
+     int ignore, key;
+{
+  if ((rl_point < rl_end) && (!whitespace (rl_line_buffer[rl_point])))
+    {
+      if (!whitespace (rl_line_buffer[rl_point + 1]))
+       rl_vi_end_word (1, 'E');
+      rl_point++;
+    }
+
+  if (key == '*')
+    rl_complete_internal ('*');        /* Expansion and replacement. */
+  else if (key == '=')
+    rl_complete_internal ('?');        /* List possible completions. */
+  else if (key == '\\')
+    rl_complete_internal (TAB);        /* Standard Readline completion. */
+  else
+    rl_complete (0, key);
+
+  if (key == '*' || key == '\\')
+    rl_vi_start_inserting (key, 1, rl_arg_sign);
+
+  return (0);
+}
+
+/* Tilde expansion for vi mode. */
+int
+rl_vi_tilde_expand (ignore, key)
+     int ignore, key;
+{
+  rl_tilde_expand (0, key);
+  rl_vi_start_inserting (key, 1, rl_arg_sign);
+  return (0);
+}
+
+/* Previous word in vi mode. */
+int
+rl_vi_prev_word (count, key)
+     int count, key;
+{
+  if (count < 0)
+    return (rl_vi_next_word (-count, key));
+
+  if (rl_point == 0)
+    {
+      rl_ding ();
+      return (0);
+    }
+
+  if (_rl_uppercase_p (key))
+    rl_vi_bWord (count, key);
+  else
+    rl_vi_bword (count, key);
+
+  return (0);
+}
+
+/* Next word in vi mode. */
+int
+rl_vi_next_word (count, key)
+     int count, key;
+{
+  if (count < 0)
+    return (rl_vi_prev_word (-count, key));
+
+  if (rl_point >= (rl_end - 1))
+    {
+      rl_ding ();
+      return (0);
+    }
+
+  if (_rl_uppercase_p (key))
+    rl_vi_fWord (count, key);
+  else
+    rl_vi_fword (count, key);
+  return (0);
+}
+
+/* Move to the end of the ?next? word. */
+int
+rl_vi_end_word (count, key)
+     int count, key;
+{
+  if (count < 0)
+    {
+      rl_ding ();
+      return -1;
+    }
+
+  if (_rl_uppercase_p (key))
+    rl_vi_eWord (count, key);
+  else
+    rl_vi_eword (count, key);
+  return (0);
+}
+
+/* Move forward a word the way that 'W' does. */
+int
+rl_vi_fWord (count, ignore)
+     int count, ignore;
+{
+  while (count-- && rl_point < (rl_end - 1))
+    {
+      /* Skip until whitespace. */
+      while (!whitespace (rl_line_buffer[rl_point]) && rl_point < rl_end)
+       rl_point++;
+
+      /* Now skip whitespace. */
+      while (whitespace (rl_line_buffer[rl_point]) && rl_point < rl_end)
+       rl_point++;
+    }
+  return (0);
+}
+
+int
+rl_vi_bWord (count, ignore)
+     int count, ignore;
+{
+  while (count-- && rl_point > 0)
+    {
+      /* If we are at the start of a word, move back to whitespace so
+        we will go back to the start of the previous word. */
+      if (!whitespace (rl_line_buffer[rl_point]) &&
+         whitespace (rl_line_buffer[rl_point - 1]))
+       rl_point--;
+
+      while (rl_point > 0 && whitespace (rl_line_buffer[rl_point]))
+       rl_point--;
+
+      if (rl_point > 0)
+       {
+         while (--rl_point >= 0 && !whitespace (rl_line_buffer[rl_point]));
+         rl_point++;
+       }
+    }
+  return (0);
+}
+
+int
+rl_vi_eWord (count, ignore)
+     int count, ignore;
+{
+  while (count-- && rl_point < (rl_end - 1))
+    {
+      if (!whitespace (rl_line_buffer[rl_point]))
+       rl_point++;
+
+      /* Move to the next non-whitespace character (to the start of the
+        next word). */
+      while (rl_point < rl_end && whitespace (rl_line_buffer[rl_point]))
+       rl_point++;
+
+      if (rl_point && rl_point < rl_end)
+       {
+         /* Skip whitespace. */
+         while (rl_point < rl_end && whitespace (rl_line_buffer[rl_point]))
+           rl_point++;
+
+         /* Skip until whitespace. */
+         while (rl_point < rl_end && !whitespace (rl_line_buffer[rl_point]))
+           rl_point++;
+
+         /* Move back to the last character of the word. */
+         rl_point--;
+       }
+    }
+  return (0);
+}
+
+int
+rl_vi_fword (count, ignore)
+     int count, ignore;
+{
+  while (count-- && rl_point < (rl_end - 1))
+    {
+      /* Move to white space (really non-identifer). */
+      if (_rl_isident (rl_line_buffer[rl_point]))
+       {
+         while (_rl_isident (rl_line_buffer[rl_point]) && rl_point < rl_end)
+           rl_point++;
+       }
+      else /* if (!whitespace (rl_line_buffer[rl_point])) */
+       {
+         while (!_rl_isident (rl_line_buffer[rl_point]) &&
+                !whitespace (rl_line_buffer[rl_point]) && rl_point < rl_end)
+           rl_point++;
+       }
+
+      /* Move past whitespace. */
+      while (whitespace (rl_line_buffer[rl_point]) && rl_point < rl_end)
+       rl_point++;
+    }
+  return (0);
+}
+
+int
+rl_vi_bword (count, ignore)
+     int count, ignore;
+{
+  while (count-- && rl_point > 0)
+    {
+      int last_is_ident;
+
+      /* If we are at the start of a word, move back to whitespace
+        so we will go back to the start of the previous word. */
+      if (!whitespace (rl_line_buffer[rl_point]) &&
+         whitespace (rl_line_buffer[rl_point - 1]))
+       rl_point--;
+
+      /* If this character and the previous character are `opposite', move
+        back so we don't get messed up by the rl_point++ down there in
+        the while loop.  Without this code, words like `l;' screw up the
+        function. */
+      last_is_ident = _rl_isident (rl_line_buffer[rl_point - 1]);
+      if ((_rl_isident (rl_line_buffer[rl_point]) && !last_is_ident) ||
+         (!_rl_isident (rl_line_buffer[rl_point]) && last_is_ident))
+       rl_point--;
+
+      while (rl_point > 0 && whitespace (rl_line_buffer[rl_point]))
+       rl_point--;
+
+      if (rl_point > 0)
+       {
+         if (_rl_isident (rl_line_buffer[rl_point]))
+           while (--rl_point >= 0 && _rl_isident (rl_line_buffer[rl_point]));
+         else
+           while (--rl_point >= 0 && !_rl_isident (rl_line_buffer[rl_point]) &&
+                  !whitespace (rl_line_buffer[rl_point]));
+         rl_point++;
+       }
+    }
+  return (0);
+}
+
+int
+rl_vi_eword (count, ignore)
+     int count, ignore;
+{
+  while (count-- && rl_point < rl_end - 1)
+    {
+      if (!whitespace (rl_line_buffer[rl_point]))
+       rl_point++;
+
+      while (rl_point < rl_end && whitespace (rl_line_buffer[rl_point]))
+       rl_point++;
+
+      if (rl_point < rl_end)
+       {
+         if (_rl_isident (rl_line_buffer[rl_point]))
+           while (++rl_point < rl_end && _rl_isident (rl_line_buffer[rl_point]));
+         else
+           while (++rl_point < rl_end && !_rl_isident (rl_line_buffer[rl_point])
+                  && !whitespace (rl_line_buffer[rl_point]));
+       }
+      rl_point--;
+    }
+  return (0);
+}
+
+int
+rl_vi_insert_beg (count, key)
+     int count, key;
+{
+  rl_beg_of_line (1, key);
+  rl_vi_insertion_mode (1, key);
+  return (0);
+}
+
+static void
+_rl_vi_append_forward (key)
+     int key;
+{
+  int point;
+
+  if (rl_point < rl_end)
+    {
+      if (MB_CUR_MAX == 1 || rl_byte_oriented)
+       rl_point++;
+      else
+        {
+          point = rl_point;
+          rl_forward_char (1, key);
+          if (point == rl_point)
+            rl_point = rl_end;
+        }
+    }
+}
+
+int
+rl_vi_append_mode (count, key)
+     int count, key;
+{
+  _rl_vi_append_forward (key);
+  rl_vi_start_inserting (key, 1, rl_arg_sign);
+  return (0);
+}
+
+int
+rl_vi_append_eol (count, key)
+     int count, key;
+{
+  rl_end_of_line (1, key);
+  rl_vi_append_mode (1, key);
+  return (0);
+}
+
+/* What to do in the case of C-d. */
+int
+rl_vi_eof_maybe (count, c)
+     int count, c;
+{
+  return (rl_newline (1, '\n'));
+}
+
+/* Insertion mode stuff. */
+
+/* Switching from one mode to the other really just involves
+   switching keymaps. */
+int
+rl_vi_insertion_mode (count, key)
+     int count, key;
+{
+  _rl_keymap = vi_insertion_keymap;
+  _rl_vi_last_key_before_insert = key;
+  return (0);
+}
+
+static void
+_rl_vi_save_insert (up)
+      UNDO_LIST *up;
+{
+  int len, start, end;
+
+  if (up == 0 || up->what != UNDO_INSERT)
+    {
+      if (vi_insert_buffer_size >= 1)
+       vi_insert_buffer[0] = '\0';
+      return;
+    }
+
+  start = up->start;
+  end = up->end;
+  len = end - start + 1;
+  if (len >= vi_insert_buffer_size)
+    {
+      vi_insert_buffer_size += (len + 32) - (len % 32);
+      vi_insert_buffer = (char *)xrealloc (vi_insert_buffer, vi_insert_buffer_size);
+    }
+  strncpy (vi_insert_buffer, rl_line_buffer + start, len - 1);
+  vi_insert_buffer[len-1] = '\0';
+}
+    
+void
+_rl_vi_done_inserting ()
+{
+  if (_rl_vi_doing_insert)
+    {
+      /* The `C', `s', and `S' commands set this. */
+      rl_end_undo_group ();
+      /* Now, the text between rl_undo_list->next->start and
+        rl_undo_list->next->end is what was inserted while in insert
+        mode.  It gets copied to VI_INSERT_BUFFER because it depends
+        on absolute indices into the line which may change (though they
+        probably will not). */
+      _rl_vi_doing_insert = 0;
+      _rl_vi_save_insert (rl_undo_list->next);
+      vi_continued_command = 1;
+    }
+  else
+    {
+      if ((_rl_vi_last_key_before_insert == 'i' || _rl_vi_last_key_before_insert == 'a') && rl_undo_list)
+        _rl_vi_save_insert (rl_undo_list);
+      /* XXX - Other keys probably need to be checked. */
+      else if (_rl_vi_last_key_before_insert == 'C')
+       rl_end_undo_group ();
+      while (_rl_undo_group_level > 0)
+       rl_end_undo_group ();
+      vi_continued_command = 0;
+    }
+}
+
+int
+rl_vi_movement_mode (count, key)
+     int count, key;
+{
+  if (rl_point > 0)
+    rl_backward_char (1, key);
+
+  _rl_keymap = vi_movement_keymap;
+  _rl_vi_done_inserting ();
+
+  /* This is how POSIX.2 says `U' should behave -- everything up until the
+     first time you go into command mode should not be undone. */
+  if (RL_ISSTATE (RL_STATE_VICMDONCE) == 0)
+    rl_free_undo_list ();
+
+  RL_SETSTATE (RL_STATE_VICMDONCE);
+  return (0);
+}
+
+int
+rl_vi_arg_digit (count, c)
+     int count, c;
+{
+  if (c == '0' && rl_numeric_arg == 1 && !rl_explicit_arg)
+    return (rl_beg_of_line (1, c));
+  else
+    return (rl_digit_argument (count, c));
+}
+
+/* Change the case of the next COUNT characters. */
+#if defined (HANDLE_MULTIBYTE)
+static int
+_rl_vi_change_mbchar_case (count)
+     int count;
+{
+  wchar_t wc;
+  char mb[MB_LEN_MAX+1];
+  int mlen, p;
+  mbstate_t ps;
+
+  memset (&ps, 0, sizeof (mbstate_t));
+  if (_rl_adjust_point (rl_line_buffer, rl_point, &ps) > 0)
+    count--;
+  while (count-- && rl_point < rl_end)
+    {
+      mbrtowc (&wc, rl_line_buffer + rl_point, rl_end - rl_point, &ps);
+      if (iswupper (wc))
+       wc = towlower (wc);
+      else if (iswlower (wc))
+       wc = towupper (wc);
+      else
+       {
+         /* Just skip over chars neither upper nor lower case */
+         rl_forward_char (1, 0);
+         continue;
+       }
+
+      /* Vi is kind of strange here. */
+      if (wc)
+       {
+         p = rl_point;
+         mlen = wcrtomb (mb, wc, &ps);
+         if (mlen >= 0)
+           mb[mlen] = '\0';
+         rl_begin_undo_group ();
+         rl_vi_delete (1, 0);
+         if (rl_point < p)     /* Did we retreat at EOL? */
+           rl_point++; /* XXX - should we advance more than 1 for mbchar? */
+         rl_insert_text (mb);
+         rl_end_undo_group ();
+         rl_vi_check ();
+       }
+      else
+        rl_forward_char (1, 0);
+    }
+
+  return 0;
+}
+#endif
+
+int
+rl_vi_change_case (count, ignore)
+     int count, ignore;
+{
+  int c, p;
+
+  /* Don't try this on an empty line. */
+  if (rl_point >= rl_end)
+    return (0);
+
+  c = 0;
+#if defined (HANDLE_MULTIBYTE)
+  if (MB_CUR_MAX > 1 && rl_byte_oriented == 0)
+    return (_rl_vi_change_mbchar_case (count));
+#endif
+
+  while (count-- && rl_point < rl_end)
+    {
+      if (_rl_uppercase_p (rl_line_buffer[rl_point]))
+       c = _rl_to_lower (rl_line_buffer[rl_point]);
+      else if (_rl_lowercase_p (rl_line_buffer[rl_point]))
+       c = _rl_to_upper (rl_line_buffer[rl_point]);
+      else
+       {
+         /* Just skip over characters neither upper nor lower case. */
+         rl_forward_char (1, c);
+         continue;
+       }
+
+      /* Vi is kind of strange here. */
+      if (c)
+       {
+         p = rl_point;
+         rl_begin_undo_group ();
+         rl_vi_delete (1, c);
+         if (rl_point < p)     /* Did we retreat at EOL? */
+           rl_point++;
+         _rl_insert_char (1, c);
+         rl_end_undo_group ();
+         rl_vi_check ();
+        }
+      else
+       rl_forward_char (1, c);
+    }
+  return (0);
+}
+
+int
+rl_vi_put (count, key)
+     int count, key;
+{
+  if (!_rl_uppercase_p (key) && (rl_point + 1 <= rl_end))
+    rl_point = _rl_find_next_mbchar (rl_line_buffer, rl_point, 1, MB_FIND_NONZERO);
+
+  while (count--)
+    rl_yank (1, key);
+
+  rl_backward_char (1, key);
+  return (0);
+}
+
+static void
+_rl_vi_backup ()
+{
+  if (MB_CUR_MAX > 1 && rl_byte_oriented == 0)
+    rl_point = _rl_find_prev_mbchar (rl_line_buffer, rl_point, MB_FIND_NONZERO);
+  else
+    rl_point--;
+}
+
+int
+rl_vi_check ()
+{
+  if (rl_point && rl_point == rl_end)
+    {
+      if (MB_CUR_MAX > 1 && rl_byte_oriented == 0)
+       rl_point = _rl_find_prev_mbchar (rl_line_buffer, rl_point, MB_FIND_NONZERO);
+      else
+        rl_point--;
+    }
+  return (0);
+}
+
+int
+rl_vi_column (count, key)
+     int count, key;
+{
+  if (count > rl_end)
+    rl_end_of_line (1, key);
+  else
+    rl_point = count - 1;
+  return (0);
+}
+
+int
+rl_vi_domove (key, nextkey)
+     int key, *nextkey;
+{
+  int c, save;
+  int old_end;
+
+  rl_mark = rl_point;
+  RL_SETSTATE(RL_STATE_MOREINPUT);
+  c = rl_read_key ();
+  RL_UNSETSTATE(RL_STATE_MOREINPUT);
+  *nextkey = c;
+
+  if (!member (c, vi_motion))
+    {
+      if (_rl_digit_p (c))
+       {
+         save = rl_numeric_arg;
+         rl_numeric_arg = _rl_digit_value (c);
+         rl_explicit_arg = 1;
+         RL_SETSTATE (RL_STATE_NUMERICARG|RL_STATE_VIMOTION);
+         rl_digit_loop1 ();
+         RL_UNSETSTATE (RL_STATE_VIMOTION);
+         rl_numeric_arg *= save;
+         RL_SETSTATE(RL_STATE_MOREINPUT);
+         c = rl_read_key ();   /* real command */
+         RL_UNSETSTATE(RL_STATE_MOREINPUT);
+         *nextkey = c;
+       }
+      else if (key == c && (key == 'd' || key == 'y' || key == 'c'))
+       {
+         rl_mark = rl_end;
+         rl_beg_of_line (1, c);
+         _rl_vi_last_motion = c;
+         return (0);
+       }
+      else
+       return (-1);
+    }
+
+  _rl_vi_last_motion = c;
+
+  /* Append a blank character temporarily so that the motion routines
+     work right at the end of the line. */
+  old_end = rl_end;
+  rl_line_buffer[rl_end++] = ' ';
+  rl_line_buffer[rl_end] = '\0';
+
+  _rl_dispatch (c, _rl_keymap);
+
+  /* Remove the blank that we added. */
+  rl_end = old_end;
+  rl_line_buffer[rl_end] = '\0';
+  if (rl_point > rl_end)
+    rl_point = rl_end;
+
+  /* No change in position means the command failed. */
+  if (rl_mark == rl_point)
+    return (-1);
+
+  /* rl_vi_f[wW]ord () leaves the cursor on the first character of the next
+     word.  If we are not at the end of the line, and we are on a
+     non-whitespace character, move back one (presumably to whitespace). */
+  if ((_rl_to_upper (c) == 'W') && rl_point < rl_end && rl_point > rl_mark &&
+      !whitespace (rl_line_buffer[rl_point]))
+    rl_point--;
+
+  /* If cw or cW, back up to the end of a word, so the behaviour of ce
+     or cE is the actual result.  Brute-force, no subtlety. */
+  if (key == 'c' && rl_point >= rl_mark && (_rl_to_upper (c) == 'W'))
+    {
+      /* Don't move farther back than where we started. */
+      while (rl_point > rl_mark && whitespace (rl_line_buffer[rl_point]))
+       rl_point--;
+
+      /* Posix.2 says that if cw or cW moves the cursor towards the end of
+        the line, the character under the cursor should be deleted. */
+      if (rl_point == rl_mark)
+        rl_point++;
+      else
+       {
+         /* Move past the end of the word so that the kill doesn't
+            remove the last letter of the previous word.  Only do this
+            if we are not at the end of the line. */
+         if (rl_point >= 0 && rl_point < (rl_end - 1) && !whitespace (rl_line_buffer[rl_point]))
+           rl_point++;
+       }
+    }
+
+  if (rl_mark < rl_point)
+    SWAP (rl_point, rl_mark);
+
+  return (0);
+}
+
+/* Process C as part of the current numeric argument.  Return -1 if the
+   argument should be aborted, 0 if we should not read any more chars, and
+   1 if we should continue to read chars. */
+static int
+_rl_vi_arg_dispatch (c)
+     int c;
+{
+  int key;
+
+  key = c;
+  if (c >= 0 && _rl_keymap[c].type == ISFUNC && _rl_keymap[c].function == rl_universal_argument)
+    {
+      rl_numeric_arg *= 4;
+      return 1;
+    }
+
+  c = UNMETA (c);
+
+  if (_rl_digit_p (c))
+    {
+      if (rl_explicit_arg)
+       rl_numeric_arg = (rl_numeric_arg * 10) + _rl_digit_value (c);
+      else
+       rl_numeric_arg = _rl_digit_value (c);
+      rl_explicit_arg = 1;
+      return 1;
+    }
+  else
+    {
+      rl_clear_message ();
+      rl_stuff_char (key);
+      return 0;
+    }
+}
+
+/* A simplified loop for vi. Don't dispatch key at end.
+   Don't recognize minus sign?
+   Should this do rl_save_prompt/rl_restore_prompt? */
+static int
+rl_digit_loop1 ()
+{
+  int c, r;
+
+  while (1)
+    {
+      if (_rl_arg_overflow ())
+       return 1;
+
+      c = _rl_arg_getchar ();
+
+      r = _rl_vi_arg_dispatch (c);
+      if (r <= 0)
+       break;
+    }
+
+  RL_UNSETSTATE(RL_STATE_NUMERICARG);
+  return (0);
+}
+
+int
+rl_vi_delete_to (count, key)
+     int count, key;
+{
+  int c;
+
+  if (_rl_uppercase_p (key))
+    rl_stuff_char ('$');
+  else if (vi_redoing)
+    rl_stuff_char (_rl_vi_last_motion);
+
+  if (rl_vi_domove (key, &c))
+    {
+      rl_ding ();
+      return -1;
+    }
+
+  /* These are the motion commands that do not require adjusting the
+     mark. */
+  if ((strchr (" l|h^0bB", c) == 0) && (rl_mark < rl_end))
+    rl_mark++;
+
+  rl_kill_text (rl_point, rl_mark);
+  return (0);
+}
+
+int
+rl_vi_change_to (count, key)
+     int count, key;
+{
+  int c, start_pos;
+
+  if (_rl_uppercase_p (key))
+    rl_stuff_char ('$');
+  else if (vi_redoing)
+    rl_stuff_char (_rl_vi_last_motion);
+
+  start_pos = rl_point;
+
+  if (rl_vi_domove (key, &c))
+    {
+      rl_ding ();
+      return -1;
+    }
+
+  /* These are the motion commands that do not require adjusting the
+     mark.  c[wW] are handled by special-case code in rl_vi_domove(),
+     and already leave the mark at the correct location. */
+  if ((strchr (" l|hwW^0bB", c) == 0) && (rl_mark < rl_end))
+    rl_mark++;
+
+  /* The cursor never moves with c[wW]. */
+  if ((_rl_to_upper (c) == 'W') && rl_point < start_pos)
+    rl_point = start_pos;
+
+  if (vi_redoing)
+    {
+      if (vi_insert_buffer && *vi_insert_buffer)
+       rl_begin_undo_group ();
+      rl_delete_text (rl_point, rl_mark);
+      if (vi_insert_buffer && *vi_insert_buffer)
+       {
+         rl_insert_text (vi_insert_buffer);
+         rl_end_undo_group ();
+       }
+    }
+  else
+    {
+      rl_begin_undo_group ();          /* to make the `u' command work */
+      rl_kill_text (rl_point, rl_mark);
+      /* `C' does not save the text inserted for undoing or redoing. */
+      if (_rl_uppercase_p (key) == 0)
+        _rl_vi_doing_insert = 1;
+      rl_vi_start_inserting (key, rl_numeric_arg, rl_arg_sign);
+    }
+
+  return (0);
+}
+
+int
+rl_vi_yank_to (count, key)
+     int count, key;
+{
+  int c, save;
+
+  save = rl_point;
+  if (_rl_uppercase_p (key))
+    rl_stuff_char ('$');
+
+  if (rl_vi_domove (key, &c))
+    {
+      rl_ding ();
+      return -1;
+    }
+
+  /* These are the motion commands that do not require adjusting the
+     mark. */
+  if ((strchr (" l|h^0%bB", c) == 0) && (rl_mark < rl_end))
+    rl_mark++;
+
+  rl_begin_undo_group ();
+  rl_kill_text (rl_point, rl_mark);
+  rl_end_undo_group ();
+  rl_do_undo ();
+  rl_point = save;
+
+  return (0);
+}
+
+int
+rl_vi_rubout (count, key)
+     int count, key;
+{
+  int opoint;
+
+  if (count < 0)
+    return (rl_vi_delete (-count, key));
+
+  if (rl_point == 0)
+    {
+      rl_ding ();
+      return -1;
+    }
+
+  opoint = rl_point;
+  if (count > 1 && MB_CUR_MAX > 1 && rl_byte_oriented == 0)
+    rl_backward_char (count, key);
+  else if (MB_CUR_MAX > 1 && rl_byte_oriented == 0)
+    rl_point = _rl_find_prev_mbchar (rl_line_buffer, rl_point, MB_FIND_NONZERO);
+  else
+    rl_point -= count;
+
+  if (rl_point < 0)
+    rl_point = 0;
+
+  rl_kill_text (rl_point, opoint);
+  
+  return (0);
+}
+
+int
+rl_vi_delete (count, key)
+     int count, key;
+{
+  int end;
+
+  if (count < 0)
+    return (rl_vi_rubout (-count, key));
+
+  if (rl_end == 0)
+    {
+      rl_ding ();
+      return -1;
+    }
+
+  if (MB_CUR_MAX > 1 && rl_byte_oriented == 0)
+    end = _rl_find_next_mbchar (rl_line_buffer, rl_point, count, MB_FIND_NONZERO);
+  else
+    end = rl_point + count;
+
+  if (end >= rl_end)
+    end = rl_end;
+
+  rl_kill_text (rl_point, end);
+  
+  if (rl_point > 0 && rl_point == rl_end)
+    rl_backward_char (1, key);
+
+  return (0);
+}
+
+int
+rl_vi_back_to_indent (count, key)
+     int count, key;
+{
+  rl_beg_of_line (1, key);
+  while (rl_point < rl_end && whitespace (rl_line_buffer[rl_point]))
+    rl_point++;
+  return (0);
+}
+
+int
+rl_vi_first_print (count, key)
+     int count, key;
+{
+  return (rl_vi_back_to_indent (1, key));
+}
+
+static int _rl_cs_dir, _rl_cs_orig_dir;
+
+#if defined (READLINE_CALLBACKS)
+static int
+_rl_vi_callback_char_search (data)
+     _rl_callback_generic_arg *data;
+{
+#if defined (HANDLE_MULTIBYTE)
+  _rl_vi_last_search_mblen = _rl_read_mbchar (_rl_vi_last_search_mbchar, MB_LEN_MAX);
+#else
+  RL_SETSTATE(RL_STATE_MOREINPUT);
+  _rl_vi_last_search_char = rl_read_key ();
+  RL_UNSETSTATE(RL_STATE_MOREINPUT);
+#endif
+
+  _rl_callback_func = 0;
+  _rl_want_redisplay = 1;
+
+#if defined (HANDLE_MULTIBYTE)
+  return (_rl_char_search_internal (data->count, _rl_cs_dir, _rl_vi_last_search_mbchar, _rl_vi_last_search_mblen));
+#else
+  return (_rl_char_search_internal (data->count, _rl_cs_dir, _rl_vi_last_search_char));
+#endif  
+}
+#endif
+
+int
+rl_vi_char_search (count, key)
+     int count, key;
+{
+#if defined (HANDLE_MULTIBYTE)
+  static char *target;
+  static int tlen;
+#else
+  static char target;
+#endif
+
+  if (key == ';' || key == ',')
+    _rl_cs_dir = (key == ';') ? _rl_cs_orig_dir : -_rl_cs_orig_dir;
+  else
+    {
+      switch (key)
+        {
+        case 't':
+          _rl_cs_orig_dir = _rl_cs_dir = FTO;
+          break;
+
+        case 'T':
+          _rl_cs_orig_dir = _rl_cs_dir = BTO;
+          break;
+
+        case 'f':
+          _rl_cs_orig_dir = _rl_cs_dir = FFIND;
+          break;
+
+        case 'F':
+          _rl_cs_orig_dir = _rl_cs_dir = BFIND;
+          break;
+        }
+
+      if (vi_redoing)
+       {
+         /* set target and tlen below */
+       }
+#if defined (READLINE_CALLBACKS)
+      else if (RL_ISSTATE (RL_STATE_CALLBACK))
+        {
+          _rl_callback_data = _rl_callback_data_alloc (count);
+          _rl_callback_data->i1 = _rl_cs_dir;
+          _rl_callback_func = _rl_vi_callback_char_search;
+          return (0);
+        }
+#endif
+      else
+       {
+#if defined (HANDLE_MULTIBYTE)
+         _rl_vi_last_search_mblen = _rl_read_mbchar (_rl_vi_last_search_mbchar, MB_LEN_MAX);
+#else
+         RL_SETSTATE(RL_STATE_MOREINPUT);
+         _rl_vi_last_search_char = rl_read_key ();
+         RL_UNSETSTATE(RL_STATE_MOREINPUT);
+#endif
+       }
+    }
+
+#if defined (HANDLE_MULTIBYTE)
+  target = _rl_vi_last_search_mbchar;
+  tlen = _rl_vi_last_search_mblen;
+#else
+  target = _rl_vi_last_search_char;
+#endif
+
+#if defined (HANDLE_MULTIBYTE)
+  return (_rl_char_search_internal (count, _rl_cs_dir, target, tlen));
+#else
+  return (_rl_char_search_internal (count, _rl_cs_dir, target));
+#endif
+}
+
+/* Match brackets */
+int
+rl_vi_match (ignore, key)
+     int ignore, key;
+{
+  int count = 1, brack, pos, tmp, pre;
+
+  pos = rl_point;
+  if ((brack = rl_vi_bracktype (rl_line_buffer[rl_point])) == 0)
+    {
+      if (MB_CUR_MAX > 1 && rl_byte_oriented == 0)
+       {
+         while ((brack = rl_vi_bracktype (rl_line_buffer[rl_point])) == 0)
+           {
+             pre = rl_point;
+             rl_forward_char (1, key);
+             if (pre == rl_point)
+               break;
+           }
+       }
+      else
+       while ((brack = rl_vi_bracktype (rl_line_buffer[rl_point])) == 0 &&
+               rl_point < rl_end - 1)
+         rl_forward_char (1, key);
+
+      if (brack <= 0)
+       {
+         rl_point = pos;
+         rl_ding ();
+         return -1;
+       }
+    }
+
+  pos = rl_point;
+
+  if (brack < 0)
+    {
+      while (count)
+       {
+         tmp = pos;
+         if (MB_CUR_MAX == 1 || rl_byte_oriented)
+           pos--;
+         else
+           {
+             pos = _rl_find_prev_mbchar (rl_line_buffer, pos, MB_FIND_ANY);
+             if (tmp == pos)
+               pos--;
+           }
+         if (pos >= 0)
+           {
+             int b = rl_vi_bracktype (rl_line_buffer[pos]);
+             if (b == -brack)
+               count--;
+             else if (b == brack)
+               count++;
+           }
+         else
+           {
+             rl_ding ();
+             return -1;
+           }
+       }
+    }
+  else
+    {                  /* brack > 0 */
+      while (count)
+       {
+         if (MB_CUR_MAX == 1 || rl_byte_oriented)
+           pos++;
+         else
+           pos = _rl_find_next_mbchar (rl_line_buffer, pos, 1, MB_FIND_ANY);
+
+         if (pos < rl_end)
+           {
+             int b = rl_vi_bracktype (rl_line_buffer[pos]);
+             if (b == -brack)
+               count--;
+             else if (b == brack)
+               count++;
+           }
+         else
+           {
+             rl_ding ();
+             return -1;
+           }
+       }
+    }
+  rl_point = pos;
+  return (0);
+}
+
+int
+rl_vi_bracktype (c)
+     int c;
+{
+  switch (c)
+    {
+    case '(': return  1;
+    case ')': return -1;
+    case '[': return  2;
+    case ']': return -2;
+    case '{': return  3;
+    case '}': return -3;
+    default:  return  0;
+    }
+}
+
+static int
+_rl_vi_change_char (count, c, mb)
+     int count, c;
+     char *mb;
+{
+  int p;
+
+  if (c == '\033' || c == CTRL ('C'))
+    return -1;
+
+  rl_begin_undo_group ();
+  while (count-- && rl_point < rl_end)
+    {
+      p = rl_point;
+      rl_vi_delete (1, c);
+      if (rl_point < p)                /* Did we retreat at EOL? */
+       rl_point++;
+#if defined (HANDLE_MULTIBYTE)
+      if (MB_CUR_MAX > 1 && rl_byte_oriented == 0)
+       rl_insert_text (mb);
+      else
+#endif
+       _rl_insert_char (1, c);
+    }
+
+  /* The cursor shall be left on the last character changed. */
+  rl_backward_char (1, c);
+
+  rl_end_undo_group ();
+
+  return (0);
+}
+
+static int
+_rl_vi_callback_getchar (mb, mlen)
+     char *mb;
+     int mlen;
+{
+  int c;
+
+  RL_SETSTATE(RL_STATE_MOREINPUT);
+  c = rl_read_key ();
+  RL_UNSETSTATE(RL_STATE_MOREINPUT);
+
+#if defined (HANDLE_MULTIBYTE)
+  if (MB_CUR_MAX > 1 && rl_byte_oriented == 0)
+    c = _rl_read_mbstring (c, mb, mlen);
+#endif
+
+  return c;
+}
+
+#if defined (READLINE_CALLBACKS)
+static int
+_rl_vi_callback_change_char (data)
+     _rl_callback_generic_arg *data;
+{
+  int c;
+  char mb[MB_LEN_MAX];
+
+  _rl_vi_last_replacement = c = _rl_vi_callback_getchar (mb, MB_LEN_MAX);
+
+  _rl_callback_func = 0;
+  _rl_want_redisplay = 1;
+
+  return (_rl_vi_change_char (data->count, c, mb));
+}
+#endif
+
+int
+rl_vi_change_char (count, key)
+     int count, key;
+{
+  int c;
+  char mb[MB_LEN_MAX];
+
+  if (vi_redoing)
+    {
+      c = _rl_vi_last_replacement;
+      mb[0] = c;
+      mb[1] = '\0';
+    }
+#if defined (READLINE_CALLBACKS)
+  else if (RL_ISSTATE (RL_STATE_CALLBACK))
+    {
+      _rl_callback_data = _rl_callback_data_alloc (count);
+      _rl_callback_func = _rl_vi_callback_change_char;
+      return (0);
+    }
+#endif
+  else
+    _rl_vi_last_replacement = c = _rl_vi_callback_getchar (mb, MB_LEN_MAX);
+
+  return (_rl_vi_change_char (count, c, mb));
+}
+
+int
+rl_vi_subst (count, key)
+     int count, key;
+{
+  /* If we are redoing, rl_vi_change_to will stuff the last motion char */
+  if (vi_redoing == 0)
+    rl_stuff_char ((key == 'S') ? 'c' : 'l');  /* `S' == `cc', `s' == `cl' */
+
+  return (rl_vi_change_to (count, 'c'));
+}
+
+int
+rl_vi_overstrike (count, key)
+     int count, key;
+{
+  if (_rl_vi_doing_insert == 0)
+    {
+      _rl_vi_doing_insert = 1;
+      rl_begin_undo_group ();
+    }
+
+  if (count > 0)
+    {
+      _rl_overwrite_char (count, key);
+      vi_replace_count += count;
+    }
+
+  return (0);
+}
+
+int
+rl_vi_overstrike_delete (count, key)
+     int count, key;
+{
+  int i, s;
+
+  for (i = 0; i < count; i++)
+    {
+      if (vi_replace_count == 0)
+       {
+         rl_ding ();
+         break;
+       }
+      s = rl_point;
+
+      if (rl_do_undo ())
+       vi_replace_count--;
+
+      if (rl_point == s)
+       rl_backward_char (1, key);
+    }
+
+  if (vi_replace_count == 0 && _rl_vi_doing_insert)
+    {
+      rl_end_undo_group ();
+      rl_do_undo ();
+      _rl_vi_doing_insert = 0;
+    }
+  return (0);
+}
+
+int
+rl_vi_replace (count, key)
+     int count, key;
+{
+  int i;
+
+  vi_replace_count = 0;
+
+  if (!vi_replace_map)
+    {
+      vi_replace_map = rl_make_bare_keymap ();
+
+      for (i = ' '; i < KEYMAP_SIZE; i++)
+       vi_replace_map[i].function = rl_vi_overstrike;
+
+      vi_replace_map[RUBOUT].function = rl_vi_overstrike_delete;
+      vi_replace_map[ESC].function = rl_vi_movement_mode;
+      vi_replace_map[RETURN].function = rl_newline;
+      vi_replace_map[NEWLINE].function = rl_newline;
+
+      /* If the normal vi insertion keymap has ^H bound to erase, do the
+         same here.  Probably should remove the assignment to RUBOUT up
+         there, but I don't think it will make a difference in real life. */
+      if (vi_insertion_keymap[CTRL ('H')].type == ISFUNC &&
+         vi_insertion_keymap[CTRL ('H')].function == rl_rubout)
+       vi_replace_map[CTRL ('H')].function = rl_vi_overstrike_delete;
+
+    }
+  _rl_keymap = vi_replace_map;
+  return (0);
+}
+
+#if 0
+/* Try to complete the word we are standing on or the word that ends with
+   the previous character.  A space matches everything.  Word delimiters are
+   space and ;. */
+int
+rl_vi_possible_completions()
+{
+  int save_pos = rl_point;
+
+  if (rl_line_buffer[rl_point] != ' ' && rl_line_buffer[rl_point] != ';')
+    {
+      while (rl_point < rl_end && rl_line_buffer[rl_point] != ' ' &&
+            rl_line_buffer[rl_point] != ';')
+       rl_point++;
+    }
+  else if (rl_line_buffer[rl_point - 1] == ';')
+    {
+      rl_ding ();
+      return (0);
+    }
+
+  rl_possible_completions ();
+  rl_point = save_pos;
+
+  return (0);
+}
+#endif
+
+/* Functions to save and restore marks. */
+static int
+_rl_vi_set_mark ()
+{
+  int ch;
+
+  RL_SETSTATE(RL_STATE_MOREINPUT);
+  ch = rl_read_key ();
+  RL_UNSETSTATE(RL_STATE_MOREINPUT);
+
+  if (ch < 'a' || ch > 'z')
+    {
+      rl_ding ();
+      return -1;
+    }
+  ch -= 'a';
+  vi_mark_chars[ch] = rl_point;
+  return 0;
+}
+
+#if defined (READLINE_CALLBACKS)
+static int
+_rl_vi_callback_set_mark (data)
+     _rl_callback_generic_arg *data;
+{
+  _rl_callback_func = 0;
+  _rl_want_redisplay = 1;
+
+  return (_rl_vi_set_mark ());
+}
+#endif
+
+int
+rl_vi_set_mark (count, key)
+     int count, key;
+{
+#if defined (READLINE_CALLBACKS)
+  if (RL_ISSTATE (RL_STATE_CALLBACK))
+    {
+      _rl_callback_data = 0;
+      _rl_callback_func = _rl_vi_callback_set_mark;
+      return (0);
+    }
+#endif
+
+  return (_rl_vi_set_mark ());
+}
+
+static int
+_rl_vi_goto_mark ()
+{
+  int ch;
+
+  RL_SETSTATE(RL_STATE_MOREINPUT);
+  ch = rl_read_key ();
+  RL_UNSETSTATE(RL_STATE_MOREINPUT);
+
+  if (ch == '`')
+    {
+      rl_point = rl_mark;
+      return 0;
+    }
+  else if (ch < 'a' || ch > 'z')
+    {
+      rl_ding ();
+      return -1;
+    }
+
+  ch -= 'a';
+  if (vi_mark_chars[ch] == -1)
+    {
+      rl_ding ();
+      return -1;
+    }
+  rl_point = vi_mark_chars[ch];
+  return 0;
+}
+
+#if defined (READLINE_CALLBACKS)
+static int
+_rl_vi_callback_goto_mark (data)
+     _rl_callback_generic_arg *data;
+{
+  _rl_callback_func = 0;
+  _rl_want_redisplay = 1;
+
+  return (_rl_vi_goto_mark ());
+}
+#endif
+
+int
+rl_vi_goto_mark (count, key)
+     int count, key;
+{
+#if defined (READLINE_CALLBACKS)
+  if (RL_ISSTATE (RL_STATE_CALLBACK))
+    {
+      _rl_callback_data = 0;
+      _rl_callback_func = _rl_vi_callback_goto_mark;
+      return (0);
+    }
+#endif
+
+  return (_rl_vi_goto_mark ());
+}
+#endif /* VI_MODE */
diff --git a/xmalloc.c b/xmalloc.c
new file mode 100644 (file)
index 0000000..8985d34
--- /dev/null
+++ b/xmalloc.c
@@ -0,0 +1,88 @@
+/* xmalloc.c -- safe versions of malloc and realloc */
+
+/* Copyright (C) 1991 Free Software Foundation, Inc.
+
+   This file is part of GNU Readline, a library for reading lines
+   of text with interactive input and history editing.
+
+   Readline 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.
+
+   Readline 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 Readline; see the file COPYING.  If not, write to the Free
+   Software Foundation, 59 Temple Place, Suite 330, Boston, MA 02111 USA. */
+#define READLINE_LIBRARY
+
+#if defined (HAVE_CONFIG_H)
+#include <config.h>
+#endif
+
+#include <stdio.h>
+
+#if defined (HAVE_STDLIB_H)
+#  include <stdlib.h>
+#else
+#  include "ansi_stdlib.h"
+#endif /* HAVE_STDLIB_H */
+
+#include "xmalloc.h"
+
+/* **************************************************************** */
+/*                                                                 */
+/*                Memory Allocation and Deallocation.              */
+/*                                                                 */
+/* **************************************************************** */
+
+static void
+memory_error_and_abort (fname)
+     char *fname;
+{
+  fprintf (stderr, "%s: out of virtual memory\n", fname);
+  exit (2);
+}
+
+/* Return a pointer to free()able block of memory large enough
+   to hold BYTES number of bytes.  If the memory cannot be allocated,
+   print an error message and abort. */
+PTR_T
+xmalloc (bytes)
+     size_t bytes;
+{
+  PTR_T temp;
+
+  temp = malloc (bytes);
+  if (temp == 0)
+    memory_error_and_abort ("xmalloc");
+  return (temp);
+}
+
+PTR_T
+xrealloc (pointer, bytes)
+     PTR_T pointer;
+     size_t bytes;
+{
+  PTR_T temp;
+
+  temp = pointer ? realloc (pointer, bytes) : malloc (bytes);
+
+  if (temp == 0)
+    memory_error_and_abort ("xrealloc");
+  return (temp);
+}
+
+/* Use this as the function to call when adding unwind protects so we
+   don't need to know what free() returns. */
+void
+xfree (string)
+     PTR_T string;
+{
+  if (string)
+    free (string);
+}
diff --git a/xmalloc.h b/xmalloc.h
new file mode 100644 (file)
index 0000000..9cb08ba
--- /dev/null
+++ b/xmalloc.h
@@ -0,0 +1,46 @@
+/* xmalloc.h -- memory allocation that aborts on errors. */
+
+/* Copyright (C) 1999 Free Software Foundation, Inc.
+
+   This file is part of the GNU Readline Library, a library for
+   reading lines of text with interactive input and history editing.
+
+   The GNU Readline Library 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.
+
+   The GNU Readline Library is distributed in the hope that it will be
+   useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+   of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   The GNU General Public License is often shipped with GNU software, and
+   is generally kept in a file called COPYING or LICENSE.  If you do not
+   have a copy of the license, write to the Free Software Foundation,
+   59 Temple Place, Suite 330, Boston, MA 02111 USA. */
+
+#if !defined (_XMALLOC_H_)
+#define _XMALLOC_H_
+
+#if defined (READLINE_LIBRARY)
+#  include "rlstdc.h"
+#else
+#  include <readline/rlstdc.h>
+#endif
+
+#ifndef PTR_T
+
+#ifdef __STDC__
+#  define PTR_T        void *
+#else
+#  define PTR_T        char *
+#endif
+
+#endif /* !PTR_T */
+
+extern PTR_T xmalloc PARAMS((size_t));
+extern PTR_T xrealloc PARAMS((void *, size_t));
+extern void xfree PARAMS((void *));
+
+#endif /* _XMALLOC_H_ */