summaryrefslogtreecommitdiff
path: root/gnu/lib
diff options
context:
space:
mode:
authorTodd C. Miller <millert@cvs.openbsd.org>2001-03-18 17:32:06 +0000
committerTodd C. Miller <millert@cvs.openbsd.org>2001-03-18 17:32:06 +0000
commite6502418f71f98344bccae45cc3caccf2a541877 (patch)
tree6b497eab3b0b54fef63b1c49201699996d23e5b4 /gnu/lib
parentb0177a8199cab79579d60a0bd6a796be6b825bd1 (diff)
GNU readline-4.1
Diffstat (limited to 'gnu/lib')
-rw-r--r--gnu/lib/libreadline/CHANGELOG339
-rw-r--r--gnu/lib/libreadline/CHANGES301
-rw-r--r--gnu/lib/libreadline/COPYING339
-rw-r--r--gnu/lib/libreadline/INSTALL176
-rw-r--r--gnu/lib/libreadline/MANIFEST113
-rw-r--r--gnu/lib/libreadline/Makefile.in448
-rw-r--r--gnu/lib/libreadline/README163
-rw-r--r--gnu/lib/libreadline/USAGE37
-rw-r--r--gnu/lib/libreadline/aclocal.m41427
-rw-r--r--gnu/lib/libreadline/ansi_stdlib.h41
-rw-r--r--gnu/lib/libreadline/bind.c2101
-rw-r--r--gnu/lib/libreadline/callback.c141
-rw-r--r--gnu/lib/libreadline/chardefs.h140
-rw-r--r--gnu/lib/libreadline/complete.c1776
-rw-r--r--gnu/lib/libreadline/config.h.in148
-rw-r--r--gnu/lib/libreadline/configure2958
-rw-r--r--gnu/lib/libreadline/configure.in156
-rw-r--r--gnu/lib/libreadline/display.c1693
-rw-r--r--gnu/lib/libreadline/doc/Makefile.in181
-rw-r--r--gnu/lib/libreadline/doc/hist.texinfo110
-rw-r--r--gnu/lib/libreadline/doc/history.dvibin0 -> 49240 bytes
-rw-r--r--gnu/lib/libreadline/doc/history.html1195
-rw-r--r--gnu/lib/libreadline/doc/history.info811
-rw-r--r--gnu/lib/libreadline/doc/history.ps1636
-rw-r--r--gnu/lib/libreadline/doc/hstech.texinfo522
-rw-r--r--gnu/lib/libreadline/doc/hsuser.texinfo437
-rw-r--r--gnu/lib/libreadline/doc/manvers.texinfo6
-rw-r--r--gnu/lib/libreadline/doc/readline.01188
-rw-r--r--gnu/lib/libreadline/doc/readline.31205
-rw-r--r--gnu/lib/libreadline/doc/readline.dvibin0 -> 207200 bytes
-rw-r--r--gnu/lib/libreadline/doc/readline.html4327
-rw-r--r--gnu/lib/libreadline/doc/readline.info3107
-rw-r--r--gnu/lib/libreadline/doc/readline.ps4570
-rw-r--r--gnu/lib/libreadline/doc/rlman.texinfo108
-rw-r--r--gnu/lib/libreadline/doc/rltech.texinfo1750
-rw-r--r--gnu/lib/libreadline/doc/rluser.texinfo1629
-rw-r--r--gnu/lib/libreadline/doc/rluserman.dvibin0 -> 61412 bytes
-rw-r--r--gnu/lib/libreadline/doc/rluserman.html1566
-rw-r--r--gnu/lib/libreadline/doc/rluserman.info1189
-rw-r--r--gnu/lib/libreadline/doc/rluserman.ps1897
-rw-r--r--gnu/lib/libreadline/doc/rluserman.texinfo94
-rw-r--r--gnu/lib/libreadline/doc/texi2dvi362
-rw-r--r--gnu/lib/libreadline/doc/texi2html2081
-rw-r--r--gnu/lib/libreadline/doc/texinfo.tex4692
-rw-r--r--gnu/lib/libreadline/emacs_keymap.c873
-rw-r--r--gnu/lib/libreadline/examples/Inputrc65
-rw-r--r--gnu/lib/libreadline/examples/Makefile.in85
-rw-r--r--gnu/lib/libreadline/examples/excallback.c186
-rw-r--r--gnu/lib/libreadline/examples/fileman.c458
-rw-r--r--gnu/lib/libreadline/examples/histexamp.c82
-rw-r--r--gnu/lib/libreadline/examples/manexamp.c94
-rw-r--r--gnu/lib/libreadline/examples/rl.c131
-rw-r--r--gnu/lib/libreadline/examples/rlfe.c685
-rw-r--r--gnu/lib/libreadline/examples/rltest.c67
-rw-r--r--gnu/lib/libreadline/examples/rlversion.c23
-rw-r--r--gnu/lib/libreadline/funmap.c260
-rw-r--r--gnu/lib/libreadline/histexpand.c1357
-rw-r--r--gnu/lib/libreadline/histfile.c384
-rw-r--r--gnu/lib/libreadline/histlib.h88
-rw-r--r--gnu/lib/libreadline/history.c388
-rw-r--r--gnu/lib/libreadline/history.h248
-rw-r--r--gnu/lib/libreadline/histsearch.c197
-rw-r--r--gnu/lib/libreadline/input.c409
-rw-r--r--gnu/lib/libreadline/isearch.c442
-rw-r--r--gnu/lib/libreadline/keymaps.c150
-rw-r--r--gnu/lib/libreadline/keymaps.h108
-rw-r--r--gnu/lib/libreadline/kill.c628
-rw-r--r--gnu/lib/libreadline/macro.c268
-rw-r--r--gnu/lib/libreadline/nls.c225
-rw-r--r--gnu/lib/libreadline/parens.c161
-rw-r--r--gnu/lib/libreadline/posixdir.h49
-rw-r--r--gnu/lib/libreadline/posixjmp.h40
-rw-r--r--gnu/lib/libreadline/posixstat.h142
-rw-r--r--gnu/lib/libreadline/readline.c2089
-rw-r--r--gnu/lib/libreadline/readline.h634
-rw-r--r--gnu/lib/libreadline/rlconf.h57
-rw-r--r--gnu/lib/libreadline/rldefs.h136
-rw-r--r--gnu/lib/libreadline/rlprivate.h271
-rw-r--r--gnu/lib/libreadline/rlshell.h34
-rw-r--r--gnu/lib/libreadline/rlstdc.h39
-rw-r--r--gnu/lib/libreadline/rltty.c867
-rw-r--r--gnu/lib/libreadline/rltty.h82
-rw-r--r--gnu/lib/libreadline/rlwinsize.h57
-rw-r--r--gnu/lib/libreadline/savestring.c33
-rw-r--r--gnu/lib/libreadline/search.c423
-rw-r--r--gnu/lib/libreadline/shell.c175
-rw-r--r--gnu/lib/libreadline/shlib/Makefile.in367
-rw-r--r--gnu/lib/libreadline/signals.c392
-rw-r--r--gnu/lib/libreadline/support/config.guess1328
-rw-r--r--gnu/lib/libreadline/support/config.sub1261
-rw-r--r--gnu/lib/libreadline/support/install.sh235
-rw-r--r--gnu/lib/libreadline/support/mkdirs32
-rw-r--r--gnu/lib/libreadline/support/mkdist100
-rw-r--r--gnu/lib/libreadline/support/shlib-install148
-rw-r--r--gnu/lib/libreadline/support/shobj-conf377
-rw-r--r--gnu/lib/libreadline/tcap.h60
-rw-r--r--gnu/lib/libreadline/terminal.c575
-rw-r--r--gnu/lib/libreadline/tilde.c459
-rw-r--r--gnu/lib/libreadline/tilde.h85
-rw-r--r--gnu/lib/libreadline/undo.c262
-rw-r--r--gnu/lib/libreadline/util.c351
-rw-r--r--gnu/lib/libreadline/vi_keymap.c877
-rw-r--r--gnu/lib/libreadline/vi_mode.c1368
-rw-r--r--gnu/lib/libreadline/xmalloc.c88
-rw-r--r--gnu/lib/libreadline/xmalloc.h46
105 files changed, 68761 insertions, 0 deletions
diff --git a/gnu/lib/libreadline/CHANGELOG b/gnu/lib/libreadline/CHANGELOG
new file mode 100644
index 00000000000..9024bdfdadb
--- /dev/null
+++ b/gnu/lib/libreadline/CHANGELOG
@@ -0,0 +1,339 @@
+[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
diff --git a/gnu/lib/libreadline/CHANGES b/gnu/lib/libreadline/CHANGES
new file mode 100644
index 00000000000..d2929ab6fd2
--- /dev/null
+++ b/gnu/lib/libreadline/CHANGES
@@ -0,0 +1,301 @@
+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/gnu/lib/libreadline/COPYING b/gnu/lib/libreadline/COPYING
new file mode 100644
index 00000000000..1bf15263878
--- /dev/null
+++ b/gnu/lib/libreadline/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.
+
+ 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.)
+
+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.
+
+ 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.
+
+ 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
+
+ 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/gnu/lib/libreadline/INSTALL b/gnu/lib/libreadline/INSTALL
new file mode 100644
index 00000000000..95d84c820fb
--- /dev/null
+++ b/gnu/lib/libreadline/INSTALL
@@ -0,0 +1,176 @@
+Basic Installation
+==================
+
+ These are generic installation instructions.
+
+ 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 each directory of the package.
+It may also create one or more `.h' files 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 the package, please try
+to figure out how `configure' could check whether to do them, and mail
+diffs or instructions to the address given in the `README' 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 simplest way to compile this package is:
+
+ 1. `cd' to the directory containing the package's source code and type
+ `./configure' to configure the package 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 awhile. While running, it prints some
+ messages telling which features it is checking for.
+
+ 2. Type `make' to compile the package.
+
+ 3. Optionally, type `make check' to run any self-tests that come with
+ the package.
+
+ 4. Type `make install' to install the programs and any data files and
+ documentation.
+
+ 5. You can remove the program binaries and object files from the
+ source code directory by typing `make clean'. To also remove the
+ files that `configure' created (so you can compile the package for
+ a different kind of computer), type `make distclean'. There is
+ also a `make maintainer-clean' target, but that is intended mainly
+ for the package's developers. If you use it, you may have to get
+ all sorts of other programs in order to regenerate files that came
+ with the distribution.
+
+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 the package 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 the package for one architecture at a time
+in the source code directory. After you have installed the package for
+one architecture, use `make distclean' before reconfiguring for another
+architecture.
+
+Installation Names
+==================
+
+ By default, `make install' will install the package's files in
+`/usr/local/bin', `/usr/local/man', etc. You can specify an
+installation prefix other than `/usr/local' by giving `configure' the
+option `--prefix=PATH'.
+
+ You can specify separate installation prefixes for
+architecture-specific files and architecture-independent files. If you
+give `configure' the option `--exec-prefix=PATH', the package will use
+PATH as the prefix for installing programs and libraries.
+Documentation and other data files will still use the regular prefix.
+
+ If the package supports it, you can cause programs to be installed
+with an extra prefix or suffix on their names by giving `configure' the
+option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'.
+
+Optional Features
+=================
+
+ Some packages pay attention to `--enable-FEATURE' options to
+`configure', where FEATURE indicates an optional part of the package.
+They may also pay attention to `--with-PACKAGE' options, where PACKAGE
+is something like `gnu-as' or `x' (for the X Window System). The
+`README' should mention any `--enable-' and `--with-' options that the
+package recognizes.
+
+ For packages that use the X Window System, `configure' can usually
+find the X include and library files automatically, but if it doesn't,
+you can use the `configure' options `--x-includes=DIR' and
+`--x-libraries=DIR' to specify their locations.
+
+Specifying the System Type
+==========================
+
+ There may be some features `configure' can not figure out
+automatically, but needs to determine by the type of host the package
+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
+
+See the file `config.sub' for the possible values of each field. If
+`config.sub' isn't included in this package, then this package doesn't
+need to know the host type.
+
+ If you are building compiler tools for cross-compiling, you can also
+use the `--target=TYPE' option to select the type of system they will
+produce code for and the `--build=TYPE' option to select the type of
+system on which you are compiling the package.
+
+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: not all `configure' scripts look for a site script.
+
+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.
+
diff --git a/gnu/lib/libreadline/MANIFEST b/gnu/lib/libreadline/MANIFEST
new file mode 100644
index 00000000000..a51ca0525a7
--- /dev/null
+++ b/gnu/lib/libreadline/MANIFEST
@@ -0,0 +1,113 @@
+#
+# Master distribution manifest for the standalone readline distribution
+#
+doc d
+examples d
+support d
+shlib d
+COPYING f
+README f
+MANIFEST f
+INSTALL f
+CHANGELOG f
+CHANGES 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
+rlprivate.h f
+rlshell.h f
+rlstdc.h f
+rltty.h f
+rlwinsize.h f
+tcap.h f
+tilde.h f
+xmalloc.h f
+bind.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
+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
+tilde.c f
+undo.c f
+util.c f
+vi_keymap.c f
+vi_mode.c f
+callback.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.sub f
+support/install.sh f
+support/mkdirs f
+support/mkdist f
+support/shobj-conf f
+support/shlib-install f
+doc/Makefile.in f
+doc/texinfo.tex f
+doc/manvers.texinfo f
+doc/rlman.texinfo f
+doc/rltech.texinfo f
+doc/rluser.texinfo f
+doc/rluserman.texinfo f
+doc/hist.texinfo f
+doc/hstech.texinfo f
+doc/hsuser.texinfo f
+doc/readline.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/rlfe.c f
+examples/rltest.c f
+examples/rl.c f
+examples/rlversion.c f
+examples/histexamp.c f
+examples/Inputrc 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
diff --git a/gnu/lib/libreadline/Makefile.in b/gnu/lib/libreadline/Makefile.in
new file mode 100644
index 00000000000..023496d57bb
--- /dev/null
+++ b/gnu/lib/libreadline/Makefile.in
@@ -0,0 +1,448 @@
+## -*- text -*- ##
+# Master Makefile for the GNU readline library.
+# 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@
+RL_LIBRARY_NAME = readline
+
+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
+
+SHELL = @MAKE_SHELL@
+
+prefix = @prefix@
+exec_prefix = @exec_prefix@
+
+bindir = @bindir@
+libdir = @libdir@
+mandir = @mandir@
+includedir = @includedir@
+
+infodir = @infodir@
+
+man3dir = $(mandir)/man3
+
+# 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@
+LOCAL_DEFS = @LOCAL_DEFS@
+
+TERMCAP_LIB = @TERMCAP_LIB@
+
+# For libraries which include headers from other libraries.
+INCLUDES = -I. -I$(srcdir) -I$(includedir)
+
+CCFLAGS = $(DEFS) $(LOCAL_DEFS) $(CPPFLAGS) $(INCLUDES) $(LOCAL_CFLAGS) $(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
+
+# 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
+
+HISTOBJ = history.o histexpand.o histfile.o histsearch.o shell.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 \
+ nls.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
+
+##########################################################################
+
+all: static
+
+everything: static shared 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) $@
+
+readline: $(OBJECTS) readline.h rldefs.h chardefs.h ./libreadline.a
+ $(CC) $(CCFLAGS) -o $@ ./examples/rl.c ./libreadline.a ${TERMCAP_LIB}
+
+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 $(includedir)/readline ; \
+ done
+
+uninstall-headers:
+ -test -n "$(includedir)" && cd $(includedir)/readline && \
+ ${RM} ${INSTALLED_HEADERS}
+
+maybe-uninstall-headers: uninstall-headers
+
+install: installdirs $(STATIC_LIBS) install-headers
+ -$(MV) $(libdir)/libreadline.a $(libdir)/libreadline.old
+ $(INSTALL_DATA) libreadline.a $(libdir)/libreadline.a
+ -test -n "$(RANLIB)" && $(RANLIB) -t $(libdir)/libreadline.a
+ -$(MV) $(libdir)/libhistory.a $(libdir)/libhistory.old
+ $(INSTALL_DATA) libhistory.a $(libdir)/libhistory.a
+ -test -n "$(RANLIB)" && $(RANLIB) -t $(libdir)/libhistory.a
+ -( if test -d doc ; then \
+ cd doc && \
+ ${MAKE} ${MFLAGS} infodir=$(infodir) $@; \
+ fi )
+
+installdirs: $(srcdir)/support/mkdirs
+ -$(SHELL) $(srcdir)/support/mkdirs $(includedir) \
+ $(includedir)/readline $(libdir) $(infodir) $(man3dir)
+
+uninstall: uninstall-headers
+ -test -n "$(libdir)" && cd $(libdir) && \
+ ${RM} libreadline.a libreadline.old libhistory.a libhistory.old $(SHARED_LIBS)
+
+install-shared: installdirs install-headers shared
+ -( cd shlib ; ${MAKE} ${MFLAGS} install )
+
+uninstall-shared: maybe-uninstall-headers
+ -( cd shlib; ${MAKE} ${MFLAGS} uninstall )
+
+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 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 chardefs.h tilde.h 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 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 chardefs.h tilde.h
+display.o: history.h rlstdc.h
+funmap.o: readline.h keymaps.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
+histexpand.o: ${BUILD_DIR}/config.h
+histfile.o: ansi_stdlib.h
+histfile.o: history.h histlib.h rlstdc.h
+histfile.o: ${BUILD_DIR}/config.h
+history.o: ansi_stdlib.h
+history.o: history.h histlib.h rlstdc.h
+history.o: ${BUILD_DIR}/config.h
+histsearch.o: ansi_stdlib.h
+histsearch.o: history.h histlib.h rlstdc.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 chardefs.h tilde.h rlstdc.h
+isearch.o: rldefs.h ${BUILD_DIR}/config.h rlconf.h
+isearch.o: readline.h keymaps.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 chardefs.h rlconf.h ansi_stdlib.h
+keymaps.o: readline.h keymaps.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 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 chardefs.h tilde.h
+macro.o: history.h rlstdc.h
+nls.o: ansi_stdlib.h
+nls.o: rldefs.h ${BUILD_DIR}/config.h rlconf.h
+nls.o: readline.h keymaps.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 chardefs.h tilde.h rlstdc.h
+readline.o: readline.h keymaps.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 chardefs.h tilde.h rlstdc.h
+search.o: rldefs.h ${BUILD_DIR}/config.h rlconf.h
+search.o: readline.h keymaps.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 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 chardefs.h tilde.h
+terminal.o: history.h rlstdc.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 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 chardefs.h tilde.h rlstdc.h
+vi_mode.o: rldefs.h ${BUILD_DIR}/config.h rlconf.h
+vi_mode.o: readline.h keymaps.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
+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
+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
+readline.o: xmalloc.h
+savestring.o: xmalloc.h
+search.o: xmalloc.h
+shell.o: xmalloc.h
+tilde.o: xmalloc.h
+tilde.o: xmalloc.h
+util.o: xmalloc.h
+vi_mode.o: xmalloc.h
+
+readline.o: $(srcdir)/readline.c
+vi_mode.o: $(srcdir)/vi_mode.c
+funmap.o: $(srcdir)/funmap.c
+keymaps.o: $(srcdir)/keymaps.c
+parens.o: $(srcdir)/parens.c
+search.o: $(srcdir)/search.c
+rltty.o: $(srcdir)/rltty.c
+complete.o: $(srcdir)/complete.c
+bind.o: $(srcdir)/bind.c
+isearch.o: $(srcdir)/isearch.c
+display.o: $(srcdir)/display.c
+signals.o: $(srcdir)/signals.c
+util.o: $(srcdir)/util.c
+kill.o: $(srcdir)/kill.c
+undo.o: $(srcdir)/undo.c
+macro.o: $(srcdir)/macro.c
+input.o: $(srcdir)/input.c
+callback.o: $(srcdir)/callback.c
+terminal.o: $(srcdir)/terminal.c
+nls.o: $(srcdir)/nls.c
+xmalloc.o: $(srcdir)/xmalloc.c
+history.o: $(srcdir)/history.c
+histexpand.o: $(srcdir)/histexpand.c
+histfile.o: $(srcdir)/histfile.c
+histsearch.o: $(srcdir)/histsearch.c
+savestring.o: $(srcdir)/savestring.c
+shell.o: $(srcdir)/shell.c
+tilde.o: $(srcdir)/tilde.c
+
+readline.o: readline.c
+vi_mode.o: vi_mode.c
+funmap.o: funmap.c
+keymaps.o: keymaps.c
+parens.o: parens.c
+search.o: search.c
+rltty.o: rltty.c
+complete.o: complete.c
+bind.o: bind.c
+isearch.o: isearch.c
+display.o: display.c
+signals.o: signals.c
+util.o: util.c
+kill.o: kill.c
+undo.o: undo.c
+macro.o: macro.c
+input.o: input.c
+callback.o: callback.c
+terminal.o: terminal.c
+nls.o: nls.c
+xmalloc.o: xmalloc.c
+history.o: history.c
+histexpand.o: histexpand.c
+histfile.o: histfile.c
+histsearch.o: histsearch.c
+savestring.o: savestring.c
+shell.o: shell.c
+tilde.o: tilde.c
diff --git a/gnu/lib/libreadline/README b/gnu/lib/libreadline/README
new file mode 100644
index 00000000000..41a5d0c82d6
--- /dev/null
+++ b/gnu/lib/libreadline/README
@@ -0,0 +1,163 @@
+Introduction
+============
+
+This is the Gnu Readline library, version 4.1.
+
+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 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.
+
+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.
+
+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 2.2.5 with any version of gcc is identified as
+`freebsd2.2.5-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_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_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.
+
+Since shared libraries are not created on all platforms, `make install'
+will not automatically install the shared libraries. To install them,
+change the current directory to shlib and type `make install'. Running
+`make install-shared' from the top-level build directory will also work.
+
+Documentation
+=============
+
+The documentation for the Readline and History libraries appears in the
+`doc' subdirectory. There are two texinfo files and a Unix-style manual
+page describing the programming facilities available in the Readline
+library. The texinfo files include both user and programmer's manuals.
+
+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.0-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@po.cwru.edu
diff --git a/gnu/lib/libreadline/USAGE b/gnu/lib/libreadline/USAGE
new file mode 100644
index 00000000000..edc9f5417d4
--- /dev/null
+++ b/gnu/lib/libreadline/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/gnu/lib/libreadline/aclocal.m4 b/gnu/lib/libreadline/aclocal.m4
new file mode 100644
index 00000000000..f8f5b74b72f
--- /dev/null
+++ b/gnu/lib/libreadline/aclocal.m4
@@ -0,0 +1,1427 @@
+dnl
+dnl Bash specific tests
+dnl
+dnl Some derived from PDKSH 5.1.3 autoconf tests
+dnl
+dnl
+dnl Check if dup2() does not clear the close on exec flag
+dnl
+AC_DEFUN(BASH_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
+])
+
+dnl Check type of signal routines (posix, 4.2bsd, 4.1bsd or v7)
+AC_DEFUN(BASH_SIGNAL_CHECK,
+[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_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
+])
+
+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_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>
+#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($1, $3)
+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_RLIMIT_TYPE,
+[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
+])
+
+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 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 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)
+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_sv_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 "$ac_cv_sizeof_long" = 8; then
+ AC_CHECK_TYPE(bits64_t, long)
+else
+ AC_CHECK_TYPE(bits64_t, double)
+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
+])
+
+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)
+fi
+])
+
+AC_DEFUN(BASH_STRUCT_TERMIOS_LDISC,
+[AC_MSG_CHECKING([for a c_line member of struct termios])
+AC_CACHE_VAL(bash_cv_termios_ldisc,
+[AC_TRY_COMPILE([#include <sys/types.h>
+#include <termios.h>],[struct termios t; int i; i = t.c_line;],
+ bash_cv_termios_ldisc=yes, bash_cv_termios_ldisc=no)])dnl
+AC_MSG_RESULT($bash_cv_termios_ldisc)
+if test $bash_cv_termios_ldisc = yes; then
+AC_DEFINE(TERMIOS_LDISC)
+fi
+])
+
+AC_DEFUN(BASH_STRUCT_TERMIO_LDISC,
+[AC_MSG_CHECKING([for a c_line member of struct termio])
+AC_CACHE_VAL(bash_cv_termio_ldisc,
+[AC_TRY_COMPILE([#include <sys/types.h>
+#include <termio.h>],[struct termio t; int i; i = t.c_line;],
+ bash_cv_termio_ldisc=yes, bash_cv_termio_ldisc=no)])dnl
+AC_MSG_RESULT($bash_cv_termio_ldisc)
+if test $bash_cv_termio_ldisc = yes; then
+AC_DEFINE(TERMIO_LDISC)
+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
+])
+
+AC_DEFUN(BASH_FUNC_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_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_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_LIB(termcap, tgetent, bash_cv_termcap_lib=libtermcap,
+ [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 = libncurses; then
+TERMCAP_LIB=-lncurses
+TERMCAP_DEP=
+else
+TERMCAP_LIB=-lcurses
+TERMCAP_DEP=
+fi
+])
+
+AC_DEFUN(BASH_FUNC_GETCWD,
+[AC_MSG_CHECKING([if getcwd() calls popen()])
+AC_CACHE_VAL(bash_cv_getcwd_calls_popen,
+[AC_TRY_RUN([
+#include <stdio.h>
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+
+#ifndef __STDC__
+#ifndef const
+#define const
+#endif
+#endif
+
+int popen_called;
+
+FILE *
+popen(command, type)
+ const char *command;
+ const char *type;
+{
+ popen_called = 1;
+ return (FILE *)NULL;
+}
+
+FILE *_popen(command, type)
+ const char *command;
+ const char *type;
+{
+ return (popen (command, type));
+}
+
+int
+pclose(stream)
+FILE *stream;
+{
+ return 0;
+}
+
+int
+_pclose(stream)
+FILE *stream;
+{
+ return 0;
+}
+
+main()
+{
+ char lbuf[32];
+ popen_called = 0;
+ getcwd(lbuf, 32);
+ exit (popen_called);
+}
+], bash_cv_getcwd_calls_popen=no, bash_cv_getcwd_calls_popen=yes,
+ [AC_MSG_WARN(cannot check whether getcwd calls popen if cross compiling -- defaulting to no)
+ bash_cv_getcwd_calls_popen=no]
+)])
+AC_MSG_RESULT($bash_cv_getcwd_calls_popen)
+if test $bash_cv_getcwd_calls_popen = yes; then
+AC_DEFINE(GETCWD_BROKEN)
+fi
+])
+
+AC_DEFUN(BASH_STRUCT_DIRENT_D_INO,
+[AC_REQUIRE([AC_HEADER_DIRENT])
+AC_MSG_CHECKING(if struct dirent has a d_ino member)
+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(STRUCT_DIRENT_HAS_D_INO)
+fi
+])
+
+AC_DEFUN(BASH_STRUCT_DIRENT_D_FILENO,
+[AC_REQUIRE([AC_HEADER_DIRENT])
+AC_MSG_CHECKING(if struct dirent has a d_fileno member)
+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(STRUCT_DIRENT_HAS_D_FILENO)
+fi
+])
+
+AC_DEFUN(BASH_REINSTALL_SIGHANDLERS,
+[AC_REQUIRE([AC_TYPE_SIGNAL])
+AC_REQUIRE([BASH_SIGNAL_CHECK])
+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
+])
+
+AC_DEFUN(BASH_FUNC_SBRK_DECLARED,
+[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 check that some necessary job control definitions are present
+AC_DEFUN(BASH_JOB_CONTROL_MISSING,
+[AC_REQUIRE([BASH_SIGNAL_CHECK])
+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_FUNC_POSIX_SETJMP,
+[AC_REQUIRE([BASH_SIGNAL_CHECK])
+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_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_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
+])
+
+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_MISC_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 programs are able to redeclare getpw functions)
+AC_CACHE_VAL(bash_cv_can_redecl_getpw,
+[AC_TRY_COMPILE([#include <sys/types.h>
+#include <pwd.h>
+extern struct passwd *getpwent();
+extern struct passwd *getpwuid();
+extern struct passwd *getpwnam();],
+[struct passwd *z; z = getpwent(); z = getpwuid(0); z = getpwnam("root");],
+ bash_cv_can_redecl_getpw=yes,bash_cv_can_redecl_getpw=no)])
+AC_MSG_RESULT($bash_cv_can_redecl_getpw)
+if test $bash_cv_can_redecl_getpw = no; 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,
+[if test -d /dev/fd && test -r /dev/fd/0; then
+ bash_cv_dev_fd=standard
+ elif test -d /proc/self/fd && test -r /proc/self/fd/0; then
+ bash_cv_dev_fd=whacky
+ else
+ bash_cv_dev_fd=absent
+ 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; then
+ bash_cv_dev_stdin=present
+ elif test -d /proc/self/fd && test -r /dev/stdin; 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 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_SOCKLIB,
+[
+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
+])
+
+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_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 /usr/mail; then
+ bash_cv_mail_dir=/usr/mail
+ elif test -d /var/spool/mail; then
+ bash_cv_mail_dir=/var/spool/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)
+if test $bash_cv_mail_dir = "/var/mail"; then
+ AC_DEFINE(DEFAULT_MAIL_DIRECTORY, "/var/mail")
+elif test $bash_cv_mail_dir = "/usr/mail"; then
+ AC_DEFINE(DEFAULT_MAIL_DIRECTORY, "/usr/mail")
+elif test $bash_cv_mail_dir = "/var/spool/mail"; then
+ AC_DEFINE(DEFAULT_MAIL_DIRECTORY, "/var/spool/mail")
+elif test $bash_cv_mail_dir = "/usr/spool/mail"; then
+ AC_DEFINE(DEFAULT_MAIL_DIRECTORY, "/usr/spool/mail")
+else
+ AC_DEFINE(DEFAULT_MAIL_DIRECTORY, "unknown")
+fi
+])
+
+dnl
+dnl Check if HPUX needs _KERNEL defined for RLIMIT_* definitions
+dnl
+AC_DEFUN(BASH_KERNEL_RLIMIT_CHECK,
+[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
+])
+
+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
+])
+
+dnl
+dnl If available, use support for large files unless the user specified
+dnl one of the CPPFLAGS, LDFLAGS, or LIBS variables (<eggert@twinsun.com>
+dnl via GNU patch 2.5)
+dnl
+AC_DEFUN(BASH_LARGE_FILE_SUPPORT,
+[AC_MSG_CHECKING(whether large file support needs explicit enabling)
+ac_getconfs=''
+ac_result=yes
+ac_set=''
+ac_shellvars='CPPFLAGS LDFLAGS LIBS'
+for ac_shellvar in $ac_shellvars; do
+ case $ac_shellvar in
+ CPPFLAGS) ac_lfsvar=LFS_CFLAGS ac_lfs64var=LFS64_CFLAGS ;;
+ *) ac_lfsvar=LFS_$ac_shellvar ac_lfs64var=LFS64_$ac_shellvar ;;
+ esac
+ eval test '"${'$ac_shellvar'+set}"' = set && ac_set=$ac_shellvar
+ (getconf $ac_lfsvar) >/dev/null 2>&1 || { ac_result=no; break; }
+ ac_getconf=`getconf $ac_lfsvar`
+ ac_getconf64=`getconf $ac_lfs64var`
+ ac_getconfs=$ac_getconfs$ac_getconf\ $ac_getconf64
+ eval ac_test_$ac_shellvar="\$ac_getconf\ \$ac_getconf64"
+done
+case "$ac_result$ac_getconfs" in
+yes) ac_result=no ;;
+esac
+case "$ac_result$ac_set" in
+yes?*) ac_result="yes, but $ac_set is already set, so use its settings"
+esac
+AC_MSG_RESULT($ac_result)
+case $ac_result in
+yes)
+ for ac_shellvar in $ac_shellvars; do
+ eval $ac_shellvar=\$ac_test_$ac_shellvar
+ done ;;
+esac
+])
+
+dnl
+dnl AC_SYS_RESTARTABLE_SYSCALLS tests only for restarted system calls
+dnl after a signal handler has been installed with signal(). Since
+dnl Bash uses sigaction() if it is available, we need to check whether
+dnl or not a signal handler installed with sigaction and SA_RESTART
+dnl causes system calls to be restarted after the signal is caught
+dnl
+AC_DEFUN(BASH_SYS_RESTARTABLE_SYSCALLS,
+[AC_REQUIRE([BASH_SIGNAL_CHECK])
+AC_CACHE_CHECK(for restartable system calls with posix sigaction,
+bash_cv_sys_restartable_syscalls,
+[AC_TRY_RUN(
+[/* Exit 0 (true) if wait returns something other than -1,
+ i.e. the pid of the child, which means that wait was restarted
+ after getting the signal. */
+#include <sys/types.h>
+#include <signal.h>
+static int caught = 0;
+void ucatch (isig) int isig; { caught = 1; }
+main ()
+{
+#if !defined (_POSIX_VERSION) || !defined (HAVE_POSIX_SIGNALS)
+ exit (1);
+#else
+ struct sigaction act, oact;
+ int i, status;
+
+ act.sa_handler = ucatch;
+ /* Might want to add SA_RESTART here, but bash's set_signal_handler
+ does not. */
+ act.sa_flags = 0;
+ sigemptyset(&act.sa_mask);
+ sigemptyset(&oact.sa_mask);
+ i = fork ();
+ /* A possible race condition here, but in practice it never happens. */
+ if (i == 0) { sleep (3); kill (getppid (), SIGINT); sleep (3); exit (0); }
+ sigaction(SIGINT, &act, &oact);
+ status = wait(&i);
+ if (status == -1) wait(&i);
+ exit (status == -1);
+#endif
+}
+], bash_cv_sys_restartable_syscalls=yes, bash_cv_sys_restartable_syscalls=no,
+ AC_MSG_WARN(cannot check restartable syscalls if cross compiling))
+])
+if test $bash_cv_sys_restartable_syscalls = yes; then
+ AC_DEFINE(HAVE_RESTARTABLE_SYSCALLS)
+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_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
+])
diff --git a/gnu/lib/libreadline/ansi_stdlib.h b/gnu/lib/libreadline/ansi_stdlib.h
new file mode 100644
index 00000000000..a720cb9bcbc
--- /dev/null
+++ b/gnu/lib/libreadline/ansi_stdlib.h
@@ -0,0 +1,41 @@
+/* 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 long int atol ();
+
+/* Memory allocation functions. */
+extern char *malloc ();
+extern char *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/gnu/lib/libreadline/bind.c b/gnu/lib/libreadline/bind.c
new file mode 100644
index 00000000000..6a6424e9e02
--- /dev/null
+++ b/gnu/lib/libreadline/bind.c
@@ -0,0 +1,2101 @@
+/* bind.c -- key binding and startup file support for the readline library. */
+
+/* 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
+
+#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 int _rl_read_init_file __P((char *, int));
+static int glean_key_from_name __P((char *));
+static int substring_member_of_array __P((char *, 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, Function *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)
+ char *name;
+ Function *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;
+ Function *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;
+ Function *function;
+ Keymap map;
+{
+ int result;
+ Keymap oldmap;
+
+ oldmap = _rl_keymap;
+ _rl_keymap = map;
+ result = rl_bind_key (key, function);
+ _rl_keymap = oldmap;
+ return (result);
+}
+
+/* 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, (Function *)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, (Function *)NULL, map));
+}
+
+/* Unbind all keys bound to FUNCTION in MAP. */
+int
+rl_unbind_function_in_map (func, map)
+ Function *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 = (Function *)NULL;
+ rval = 1;
+ }
+ }
+ return rval;
+}
+
+int
+rl_unbind_command_in_map (command, map)
+ char *command;
+ Keymap map;
+{
+ Function *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. This makes new keymaps as necessary. The initial
+ place to do bindings is in MAP. */
+int
+rl_set_key (keyseq, function, map)
+ char *keyseq;
+ Function *function;
+ Keymap map;
+{
+ return (rl_generic_bind (ISFUNC, keyseq, (char *)function, map));
+}
+
+/* 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)
+ 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;
+ char *keyseq, *data;
+ Keymap map;
+{
+ char *keys;
+ int keys_len;
+ register int i;
+
+ /* If no keys to bind to, exit right away. */
+ if (!keyseq || !*keyseq)
+ {
+ if (type == ISMACR)
+ free (data);
+ return -1;
+ }
+
+ keys = 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++)
+ {
+ int ic = (int) ((unsigned char)keys[i]);
+
+ if (_rl_convert_meta_chars_to_ascii && META_CHAR (ic))
+ {
+ ic = UNMETA (ic);
+ if (map[ESC].type == ISKMAP)
+ map = FUNCTION_TO_KEYMAP (map, ESC);
+ }
+
+ if ((i + 1) < keys_len)
+ {
+ if (map[ic].type != ISKMAP)
+ {
+ if (map[ic].type == ISMACR)
+ free ((char *)map[ic].function);
+
+ map[ic].type = ISKMAP;
+ map[ic].function = KEYMAP_TO_FUNCTION (rl_make_bare_keymap());
+ }
+ map = FUNCTION_TO_KEYMAP (map, ic);
+ }
+ else
+ {
+ if (map[ic].type == ISMACR)
+ free ((char *)map[ic].function);
+
+ 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)
+ char *seq, *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;
+ i += 5;
+ array[l++] = CTRL (_rl_to_upper (seq[i]));
+ if (seq[i] == '\0')
+ i--;
+ }
+ else if (c == 'M')
+ {
+ i++;
+ array[l++] = ESC; /* XXX */
+ }
+ 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 + 1);
+ break;
+ case 'x':
+ i++;
+ for (temp = 3, c = 0; isxdigit (seq[i]) && temp--; i++)
+ c = (c * 16) + HEXVALUE (seq[i]);
+ if (temp == 3)
+ c = 'x';
+ i--; /* auto-increment in for loop */
+ array[l++] = c % (largest_char + 1);
+ 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 (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 = 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 (CTRL_CHAR (c) && c != ESC)
+ {
+ *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. */
+Function *
+rl_named_function (string)
+ 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 ((Function *)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). */
+Function *
+rl_function_of_keyseq (keyseq, map, type)
+ char *keyseq;
+ Keymap map;
+ int *type;
+{
+ register int i;
+
+ if (!map)
+ map = _rl_keymap;
+
+ for (i = 0; keyseq && keyseq[i]; i++)
+ {
+ int ic = keyseq[i];
+
+ if (META_CHAR (ic) && _rl_convert_meta_chars_to_ascii)
+ {
+ if (map[ESC].type != ISKMAP)
+ {
+ if (type)
+ *type = map[ESC].type;
+
+ return (map[ESC].function);
+ }
+ else
+ {
+ map = FUNCTION_TO_KEYMAP (map, ESC);
+ ic = UNMETA (ic);
+ }
+ }
+
+ if (map[ic].type == ISKMAP)
+ {
+ /* If this is the last key in the key sequence, return the
+ map. */
+ if (!keyseq[i + 1])
+ {
+ if (type)
+ *type = ISKMAP;
+
+ return (map[ic].function);
+ }
+ else
+ map = FUNCTION_TO_KEYMAP (map, ic);
+ }
+ else
+ {
+ if (type)
+ *type = map[ic].type;
+
+ return (map[ic].function);
+ }
+ }
+ return ((Function *) 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 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 0
+ if (i < file_size)
+#else
+ if (i < 0)
+#endif
+ {
+ free (buffer);
+ return ((char *)NULL);
+ }
+
+#if 0
+ buffer[file_size] = '\0';
+ if (sizep)
+ *sizep = file_size;
+#else
+ buffer[i] = '\0';
+ if (sizep)
+ *sizep = i;
+#endif
+
+ 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 ((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
+ If the file existed and could be opened and read, 0 is returned,
+ otherwise errno is returned. */
+int
+rl_read_init_file (filename)
+ char *filename;
+{
+ /* Default the filename. */
+ if (filename == 0)
+ {
+ filename = last_readline_init_file;
+ if (filename == 0)
+ filename = get_env_value ("INPUTRC");
+ if (filename == 0)
+ filename = DEFAULT_INPUTRC;
+ }
+
+ if (*filename == 0)
+ filename = DEFAULT_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)
+ 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 (__CYGWIN32__)
+ /* ``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)
+ 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 */
+/* */
+/* **************************************************************** */
+
+/* Conditionals. */
+
+/* Calling programs set this to have their argv[0]. */
+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;
+ }
+
+ /* 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++)
+ 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;
+{
+ char *old_init_file, *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 (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 {
+ char *name;
+ Function *function;
+} parser_directives [] = {
+ { "if", parser_if },
+ { "endif", parser_endif },
+ { "else", parser_else },
+ { "include", parser_include },
+ { (char *)0x0, (Function *)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 = string + i;
+ char *value;
+
+ /* 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++;
+
+ 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 = string[i++], passc;
+
+ 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_set_key (). Otherwise, let the older code deal with it. */
+ if (*string == '"')
+ {
+ char *seq;
+ register int j, k, passc;
+
+ seq = 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_set_key (seq, rl_named_function (funname), _rl_keymap);
+
+ 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, possible_control_prefixes))
+ key = CTRL (_rl_to_upper (key));
+
+ if (substring_member_of_array (string, possible_meta_prefixes))
+ key = META (key);
+
+ /* Temporary. Handle old-style keyname with macro-binding. */
+ if (*funname == '\'' || *funname == '"')
+ {
+ unsigned 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 {
+ char *name;
+ int *value;
+ int flags;
+} boolean_varlist [] = {
+ { "blink-matching-paren", &rl_blink_matching_paren, V_SPECIAL },
+ { "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 },
+ { "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 },
+ { "meta-flag", &_rl_meta_flag, 0 },
+ { "output-meta", &_rl_output_meta_chars, 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 },
+#if defined (VISIBLE_STATS)
+ { "visible-stats", &rl_visible_stats, 0 },
+#endif /* VISIBLE_STATS */
+ { (char *)NULL, (int *)NULL }
+};
+
+static int
+find_boolean_var (name)
+ 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;
+{
+ 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;
+ }
+}
+
+/* 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 __P((char *));
+static int sv_combegin __P((char *));
+static int sv_compquery __P((char *));
+static int sv_editmode __P((char *));
+static int sv_isrchterm __P((char *));
+static int sv_keymap __P((char *));
+
+static struct {
+ char *name;
+ int flags;
+ Function *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)
+ 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)
+ char *value;
+{
+ return (value == 0 || *value == '\0' ||
+ (_rl_stricmp (value, "on") == 0) ||
+ (value[0] == '1' && value[1] == '\0'));
+}
+
+int
+rl_variable_bind (name, value)
+ 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)
+ 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)
+ char *value;
+{
+ if (value && *value)
+ {
+ FREE (_rl_comment_begin);
+ _rl_comment_begin = savestring (value);
+ return 0;
+ }
+ return 1;
+}
+
+static int
+sv_compquery (value)
+ 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)
+ char *value;
+{
+ Keymap kmap;
+
+ kmap = rl_get_keymap_by_name (value);
+ if (kmap)
+ {
+ rl_set_keymap (kmap);
+ return 0;
+ }
+ return 1;
+}
+
+#define _SET_BELL(v) do { _rl_bell_preference = v; return 0; } while (0)
+
+static int
+sv_bell_style (value)
+ char *value;
+{
+ if (value == 0 || *value == '\0')
+ _SET_BELL (AUDIBLE_BELL);
+ else if (_rl_stricmp (value, "none") == 0 || _rl_stricmp (value, "off") == 0)
+ _SET_BELL (NO_BELL);
+ else if (_rl_stricmp (value, "audible") == 0 || _rl_stricmp (value, "on") == 0)
+ _SET_BELL (AUDIBLE_BELL);
+ else if (_rl_stricmp (value, "visible") == 0)
+ _SET_BELL (VISIBLE_BELL);
+ else
+ return 1;
+}
+#undef _SET_BELL
+
+static int
+sv_isrchterm (value)
+ 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 = (unsigned 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 {
+ 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 {
+ 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)
+ char *name;
+{
+ register int i;
+
+ for (i = 0; keymap_names[i].name; i++)
+ if (strcmp (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 (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;
+ 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 0
+ /* 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)
+ {
+ keyseq[0] = '\\';
+ keyseq[1] = 'e';
+ keyseq[2] = '\0';
+ return keyseq;
+ }
+#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)
+ Function *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)
+ 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)
+ Function *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;
+ char **names;
+ char *name;
+
+ names = rl_funmap_names ();
+
+ fprintf (rl_outstream, "\n");
+
+ for (i = 0; name = names[i]; i++)
+ {
+ Function *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);
+#if 0
+ out = (char *)map[key].function;
+#else
+ out = _rl_untranslate_macro_value ((char *)map[key].function);
+#endif
+ 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);
+#if 1
+ free (out);
+#endif
+ break;
+ case ISFUNC:
+ break;
+ case ISKMAP:
+ prefix_len = prefix ? strlen (prefix) : 0;
+ if (key == ESC)
+ {
+ keyname = 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 = 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);
+}
+
+void
+rl_variable_dumper (print_readably)
+ int print_readably;
+{
+ int i;
+ char *kname;
+
+ 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");
+ }
+
+ /* bell-style */
+ switch (_rl_bell_preference)
+ {
+ case NO_BELL:
+ kname = "none"; break;
+ case VISIBLE_BELL:
+ kname = "visible"; break;
+ case AUDIBLE_BELL:
+ default:
+ kname = "audible"; break;
+ }
+ if (print_readably)
+ fprintf (rl_outstream, "set bell-style %s\n", kname);
+ else
+ fprintf (rl_outstream, "bell-style is set to `%s'\n", kname);
+
+ /* comment-begin */
+ if (print_readably)
+ fprintf (rl_outstream, "set comment-begin %s\n", _rl_comment_begin ? _rl_comment_begin : RL_COMMENT_BEGIN_DEFAULT);
+ else
+ fprintf (rl_outstream, "comment-begin is set to `%s'\n", _rl_comment_begin ? _rl_comment_begin : "");
+
+ /* completion-query-items */
+ if (print_readably)
+ fprintf (rl_outstream, "set completion-query-items %d\n", rl_completion_query_items);
+ else
+ fprintf (rl_outstream, "completion-query-items is set to `%d'\n", rl_completion_query_items);
+
+ /* editing-mode */
+ if (print_readably)
+ fprintf (rl_outstream, "set editing-mode %s\n", (rl_editing_mode == emacs_mode) ? "emacs" : "vi");
+ else
+ fprintf (rl_outstream, "editing-mode is set to `%s'\n", (rl_editing_mode == emacs_mode) ? "emacs" : "vi");
+
+ /* keymap */
+ kname = rl_get_keymap_name (_rl_keymap);
+ if (kname == 0)
+ kname = rl_get_keymap_name_from_edit_mode ();
+ if (print_readably)
+ fprintf (rl_outstream, "set keymap %s\n", kname ? kname : "none");
+ else
+ fprintf (rl_outstream, "keymap is set to `%s'\n", kname ? kname : "none");
+
+ /* isearch-terminators */
+ if (_rl_isearch_terminators)
+ {
+ char *disp;
+
+ disp = _rl_untranslate_macro_value (_rl_isearch_terminators);
+
+ if (print_readably)
+ fprintf (rl_outstream, "set isearch-terminators \"%s\"\n", disp);
+ else
+ fprintf (rl_outstream, "isearch-terminators is set to \"%s\"\n", disp);
+
+ free (disp);
+ }
+}
+
+/* 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);
+}
+
+/* Bind key sequence KEYSEQ to DEFAULT_FUNC if KEYSEQ is unbound. */
+void
+_rl_bind_if_unbound (keyseq, default_func)
+ char *keyseq;
+ Function *default_func;
+{
+ Function *func;
+
+ if (keyseq)
+ {
+ func = rl_function_of_keyseq (keyseq, _rl_keymap, (int *)NULL);
+ if (!func || func == rl_do_lowercase_version)
+ rl_set_key (keyseq, default_func, _rl_keymap);
+ }
+}
+
+/* Return non-zero if any members of ARRAY are a substring in STRING. */
+static int
+substring_member_of_array (string, array)
+ char *string, **array;
+{
+ while (*array)
+ {
+ if (_rl_strindex (string, *array))
+ return (1);
+ array++;
+ }
+ return (0);
+}
diff --git a/gnu/lib/libreadline/callback.c b/gnu/lib/libreadline/callback.c
new file mode 100644
index 00000000000..117235697e1
--- /dev/null
+++ b/gnu/lib/libreadline/callback.c
@@ -0,0 +1,141 @@
+/* callback.c -- functions to use readline as an X `callback' mechanism. */
+
+/* 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
+
+#include "rlconf.h"
+
+#if defined (READLINE_CALLBACKS)
+
+#include <sys/types.h>
+#include <stdio.h>
+
+/* System-specific feature definitions and include files. */
+#include "rldefs.h"
+#include "readline.h"
+#include "rlprivate.h"
+
+/* **************************************************************** */
+/* */
+/* 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. */
+
+VFunction *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;
+
+ (*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)
+ char *prompt;
+ VFunction *linefunc;
+{
+ rl_prompt = prompt;
+ rl_visible_prompt_length = rl_prompt ? rl_expand_prompt (rl_prompt) : 0;
+ 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;
+
+ if (rl_linefunc == NULL)
+ {
+ fprintf (stderr, "readline: readline_callback_read_char() called with no handler!\r\n");
+ abort ();
+ }
+
+ eof = readline_internal_char ();
+
+ if (rl_done)
+ {
+ line = readline_internal_teardown (eof);
+
+ (*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 ();
+ }
+}
+
+/* Remove the handler, and make sure the terminal is in its normal state. */
+void
+rl_callback_handler_remove ()
+{
+ rl_linefunc = NULL;
+ if (in_handler)
+ {
+ in_handler = 0;
+ (*rl_deprep_term_function) ();
+#if defined (HANDLE_SIGNALS)
+ rl_clear_signals ();
+#endif
+ }
+}
+
+#endif
diff --git a/gnu/lib/libreadline/chardefs.h b/gnu/lib/libreadline/chardefs.h
new file mode 100644
index 00000000000..664c1e43368
--- /dev/null
+++ b/gnu/lib/libreadline/chardefs.h
@@ -0,0 +1,140 @@
+/* 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)
+# include <string.h>
+# else
+# include <strings.h>
+# endif /* HAVE_STRING_H */
+#else
+# include <string.h>
+#endif /* !HAVE_CONFIG_H */
+
+#ifndef whitespace
+#define whitespace(c) (((c) == ' ') || ((c) == '\t'))
+#endif
+
+#ifdef CTRL
+#undef CTRL
+#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) >= 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))
+
+/* Old versions
+#define _rl_lowercase_p(c) (((c) > ('a' - 1) && (c) < ('z' + 1)))
+#define _rl_uppercase_p(c) (((c) > ('A' - 1) && (c) < ('Z' + 1)))
+#define _rl_digit_p(c) ((c) >= '0' && (c) <= '9')
+*/
+
+#define _rl_lowercase_p(c) (islower(c))
+#define _rl_uppercase_p(c) (isupper(c))
+#define _rl_digit_p(x) (isdigit (x))
+
+#define _rl_pure_alphabetic(c) (_rl_lowercase_p(c) || _rl_uppercase_p(c))
+#define ALPHABETIC(c) (_rl_lowercase_p(c) || _rl_uppercase_p(c) || _rl_digit_p(c))
+
+/* Old versions
+# define _rl_to_upper(c) (_rl_lowercase_p(c) ? ((c) - 32) : (c))
+# define _rl_to_lower(c) (_rl_uppercase_p(c) ? ((c) + 32) : (c))
+*/
+
+#ifndef _rl_to_upper
+# define _rl_to_upper(c) (islower(c) ? toupper(c) : (c))
+# define _rl_to_lower(c) (isupper(c) ? tolower(c) : (c))
+#endif
+
+#ifndef _rl_digit_value
+#define _rl_digit_value(x) ((x) - '0')
+#endif
+
+#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('[')
+
+#ifndef ISOCTAL
+#define ISOCTAL(c) ((c) >= '0' && (c) <= '7')
+#endif
+#define OCTVALUE(c) ((c) - '0')
+
+#ifndef isxdigit
+# define isxdigit(c) (isdigit((c)) || ((c) >= 'a' && (c) <= 'f') || ((c) >= 'A' && (c) <= 'F'))
+#endif
+
+#define HEXVALUE(c) \
+ (((c) >= 'a' && (c) <= 'f') \
+ ? (c)-'a'+10 \
+ : (c) >= 'A' && (c) <= 'F' ? (c)-'A'+10 : (c)-'0')
+
+#endif /* _CHARDEFS_H_ */
diff --git a/gnu/lib/libreadline/complete.c b/gnu/lib/libreadline/complete.c
new file mode 100644
index 00000000000..fb48712a4e0
--- /dev/null
+++ b/gnu/lib/libreadline/complete.c
@@ -0,0 +1,1776 @@
+/* complete.c -- filename completion for 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. */
+#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 */
+
+#include <pwd.h>
+#if !defined (HAVE_GETPW_DECLS)
+extern struct passwd *getpwent ();
+#endif /* USG && !HAVE_GETPW_DECLS */
+
+/* ISC systems don't define getpwent() if _POSIX_SOURCE is defined. */
+#if defined (isc386) && defined (_POSIX_SOURCE)
+# if defined (__STDC__)
+extern struct passwd *getpwent (void);
+# else
+extern struct passwd *getpwent ();
+# endif /* !__STDC__ */
+#endif /* isc386 && _POSIX_SOURCE */
+
+#include "posixdir.h"
+#include "posixstat.h"
+
+/* System-specific feature definitions and include files. */
+#include "rldefs.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
+
+/* 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. */
+VFunction *rl_completion_display_matches_hook = (VFunction *)NULL;
+
+/* Forward declarations for functions defined and used in this file. */
+char *filename_completion_function __P((char *, int));
+char **completion_matches __P((char *, CPFunction *));
+
+#if defined (VISIBLE_STATS)
+# if !defined (X_OK)
+# define X_OK 1
+# endif
+static int stat_char __P((char *));
+#endif
+
+static char *rl_quote_filename __P((char *, int, char *));
+static char *rl_strpbrk __P((char *, char *));
+
+static char **remove_duplicate_matches __P((char **));
+static void insert_match __P((char *, int, int, char *));
+static int append_to_match __P((char *, int, int));
+static void insert_all_matches __P((char **, int, char *));
+static void display_matches __P((char **));
+static int compute_lcd_of_matches __P((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, completed directory names have a slash appended. */
+int _rl_complete_mark_directories = 1;
+
+/* 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
+
+/* 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. */
+Function *rl_directory_completion_hook = (Function *)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 filename_completion_function (), the default filename
+ completer. */
+Function *rl_completion_entry_function = (Function *)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. */
+CPPFunction *rl_attempted_completion_function = (CPPFunction *)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. */
+int rl_completion_query_items = 100;
+
+/* 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\"\\'`@$><=" */
+char *rl_basic_word_break_characters = " \t\n\"\\'`@$><=;|&{(";
+
+/* List of basic quoting characters. */
+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. */
+char *rl_completer_word_break_characters = (char *)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. */
+char *rl_completer_quote_characters = (char *)NULL;
+
+/* List of characters that should be quoted in filenames by the completer. */
+char *rl_filename_quote_characters = (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. */
+char *rl_special_prefixes = (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. */
+Function *rl_ignore_some_completions_function = (Function *)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. */
+CPFunction *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. */
+CPFunction *rl_filename_dequoting_function = (CPFunction *)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. */
+Function *rl_char_is_quoted_p = (Function *)NULL;
+
+/* 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, 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
+ 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 (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
+ 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 ('*'));
+}
+
+/************************************/
+/* */
+/* Completion utility functions */
+/* */
+/************************************/
+
+/* Find the first occurrence in STRING1 of any character from STRING2.
+ Return a pointer to the character in STRING1. */
+static char *
+rl_strpbrk (string1, string2)
+ char *string1, *string2;
+{
+ register char *scan;
+
+ for (; *string1; string1++)
+ {
+ for (scan = string2; *scan; scan++)
+ {
+ if (*string1 == *scan)
+ {
+ return (string1);
+ }
+ }
+ }
+ return ((char *)NULL);
+}
+
+/* The user must press "y" or "n". Non-zero return means "y" pressed. */
+static int
+get_y_or_n ()
+{
+ int c;
+
+ for (;;)
+ {
+ c = rl_read_key ();
+ if (c == 'y' || c == 'Y' || c == ' ')
+ return (1);
+ if (c == 'n' || c == 'N' || c == RUBOUT)
+ return (0);
+ if (c == ABORT_CHAR)
+ _rl_abort_internal ();
+ ding ();
+ }
+}
+
+#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. */
+static char *
+printable_part (pathname)
+ char *pathname;
+{
+ char *temp;
+
+ temp = rl_filename_completion_desired ? strrchr (pathname, '/') : (char *)NULL;
+#if defined (__MSDOS__)
+ if (rl_filename_completion_desired && temp == 0 && isalpha (pathname[0]) && pathname[1] == ':')
+ temp = pathname + 1;
+#endif
+ return (temp ? ++temp : pathname);
+}
+
+/* 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. */
+
+#define PUTX(c) \
+ do { \
+ if (CTRL_CHAR (c)) \
+ { \
+ putc ('^', rl_outstream); \
+ putc (UNCTRL (c), rl_outstream); \
+ printed_len += 2; \
+ } \
+ else if (c == RUBOUT) \
+ { \
+ putc ('^', rl_outstream); \
+ putc ('?', rl_outstream); \
+ printed_len += 2; \
+ } \
+ else \
+ { \
+ putc (c, rl_outstream); \
+ printed_len++; \
+ } \
+ } while (0)
+
+static int
+print_filename (to_print, full_pathname)
+ char *to_print, *full_pathname;
+{
+ int printed_len = 0;
+#if !defined (VISIBLE_STATS)
+ char *s;
+
+ for (s = to_print; *s; s++)
+ {
+ PUTX (*s);
+ }
+#else
+ char *s, c, *new_full_pathname;
+ int extension_char, slen, tlen;
+
+ for (s = to_print; *s; s++)
+ {
+ PUTX (*s);
+ }
+
+ if (rl_filename_completion_desired && rl_visible_stats)
+ {
+ /* 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 `/'. */
+ s = tilde_expand (full_pathname && *full_pathname ? full_pathname : "/");
+ if (rl_directory_completion_hook)
+ (*rl_directory_completion_hook) (&s);
+
+ slen = strlen (s);
+ tlen = strlen (to_print);
+ new_full_pathname = xmalloc (slen + tlen + 2);
+ strcpy (new_full_pathname, s);
+ new_full_pathname[slen] = '/';
+ strcpy (new_full_pathname + slen + 1, to_print);
+
+ extension_char = stat_char (new_full_pathname);
+
+ free (new_full_pathname);
+ to_print[-1] = c;
+ }
+ else
+ {
+ s = tilde_expand (full_pathname);
+ extension_char = stat_char (s);
+ }
+
+ free (s);
+ if (extension_char)
+ {
+ putc (extension_char, rl_outstream);
+ printed_len++;
+ }
+ }
+#endif /* VISIBLE_STATS */
+ return printed_len;
+}
+
+static char *
+rl_quote_filename (s, rtype, qcp)
+ char *s;
+ int rtype;
+ char *qcp;
+{
+ char *r;
+
+ r = 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. */
+
+static char
+find_completion_word (fp, dp)
+ int *fp, *dp;
+{
+ int scan, end, found_quote, delimiter, pass_next, isbrk;
+ char quote_char;
+
+ end = rl_point;
+ found_quote = delimiter = 0;
+ quote_char = '\0';
+
+ 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++)
+ {
+ if (pass_next)
+ {
+ pass_next = 0;
+ continue;
+ }
+
+ if (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;
+ }
+ }
+ }
+
+ 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)
+ {
+ scan = rl_line_buffer[rl_point];
+
+ if (strchr (rl_completer_word_break_characters, 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 (rl_completer_word_break_characters, scan) != 0;
+ else
+ isbrk = strchr (rl_completer_word_break_characters, 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;
+ Function *our_func;
+ int found_quote, quote_char;
+{
+ char **matches, *temp;
+
+ /* 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);
+ }
+ }
+
+ /* Beware -- we're stripping the quotes here. Do this only if we know
+ we are doing filename completion and the application has defined a
+ filename dequoting function. */
+ temp = (char *)NULL;
+
+ if (found_quote && our_func == (Function *)filename_completion_function &&
+ rl_filename_dequoting_function)
+ {
+ /* delete single and double quotes */
+ temp = (*rl_filename_dequoting_function) (text, quote_char);
+ text = temp; /* not freeing text is not a memory leak */
+ }
+
+ matches = completion_matches (text, (CPFunction *)our_func);
+ FREE (temp);
+ 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;
+ char *text;
+{
+ register int i, c1, c2, si;
+ int low; /* Count of max-matched characters. */
+
+ /* 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 (_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 (c1 != c2)
+ break;
+ }
+ else
+ {
+ for (si = 0;
+ (c1 = match_list[i][si]) &&
+ (c2 = match_list[i + 1][si]);
+ si++)
+ 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] = xmalloc (strlen (text) + 1);
+ strcpy (match_list[0], text);
+ }
+ else
+ {
+ match_list[0] = xmalloc (low + 1);
+ 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;
+
+ /* 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;
+ int i, j, k, l;
+ char *temp;
+
+ /* How many items of MAX length can we fit in the screen window? */
+ max += 2;
+ limit = screenwidth / max;
+ if (limit != 1 && (limit * max == screenwidth))
+ limit--;
+
+ /* Avoid a possible floating exception. If max > 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);
+
+ crlf ();
+
+ 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;
+ }
+ crlf ();
+ }
+ }
+ 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)
+ crlf ();
+ else
+ for (k = 0; k < max - printed_len; k++)
+ putc (' ', rl_outstream);
+ }
+ }
+ 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]);
+ crlf ();
+ print_filename (temp, matches[0]);
+ 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 = strlen (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 (len >= rl_completion_query_items)
+ {
+ crlf ();
+ fprintf (rl_outstream, "Display all %d possibilities? (y or n)", len);
+ fflush (rl_outstream);
+ if (get_y_or_n () == 0)
+ {
+ 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. */
+static int
+append_to_match (text, delimiter, quote_char)
+ char *text;
+ int delimiter, quote_char;
+{
+ char temp_string[4], *filename;
+ int temp_string_index;
+ struct stat finfo;
+
+ temp_string_index = 0;
+ if (quote_char && rl_point && 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_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);
+ if (stat (filename, &finfo) == 0 && S_ISDIR (finfo.st_mode))
+ {
+ if (_rl_complete_mark_directories && rl_line_buffer[rl_point] != '/')
+ rl_insert_text ("/");
+ }
+ else
+ {
+ if (rl_point == rl_end)
+ rl_insert_text (temp_string);
+ }
+ free (filename);
+ }
+ else
+ {
+ if (rl_point == rl_end)
+ 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 ();
+}
+
+static void
+free_match_list (matches)
+ char **matches;
+{
+ register int i;
+
+ 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. */
+int
+rl_complete_internal (what_to_do)
+ int what_to_do;
+{
+ char **matches;
+ Function *our_func;
+ int start, end, delimiter, found_quote, i;
+ char *text, *saved_line_buffer;
+ char quote_char;
+
+ /* Only the completion entry function can change these. */
+ rl_filename_completion_desired = 0;
+ rl_filename_quoting_desired = 1;
+ rl_completion_type = 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
+ : (Function *)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 = 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);
+ free (text);
+
+ if (matches == 0)
+ {
+ ding ();
+ FREE (saved_line_buffer);
+ return (0);
+ }
+
+#if 0
+ /* If we are matching filenames, our_func will have been set to
+ filename_completion_function */
+ i = our_func == (Function *)filename_completion_function;
+#else
+ /* If we are matching filenames, the attempted completion function will
+ have set rl_filename_completion_desired to a non-zero value. The basic
+ filename_completion_function does this. */
+ i = rl_filename_completion_desired;
+#endif
+
+ if (postprocess_matches (&matches, i) == 0)
+ {
+ ding ();
+ FREE (saved_line_buffer);
+ completion_changed_buffer = 0;
+ return (0);
+ }
+
+ switch (what_to_do)
+ {
+ case TAB:
+ 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 (rl_editing_mode != vi_mode)
+ ding (); /* There are other matches remaining. */
+ }
+ else
+ append_to_match (matches[0], delimiter, quote_char);
+
+ 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);
+ ding ();
+ FREE (saved_line_buffer);
+ return 1;
+ }
+
+ 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);
+ }
+
+ 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 **
+completion_matches (text, entry_function)
+ char *text;
+ CPFunction *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 *
+username_completion_function (text, state)
+ 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 ();
+ }
+
+ while (entry = getpwent ())
+ {
+ /* Null usernames should result in all users as possible completions. */
+ if (namelen == 0 || (STREQN (username, entry->pw_name, namelen)))
+ break;
+ }
+
+ if (entry == 0)
+ {
+ endpwent ();
+ return ((char *)NULL);
+ }
+ else
+ {
+ value = 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 *
+filename_completion_function (text, state)
+ 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 (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 (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_completion_hook && (*rl_directory_completion_hook) (&dirname))
+ {
+ free (users_dirname);
+ users_dirname = savestring (dirname);
+ }
+
+ directory = opendir (dirname);
+ 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.
+ All entries except "." and ".." match. */
+ if (filename_len == 0)
+ {
+ 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 = 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 = xmalloc (1 + dirlen + D_NAMLEN (entry));
+ strcpy (temp, users_dirname);
+ }
+
+ 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;
+{
+ Function *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)
+ free_match_list (matches);
+
+ match_list_index = match_list_size = 0;
+ matches = (char **)NULL;
+
+ /* Only the completion entry function can change these. */
+ rl_filename_completion_desired = 0;
+ rl_filename_quoting_desired = 1;
+ rl_completion_type = '%';
+
+ our_func = rl_completion_entry_function
+ ? rl_completion_entry_function
+ : (Function *)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 = 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 0
+ /* If we are matching filenames, our_func will have been set to
+ filename_completion_function */
+ matching_filenames = our_func == (Function *)filename_completion_function;
+#else
+ /* If we are matching filenames, the attempted completion function will
+ have set rl_filename_completion_desired to a non-zero value. The basic
+ filename_completion_function does this. */
+ matching_filenames = rl_filename_completion_desired;
+#endif
+ if (matches == 0 || postprocess_matches (&matches, matching_filenames) == 0)
+ {
+ 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)
+ {
+ ding ();
+ FREE (matches);
+ matches = (char **)0;
+ completion_changed_buffer = 0;
+ return (0);
+ }
+
+ match_list_index = (match_list_index + count) % match_list_size;
+ if (match_list_index < 0)
+ match_list_index += match_list_size;
+
+ if (match_list_index == 0 && match_list_size > 1)
+ {
+ 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);
+ }
+
+ completion_changed_buffer = 1;
+ return (0);
+}
diff --git a/gnu/lib/libreadline/config.h.in b/gnu/lib/libreadline/config.h.in
new file mode 100644
index 00000000000..d9aa5354c1d
--- /dev/null
+++ b/gnu/lib/libreadline/config.h.in
@@ -0,0 +1,148 @@
+/* config.h.in. Generated automatically from configure.in by autoheader. */
+
+/* Define if on MINIX. */
+#undef _MINIX
+
+/* Define as the return type of signal handlers (int or void). */
+#undef RETSIGTYPE
+
+/* Define if the `S_IS*' macros in <sys/stat.h> do not work properly. */
+#undef STAT_MACROS_BROKEN
+
+#undef VOID_SIGHANDLER
+
+/* Define if you have the lstat function. */
+#undef HAVE_LSTAT
+
+/* 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 strcasecmp function. */
+#undef HAVE_STRCASECMP
+
+/* Define if you have the setlocale function. */
+#undef HAVE_SETLOCALE
+
+/* Define if you have the tcgetattr function. */
+#undef HAVE_TCGETATTR
+
+/* Define if you have the strcoll function. */
+#undef HAVE_STRCOLL
+
+#undef STRCOLL_BROKEN
+
+/* Define if you have the <dirent.h> header file. */
+#undef HAVE_DIRENT_H
+
+/* Define if you have the <ndir.h> header file. */
+#undef HAVE_NDIR_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 <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 <stdarg.h> header file. */
+#undef HAVE_STDARG_H
+
+#undef HAVE_LOCALE_H
+
+/* 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
+
+/* config.h.bot */
+/* 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/gnu/lib/libreadline/configure b/gnu/lib/libreadline/configure
new file mode 100644
index 00000000000..bcb5ff85ab6
--- /dev/null
+++ b/gnu/lib/libreadline/configure
@@ -0,0 +1,2958 @@
+#! /bin/sh
+
+# From configure.in for Readline 4.1, version 2.22, from autoconf version 2.13
+LIBVERSION=4.1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+# Guess values for system-dependent variables and create Makefiles.
+# Generated automatically using autoconf version 2.13
+# Copyright (C) 1992, 93, 94, 95, 96 Free Software Foundation, Inc.
+#
+# This configure script is free software; the Free Software Foundation
+# gives unlimited permission to copy, distribute and modify it.
+
+# Defaults:
+ac_help=
+ac_default_prefix=/usr/local
+# Any additions from configure.in:
+ac_help="$ac_help
+--with-curses use the curses library instead of the termcap library"
+
+# Initialize some variables set by options.
+# The variables have the same names as the options, with
+# dashes changed to underlines.
+build=NONE
+cache_file=./config.cache
+exec_prefix=NONE
+host=NONE
+no_create=
+nonopt=NONE
+no_recursion=
+prefix=NONE
+program_prefix=NONE
+program_suffix=NONE
+program_transform_name=s,x,x,
+silent=
+site=
+srcdir=
+target=NONE
+verbose=
+x_includes=NONE
+x_libraries=NONE
+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'
+
+# Initialize some other variables.
+subdirs=
+MFLAGS= MAKEFLAGS=
+SHELL=${CONFIG_SHELL-/bin/sh}
+# Maximum number of lines to put in a shell here document.
+ac_max_here_lines=12
+
+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
+
+ case "$ac_option" in
+ -*=*) ac_optarg=`echo "$ac_option" | sed 's/[-_a-zA-Z0-9]*=//'` ;;
+ *) ac_optarg= ;;
+ esac
+
+ # 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 ;;
+ -build=* | --build=* | --buil=* | --bui=* | --bu=*)
+ build="$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" ;;
+
+ -datadir | --datadir | --datadi | --datad | --data | --dat | --da)
+ ac_prev=datadir ;;
+ -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \
+ | --da=*)
+ datadir="$ac_optarg" ;;
+
+ -disable-* | --disable-*)
+ ac_feature=`echo $ac_option|sed -e 's/-*disable-//'`
+ # Reject names that are not valid shell variable names.
+ if test -n "`echo $ac_feature| sed 's/[-a-zA-Z0-9_]//g'`"; then
+ { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; }
+ fi
+ ac_feature=`echo $ac_feature| sed 's/-/_/g'`
+ eval "enable_${ac_feature}=no" ;;
+
+ -enable-* | --enable-*)
+ ac_feature=`echo $ac_option|sed -e 's/-*enable-//' -e 's/=.*//'`
+ # Reject names that are not valid shell variable names.
+ if test -n "`echo $ac_feature| sed 's/[-_a-zA-Z0-9]//g'`"; then
+ { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; }
+ fi
+ ac_feature=`echo $ac_feature| sed 's/-/_/g'`
+ case "$ac_option" in
+ *=*) ;;
+ *) 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)
+ # 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 << EOF
+Usage: configure [options] [host]
+Options: [defaults in brackets after descriptions]
+Configuration:
+ --cache-file=FILE cache test results in FILE
+ --help print this message
+ --no-create do not create output files
+ --quiet, --silent do not print \`checking...' messages
+ --version print the version of autoconf that created configure
+Directory and file names:
+ --prefix=PREFIX install architecture-independent files in PREFIX
+ [$ac_default_prefix]
+ --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX
+ [same as prefix]
+ --bindir=DIR user executables in DIR [EPREFIX/bin]
+ --sbindir=DIR system admin executables in DIR [EPREFIX/sbin]
+ --libexecdir=DIR program executables in DIR [EPREFIX/libexec]
+ --datadir=DIR read-only architecture-independent data in DIR
+ [PREFIX/share]
+ --sysconfdir=DIR read-only single-machine data in DIR [PREFIX/etc]
+ --sharedstatedir=DIR modifiable architecture-independent data in DIR
+ [PREFIX/com]
+ --localstatedir=DIR modifiable single-machine data in DIR [PREFIX/var]
+ --libdir=DIR object code libraries in DIR [EPREFIX/lib]
+ --includedir=DIR C header files in DIR [PREFIX/include]
+ --oldincludedir=DIR C header files for non-gcc in DIR [/usr/include]
+ --infodir=DIR info documentation in DIR [PREFIX/info]
+ --mandir=DIR man documentation in DIR [PREFIX/man]
+ --srcdir=DIR find the sources in DIR [configure dir or ..]
+ --program-prefix=PREFIX prepend PREFIX to installed program names
+ --program-suffix=SUFFIX append SUFFIX to installed program names
+ --program-transform-name=PROGRAM
+ run sed PROGRAM on installed program names
+EOF
+ cat << EOF
+Host type:
+ --build=BUILD configure for building on BUILD [BUILD=HOST]
+ --host=HOST configure for HOST [guessed]
+ --target=TARGET configure for TARGET [TARGET=HOST]
+Features and packages:
+ --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no)
+ --enable-FEATURE[=ARG] include FEATURE [ARG=yes]
+ --with-PACKAGE[=ARG] use PACKAGE [ARG=yes]
+ --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no)
+ --x-includes=DIR X include files are in DIR
+ --x-libraries=DIR X library files are in DIR
+EOF
+ if test -n "$ac_help"; then
+ echo "--enable and --with options recognized:$ac_help"
+ fi
+ exit 0 ;;
+
+ -host | --host | --hos | --ho)
+ ac_prev=host ;;
+ -host=* | --host=* | --hos=* | --ho=*)
+ host="$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)
+ 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 ;;
+ -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)
+ target="$ac_optarg" ;;
+
+ -v | -verbose | --verbose | --verbos | --verbo | --verb)
+ verbose=yes ;;
+
+ -version | --version | --versio | --versi | --vers)
+ echo "configure generated by autoconf version 2.13"
+ exit 0 ;;
+
+ -with-* | --with-*)
+ ac_package=`echo $ac_option|sed -e 's/-*with-//' -e 's/=.*//'`
+ # Reject names that are not valid shell variable names.
+ if test -n "`echo $ac_package| sed 's/[-_a-zA-Z0-9]//g'`"; then
+ { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; }
+ fi
+ ac_package=`echo $ac_package| sed 's/-/_/g'`
+ case "$ac_option" in
+ *=*) ;;
+ *) ac_optarg=yes ;;
+ esac
+ eval "with_${ac_package}='$ac_optarg'" ;;
+
+ -without-* | --without-*)
+ ac_package=`echo $ac_option|sed -e 's/-*without-//'`
+ # Reject names that are not valid shell variable names.
+ if test -n "`echo $ac_package| sed 's/[-a-zA-Z0-9_]//g'`"; then
+ { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; }
+ fi
+ 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 "configure: error: $ac_option: invalid option; use --help to show usage" 1>&2; exit 1; }
+ ;;
+
+ *)
+ if test -n "`echo $ac_option| sed 's/[-a-z0-9.]//g'`"; then
+ echo "configure: warning: $ac_option: invalid host type" 1>&2
+ fi
+ if test "x$nonopt" != xNONE; then
+ { echo "configure: error: can only configure for one host and one target at a time" 1>&2; exit 1; }
+ fi
+ nonopt="$ac_option"
+ ;;
+
+ esac
+done
+
+if test -n "$ac_prev"; then
+ { echo "configure: error: missing argument to --`echo $ac_prev | sed 's/_/-/g'`" 1>&2; exit 1; }
+fi
+
+trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15
+
+# File descriptor usage:
+# 0 standard input
+# 1 file creation
+# 2 errors and warnings
+# 3 some systems may open it to /dev/tty
+# 4 used on the Kubota Titan
+# 6 checking for... messages and results
+# 5 compiler messages saved in config.log
+if test "$silent" = yes; then
+ exec 6>/dev/null
+else
+ exec 6>&1
+fi
+exec 5>./config.log
+
+echo "\
+This file contains any messages produced by compilers while
+running configure, to aid debugging if configure makes a mistake.
+" 1>&5
+
+# Strip out --no-create and --no-recursion so they do not pile up.
+# Also quote any args containing shell metacharacters.
+ac_configure_args=
+for ac_arg
+do
+ case "$ac_arg" in
+ -no-create | --no-create | --no-creat | --no-crea | --no-cre \
+ | --no-cr | --no-c) ;;
+ -no-recursion | --no-recursion | --no-recursio | --no-recursi \
+ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) ;;
+ *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?]*)
+ ac_configure_args="$ac_configure_args '$ac_arg'" ;;
+ *) ac_configure_args="$ac_configure_args $ac_arg" ;;
+ esac
+done
+
+# NLS nuisances.
+# Only set these to C if already set. These must not be set unconditionally
+# because not all systems understand e.g. LANG=C (notably SCO).
+# Fixing LC_MESSAGES prevents Solaris sh from translating var values in `set'!
+# Non-C LC_CTYPE values break the ctype check.
+if test "${LANG+set}" = set; then LANG=C; export LANG; fi
+if test "${LC_ALL+set}" = set; then LC_ALL=C; export LC_ALL; fi
+if test "${LC_MESSAGES+set}" = set; then LC_MESSAGES=C; export LC_MESSAGES; fi
+if test "${LC_CTYPE+set}" = set; then LC_CTYPE=C; export LC_CTYPE; fi
+
+# 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
+
+# A filename unique to this package, relative to the directory that
+# configure is in, which we can look for to find out if srcdir is correct.
+ac_unique_file=readline.h
+
+# 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_prog=$0
+ ac_confdir=`echo $ac_prog|sed 's%/[^/][^/]*$%%'`
+ test "x$ac_confdir" = "x$ac_prog" && ac_confdir=.
+ 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 "configure: error: can not find sources in $ac_confdir or .." 1>&2; exit 1; }
+ else
+ { echo "configure: error: can not find sources in $srcdir" 1>&2; exit 1; }
+ fi
+fi
+srcdir=`echo "${srcdir}" | sed 's%\([^/]\)/*$%\1%'`
+
+# 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 "loading site script $ac_site_file"
+ . "$ac_site_file"
+ fi
+done
+
+if test -r "$cache_file"; then
+ echo "loading cache $cache_file"
+ . $cache_file
+else
+ echo "creating cache $cache_file"
+ > $cache_file
+fi
+
+ac_ext=c
+# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
+ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
+cross_compiling=$ac_cv_prog_cc_cross
+
+ac_exeext=
+ac_objext=o
+if (echo "testing\c"; echo 1,2,3) | grep c >/dev/null; then
+ # Stardent Vistra SVR4 grep lacks -e, says ghazi@caip.rutgers.edu.
+ if (echo -n testing; echo 1,2,3) | sed s/-n/xn/ | grep xn >/dev/null; then
+ ac_n= ac_c='
+' ac_t=' '
+ else
+ ac_n=-n ac_c= ac_t=
+ fi
+else
+ ac_n= ac_c='\c' ac_t=
+fi
+
+
+
+
+
+
+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
+ fi
+done
+if test -z "$ac_aux_dir"; then
+ { echo "configure: error: can not find install-sh or install.sh in ./support $srcdir/./support" 1>&2; exit 1; }
+fi
+ac_config_guess=$ac_aux_dir/config.guess
+ac_config_sub=$ac_aux_dir/config.sub
+ac_configure=$ac_aux_dir/configure # This should be Cygnus configure.
+
+
+
+# Make sure we can run config.sub.
+if ${CONFIG_SHELL-/bin/sh} $ac_config_sub sun4 >/dev/null 2>&1; then :
+else { echo "configure: error: can not run $ac_config_sub" 1>&2; exit 1; }
+fi
+
+echo $ac_n "checking host system type""... $ac_c" 1>&6
+echo "configure:661: checking host system type" >&5
+
+host_alias=$host
+case "$host_alias" in
+NONE)
+ case $nonopt in
+ NONE)
+ if host_alias=`${CONFIG_SHELL-/bin/sh} $ac_config_guess`; then :
+ else { echo "configure: error: can not guess host type; you must specify one" 1>&2; exit 1; }
+ fi ;;
+ *) host_alias=$nonopt ;;
+ esac ;;
+esac
+
+host=`${CONFIG_SHELL-/bin/sh} $ac_config_sub $host_alias`
+host_cpu=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'`
+host_vendor=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'`
+host_os=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
+echo "$ac_t""$host" 1>&6
+
+
+opt_curses=no
+opt_shared=no
+
+# Check whether --with-curses or --without-curses was given.
+if test "${with_curses+set}" = set; then
+ withval="$with_curses"
+ opt_curses=$withval
+fi
+
+
+if test "$opt_curses" = "yes"; then
+ prefer_curses=yes
+fi
+
+# We want these before the checks, so the checks can modify their values.
+test -z "$CFLAGS" && CFLAGS=-g auto_cflags=1
+
+# Extract the first word of "gcc", so it can be a program name with args.
+set dummy gcc; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:702: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
+ ac_dummy="$PATH"
+ for ac_dir in $ac_dummy; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$ac_word; then
+ ac_cv_prog_CC="gcc"
+ break
+ fi
+ done
+ IFS="$ac_save_ifs"
+fi
+fi
+CC="$ac_cv_prog_CC"
+if test -n "$CC"; then
+ echo "$ac_t""$CC" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+if test -z "$CC"; then
+ # Extract the first word of "cc", so it can be a program name with args.
+set dummy cc; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:732: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
+ ac_prog_rejected=no
+ ac_dummy="$PATH"
+ for ac_dir in $ac_dummy; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$ac_word; then
+ if test "$ac_dir/$ac_word" = "/usr/ucb/cc"; then
+ ac_prog_rejected=yes
+ continue
+ fi
+ ac_cv_prog_CC="cc"
+ break
+ fi
+ done
+ IFS="$ac_save_ifs"
+if test $ac_prog_rejected = yes; then
+ # We found a bogon in the path, so make sure we never use it.
+ set dummy $ac_cv_prog_CC
+ shift
+ if test $# -gt 0; then
+ # We chose a different compiler from the bogus one.
+ # However, it has the same basename, so the bogon will be chosen
+ # first if we set CC to just the basename; use the full file name.
+ shift
+ set dummy "$ac_dir/$ac_word" "$@"
+ shift
+ ac_cv_prog_CC="$@"
+ fi
+fi
+fi
+fi
+CC="$ac_cv_prog_CC"
+if test -n "$CC"; then
+ echo "$ac_t""$CC" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+ if test -z "$CC"; then
+ case "`uname -s`" in
+ *win32* | *WIN32*)
+ # Extract the first word of "cl", so it can be a program name with args.
+set dummy cl; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:783: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
+ ac_dummy="$PATH"
+ for ac_dir in $ac_dummy; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$ac_word; then
+ ac_cv_prog_CC="cl"
+ break
+ fi
+ done
+ IFS="$ac_save_ifs"
+fi
+fi
+CC="$ac_cv_prog_CC"
+if test -n "$CC"; then
+ echo "$ac_t""$CC" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+ ;;
+ esac
+ fi
+ test -z "$CC" && { echo "configure: error: no acceptable cc found in \$PATH" 1>&2; exit 1; }
+fi
+
+echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works""... $ac_c" 1>&6
+echo "configure:815: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5
+
+ac_ext=c
+# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
+ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
+cross_compiling=$ac_cv_prog_cc_cross
+
+cat > conftest.$ac_ext << EOF
+
+#line 826 "configure"
+#include "confdefs.h"
+
+main(){return(0);}
+EOF
+if { (eval echo configure:831: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+ ac_cv_prog_cc_works=yes
+ # If we can't run a trivial program, we are probably using a cross compiler.
+ if (./conftest; exit) 2>/dev/null; then
+ ac_cv_prog_cc_cross=no
+ else
+ ac_cv_prog_cc_cross=yes
+ fi
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ ac_cv_prog_cc_works=no
+fi
+rm -fr conftest*
+ac_ext=c
+# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
+ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
+cross_compiling=$ac_cv_prog_cc_cross
+
+echo "$ac_t""$ac_cv_prog_cc_works" 1>&6
+if test $ac_cv_prog_cc_works = no; then
+ { echo "configure: error: installation or configuration problem: C compiler cannot create executables." 1>&2; exit 1; }
+fi
+echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler""... $ac_c" 1>&6
+echo "configure:857: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5
+echo "$ac_t""$ac_cv_prog_cc_cross" 1>&6
+cross_compiling=$ac_cv_prog_cc_cross
+
+echo $ac_n "checking whether we are using GNU C""... $ac_c" 1>&6
+echo "configure:862: checking whether we are using GNU C" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_gcc'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.c <<EOF
+#ifdef __GNUC__
+ yes;
+#endif
+EOF
+if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:871: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then
+ ac_cv_prog_gcc=yes
+else
+ ac_cv_prog_gcc=no
+fi
+fi
+
+echo "$ac_t""$ac_cv_prog_gcc" 1>&6
+
+if test $ac_cv_prog_gcc = yes; then
+ GCC=yes
+else
+ GCC=
+fi
+
+ac_test_CFLAGS="${CFLAGS+set}"
+ac_save_CFLAGS="$CFLAGS"
+CFLAGS=
+echo $ac_n "checking whether ${CC-cc} accepts -g""... $ac_c" 1>&6
+echo "configure:890: checking whether ${CC-cc} accepts -g" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_cc_g'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ echo 'void f(){}' > conftest.c
+if test -z "`${CC-cc} -g -c conftest.c 2>&1`"; then
+ ac_cv_prog_cc_g=yes
+else
+ ac_cv_prog_cc_g=no
+fi
+rm -f conftest*
+
+fi
+
+echo "$ac_t""$ac_cv_prog_cc_g" 1>&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 $ac_n "checking how to run the C preprocessor""... $ac_c" 1>&6
+echo "configure:922: checking how to run the C preprocessor" >&5
+# On Suns, sometimes $CPP names a directory.
+if test -n "$CPP" && test -d "$CPP"; then
+ CPP=
+fi
+if test -z "$CPP"; then
+if eval "test \"`echo '$''{'ac_cv_prog_CPP'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ # This must be in double quotes, not single quotes, because CPP may get
+ # substituted into the Makefile and "${CC-cc}" will confuse make.
+ CPP="${CC-cc} -E"
+ # On the NeXT, cc -E runs the code through the compiler's parser,
+ # not just through cpp.
+ cat > conftest.$ac_ext <<EOF
+#line 937 "configure"
+#include "confdefs.h"
+#include <assert.h>
+Syntax Error
+EOF
+ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+{ (eval echo configure:943: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+if test -z "$ac_err"; then
+ :
+else
+ echo "$ac_err" >&5
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ CPP="${CC-cc} -E -traditional-cpp"
+ cat > conftest.$ac_ext <<EOF
+#line 954 "configure"
+#include "confdefs.h"
+#include <assert.h>
+Syntax Error
+EOF
+ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+{ (eval echo configure:960: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+if test -z "$ac_err"; then
+ :
+else
+ echo "$ac_err" >&5
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ CPP="${CC-cc} -nologo -E"
+ cat > conftest.$ac_ext <<EOF
+#line 971 "configure"
+#include "confdefs.h"
+#include <assert.h>
+Syntax Error
+EOF
+ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+{ (eval echo configure:977: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+if test -z "$ac_err"; then
+ :
+else
+ echo "$ac_err" >&5
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ CPP=/lib/cpp
+fi
+rm -f conftest*
+fi
+rm -f conftest*
+fi
+rm -f conftest*
+ ac_cv_prog_CPP="$CPP"
+fi
+ CPP="$ac_cv_prog_CPP"
+else
+ ac_cv_prog_CPP="$CPP"
+fi
+echo "$ac_t""$CPP" 1>&6
+
+ac_safe=`echo "minix/config.h" | sed 'y%./+-%__p_%'`
+echo $ac_n "checking for minix/config.h""... $ac_c" 1>&6
+echo "configure:1003: checking for minix/config.h" >&5
+if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.$ac_ext <<EOF
+#line 1008 "configure"
+#include "confdefs.h"
+#include <minix/config.h>
+EOF
+ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+{ (eval echo configure:1013: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+if test -z "$ac_err"; then
+ rm -rf conftest*
+ eval "ac_cv_header_$ac_safe=yes"
+else
+ echo "$ac_err" >&5
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ eval "ac_cv_header_$ac_safe=no"
+fi
+rm -f conftest*
+fi
+if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
+ echo "$ac_t""yes" 1>&6
+ MINIX=yes
+else
+ echo "$ac_t""no" 1>&6
+MINIX=
+fi
+
+if test "$MINIX" = yes; then
+ cat >> confdefs.h <<\EOF
+#define _POSIX_SOURCE 1
+EOF
+
+ cat >> confdefs.h <<\EOF
+#define _POSIX_1_SOURCE 2
+EOF
+
+ cat >> confdefs.h <<\EOF
+#define _MINIX 1
+EOF
+
+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_prog_gcc = yes; then
+ echo $ac_n "checking whether ${CC-cc} needs -traditional""... $ac_c" 1>&6
+echo "configure:1056: checking whether ${CC-cc} needs -traditional" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_gcc_traditional'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ ac_pattern="Autoconf.*'x'"
+ cat > conftest.$ac_ext <<EOF
+#line 1062 "configure"
+#include "confdefs.h"
+#include <sgtty.h>
+Autoconf TIOCGETP
+EOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ egrep "$ac_pattern" >/dev/null 2>&1; then
+ rm -rf conftest*
+ ac_cv_prog_gcc_traditional=yes
+else
+ rm -rf conftest*
+ ac_cv_prog_gcc_traditional=no
+fi
+rm -f conftest*
+
+
+ if test $ac_cv_prog_gcc_traditional = no; then
+ cat > conftest.$ac_ext <<EOF
+#line 1080 "configure"
+#include "confdefs.h"
+#include <termio.h>
+Autoconf TCGETA
+EOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ egrep "$ac_pattern" >/dev/null 2>&1; then
+ rm -rf conftest*
+ ac_cv_prog_gcc_traditional=yes
+fi
+rm -f conftest*
+
+ fi
+fi
+
+echo "$ac_t""$ac_cv_prog_gcc_traditional" 1>&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
+# 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"
+# ./install, which can be erroneously created by make from ./install.sh.
+echo $ac_n "checking for a BSD compatible install""... $ac_c" 1>&6
+echo "configure:1113: checking for a BSD compatible install" >&5
+if test -z "$INSTALL"; then
+if eval "test \"`echo '$''{'ac_cv_path_install'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ IFS="${IFS= }"; ac_save_IFS="$IFS"; IFS=":"
+ for ac_dir in $PATH; do
+ # Account for people who put trailing slashes in PATH elements.
+ case "$ac_dir/" in
+ /|./|.//|/etc/*|/usr/sbin/*|/usr/etc/*|/sbin/*|/usr/afsws/bin/*|/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
+ if test -f $ac_dir/$ac_prog; then
+ if test $ac_prog = install &&
+ grep dspmsg $ac_dir/$ac_prog >/dev/null 2>&1; then
+ # AIX install. It has an incompatible calling convention.
+ :
+ else
+ ac_cv_path_install="$ac_dir/$ac_prog -c"
+ break 2
+ fi
+ fi
+ done
+ ;;
+ esac
+ done
+ IFS="$ac_save_IFS"
+
+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 "$ac_t""$INSTALL" 1>&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_PROGRAM}'
+
+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 $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:1168: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_AR'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ if test -n "$AR"; then
+ ac_cv_prog_AR="$AR" # Let the user override the test.
+else
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
+ ac_dummy="$PATH"
+ for ac_dir in $ac_dummy; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$ac_word; then
+ ac_cv_prog_AR="ar"
+ break
+ fi
+ done
+ IFS="$ac_save_ifs"
+fi
+fi
+AR="$ac_cv_prog_AR"
+if test -n "$AR"; then
+ echo "$ac_t""$AR" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+test -n "$ARFLAGS" || ARFLAGS="cr"
+# Extract the first word of "ranlib", so it can be a program name with args.
+set dummy ranlib; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:1198: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ if test -n "$RANLIB"; then
+ ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test.
+else
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
+ ac_dummy="$PATH"
+ for ac_dir in $ac_dummy; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$ac_word; then
+ ac_cv_prog_RANLIB="ranlib"
+ break
+ fi
+ done
+ IFS="$ac_save_ifs"
+ test -z "$ac_cv_prog_RANLIB" && ac_cv_prog_RANLIB=":"
+fi
+fi
+RANLIB="$ac_cv_prog_RANLIB"
+if test -n "$RANLIB"; then
+ echo "$ac_t""$RANLIB" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+
+MAKE_SHELL=/bin/sh
+
+
+echo $ac_n "checking return type of signal handlers""... $ac_c" 1>&6
+echo "configure:1230: checking return type of signal handlers" >&5
+if eval "test \"`echo '$''{'ac_cv_type_signal'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.$ac_ext <<EOF
+#line 1235 "configure"
+#include "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; }
+EOF
+if { (eval echo configure:1252: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+ rm -rf conftest*
+ ac_cv_type_signal=void
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ ac_cv_type_signal=int
+fi
+rm -f conftest*
+fi
+
+echo "$ac_t""$ac_cv_type_signal" 1>&6
+cat >> confdefs.h <<EOF
+#define RETSIGTYPE $ac_cv_type_signal
+EOF
+
+
+
+echo $ac_n "checking whether stat file-mode macros are broken""... $ac_c" 1>&6
+echo "configure:1272: checking whether stat file-mode macros are broken" >&5
+if eval "test \"`echo '$''{'ac_cv_header_stat_broken'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.$ac_ext <<EOF
+#line 1277 "configure"
+#include "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
+
+EOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ egrep "You lose" >/dev/null 2>&1; then
+ rm -rf conftest*
+ ac_cv_header_stat_broken=yes
+else
+ rm -rf conftest*
+ ac_cv_header_stat_broken=no
+fi
+rm -f conftest*
+
+fi
+
+echo "$ac_t""$ac_cv_header_stat_broken" 1>&6
+if test $ac_cv_header_stat_broken = yes; then
+ cat >> confdefs.h <<\EOF
+#define STAT_MACROS_BROKEN 1
+EOF
+
+fi
+
+ac_header_dirent=no
+for ac_hdr in dirent.h sys/ndir.h sys/dir.h ndir.h
+do
+ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
+echo $ac_n "checking for $ac_hdr that defines DIR""... $ac_c" 1>&6
+echo "configure:1332: checking for $ac_hdr that defines DIR" >&5
+if eval "test \"`echo '$''{'ac_cv_header_dirent_$ac_safe'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.$ac_ext <<EOF
+#line 1337 "configure"
+#include "confdefs.h"
+#include <sys/types.h>
+#include <$ac_hdr>
+int main() {
+DIR *dirp = 0;
+; return 0; }
+EOF
+if { (eval echo configure:1345: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+ rm -rf conftest*
+ eval "ac_cv_header_dirent_$ac_safe=yes"
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ eval "ac_cv_header_dirent_$ac_safe=no"
+fi
+rm -f conftest*
+fi
+if eval "test \"`echo '$ac_cv_header_dirent_'$ac_safe`\" = yes"; then
+ echo "$ac_t""yes" 1>&6
+ ac_tr_hdr=HAVE_`echo $ac_hdr | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'`
+ cat >> confdefs.h <<EOF
+#define $ac_tr_hdr 1
+EOF
+ ac_header_dirent=$ac_hdr; break
+else
+ echo "$ac_t""no" 1>&6
+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 $ac_n "checking for opendir in -ldir""... $ac_c" 1>&6
+echo "configure:1370: checking for opendir in -ldir" >&5
+ac_lib_var=`echo dir'_'opendir | sed 'y%./+-%__p_%'`
+if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ ac_save_LIBS="$LIBS"
+LIBS="-ldir $LIBS"
+cat > conftest.$ac_ext <<EOF
+#line 1378 "configure"
+#include "confdefs.h"
+/* Override any gcc2 internal prototype to avoid an error. */
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char opendir();
+
+int main() {
+opendir()
+; return 0; }
+EOF
+if { (eval echo configure:1389: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+ rm -rf conftest*
+ eval "ac_cv_lib_$ac_lib_var=yes"
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ eval "ac_cv_lib_$ac_lib_var=no"
+fi
+rm -f conftest*
+LIBS="$ac_save_LIBS"
+
+fi
+if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
+ echo "$ac_t""yes" 1>&6
+ LIBS="$LIBS -ldir"
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+else
+echo $ac_n "checking for opendir in -lx""... $ac_c" 1>&6
+echo "configure:1411: checking for opendir in -lx" >&5
+ac_lib_var=`echo x'_'opendir | sed 'y%./+-%__p_%'`
+if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ ac_save_LIBS="$LIBS"
+LIBS="-lx $LIBS"
+cat > conftest.$ac_ext <<EOF
+#line 1419 "configure"
+#include "confdefs.h"
+/* Override any gcc2 internal prototype to avoid an error. */
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char opendir();
+
+int main() {
+opendir()
+; return 0; }
+EOF
+if { (eval echo configure:1430: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+ rm -rf conftest*
+ eval "ac_cv_lib_$ac_lib_var=yes"
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ eval "ac_cv_lib_$ac_lib_var=no"
+fi
+rm -f conftest*
+LIBS="$ac_save_LIBS"
+
+fi
+if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
+ echo "$ac_t""yes" 1>&6
+ LIBS="$LIBS -lx"
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+fi
+
+
+for ac_func in lstat memmove putenv select setenv setlocale \
+ strcasecmp tcgetattr
+do
+echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
+echo "configure:1457: checking for $ac_func" >&5
+if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.$ac_ext <<EOF
+#line 1462 "configure"
+#include "confdefs.h"
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char $ac_func(); below. */
+#include <assert.h>
+/* Override any gcc2 internal prototype to avoid an error. */
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char $ac_func();
+
+int main() {
+
+/* The GNU C library defines this for functions which it implements
+ to always fail with ENOSYS. Some functions are actually named
+ something starting with __ and the normal name is an alias. */
+#if defined (__stub_$ac_func) || defined (__stub___$ac_func)
+choke me
+#else
+$ac_func();
+#endif
+
+; return 0; }
+EOF
+if { (eval echo configure:1485: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+ rm -rf conftest*
+ eval "ac_cv_func_$ac_func=yes"
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ eval "ac_cv_func_$ac_func=no"
+fi
+rm -f conftest*
+fi
+
+if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then
+ echo "$ac_t""yes" 1>&6
+ ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'`
+ cat >> confdefs.h <<EOF
+#define $ac_tr_func 1
+EOF
+
+else
+ echo "$ac_t""no" 1>&6
+fi
+done
+
+
+echo $ac_n "checking for working strcoll""... $ac_c" 1>&6
+echo "configure:1511: checking for working strcoll" >&5
+if eval "test \"`echo '$''{'ac_cv_func_strcoll_works'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ if test "$cross_compiling" = yes; then
+ ac_cv_func_strcoll_works=no
+else
+ cat > conftest.$ac_ext <<EOF
+#line 1519 "configure"
+#include "confdefs.h"
+#include <string.h>
+main ()
+{
+ exit (strcoll ("abc", "def") >= 0 ||
+ strcoll ("ABC", "DEF") >= 0 ||
+ strcoll ("123", "456") >= 0);
+}
+EOF
+if { (eval echo configure:1529: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+then
+ ac_cv_func_strcoll_works=yes
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -fr conftest*
+ ac_cv_func_strcoll_works=no
+fi
+rm -fr conftest*
+fi
+
+fi
+
+echo "$ac_t""$ac_cv_func_strcoll_works" 1>&6
+if test $ac_cv_func_strcoll_works = yes; then
+ cat >> confdefs.h <<\EOF
+#define HAVE_STRCOLL 1
+EOF
+
+fi
+
+
+for ac_hdr in unistd.h stdlib.h varargs.h stdarg.h string.h \
+ sys/ptem.h sys/pte.h sys/stream.h sys/select.h \
+ termcap.h termios.h termio.h sys/file.h locale.h
+do
+ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
+echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
+echo "configure:1558: checking for $ac_hdr" >&5
+if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.$ac_ext <<EOF
+#line 1563 "configure"
+#include "confdefs.h"
+#include <$ac_hdr>
+EOF
+ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+{ (eval echo configure:1568: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+if test -z "$ac_err"; then
+ rm -rf conftest*
+ eval "ac_cv_header_$ac_safe=yes"
+else
+ echo "$ac_err" >&5
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ eval "ac_cv_header_$ac_safe=no"
+fi
+rm -f conftest*
+fi
+if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
+ echo "$ac_t""yes" 1>&6
+ ac_tr_hdr=HAVE_`echo $ac_hdr | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'`
+ cat >> confdefs.h <<EOF
+#define $ac_tr_hdr 1
+EOF
+
+else
+ echo "$ac_t""no" 1>&6
+fi
+done
+
+
+
+echo $ac_n "checking for type of signal functions""... $ac_c" 1>&6
+echo "configure:1597: checking for type of signal functions" >&5
+if eval "test \"`echo '$''{'bash_cv_signal_vintage'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+
+ cat > conftest.$ac_ext <<EOF
+#line 1603 "configure"
+#include "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; }
+EOF
+if { (eval echo configure:1616: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+ rm -rf conftest*
+ bash_cv_signal_vintage=posix
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+
+ cat > conftest.$ac_ext <<EOF
+#line 1625 "configure"
+#include "confdefs.h"
+#include <signal.h>
+int main() {
+
+ int mask = sigmask(SIGINT);
+ sigsetmask(mask); sigblock(mask); sigpause(mask);
+
+; return 0; }
+EOF
+if { (eval echo configure:1635: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+ rm -rf conftest*
+ bash_cv_signal_vintage=4.2bsd
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+
+ cat > conftest.$ac_ext <<EOF
+#line 1644 "configure"
+#include "confdefs.h"
+
+ #include <signal.h>
+ RETSIGTYPE foo() { }
+int main() {
+
+ int mask = sigmask(SIGINT);
+ sigset(SIGINT, foo); sigrelse(SIGINT);
+ sighold(SIGINT); sigpause(SIGINT);
+
+; return 0; }
+EOF
+if { (eval echo configure:1657: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+ rm -rf conftest*
+ bash_cv_signal_vintage=svr3
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ bash_cv_signal_vintage=v7
+
+fi
+rm -f conftest*
+
+fi
+rm -f conftest*
+
+fi
+rm -f conftest*
+
+fi
+
+echo "$ac_t""$bash_cv_signal_vintage" 1>&6
+if test "$bash_cv_signal_vintage" = posix; then
+cat >> confdefs.h <<\EOF
+#define HAVE_POSIX_SIGNALS 1
+EOF
+
+elif test "$bash_cv_signal_vintage" = "4.2bsd"; then
+cat >> confdefs.h <<\EOF
+#define HAVE_BSD_SIGNALS 1
+EOF
+
+elif test "$bash_cv_signal_vintage" = svr3; then
+cat >> confdefs.h <<\EOF
+#define HAVE_USG_SIGHOLD 1
+EOF
+
+fi
+
+
+
+echo $ac_n "checking if signal handlers must be reinstalled when invoked""... $ac_c" 1>&6
+echo "configure:1698: checking if signal handlers must be reinstalled when invoked" >&5
+if eval "test \"`echo '$''{'bash_cv_must_reinstall_sighandlers'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ if test "$cross_compiling" = yes; then
+ echo "configure: warning: cannot check signal handling if cross compiling -- defaulting to no" 1>&2
+ bash_cv_must_reinstall_sighandlers=no
+
+else
+ cat > conftest.$ac_ext <<EOF
+#line 1708 "configure"
+#include "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);
+}
+
+EOF
+if { (eval echo configure:1755: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+then
+ bash_cv_must_reinstall_sighandlers=no
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -fr conftest*
+ bash_cv_must_reinstall_sighandlers=yes
+fi
+rm -fr conftest*
+fi
+
+fi
+
+echo "$ac_t""$bash_cv_must_reinstall_sighandlers" 1>&6
+if test $bash_cv_must_reinstall_sighandlers = yes; then
+cat >> confdefs.h <<\EOF
+#define MUST_REINSTALL_SIGHANDLERS 1
+EOF
+
+fi
+
+
+
+echo $ac_n "checking for presence of POSIX-style sigsetjmp/siglongjmp""... $ac_c" 1>&6
+echo "configure:1780: checking for presence of POSIX-style sigsetjmp/siglongjmp" >&5
+if eval "test \"`echo '$''{'bash_cv_func_sigsetjmp'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ if test "$cross_compiling" = yes; then
+ echo "configure: warning: cannot check for sigsetjmp/siglongjmp if cross-compiling -- defaulting to missing" 1>&2
+ bash_cv_func_sigsetjmp=missing
+
+else
+ cat > conftest.$ac_ext <<EOF
+#line 1790 "configure"
+#include "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
+}
+EOF
+if { (eval echo configure:1831: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+then
+ bash_cv_func_sigsetjmp=present
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -fr conftest*
+ bash_cv_func_sigsetjmp=missing
+fi
+rm -fr conftest*
+fi
+
+fi
+
+echo "$ac_t""$bash_cv_func_sigsetjmp" 1>&6
+if test $bash_cv_func_sigsetjmp = present; then
+cat >> confdefs.h <<\EOF
+#define HAVE_POSIX_SIGSETJMP 1
+EOF
+
+fi
+
+echo $ac_n "checking for lstat""... $ac_c" 1>&6
+echo "configure:1854: checking for lstat" >&5
+if eval "test \"`echo '$''{'bash_cv_func_lstat'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.$ac_ext <<EOF
+#line 1859 "configure"
+#include "confdefs.h"
+
+#include <sys/types.h>
+#include <sys/stat.h>
+
+int main() {
+ lstat(".",(struct stat *)0);
+; return 0; }
+EOF
+if { (eval echo configure:1869: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+ rm -rf conftest*
+ bash_cv_func_lstat=yes
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ bash_cv_func_lstat=no
+fi
+rm -f conftest*
+fi
+
+echo "$ac_t""$bash_cv_func_lstat" 1>&6
+if test $bash_cv_func_lstat = yes; then
+ cat >> confdefs.h <<\EOF
+#define HAVE_LSTAT 1
+EOF
+
+fi
+
+echo $ac_n "checking whether programs are able to redeclare getpw functions""... $ac_c" 1>&6
+echo "configure:1890: checking whether programs are able to redeclare getpw functions" >&5
+if eval "test \"`echo '$''{'bash_cv_can_redecl_getpw'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.$ac_ext <<EOF
+#line 1895 "configure"
+#include "confdefs.h"
+#include <sys/types.h>
+#include <pwd.h>
+extern struct passwd *getpwent();
+extern struct passwd *getpwuid();
+extern struct passwd *getpwnam();
+int main() {
+struct passwd *z; z = getpwent(); z = getpwuid(0); z = getpwnam("root");
+; return 0; }
+EOF
+if { (eval echo configure:1906: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+ rm -rf conftest*
+ bash_cv_can_redecl_getpw=yes
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ bash_cv_can_redecl_getpw=no
+fi
+rm -f conftest*
+fi
+
+echo "$ac_t""$bash_cv_can_redecl_getpw" 1>&6
+if test $bash_cv_can_redecl_getpw = no; then
+cat >> confdefs.h <<\EOF
+#define HAVE_GETPW_DECLS 1
+EOF
+
+fi
+
+
+echo $ac_n "checking whether or not strcoll and strcmp differ""... $ac_c" 1>&6
+echo "configure:1928: checking whether or not strcoll and strcmp differ" >&5
+if eval "test \"`echo '$''{'bash_cv_func_strcoll_broken'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ if test "$cross_compiling" = yes; then
+ echo "configure: warning: cannot check strcoll if cross compiling -- defaulting to no" 1>&2
+ bash_cv_func_strcoll_broken=no
+
+else
+ cat > conftest.$ac_ext <<EOF
+#line 1938 "configure"
+#include "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);
+}
+
+EOF
+if { (eval echo configure:1977: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+then
+ bash_cv_func_strcoll_broken=yes
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -fr conftest*
+ bash_cv_func_strcoll_broken=no
+fi
+rm -fr conftest*
+fi
+
+fi
+
+echo "$ac_t""$bash_cv_func_strcoll_broken" 1>&6
+if test $bash_cv_func_strcoll_broken = yes; then
+cat >> confdefs.h <<\EOF
+#define STRCOLL_BROKEN 1
+EOF
+
+fi
+
+
+echo $ac_n "checking whether signal handlers are of type void""... $ac_c" 1>&6
+echo "configure:2001: checking whether signal handlers are of type void" >&5
+if eval "test \"`echo '$''{'bash_cv_void_sighandler'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.$ac_ext <<EOF
+#line 2006 "configure"
+#include "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; }
+EOF
+if { (eval echo configure:2021: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+ rm -rf conftest*
+ bash_cv_void_sighandler=yes
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ bash_cv_void_sighandler=no
+fi
+rm -f conftest*
+fi
+echo "$ac_t""$bash_cv_void_sighandler" 1>&6
+if test $bash_cv_void_sighandler = yes; then
+cat >> confdefs.h <<\EOF
+#define VOID_SIGHANDLER 1
+EOF
+
+fi
+
+echo $ac_n "checking for TIOCGWINSZ in sys/ioctl.h""... $ac_c" 1>&6
+echo "configure:2041: checking for TIOCGWINSZ in sys/ioctl.h" >&5
+if eval "test \"`echo '$''{'bash_cv_tiocgwinsz_in_ioctl'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.$ac_ext <<EOF
+#line 2046 "configure"
+#include "confdefs.h"
+#include <sys/types.h>
+#include <sys/ioctl.h>
+int main() {
+int x = TIOCGWINSZ;
+; return 0; }
+EOF
+if { (eval echo configure:2054: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+ rm -rf conftest*
+ bash_cv_tiocgwinsz_in_ioctl=yes
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ bash_cv_tiocgwinsz_in_ioctl=no
+fi
+rm -f conftest*
+fi
+
+echo "$ac_t""$bash_cv_tiocgwinsz_in_ioctl" 1>&6
+if test $bash_cv_tiocgwinsz_in_ioctl = yes; then
+cat >> confdefs.h <<\EOF
+#define GWINSZ_IN_SYS_IOCTL 1
+EOF
+
+fi
+
+echo $ac_n "checking for TIOCSTAT in sys/ioctl.h""... $ac_c" 1>&6
+echo "configure:2075: checking for TIOCSTAT in sys/ioctl.h" >&5
+if eval "test \"`echo '$''{'bash_cv_tiocstat_in_ioctl'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.$ac_ext <<EOF
+#line 2080 "configure"
+#include "confdefs.h"
+#include <sys/types.h>
+#include <sys/ioctl.h>
+int main() {
+int x = TIOCSTAT;
+; return 0; }
+EOF
+if { (eval echo configure:2088: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+ rm -rf conftest*
+ bash_cv_tiocstat_in_ioctl=yes
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ bash_cv_tiocstat_in_ioctl=no
+fi
+rm -f conftest*
+fi
+
+echo "$ac_t""$bash_cv_tiocstat_in_ioctl" 1>&6
+if test $bash_cv_tiocstat_in_ioctl = yes; then
+cat >> confdefs.h <<\EOF
+#define TIOCSTAT_IN_SYS_IOCTL 1
+EOF
+
+fi
+
+echo $ac_n "checking for FIONREAD in sys/ioctl.h""... $ac_c" 1>&6
+echo "configure:2109: checking for FIONREAD in sys/ioctl.h" >&5
+if eval "test \"`echo '$''{'bash_cv_fionread_in_ioctl'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.$ac_ext <<EOF
+#line 2114 "configure"
+#include "confdefs.h"
+#include <sys/types.h>
+#include <sys/ioctl.h>
+int main() {
+int x = FIONREAD;
+; return 0; }
+EOF
+if { (eval echo configure:2122: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+ rm -rf conftest*
+ bash_cv_fionread_in_ioctl=yes
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ bash_cv_fionread_in_ioctl=no
+fi
+rm -f conftest*
+fi
+
+echo "$ac_t""$bash_cv_fionread_in_ioctl" 1>&6
+if test $bash_cv_fionread_in_ioctl = yes; then
+cat >> confdefs.h <<\EOF
+#define FIONREAD_IN_SYS_IOCTL 1
+EOF
+
+fi
+
+echo $ac_n "checking for speed_t in sys/types.h""... $ac_c" 1>&6
+echo "configure:2143: checking for speed_t in sys/types.h" >&5
+if eval "test \"`echo '$''{'bash_cv_speed_t_in_sys_types'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.$ac_ext <<EOF
+#line 2148 "configure"
+#include "confdefs.h"
+#include <sys/types.h>
+int main() {
+speed_t x;
+; return 0; }
+EOF
+if { (eval echo configure:2155: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+ rm -rf conftest*
+ bash_cv_speed_t_in_sys_types=yes
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ bash_cv_speed_t_in_sys_types=no
+fi
+rm -f conftest*
+fi
+
+echo "$ac_t""$bash_cv_speed_t_in_sys_types" 1>&6
+if test $bash_cv_speed_t_in_sys_types = yes; then
+cat >> confdefs.h <<\EOF
+#define SPEED_T_IN_SYS_TYPES 1
+EOF
+
+fi
+
+echo $ac_n "checking for struct winsize in sys/ioctl.h and termios.h""... $ac_c" 1>&6
+echo "configure:2176: checking for struct winsize in sys/ioctl.h and termios.h" >&5
+if eval "test \"`echo '$''{'bash_cv_struct_winsize_header'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.$ac_ext <<EOF
+#line 2181 "configure"
+#include "confdefs.h"
+#include <sys/types.h>
+#include <sys/ioctl.h>
+int main() {
+struct winsize x;
+; return 0; }
+EOF
+if { (eval echo configure:2189: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+ rm -rf conftest*
+ bash_cv_struct_winsize_header=ioctl_h
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ cat > conftest.$ac_ext <<EOF
+#line 2197 "configure"
+#include "confdefs.h"
+#include <sys/types.h>
+#include <termios.h>
+int main() {
+struct winsize x;
+; return 0; }
+EOF
+if { (eval echo configure:2205: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+ rm -rf conftest*
+ bash_cv_struct_winsize_header=termios_h
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ bash_cv_struct_winsize_header=other
+fi
+rm -f conftest*
+
+fi
+rm -f conftest*
+fi
+
+if test $bash_cv_struct_winsize_header = ioctl_h; then
+ echo "$ac_t""sys/ioctl.h" 1>&6
+ cat >> confdefs.h <<\EOF
+#define STRUCT_WINSIZE_IN_SYS_IOCTL 1
+EOF
+
+elif test $bash_cv_struct_winsize_header = termios_h; then
+ echo "$ac_t""termios.h" 1>&6
+ cat >> confdefs.h <<\EOF
+#define STRUCT_WINSIZE_IN_TERMIOS 1
+EOF
+
+else
+ echo "$ac_t""not found" 1>&6
+fi
+
+
+echo $ac_n "checking if struct dirent has a d_ino member""... $ac_c" 1>&6
+echo "configure:2238: checking if struct dirent has a d_ino member" >&5
+if eval "test \"`echo '$''{'bash_cv_dirent_has_dino'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.$ac_ext <<EOF
+#line 2243 "configure"
+#include "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; }
+EOF
+if { (eval echo configure:2272: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+ rm -rf conftest*
+ bash_cv_dirent_has_dino=yes
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ bash_cv_dirent_has_dino=no
+fi
+rm -f conftest*
+fi
+
+echo "$ac_t""$bash_cv_dirent_has_dino" 1>&6
+if test $bash_cv_dirent_has_dino = yes; then
+cat >> confdefs.h <<\EOF
+#define STRUCT_DIRENT_HAS_D_INO 1
+EOF
+
+fi
+
+
+echo $ac_n "checking if struct dirent has a d_fileno member""... $ac_c" 1>&6
+echo "configure:2294: checking if struct dirent has a d_fileno member" >&5
+if eval "test \"`echo '$''{'bash_cv_dirent_has_d_fileno'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.$ac_ext <<EOF
+#line 2299 "configure"
+#include "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; }
+EOF
+if { (eval echo configure:2328: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+ rm -rf conftest*
+ bash_cv_dirent_has_d_fileno=yes
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ bash_cv_dirent_has_d_fileno=no
+fi
+rm -f conftest*
+fi
+
+echo "$ac_t""$bash_cv_dirent_has_d_fileno" 1>&6
+if test $bash_cv_dirent_has_d_fileno = yes; then
+cat >> confdefs.h <<\EOF
+#define STRUCT_DIRENT_HAS_D_FILENO 1
+EOF
+
+fi
+
+
+case "$host_os" in
+aix*) prefer_curses=yes ;;
+esac
+
+if test "X$bash_cv_termcap_lib" = "X"; then
+_bash_needmsg=yes
+else
+echo $ac_n "checking which library has the termcap functions""... $ac_c" 1>&6
+echo "configure:2357: checking which library has the termcap functions" >&5
+_bash_needmsg=
+fi
+if eval "test \"`echo '$''{'bash_cv_termcap_lib'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ echo $ac_n "checking for tgetent in -ltermcap""... $ac_c" 1>&6
+echo "configure:2364: checking for tgetent in -ltermcap" >&5
+ac_lib_var=`echo termcap'_'tgetent | sed 'y%./+-%__p_%'`
+if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ ac_save_LIBS="$LIBS"
+LIBS="-ltermcap $LIBS"
+cat > conftest.$ac_ext <<EOF
+#line 2372 "configure"
+#include "confdefs.h"
+/* Override any gcc2 internal prototype to avoid an error. */
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char tgetent();
+
+int main() {
+tgetent()
+; return 0; }
+EOF
+if { (eval echo configure:2383: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+ rm -rf conftest*
+ eval "ac_cv_lib_$ac_lib_var=yes"
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ eval "ac_cv_lib_$ac_lib_var=no"
+fi
+rm -f conftest*
+LIBS="$ac_save_LIBS"
+
+fi
+if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
+ echo "$ac_t""yes" 1>&6
+ bash_cv_termcap_lib=libtermcap
+else
+ echo "$ac_t""no" 1>&6
+echo $ac_n "checking for tgetent in -lcurses""... $ac_c" 1>&6
+echo "configure:2402: checking for tgetent in -lcurses" >&5
+ac_lib_var=`echo curses'_'tgetent | sed 'y%./+-%__p_%'`
+if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ ac_save_LIBS="$LIBS"
+LIBS="-lcurses $LIBS"
+cat > conftest.$ac_ext <<EOF
+#line 2410 "configure"
+#include "confdefs.h"
+/* Override any gcc2 internal prototype to avoid an error. */
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char tgetent();
+
+int main() {
+tgetent()
+; return 0; }
+EOF
+if { (eval echo configure:2421: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+ rm -rf conftest*
+ eval "ac_cv_lib_$ac_lib_var=yes"
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ eval "ac_cv_lib_$ac_lib_var=no"
+fi
+rm -f conftest*
+LIBS="$ac_save_LIBS"
+
+fi
+if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
+ echo "$ac_t""yes" 1>&6
+ bash_cv_termcap_lib=libcurses
+else
+ echo "$ac_t""no" 1>&6
+echo $ac_n "checking for tgetent in -lncurses""... $ac_c" 1>&6
+echo "configure:2440: checking for tgetent in -lncurses" >&5
+ac_lib_var=`echo ncurses'_'tgetent | sed 'y%./+-%__p_%'`
+if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ ac_save_LIBS="$LIBS"
+LIBS="-lncurses $LIBS"
+cat > conftest.$ac_ext <<EOF
+#line 2448 "configure"
+#include "confdefs.h"
+/* Override any gcc2 internal prototype to avoid an error. */
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char tgetent();
+
+int main() {
+tgetent()
+; return 0; }
+EOF
+if { (eval echo configure:2459: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+ rm -rf conftest*
+ eval "ac_cv_lib_$ac_lib_var=yes"
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ eval "ac_cv_lib_$ac_lib_var=no"
+fi
+rm -f conftest*
+LIBS="$ac_save_LIBS"
+
+fi
+if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
+ echo "$ac_t""yes" 1>&6
+ bash_cv_termcap_lib=libncurses
+else
+ echo "$ac_t""no" 1>&6
+bash_cv_termcap_lib=gnutermcap
+fi
+
+fi
+
+fi
+
+fi
+
+if test "X$_bash_needmsg" = "Xyes"; then
+echo $ac_n "checking which library has the termcap functions""... $ac_c" 1>&6
+echo "configure:2488: checking which library has the termcap functions" >&5
+fi
+echo "$ac_t""using $bash_cv_termcap_lib" 1>&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 = libncurses; then
+TERMCAP_LIB=-lncurses
+TERMCAP_DEP=
+else
+TERMCAP_LIB=-lcurses
+TERMCAP_DEP=
+fi
+
+if test "$TERMCAP_LIB" = "./lib/termcap/libtermcap.a"; then
+ TERMCAP_LIB=-ltermcap #default
+fi
+
+case "$host_cpu" in
+*cray*) LOCAL_CFLAGS=-DCRAY ;;
+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 $ac_n "checking configuration for building shared libraries""... $ac_c" 1>&6
+echo "configure:2525: checking configuration for building shared libraries" >&5
+ eval `${CONFIG_SHELL-/bin/sh} ${srcdir}/support/shobj-conf -C "${CC}" -c ${host_cpu} -o ${host_os} -v ${host_vendor}`
+
+
+
+
+
+
+
+
+
+
+
+
+ echo "$ac_t""$SHLIB_STATUS" 1>&6
+
+ # 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
+
+case "$host_os" in
+msdosdjgpp*) BUILD_DIR=`pwd.exe` ;; # to prevent //d/path/file
+*) BUILD_DIR=`pwd` ;;
+esac
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+trap '' 1 2 15
+cat > confcache <<\EOF
+# 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. It is not useful on other systems.
+# If it contains results you don't want to keep, you may remove or edit it.
+#
+# By default, configure uses ./config.cache as the cache file,
+# creating it if it does not exist already. You can give configure
+# the --cache-file=FILE option to use a different cache file; that is
+# what configure does when it calls configure scripts in
+# subdirectories, so they share the cache.
+# Giving --cache-file=/dev/null disables caching, for debugging configure.
+# config.status only pays attention to the cache file if you give it the
+# --recheck option to rerun configure.
+#
+EOF
+# 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 \
+ -e "s/'/'\\\\''/g" \
+ -e "s/^\\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\\)=\\(.*\\)/\\1=\${\\1='\\2'}/p"
+ ;;
+ *)
+ # `set' quotes correctly as required by POSIX, so do not add quotes.
+ sed -n -e 's/^\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\)=\(.*\)/\1=${\1=\2}/p'
+ ;;
+ esac >> confcache
+if cmp -s $cache_file confcache; then
+ :
+else
+ if test -w $cache_file; then
+ echo "updating cache $cache_file"
+ cat confcache > $cache_file
+ else
+ echo "not updating unwritable cache $cache_file"
+ fi
+fi
+rm -f confcache
+
+trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15
+
+test "x$prefix" = xNONE && prefix=$ac_default_prefix
+# Let make expand exec_prefix.
+test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
+
+# Any assignment to VPATH causes Sun make to only execute
+# the first set of double-colon rules, so remove it if not needed.
+# If there is a colon in the path, we need to keep it.
+if test "x$srcdir" = x.; then
+ ac_vpsub='/^[ ]*VPATH[ ]*=[^:]*$/d'
+fi
+
+trap 'rm -f $CONFIG_STATUS conftest*; exit 1' 1 2 15
+
+DEFS=-DHAVE_CONFIG_H
+
+# Without the "./", some shells look in PATH for config.status.
+: ${CONFIG_STATUS=./config.status}
+
+echo creating $CONFIG_STATUS
+rm -f $CONFIG_STATUS
+cat > $CONFIG_STATUS <<EOF
+#! /bin/sh
+# Generated automatically by configure.
+# Run this file to recreate the current configuration.
+# This directory was configured as follows,
+# on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
+#
+# $0 $ac_configure_args
+#
+# Compiler output produced by configure, useful for debugging
+# configure, is in ./config.log if it exists.
+
+ac_cs_usage="Usage: $CONFIG_STATUS [--recheck] [--version] [--help]"
+for ac_option
+do
+ case "\$ac_option" in
+ -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
+ echo "running \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion"
+ exec \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion ;;
+ -version | --version | --versio | --versi | --vers | --ver | --ve | --v)
+ echo "$CONFIG_STATUS generated by autoconf version 2.13"
+ exit 0 ;;
+ -help | --help | --hel | --he | --h)
+ echo "\$ac_cs_usage"; exit 0 ;;
+ *) echo "\$ac_cs_usage"; exit 1 ;;
+ esac
+done
+
+ac_given_srcdir=$srcdir
+ac_given_INSTALL="$INSTALL"
+
+trap 'rm -fr `echo "Makefile doc/Makefile examples/Makefile shlib/Makefile config.h" | sed "s/:[^ ]*//g"` conftest*; exit 1' 1 2 15
+EOF
+cat >> $CONFIG_STATUS <<EOF
+
+# Protect against being on the right side of a sed subst in config.status.
+sed 's/%@/@@/; s/@%/@@/; s/%g\$/@g/; /@g\$/s/[\\\\&%]/\\\\&/g;
+ s/@@/%@/; s/@@/@%/; s/@g\$/%g/' > conftest.subs <<\\CEOF
+$ac_vpsub
+$extrasub
+s%@SHELL@%$SHELL%g
+s%@CFLAGS@%$CFLAGS%g
+s%@CPPFLAGS@%$CPPFLAGS%g
+s%@CXXFLAGS@%$CXXFLAGS%g
+s%@FFLAGS@%$FFLAGS%g
+s%@DEFS@%$DEFS%g
+s%@LDFLAGS@%$LDFLAGS%g
+s%@LIBS@%$LIBS%g
+s%@exec_prefix@%$exec_prefix%g
+s%@prefix@%$prefix%g
+s%@program_transform_name@%$program_transform_name%g
+s%@bindir@%$bindir%g
+s%@sbindir@%$sbindir%g
+s%@libexecdir@%$libexecdir%g
+s%@datadir@%$datadir%g
+s%@sysconfdir@%$sysconfdir%g
+s%@sharedstatedir@%$sharedstatedir%g
+s%@localstatedir@%$localstatedir%g
+s%@libdir@%$libdir%g
+s%@includedir@%$includedir%g
+s%@oldincludedir@%$oldincludedir%g
+s%@infodir@%$infodir%g
+s%@mandir@%$mandir%g
+s%@host@%$host%g
+s%@host_alias@%$host_alias%g
+s%@host_cpu@%$host_cpu%g
+s%@host_vendor@%$host_vendor%g
+s%@host_os@%$host_os%g
+s%@CC@%$CC%g
+s%@CPP@%$CPP%g
+s%@INSTALL_PROGRAM@%$INSTALL_PROGRAM%g
+s%@INSTALL_SCRIPT@%$INSTALL_SCRIPT%g
+s%@INSTALL_DATA@%$INSTALL_DATA%g
+s%@AR@%$AR%g
+s%@RANLIB@%$RANLIB%g
+s%@MAKE_SHELL@%$MAKE_SHELL%g
+s%@SHOBJ_CC@%$SHOBJ_CC%g
+s%@SHOBJ_CFLAGS@%$SHOBJ_CFLAGS%g
+s%@SHOBJ_LD@%$SHOBJ_LD%g
+s%@SHOBJ_LDFLAGS@%$SHOBJ_LDFLAGS%g
+s%@SHOBJ_XLDFLAGS@%$SHOBJ_XLDFLAGS%g
+s%@SHOBJ_LIBS@%$SHOBJ_LIBS%g
+s%@SHOBJ_STATUS@%$SHOBJ_STATUS%g
+s%@SHLIB_STATUS@%$SHLIB_STATUS%g
+s%@SHLIB_XLDFLAGS@%$SHLIB_XLDFLAGS%g
+s%@SHLIB_LIBSUFF@%$SHLIB_LIBSUFF%g
+s%@SHLIB_LIBVERSION@%$SHLIB_LIBVERSION%g
+s%@SHLIB_LIBS@%$SHLIB_LIBS%g
+s%@SHLIB_MAJOR@%$SHLIB_MAJOR%g
+s%@SHLIB_MINOR@%$SHLIB_MINOR%g
+s%@BUILD_DIR@%$BUILD_DIR%g
+s%@LOCAL_CFLAGS@%$LOCAL_CFLAGS%g
+s%@LOCAL_LDFLAGS@%$LOCAL_LDFLAGS%g
+s%@LOCAL_DEFS@%$LOCAL_DEFS%g
+s%@ARFLAGS@%$ARFLAGS%g
+s%@LIBVERSION@%$LIBVERSION%g
+s%@TERMCAP_LIB@%$TERMCAP_LIB%g
+
+CEOF
+EOF
+
+cat >> $CONFIG_STATUS <<\EOF
+
+# 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_cmds=90 # Maximum number of lines to put in a sed script.
+ac_file=1 # Number of current file.
+ac_beg=1 # First line for current file.
+ac_end=$ac_max_sed_cmds # 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" conftest.subs > conftest.s$ac_file
+ else
+ sed "${ac_end}q" conftest.subs > conftest.s$ac_file
+ fi
+ if test ! -s conftest.s$ac_file; then
+ ac_more_lines=false
+ rm -f conftest.s$ac_file
+ else
+ if test -z "$ac_sed_cmds"; then
+ ac_sed_cmds="sed -f conftest.s$ac_file"
+ else
+ ac_sed_cmds="$ac_sed_cmds | sed -f conftest.s$ac_file"
+ fi
+ ac_file=`expr $ac_file + 1`
+ ac_beg=$ac_end
+ ac_end=`expr $ac_end + $ac_max_sed_cmds`
+ fi
+done
+if test -z "$ac_sed_cmds"; then
+ ac_sed_cmds=cat
+fi
+EOF
+
+cat >> $CONFIG_STATUS <<EOF
+
+CONFIG_FILES=\${CONFIG_FILES-"Makefile doc/Makefile examples/Makefile shlib/Makefile"}
+EOF
+cat >> $CONFIG_STATUS <<\EOF
+for ac_file in .. $CONFIG_FILES; do if test "x$ac_file" != x..; then
+ # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in".
+ case "$ac_file" in
+ *:*) ac_file_in=`echo "$ac_file"|sed 's%[^:]*:%%'`
+ ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;;
+ *) ac_file_in="${ac_file}.in" ;;
+ esac
+
+ # Adjust a relative srcdir, top_srcdir, and INSTALL for subdirectories.
+
+ # Remove last slash and all that follows it. Not all systems have dirname.
+ ac_dir=`echo $ac_file|sed 's%/[^/][^/]*$%%'`
+ if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then
+ # The file is in a subdirectory.
+ test ! -d "$ac_dir" && mkdir "$ac_dir"
+ ac_dir_suffix="/`echo $ac_dir|sed 's%^\./%%'`"
+ # A "../" for each directory in $ac_dir_suffix.
+ ac_dots=`echo $ac_dir_suffix|sed 's%/[^/]*%../%g'`
+ else
+ ac_dir_suffix= ac_dots=
+ fi
+
+ case "$ac_given_srcdir" in
+ .) srcdir=.
+ if test -z "$ac_dots"; then top_srcdir=.
+ else top_srcdir=`echo $ac_dots|sed 's%/$%%'`; fi ;;
+ /*) srcdir="$ac_given_srcdir$ac_dir_suffix"; top_srcdir="$ac_given_srcdir" ;;
+ *) # Relative path.
+ srcdir="$ac_dots$ac_given_srcdir$ac_dir_suffix"
+ top_srcdir="$ac_dots$ac_given_srcdir" ;;
+ esac
+
+ case "$ac_given_INSTALL" in
+ [/$]*) INSTALL="$ac_given_INSTALL" ;;
+ *) INSTALL="$ac_dots$ac_given_INSTALL" ;;
+ esac
+
+ echo creating "$ac_file"
+ rm -f "$ac_file"
+ configure_input="Generated automatically from `echo $ac_file_in|sed 's%.*/%%'` by configure."
+ case "$ac_file" in
+ *Makefile*) ac_comsub="1i\\
+# $configure_input" ;;
+ *) ac_comsub= ;;
+ esac
+
+ ac_file_inputs=`echo $ac_file_in|sed -e "s%^%$ac_given_srcdir/%" -e "s%:% $ac_given_srcdir/%g"`
+ sed -e "$ac_comsub
+s%@configure_input@%$configure_input%g
+s%@srcdir@%$srcdir%g
+s%@top_srcdir@%$top_srcdir%g
+s%@INSTALL@%$INSTALL%g
+" $ac_file_inputs | (eval "$ac_sed_cmds") > $ac_file
+fi; done
+rm -f conftest.s*
+
+# 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='\3'
+ac_dD='%g'
+# ac_u turns "#undef NAME" with trailing blanks into "#define NAME VALUE".
+ac_uA='s%^\([ ]*\)#\([ ]*\)undef\([ ][ ]*\)'
+ac_uB='\([ ]\)%\1#\2define\3'
+ac_uC=' '
+ac_uD='\4%g'
+# ac_e turns "#undef NAME" without trailing blanks into "#define NAME VALUE".
+ac_eA='s%^\([ ]*\)#\([ ]*\)undef\([ ][ ]*\)'
+ac_eB='$%\1#\2define\3'
+ac_eC=' '
+ac_eD='%g'
+
+if test "${CONFIG_HEADERS+set}" != set; then
+EOF
+cat >> $CONFIG_STATUS <<EOF
+ CONFIG_HEADERS="config.h"
+EOF
+cat >> $CONFIG_STATUS <<\EOF
+fi
+for ac_file in .. $CONFIG_HEADERS; do if test "x$ac_file" != x..; then
+ # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in".
+ case "$ac_file" in
+ *:*) ac_file_in=`echo "$ac_file"|sed 's%[^:]*:%%'`
+ ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;;
+ *) ac_file_in="${ac_file}.in" ;;
+ esac
+
+ echo creating $ac_file
+
+ rm -f conftest.frag conftest.in conftest.out
+ ac_file_inputs=`echo $ac_file_in|sed -e "s%^%$ac_given_srcdir/%" -e "s%:% $ac_given_srcdir/%g"`
+ cat $ac_file_inputs > conftest.in
+
+EOF
+
+# Transform confdefs.h into a sed script conftest.vals that substitutes
+# the proper values into config.h.in to produce config.h. 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.vals
+cat > conftest.hdr <<\EOF
+s/[\\&%]/\\&/g
+s%[\\$`]%\\&%g
+s%#define \([A-Za-z_][A-Za-z0-9_]*\) *\(.*\)%${ac_dA}\1${ac_dB}\1${ac_dC}\2${ac_dD}%gp
+s%ac_d%ac_u%gp
+s%ac_u%ac_e%gp
+EOF
+sed -n -f conftest.hdr confdefs.h > conftest.vals
+rm -f conftest.hdr
+
+# 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.vals <<\EOF
+s%^[ ]*#[ ]*undef[ ][ ]*[a-zA-Z_][a-zA-Z_0-9]*%/* & */%
+EOF
+
+# Break up conftest.vals because some shells have a limit on
+# the size of here documents, and old seds have small limits too.
+
+rm -f conftest.tail
+while :
+do
+ ac_lines=`grep -c . conftest.vals`
+ # grep -c gives empty output for an empty file on some AIX systems.
+ if test -z "$ac_lines" || test "$ac_lines" -eq 0; then break; fi
+ # Write a limited-size here document to conftest.frag.
+ echo ' cat > conftest.frag <<CEOF' >> $CONFIG_STATUS
+ sed ${ac_max_here_lines}q conftest.vals >> $CONFIG_STATUS
+ echo 'CEOF
+ sed -f conftest.frag conftest.in > conftest.out
+ rm -f conftest.in
+ mv conftest.out conftest.in
+' >> $CONFIG_STATUS
+ sed 1,${ac_max_here_lines}d conftest.vals > conftest.tail
+ rm -f conftest.vals
+ mv conftest.tail conftest.vals
+done
+rm -f conftest.vals
+
+cat >> $CONFIG_STATUS <<\EOF
+ rm -f conftest.frag conftest.h
+ echo "/* $ac_file. Generated automatically by configure. */" > conftest.h
+ cat conftest.in >> conftest.h
+ rm -f conftest.in
+ if cmp -s $ac_file conftest.h 2>/dev/null; then
+ echo "$ac_file is unchanged"
+ rm -f conftest.h
+ else
+ # Remove last slash and all that follows it. Not all systems have dirname.
+ ac_dir=`echo $ac_file|sed 's%/[^/][^/]*$%%'`
+ if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then
+ # The file is in a subdirectory.
+ test ! -d "$ac_dir" && mkdir "$ac_dir"
+ fi
+ rm -f $ac_file
+ mv conftest.h $ac_file
+ fi
+fi; done
+
+EOF
+cat >> $CONFIG_STATUS <<EOF
+
+EOF
+cat >> $CONFIG_STATUS <<\EOF
+
+# Makefile uses this timestamp file to record whether config.h is up to date.
+echo > stamp-h
+
+exit 0
+EOF
+chmod +x $CONFIG_STATUS
+rm -fr confdefs* $ac_clean_files
+test "$no_create" = yes || ${CONFIG_SHELL-/bin/sh} $CONFIG_STATUS || exit 1
+
diff --git a/gnu/lib/libreadline/configure.in b/gnu/lib/libreadline/configure.in
new file mode 100644
index 00000000000..f977feca361
--- /dev/null
+++ b/gnu/lib/libreadline/configure.in
@@ -0,0 +1,156 @@
+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.
+AC_REVISION([for Readline 4.1, version 2.22, from autoconf version] AC_ACVERSION)
+LIBVERSION=4.1
+
+AC_INIT(readline.h)
+AC_CONFIG_HEADER(config.h)
+
+dnl make sure we are using a recent autoconf version
+AC_PREREQ(2.10)
+
+AC_CONFIG_AUX_DIR(./support)
+
+AC_CANONICAL_HOST
+
+dnl configure defaults
+opt_curses=no
+opt_shared=no
+
+dnl arguments to configure
+AC_ARG_WITH(curses, --with-curses use the curses library instead of the termcap library,opt_curses=$withval)
+
+if test "$opt_curses" = "yes"; then
+ prefer_curses=yes
+fi
+
+# We want these before the checks, so the checks can modify their values.
+test -z "$CFLAGS" && CFLAGS=-g auto_cflags=1
+
+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_RETSIGTYPE
+
+AC_HEADER_STAT
+AC_HEADER_DIRENT
+
+AC_CHECK_FUNCS(lstat memmove putenv select setenv setlocale \
+ strcasecmp tcgetattr)
+
+AC_FUNC_STRCOLL
+
+AC_CHECK_HEADERS(unistd.h stdlib.h varargs.h stdarg.h string.h \
+ sys/ptem.h sys/pte.h sys/stream.h sys/select.h \
+ termcap.h termios.h termio.h sys/file.h locale.h)
+
+BASH_SIGNAL_CHECK
+BASH_REINSTALL_SIGHANDLERS
+
+BASH_FUNC_POSIX_SETJMP
+BASH_FUNC_LSTAT
+BASH_CHECK_GETPW_FUNCS
+BASH_FUNC_STRCOLL
+
+BASH_TYPE_SIGHANDLER
+BASH_HAVE_TIOCGWINSZ
+BASH_HAVE_TIOCSTAT
+BASH_HAVE_FIONREAD
+BASH_MISC_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
+ TERMCAP_LIB=-ltermcap #default
+fi
+
+case "$host_cpu" in
+*cray*) LOCAL_CFLAGS=-DCRAY ;;
+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 `${CONFIG_SHELL-/bin/sh} ${srcdir}/support/shobj-conf -C "${CC}" -c ${host_cpu} -o ${host_os} -v ${host_vendor}`
+ 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_LIBSUFF)
+ AC_SUBST(SHLIB_LIBVERSION)
+ AC_SUBST(SHLIB_LIBS)
+ AC_MSG_RESULT($SHLIB_STATUS)
+
+ # 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
+
+case "$host_os" in
+msdosdjgpp*) BUILD_DIR=`pwd.exe` ;; # to prevent //d/path/file
+*) BUILD_DIR=`pwd` ;;
+esac
+
+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/gnu/lib/libreadline/display.c b/gnu/lib/libreadline/display.c
new file mode 100644
index 00000000000..4487004a027
--- /dev/null
+++ b/gnu/lib/libreadline/display.c
@@ -0,0 +1,1693 @@
+/* display.c -- readline redisplay facility. */
+
+/* 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
+
+#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"
+
+/* 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__ */
+
+#if defined (HACK_TERMCAP_MOTION)
+extern char *term_forward_char;
+#endif
+
+static void update_line __P((char *, char *, int, int, int, int));
+static void space_to_eol __P((int));
+static void delete_chars __P((int));
+static void insert_some_chars __P((char *, int));
+static void cr __P((void));
+
+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. */
+#define CR_FASTER(new, cur) (((new) + 1) < ((cur) - (new)))
+
+/* **************************************************************** */
+/* */
+/* 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. */
+VFunction *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;
+
+/* 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. */
+int _rl_last_c_pos = 0;
+int _rl_last_v_pos = 0;
+
+/* 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;
+
+static char *local_prompt, *local_prompt_prefix;
+static int visible_length, prefix_length;
+
+/* The number of invisible characters in the line currently being
+ displayed on the screen. */
+static int visible_wrap_offset;
+
+/* 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 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;
+
+/* 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. */
+
+/* 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)
+ char *pmt;
+ int *lp, *lip;
+{
+ char *r, *ret, *p;
+ int l, rl, last, ignoring;
+
+ /* Short-circuit if we can. */
+ if (strchr (pmt, RL_PROMPT_START_IGNORE) == 0)
+ {
+ r = savestring (pmt);
+ if (lp)
+ *lp = strlen (r);
+ return r;
+ }
+
+ l = strlen (pmt);
+ r = ret = xmalloc (l + 1);
+
+ for (rl = ignoring = last = 0, p = pmt; p && *p; p++)
+ {
+ /* This code strips the invisible character string markers
+ RL_PROMPT_START_IGNORE and RL_PROMPT_END_IGNORE */
+ if (*p == RL_PROMPT_START_IGNORE)
+ {
+ ignoring++;
+ continue;
+ }
+ else if (ignoring && *p == RL_PROMPT_END_IGNORE)
+ {
+ ignoring = 0;
+ last = r - ret - 1;
+ continue;
+ }
+ else
+ {
+ *r++ = *p;
+ if (!ignoring)
+ rl++;
+ }
+ }
+
+ *r = '\0';
+ if (lp)
+ *lp = rl;
+ if (lip)
+ *lip = last;
+ 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);
+ 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
+ * visible_length = number of visible characters in local_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. */
+ if (local_prompt)
+ free (local_prompt);
+ if (local_prompt_prefix)
+ free (local_prompt_prefix);
+ local_prompt = local_prompt_prefix = (char *)0;
+ last_invisible = visible_length = 0;
+
+ if (prompt == 0 || *prompt == 0)
+ return (0);
+
+ p = strrchr (prompt, '\n');
+ if (!p)
+ {
+ /* The prompt is only one line. */
+ local_prompt = expand_prompt (prompt, &visible_length, &last_invisible);
+ local_prompt_prefix = (char *)0;
+ return (visible_length);
+ }
+ else
+ {
+ /* The prompt spans multiple lines. */
+ t = ++p;
+ local_prompt = expand_prompt (p, &visible_length, &last_invisible);
+ 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, &prefix_length, (int *)NULL);
+ *t = c;
+ return (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 = xmalloc (line_size);
+ invisible_line = 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 = xrealloc (visible_line, line_size);
+ invisible_line = 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));
+ 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 c_pos, inv_botlin, lb_botlin, lb_linenum;
+ int newlines, lpos, temp;
+ char *prompt_this_line;
+
+ if (!readline_echoing_p)
+ return;
+
+ if (!rl_display_prompt)
+ rl_display_prompt = "";
+
+ if (invisible_line == 0)
+ {
+ init_line_structures (0);
+ rl_on_new_line ();
+ }
+
+ /* Draw the line into the buffer. */
+ c_pos = -1;
+
+ line = invisible_line;
+ out = inv_botlin = 0;
+
+ /* Mark the line as modified or not. We only do this for history
+ lines. */
+ if (_rl_mark_modified_lines && current_history () && rl_undo_list)
+ {
+ line[out++] = '*';
+ line[out] = '\0';
+ }
+
+ /* 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)
+ {
+ int local_len = local_prompt ? strlen (local_prompt) : 0;
+ if (local_prompt_prefix && forced_display)
+ _rl_output_some_chars (local_prompt_prefix, strlen (local_prompt_prefix));
+
+ if (local_len > 0)
+ {
+ temp = local_len + out + 2;
+ if (temp >= line_size)
+ {
+ line_size = (temp + 1024) - (temp % 1024);
+ visible_line = xrealloc (visible_line, line_size);
+ line = invisible_line = xrealloc (invisible_line, line_size);
+ }
+ strncpy (line + out, local_prompt, local_len);
+ out += local_len;
+ }
+ line[out] = '\0';
+ wrap_offset = local_len - 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 ();
+ }
+ }
+
+ pmtlen = strlen (prompt_this_line);
+ temp = pmtlen + out + 2;
+ if (temp >= line_size)
+ {
+ line_size = (temp + 1024) - (temp % 1024);
+ visible_line = xrealloc (visible_line, line_size);
+ line = invisible_line = xrealloc (invisible_line, line_size);
+ }
+ strncpy (line + out, prompt_this_line, pmtlen);
+ out += pmtlen;
+ line[out] = '\0';
+ wrap_offset = 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)
+
+#define CHECK_LPOS() \
+ do { \
+ lpos++; \
+ if (lpos >= 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)
+
+ /* inv_lbreaks[i] is where line i starts in the buffer. */
+ inv_lbreaks[newlines = 0] = 0;
+ lpos = out - wrap_offset;
+
+ /* XXX - what if lpos is already >= screenwidth before we start drawing the
+ contents of the command line? */
+ while (lpos >= screenwidth)
+ {
+ /* XXX - possible fix from Darin Johnson <darin@acuson.com> for prompt
+ string with invisible characters that is longer than the screen
+ width. XXX - this doesn't work right if invisible characters have
+ to be put on the second screen line -- it adds too much (the number
+ of invisible chars after the screenwidth). */
+ temp = ((newlines + 1) * screenwidth) + ((newlines == 0) ? wrap_offset : 0);
+
+ inv_lbreaks[++newlines] = temp;
+ lpos -= screenwidth;
+ }
+
+ lb_linenum = 0;
+ for (in = 0; in < rl_end; in++)
+ {
+ c = (unsigned char)rl_line_buffer[in];
+
+ if (out + 8 >= line_size) /* XXX - 8 for \t */
+ {
+ line_size *= 2;
+ visible_line = xrealloc (visible_line, line_size);
+ invisible_line = xrealloc (invisible_line, line_size);
+ line = invisible_line;
+ }
+
+ if (in == rl_point)
+ {
+ c_pos = out;
+ lb_linenum = newlines;
+ }
+
+ if (META_CHAR (c))
+ {
+ if (_rl_output_meta_chars == 0)
+ {
+ sprintf (line + out, "\\%o", c);
+
+ if (lpos + 4 >= screenwidth)
+ {
+ temp = 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 temp, newout;
+
+#if 0
+ newout = (out | (int)7) + 1;
+#else
+ newout = out + 8 - lpos % 8;
+#endif
+ temp = newout - out;
+ if (lpos + temp >= screenwidth)
+ {
+ register int temp2;
+ temp2 = 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 && term_up && *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
+ {
+ line[out++] = c;
+ CHECK_LPOS();
+ }
+ }
+ line[out] = '\0';
+ if (c_pos < 0)
+ {
+ c_pos = out;
+ lb_linenum = newlines;
+ }
+
+ inv_botlin = lb_botlin = newlines;
+ CHECK_INV_LBREAKS ();
+ inv_lbreaks[newlines+1] = out;
+ cursor_linenum = lb_linenum;
+
+ /* C_POS == position in buffer where 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 && term_up && *term_up)
+ {
+ int nleft, pos, changed_screen_line;
+
+ 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 >= screenchars)
+ out = 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++)
+ {
+ update_line (VIS_LINE(linenum), INV_LINE(linenum), linenum,
+ VIS_LLEN(linenum), INV_LLEN(linenum), inv_botlin);
+
+ /* 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))
+ {
+ nleft = 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) : 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 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 (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 = visible_length + wrap_offset;
+ if (cursor_linenum == 0 && wrap_offset > 0 && _rl_last_c_pos > 0 &&
+ _rl_last_c_pos <= last_invisible && local_prompt)
+ {
+#if defined (__MSDOS__)
+ putc ('\r', rl_outstream);
+#else
+ if (term_cr)
+ tputs (term_cr, 1, _rl_output_character_function);
+#endif
+ _rl_output_some_chars (local_prompt, nleft);
+ _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 cursor position. */
+ nleft = c_pos - pos;
+
+ /* 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)
+ {
+ _rl_backspace (_rl_last_c_pos - nleft);
+ _rl_last_c_pos = nleft;
+ }
+
+ 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 = c_pos - wrap_offset;
+ nleft = 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 = c_pos - (last_lmargin ? last_lmargin : wrap_offset);
+ t = 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 > screenwidth - 2)
+ {
+ lmargin = c_pos - (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 < 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 = ((c_pos - 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) + 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,
+ screenwidth + visible_wrap_offset,
+ 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 = screenwidth - t;
+ _rl_clear_to_eol (nleft);
+ }
+ visible_first_line_len = out - lmargin - M_OFFSET (lmargin, wrap_offset);
+ if (visible_first_line_len > screenwidth)
+ visible_first_line_len = screenwidth;
+
+ _rl_move_cursor_relative (c_pos - lmargin, &invisible_line[lmargin]);
+ last_lmargin = lmargin;
+ }
+ }
+ fflush (rl_outstream);
+
+ /* Swap visible and non-visible lines. */
+ {
+ char *temp = visible_line;
+ int *itemp = vis_lbreaks, ntemp = vis_lbsize;
+
+ visible_line = invisible_line;
+ invisible_line = temp;
+
+ 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;
+
+ /* 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. */
+ temp = _rl_last_c_pos - W_OFFSET(_rl_last_v_pos, visible_wrap_offset);
+ if (temp == screenwidth && _rl_term_autowrap && !_rl_horizontal_scroll_mode
+ && _rl_last_v_pos == current_line - 1)
+ {
+ if (new[0])
+ putc (new[0], rl_outstream);
+ else
+ putc (' ', rl_outstream);
+ _rl_last_c_pos = 1; /* XXX */
+ _rl_last_v_pos++;
+ if (old[0] && new[0])
+ old[0] = new[0];
+ }
+
+ /* Find first difference. */
+ 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 */
+ ols = oe - 1; /* find last same */
+ nls = ne - 1;
+ while ((ols > ofd) && (nls > nfd) && (*ols == *nls))
+ {
+ if (*ols != ' ')
+ wsatend = 0;
+ ols--;
+ nls--;
+ }
+
+ if (wsatend)
+ {
+ ols = oe;
+ nls = ne;
+ }
+ else if (*ols != *nls)
+ {
+ if (*ols) /* don't step past the NUL */
+ ols++;
+ if (*nls)
+ 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 (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 ? strlen (local_prompt) : 0;
+ od = ofd - old; /* index of first difference in visible line */
+ if (current_line == 0 && !_rl_horizontal_scroll_mode &&
+ term_cr && lendiff > visible_length && _rl_last_c_pos > 0 &&
+ od > lendiff && _rl_last_c_pos < last_invisible)
+ {
+#if defined (__MSDOS__)
+ putc ('\r', rl_outstream);
+#else
+ tputs (term_cr, 1, _rl_output_character_function);
+#endif
+ _rl_output_some_chars (local_prompt, lendiff);
+ _rl_last_c_pos = lendiff;
+ }
+
+ _rl_move_cursor_relative (od, old);
+
+ /* if (len (new) > len (old)) */
+ lendiff = (nls - nfd) - (ols - ofd);
+
+ /* 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)
+ lendiff += visible_wrap_offset - current_invis_chars;
+
+ /* Insert (diff (len (old), len (new)) ch. */
+ temp = ne - nfd;
+ if (lendiff > 0)
+ {
+ /* 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 (terminal_can_insert && ((2 * temp) >= lendiff || term_IC) && (!_rl_term_autowrap || !gl))
+ {
+ /* If lendiff > visible_length and _rl_last_c_pos == 0 and
+ _rl_horizontal_scroll_mode == 1, inserting the characters with
+ term_IC or 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 <= visible_length || !current_invis_chars))
+ {
+ insert_some_chars (nfd, lendiff);
+ _rl_last_c_pos += lendiff;
+ }
+ else if (*ols == 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 += 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 += 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);
+ _rl_last_c_pos += temp - lendiff;
+ }
+ }
+ else
+ {
+ /* cannot insert chars, write to EOL */
+ _rl_output_some_chars (nfd, temp);
+ _rl_last_c_pos += temp;
+ }
+ }
+ else /* Delete characters from line. */
+ {
+ /* If possible and inexpensive to use terminal deletion, then do so. */
+ if (term_dc && (2 * temp) >= -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)
+ lendiff = 0;
+
+ if (lendiff)
+ delete_chars (-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 += temp;
+ }
+ }
+ /* Otherwise, print over the existing material. */
+ else
+ {
+ if (temp > 0)
+ {
+ _rl_output_some_chars (nfd, temp);
+ _rl_last_c_pos += temp;
+ }
+ lendiff = (oe - old) - (ne - new);
+ if (lendiff)
+ {
+ if (_rl_term_autowrap && current_line < inv_botlin)
+ space_to_eol (lendiff);
+ else
+ _rl_clear_to_eol (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. */
+int
+rl_on_new_line_with_prompt ()
+{
+ int prompt_size, i, l, real_screenwidth, newlines;
+ char *prompt_last_line;
+
+ /* 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. */
+ strcpy (visible_line, rl_prompt);
+ strcpy (invisible_line, rl_prompt);
+
+ /* 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);
+ _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 = 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;
+
+ return 0;
+}
+
+/* Actually update the display, period. */
+int
+rl_forced_update_display ()
+{
+ if (visible_line)
+ {
+ register char *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.
+ 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;
+ char *data;
+{
+ register int i;
+
+ /* If we don't have to do anything, then return. */
+ if (_rl_last_c_pos == new) return;
+
+ /* It may be faster to output a CR, and then move forwards instead
+ of moving backwards. */
+ /* i == current physical cursor position. */
+ i = _rl_last_c_pos - W_OFFSET(_rl_last_v_pos, visible_wrap_offset);
+ if (new == 0 || CR_FASTER (new, _rl_last_c_pos) ||
+ (_rl_term_autowrap && i == screenwidth))
+ {
+#if defined (__MSDOS__)
+ putc ('\r', rl_outstream);
+#else
+ tputs (term_cr, 1, _rl_output_character_function);
+#endif /* !__MSDOS__ */
+ _rl_last_c_pos = 0;
+ }
+
+ if (_rl_last_c_pos < new)
+ {
+ /* 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. */
+#if defined (HACK_TERMCAP_MOTION)
+ if (term_forward_char)
+ for (i = _rl_last_c_pos; i < new; i++)
+ tputs (term_forward_char, 1, _rl_output_character_function);
+ else
+ for (i = _rl_last_c_pos; i < new; i++)
+ putc (data[i], rl_outstream);
+#else
+ for (i = _rl_last_c_pos; i < new; i++)
+ putc (data[i], rl_outstream);
+#endif /* HACK_TERMCAP_MOTION */
+ }
+ else if (_rl_last_c_pos > new)
+ _rl_backspace (_rl_last_c_pos - new);
+ _rl_last_c_pos = new;
+}
+
+/* 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 > 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 (term_cr, 1, _rl_output_character_function);
+#endif
+ _rl_last_c_pos = 0;
+ }
+ else
+ { /* delta < 0 */
+ if (term_up && *term_up)
+ for (i = 0; i < -delta; i++)
+ tputs (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. */
+
+#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
+
+ vsprintf (msg_buf, format, args);
+ va_end (args);
+
+ rl_display_prompt = msg_buf;
+ (*rl_redisplay_function) ();
+ return 0;
+}
+#else /* !USE_VARARGS */
+int
+rl_message (format, arg1, arg2)
+ char *format;
+{
+ sprintf (msg_buf, format, arg1, arg2);
+ rl_display_prompt = msg_buf;
+ (*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;
+ (*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;
+}
+
+static char *saved_local_prompt;
+static char *saved_local_prefix;
+static int saved_last_invisible;
+static int saved_visible_length;
+
+void
+rl_save_prompt ()
+{
+ saved_local_prompt = local_prompt;
+ saved_local_prefix = local_prompt_prefix;
+ saved_last_invisible = last_invisible;
+ saved_visible_length = visible_length;
+
+ local_prompt = local_prompt_prefix = (char *)0;
+ last_invisible = visible_length = 0;
+}
+
+void
+rl_restore_prompt ()
+{
+ if (local_prompt)
+ free (local_prompt);
+ if (local_prompt_prefix)
+ free (local_prompt_prefix);
+
+ local_prompt = saved_local_prompt;
+ local_prompt_prefix = saved_local_prefix;
+ last_invisible = saved_last_invisible;
+ visible_length = saved_visible_length;
+}
+
+char *
+_rl_make_prompt_for_search (pchar)
+ int pchar;
+{
+ int len;
+ char *pmt;
+
+ rl_save_prompt ();
+
+ if (saved_local_prompt == 0)
+ {
+ len = (rl_prompt && *rl_prompt) ? strlen (rl_prompt) : 0;
+ pmt = xmalloc (len + 2);
+ if (len)
+ strcpy (pmt, rl_prompt);
+ pmt[len] = pchar;
+ pmt[len+1] = '\0';
+ }
+ else
+ {
+ len = *saved_local_prompt ? strlen (saved_local_prompt) : 0;
+ pmt = xmalloc (len + 2);
+ if (len)
+ strcpy (pmt, saved_local_prompt);
+ pmt[len] = pchar;
+ pmt[len+1] = '\0';
+ local_prompt = savestring (pmt);
+ last_invisible = saved_last_invisible;
+ visible_length = saved_visible_length + 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 (term_clreol)
+ tputs (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 (term_clrpag)
+ tputs (term_clrpag, 1, _rl_output_character_function);
+ else
+ crlf ();
+}
+
+/* Insert COUNT characters from STRING to the output stream. */
+static void
+insert_some_chars (string, count)
+ char *string;
+ int count;
+{
+ /* If IC is defined, then we do not have to "enter" insert mode. */
+ if (term_IC)
+ {
+ char *buffer;
+ buffer = tgoto (term_IC, 0, count);
+ 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 (term_im && *term_im)
+ tputs (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 (term_ic && *term_ic)
+ {
+ for (i = count; i--; )
+ tputs (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 (term_ei && *term_ei)
+ tputs (term_ei, 1, _rl_output_character_function);
+ }
+}
+
+/* Delete COUNT characters from the display line. */
+static void
+delete_chars (count)
+ int count;
+{
+ if (count > screenwidth) /* XXX */
+ return;
+
+ if (term_DC && *term_DC)
+ {
+ char *buffer;
+ buffer = tgoto (term_DC, count, count);
+ tputs (buffer, count, _rl_output_character_function);
+ }
+ else
+ {
+ if (term_dc && *term_dc)
+ while (count--)
+ tputs (term_dc, 1, _rl_output_character_function);
+ }
+}
+
+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) == screenwidth))
+ {
+ char *last_line;
+#if 0
+ last_line = &visible_line[inv_lbreaks[_rl_vis_botlin]];
+#else
+ last_line = &visible_line[vis_lbreaks[_rl_vis_botlin]];
+#endif
+ _rl_move_cursor_relative (screenwidth - 1, last_line);
+ _rl_clear_to_eol (0);
+ putc (last_line[screenwidth - 1], rl_outstream);
+ }
+ _rl_vis_botlin = 0;
+ crlf ();
+ fflush (rl_outstream);
+ rl_display_fixed++;
+}
+
+/* Move to the start of the current line. */
+static void
+cr ()
+{
+ if (term_cr)
+ {
+#if defined (__MSDOS__)
+ putc ('\r', rl_outstream);
+#else
+ tputs (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, *oldl, *oldlprefix;
+ int oldlen, oldlast, oldplen;
+
+ /* Geez, I should make this a struct. */
+ oldp = rl_display_prompt;
+ oldl = local_prompt;
+ oldlprefix = local_prompt_prefix;
+ oldlen = visible_length;
+ oldplen = prefix_length;
+ oldlast = last_invisible;
+
+ rl_display_prompt = t;
+ local_prompt = expand_prompt (t, &visible_length, &last_invisible);
+ local_prompt_prefix = (char *)NULL;
+ rl_forced_update_display ();
+
+ rl_display_prompt = oldp;
+ local_prompt = oldl;
+ local_prompt_prefix = oldlprefix;
+ visible_length = oldlen;
+ prefix_length = oldplen;
+ last_invisible = oldlast;
+}
+
+/* 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 (term_cr)
+ {
+#if defined (__MSDOS__)
+ putc ('\r', rl_outstream);
+#else
+ tputs (term_cr, 1, _rl_output_character_function);
+#endif
+ _rl_last_c_pos = 0;
+#if defined (__MSDOS__)
+ space_to_eol (screenwidth);
+ putc ('\r', rl_outstream);
+#else
+ if (term_clreol)
+ tputs (term_clreol, 1, _rl_output_character_function);
+ else
+ {
+ space_to_eol (screenwidth);
+ tputs (term_cr, 1, _rl_output_character_function);
+ }
+#endif
+ if (_rl_last_v_pos > 0)
+ _rl_move_vert (0);
+ }
+ else
+ 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 - screenwidth - rl_visible_prompt_length;
+ else
+ nleft = _rl_last_c_pos - screenwidth;
+
+ if (nleft > 0)
+ ret = 1 + nleft / screenwidth;
+ else
+ ret = 0;
+
+ return ret;
+}
diff --git a/gnu/lib/libreadline/doc/Makefile.in b/gnu/lib/libreadline/doc/Makefile.in
new file mode 100644
index 00000000000..4a38563e46e
--- /dev/null
+++ b/gnu/lib/libreadline/doc/Makefile.in
@@ -0,0 +1,181 @@
+# This makefile for Readline library documentation is in -*- text -*- mode.
+# Emacs likes it that way.
+
+# Copyright (C) 1996 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with 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)$(man1ext)
+man3ext = 3
+man3dir = $(mandir)/$(manpfx)$(man3ext)
+
+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 = 300 # I don't have any 600-dpi printers
+DVIPS = dvips -D ${PSDPI} $(QUIETPS) -t ${PAPERSIZE} -o $@ # tricky
+
+RLSRC = $(srcdir)/rlman.texinfo $(srcdir)/rluser.texinfo \
+ $(srcdir)/rltech.texinfo $(srcdir)/manvers.texinfo \
+ $(srcdir)/rluserman.texinfo
+HISTSRC = $(srcdir)/hist.texinfo $(srcdir)/hsuser.texinfo \
+ $(srcdir)/hstech.texinfo $(srcdir)/manvers.texinfo
+
+# 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
+HTMLOBJ = readline.html history.html rluserman.html
+TEXTOBJ = readline.0
+
+INTERMEDIATE_OBJ = rlman.dvi hist.dvi rluserman.dvi
+
+CREATED_DOCS = $(DVIOBJ) $(INFOOBJ) $(PSOBJ) $(HTMLOBJ) $(TEXTOBJ)
+
+.SUFFIXES: .0 .3 .ps .txt .dvi
+
+.3.0:
+ $(RM) $@
+ -${NROFF} -man $< > $@
+
+all: info dvi html ps text
+nodvi: info html text
+
+readline.dvi: $(RLSRC)
+ TEXINPUTS=.:$(TEXINPUTDIR):$$TEXINPUTS $(TEXI2DVI) $(srcdir)/rlman.texinfo
+ mv rlman.dvi readline.dvi
+
+readline.info: $(RLSRC)
+ $(MAKEINFO) --no-split -I $(TEXINPUTDIR) -o $@ $(srcdir)/rlman.texinfo
+
+rluserman.dvi: $(RLSRC)
+ TEXINPUTS=.:$(TEXINPUTDIR):$$TEXINPUTS $(TEXI2DVI) $(srcdir)/rluserman.texinfo
+
+rluserman.info: $(RLSRC)
+ $(MAKEINFO) --no-split -I $(TEXINPUTDIR) -o $@ $(srcdir)/rluserman.texinfo
+
+history.dvi: ${HISTSRC}
+ TEXINPUTS=.:$(TEXINPUTDIR):$$TEXINPUTS $(TEXI2DVI) $(srcdir)/hist.texinfo
+ mv hist.dvi history.dvi
+
+history.info: ${HISTSRC}
+ $(MAKEINFO) --no-split -I $(TEXINPUTDIR) -o $@ $(srcdir)/hist.texinfo
+
+readline.ps: readline.dvi
+ $(RM) $@
+ $(DVIPS) readline.dvi
+
+rluserman.ps: rluserman.dvi
+ $(RM) $@
+ $(DVIPS) rluserman.dvi
+
+history.ps: history.dvi
+ $(RM) $@
+ $(DVIPS) history.dvi
+
+readline.html: ${RLSRC}
+ $(TEXI2HTML) -menu -monolithic -I $(TEXINPUTDIR) $(srcdir)/rlman.texinfo
+ 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.texinfo
+
+history.html: ${HISTSRC}
+ $(TEXI2HTML) -menu -monolithic -I $(TEXINPUTDIR) $(srcdir)/hist.texinfo
+ sed -e 's:hist.html:history.html:g' hist.html > history.html
+ $(RM) hist.html
+
+info: $(INFOOBJ)
+dvi: $(DVIOBJ)
+ps: $(PSOBJ)
+html: $(HTMLOBJ)
+text: $(TEXTOBJ)
+
+readline.0: readline.3
+
+clean:
+ $(RM) *.aux *.cp *.fn *.ky *.log *.pg *.toc *.tp *.vr *.cps *.pgs \
+ *.fns *.kys *.tps *.vrs *.bt *.bts *.o core
+
+distclean: clean
+ $(RM) $(CREATED_DOCS)
+ $(RM) $(INTERMEDIATE_OBJ)
+ $(RM) Makefile
+
+mostlyclean: clean
+
+maintainer-clean: clean
+ $(RM) $(CREATED_DOCS)
+ $(RM) $(INTERMEDIATE_OBJ)
+ $(RM) Makefile
+
+installdirs: $(topdir)/support/mkdirs
+ -$(SHELL) $(topdir)/support/mkdirs $(infodir) $(man3dir)
+
+install: installdirs
+ if test -f readline.info; then \
+ ${INSTALL_DATA} readline.info $(infodir)/readline.info; \
+ else \
+ ${INSTALL_DATA} $(srcdir)/readline.info $(infodir)/readline.info; \
+ fi
+ if test -f rluserman.info; then \
+ ${INSTALL_DATA} rluserman.info $(infodir)/rluserman.info; \
+ else \
+ ${INSTALL_DATA} $(srcdir)/rluserman.info $(infodir)/rluserman.info; \
+ fi
+ if test -f history.info; then \
+ ${INSTALL_DATA} history.info $(infodir)/history.info; \
+ else \
+ ${INSTALL_DATA} $(srcdir)/history.info $(infodir)/history.info; \
+ fi
+ -if $(SHELL) -c 'install-info --version' >/dev/null 2>&1; then \
+ install-info --dir-file=$(infodir)/dir $(infodir)/readline.info ; \
+ install-info --dir-file=$(infodir)/dir $(infodir)/history.info ; \
+ else true; fi
+ -${INSTALL_DATA} $(srcdir)/readline.3 $(man3dir)/readline.3
+
+uninstall:
+ $(RM) $(infodir)/readline.info
+ $(RM) $(infodir)/rluserman.info
+ $(RM) $(infodir)/history.info
+ $(RM) $(man3dir)/readline.3
diff --git a/gnu/lib/libreadline/doc/hist.texinfo b/gnu/lib/libreadline/doc/hist.texinfo
new file mode 100644
index 00000000000..8a9c9413bc9
--- /dev/null
+++ b/gnu/lib/libreadline/doc/hist.texinfo
@@ -0,0 +1,110 @@
+\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 manvers.texinfo
+
+@ifinfo
+@dircategory Libraries
+@direntry
+* History: (history). The GNU history library API
+@end direntry
+
+This document describes the GNU History library, a programming tool that
+provides a consistent user interface for recalling lines of previously
+typed input.
+
+Copyright (C) 1988-1999 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 Free Software Foundation.
+@end ifinfo
+
+@titlepage
+@title GNU History Library
+@subtitle Edition @value{EDITION}, for @code{History Library} Version @value{VERSION}.
+@subtitle @value{UPDATE-MONTH}
+@author Brian Fox, Free Software Foundation
+@author Chet Ramey, Case Western Reserve University
+
+@page
+This document describes the GNU History library, a programming tool that
+provides a consistent user interface for recalling lines of previously
+typed input.
+
+Published by the Free Software Foundation @*
+59 Temple Place, Suite 330, @*
+Boston, MA 02111 USA
+
+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 that the entire
+resulting derived work is distributed under the terms of a permission
+notice identical to this one.
+
+Permission is granted to copy and distribute translations of this manual
+into another language, under the above conditions for modified versions,
+except that this permission notice may be stated in a translation approved
+by the Free Software Foundation.
+
+@vskip 0pt plus 1filll
+Copyright @copyright{} 1988-1999 Free Software Foundation, Inc.
+@end titlepage
+
+@ifinfo
+@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.
+* Concept Index:: Index of concepts described in this manual.
+* Function and Variable Index:: Index of externally visible functions
+ and variables.
+@end menu
+@end ifinfo
+
+@syncodeindex fn vr
+
+@include hsuser.texinfo
+@include hstech.texinfo
+
+@node Concept Index
+@appendix Concept Index
+@printindex cp
+
+@node Function and Variable Index
+@appendix Function and Variable Index
+@printindex vr
+
+@contents
+@bye
diff --git a/gnu/lib/libreadline/doc/history.dvi b/gnu/lib/libreadline/doc/history.dvi
new file mode 100644
index 00000000000..a8b30bf92be
--- /dev/null
+++ b/gnu/lib/libreadline/doc/history.dvi
Binary files differ
diff --git a/gnu/lib/libreadline/doc/history.html b/gnu/lib/libreadline/doc/history.html
new file mode 100644
index 00000000000..d380ff4c96c
--- /dev/null
+++ b/gnu/lib/libreadline/doc/history.html
@@ -0,0 +1,1195 @@
+<HTML>
+<HEAD>
+<!-- This HTML file has been created by texi2html 1.52
+ from /usr/homes/chet/src/bash/readline-src/doc/hist.texinfo on 19 January 2000 -->
+
+<TITLE>GNU History Library</TITLE>
+</HEAD>
+<BODY>
+<H1>GNU History Library</H1>
+<H2>Edition 4.1, for <CODE>History Library</CODE> Version 4.1.</H2>
+<H2>January 2000</H2>
+<ADDRESS>Brian Fox, Free Software Foundation</ADDRESS>
+<ADDRESS>Chet Ramey, Case Western Reserve University</ADDRESS>
+<P>
+<P><HR><P>
+<H1>Table of Contents</H1>
+<UL>
+<LI><A NAME="TOC1" HREF="history.html#SEC1">Using History Interactively</A>
+<UL>
+<LI><A NAME="TOC2" HREF="history.html#SEC2">History Expansion</A>
+<UL>
+<LI><A NAME="TOC3" HREF="history.html#SEC3">Event Designators</A>
+<LI><A NAME="TOC4" HREF="history.html#SEC4">Word Designators</A>
+<LI><A NAME="TOC5" HREF="history.html#SEC5">Modifiers</A>
+</UL>
+</UL>
+<LI><A NAME="TOC6" HREF="history.html#SEC6">Programming with GNU History</A>
+<UL>
+<LI><A NAME="TOC7" HREF="history.html#SEC7">Introduction to History</A>
+<LI><A NAME="TOC8" HREF="history.html#SEC8">History Storage</A>
+<LI><A NAME="TOC9" HREF="history.html#SEC9">History Functions</A>
+<UL>
+<LI><A NAME="TOC10" HREF="history.html#SEC10">Initializing History and State Management</A>
+<LI><A NAME="TOC11" HREF="history.html#SEC11">History List Management</A>
+<LI><A NAME="TOC12" HREF="history.html#SEC12">Information About the History List</A>
+<LI><A NAME="TOC13" HREF="history.html#SEC13">Moving Around the History List</A>
+<LI><A NAME="TOC14" HREF="history.html#SEC14">Searching the History List</A>
+<LI><A NAME="TOC15" HREF="history.html#SEC15">Managing the History File</A>
+<LI><A NAME="TOC16" HREF="history.html#SEC16">History Expansion</A>
+</UL>
+<LI><A NAME="TOC17" HREF="history.html#SEC17">History Variables</A>
+<LI><A NAME="TOC18" HREF="history.html#SEC18">History Programming Example</A>
+</UL>
+<LI><A NAME="TOC19" HREF="history.html#SEC19">Concept Index</A>
+<LI><A NAME="TOC20" HREF="history.html#SEC20">Function and Variable Index</A>
+</UL>
+<P><HR><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>
+Published by the Free Software Foundation <BR>
+59 Temple Place, Suite 330, <BR>
+Boston, MA 02111 USA
+
+</P>
+<P>
+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.
+
+</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 Free Software Foundation.
+
+</P>
+<P>
+Copyright (C) 1988-1999 Free Software Foundation, Inc.
+
+</P>
+
+
+
+<H1><A NAME="SEC1" HREF="history.html#TOC1">Using History Interactively</A></H1>
+
+<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">Programming with GNU History</A>.
+
+</P>
+
+<UL>
+<LI><A HREF="history.html#SEC2">History Interaction</A>: What it feels like using History as a user.
+</UL>
+
+
+
+<H2><A NAME="SEC2" HREF="history.html#TOC2">History Expansion</A></H2>
+<P>
+<A NAME="IDX1"></A>
+
+</P>
+<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>
+
+
+<UL>
+<LI><A HREF="history.html#SEC3">Event Designators</A>: How to specify which history line to use.
+<LI><A HREF="history.html#SEC4">Word Designators</A>: Specifying which words are of interest.
+<LI><A HREF="history.html#SEC5">Modifiers</A>: Modifying the results of substitution.
+</UL>
+
+
+
+<H3><A NAME="SEC3" HREF="history.html#TOC3">Event Designators</A></H3>
+<P>
+<A NAME="IDX2"></A>
+
+</P>
+<P>
+An event designator is a reference to a command line entry in the
+history list.
+<A NAME="IDX3"></A>
+
+</P>
+<DL COMPACT>
+
+<DT><CODE>!</CODE>
+<DD>
+Start a history substitution, except when followed by a space, tab,
+the end of the line, <SAMP>`='</SAMP> or <SAMP>`('</SAMP>.
+
+<DT><CODE>!<VAR>n</VAR></CODE>
+<DD>
+Refer to command line <VAR>n</VAR>.
+
+<DT><CODE>!-<VAR>n</VAR></CODE>
+<DD>
+Refer to the command <VAR>n</VAR> lines back.
+
+<DT><CODE>!!</CODE>
+<DD>
+Refer to the previous command. This is a synonym for <SAMP>`!-1'</SAMP>.
+
+<DT><CODE>!<VAR>string</VAR></CODE>
+<DD>
+Refer to the most recent command starting with <VAR>string</VAR>.
+
+<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.
+
+<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>.
+
+<DT><CODE>!#</CODE>
+<DD>
+The entire command line typed so far.
+
+</DL>
+
+
+
+<H3><A NAME="SEC4" HREF="history.html#TOC4">Word Designators</A></H3>
+
+<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>
+<DL COMPACT>
+
+<DT><CODE>!!</CODE>
+<DD>
+designates the preceding command. When you type this, the preceding
+command is repeated in toto.
+
+<DT><CODE>!!:$</CODE>
+<DD>
+designates the last argument of the preceding command. This may be
+shortened to <CODE>!$</CODE>.
+
+<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.
+
+<DT><CODE><VAR>n</VAR></CODE>
+<DD>
+The <VAR>n</VAR>th word.
+
+<DT><CODE>^</CODE>
+<DD>
+The first argument; that is, word 1.
+
+<DT><CODE>$</CODE>
+<DD>
+The last argument.
+
+<DT><CODE>%</CODE>
+<DD>
+The word matched by the most recent <SAMP>`?<VAR>string</VAR>?'</SAMP> search.
+
+<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>.
+
+<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.
+
+<DT><CODE><VAR>x</VAR>*</CODE>
+<DD>
+Abbreviates <SAMP>`<VAR>x</VAR>-$'</SAMP>
+
+<DT><CODE><VAR>x</VAR>-</CODE>
+<DD>
+Abbreviates <SAMP>`<VAR>x</VAR>-$'</SAMP> like <SAMP>`<VAR>x</VAR>*'</SAMP>, but omits the last word.
+
+</DL>
+
+<P>
+If a word designator is supplied without an event specification, the
+previous command is used as the event.
+
+</P>
+
+
+<H3><A NAME="SEC5" HREF="history.html#TOC5">Modifiers</A></H3>
+
+<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>
+<DL COMPACT>
+
+<DT><CODE>h</CODE>
+<DD>
+Remove a trailing pathname component, leaving only the head.
+
+<DT><CODE>t</CODE>
+<DD>
+Remove all leading pathname components, leaving the tail.
+
+<DT><CODE>r</CODE>
+<DD>
+Remove a trailing suffix of the form <SAMP>`.<VAR>suffix</VAR>'</SAMP>, leaving
+the basename.
+
+<DT><CODE>e</CODE>
+<DD>
+Remove all but the trailing suffix.
+
+<DT><CODE>p</CODE>
+<DD>
+Print the new command but do not execute it.
+
+<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.
+
+<DT><CODE>&#38;</CODE>
+<DD>
+Repeat the previous substitution.
+
+<DT><CODE>g</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>.
+
+</DL>
+
+
+
+<H1><A NAME="SEC6" HREF="history.html#TOC6">Programming with GNU History</A></H1>
+
+<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">Using History Interactively</A>.
+
+</P>
+
+<UL>
+<LI><A HREF="history.html#SEC7">Introduction to History</A>: What is the GNU History library for?
+<LI><A HREF="history.html#SEC8">History Storage</A>: How information is stored.
+<LI><A HREF="history.html#SEC9">History Functions</A>: Functions that you can use.
+<LI><A HREF="history.html#SEC17">History Variables</A>: Variables that control behaviour.
+<LI><A HREF="history.html#SEC18">History Programming Example</A>: Example of using the GNU History Library.
+</UL>
+
+
+
+<H2><A NAME="SEC7" HREF="history.html#TOC7">Introduction to History</A></H2>
+
+<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>
+
+
+<H2><A NAME="SEC8" HREF="history.html#TOC8">History Storage</A></H2>
+
+<P>
+The history list is an array of history entries. A history entry is
+declared as follows:
+
+</P>
+
+<PRE>
+typedef struct _hist_entry {
+ char *line;
+ char *data;
+} HIST_ENTRY;
+</PRE>
+
+<P>
+The history list itself might therefore be declared as
+
+</P>
+
+<PRE>
+HIST_ENTRY **the_history_list;
+</PRE>
+
+<P>
+The state of the History library is encapsulated into a single structure:
+
+</P>
+
+<PRE>
+/* 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;
+</PRE>
+
+<P>
+If the flags member includes <CODE>HS_STIFLED</CODE>, the history has been
+stifled.
+
+</P>
+
+
+<H2><A NAME="SEC9" HREF="history.html#TOC9">History Functions</A></H2>
+
+<P>
+This section describes the calling sequence for the various functions
+present in GNU History.
+
+</P>
+
+<UL>
+<LI><A HREF="history.html#SEC10">Initializing History and State Management</A>: Functions to call when you
+ want to use history in a
+ program.
+<LI><A HREF="history.html#SEC11">History List Management</A>: Functions used to manage the list
+ of history entries.
+<LI><A HREF="history.html#SEC12">Information About the History List</A>: Functions returning information about
+ the history list.
+<LI><A HREF="history.html#SEC13">Moving Around the History List</A>: Functions used to change the position
+ in the history list.
+<LI><A HREF="history.html#SEC14">Searching the History List</A>: Functions to search the history list
+ for entries containing a string.
+<LI><A HREF="history.html#SEC15">Managing the History File</A>: Functions that read and write a file
+ containing the history list.
+<LI><A HREF="history.html#SEC16">History Expansion</A>: Functions to perform csh-like history
+ expansion.
+</UL>
+
+
+
+<H3><A NAME="SEC10" HREF="history.html#TOC10">Initializing History and State Management</A></H3>
+
+<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>
+<DL>
+<DT><U>Function:</U> void <B>using_history</B> <I>()</I>
+<DD><A NAME="IDX4"></A>
+Begin a session in which the history functions might be used. This
+initializes the interactive variables.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Function:</U> HISTORY_STATE * <B>history_get_history_state</B> <I>()</I>
+<DD><A NAME="IDX5"></A>
+Return a structure describing the current state of the input history.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Function:</U> void <B>history_set_history_state</B> <I>(HISTORY_STATE *state)</I>
+<DD><A NAME="IDX6"></A>
+Set the state of the history list according to <VAR>state</VAR>.
+</DL>
+
+</P>
+
+
+<H3><A NAME="SEC11" HREF="history.html#TOC11">History List Management</A></H3>
+
+<P>
+These functions manage individual entries on the history list, or set
+parameters managing the list itself.
+
+</P>
+<P>
+<DL>
+<DT><U>Function:</U> void <B>add_history</B> <I>(char *string)</I>
+<DD><A NAME="IDX7"></A>
+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>
+<DL>
+<DT><U>Function:</U> HIST_ENTRY * <B>remove_history</B> <I>(int which)</I>
+<DD><A NAME="IDX8"></A>
+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>
+<DL>
+<DT><U>Function:</U> HIST_ENTRY * <B>replace_history_entry</B> <I>(int which, char *line, char *data)</I>
+<DD><A NAME="IDX9"></A>
+Make the history entry at offset <VAR>which</VAR> have <VAR>line</VAR> and <VAR>data</VAR>.
+This returns the old entry so you can dispose of the data. In the case
+of an invalid <VAR>which</VAR>, a <CODE>NULL</CODE> pointer is returned.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Function:</U> void <B>clear_history</B> <I>()</I>
+<DD><A NAME="IDX10"></A>
+Clear the history list by deleting all the entries.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Function:</U> void <B>stifle_history</B> <I>(int max)</I>
+<DD><A NAME="IDX11"></A>
+Stifle the history list, remembering only the last <VAR>max</VAR> entries.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Function:</U> int <B>unstifle_history</B> <I>()</I>
+<DD><A NAME="IDX12"></A>
+Stop stifling the history. This returns the previous amount the
+history was stifled. The value is positive if the history was
+stifled, negative if it wasn't.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Function:</U> int <B>history_is_stifled</B> <I>()</I>
+<DD><A NAME="IDX13"></A>
+Returns non-zero if the history is stifled, zero if it is not.
+</DL>
+
+</P>
+
+
+<H3><A NAME="SEC12" HREF="history.html#TOC12">Information About the History List</A></H3>
+
+<P>
+These functions return information about the entire history list or
+individual list entries.
+
+</P>
+<P>
+<DL>
+<DT><U>Function:</U> HIST_ENTRY ** <B>history_list</B> <I>()</I>
+<DD><A NAME="IDX14"></A>
+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>
+<DL>
+<DT><U>Function:</U> int <B>where_history</B> <I>()</I>
+<DD><A NAME="IDX15"></A>
+Returns the offset of the current history element.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Function:</U> HIST_ENTRY * <B>current_history</B> <I>()</I>
+<DD><A NAME="IDX16"></A>
+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>
+<DL>
+<DT><U>Function:</U> HIST_ENTRY * <B>history_get</B> <I>(int offset)</I>
+<DD><A NAME="IDX17"></A>
+Return the history entry at position <VAR>offset</VAR>, starting from
+<CODE>history_base</CODE>. 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>
+<DL>
+<DT><U>Function:</U> int <B>history_total_bytes</B> <I>()</I>
+<DD><A NAME="IDX18"></A>
+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>
+
+
+<H3><A NAME="SEC13" HREF="history.html#TOC13">Moving Around the History List</A></H3>
+
+<P>
+These functions allow the current index into the history list to be
+set or changed.
+
+</P>
+<P>
+<DL>
+<DT><U>Function:</U> int <B>history_set_pos</B> <I>(int pos)</I>
+<DD><A NAME="IDX19"></A>
+Set the position in the history list to <VAR>pos</VAR>, an absolute index
+into the list.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Function:</U> HIST_ENTRY * <B>previous_history</B> <I>()</I>
+<DD><A NAME="IDX20"></A>
+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>
+<DL>
+<DT><U>Function:</U> HIST_ENTRY * <B>next_history</B> <I>()</I>
+<DD><A NAME="IDX21"></A>
+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>
+
+
+<H3><A NAME="SEC14" HREF="history.html#TOC14">Searching the History List</A></H3>
+<P>
+<A NAME="IDX22"></A>
+
+</P>
+<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>
+<DL>
+<DT><U>Function:</U> int <B>history_search</B> <I>(char *string, int direction)</I>
+<DD><A NAME="IDX24"></A>
+Search the history for <VAR>string</VAR>, starting at the current history
+offset. If <VAR>direction</VAR> &#60; 0, then the search is through previous entries,
+else through subsequent. 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>
+<DL>
+<DT><U>Function:</U> int <B>history_search_prefix</B> <I>(char *string, int direction)</I>
+<DD><A NAME="IDX25"></A>
+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> &#60; 0, then the search is through previous
+entries, else through subsequent. 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>
+<DL>
+<DT><U>Function:</U> int <B>history_search_pos</B> <I>(char *string, int direction, int pos)</I>
+<DD><A NAME="IDX26"></A>
+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>
+
+
+<H3><A NAME="SEC15" HREF="history.html#TOC15">Managing the History File</A></H3>
+
+<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>
+<DL>
+<DT><U>Function:</U> int <B>read_history</B> <I>(char *filename)</I>
+<DD><A NAME="IDX27"></A>
+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 errno if not.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Function:</U> int <B>read_history_range</B> <I>(char *filename, int from, int to)</I>
+<DD><A NAME="IDX28"></A>
+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>
+<DL>
+<DT><U>Function:</U> int <B>write_history</B> <I>(char *filename)</I>
+<DD><A NAME="IDX29"></A>
+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>. Values
+returned are as in <CODE>read_history ()</CODE>.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Function:</U> int <B>append_history</B> <I>(int nelements, char *filename)</I>
+<DD><A NAME="IDX30"></A>
+Append the last <VAR>nelements</VAR> of the history list to <VAR>filename</VAR>.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Function:</U> int <B>history_truncate_file</B> <I>(char *filename, int nlines)</I>
+<DD><A NAME="IDX31"></A>
+Truncate the history file <VAR>filename</VAR>, leaving only the last
+<VAR>nlines</VAR> lines.
+</DL>
+
+</P>
+
+
+<H3><A NAME="SEC16" HREF="history.html#TOC16">History Expansion</A></H3>
+
+<P>
+These functions implement <CODE>csh</CODE>-like history expansion.
+
+</P>
+<P>
+<DL>
+<DT><U>Function:</U> int <B>history_expand</B> <I>(char *string, char **output)</I>
+<DD><A NAME="IDX32"></A>
+Expand <VAR>string</VAR>, placing the result into <VAR>output</VAR>, a pointer
+to a string (see section <A HREF="history.html#SEC2">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 de-slashifying of 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">Modifiers</A>).
+</DL>
+
+<P>
+If an error ocurred in expansion, then <VAR>output</VAR> contains a descriptive
+error message.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Function:</U> char * <B>history_arg_extract</B> <I>(int first, int last, char *string)</I>
+<DD><A NAME="IDX33"></A>
+Extract a string segment consisting of the <VAR>first</VAR> through <VAR>last</VAR>
+arguments present in <VAR>string</VAR>. Arguments are broken up as in Bash.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Function:</U> char * <B>get_history_event</B> <I>(char *string, int *cindex, int qchar)</I>
+<DD><A NAME="IDX34"></A>
+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>
+<DL>
+<DT><U>Function:</U> char ** <B>history_tokenize</B> <I>(char *string)</I>
+<DD><A NAME="IDX35"></A>
+Return an array of tokens parsed out of <VAR>string</VAR>, much as the
+shell might. The tokens are split on white space and on the
+characters <CODE>()&#60;&#62;;&#38;|$</CODE>, and shell quoting conventions are
+obeyed.
+</DL>
+
+</P>
+
+
+<H2><A NAME="SEC17" HREF="history.html#TOC17">History Variables</A></H2>
+
+<P>
+This section describes the externally visible variables exported by
+the GNU History Library.
+
+</P>
+<P>
+<DL>
+<DT><U>Variable:</U> int <B>history_base</B>
+<DD><A NAME="IDX36"></A>
+The logical offset of the first entry in the history list.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Variable:</U> int <B>history_length</B>
+<DD><A NAME="IDX37"></A>
+The number of entries currently stored in the history list.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Variable:</U> int <B>max_input_history</B>
+<DD><A NAME="IDX38"></A>
+The maximum number of history entries. This must be changed using
+<CODE>stifle_history ()</CODE>.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Variable:</U> char <B>history_expansion_char</B>
+<DD><A NAME="IDX39"></A>
+The character that starts a history event. The default is <SAMP>`!'</SAMP>.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Variable:</U> char <B>history_subst_char</B>
+<DD><A NAME="IDX40"></A>
+The character that invokes word substitution if found at the start of
+a line. The default is <SAMP>`^'</SAMP>.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Variable:</U> char <B>history_comment_char</B>
+<DD><A NAME="IDX41"></A>
+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>
+<DL>
+<DT><U>Variable:</U> char * <B>history_no_expand_chars</B>
+<DD><A NAME="IDX42"></A>
+The list of characters which inhibit history expansion if found immediately
+following <VAR>history_expansion_char</VAR>. The default is whitespace and
+<SAMP>`='</SAMP>.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Variable:</U> char * <B>history_search_delimiter_chars</B>
+<DD><A NAME="IDX43"></A>
+The list of additional characters which can delimit a history search
+string, in addition to whitespace, <SAMP>`:'</SAMP> and <SAMP>`?'</SAMP> in the case of
+a substring search. The default is empty.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Variable:</U> int <B>history_quotes_inhibit_expansion</B>
+<DD><A NAME="IDX44"></A>
+If non-zero, single-quoted words are not scanned for the history expansion
+character. The default value is 0.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Variable:</U> Function * <B>history_inhibit_expansion_function</B>
+<DD><A NAME="IDX45"></A>
+This should be set to the address of a function that takes two arguments:
+a <CODE>char *</CODE> (<VAR>string</VAR>) and an integer 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 NULL.
+</DL>
+
+</P>
+
+
+<H2><A NAME="SEC18" HREF="history.html#TOC18">History Programming Example</A></H2>
+
+<P>
+The following program demonstrates simple use of the GNU History Library.
+
+</P>
+
+<PRE>
+main ()
+{
+ 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");
+ }
+ }
+ }
+}
+</PRE>
+
+
+
+<H1><A NAME="SEC19" HREF="history.html#TOC19">Concept Index</A></H1>
+<P>
+Jump to:
+<A HREF="#cindex_a">a</A>
+-
+<A HREF="#cindex_e">e</A>
+-
+<A HREF="#cindex_h">h</A>
+<P>
+<H2><A NAME="cindex_a">a</A></H2>
+<DIR>
+<LI><A HREF="history.html#IDX23">anchored search</A>
+</DIR>
+<H2><A NAME="cindex_e">e</A></H2>
+<DIR>
+<LI><A HREF="history.html#IDX2">event designators</A>
+</DIR>
+<H2><A NAME="cindex_h">h</A></H2>
+<DIR>
+<LI><A HREF="history.html#IDX3">history events</A>
+<LI><A HREF="history.html#IDX1">history expansion</A>
+<LI><A HREF="history.html#IDX22">History Searching</A>
+</DIR>
+
+</P>
+
+
+<H1><A NAME="SEC20" HREF="history.html#TOC20">Function and Variable Index</A></H1>
+<P>
+Jump to:
+<A HREF="#vindex_a">a</A>
+-
+<A HREF="#vindex_c">c</A>
+-
+<A HREF="#vindex_g">g</A>
+-
+<A HREF="#vindex_h">h</A>
+-
+<A HREF="#vindex_m">m</A>
+-
+<A HREF="#vindex_n">n</A>
+-
+<A HREF="#vindex_p">p</A>
+-
+<A HREF="#vindex_r">r</A>
+-
+<A HREF="#vindex_s">s</A>
+-
+<A HREF="#vindex_u">u</A>
+-
+<A HREF="#vindex_w">w</A>
+<P>
+<H2><A NAME="vindex_a">a</A></H2>
+<DIR>
+<LI><A HREF="history.html#IDX7">add_history</A>
+<LI><A HREF="history.html#IDX30">append_history</A>
+</DIR>
+<H2><A NAME="vindex_c">c</A></H2>
+<DIR>
+<LI><A HREF="history.html#IDX10">clear_history</A>
+<LI><A HREF="history.html#IDX16">current_history</A>
+</DIR>
+<H2><A NAME="vindex_g">g</A></H2>
+<DIR>
+<LI><A HREF="history.html#IDX34">get_history_event</A>
+</DIR>
+<H2><A NAME="vindex_h">h</A></H2>
+<DIR>
+<LI><A HREF="history.html#IDX33">history_arg_extract</A>
+<LI><A HREF="history.html#IDX36">history_base</A>
+<LI><A HREF="history.html#IDX41">history_comment_char</A>
+<LI><A HREF="history.html#IDX32">history_expand</A>
+<LI><A HREF="history.html#IDX39">history_expansion_char</A>
+<LI><A HREF="history.html#IDX17">history_get</A>
+<LI><A HREF="history.html#IDX5">history_get_history_state</A>
+<LI><A HREF="history.html#IDX45">history_inhibit_expansion_function</A>
+<LI><A HREF="history.html#IDX13">history_is_stifled</A>
+<LI><A HREF="history.html#IDX37">history_length</A>
+<LI><A HREF="history.html#IDX14">history_list</A>
+<LI><A HREF="history.html#IDX42">history_no_expand_chars</A>
+<LI><A HREF="history.html#IDX44">history_quotes_inhibit_expansion</A>
+<LI><A HREF="history.html#IDX24">history_search</A>
+<LI><A HREF="history.html#IDX43">history_search_delimiter_chars</A>
+<LI><A HREF="history.html#IDX26">history_search_pos</A>
+<LI><A HREF="history.html#IDX25">history_search_prefix</A>
+<LI><A HREF="history.html#IDX6">history_set_history_state</A>
+<LI><A HREF="history.html#IDX19">history_set_pos</A>
+<LI><A HREF="history.html#IDX40">history_subst_char</A>
+<LI><A HREF="history.html#IDX35">history_tokenize</A>
+<LI><A HREF="history.html#IDX18">history_total_bytes</A>
+<LI><A HREF="history.html#IDX31">history_truncate_file</A>
+</DIR>
+<H2><A NAME="vindex_m">m</A></H2>
+<DIR>
+<LI><A HREF="history.html#IDX38">max_input_history</A>
+</DIR>
+<H2><A NAME="vindex_n">n</A></H2>
+<DIR>
+<LI><A HREF="history.html#IDX21">next_history</A>
+</DIR>
+<H2><A NAME="vindex_p">p</A></H2>
+<DIR>
+<LI><A HREF="history.html#IDX20">previous_history</A>
+</DIR>
+<H2><A NAME="vindex_r">r</A></H2>
+<DIR>
+<LI><A HREF="history.html#IDX27">read_history</A>
+<LI><A HREF="history.html#IDX28">read_history_range</A>
+<LI><A HREF="history.html#IDX8">remove_history</A>
+<LI><A HREF="history.html#IDX9">replace_history_entry</A>
+</DIR>
+<H2><A NAME="vindex_s">s</A></H2>
+<DIR>
+<LI><A HREF="history.html#IDX11">stifle_history</A>
+</DIR>
+<H2><A NAME="vindex_u">u</A></H2>
+<DIR>
+<LI><A HREF="history.html#IDX12">unstifle_history</A>
+<LI><A HREF="history.html#IDX4">using_history</A>
+</DIR>
+<H2><A NAME="vindex_w">w</A></H2>
+<DIR>
+<LI><A HREF="history.html#IDX15">where_history</A>
+<LI><A HREF="history.html#IDX29">write_history</A>
+</DIR>
+
+</P>
+<P><HR><P>
+This document was generated on 19 January 2000 using the
+<A HREF="http://wwwinfo.cern.ch/dis/texi2html/">texi2html</A>
+translator version 1.52.</P>
+</BODY>
+</HTML>
diff --git a/gnu/lib/libreadline/doc/history.info b/gnu/lib/libreadline/doc/history.info
new file mode 100644
index 00000000000..e73cd631cca
--- /dev/null
+++ b/gnu/lib/libreadline/doc/history.info
@@ -0,0 +1,811 @@
+This is Info file history.info, produced by Makeinfo version 1.68 from
+the input file /usr/homes/chet/src/bash/readline-src/doc/hist.texinfo.
+
+INFO-DIR-SECTION Libraries
+START-INFO-DIR-ENTRY
+* History: (history). The GNU history library API
+END-INFO-DIR-ENTRY
+
+ This document describes the GNU History library, a programming tool
+that provides a consistent user interface for recalling lines of
+previously typed input.
+
+ Copyright (C) 1988-1999 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 Free Software Foundation.
+
+
+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.
+* Concept Index:: Index of concepts described in this manual.
+* Function and Variable Index:: Index of externally visible functions
+ and variables.
+
+
+File: history.info, Node: Using History Interactively, Next: Programming with GNU History, Prev: Top, Up: Top
+
+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.
+
+
+File: history.info, Node: History Interaction, Up: Using History Interactively
+
+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.
+
+
+File: history.info, Node: Event Designators, Next: Word Designators, Up: History Interaction
+
+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.
+
+
+File: history.info, Node: Word Designators, Next: Modifiers, Prev: Event Designators, Up: History Interaction
+
+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.
+
+
+File: history.info, Node: Modifiers, Prev: Word Designators, Up: History Interaction
+
+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'
+ Cause changes to be applied over the entire event line. Used in
+ conjunction with `s', as in `gs/OLD/NEW/', or with `&'.
+
+
+File: history.info, Node: Programming with GNU History, Next: Concept Index, Prev: Using History Interactively, Up: Top
+
+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.
+
+
+File: history.info, Node: Introduction to History, Next: History Storage, Up: Programming with GNU History
+
+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.
+
+
+File: history.info, Node: History Storage, Next: History Functions, Prev: Introduction to History, Up: Programming with GNU History
+
+History Storage
+===============
+
+ The history list is an array of history entries. A history entry is
+declared as follows:
+
+ typedef struct _hist_entry {
+ char *line;
+ char *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 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;
+
+ If the flags member includes `HS_STIFLED', the history has been
+stifled.
+
+
+File: history.info, Node: History Functions, Next: History Variables, Prev: History Storage, Up: Programming with GNU History
+
+History Functions
+=================
+
+ This section describes the calling sequence for the various functions
+present in GNU History.
+
+* 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.
+
+
+File: history.info, Node: Initializing History and State Management, Next: History List Management, Up: History Functions
+
+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 ()
+ Begin a session in which the history functions might be used. This
+ initializes the interactive variables.
+
+ - Function: HISTORY_STATE * history_get_history_state ()
+ 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.
+
+
+File: history.info, Node: History List Management, Next: Information About the History List, Prev: Initializing History and State Management, Up: History Functions
+
+History List Management
+-----------------------
+
+ These functions manage individual entries on the history list, or set
+parameters managing the list itself.
+
+ - Function: void add_history (char *string)
+ Place STRING at the end of the history list. The associated data
+ field (if any) is set to `NULL'.
+
+ - 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: HIST_ENTRY * replace_history_entry (int which, char *line,
+ char *data)
+ Make the history entry at offset 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.
+
+ - Function: void clear_history ()
+ 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 ()
+ Stop stifling the history. This returns the previous amount the
+ history was stifled. The value is positive if the history was
+ stifled, negative if it wasn't.
+
+ - Function: int history_is_stifled ()
+ Returns non-zero if the history is stifled, zero if it is not.
+
+
+File: history.info, Node: Information About the History List, Next: Moving Around the History List, Prev: History List Management, Up: History Functions
+
+Information About the History List
+----------------------------------
+
+ These functions return information about the entire history list or
+individual list entries.
+
+ - Function: HIST_ENTRY ** 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'.
+
+ - Function: int where_history ()
+ Returns the offset of the current history element.
+
+ - Function: HIST_ENTRY * current_history ()
+ 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'. If there is no entry there, or if OFFSET is
+ greater than the history length, return a `NULL' pointer.
+
+ - Function: int history_total_bytes ()
+ 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.
+
+
+File: history.info, Node: Moving Around the History List, Next: Searching the History List, Prev: Information About the History List, Up: History Functions
+
+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 position in the history list to POS, an absolute index
+ into the list.
+
+ - Function: HIST_ENTRY * previous_history ()
+ 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 ()
+ 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.
+
+
+File: history.info, Node: Searching the History List, Next: Managing the History File, Prev: Moving Around the History List, Up: History Functions
+
+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 (char *string, int direction)
+ Search the history for STRING, starting at the current history
+ offset. If DIRECTION < 0, then the search is through previous
+ entries, else through subsequent. 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 (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 < 0, then the search is through previous
+ entries, else through subsequent. 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 (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.
+
+
+File: history.info, Node: Managing the History File, Next: History Expansion, Prev: Searching the History List, Up: History Functions
+
+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 (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 (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 (char *filename)
+ Write the current history to FILENAME, overwriting FILENAME if
+ necessary. If FILENAME is `NULL', then write the history list to
+ `~/.history'. Values returned are as in `read_history ()'.
+
+ - Function: int append_history (int nelements, char *filename)
+ Append the last NELEMENTS of the history list to FILENAME.
+
+ - Function: int history_truncate_file (char *filename, int nlines)
+ Truncate the history file FILENAME, leaving only the last NLINES
+ lines.
+
+
+File: history.info, Node: History Expansion, Prev: Managing the History File, Up: History Functions
+
+History Expansion
+-----------------
+
+ These functions implement `csh'-like 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 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 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 * history_arg_extract (int first, int last, char
+ *string)
+ Extract a string segment consisting of the FIRST through LAST
+ arguments present in STRING. Arguments are broken up as in Bash.
+
+ - Function: char * get_history_event (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 (char *string)
+ Return an array of tokens parsed out of STRING, much as the shell
+ might. The tokens are split on white space and on the characters
+ `()<>;&|$', and shell quoting conventions are obeyed.
+
+
+File: history.info, Node: History Variables, Next: History Programming Example, Prev: History Functions, Up: Programming with GNU History
+
+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 max_input_history
+ The maximum number of history entries. This must be changed using
+ `stifle_history ()'.
+
+ - Variable: char history_expansion_char
+ The character that starts a history event. The default is `!'.
+
+ - 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_no_expand_chars
+ The list of characters which inhibit history expansion if found
+ immediately following HISTORY_EXPANSION_CHAR. The default is
+ whitespace and `='.
+
+ - Variable: char * history_search_delimiter_chars
+ The list of additional characters which can delimit a history
+ search string, in addition to whitespace, `:' and `?' in the case
+ of a substring search. The default is empty.
+
+ - 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: Function * history_inhibit_expansion_function
+ This should be set to the address of a function that takes two
+ arguments: a `char *' (STRING) and an integer 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.
+
+
+File: history.info, Node: History Programming Example, Prev: History Variables, Up: Programming with GNU History
+
+History Programming Example
+===========================
+
+ The following program demonstrates simple use of the GNU History
+Library.
+
+ main ()
+ {
+ 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");
+ }
+ }
+ }
+ }
+
+
+File: history.info, Node: Concept Index, Next: Function and Variable Index, Prev: Programming with GNU History, Up: Top
+
+Concept Index
+*************
+
+* Menu:
+
+* anchored search: Searching the History List.
+* event designators: Event Designators.
+* history events: Event Designators.
+* history expansion: History Interaction.
+* History Searching: Searching the History List.
+
+
+File: history.info, Node: Function and Variable Index, Prev: Concept Index, Up: Top
+
+Function and Variable Index
+***************************
+
+* Menu:
+
+* add_history: History List Management.
+* append_history: Managing the History File.
+* clear_history: History List Management.
+* current_history: Information About the History List.
+* get_history_event: History Expansion.
+* history_arg_extract: History Expansion.
+* history_base: History Variables.
+* history_comment_char: History Variables.
+* history_expand: History Expansion.
+* history_expansion_char: History Variables.
+* history_get: Information About the History List.
+* history_get_history_state: Initializing History and State Management.
+* history_inhibit_expansion_function: History Variables.
+* history_is_stifled: History List Management.
+* history_length: History Variables.
+* history_list: Information About the History List.
+* history_no_expand_chars: History Variables.
+* history_quotes_inhibit_expansion: History Variables.
+* history_search: Searching the History List.
+* history_search_delimiter_chars: History Variables.
+* history_search_pos: Searching the History List.
+* history_search_prefix: Searching the History List.
+* history_set_history_state: Initializing History and State Management.
+* history_set_pos: Moving Around the History List.
+* history_subst_char: History Variables.
+* history_tokenize: History Expansion.
+* history_total_bytes: Information About the History List.
+* history_truncate_file: Managing the History File.
+* max_input_history: History Variables.
+* next_history: Moving Around the History List.
+* previous_history: Moving Around the History List.
+* read_history: Managing the History File.
+* read_history_range: Managing the History File.
+* remove_history: History List Management.
+* replace_history_entry: History List Management.
+* stifle_history: History List Management.
+* unstifle_history: History List Management.
+* using_history: Initializing History and State Management.
+* where_history: Information About the History List.
+* write_history: Managing the History File.
+
+
+
+Tag Table:
+Node: Top1162
+Node: Using History Interactively1742
+Node: History Interaction2250
+Node: Event Designators3669
+Node: Word Designators4596
+Node: Modifiers6225
+Node: Programming with GNU History7363
+Node: Introduction to History8089
+Node: History Storage9774
+Node: History Functions10867
+Node: Initializing History and State Management11838
+Node: History List Management12630
+Node: Information About the History List14151
+Node: Moving Around the History List15457
+Node: Searching the History List16342
+Node: Managing the History File18174
+Node: History Expansion19680
+Node: History Variables21519
+Node: History Programming Example23837
+Node: Concept Index26441
+Node: Function and Variable Index26927
+
+End Tag Table
diff --git a/gnu/lib/libreadline/doc/history.ps b/gnu/lib/libreadline/doc/history.ps
new file mode 100644
index 00000000000..abd781068ef
--- /dev/null
+++ b/gnu/lib/libreadline/doc/history.ps
@@ -0,0 +1,1636 @@
+%!PS-Adobe-2.0
+%%Creator: dvips(k) 5.82 Copyright 1998 Radical Eye Software
+%%Title: history.dvi
+%%Pages: 20
+%%PageOrder: Ascend
+%%BoundingBox: 0 0 612 792
+%%EndComments
+%DVIPSWebPage: (www.radicaleye.com)
+%DVIPSCommandLine: dvips -D 300 -t letter -o history.ps history.dvi
+%DVIPSParameters: dpi=300, compressed
+%DVIPSSource: TeX output 2000.01.19:1217
+%%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/IE 0 N/ctr 0 N/df-tail{/nn 8 dict N nn begin
+/FontType 3 N/FontMatrix fntrx N/FontBBox FBB N string/base X array
+/BitMaps X/BuildChar{CharBuilder}N/Encoding IE N end 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/IE 256 array N 2 string 0 1 255{IE 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
+TeXDict begin 40258431 52099146 1000 300 300 (history.dvi)
+@start
+%DVIPSBitmapFont: Fa cmti10 10.95 1
+/Fa 1 47 df<127012F8A212F012E005057B840E>46 D E
+%EndDVIPSBitmapFont
+%DVIPSBitmapFont: Fb cmbxti10 14.4 1
+/Fb 1 47 df<120E123FEA7F80A212FFA21300127E123C0909798815>46
+D E
+%EndDVIPSBitmapFont
+%DVIPSBitmapFont: Fc cmtt9 9 26
+/Fc 26 123 df<EAFFFEA30F037E7E14>95 D<EA1FC0EA7FF0EA7078EA2018EA001CA2EA
+07FC121FEA3C1C127012E0A3EA707C383FFF80EA0F8F11107E8F14>97
+D<12FCA2121CA513F8EA1DFEEA1F07EA1E03001C1380EB01C0A6EB0380001E1300EA1F0E
+EA1DFCEA0CF81217809614>I<EA03F8EA0FFEEA1C0EEA3804EA7000126012E0A4126012
+70EA380EEA1C1EEA0FFCEA03F00F107E8F14>I<137EA2130EA5EA07CEEA0FFEEA1C3EEA
+301EEA700E12E0A61270EA301EEA383E381FEFC0EA07CF12177F9614>I<EA07E0EA0FF0
+EA1C38EA301CEA700CEAE00EA2EAFFFEA2EAE00012601270EA380EEA1C1EEA0FFCEA03F0
+0F107E8F14>I<13FCEA01FEEA038EEA07041300A3EA7FFE12FFEA0700ACEAFFF8A20F17
+7F9614>I<EA07CF381FFF80EA383B38301800EA701CA3EA3018EA3838EA3FF0EA37C000
+70C7FCA2EA3FF86C7E487EEA700F38E00380A438700700EA3C1EEA1FFCEA07F011197F8F
+14>I<12FCA2121CA51378EA1DFEEA1F86EA1E07121CAA38FF8FE0A21317809614>I<1206
+120FA21206C7FCA4B4FCA21207ACEAFFF8A20D187C9714>I<12FCA2121CA5EBFF80A2EB
+1C005B5B5BEA1DC0EA1FE0A2EA1E70EA1C38133C131C7F38FF1F80A21117809614>107
+D<EAFF80A21203B3EAFFFEA20F177E9614>I<EAFB8EEAFFDF383CF380A2EA38E3AA38FE
+FBE013791310808F14>I<EAFC78EAFDFEEA1F86EA1E07121CAA38FF8FE0A21310808F14>
+I<EA07C0EA1FF0EA3C78EA701CA2EAE00EA6EA701CEA783CEA3C78EA1FF0EA07C00F107E
+8F14>I<EAFCF8EAFDFEEA1F07EA1E03001C1380EB01C0A6EB0380001E1300EA1F0EEA1D
+FCEA1CF890C7FCA6B47EA21218808F14>I<EA03E7EA0FF7EA1C1FEA300F1270487EA6EA
+700F1230EA1C3FEA0FF7EA07C7EA0007A6EB3FE0A213187F8F14>I<EAFE1FEB7F80EA0E
+E3380F810090C7FCA2120EA8EAFFF0A211107F8F14>I<EA0FD8EA3FF8EA603812C0A2EA
+F000EA7F80EA3FF0EA07F8EA001CEA600612E012F0EAF81CEAFFF8EACFE00F107E8F14>
+I<1206120EA4EA7FFC12FFEA0E00A8130EA3131CEA07F8EA01F00F157F9414>I<EAFC3F
+A2EA1C07AB131F380FFFE0EA03E71310808F14>I<38FE3F80A2383C1E00EA1C1CA36C5A
+A3EA0630EA0770A36C5AA311107F8F14>I<38FE3F80A238700700EA380EA3EA39CEA3EA
+1B6C121AA3EA1E7CA2EA0E3811107F8F14>I<EA7E3FA2EA1E3CEA0E78EA07705B12036C
+5A12037FEA0770EA0E781338487E38FE3F80A211107F8F14>I<38FE3F80A2381C0E005B
+A2120E5BA212071330A2EA0370A25B1201A25BA3485A12730077C7FC127E123C11187F8F
+14>I<EA3FFF5AEA700E131C1338EA007013E0EA01C0EA0380EA0700120EEA1C07123812
+70B5FCA210107F8F14>I E
+%EndDVIPSBitmapFont
+%DVIPSBitmapFont: Fd cmsl9 9 1
+/Fd 1 47 df<1270A212F0126004047D830B>46 D E
+%EndDVIPSBitmapFont
+%DVIPSBitmapFont: Fe cmr9 9 24
+/Fe 24 122 df<EA07E0EA1C38EA381CEA300CEA700EEA6006A2EAE007AAEA6006A2EA70
+0EEA300CEA381CEA1C38EA07E010187F9713>48 D<12035AB4FC1207B3A2EA7FF80D187D
+9713>I<EA01F8EA0704EA0C06EA180E123013001270126012E0EAE3E0EAE418EAE80CEA
+F00EEAE0061307A31260A2EA7006EA300EEA180CEA0C38EA07E010187F9713>54
+D<1240EA7FFF13FEA2EA4004EA80081310A2EA00201340A21380120113005AA25A1206A2
+120EA5120410197E9813>I<EA07E0EA1818EA300CEA20061260A21270EA780CEA3E18EA
+1F30EA07C0EA03E0EA0CF8EA307CEA601E130FEAC0071303A3EA6002EA2004EA1818EA07
+E010187F9713>I<EA07E0EA1C30EA3018EA700CEA600EEAE006A21307A31260EA700FEA
+3017EA1827EA07C7EA00071306130E130C12701318EA6030EA3060EA0F8010187F9713>
+I<39FFE1FFC0390E001C00AB380FFFFC380E001CAC39FFE1FFC01A1A7F991D>72
+D<EA0FC2EA1836EA200EEA600612C01302A3EAE0001270127EEA3FE0EA1FF8EA03FCEA00
+7E130E130713031280A3EAC0021306EAE004EAD818EA87E0101A7E9915>83
+D<EA1FC0EA38707FEA101C1200A2EA03FCEA1E1C1238127012E01480A2133CEA705F381F
+8F0011107F8F13>97 D<EA07F8EA1C1C1238EA700813005AA612701304EA3808EA1C18EA
+07E00E107F8F11>99 D<133F1307A9EA03E7EA0C17EA180F487E127012E0A6126012706C
+5AEA1C373807C7E0131A7F9915>I<EA07C0EA1C30EA30181270EA600C12E0EAFFFCEAE0
+00A41260EA7004EA3808EA1C18EA07E00E107F8F11>I<EA0FCF3818718038303000EA70
+38A4EA30306C5AEA2FC00060C7FCA21270EA3FF013FC6C7EEA600FEAC003A4EA6006EA38
+1CEA07E011187F8F13>103 D<12FC121CA9137CEA1D87381E0380A2121CAB38FF9FF014
+1A809915>I<1218123CA212181200A612FC121CAE12FF081A80990A>I<EAFC7CEA1D8738
+1E0380A2121CAB38FF9FF01410808F15>110 D<EA07E0EA1C38EA300CEA700EEA6006EA
+E007A6EA6006EA700EEA381CEA1C38EA07E010107F8F13>I<EAFCFCEA1D07381E038038
+1C01C0A2EB00E0A6EB01C01480381E0300EA1D06EA1CF890C7FCA6B47E1317808F15>I<
+EAFC78EA1D9CEA1E1C1308EA1C00ABEAFF800E10808F0F>114 D<EA1F20EA60E0EA4020
+12C0A2EAF000127FEA3FC0EA1FE0EA00F0EA8070133012C01320EAF040EA8F800C107F8F
+0F>I<1208A41218A21238EAFFC0EA3800A81320A41218EA1C40EA07800B177F960F>I<38
+FF0F80383C0700EA1C061304A26C5AA26C5AA3EA03A0A2EA01C0A36C5A11107F8F14>
+118 D<38FE3F80383C1E00EA1C086C5AEA0F306C5A6C5A12017F1203EA0270487E1208EA
+181CEA381E38FC3FC012107F8F14>120 D<38FF0F80383C0700EA1C061304A26C5AA26C
+5AA3EA03A0A2EA01C0A36C5AA248C7FCA212E112E212E4127811177F8F14>I
+E
+%EndDVIPSBitmapFont
+%DVIPSBitmapFont: Ff cmss10 10.95 2
+/Ff 2 42 df<13E0EA01C0EA0380120713005A121EA2121C123CA212381278A3127012F0
+AE12701278A31238123CA2121C121EA27E7E13801203EA01C0EA00E00B2E7CA112>40
+D<12E012707E123C121C121E7EA27E1380A2120313C0A3120113E0AE13C01203A3138012
+07A213005AA2121E121C123C12385A5A0B2E7EA112>I E
+%EndDVIPSBitmapFont
+%DVIPSBitmapFont: Fg cmbx10 12 27
+/Fg 27 123 df<EB07F8EB7FFC3801FC0E3803F01F48485AEA0FC0A3141E140C91C7FCA2
+ECFF80B6FCA2380FC01FB2397FF8FFF0A21C237FA220>12 D<90380FFF80137F3801FC1F
+3803F03FEA07E0EA0FC0141FA7B6FCA2380FC01FB2397FF8FFF0A21C237FA220>I<EA07
+FE381FFF80383F07E06D7E130180121E1200A2133FEA03FDEA1F81EA3E01127C12F8A4EA
+7C02EA7E0C391FF87F803807E03F19167E951C>97 D<B47EA2121FABEB87F0EBBFFCEBF0
+3EEBC01F9038800F8015C0140715E0A715C0A2140F15809038C01F00381E707E381C3FFC
+38180FE01B237EA220>I<EBFF80000713E0380F83F0EA1F03123E127E387C01E090C7FC
+12FCA6127C127EA2003E13186C1330380FC0603807FFC0C6130015167E9519>I<49B4FC
+A2EB003FAB13FE3807FFBF380FC1FF48C67E003E7F127E127CA212FCA7127C127E123E6C
+5B380F81FF3907FF3FE0EA01FC1B237EA220>I<13FE3807FF80380F83C0381E01E0383E
+00F0127E007C13F8147812FCB512F8A200FCC7FCA3127CA26C1318A26C1330380F80E038
+03FFC0C6130015167E951A>I<EB1F80EBFFE03801F1F0EA03E31207EA0FC3EBC1E0EBC0
+00A6EAFFFEA2EA0FC0B2EA7FFCA214237EA212>I<9038FE0F803903FF9FC0380F83E338
+1F01F3391E00F000003E7FA5001E5BEA1F01380F83E0380BFF80D808FEC7FC0018C8FCA2
+121C381FFFE014FC6C13FF7E001F1480397C001FC00078130F00F81307A3007CEB0F806C
+EB1F00381F807E6CB45A000113E01A217F951D>I<B47EA2121FABEB83F0EB8FFCEB987E
+EBA03EEBC03FA21380AE39FFF1FFE0A21B237DA220>I<121E123FEA7F80A4EA3F00121E
+C7FCA6EAFF80A2121FB2EAFFF0A20C247EA30F>I<B47EA2121FABECFF80A2EC3C001430
+14E0EB81C00183C7FC1386139E13BE13FFEBDF80EB8FC01307806D7E6D7E130080147E39
+FFE1FFC0A21A237EA21E>107 D<EAFF80A2121FB3ADEAFFF0A20C237EA20F>I<3AFF03F8
+03F890390FFE0FFE3A1F183F183F9039201F201F014001C01380A201801380AE3BFFF0FF
+F0FFF0A22C167D9531>I<38FF03F0EB0FFC381F187EEB203EEB403FA21380AE39FFF1FF
+E0A21B167D9520>I<13FF000713E0380F81F0381F00F8003E137C48133EA300FC133FA7
+007C133E007E137E003E137C6C13F8380F81F03807FFE0C6130018167E951D>I<38FF87
+F0EBBFFC381FF07EEBC01F9038800F8015C0A2EC07E0A715C0140FA2EC1F8001C01300EB
+F07EEBBFFCEB8FE00180C7FCA8EAFFF0A21B207E9520>I<EBFE033807FF07380FC1CF38
+1F00DF48137F007E7FA2127C12FCA7127EA2003E5B6C5BEA0FC13807FF3FEA00FC1300A8
+903801FFE0A21B207E951E>I<38FF0F80EB1FE0381F33F013631343A2EBC1E0EB8000AD
+EAFFF8A214167E9518>I<3807F980EA1FFFEA3807EA7003EAF001A26CC7FCB4FC13F8EA
+7FFE6C7E6C1380120738003FC0EAC007130312E0A200F0138038FC0F00EAEFFEEAC3F812
+167E9517>I<487EA41203A21207A2120F123FB5FCA2EA1F80ABEB8180A5380F830013C3
+EA07FEEA01F811207F9F16>I<38FF81FFA2381F803FAF5C5C380FC1BF3907FF3FE0EA01
+FC1B167D9520>I<39FFF01FE0A2391FC00700000F1306EBE00E0007130C13F000035BA2
+6C6C5AA26C6C5AA2EBFEE0EB7EC0137F6D5AA26DC7FCA2130EA21B167F951E>I<3AFFF3
+FF83FCA23A1F807C00E0D80FC014C08001E013010007017F1380A2D803F0EB0300ECCF83
+01F81387D801F913C61487D800FD13ECEBFF0315FC017F5BEB7E01013E5BEB3C00A20118
+136026167F9529>I<39FFF07FC0A2390FC01C006C6C5A6D5A00035B6C6C5A3800FD8013
+7F91C7FC7F6D7E497EEB37E0EB67F013C33801C1F8380380FC48487E000E137F39FF81FF
+E0A21B167F951E>I<39FFF01FE0A2391FC00700000F1306EBE00E0007130C13F000035B
+A26C6C5AA26C6C5AA2EBFEE0EB7EC0137F6D5AA26DC7FCA2130EA2130CA25B1278EAFC38
+13305BEA69C0EA7F80001FC8FC1B207F951E>I<387FFFF0A2387C07E038700FC0EA601F
+00E0138038C03F005B137EC65A1201485AEBF030EA07E0120FEBC070EA1F80003F1360EB
+00E0EA7E03B5FCA214167E9519>I E
+%EndDVIPSBitmapFont
+%DVIPSBitmapFont: Fh cmtt10 12 24
+/Fh 24 119 df<13E0A538F0E1E0EAFCE7387EEFC0381FFF00EA07FCEA01F0EA07FCEA1F
+FF387EEFC038FCE7E0EAF0E13800E000A513157D991A>42 D<1338137CA2136C13EEA313
+C6A2EA01C7A438038380A4380701C0A213FFA24813E0EA0E00A4481370387F01FC38FF83
+FE387F01FC171E7F9D1A>65 D<B512F8A3381C0038A51400A2130EA3EA1FFEA3EA1C0EA3
+90C7FCA3141CA5B512FCA3161E7E9D1A>69 D<387FFFFCB5FC7E380E001CA51400A2EB03
+80A3EA0FFFA3EA0E03A390C7FCA8EA7FE012FF127F161E7F9D1A>I<38FF83FEA3381C00
+70AA381FFFF0A3381C0070AB38FF83FEA3171E7F9D1A>72 D<B51280A33801C000B3A6B5
+1280A3111E7C9D1A>I<38FE03FE12FFA2381D8070A213C0121CA213E0A213601370A213
+301338A21318131CA2130C130EA21306A213071303A238FF81F0A21380171E7F9D1A>78
+D<EA0FFE383FFF804813C0EA7C07EA700100F013E0EAE000B1EAF001A2007013C0EA7C07
+EA7FFF6C1380380FFE00131E7D9D1A>I<EAFFFC13FF1480381C07C0EB01E0EB00F01470
+A414F0EB01E0EB07C0381FFF8014001480381C07C01301EB00E0A514E214E7A338FF807E
+A21438181E7F9D1A>82 D<3803F1C0EA0FFDEA3FFFEA7C0FEA700312E01301A390C7FC12
+701278123FEA1FF0EA07FE3800FF80EB0FC0EB01E013001470A2126012E0A214E0EAF001
+38FC03C0B5128000EF1300EAE3FC141E7D9D1A>I<387FFFFEB5FCA238E0380EA5000013
+00B33803FF80A3171E7F9D1A>I<38FF01FEA3381C00706C13E0A2380701C0A213830003
+138013C700011300A2EA00EEA2137CA21338AA48B4FCA3171E7F9D1A>89
+D<387FFFC0B512E0A26C13C013047D7E1A>95 D<EA1FF0EA3FFC487EEA780FEA30073800
+0380A2137FEA07FF121FEA3F83EA7803127012E0A3EA7007EA780F383FFFFCEA1FFDEA07
+F016157D941A>97 D<EBFF80000313C0000F13E0EA1F01383C00C04813001270A25AA512
+70A2007813707E381F01F0380FFFE0000313C03800FE0014157D941A>99
+D<EB1FC0A31301A6EA01F1EA07FDEA0FFFEA1E0FEA3C07EA7803EA700112E0A7EA7003A2
+EA3807EA3E0F381FFFFCEA07FDEA01F1161E7E9D1A>I<12FEA3120EA6133EEBFF80000F
+13C013C1EB80E01300120EAC38FFE3FE13E713E3171E7F9D1A>104
+D<EA01C0487EA36C5AC8FCA5EA7FE0A31200AF387FFF80B512C06C1380121F7C9E1A>I<
+EAFE3EEBFF80B512C0EA0FC1EB80E01300120EAC38FFE3FE13E713E317157F941A>110
+D<EA01F0EA07FCEA1FFF383E0F80EA3C07387803C0EA700138E000E0A6EAF001007013C0
+EA7803383C0780EA3E0F381FFF00EA07FCEA01F013157D941A>I<387F81F838FF8FFC38
+7F9FFE3803FE1EEBF80CEBE000A25B5BAAEA7FFFB5FC7E17157F941A>114
+D<487E1203A6387FFFE0B5FCA238038000AA1470A43801C1E013FF6C1380EB3F00141C7F
+9B1A>116 D<38FE0FE0A3EA0E00AD1301EA0F033807FFFE7EEA00FC17157F941A>I<387F
+C7FC00FF13FE007F13FC380E00E0A3380701C0A338038380A33801C700A3EA00EEA3137C
+A2133817157F941A>I E
+%EndDVIPSBitmapFont
+%DVIPSBitmapFont: Fi cmbx12 13.14 41
+/Fi 41 123 df<EB07FCEB3FFF9038FE0780D803F013C03807E00FA2EA0FC0A3EC030091
+C7FCA3EC7FE0B6FCA2380FC007B3A239FFFC7FFEA21F267FA522>12
+D<123C127E12FFA4127E123C08087C8711>46 D<131C133C13FC12FFA21200B3AA387FFF
+FCA216237CA21F>49 D<48B4FC000713C0381E07F0383803F8386001FC387C00FE12FE14
+FF147FA2127C003813FFC7FC14FEA2EB01FC14F8EB03F0EB07E01480EB0F00131E5B1370
+EBE003EA01C038038007380700061206380FFFFE5A5A4813FCB5FCA218237DA21F>I<48
+B4FC000713E0381E03F0383801F8003C13FC387E00FEA3123EEA1C01000013FCA2EB03F8
+EB07F0EB0FC03801FF00A2380007E0EB01F014F8EB00FC14FE14FFA21210127C12FEA214
+FEA2387C01FC007013F8383E07F0380FFFC00001130018237DA21F>I<14381478A214F8
+1301130313071306130C131C13381330136013E0EA01C01380EA03005A120E5A12185A12
+705AB612C0A2390001F800A790387FFFC0A21A237EA21F>I<0018130C001F137CEBFFF8
+14F014E014C01480EBFC000018C7FCA513FF001B13E0381F03F0381C00F8000813FCC712
+7EA3147FA2127812FCA3147E5A006013FC1270383801F8381E07E03807FFC03801FE0018
+237DA21F>I<EB1FC0EB7FF03801F0383803E00C3807803E000F137EEA1F005AA2007E13
+3C1400A338FE3FC0EB7FF0EB80F800FF13FCEB007C147E5A147FA4127EA4003E137E123F
+6C137C380F80F83807C1F03803FFC038007F0018237DA21F>I<1230123C003FB512C0A2
+15804814005C5C38600018A200E05B485B5CC6485AA249C7FC1306130EA25BA2133CA25B
+A213F8A41201A66C5A13601A257DA41F>I<141CA2143EA3147FA24A7EA39038019FC0A2
+9038031FE0140F01077FEB0607A2010C7F1403011C7FEB1801A2496C7EA2017FB5FCA290
+39E0007F8049133FA2484880151F00038190C7120FA2486E7ED8FFF090B51280A229257E
+A42E>65 D<B612E015FC3903F800FFED1FC0ED07E06F7E6F7E82150082A2167FA31780AA
+1700A316FEA24B5A5E4B5A4B5AED1FC0EDFF80B648C7FC15E029257EA42F>68
+D<B7FCA23903F8007FED0F8015071503A21501A3ED00C01406A21600A2140E141EEBFFFE
+A2EBF81E140E1406A21660A291C7FC16C0A415011503A2ED0F80153FB7FCA223257EA428
+>I<B612FEA23803F800151F8181A281A3ED01801403A292C7FCA25C5C90B5FCA2EBF80F
+8080A491C8FCAAB512F0A221257EA427>I<B500E0B512E0A23B03F80003F800AF90B6FC
+A29038F80003B0B500E0B512E0A22B257EA430>72 D<B512E0A23803F800B3AFB512E0A2
+13257EA417>I<B512F0A2D803F8C7FCB3A31503A31506A3150EA2151E153E157CEC03FC
+B6FCA220257EA425>76 D<D8FFF8EDFFF86D5C0003EEFE00017EEC037EA36D1406A26D6C
+130CA26D6C1318A26D6C1330A36D6C1360A26D6C13C0A2903900FC0180A291387E0300A3
+EC3F06A2EC1F8CA2EC0FD8A2EC07F0A36E5AEA07803CFFFC01C01FFFF8A235257EA43A>
+I<01FF1380000713E3380F80F7381E001F48130F481307140312F81401A27E91C7FCB4FC
+EA7FE013FE383FFFE014F86C13FE00077F6C1480C67E010313C0EB003FEC0FE01407A200
+C01303A315C07E6C13076C14806CEB0F0038FFC03E38E3FFF838803FE01B257DA422>83
+D<B53B81FFFE01FFF0A23D07F0001FC0000F007013066C6C010F5CA26F7E6C6C5EA26D49
+6C1338000017304B7E017F01195CA291388030FE013F5E829139C0607F01011F5E03E013
+8190280FE0C03F83C7FCA29139F1801FC3010715C617E69139FB000FEE010315EC02FF14
+FC6D486D5AA24A130301005DA24A130102785CA202306D5A3C257FA43F>87
+D<EA07FF001F13E0383E03F0383F00F880147E121EC7FCA3EB1FFE3803FE7EEA0FC0EA1F
+00123E127E5AA314BEEA7E01383F073E391FFE1FE03807F00F1B187E971E>97
+D<EAFFC0A2120FACEBC1FCEBCFFF9038FC0FC09038F007E09038C003F0A2EC01F8A215FC
+A815F8A2EC03F013E09038F007E090381C1F80390E0FFF00380C03F81E267FA522>I<EB
+7FE03803FFF83807C07C381F80FC13005A007E1378140012FEA8127E127F6C130CEA1F80
+EBC0183807E0703803FFE038007F0016187E971B>I<ECFFC0A2140FAC137F3803FFCF38
+0FE0FF381F803F383F000FA2127EA212FEA8127EA27E141F381F803F380FC0EF3903FFCF
+FC3800FE0F1E267EA522>I<137F3803FFC03807C1F0380F80F8EA1F0048137C127E147E
+12FEA2B512FEA248C7FCA3127EA214067E6C130C380F80183807E0703803FFE038007F80
+17187E971C>I<EB1FC0EB7FF0EA01F83803E1F8120713C1380FC0F01400A7B5FCA2EA0F
+C0B3A2EAFFFEA215267EA513>I<3901FF07C00007EBDFE0380F83F1EA1F01393E00F800
+007E7FA6003E5B6C485A380F83E0EBFFC0001190C7FC0030C8FCA21238123C383FFFE06C
+13FC806C7F481480383C003F48EB0FC000F81307A4007CEB0F806CEB1F00381F807E3807
+FFF8C613C01B247E971F>I<EAFFC0A2120FAC14FE9038C3FF809038CE0FC013D89038D0
+07E013E0A213C0AF39FFFC7FFEA21F267EA522>I<120FEA1F80EA3FC0A4EA1F80EA0F00
+C7FCA7EA7FC0A2120FB3A2EAFFF8A20D277EA611>I<EAFFC0A2120FB3B0EAFFFCA20E26
+7EA511>108 D<26FF80FE137F903A83FF81FFC03B0F8E0FC707E0019813CC903A9007E8
+03F001A013F0A201C013E0AF3BFFFC7FFE3FFFA230187E9733>I<38FF80FE903883FF80
+390F8E0FC0139890389007E013A0A213C0AF39FFFC7FFEA21F187E9722>I<EB7F803803
+FFF03807C0F8381F807E48487EA2007EEB1F80A200FE14C0A8007E1480A26CEB3F00A238
+1F807E6C6C5A3803FFF038007F801A187E971F>I<38FFC1FCEBCFFF390FFC1FC09038F0
+07E001C013F0140315F8140115FCA8EC03F8A215F0EBE0079038F00FE09038DC1F809038
+CFFF00EBC3F801C0C7FCA9EAFFFCA21E237F9722>I<38FF83E0EB8FF8380F8C7CEB90FC
+13B013A01478EBE0005BAEEAFFFEA216187F9719>114 D<3807F8C0EA1FFFEA3C07EA70
+01EAF000A300FC1300B47EEA7FFC7F383FFF80000F13C0120338001FE01303EAC001A212
+E014C0EAF00338FC078038EFFF00EAC3FC13187E9718>I<13C0A41201A312031207120F
+121FB512C0A2380FC000AC1460A63807E0C013E13801FF8038007E0013237FA218>I<39
+FFC07FE0A2000F1307B0140FA200071317EBE0673903FFC7FE38007F071F187E9722>I<
+39FFF80FF8A2390FC001C015803907E00300A26D5A00031306EBF80E0001130C13FC0000
+5B13FEEB7E30A26D5AA214E06D5AA26D5AA26DC7FCA21D187F9720>I<39FFF83FF0A239
+0FC00F003807E00E6C6C5A6D5A6C6C5A00001360EB7EC06D5AA2131F6D7E497E80EB33F8
+1361EBE0FC3801C07E3803807F3907003F8048131F39FFC07FF8A21D187F9720>120
+D<39FFF80FF8A2390FC001C015803907E00300A26D5A00031306EBF80E0001130C13FC00
+005B13FEEB7E30A26D5AA214E06D5AA26D5AA26DC7FCA21306A25B1230EA781CEAFC185B
+1370EA68E0EA7FC0001FC8FC1D237F9720>I<387FFFF8A2387C03F0EA700738600FE000
+E013C0EB1F80EAC03F1400137EEA00FE5B485A0003130C13F0EA07E0120FEBC01C381F80
+18003F1338387F0078387E01F8B5FCA216187E971B>I E
+%EndDVIPSBitmapFont
+%DVIPSBitmapFont: Fj cmsl10 10.95 30
+/Fj 30 122 df<903803F07C90381E0DC69038380F0FEB701E01E0130EEC0C003801C01C
+A548485A007FB512C03903803800A448485AA6000E5BA648485A001E7F38FF8FFC20207E
+9F1B>11 D<EB03E0EB1C181338EB703C13E014383801C000A5485A387FFFF038038070A4
+380700E0A6380E01C0A6381C0380001E13C038FF0FF016207E9F19>I<903803F03F9039
+1E09E0809039380F80C09039701F01E0EBE03E021E13C02601C01CC7FCA548485A007FB6
+12803903803803A43A0700700700A6000EEBE00EA64848485A001EEBE01E3AFF8FF8FFC0
+23207E9F26>14 D<13201360A4383061C0383C4380380E4E00EA0778EA01E0A2EA07B8EA
+1C9CEA708FEAE083EA0180A490C7FC12147AA117>42 D<13181338EA01F8EA0E701200A5
+13E0A6EA01C0A6EA0380A6EA07001380EAFFFC0E1E7B9D17>49 D<EB3F80EBC1E0380100
+70000213785AA2000F137C1380A2EB00781206C712F814F0EB01E014C0EB0380EB070013
+0E5B5B13605B485A380300201206000813405A383FFFC0481380B5FC161E7E9D17>I<13
+FFEA01FE1380A5EA0300A61206A65AA65AA65AA65AA6B4FCA2102D7EA10D>91
+D<13FFEA01FEEA0006A5130CA61318A61330A61360A613C0A6EA0180A6EAFF00A2102D82
+A10D>93 D<EA07F8EA0C0CEA1E061307121C1200A313FFEA07C7EA1E07EA3C0E127800F0
+1310A3131EEB2E2038784F40381F878014147D9317>97 D<13FEEA0383380E0780121C00
+38130090C7FC12785AA45AA37E5BEA70026C5AEA1C18EA07E011147D9314>99
+D<1438EB01F8EB00781438A21470A614E013FCEA0382EA0601121CEA3C00383801C01278
+12F0A438E00380A412F0EA700738380F00381C37803807C7E015207D9F19>I<13F8EA07
+0EEA0E07121C383803801278127012F0A2B5FC00F0C7FC5AA46C5AEA7002EA3004EA1C18
+EA07E011147D9314>I<EB07C0EB1C60EB30F01360EBE0E0EBC0001201A5485AEA3FFCEA
+0380A448C7FCA6120EA65A121EEAFFC014207F9F0E>I<140EEB3E11EBE1A33801C1C238
+0381E0EA07801301120FA3380703C01480EB8700EA04FC48C7FCA21218121CEA0FFF14C0
+14E0381800F04813305A5AA3006013606C13C0381C0700EA07FC181F809417>I<13E012
+0712011200A2485AA6485AEB8F80EB90E013A0EBC0601380000713E01300A5380E01C0A6
+381C0380001E13C038FF8FF014207E9F19>I<EA01C0EA03E0A213C0EA0180C7FCA6EA03
+80121F12071203A2EA0700A6120EA65A121EEAFF800B1F7F9E0C>I<13E0120712011200
+A2EA01C0A6EA0380A6EA0700A6120EA65A121EEAFF800B207F9F0C>108
+D<390387C07C391F9861863907A072073903C03403EB80380007EB7807EB0070A5000EEB
+E00EA64848485A001EEBE01E3AFFCFFCFFC022147E9326>I<38038F80381F90E0EA07A0
+3803C0601380000713E01300A5380E01C0A6381C0380001E13C038FF8FF014147E9319>
+I<13FCEA0387380E0180381C00C04813E0A24813F012F0A438E001E0A214C0130300F013
+8038700700EA380E6C5AEA07E014147D9317>I<EBE3E03807EC383801F01C6C487E140F
+48487E1580A53903800F00A2140E141E141C5C38074070EB61C0011FC7FC90C8FCA3120E
+A4121EEAFFC0191D809319>I<EBFC2038038260EA0702381E01E0123C003813C0127812
+F0A438E00380A212F0A21307127038380F00EA1C37EA07C7EA0007A3130EA4131EEBFFC0
+131D7D9318>I<EA038E381FB380EA07C71203EB8300EA078090C7FCA5120EA65A121EEA
+FFC011147E9312>I<EA01F9EA0607EA080312181301EA3802EA3C00121F13F0EA07FCEA
+01FEEA001FEA40071303A212601306EAF004EAC818EA87E010147F9312>I<1380EA0100
+A35A5A5A121EEAFFF8EA0E00A45AA65A1310A41320A2EA1840EA0F800D1C7C9B12>I<38
+1C0380EAFC1FEA3C07EA1C03A238380700A6EA700EA4131EA25BEA305E381F9F8011147B
+9319>I<38FF83F8381E00E0001C13C01480121E380E01005B13025B12075BA25BEA0390
+13A013E05B5B120190C7FC15147C9318>I<39FF9FE1FC393C078070391C030060148015
+401580EA0E0790380D81001309EB19C21311380F21C4EA0720EB40C814E8EB80F0A26C48
+5A1460000213401E147C9321>I<381FF0FF3803C0780001137014403800E0C0EBE180EB
+73001376133CA2131C132E134E1387EA0107380203801204380C01C0383C03E038FE07FC
+18147F9318>I<390FF83F803901E00E00EBC00C140813E000005B143014205C13705CA2
+0171C7FC1339133A133E133C133813181310A25BA25BEA70C0EAF08000F1C8FC12E61278
+191D809318>I E
+%EndDVIPSBitmapFont
+%DVIPSBitmapFont: Fk cmbx12 17.28 36
+/Fk 36 122 df<EB01C01303130F137FEA1FFFB5FC13BFEAE03F1200B3B1007FB512F0A3
+1C2E7AAD28>49 D<EB3FE03801FFFE0007EBFF80D80F8013C0391E003FE00038EB1FF000
+7CEB0FF8007EEB07FCB4FC018013FEA21403A2EA7F00003E1307C7FC15FCA2EC0FF8A215
+F0EC1FE015C0EC3F80EC7F00147E14F8495A495A495A49C7FC011E130E5B133849131E49
+131C485A48C7123C48B512FC5A5A5A4814F8B6FCA31F2E7CAD28>I<1578A215FCA34A7E
+A24A7EA24A7FA34A7FEC0E7F021E7FEC1C3FA202387F151F02787FEC700FA202E07F1507
+010180ECC003A249486C7EA201078191C7FC498191B6FCA24981011CC7123F013C810138
+141FA24981160F01F081491407A2484881486C1403B549B512FCA336317DB03D>65
+D<B712C016FC16FFD801FEC77FEE7FE0707E161F707EA2831607A4160FA25FA24C5A4C5A
+4C5A4B485ADB1FFEC7FC90B65AEEFF8049C7EA3FE0EE0FF0EE07FCA2707E83821880A718
+005E5F16074C5A4C5AEEFFF0B812C094C7FC16F831317DB039>I<913A03FF800180023F
+EBF00349B5EAFC0701079038003F0FD91FF8EB079FD93FC0EB01FFD9FF807F4848C8127F
+4848153F0007161F49150F485A001F1607A2485A1703127FA24992C7FCA212FFA9127FA2
+7FEF0380123FA26C7E1707000F17006C7E6D150E0003161E6C6C151C6C6C6C1478D93FC0
+5CD91FF8EB03E0D907FFEB3F800101D9FFFEC7FCD9003F13F80203138031317CB03A>I<
+B812E0A3C6903880007FEE0FF016031601A21600A21770A31738A21507A21700A35D5D5D
+91B5FCA3EC803F818181A592C8FCACB612C0A32D317EB033>70 D<DA03FF1303027FEBF0
+0749B5EAFC0F01079038007E1FD91FF0EB0FBFD97FC0EB03FF49487F4848C87E485A0007
+824848815B001F82A2484881A2127FA24992C7FC12FFAA0307B512F8127F7FDB00011300
+123FA26C7EA2120F7F6C7E12036C7E6C6C7E6D6C5BD91FF8497ED907FFEB3E3F01019038
+FFFC1F6D6CEBF00F0203EB800335317CB03F>I<B6D8807FB512C0A3C60180C7387FC000
+B391B7FCA30280C7127FB3A3B6D8807FB512C0A33A317EB03F>I<B61280A3C6EB8000B3
+B3A7B61280A319317EB01E>I<B56C49B512C08080C66D90390003E0006E6E5AEBEFFC13
+E780EBE3FF01E17F01E07F6E7E143F816E7E6E7E6E7E14036E7E16806E13C0ED7FE0ED3F
+F0151F16F8ED0FFCED07FEED03FF6F13818117C1EE7FE1EE3FF1EE1FF9EE0FFD160717FF
+828282177F173FA2171F170F486C1507B500E014031701A23A317EB03F>78
+D<B712E016FEEEFF80C6D9800013E0EE3FF0EE0FF8EE07FCA2EE03FEA217FFA717FEA2EE
+07FC17F8160FEE3FE0EEFFC091B6120016F80280C8FCB3A2B67EA330317EB037>80
+D<007FB8FCA39039C00FF801D87E00EC003F007C82007882A200708200F01780A3481603
+A5C792C7FCB3AA017FB6FCA331307DAF38>84 D<B6D88003B51280A3C60180C73807C000
+715AB3AE137F4DC7FC80013F150EA26D6C5C6D6C5C6D6C5C6D6C495A903A00FF801FC002
+3FB55A020F49C8FC020013E039317EB03E>I<B500FC91B5FCA3000390C8EA03C06C1780
+6E14076C170080017F150EA26E141E013F151C6E143C011F153880010F5D8001075DA26E
+130101035D6E13036D5D15806D4AC7FCA26F5A027F130EEDE01E023F131CEDF03C021F13
+3815F8020F5BA2EDFCF002075B15FF6E5BA26E5BA26E90C8FCA3157EA2153CA238317EB0
+3D>I<EBFFF0000313FF390F803F809038C00FE0486C6C7EA26E7ED80FC07FEA0780C7FC
+A414FF131FEBFFE33803FC03EA0FF0EA1FC0123FEA7F80A2EAFF00A31407A2387F800D39
+3FC01DFE3A1FE078FFF03907FFE07FC6EB803F24207E9F27>97 D<EA01F812FFA3120F12
+07ADEC3FE0ECFFFC9038FBE07F9039FF001F8049EB0FC04914E049EB07F016F8A2ED03FC
+A316FEA816FCA3ED07F8A216F06DEB0FE06D14C001E7EB3F809039C3C0FE00903880FFF8
+9038003FC027327EB12D>I<EB0FFF017F13C03901FC01F03803F0033907E007F8120FEA
+1FC0003FEB03F0EC01E04848C7FCA312FFA8127FA36C6C131CA2001F14386C7E00071470
+3903F001E03901FC07C039007FFF00EB0FF81E207D9F24>I<ED0FC0EC07FFA3EC007F15
+3FADEB07F8EB3FFF9038FE07BF3903F801FF3907E0007F120F4848133F123FA2485AA312
+FFA8127FA36C7EA2121F6C6C137F000714FF2603F00313E03A01FC0F3FFE38007FFEEB0F
+F027327DB12D>I<EB0FFC90387FFF803901FC0FC03903F003E03907E001F0000F14F839
+1FC000FC003F14FEA24848137E157FA212FFA290B6FCA20180C7FCA4127FA36C6C130712
+1F150E6C7E6C6C131C6C6C13783900FE03E090383FFFC0903807FE0020207E9F25>I<EB
+01FE90380FFF8090381FC3C090387F07E09038FE0FF0120113FC1203EC07E0EC018091C7
+FCA8B512FCA3D803FCC7FCB3A8387FFFF0A31C327EB119>I<90391FF007C09039FFFE3F
+E03A01F83F79F03907E00FC3000F14E19039C007E0E0001FECF000A2003F80A5001F5CA2
+000F5CEBE00F00075C2603F83FC7FC3806FFFE380E1FF090C9FC121EA2121F7F90B57E6C
+14F015FC6C806C801680000F15C0003FC7127F007EEC1FE0007C140F00FC1407A4007EEC
+0FC0003E1580003F141FD80FC0EB7E003907F803FC0001B512F0D8001F90C7FC242F7E9F
+28>I<EA01F812FFA3120F1207ADEC07F8EC3FFEEC783F02C013809039F9801FC0EBFB00
+01FE14E05BA35BB3B500C3B5FCA328327DB12D>I<EA03C0487E487E487EA46C5A6C5A6C
+5AC8FCA9EA01F8127FA31207B3A7B51280A311337DB217>I<EA01F812FFA3120F1207B3
+B3A6B512C0A312327DB117>108 D<2703F007F8EB1FE000FFD93FFEEBFFF8913A783F01
+E0FC02C090388300FE280FF1801FC6137F2607F30013CC01F602F8148001FC5CA3495CB3
+B500C3B5380FFFFCA33E207D9F43>I<3903F007F800FFEB3FFEEC783F02C013803A0FF1
+801FC03807F30001F614E013FCA35BB3B500C3B5FCA328207D9F2D>I<EB07FC90387FFF
+C03901FC07F03903F001F848486C7E4848137E001F147F003F158049133F007F15C0A300
+FF15E0A8007F15C0A36C6CEB7F80A2001F15006C6C13FE00075C3903F803F83901FE0FF0
+39007FFFC0D907FCC7FC23207E9F28>I<3901F83FE000FFEBFFFC9038FBE07F9039FF00
+3F80D80FFEEB1FC06C48EB0FE04914F0ED07F8A216FC1503A216FEA816FC1507A216F8A2
+ED0FF06D14E06DEB1FC06DEB3F809039FBC0FE009038F8FFF8EC3FC091C8FCABB512C0A3
+272E7E9F2D>I<3803F03F00FFEB7FC09038F1C3E01487390FF30FF0EA07F6A29038FC07
+E0EC03C091C7FCA25BB2B512E0A31C207E9F21>114 D<3801FF86000713FEEA1F00003C
+133E48131E140E12F8A36C90C7FCB47E13FC387FFFC06C13F0806C7F00077F00017FEA00
+3F01001380143F0060131F00E0130FA27E15007E6C131E6C131C38FF807838F3FFF038C0
+7F8019207D9F20>I<131CA5133CA3137CA213FC120112031207381FFFFEB5FCA2D803FC
+C7FCB0EC0380A71201EC0700EA00FEEB7F0EEB3FFCEB07F0192E7FAD1F>I<D801F8EB07
+E000FFEB03FFA3000FEB003F0007141FB3153FA20003147FA26C6CEBDFF03A00FE039FFF
+90387FFF1FEB0FFC28207D9F2D>I<B5EB1FFCA3D80FF8EB03C0000715806D1307000315
+007F0001140E7F6C5CA2EC803C017F1338ECC078013F1370ECE0F0011F5B14F1010F5B14
+F9903807FB80A214FF6D90C7FCA26D5AA26D5AA21478A226207E9F2B>I<B53A1FFFE03F
+F8A33C0FF000FE0007806D150300076EEB0700816D5D00039138FF800EA26C6C486D5A15
+DF01FF153C6C9039038FE038A2D97F876D5A150702C714F0D93FCF6D5AECCE03D91FFEEB
+F9C09138FC01FD16FF010F5D4A7EA26D486DC7FCA20103147E4A133EA26D48131C35207E
+9F3A>I<3A7FFF807FFCA33A03FC000F006C6C131E6C6C5BEC803890387FC078013F5B90
+381FE1E090380FF3C0ECFF806D90C7FC6D5A13016D7E81815B903803DFE09038078FF081
+90380F07FC90381E03FEEB3C01496C7E4914804848EB7FC00003EC3FE026FFFC01B5FCA3
+28207F9F2B>I<B5EB1FFCA3D80FF8EB03C0000715806D1307000315007F0001140E7F6C
+5CA2EC803C017F1338ECC078013F1370ECE0F0011F5B14F1010F5B14F9903807FB80A214
+FF6D90C7FCA26D5AA26D5AA21478A21470A214F05C1301007C5BEAFE035C49C8FC5BEAFC
+1EEA787CEA3FF0EA0FC0262E7E9F2B>I E
+%EndDVIPSBitmapFont
+%DVIPSBitmapFont: Fl cmsy10 10.95 1
+/Fl 1 14 df<14FF010713E090381F00F80178131E01E01307D80180EB018048C812C000
+061560481530A248151848150CA2481506A4481503A900601506A46C150CA26C15186C15
+30A26C15606C15C06C6CEB0180D800E0EB07000178131E011F13F8903807FFE0010090C7
+FC282B7EA02D>13 D E
+%EndDVIPSBitmapFont
+%DVIPSBitmapFont: Fm cmbx12 14.4 45
+/Fm 45 122 df<123C127FEAFF80A213C0A3127F123E1200A2EA0180A3EA0300A2120612
+0E5A5A12100A157B8813>44 D<121C127FA2EAFF80A3EA7F00A2121C09097B8813>46
+D<130E131E137EEA07FE12FFA212F81200B3ABB512FEA317277BA622>49
+D<EBFF80000713F04813FC381E03FE393800FF80007C133F00FE14C06C131F15E0140FA2
+127E003C131FC7FC15C0A2EC3F801500147E5C5C495A495AEB078049C7FC131E4913E013
+705B3901C001C0EA0380EA0600000FB5FC5A5A5AB61280A31B277DA622>I<EB7F803803
+FFF04813FC380F81FE381F007FEA3F80EC3F80A3121F1300C7EA7F00A2147E5C495AEB07
+F0EBFFC0A2EB01F8EB007E801580EC1FC0A215E0A2123C127EB4FCA215C0143F48148000
+7CEB7F00383F01FE6CB45A000713F0C613801B277DA622>I<140FA25C5C5C5C5BA2EB03
+BFEB073F130E131C133C1338137013E0EA01C0EA038012071300120E5A5A5A12F0B612F8
+A3C7EA7F00A890381FFFF8A31D277EA622>I<00181303381F801FEBFFFE5C5C5C14C091
+C7FC001CC8FCA7EB7FC0381DFFF8381F80FC381E003F1208C7EA1F8015C0A215E0A21218
+127C12FEA315C05A0078EB3F80A26CEB7F00381F01FE6CB45A000313F0C613801B277DA6
+22>I<EC0780A24A7EA34A7EA24A7EA3EC77F8A2ECF7FC14E3A2903801C1FEA201037F14
+80A249486C7EA24980010E133FA2496D7EA2013FB57EA39039700007F8A201F080491303
+000181491301A2000381D8FFFE013F13FCA32E297EA833>65 D<B612F815FF16C03A03F8
+001FE0ED0FF0ED07F8150316FCA21501A3150316F8A2ED07F0150FED1FC0EDFF8090B5EA
+FE00EDFFC09039F8000FF0ED03F8ED01FC16FE1500A216FFA616FE1501ED03FC1507ED1F
+F8B712E016C0EDFE0028297DA830>I<91387FE003903907FFFC07011FEBFF0F90397FF0
+0F9F9039FF0001FFD801FC7F4848147F4848143F4848141F485A160F485A1607127FA290
+C9FC5AA97E7F1607123FA26C7E160E6C7E6C6C141C6C6C143C6C6C14786CB4EB01F09039
+7FF007C0011FB512800107EBFE009038007FF028297CA831>I<B712E0A33903FC001FED
+07F01501A215001670A3913801C0781638A302031300A2140F90B5FCA3EBFC0F1403A202
+01130EA3161C91C7FCA3163C1638167816F815011503151FB712F0A327297EA82C>69
+D<B712C0A33903FC003FED0FE015031501A21500A316F0913801C070A316001403A2140F
+90B5FCA3EBFC0F1403A21401A491C8FCA9B512FCA324297EA82A>I<91387FE003903907
+FFFC07011FEBFF0F90397FF00F9F9039FF0001FFD801FC7F484880484880484880485A82
+485A82127FA290CAFC5AA892B512F87E7F03001300123FA26C7EA26C7E6C7E6C7E6C7E6C
+B45B90387FF007011FB5129F0107EBFE0F9039007FF0032D297CA835>I<B5D8F00FB5FC
+A3D803FCC7EA3FC0AF90B7FCA301FCC7123FB1B5D8F00FB5FCA330297EA835>I<B512F0
+A33803FC00B3B1B512F0A314297EA819>I<D8FFFE92383FFF80A26D5D0003EFE000A2D9
+BF8014EFA2D99FC0EB01CFA2D98FE0EB038FA3D987F0EB070FA2D983F8130EA2D981FC13
+1CA3D980FE1338A2027F1370A291383F80E0A391381FC1C0A291380FE380A2913807F700
+A3EC03FEA26E5AA26E5AD8FFFE0203B51280A2157039297DA840>77
+D<D8FFFCEC7FFF7F7F00036DEB01C080EBBFE0139F80EB8FF8EB87FCEB83FEEB81FF0180
+1380147F15C0EC3FE0EC1FF0EC0FF8EC07FC140315FEEC01FF6E1381ED7FC1ED3FE1ED1F
+F1150F16F9ED07FDED03FF8181167FA2163F161F160F1607D8FFFE14031601A230297EA8
+35>I<B612F815FF16C03A03FC003FE0ED07F0ED03F816FC150116FEA716FC150316F8ED
+07F0ED3FE090B61280EDFE0001FCC8FCB0B512F0A327297EA82E>80
+D<B612E015FE6F7E3A03FC003FE0ED0FF06F7E6F7E150182A65E4B5A1507ED0FE0ED3FC0
+90B500FEC7FCA29039FC00FF80ED3FC06F7E6F7E6F7EA9170EA21503923801FC1CB538F0
+00FEEE7FF8EE0FE02F297EA832>82 D<9038FF80600003EBF0E0000F13F8381F80FD383F
+001F003E1307481303A200FC1301A214007EA26C140013C0EA7FFCEBFFE06C13F86C13FE
+80000714806C14C0C6FC010F13E0EB007FEC1FF0140F140700E01303A46C14E0A26C1307
+6C14C0B4EB0F80EBE03F39E3FFFE0000E15B38C01FF01C297CA825>I<B500F0EBFFFEA3
+D803FCC7EA0380B3AA0001ED07007F0000150E137F6D143CD91FC05B90390FF003F06DB5
+5A01001480DA1FFCC7FC2F297EA834>85 D<B500F0EB7FFFA3D803FEC7EA01C00001ED03
+80A26D14076C16006E5B017F140E80013F5CA26E133C011F14386E1378010F1470800107
+5CA26D6C485AA2ECFE0301015CECFF076D91C7FC1587EC7F8EA215DEEC3FDC15FC6E5AA2
+6E5AA36E5AA26E5AA230297FA833>I<B53CE07FFFE01FFFC0A32803FC0003FCC7EA7000
+A26D6D7E000160A26D6E13016C604B138002801503017F5F4B13C0D93FC0013F49C7FCA2
+913AE00E1FE00F011F160E17F09126F01C0F131E010F161C033C13F8902707F838075BA2
+037813FC902703FC70035BA2913AFEE001FEF001015E02FF14FF4B7E6D5EA26E486D5AA3
+6EC76CC8FCA2023E80021E141EA242297FA845>I<3803FF80000F13F0381F01FC383F80
+FE147F801580EA1F00C7FCA4EB3FFF3801FC3FEA0FE0EA1F80EA3F00127E5AA4145F007E
+13DF393F839FFC381FFE0F3803FC031E1B7E9A21>97 D<EAFFE0A3120FACEBE1FE9038EF
+FF809038FE07E09038F803F09038F001F89038E000FCA2157EA2157FA8157EA315FCA290
+38F001F89038F803F090389C0FE090380FFF80390E01FC00202A7EA925>I<EB3FF03801
+FFFC3803F03E380FC07FEA1F80EA3F00A248133E007E90C7FCA212FEA7127EA2127F6CEB
+03801380001FEB0700380FE00E3803F83C3801FFF838003FC0191B7E9A1E>I<EC7FF0A3
+1407ACEB3F873801FFF73807F03F380FC00F381F8007EA3F00A2127EA312FEA8127EA27E
+A2381F800F380FC01F3907E07FFF3801FFE738007F87202A7EA925>I<EB3FC03801FFF0
+3803E07C380F803E001F7F130048EB0F80127E15C0A200FE1307A2B6FCA248C8FCA3127E
+A2127F6CEB01C07E390F8003803907C007003803F01E3800FFFCEB3FE01A1B7E9A1F>I<
+EB07F8EB3FFCEB7E3E3801FC7FEA03F813F01207143E1400A7B512C0A33807F000B3A338
+7FFF80A3182A7EA915>I<9038FF80F00003EBE3F8390FC1FE1C391F007C7C48137E003E
+EB3E10007EEB3F00A6003E133E003F137E6C137C380FC1F8380BFFE00018138090C8FC12
+38A2123C383FFFF814FF6C14C06C14E06C14F0121F383C0007007CEB01F8481300A4007C
+EB01F0A2003FEB07E0390FC01F806CB5120038007FF01E287E9A22>I<EAFFE0A3120FAC
+147E9038E1FF809038E30FC001E413E0EBE80701F813F013F0A213E0B039FFFE3FFFA320
+2A7DA925>I<1207EA0F80EA1FC0EA3FE0A3EA1FC0EA0F80EA0700C7FCA7EAFFE0A3120F
+B3A3EAFFFEA30F2B7EAA12>I<EAFFE0A3120FB3B2EAFFFEA30F2A7EA912>108
+D<26FFC07FEB1FC0903AC1FFC07FF0903AC307E0C1F8D80FC49038F101FC9039C803F200
+01D801FE7F01D05BA201E05BB03CFFFE3FFF8FFFE0A3331B7D9A38>I<38FFC07E9038C1
+FF809038C30FC0D80FC413E0EBC80701D813F013D0A213E0B039FFFE3FFFA3201B7D9A25
+>I<EB3FE03801FFFC3803F07E390FC01F80391F800FC0393F0007E0A2007EEB03F0A300
+FE14F8A8007E14F0A26CEB07E0A2391F800FC0390FC01F803907F07F003801FFFC38003F
+E01D1B7E9A22>I<38FFE1FE9038EFFF809038FE0FE0390FF803F09038F001F801E013FC
+140015FEA2157FA8157E15FEA215FC140101F013F89038F807F09038FC0FE09038EFFF80
+9038E1FC0001E0C7FCA9EAFFFEA320277E9A25>I<38FFC1F0EBC7FCEBC63E380FCC7F13
+D813D0A2EBF03EEBE000B0B5FCA3181B7F9A1B>114 D<3803FE30380FFFF0EA3E03EA78
+00127000F01370A27E00FE1300EAFFE06CB4FC14C06C13E06C13F0000713F8C6FCEB07FC
+130000E0137C143C7E14387E6C137038FF01E038E7FFC000C11300161B7E9A1B>I<13E0
+A41201A31203A21207120F381FFFE0B5FCA2380FE000AD1470A73807F0E0000313C03801
+FF8038007F0014267FA51A>I<39FFE07FF0A3000F1307B2140FA2000713173903F067FF
+3801FFC738007F87201B7D9A25>I<39FFFC03FFA3390FF000F0000714E07F0003EB01C0
+A2EBFC0300011480EBFE070000140013FFEB7F0EA2149EEB3F9C14FC6D5AA26D5AA36D5A
+A26D5AA2201B7F9A23>I<3BFFFC7FFC1FFCA33B0FE00FE001C02607F007EB0380A201F8
+EBF00700031600EC0FF801FC5C0001150EEC1FFC2600FE1C5B15FE9039FF387E3C017F14
+38EC787F6D486C5A16F0ECE01F011F5CA26D486C5AA2EC800701075CA22E1B7F9A31>I<
+39FFFC1FFEA33907F003803803F8079038FC0F003801FE1E00005BEB7F3814F86D5A6D5A
+130F806D7E130F497EEB3CFEEB38FFEB787F9038F03F803901E01FC0D803C013E0EB800F
+39FFF03FFFA3201B7F9A23>I<39FFFC03FFA3390FF000F0000714E07F0003EB01C0A2EB
+FC0300011480EBFE070000140013FFEB7F0EA2149EEB3F9C14FC6D5AA26D5AA36D5AA26D
+5AA25CA21307003890C7FCEA7C0FEAFE0E131E131C5BEA74F0EA3FE0EA0F8020277F9A23
+>I E
+%EndDVIPSBitmapFont
+%DVIPSBitmapFont: Fn cmtt10 10.95 75
+/Fn 75 127 df<127012F8B012701200A5127012F8A31270051C779B18>33
+D<EA4010EAE038EAF078EAE038AAEA60300D0E7B9C18>I<EA0306EA078FA6387FFFC0B5
+12E0A26C13C0380F1E00A6387FFFC0B512E0A26C13C0381E3C00A6EA0C18131C7E9B18>
+I<13C01201A3EA03F0EA0FFCEA3FFEEA7DCFEA71C738E1C38013C7A338F1C0001279123F
+6C7EEA0FF8EA01FC13DE13CF13C73861C38012F1A212E1EBC7001271EA79DEEA3FFEEA1F
+F8EA07E0EA01C0A3120011247D9F18>I<EA3803387C0780A2EAEE0F1400A25B131EA213
+3EEA7C3CA2EA387CEA0078A213F85B12015BA212035BA21207EB8380EB87C0120FEB0EE0
+A2121F121EA2123E383C07C0A23818038013247E9F18>I<EA01C0EA07E0487EEA0E7048
+7EA4EB73F813F313E3380FC1C0EBC38013831303381F0700EA3F87EA7B8EEA71CEEAE1FC
+12E0137CEB7870A2EA70FE387FFFE0EA3FC7380F03C0151C7F9B18>I<1238127CA2127E
+123E120EA3121CA2123812F812F012C0070E789B18>I<137013F0EA01E0EA03C0EA0780
+EA0F00121E121C5AA25AA45AA81270A47EA27E121E7EEA0780EA03C0EA01F0120013700C
+24799F18>I<126012F012787E7E7EEA07801203EA01C0A2EA00E0A41370A813E0A4EA01
+C0A2EA03801207EA0F00121E5A5A5A12600C247C9F18>I<EA01C0A4EA41C138F1C780EA
+FDDF387FFF00EA1FFCEA07F0A2EA1FFCEA7FFF38FDDF80EAF1C73841C100EA01C0A41114
+7D9718>I<136013F0A7387FFFC0B512E0A26C13C03800F000A7136013147E9718>I<121C
+123E127E127F123F121F1207120E121E127C12F81260080C788518>I<387FFFC0B512E0
+A26C13C013047E8F18>I<1230127812FCA2127812300606778518>I<1303EB0780A2130F
+14005B131EA2133E133C137C1378A213F85B12015B12035BA212075B120F90C7FCA25A12
+1E123E123CA2127C127812F85AA2126011247D9F18>I<EA01F0EA07FC487EEA1F1FEA1C
+0738380380007813C0EA7001A238E000E0A9EAF001007013C0A2EA780300381380381C07
+00EA1F1FEA0FFE6C5AEA01F0131C7E9B18>I<EA01801203A21207120F123F12FF12FB12
+431203B0EA7FFCEAFFFEEA7FFC0F1C7B9B18>I<EA03F0EA0FFEEA3FFF387C0F80387003
+C0EAE00138F000E0A21260C7FCA2EB01C0A21303EB0780EB0F00131E5B5B5B485AEA07C0
+485A381E00E05AEA7FFFB5FC7E131C7E9B18>I<131F5B1377A213E7120113C7EA038712
+071307120E121E123C1238127812F0B512F8A338000700A6EB7FF0A3151C7F9B18>52
+D<137E48B4FC00071380380F83C0EA1E03121C3838018090C7FC5AA2EAE1F8EAE7FEB5FC
+38FE078038F803C0EAF001EB00E05AA21270A3383801C0EA3C03381E0780380FFF006C5A
+EA01F8131C7E9B18>54 D<1230127812FCA2127812301200A81230127812FCA212781230
+0614779318>58 D<1218123C127EA2123C12181200A81218123C127EA2123E121E120E12
+1C123C127812F01260071A789318>I<14C0EB03E01307EB1FC0EB3F80EBFE00485AEA07
+F0485AEA3F8048C7FC12FCA2127F6C7EEA0FE06C7EEA01FC6C7EEB3F80EB1FC0EB07E013
+03EB00C013187E9918>I<387FFFC0B512E0A26C13C0C8FCA4387FFFC0B512E0A26C13C0
+130C7E9318>I<126012F87E127F6C7EEA0FE06C7EEA01FC6C7EEB3F80EB1FC0EB07E0A2
+EB1FC0EB3F80EBFE00485AEA07F0485AEA3F8048C7FC12FC5A126013187E9918>I<EA0F
+F0EA3FFC48B4FCEA700F38F00380A2EA600738000F00133E5BEA01F05B485AA55BC8FCA5
+EA0380487EA36C5A111C7D9B18>I<137013F8A213D8A2EA01DCA3138CEA038EA4EA0707
+A5380FFF80A3EA0E03381C01C0A3387F07F000FF13F8007F13F0151C7F9B18>65
+D<EA7FF8EAFFFE6C7E381C0F80EB03C0A2EB01E01300A214F01470A814F014E0A2130114
+C01303EB0F80387FFF00485AEA7FF8141C7F9B18>68 D<B512F0A3381C0070A41400A213
+0EA3EA1FFEA3EA1C0EA390C7FCA21438A5B512F8A3151C7F9B18>I<B512F8A3381C0038
+A41400A21307A3EA1FFFA3EA1C07A390C7FCA7EAFFC0A3151C7F9B18>I<387F07F038FF
+8FF8387F07F0381C01C0A9EA1FFFA3EA1C01AA387F07F038FF8FF8387F07F0151C7F9B18
+>72 D<EA7FFFB512806C1300EA01C0B3A4EA7FFFB512806C1300111C7D9B18>I<EAFFC0
+A3001CC7FCB114E0A5B5FCA3131C7E9B18>76 D<387E07F038FF0FF8387F07F0381D81C0
+A313C1121CA213E1A313611371A213311339A31319A2131D130DA3EA7F07EAFF87EA7F03
+151C7F9B18>78 D<EA0FFE383FFF804813C0EA7803EA700100F013E0EAE000B0EAF00100
+7013C0EA7C07EA7FFF6C1380380FFE00131C7E9B18>I<EAFFFEEBFF8014C0EA1C03EB01
+E013001470A514E01301EB03C0EA1FFF1480EBFE00001CC7FCA8B47EA3141C7F9B18>I<
+EA7FF8EAFFFE6C7E381C0F80130314C01301A313031480130F381FFF005BA2EA1C0F7FEB
+0380A5149CA3387F01F8EAFF81387F00F0161C7F9B18>82 D<3803F1C0EA1FFF5AEA7C0F
+EA7003EAE001A390C7FC12701278123FEA1FF0EA07FEC67EEB0F80EB03C01301EB00E0A2
+126012E0130100F013C038F80780B5FCEBFE00EAE7F8131C7E9B18>I<387FFFF8B5FCA2
+38E07038A400001300B2EA07FFA3151C7F9B18>I<38FF83FEA3381C0070B36C13E0EA0F
+01380783C03803FF806C1300EA007C171C809B18>I<38FE03F8EAFF07EAFE03381C01C0
+EA1E03000E1380EA0F0700071300A2EA038EA2EA01DCA3EA00F8A21370A9EA01FC487E6C
+5A151C7F9B18>89 D<EAFFF8A3EAE000B3ACEAFFF8A30D24779F18>91
+D<126012F0A27E1278127C123CA2123E121E121F7EA27F12077F1203A27F12017F12007F
+1378A2137C133C133E131EA2131F7F14801307A2EB030011247D9F18>I<EAFFF8A3EA00
+38B3ACEAFFF8A30D247F9F18>I<EA0180EA07C0EA1FF0EA7EFCEAF83EEAE00E0F067C9B
+18>I<387FFFC0B512E0A26C13C013047E7F18>I<1206121E123E12381270A212E0A312F8
+12FC127CA21238070E789E18>I<EA0FF0EA1FFC487EEA3C0FEA180738000380A213FF12
+07121FEA7F03127812E0A3EAF007EA780F383FFFF8EA1FFDEA07F015147E9318>I<127E
+12FE127E120EA5133EEBFF80000F13C0EBC1E01380EB0070120E1438A6000F1370A2EB80
+E013C1EBFFC0000E138038063E00151C809B18>I<EA01FEEA07FF001F1380EA3E073838
+030048C7FCA25AA61270EB01C01238EA3E03381FFF8000071300EA01FC12147D9318>I<
+EB1F80133F131F1303A5EA03E3EA0FFBEA1FFFEA3C1FEA380FEA7007130312E0A6EA7007
+A2EA380FEA3C1F381FFFF0380FFBF83803E3F0151C7E9B18>I<EA01F0EA07FCEA1FFEEA
+3E0F38380780EA7003A238E001C0A2B5FCA300E0C7FC1270EB01C01238EA3E07381FFF80
+00071300EA01F812147D9318>I<EB1F80EB7FC0EBFFE013E13801C0C01400A3387FFFC0
+B5FCA23801C000AEEA7FFFA3131C7F9B18>I<3801E1F03807FFF85A381E1E30381C0E00
+487EA5EA1C0EEA1E1EEA1FFC5BEA39E00038C7FC7EEA1FFEEBFFC04813E0387801F03870
+0070481338A4007813F0EA7E03381FFFC06C13803801FC00151F7F9318>I<127E12FE12
+7E120EA5133EEBFF80000F13C013C1EB80E01300120EAB387FC7FC38FFE7FE387FC7FC17
+1C809B18>I<EA0380EA07C0A3EA0380C7FCA4EA7FC012FF127F1201AEB5FCA3101D7C9C
+18>I<EAFFC0A31201B3A4B51280A3111C7D9B18>108 D<38F9C1C038FFF7F013FF383E3E
+38EA3C3CA2EA3838AB38FE3E3EEB7E7EEB3E3E1714809318>I<EA7E3E38FEFF80007F13
+C0EA0FC1EB80E01300120EAB387FC7FC38FFE7FE387FC7FC1714809318>I<EA01F0EA0F
+FE487E383E0F80EA3803387001C0A238E000E0A5EAF001007013C0EA7803383C0780EA3E
+0F381FFF006C5AEA01F013147E9318>I<EA7E3E38FEFF80007F13C0380FC1E01380EB00
+70120E1438A6000F1370A2EB80E013C1EBFFC0000E1380EB3E0090C7FCA7EA7FC0487E6C
+5A151E809318>I<3801F380EA07FBEA1FFFEA3E1FEA380FEA7007A2EAE003A6EA7007A2
+EA380FEA3C1FEA1FFFEA0FFBEA03E3EA0003A7EB1FF0EB3FF8EB1FF0151E7E9318>I<38
+FF0FC0EB3FE0EB7FF0EA07F0EBE060EBC0005BA290C7FCA9EAFFFC7F5B14147E9318>I<
+EA07F7EA3FFF5AEA780FEAE007A3007CC7FCEA7FE0EA1FFCEA03FEEA001F38600780EAE0
+03A212F038F80F00B5FC13FCEAE7F011147D9318>I<487E1203A4387FFFC0B5FCA23803
+8000A9144014E0A33801C1C013FF6C1380EB3E0013197F9818>I<387E07E0EAFE0FEA7E
+07EA0E00AC1301EA0F033807FFFC6C13FE3801FCFC1714809318>I<387F8FF000FF13F8
+007F13F0381C01C0380E0380A338070700A3138FEA038EA3EA01DCA3EA00F8A213701514
+7F9318>I<38FF07F8138F1307383800E0A4381C01C0137113F9A213D9EA1DDD000D1380
+A3138DEA0F8FA23807070015147F9318>I<387F8FF0139F138F380F0700EA078EEA039E
+EA01DC13F81200137013F07FEA01DCEA039E138EEA0707000E1380387F8FF000FF13F800
+7F13F015147F9318>I<387F8FF000FF13F8007F13F0380E01C0EB0380A21207EB0700A2
+EA0387A2138EEA01CEA213CC120013DC1378A31370A313F05B1279EA7BC0EA7F806CC7FC
+121E151E7F9318>I<383FFFF05AA2387001E0EB03C0EB078038000F00131E5B13F8485A
+EA03C0485A380F0070121E5A5AB512F0A314147F9318>I<EB07E0131F137FEB780013E0
+AB1201EA7FC0485AA26C7EEA01E01200AB1378EB7FE0131F130713247E9F18>I<126012
+F0B3B012600424769F18>I<127CB4FC13C01203C67EAB7FEB7FC0EB3FE0A2EB7FC0EBF0
+005BABEA03C012FF90C7FC127C13247E9F18>I<EA060CEA1F1EEA3FBEEAFBF8EAF1F0EA
+60C00F067C9B18>I E
+%EndDVIPSBitmapFont
+%DVIPSBitmapFont: Fo cmr10 10.95 75
+/Fo 75 123 df<90381F83E09038F06E303901C07878380380F8903800F03048EB7000A7
+B612803907007000B2383FE3FF1D20809F1B>11 D<133FEBE0C0EA01C0380381E0EA0701
+A290C7FCA6B512E0EA0700B2383FC3FC1620809F19>I<EB3FE013E0EA01C1EA0381EA07
+00A8B5FCEA0700B2383FE7FC1620809F19>I<90381F81F89038F04F043901C07C063903
+80F80FEB00F05A0270C7FCA6B7FC3907007007B23A3FE3FE3FE02320809F26>I<EA7038
+EAF87CEAFC7EA2EA743AEA0402A3EA0804A2EA1008A2EA2010EA40200F0E7F9F17>34
+D<127012F812FCA212741204A31208A21210A212201240060E7C9F0D>39
+D<13401380EA01005A12061204120C5AA212381230A212701260A412E0AC1260A4127012
+30A212381218A27E120412067E7EEA008013400A2E7BA112>I<7E12407E12307E120812
+0C7EA212077EA213801201A413C0AC1380A412031300A25A1206A25A120812185A12205A
+5A0A2E7EA112>I<127012F012F8A212781208A31210A31220A21240050E7C840D>44
+D<EAFFF0A20C02808A0F>I<127012F8A3127005057C840D>I<EA03F0EA0E1C487EEA1806
+EA380738700380A400F013C0AD00701380A3EA780700381300EA1806EA1C0E6C5AEA03F0
+121F7E9D17>48 D<13801203120F12F31203B3A6EA07C0EAFFFE0F1E7C9D17>I<EA03F0
+EA0C1CEA100E487E00401380128000F013C0EAF803A3EA200712001480A2EB0F00130E5B
+5B5B13605B485A48C7FC000613405A5A00101380EA3FFF5AB5FC121E7E9D17>I<EA03F0
+EA0C1CEA100EEA200F007813801307A2EA380F12001400A2131E131C1370EA07F0EA003C
+130E130FEB0780A214C0122012F8A300F013801240EB0F00EA200EEA183CEA07F0121F7E
+9D17>I<1306A2130EA2131E132EA2134E138EA2EA010E1202A212041208A212101220A2
+124012C0B512F038000E00A7EBFFE0141E7F9D17>I<EA1803EA1FFE5B5B13E00010C7FC
+A6EA11F0EA161CEA180EEA10071480EA0003A214C0A3127012F0A200E013801240EB0700
+EA20066C5AEA0838EA07E0121F7E9D17>I<137CEA0182EA0701380E0380EA0C07121838
+38030090C7FC12781270A2EAF1F0EAF21CEAF406EAF807EB0380A200F013C0A51270A214
+801238EB07001218EA0C0E6C5AEA01F0121F7E9D17>I<1240387FFFE014C0A238400080
+38800100A21302485AA25B5BA25BA21360A213E05B1201A41203A76C5A131F7E9D17>I<
+EA03F0EA0C0CEA1006EA3003382001801260A3127038780300123EEA3F06EA1FC8EA0FF0
+EA03F8487EEA0C7EEA103F38300F80EA6007EB01C012C01300A31480EA600100201300EA
+1002EA0C0CEA03F0121F7E9D17>I<EA03F0EA0E18487E487E13071270EB038012F0A214
+C0A5EA7007A21238EA180BEA0E13EA03E338000380A3EB07001230EA7806130EEA700CEA
+2018EA1070EA0FC0121F7E9D17>I<127012F8A312701200AA127012F8A3127005147C93
+0D>I<127012F8A312701200AA127012F012F8A212781208A31210A31220A21240051D7C
+930D>I<5B497EA3497EA3EB09E0A3EB10F0A3EB2078A3497EA2EBC03EEB801EA248B5FC
+EB000FA20002EB0780A348EB03C0A2120C001E14E039FF801FFE1F207F9F22>65
+D<B512E0380F0078141EA2801580A515005C141E147CEBFFF0EB007C141FEC0F80EC07C0
+140315E0A515C014071580EC0F00143EB512F01B1F7E9E20>I<90380FE0109038381C30
+9038E002703803C00139078000F048C71270121E15305A1510127C127800F81400A91278
+007C1410123CA26C1420A27E6C6C13406C6C13803900E00300EB380CEB0FF01C217E9F21
+>I<B512F83807801EEC0780EC03C0EC01E0EC00F015701578A2153CA3153EA8153CA215
+7C1578A215F0EC01E0EC03C0EC0780EC1E00B512F81F1F7F9E23>I<B61280380F000F14
+031401140015C01540A314401500A214C0130113FF130113001440A3EC0020A31540A315
+C01401EC0380140FB6FC1B1F7E9E1F>I<B61280380780071401A2140015C01540A4EC20
+00A3146014E013FF138014601420A391C7FCA87FEAFFFE1A1F7F9E1E>I<90380FE01090
+38381C309038E002703803C00139078000F048C71270121E15305A1510127C127800F814
+00A7EC3FFEEC01F000781300127C123CA27EA27E6C7E3903C001703900E002309038380C
+1090380FF0001F217E9F24>I<39FFF07FF8390F000780AD90B5FCEB0007AF39FFF07FF8
+1D1F7E9E22>I<EAFFF0EA0F00B3ABEAFFF00C1F7E9E10>I<3807FFC038003E00131EB3A3
+122012F8A3EAF01CEA403CEA6038EA1070EA0FC012207F9E17>I<EAFFF8EA0F8090C7FC
+B21402A414061404A2140C141C147CB512FC171F7E9E1C>76 D<B46CEB07FE000715C0A2
+D805C0130BA2D804E01313A301701323A26D1343A36D1383A290380E0103A3EB0702A3EB
+0384A2EB01C8A3EB00F0A21460121FD8FFE0EB7FFE271F7F9E2A>I<B4EB0FF8390F8003
+E0EC0080EA0BC0EA09E0A2EA08F01378A27F7FA27FEB0780A2EB03C0EB01E0A2EB00F014
+78A2143C141EA2140F1407A214031401123E38FF80001D1F7E9E22>I<EB1FE0EB703838
+01C00E48487E39070003804814C0001EEB01E048EB00F0A2007C14F8A20078147800F814
+7CA900781478007C14F8A2003C14F0003E1301001E14E06CEB03C06C1480390380070038
+01E01E38007038EB1FE01E217E9F23>I<B512E0380F007C141E80EC0780A215C0A41580
+A2EC0F00141E147CEBFFE090C8FCAEEAFFF01A1F7E9E1F>I<EB1FE0EB70383801C00E48
+487E39070003804814C0001EEB01E0003E14F0003C1300007C14F8A20078147800F8147C
+A900781478007C14F8A2003C14F0383E0781391E0841E0390F1023C00007148039039017
+003801D01E3900783804EB1FF8EB001CEC0C0CEC0E1CEC0FF8A2140715F0EC01E01E297E
+9F23>I<B57E380F00F0143C8080A21580A41500A2141E5C14F0EBFF80EB01C0EB0070A2
+80143CA3143EA31504143F141FEC0F0839FFF00788C7EA01F01E207E9E21>I<3803F040
+380C0CC0EA1803EA3001EA6000A212E01440A36C13007E127CEA7F80EA3FF86CB4FC0007
+1380C613C0EB1FE013031301EB00F014707EA46C136014E06C13C038F8018038C60300EA
+81FC14217E9F19>I<007FB512E038780F010060EB006000401420A200C0143000801410
+A400001400B3497E3803FFFC1C1F7E9E21>I<39FFF00FF8390F0003E0EC0080B3A46CEB
+01001380120314026C6C5A6C6C5AEB3830EB0FC01D207E9E22>I<39FFF003FE391F8000
+F86CC7126015206C6C1340A36C6C1380A2EBE00100011400A23800F002A213F8EB7804A2
+6D5AA36D5AA2131F6D5AA2EB07C0A36D5AA36DC7FC1F207F9E22>I<3BFFF07FF81FF03B
+1F000FC007C06C903907800180170015C001805C00071502EC09E013C000035DEC19F014
+10D801E05CA2EC2078D800F05CA2EC403C01785CA2EC801E017C1460013C144090383D00
+0F133F6D5CA2011E1307010E91C7FCA2010C7F010413022C207F9E2F>I<12FFA212C0B3
+B3A512FFA2082D7CA10D>91 D<EA0804EA1008EA2010A2EA4020A2EA8040A3EAB85CEAFC
+7EA2EA7C3EEA381C0F0E7A9F17>I<12FFA21203B3B3A512FFA2082D80A10D>I<12081210
+1220A21240A21280A312B812FCA2127C1238060E7D9F0D>96 D<EA1FE0EA3030EA781813
+1CEA300E1200A313FEEA078EEA1E0E1238127800F01310A3131E127838386720380F83C0
+14147E9317>I<121C12FC121CAA137CEA1D87381E0180EB00C0001C13E01470A21478A6
+147014F014E0001E13C0381A018038198700EA107C15207E9F19>I<EA01FCEA0706EA1C
+0F123813060078C7FC127012F0A61270127800381380A2381C0100EA0706EA01F811147F
+9314>I<EB01C0130F1301AAEA01F1EA070DEA0C03EA180112381278127012F0A61270A2
+1238EA1803120CEA070D3801F1F815207F9F19>I<EA03F0EA0E1C487E487EA21270EB03
+8012F0A2B5FC00F0C7FCA31270A26C1380A2381C0100EA0706EA01F811147F9314>I<13
+7CEA01C6EA030F1207EA0E061300A7EAFFF0EA0E00B2EA7FE01020809F0E>I<14E03803
+E330EA0E3CEA1C1C38380E00EA780FA5EA380E6C5AEA1E38EA33E00020C7FCA21230A2EA
+3FFE381FFF8014C0383001E038600070481330A4006013606C13C0381C03803803FC0014
+1F7F9417>I<121C12FC121CAA137C1386EA1D03001E1380A2121CAE38FF8FF014207E9F
+19>I<1238127CA31238C7FCA6121C12FC121CB1EAFF80091F7F9E0C>I<13E0EA01F0A3EA
+00E01300A61370EA07F012001370B3A31260EAF06013C0EA6180EA3F000C28829E0E>I<
+121C12FC121CAAEB1FE0EB0780EB060013045B5B5B136013E0EA1DF0EA1E70EA1C38133C
+131C7F130F7F148014C038FF9FF014207E9F18>I<121C12FC121CB3ABEAFF8009207F9F
+0C>I<391C3E03E039FCC30C30391D039038391E01E01CA2001C13C0AE3AFF8FF8FF8021
+147E9326>I<EA1C7CEAFC86EA1D03001E1380A2121CAE38FF8FF014147E9319>I<EA01F8
+EA070E381C0380383801C0A2387000E0A200F013F0A6007013E0A2383801C0A2381C0380
+38070E00EA01F814147F9317>I<EA1C7CEAFD87381E018014C0381C00E014F014701478
+A6147014F014E0381E01C0EB0380381D8700EA1C7C90C7FCA8B47E151D7E9319>I<3801
+F04038070CC0EA0E02EA1C03EA38011278127012F0A6127012781238EA1C03EA0C05EA07
+09EA01F1EA0001A8EB0FF8151D7F9318>I<EA1CF0EAFD18EA1E3CA21318EA1C00AEEAFF
+C00E147E9312>I<EA0FC8EA3038EA6018EAC008A3EAE000127CEA3FE0EA1FF0EA07F8EA
+003CEA800E130612C0A21304EAE00CEAD818EA87E00F147F9312>I<1202A31206A2120E
+A2123EEAFFF8EA0E00AB1304A5EA07081203EA01F00E1C7F9B12>I<381C0380EAFC1FEA
+1C03AE1307120CEA061B3803E3F014147E9319>I<38FF83F8383E00E0001C13C06C1380
+A338070100A21383EA0382A2EA01C4A213E4EA00E8A21370A3132015147F9318>I<39FF
+9FE1FC393C078070391C030060EC8020000E1440A214C0D80704138014E0A23903886100
+1471A23801D032143A143E3800E01CA2EB6018EB40081E147F9321>I<38FF87F8381E03
+C0380E0180EB0300EA0702EA0384EA01C813D8EA00F01370137813F8139CEA010E1202EA
+060738040380000C13C0003C13E038FE07FC16147F9318>I<38FF83F8383E00E0001C13
+C06C1380A338070100A21383EA0382A2EA01C4A213E4EA00E8A21370A31320A25BA3EAF0
+80A200F1C7FC1262123C151D7F9318>I<EA7FFFEA700E1260EA401C133813781370EA00
+E0120113C0EA038012071301120E121EEA1C03EA3802EA7006130EEAFFFE10147F9314>
+I E
+%EndDVIPSBitmapFont
+%DVIPSBitmapFont: Fp cmbx12 20.736 13
+/Fp 13 122 df<DB1FFC14C00203B5EAC001021FECF003027FECFC07903B01FFFC00FE0F
+010701C0EB1F9F4948C7EA07FFD93FF880494814004948157F485B4A153F4890C9121F48
+5A000F170F5B001F1707A2485A1803A2127FA24993C8FCA212FFAA041FB61280127FA27F
+DC0001EBC000123FA36C7EA26C7EA26C7E7E6C7F806C7F6D6C5CEB3FFCD90FFF5C6D01C0
+EB1FBF010101FCEBFF1F6D6CB5EAFE0F021FECF8030203ECE0009126001FFEC9FC413D7B
+BB4C>71 D<B6D8F803B612E0A426007FF0C70001EBC000B3A491B8FCA402F0C71201B3A7
+B6D8F803B612E0A4433B7CBA4C>I<B612FEA426007FF0C9FCB3ADEF03C0A517071880A3
+170FA3171FA2173F177F17FF5E04071300163FB9FCA4323B7DBA3A>76
+D<B500F00207B512E0808080D8007F92390007E0006E6F5A81017B7F81137901787F6E7E
+6E7E81141F6E7E6E7F6E7F82806E7F6F7E6F7E826F7E816F13806F13C017E06F13F081EE
+7FF8EE3FFC17FEEE1FFF827013837013C318E37013F382EF7FFBEF3FFFA283838383A283
+83187F183FA201FC161FB500FC150F18071803A2433B7CBA4C>78
+D<B600F80107B512E0A426007FF0C83807E000725AB3B3A3013F4C5AA280011F4CC7FCA2
+6D6C151E0107163E6E5D6D6C5D6D6D13019026007FE0EB0FE0DA3FFCEB7FC0020FB65A02
+034AC8FCDA007F13F003071380433C7DBA4A>85 D<EB3FFE48B512E0000714F8390FE007
+FC9038F001FE486C6C7E6F7E82153F6C48806C5A6C5AC8FCA491B5FC131F90387FF83F38
+03FF803807FC00EA0FF0485A123F485AA2485AA4157F6C7E15DF3A3FE0039FF03B1FF80F
+0FFFE03807FFFE0001497E39003FE0002B267DA52F>97 D<13FE12FFA412071203B04AB4
+FC021F13F0027F13FC9138FC03FE9039FFF000FF02C0EB3F8091C7EA1FC04915E0EE0FF0
+17F8A2EE07FCA317FEA917FCA3160F17F817F0161F6D15E06EEB3FC06EEB7F80D9F9E0EB
+FF009039F0FC07FE91387FFFF8D9E01F13E09026C003FEC7FC2F3C7DBB36>I<EA01E0EA
+07F8487EA2487EA46C5AA26C5AEA01E0C8FCAB13FE127FA412071203B3AAB512F0A4143D
+7DBC1A>105 D<903801FFC0010F13F8017F13FFD9FF807F3A03FE003FE0D807F8EB0FF0
+48486D7EA248486D7E003F81A248486D7EA400FF1680A9007F1600A36C6C495AA2001F5D
+6D1307000F5D6C6C495AD803FEEB3FE03A00FF80FF806DB5C7FC010F13F8010113C02926
+7DA530>111 D<3901FC03F000FFEB0FFC4AB4FC91383C3F80EC707F00079038E0FFC000
+035BEBFD80A201FFEB7F809138003F00151E92C7FC5BB3A3B512FCA422267DA528>114
+D<90383FF0383903FFFE7848EBFFF8381FC00F383F0003003E13005A157812FCA27E6C14
+0013C013FC387FFFF06C13FEECFF806C14C06C14E0000314F0C614F8011F13FCEB007FEC
+07FE0070130100F01300157E7EA27E157C6C14FC6C14F890388001F09038F00FE000F9B5
+12C0D8F07F130038C01FF81F267DA526>I<130FA55BA45BA25BA25B5A5A5A001FEBFFF0
+B6FCA3000190C7FCB3153CA86C14781480017F13F090383FC1E090381FFFC06D13809038
+01FE001E377EB626>I<B500F0EBFFFCA4D803FEC7EA1F806D15006C151E806C5DA26E13
+7C017F14786E13F8013F5CECF001011F5CECF803010F5CA2ECFC0701075CECFE0F010391
+C7FC6E5A6D131E15BE6D13BC15FC6E5AA36E5AA26E5AA26E5AA26E5AA2140F92C8FC5C14
+1E0008133E007F133C147C38FF807814F8EB81F0EB83E06C485A387C1F80D83FFFC9FCEA
+1FFCEA07F02E377EA533>121 D E
+%EndDVIPSBitmapFont
+end
+%%EndProlog
+%%BeginSetup
+%%Feature: *Resolution 300dpi
+TeXDict begin
+%%BeginPaperSize: Letter
+letter
+%%EndPaperSize
+
+%%EndSetup
+%%Page: 1 1
+1 0 bop 75 693 a Fp(GNU)33 b(History)f(Library)p 75 743
+1800 17 v 960 791 a Fo(Edition)16 b(4.1,)e(for)h Fn(History)f(Library)g
+Fo(V)l(ersion)i(4.1.)1609 845 y(Jan)o(uary)f(2000)75
+2467 y Fm(Brian)23 b(F)-6 b(o)n(x,)23 b(F)-6 b(ree)23
+b(Soft)n(w)n(are)f(F)-6 b(oundation)75 2534 y(Chet)22
+b(Ramey)-6 b(,)23 b(Case)e(W)-6 b(estern)23 b(Reserv)n(e)f(Univ)n
+(ersit)n(y)p 75 2570 1800 9 v eop
+%%Page: 2 2
+2 1 bop 75 250 a Fo(This)21 b(do)q(cumen)o(t)g(describ)q(es)h(the)f
+(GNU)f(History)g(library)l(,)j(a)d(programming)g(to)q(ol)g(that)g(pro)o
+(vides)h(a)75 305 y(consisten)o(t)15 b(user)h(in)o(terface)f(for)g
+(recalling)i(lines)f(of)f(previously)i(t)o(yp)q(ed)e(input.)75
+373 y(Published)i(b)o(y)f(the)f(F)l(ree)g(Soft)o(w)o(are)f(F)l
+(oundation)75 427 y(59)h(T)l(emple)h(Place,)f(Suite)i(330,)75
+482 y(Boston,)d(MA)h(02111)f(USA)75 549 y(P)o(ermission)j(is)f(gran)o
+(ted)g(to)f(mak)o(e)h(and)g(distribute)i(v)o(erbatim)d(copies)i(of)f
+(this)h(man)o(ual)f(pro)o(vided)h(the)75 604 y(cop)o(yrigh)o(t)e
+(notice)h(and)f(this)h(p)q(ermission)g(notice)g(are)f(preserv)o(ed)h
+(on)f(all)h(copies.)75 671 y(P)o(ermission)c(is)h(gran)o(ted)e(to)g
+(cop)o(y)h(and)g(distribute)h(mo)q(di\014ed)g(v)o(ersions)f(of)f(this)h
+(man)o(ual)g(under)h(the)f(con-)75 726 y(ditions)k(for)e(v)o(erbatim)h
+(cop)o(ying,)g(pro)o(vided)h(that)e(the)h(en)o(tire)h(resulting)g
+(deriv)o(ed)g(w)o(ork)e(is)h(distributed)75 781 y(under)h(the)f(terms)g
+(of)g(a)f(p)q(ermission)j(notice)f(iden)o(tical)h(to)e(this)g(one.)75
+848 y(P)o(ermission)i(is)g(gran)o(ted)f(to)g(cop)o(y)h(and)f
+(distribute)i(translations)f(of)f(this)h(man)o(ual)g(in)o(to)f(another)
+g(lan-)75 903 y(guage,)e(under)h(the)f(ab)q(o)o(v)o(e)g(conditions)i
+(for)d(mo)q(di\014ed)j(v)o(ersions,)e(except)h(that)f(this)h(p)q
+(ermission)g(notice)75 958 y(ma)o(y)f(b)q(e)i(stated)f(in)h(a)f
+(translation)g(appro)o(v)o(ed)g(b)o(y)g(the)g(F)l(ree)h(Soft)o(w)o(are)
+d(F)l(oundation.)75 2661 y(Cop)o(yrigh)o(t)301 2660 y(c)289
+2661 y Fl(\015)i Fo(1988-1999)e(F)l(ree)i(Soft)o(w)o(are)f(F)l
+(oundation,)h(Inc.)p eop
+%%Page: 1 3
+1 2 bop 75 -58 a Fo(Chapter)15 b(1:)k(Using)d(History)f(In)o(teractiv)o
+(ely)1007 b(1)75 183 y Fk(1)41 b(Using)26 b(History)h(In)n(teractiv)n
+(ely)137 317 y Fo(This)16 b(c)o(hapter)f(describ)q(es)i(ho)o(w)d(to)h
+(use)g(the)g(GNU)g(History)g(Library)h(in)o(teractiv)o(ely)l(,)g(from)e
+(a)h(user's)75 372 y(standp)q(oin)o(t.)35 b(It)20 b(should)g(b)q(e)h
+(considered)h(a)d(user's)h(guide.)35 b(F)l(or)19 b(information)h(on)g
+(using)h(the)f(GNU)75 427 y(History)d(Library)h(in)h(y)o(our)e(o)o(wn)g
+(programs,)f(see)i(Chapter)f(2)h([Programming)e(with)i(GNU)f(History],)
+75 482 y(page)e(5.)75 625 y Fm(1.1)33 b(History)22 b(Expansion)137
+727 y Fo(The)c(History)g(library)h(pro)o(vides)f(a)f(history)h
+(expansion)h(feature)e(that)h(is)g(similar)h(to)e(the)h(history)75
+782 y(expansion)12 b(pro)o(vided)g(b)o(y)f Fn(csh)p Fo(.)18
+b(This)11 b(section)h(describ)q(es)g(the)g(syn)o(tax)e(used)h(to)g
+(manipulate)h(the)f(history)75 836 y(information.)137
+909 y(History)k(expansions)h(in)o(tro)q(duce)h(w)o(ords)d(from)g(the)i
+(history)f(list)h(in)o(to)f(the)h(input)g(stream,)e(making)75
+964 y(it)h(easy)g(to)g(rep)q(eat)g(commands,)g(insert)h(the)f(argumen)o
+(ts)f(to)h(a)g(previous)h(command)f(in)o(to)g(the)g(curren)o(t)75
+1019 y(input)h(line,)h(or)d(\014x)i(errors)e(in)i(previous)g(commands)f
+(quic)o(kly)l(.)137 1092 y(History)j(expansion)i(tak)o(es)d(place)i(in)
+h(t)o(w)o(o)d(parts.)28 b(The)19 b(\014rst)f(is)g(to)g(determine)i
+(whic)o(h)f(line)h(from)75 1147 y(the)h(history)f(list)i(should)g(b)q
+(e)f(used)g(during)h(substitution.)37 b(The)21 b(second)g(is)g(to)f
+(select)i(p)q(ortions)e(of)75 1202 y(that)15 b(line)i(for)d(inclusion)k
+(in)o(to)d(the)h(curren)o(t)f(one.)20 b(The)c(line)g(selected)h(from)e
+(the)g(history)g(is)h(called)h(the)75 1256 y Fj(ev)o(en)o(t)p
+Fo(,)c(and)h(the)g(p)q(ortions)g(of)f(that)g(line)i(that)e(are)g(acted)
+h(up)q(on)g(are)f(called)j Fj(w)o(ords)p Fo(.)i(V)l(arious)c
+Fj(mo)q(di\014ers)75 1311 y Fo(are)i(a)o(v)m(ailable)i(to)e(manipulate)
+i(the)e(selected)i(w)o(ords.)23 b(The)17 b(line)h(is)f(brok)o(en)f(in)o
+(to)h(w)o(ords)e(in)j(the)e(same)75 1366 y(fashion)c(that)e(Bash)i(do)q
+(es,)g(so)f(that)g(sev)o(eral)g(w)o(ords)g(surrounded)h(b)o(y)f(quotes)
+h(are)f(considered)h(one)g(w)o(ord.)75 1421 y(History)18
+b(expansions)h(are)g(in)o(tro)q(duced)g(b)o(y)f(the)h(app)q(earance)g
+(of)f(the)g(history)h(expansion)g(c)o(haracter,)75 1475
+y(whic)o(h)d(is)g(`)p Fn(!)p Fo(')e(b)o(y)h(default.)75
+1599 y Fi(1.1.1)30 b(Ev)n(en)n(t)21 b(Designators)137
+1701 y Fo(An)16 b(ev)o(en)o(t)f(designator)g(is)g(a)g(reference)h(to)f
+(a)g(command)g(line)i(en)o(try)d(in)i(the)g(history)f(list.)75
+1789 y Fn(!)216 b Fo(Start)16 b(a)g(history)h(substitution,)g(except)h
+(when)f(follo)o(w)o(ed)g(b)o(y)f(a)h(space,)g(tab,)f(the)h(end)g(of)315
+1844 y(the)e(line,)i(`)p Fn(=)p Fo(')d(or)h(`)p Fn(\()p
+Fo('.)75 1929 y Fn(!)p Fj(n)191 b Fo(Refer)16 b(to)e(command)h(line)i
+Fj(n)p Fo(.)75 2015 y Fn(!-)p Fj(n)167 b Fo(Refer)16
+b(to)e(the)i(command)f Fj(n)g Fo(lines)i(bac)o(k.)75
+2100 y Fn(!!)192 b Fo(Refer)16 b(to)e(the)i(previous)f(command.)20
+b(This)c(is)g(a)f(synon)o(ym)g(for)f(`)p Fn(!-1)p Fo('.)75
+2186 y Fn(!)p Fj(string)102 b Fo(Refer)16 b(to)e(the)i(most)e(recen)o
+(t)h(command)g(starting)g(with)g Fj(string)p Fo(.)75
+2271 y Fn(!?)p Fj(string)t Fn([?])315 2326 y Fo(Refer)i(to)f(the)h
+(most)f(recen)o(t)h(command)g(con)o(taining)g Fj(string)p
+Fo(.)25 b(The)17 b(trailing)g(`)p Fn(?)p Fo(')f(ma)o(y)g(b)q(e)315
+2381 y(omitted)f(if)h(the)f Fj(string)k Fo(is)d(follo)o(w)o(ed)f
+(immediately)i(b)o(y)e(a)g(newline.)75 2466 y Fn(^)p
+Fj(string1)t Fn(^)p Fj(string2)t Fn(^)315 2521 y Fo(Quic)o(k)i
+(Substitution.)23 b(Rep)q(eat)17 b(the)f(last)f(command,)h(replacing)h
+Fj(string1)i Fo(with)e Fj(string2)p Fo(.)315 2576 y(Equiv)m(alen)o(t)g
+(to)d Fn(!!:s/)p Fj(string1)t Fn(/)p Fj(string2)t Fn(/)p
+Fo(.)75 2661 y Fn(!#)192 b Fo(The)15 b(en)o(tire)h(command)f(line)i(t)o
+(yp)q(ed)f(so)e(far.)p eop
+%%Page: 2 4
+2 3 bop 75 -58 a Fo(2)1347 b(GNU)15 b(History)g(Library)75
+183 y Fi(1.1.2)30 b(W)-5 b(ord)20 b(Designators)137 279
+y Fo(W)l(ord)d(designators)g(are)g(used)h(to)f(select)h(desired)h(w)o
+(ords)d(from)h(the)g(ev)o(en)o(t.)26 b(A)18 b(`)p Fn(:)p
+Fo(')e(separates)h(the)75 334 y(ev)o(en)o(t)j(sp)q(eci\014cation)h
+(from)e(the)h(w)o(ord)f(designator.)34 b(It)20 b(ma)o(y)f(b)q(e)h
+(omitted)g(if)g(the)g(w)o(ord)f(designator)75 389 y(b)q(egins)f(with)g
+(a)e(`)p Fn(^)p Fo(',)h(`)p Fn($)p Fo(',)f(`)p Fn(*)p
+Fo(',)g(`)p Fn(-)p Fo(',)g(or)h(`)p Fn(\045)p Fo('.)24
+b(W)l(ords)17 b(are)g(n)o(um)o(b)q(ered)g(from)g(the)g(b)q(eginning)i
+(of)e(the)g(line,)75 444 y(with)j(the)g(\014rst)f(w)o(ord)h(b)q(eing)h
+(denoted)f(b)o(y)g(0)f(\(zero\).)33 b(W)l(ords)20 b(are)f(inserted)i
+(in)o(to)f(the)g(curren)o(t)f(line)75 498 y(separated)c(b)o(y)g(single)
+i(spaces.)137 574 y(F)l(or)e(example,)75 653 y Fn(!!)192
+b Fo(designates)18 b(the)g(preceding)i(command.)28 b(When)18
+b(y)o(ou)g(t)o(yp)q(e)g(this,)h(the)f(preceding)h(com-)315
+708 y(mand)c(is)h(rep)q(eated)g(in)g(toto.)75 787 y Fn(!!:$)144
+b Fo(designates)12 b(the)f(last)g(argumen)o(t)f(of)h(the)g(preceding)i
+(command.)19 b(This)11 b(ma)o(y)g(b)q(e)h(shortened)315
+842 y(to)j Fn(!$)p Fo(.)75 921 y Fn(!fi:2)120 b Fo(designates)15
+b(the)g(second)g(argumen)o(t)f(of)g(the)h(most)f(recen)o(t)g(command)h
+(starting)f(with)h(the)315 976 y(letters)g Fn(fi)p Fo(.)137
+1055 y(Here)h(are)f(the)g(w)o(ord)f(designators:)75 1134
+y Fn(0)h(\(zero\))57 b Fo(The)15 b Fn(0)p Fo(th)g(w)o(ord.)20
+b(F)l(or)14 b(man)o(y)h(applications,)h(this)g(is)g(the)f(command)g(w)o
+(ord.)75 1214 y Fj(n)215 b Fo(The)15 b Fj(n)p Fo(th)h(w)o(ord.)75
+1293 y Fn(^)216 b Fo(The)15 b(\014rst)g(argumen)o(t;)f(that)h(is,)g(w)o
+(ord)g(1.)75 1372 y Fn($)216 b Fo(The)15 b(last)h(argumen)o(t.)75
+1451 y Fn(\045)216 b Fo(The)15 b(w)o(ord)g(matc)o(hed)g(b)o(y)g(the)g
+(most)g(recen)o(t)g(`)p Fn(?)p Fj(string)t Fn(?)p Fo(')f(searc)o(h.)75
+1530 y Fj(x)p Fn(-)p Fj(y)168 b Fo(A)15 b(range)g(of)g(w)o(ords;)f(`)p
+Fn(-)p Fj(y)t Fo(')g(abbreviates)i(`)p Fn(0-)p Fj(y)t
+Fo('.)75 1610 y Fn(*)216 b Fo(All)15 b(of)f(the)f(w)o(ords,)g(except)i
+(the)f Fn(0)p Fo(th.)19 b(This)14 b(is)h(a)e(synon)o(ym)h(for)f(`)p
+Fn(1-$)p Fo('.)18 b(It)c(is)g(not)g(an)g(error)315 1664
+y(to)g(use)h(`)p Fn(*)p Fo(')f(if)i(there)e(is)i(just)e(one)h(w)o(ord)f
+(in)i(the)f(ev)o(en)o(t;)f(the)h(empt)o(y)g(string)g(is)g(returned)g
+(in)315 1719 y(that)f(case.)75 1798 y Fj(x)s Fn(*)189
+b Fo(Abbreviates)16 b(`)p Fj(x)p Fn(-$)p Fo(')75 1878
+y Fj(x)p Fn(-)192 b Fo(Abbreviates)16 b(`)p Fj(x)p Fn(-$)p
+Fo(')e(lik)o(e)i(`)p Fj(x)s Fn(*)p Fo(',)e(but)i(omits)f(the)g(last)g
+(w)o(ord.)137 1957 y(If)i(a)g(w)o(ord)f(designator)h(is)h(supplied)h
+(without)e(an)g(ev)o(en)o(t)f(sp)q(eci\014cation,)j(the)e(previous)h
+(command)75 2012 y(is)e(used)f(as)g(the)h(ev)o(en)o(t.)75
+2123 y Fi(1.1.3)30 b(Mo)r(di\014ers)137 2219 y Fo(After)10
+b(the)h(optional)g(w)o(ord)e(designator,)i(y)o(ou)f(can)h(add)f(a)g
+(sequence)i(of)e(one)g(or)g(more)g(of)g(the)g(follo)o(wing)75
+2274 y(mo)q(di\014ers,)16 b(eac)o(h)f(preceded)i(b)o(y)e(a)g(`)p
+Fn(:)p Fo('.)75 2353 y Fn(h)216 b Fo(Remo)o(v)o(e)15
+b(a)g(trailing)h(pathname)f(comp)q(onen)o(t,)g(lea)o(ving)h(only)g(the)
+f(head.)75 2432 y Fn(t)216 b Fo(Remo)o(v)o(e)15 b(all)h(leading)h
+(pathname)e(comp)q(onen)o(ts,)g(lea)o(ving)h(the)f(tail.)75
+2512 y Fn(r)216 b Fo(Remo)o(v)o(e)15 b(a)g(trailing)h(su\016x)f(of)g
+(the)g(form)g(`)p Fn(.)p Fj(su\016x)s Fo(',)f(lea)o(ving)i(the)f
+(basename.)75 2591 y Fn(e)216 b Fo(Remo)o(v)o(e)15 b(all)h(but)g(the)f
+(trailing)h(su\016x.)75 2670 y Fn(p)216 b Fo(Prin)o(t)15
+b(the)g(new)h(command)f(but)g(do)g(not)g(execute)h(it.)p
+eop
+%%Page: 3 5
+3 4 bop 75 -58 a Fo(Chapter)15 b(1:)k(Using)d(History)f(In)o(teractiv)o
+(ely)1007 b(3)75 183 y Fn(s/)p Fj(old)r Fn(/)p Fj(new)t
+Fn(/)315 238 y Fo(Substitute)17 b Fj(new)j Fo(for)c(the)h(\014rst)e(o)q
+(ccurrence)j(of)e Fj(old)i Fo(in)f(the)g(ev)o(en)o(t)f(line.)25
+b(An)o(y)16 b(delimiter)315 293 y(ma)o(y)c(b)q(e)h(used)g(in)g(place)g
+(of)f(`)p Fn(/)p Fo('.)18 b(The)13 b(delimiter)h(ma)o(y)e(b)q(e)h
+(quoted)f(in)i Fj(old)g Fo(and)f Fj(new)k Fo(with)12
+b(a)315 348 y(single)j(bac)o(kslash.)20 b(If)15 b(`)p
+Fn(&)p Fo(')e(app)q(ears)h(in)h Fj(new)p Fo(,)f(it)g(is)h(replaced)g(b)
+o(y)f Fj(old)p Fo(.)20 b(A)14 b(single)i(bac)o(kslash)315
+402 y(will)j(quote)e(the)h(`)p Fn(&)p Fo('.)25 b(The)17
+b(\014nal)i(delimiter)g(is)f(optional)g(if)f(it)h(is)g(the)f(last)g(c)o
+(haracter)g(on)315 457 y(the)e(input)h(line.)75 537 y
+Fn(&)216 b Fo(Rep)q(eat)16 b(the)f(previous)h(substitution.)75
+617 y Fn(g)216 b Fo(Cause)19 b(c)o(hanges)h(to)e(b)q(e)i(applied)h(o)o
+(v)o(er)e(the)g(en)o(tire)h(ev)o(en)o(t)f(line.)34 b(Used)20
+b(in)g(conjunction)315 671 y(with)c(`)p Fn(s)p Fo(',)d(as)i(in)h
+Fn(gs/)p Fj(old)r Fn(/)p Fj(new)t Fn(/)p Fo(,)f(or)g(with)g(`)p
+Fn(&)p Fo('.)p eop
+%%Page: 4 6
+4 5 bop 75 -58 a Fo(4)1347 b(GNU)15 b(History)g(Library)p
+eop
+%%Page: 5 7
+5 6 bop 75 -58 a Fo(Chapter)15 b(2:)k(Programming)c(with)g(GNU)g
+(History)889 b(5)75 183 y Fk(2)41 b(Programming)28 b(with)e(GNU)i
+(History)137 282 y Fo(This)16 b(c)o(hapter)e(describ)q(es)j(ho)o(w)d
+(to)g(in)o(terface)h(programs)e(that)h(y)o(ou)h(write)g(with)g(the)g
+(GNU)f(History)75 337 y(Library)l(.)24 b(It)17 b(should)g(b)q(e)g
+(considered)h(a)e(tec)o(hnical)i(guide.)25 b(F)l(or)15
+b(information)i(on)f(the)h(in)o(teractiv)o(e)g(use)75
+391 y(of)e(GNU)g(History)l(,)g(see)g(Chapter)g(1)g([Using)g(History)g
+(In)o(teractiv)o(ely],)h(page)f(1.)75 509 y Fm(2.1)33
+b(In)n(tro)r(duction)24 b(to)e(History)137 602 y Fo(Man)o(y)c(programs)
+g(read)h(input)g(from)f(the)h(user)g(a)f(line)j(at)d(a)g(time.)31
+b(The)19 b(GNU)g(History)f(library)75 656 y(is)k(able)g(to)e(k)o(eep)i
+(trac)o(k)e(of)h(those)g(lines,)j(asso)q(ciate)d(arbitrary)g(data)f
+(with)i(eac)o(h)f(line,)j(and)e(utilize)75 711 y(information)15
+b(from)g(previous)h(lines)h(in)f(comp)q(osing)f(new)h(ones.)137
+775 y(The)e(programmer)f(using)h(the)g(History)g(library)g(has)g(a)o(v)
+m(ailable)h(functions)g(for)e(remem)o(b)q(ering)h(lines)75
+830 y(on)c(a)g(history)h(list,)g(asso)q(ciating)g(arbitrary)f(data)f
+(with)i(a)f(line,)j(remo)o(ving)d(lines)i(from)d(the)i(list,)h(searc)o
+(hing)75 884 y(through)17 b(the)h(list)g(for)f(a)h(line)h(con)o
+(taining)f(an)g(arbitrary)f(text)g(string,)h(and)g(referencing)h(an)o
+(y)e(line)i(in)75 939 y(the)c(list)i(directly)l(.)22
+b(In)16 b(addition,)g(a)f(history)g Fj(expansion)h Fo(function)h(is)e
+(a)o(v)m(ailable)i(whic)o(h)g(pro)o(vides)f(for)e(a)75
+994 y(consisten)o(t)h(user)h(in)o(terface)f(across)g(di\013eren)o(t)g
+(programs.)137 1058 y(The)f(user)h(using)f(programs)f(written)h(with)g
+(the)g(History)g(library)h(has)f(the)g(b)q(ene\014t)h(of)e(a)h
+(consisten)o(t)75 1112 y(user)20 b(in)o(terface)f(with)h(a)f(set)h(of)f
+(w)o(ell-kno)o(wn)h(commands)g(for)e(manipulating)k(the)d(text)g(of)g
+(previous)75 1167 y(lines)c(and)f(using)h(that)e(text)g(in)i(new)f
+(commands.)19 b(The)14 b(basic)h(history)e(manipulation)j(commands)d
+(are)75 1222 y(similar)j(to)f(the)g(history)g(substitution)h(pro)o
+(vided)g(b)o(y)g Fn(csh)p Fo(.)137 1286 y(If)f(the)g(programmer)f
+(desires,)h(he)g(can)g(use)g(the)g(Readline)i(library)l(,)f(whic)o(h)f
+(includes)j(some)c(history)75 1340 y(manipulation)j(b)o(y)e(default,)g
+(and)h(has)f(the)g(added)h(adv)m(an)o(tage)f(of)f(command)h(line)i
+(editing.)137 1404 y(Before)i(declaring)i(an)o(y)d(functions)i(using)g
+(an)o(y)f(functionalit)o(y)h(the)f(History)g(library)h(pro)o(vides)f
+(in)75 1459 y(other)14 b(co)q(de,)h(an)f(application)i(writer)e(should)
+i(include)g(the)f(\014le)g Fn(<readline/history.h>)d
+Fo(in)j(an)o(y)f(\014le)75 1513 y(that)d(uses)h(the)h(History)e
+(library's)i(features.)18 b(It)12 b(supplies)i(extern)e(declarations)h
+(for)e(all)i(of)f(the)g(library's)75 1568 y(public)17
+b(functions)f(and)g(v)m(ariables,)g(and)f(declares)h(all)g(of)f(the)h
+(public)h(data)d(structures.)75 1686 y Fm(2.2)33 b(History)22
+b(Storage)137 1778 y Fo(The)16 b(history)f(list)h(is)g(an)f(arra)o(y)f
+(of)g(history)i(en)o(tries.)k(A)15 b(history)g(en)o(try)g(is)h
+(declared)g(as)f(follo)o(ws:)195 1839 y Fn(typedef)23
+b(struct)g(_hist_entry)f({)243 1891 y(char)h(*line;)243
+1943 y(char)g(*data;)195 1995 y(})h(HIST_ENTRY;)137 2058
+y Fo(The)16 b(history)f(list)h(itself)g(migh)o(t)f(therefore)g(b)q(e)h
+(declared)g(as)195 2119 y Fn(HIST_ENTRY)22 b(**the_history_list;)137
+2183 y Fo(The)16 b(state)e(of)h(the)g(History)g(library)h(is)g
+(encapsulated)g(in)o(to)f(a)g(single)i(structure:)195
+2243 y Fn(/*)24 b(A)f(structure)g(used)g(to)h(pass)f(the)h(current)f
+(state)g(of)g(the)h(history)f(stuff)g(around.)g(*/)p
+2033 2253 21 42 v 195 2295 a(typedef)g(struct)g(_hist_state)f({)243
+2347 y(HIST_ENTRY)g(**entries;)214 b(/*)23 b(Pointer)g(to)h(the)f
+(entries)g(themselves.)f(*/)243 2399 y(int)h(offset;)453
+b(/*)23 b(The)h(location)e(pointer)h(within)g(this)h(array.)f(*/)p
+2033 2409 V 243 2451 a(int)g(length;)453 b(/*)23 b(Number)g(of)h
+(elements)f(within)g(this)g(array.)g(*/)p 1985 2461 V
+243 2503 a(int)g(size;)501 b(/*)23 b(Number)g(of)h(slots)f(allocated)g
+(to)g(this)h(array.)f(*/)p 2057 2513 V 243 2555 a(int)g(flags;)195
+2606 y(})h(HISTORY_STATE;)137 2670 y Fo(If)16 b(the)f(\015ags)g(mem)o
+(b)q(er)g(includes)j Fn(HS_STIFLED)p Fo(,)13 b(the)i(history)h(has)f(b)
+q(een)h(sti\015ed.)p eop
+%%Page: 6 8
+6 7 bop 75 -58 a Fo(6)1347 b(GNU)15 b(History)g(Library)75
+183 y Fm(2.3)33 b(History)22 b(F)-6 b(unctions)137 278
+y Fo(This)21 b(section)g(describ)q(es)h(the)f(calling)h(sequence)g(for)
+e(the)g(v)m(arious)h(functions)g(presen)o(t)g(in)g(GNU)75
+333 y(History)l(.)75 441 y Fi(2.3.1)30 b(Initializing)20
+b(History)h(and)f(State)g(Managemen)n(t)137 536 y Fo(This)e(section)g
+(describ)q(es)h(functions)f(used)g(to)e(initialize)21
+b(and)c(manage)g(the)g(state)g(of)g(the)g(History)75
+591 y(library)f(when)g(y)o(ou)f(w)o(an)o(t)f(to)g(use)i(the)f(history)g
+(functions)h(in)g(y)o(our)f(program.)1650 679 y(F)l(unction)-1749
+b Fh(void)20 b Fg(using)p 333 679 18 3 v 20 w(history)j
+Ff(\(\))195 734 y Fo(Begin)18 b(a)f(session)h(in)g(whic)o(h)g(the)g
+(history)f(functions)h(migh)o(t)f(b)q(e)h(used.)27 b(This)18
+b(initializes)195 788 y(the)d(in)o(teractiv)o(e)h(v)m(ariables.)1650
+877 y(F)l(unction)-1749 b Fh(HISTORY_STATE)21 b(*)e Fg(history)p
+657 877 V 21 w(get)p 755 877 V 21 w(history)p 951 877
+V 21 w(state)j Ff(\(\))195 931 y Fo(Return)16 b(a)f(structure)g
+(describing)i(the)e(curren)o(t)g(state)f(of)h(the)g(input)i(history)l
+(.)1650 1019 y(F)l(unction)-1749 b Fh(void)20 b Fg(history)p
+377 1019 V 20 w(set)p 468 1019 V 21 w(history)p 664 1019
+V 21 w(state)j Ff(\()p Fn(HISTORY_STATE)13 b(*state)p
+Ff(\))195 1074 y Fo(Set)i(the)h(state)e(of)h(the)g(history)g(list)h
+(according)g(to)e Fj(state)p Fo(.)75 1182 y Fi(2.3.2)30
+b(History)20 b(List)h(Managemen)n(t)137 1277 y Fo(These)11
+b(functions)h(manage)e(individual)k(en)o(tries)d(on)g(the)g(history)f
+(list,)i(or)f(set)f(parameters)g(managing)75 1332 y(the)15
+b(list)h(itself.)1650 1420 y(F)l(unction)-1749 b Fh(void)20
+b Fg(add)p 294 1420 V 20 w(history)j Ff(\()p Fn(char)14
+b(*string)p Ff(\))195 1475 y Fo(Place)i Fj(string)j Fo(at)c(the)g(end)i
+(of)d(the)i(history)f(list.)22 b(The)15 b(asso)q(ciated)h(data)f
+(\014eld)h(\(if)g(an)o(y\))e(is)195 1530 y(set)h(to)g
+Fn(NULL)p Fo(.)1650 1618 y(F)l(unction)-1749 b Fh(HIST_ENTRY)21
+b(*)e Fg(remo)n(v)n(e)p 584 1618 V 20 w(history)k Ff(\()p
+Fn(int)14 b(which)p Ff(\))195 1673 y Fo(Remo)o(v)o(e)g(history)g(en)o
+(try)f(at)h(o\013set)f Fj(whic)o(h)h Fo(from)g(the)g(history)l(.)19
+b(The)14 b(remo)o(v)o(ed)g(elemen)o(t)g(is)195 1727 y(returned)i(so)e
+(y)o(ou)h(can)h(free)f(the)g(line,)i(data,)d(and)h(con)o(taining)h
+(structure.)1650 1816 y(F)l(unction)-1749 b Fh(HIST_ENTRY)21
+b(*)e Fg(replace)p 580 1816 V 22 w(history)p 777 1816
+V 20 w(en)n(try)24 b Ff(\()p Fn(int)14 b(which,)g(char)283
+1870 y(*line,)g(char)g(*data)p Ff(\))195 1925 y Fo(Mak)o(e)f(the)h
+(history)f(en)o(try)g(at)g(o\013set)g Fj(whic)o(h)h Fo(ha)o(v)o(e)g
+Fj(line)k Fo(and)13 b Fj(data)p Fo(.)19 b(This)14 b(returns)g(the)f
+(old)195 1980 y(en)o(try)k(so)g(y)o(ou)g(can)g(disp)q(ose)i(of)d(the)i
+(data.)25 b(In)18 b(the)f(case)h(of)f(an)g(in)o(v)m(alid)i
+Fj(whic)o(h)p Fo(,)g(a)e Fn(NULL)195 2035 y Fo(p)q(oin)o(ter)f(is)f
+(returned.)1650 2123 y(F)l(unction)-1749 b Fh(void)20
+b Fg(clear)p 320 2123 V 21 w(history)j Ff(\(\))195 2178
+y Fo(Clear)15 b(the)h(history)f(list)h(b)o(y)f(deleting)i(all)f(the)f
+(en)o(tries.)1650 2266 y(F)l(unction)-1749 b Fh(void)20
+b Fg(sti\015e)p 320 2266 V 21 w(history)j Ff(\()p Fn(int)14
+b(max)p Ff(\))195 2321 y Fo(Sti\015e)i(the)f(history)h(list,)f(remem)o
+(b)q(ering)h(only)g(the)f(last)g Fj(max)j Fo(en)o(tries.)1650
+2409 y(F)l(unction)-1749 b Fh(int)20 b Fg(unsti\015e)p
+358 2409 V 21 w(history)i Ff(\(\))195 2463 y Fo(Stop)e(sti\015ing)i
+(the)f(history)l(.)36 b(This)21 b(returns)g(the)f(previous)i(amoun)o(t)
+e(the)g(history)h(w)o(as)195 2518 y(sti\015ed.)g(The)15
+b(v)m(alue)i(is)e(p)q(ositiv)o(e)i(if)e(the)g(history)h(w)o(as)e
+(sti\015ed,)i(negativ)o(e)f(if)h(it)f(w)o(asn't.)1650
+2606 y(F)l(unction)-1749 b Fh(int)20 b Fg(history)p 351
+2606 V 20 w(is)p 409 2606 V 21 w(sti\015ed)k Ff(\(\))195
+2661 y Fo(Returns)16 b(non-zero)f(if)h(the)f(history)g(is)h(sti\015ed,)
+g(zero)f(if)g(it)h(is)g(not.)p eop
+%%Page: 7 9
+7 8 bop 75 -58 a Fo(Chapter)15 b(2:)k(Programming)c(with)g(GNU)g
+(History)889 b(7)75 183 y Fi(2.3.3)30 b(Information)19
+b(Ab)r(out)i(the)f(History)h(List)137 279 y Fo(These)13
+b(functions)h(return)f(information)g(ab)q(out)f(the)h(en)o(tire)h
+(history)e(list)i(or)e(individual)k(list)e(en)o(tries.)1650
+371 y(F)l(unction)-1749 b Fh(HIST_ENTRY)21 b(**)e Fg(history)p
+605 371 18 3 v 21 w(list)24 b Ff(\(\))195 426 y Fo(Return)f(a)g
+Fn(NULL)f Fo(terminated)g(arra)o(y)g(of)g Fn(HIST_ENTRY)f
+Fo(whic)o(h)j(is)f(the)f(curren)o(t)h(input)195 481 y(history)l(.)j
+(Elemen)o(t)18 b(0)e(of)h(this)h(list)g(is)f(the)h(b)q(eginning)h(of)e
+(time.)26 b(If)17 b(there)g(is)h(no)f(history)l(,)195
+535 y(return)e Fn(NULL)p Fo(.)1650 627 y(F)l(unction)-1749
+b Fh(int)20 b Fg(where)p 325 627 V 20 w(history)j Ff(\(\))195
+682 y Fo(Returns)16 b(the)f(o\013set)f(of)h(the)g(curren)o(t)g(history)
+g(elemen)o(t.)1650 773 y(F)l(unction)-1749 b Fh(HIST_ENTRY)21
+b(*)e Fg(curren)n(t)p 587 773 V 21 w(history)k Ff(\(\))195
+828 y Fo(Return)g(the)f(history)g(en)o(try)g(at)f(the)h(curren)o(t)g(p)
+q(osition,)j(as)c(determined)j(b)o(y)e Fn(where_)195
+883 y(history)14 b(\(\))p Fo(.)20 b(If)15 b(there)g(is)h(no)f(en)o(try)
+g(there,)g(return)g(a)g Fn(NULL)g Fo(p)q(oin)o(ter.)1650
+975 y(F)l(unction)-1749 b Fh(HIST_ENTRY)21 b(*)e Fg(history)p
+579 975 V 21 w(get)j Ff(\()p Fn(int)15 b(offset)p Ff(\))195
+1029 y Fo(Return)21 b(the)g(history)g(en)o(try)f(at)g(p)q(osition)i
+Fj(o\013set)p Fo(,)e(starting)g(from)g Fn(history_base)p
+Fo(.)35 b(If)195 1084 y(there)16 b(is)h(no)g(en)o(try)f(there,)g(or)g
+(if)g Fj(o\013set)h Fo(is)g(greater)e(than)h(the)h(history)f(length,)h
+(return)f(a)195 1139 y Fn(NULL)f Fo(p)q(oin)o(ter.)1650
+1231 y(F)l(unction)-1749 b Fh(int)20 b Fg(history)p 351
+1231 V 20 w(total)p 487 1231 V 22 w(b)n(ytes)j Ff(\(\))195
+1285 y Fo(Return)c(the)f(n)o(um)o(b)q(er)g(of)g(b)o(ytes)g(that)f(the)h
+(primary)h(history)f(en)o(tries)g(are)g(using.)29 b(This)195
+1340 y(function)16 b(returns)f(the)g(sum)h(of)e(the)i(lengths)f(of)g
+(all)h(the)g(lines)g(in)g(the)g(history)l(.)75 1452 y
+Fi(2.3.4)30 b(Mo)n(ving)21 b(Around)f(the)h(History)g(List)137
+1548 y Fo(These)16 b(functions)g(allo)o(w)f(the)g(curren)o(t)h(index)g
+(in)o(to)f(the)h(history)f(list)h(to)e(b)q(e)i(set)f(or)g(c)o(hanged.)
+1650 1640 y(F)l(unction)-1749 b Fh(int)20 b Fg(history)p
+351 1640 V 20 w(set)p 442 1640 V 21 w(p)r(os)h Ff(\()p
+Fn(int)15 b(pos)p Ff(\))195 1694 y Fo(Set)g(the)h(p)q(osition)g(in)g
+(the)f(history)g(list)h(to)f Fj(p)q(os)p Fo(,)g(an)g(absolute)g(index)i
+(in)o(to)e(the)g(list.)1650 1786 y(F)l(unction)-1749
+b Fh(HIST_ENTRY)21 b(*)e Fg(previous)p 615 1786 V 20
+w(history)k Ff(\(\))195 1841 y Fo(Bac)o(k)17 b(up)h(the)f(curren)o(t)g
+(history)g(o\013set)f(to)h(the)g(previous)h(history)f(en)o(try)l(,)g
+(and)g(return)g(a)195 1896 y(p)q(oin)o(ter)f(to)e(that)h(en)o(try)l(.)k
+(If)d(there)f(is)h(no)f(previous)h(en)o(try)l(,)f(return)g(a)g
+Fn(NULL)f Fo(p)q(oin)o(ter.)1650 1987 y(F)l(unction)-1749
+b Fh(HIST_ENTRY)21 b(*)e Fg(next)p 514 1987 V 21 w(history)k
+Ff(\(\))195 2042 y Fo(Mo)o(v)o(e)17 b(the)h(curren)o(t)g(history)f
+(o\013set)g(forw)o(ard)g(to)g(the)h(next)g(history)g(en)o(try)l(,)g
+(and)g(return)195 2097 y(the)d(a)g(p)q(oin)o(ter)h(to)e(that)h(en)o
+(try)l(.)20 b(If)15 b(there)g(is)h(no)f(next)g(en)o(try)l(,)g(return)g
+(a)g Fn(NULL)g Fo(p)q(oin)o(ter.)75 2208 y Fi(2.3.5)30
+b(Searc)n(hing)21 b(the)f(History)h(List)137 2304 y Fo(These)14
+b(functions)g(allo)o(w)g(searc)o(hing)g(of)e(the)i(history)f(list)h
+(for)f(en)o(tries)h(con)o(taining)g(a)f(sp)q(eci\014c)i(string.)75
+2359 y(Searc)o(hing)f(ma)o(y)g(b)q(e)g(p)q(erformed)g(b)q(oth)g(forw)o
+(ard)e(and)i(bac)o(kw)o(ard)f(from)g(the)h(curren)o(t)g(history)f(p)q
+(osition.)75 2414 y(The)j(searc)o(h)f(ma)o(y)g(b)q(e)i
+Fj(anc)o(hored)p Fo(,)e(meaning)h(that)f(the)h(string)g(m)o(ust)f(matc)
+o(h)g(at)g(the)h(b)q(eginning)i(of)d(the)75 2469 y(history)g(en)o(try)l
+(.)1650 2560 y(F)l(unction)-1749 b Fh(int)20 b Fg(history)p
+351 2560 V 20 w(searc)n(h)j Ff(\()p Fn(char)14 b(*string,)g(int)h
+(direction)p Ff(\))195 2615 y Fo(Searc)o(h)g(the)h(history)f(for)f
+Fj(string)p Fo(,)h(starting)f(at)h(the)g(curren)o(t)g(history)g
+(o\013set.)k(If)d Fj(direction)195 2670 y Fn(<)j Fo(0,)g(then)g(the)h
+(searc)o(h)e(is)i(through)e(previous)i(en)o(tries,)g(else)g(through)f
+(subsequen)o(t.)32 b(If)p eop
+%%Page: 8 10
+8 9 bop 75 -58 a Fo(8)1347 b(GNU)15 b(History)g(Library)195
+183 y Fj(string)k Fo(is)d(found,)f(then)h(the)f(curren)o(t)g(history)g
+(index)i(is)f(set)f(to)f(that)h(history)g(en)o(try)l(,)g(and)195
+238 y(the)g(v)m(alue)h(returned)f(is)g(the)g(o\013set)f(in)h(the)g
+(line)h(of)e(the)h(en)o(try)g(where)g Fj(string)j Fo(w)o(as)c(found.)
+195 293 y(Otherwise,)i(nothing)f(is)h(c)o(hanged,)f(and)h(a)e(-1)h(is)h
+(returned.)1650 396 y(F)l(unction)-1749 b Fh(int)20 b
+Fg(history)p 351 396 18 3 v 20 w(searc)n(h)p 527 396
+V 21 w(pre\014x)i Ff(\()p Fn(char)15 b(*string,)f(int)g(direction)p
+Ff(\))195 451 y Fo(Searc)o(h)i(the)f(history)g(for)g
+Fj(string)p Fo(,)g(starting)g(at)g(the)g(curren)o(t)h(history)f
+(o\013set.)k(The)d(searc)o(h)195 506 y(is)h(anc)o(hored:)23
+b(matc)o(hing)17 b(lines)h(m)o(ust)e(b)q(egin)i(with)f
+Fj(string)p Fo(.)25 b(If)17 b Fj(direction)h Fn(<)e Fo(0,)h(then)g(the)
+195 560 y(searc)o(h)f(is)g(through)f(previous)i(en)o(tries,)f(else)g
+(through)g(subsequen)o(t.)22 b(If)16 b Fj(string)k Fo(is)c(found,)195
+615 y(then)i(the)g(curren)o(t)g(history)g(index)h(is)g(set)e(to)h(that)
+f(en)o(try)l(,)h(and)g(the)g(return)g(v)m(alue)h(is)g(0.)195
+670 y(Otherwise,)d(nothing)f(is)h(c)o(hanged,)f(and)h(a)e(-1)h(is)h
+(returned.)1650 773 y(F)l(unction)-1749 b Fh(int)20 b
+Fg(history)p 351 773 V 20 w(searc)n(h)p 527 773 V 21
+w(p)r(os)h Ff(\()p Fn(char)15 b(*string,)f(int)g(direction,)g(int)283
+828 y(pos)p Ff(\))195 883 y Fo(Searc)o(h)h(for)g Fj(string)k
+Fo(in)d(the)f(history)g(list,)g(starting)g(at)f Fj(p)q(os)p
+Fo(,)h(an)g(absolute)g(index)i(in)o(to)e(the)195 937
+y(list.)21 b(If)15 b Fj(direction)h Fo(is)g(negativ)o(e,)f(the)g(searc)
+o(h)g(pro)q(ceeds)g(bac)o(kw)o(ard)g(from)f Fj(p)q(os)p
+Fo(,)h(otherwise)195 992 y(forw)o(ard.)27 b(Returns)18
+b(the)g(absolute)g(index)h(of)f(the)g(history)f(elemen)o(t)i(where)f
+Fj(string)k Fo(w)o(as)195 1047 y(found,)15 b(or)g(-1)g(otherwise.)75
+1170 y Fi(2.3.6)30 b(Managing)20 b(the)g(History)h(File)137
+1272 y Fo(The)16 b(History)g(library)h(can)e(read)h(the)g(history)g
+(from)f(and)h(write)g(it)g(to)f(a)h(\014le.)22 b(This)17
+b(section)f(do)q(cu-)75 1327 y(men)o(ts)f(the)g(functions)h(for)f
+(managing)g(a)g(history)g(\014le.)1650 1430 y(F)l(unction)-1749
+b Fh(int)20 b Fg(read)p 286 1430 V 20 w(history)i Ff(\()p
+Fn(char)15 b(*filename)p Ff(\))195 1485 y Fo(Add)h(the)f(con)o(ten)o
+(ts)f(of)h Fj(\014lename)j Fo(to)d(the)g(history)g(list,)g(a)g(line)h
+(at)f(a)f(time.)21 b(If)15 b Fj(\014lename)j Fo(is)195
+1539 y Fn(NULL)p Fo(,)c(then)i(read)f(from)f(`)p Fn(~/.history)p
+Fo('.)k(Returns)e(0)f(if)g(successful,)i(or)d(errno)h(if)h(not.)1650
+1643 y(F)l(unction)-1749 b Fh(int)20 b Fg(read)p 286
+1643 V 20 w(history)p 481 1643 V 20 w(range)i Ff(\()p
+Fn(char)15 b(*filename,)e(int)i(from,)g(int)f(to)p Ff(\))195
+1697 y Fo(Read)21 b(a)f(range)g(of)g(lines)i(from)e Fj(\014lename)p
+Fo(,)i(adding)f(them)g(to)f(the)g(history)h(list.)36
+b(Start)195 1752 y(reading)15 b(at)e(line)j Fj(from)e
+Fo(and)g(end)h(at)e Fj(to)p Fo(.)19 b(If)c Fj(from)e
+Fo(is)i(zero,)f(start)f(at)g(the)h(b)q(eginning.)22 b(If)15
+b Fj(to)195 1807 y Fo(is)i(less)g(than)f Fj(from)p Fo(,)g(then)h(read)f
+(un)o(til)i(the)e(end)h(of)f(the)h(\014le.)24 b(If)17
+b Fj(\014lename)j Fo(is)d Fn(NULL)p Fo(,)f(then)195 1862
+y(read)f(from)g(`)p Fn(~/.history)p Fo('.)i(Returns)f(0)f(if)h
+(successful,)g(or)e Fn(errno)h Fo(if)h(not.)1650 1965
+y(F)l(unction)-1749 b Fh(int)20 b Fg(write)p 304 1965
+V 22 w(history)i Ff(\()p Fn(char)15 b(*filename)p Ff(\))195
+2020 y Fo(W)l(rite)23 b(the)f(curren)o(t)g(history)h(to)f
+Fj(\014lename)p Fo(,)j(o)o(v)o(erwriting)d Fj(\014lename)k
+Fo(if)d(necessary)l(.)42 b(If)195 2074 y Fj(\014lename)20
+b Fo(is)d Fn(NULL)p Fo(,)f(then)g(write)h(the)f(history)h(list)g(to)f
+(`)p Fn(~/.history)p Fo('.)21 b(V)l(alues)d(returned)195
+2129 y(are)d(as)g(in)h Fn(read_history)d(\(\))p Fo(.)1650
+2232 y(F)l(unction)-1749 b Fh(int)20 b Fg(app)r(end)p
+360 2232 V 19 w(history)j Ff(\()p Fn(int)14 b(nelements,)g(char)h
+(*filename)p Ff(\))195 2287 y Fo(App)q(end)i(the)e(last)g
+Fj(nelemen)o(ts)j Fo(of)d(the)g(history)g(list)h(to)f
+Fj(\014lename)p Fo(.)1650 2390 y(F)l(unction)-1749 b
+Fh(int)20 b Fg(history)p 351 2390 V 20 w(truncate)p 582
+2390 V 21 w(\014le)k Ff(\()p Fn(char)14 b(*filename,)g(int)h(nlines)p
+Ff(\))195 2445 y Fo(T)l(runcate)g(the)h(history)f(\014le)h
+Fj(\014lename)p Fo(,)g(lea)o(ving)g(only)g(the)f(last)g
+Fj(nlines)k Fo(lines.)75 2568 y Fi(2.3.7)30 b(History)20
+b(Expansion)137 2670 y Fo(These)c(functions)g(implemen)o(t)g
+Fn(csh)p Fo(-lik)o(e)g(history)g(expansion.)p eop
+%%Page: 9 11
+9 10 bop 75 -58 a Fo(Chapter)15 b(2:)k(Programming)c(with)g(GNU)g
+(History)889 b(9)1650 183 y(F)l(unction)-1749 b Fh(int)20
+b Fg(history)p 351 183 18 3 v 20 w(expand)j Ff(\()p Fn(char)14
+b(*string,)g(char)h(**output)p Ff(\))195 238 y Fo(Expand)k
+Fj(string)p Fo(,)g(placing)h(the)e(result)h(in)o(to)g
+Fj(output)p Fo(,)g(a)f(p)q(oin)o(ter)h(to)f(a)g(string)h(\(see)f(Sec-)
+195 293 y(tion)d(1.1)g([History)f(In)o(teraction],)h(page)g(1\).)k
+(Returns:)195 370 y Fn(0)216 b Fo(If)16 b(no)g(expansions)h(to)q(ok)e
+(place)i(\(or,)d(if)j(the)f(only)g(c)o(hange)g(in)h(the)e(text)h(w)o
+(as)435 425 y(the)f(de-slashifying)j(of)c(the)i(history)f(expansion)h
+(c)o(haracter\);)195 502 y Fn(1)216 b Fo(if)16 b(expansions)g(did)g
+(tak)o(e)e(place;)195 580 y Fn(-1)192 b Fo(if)16 b(there)f(w)o(as)f(an)
+h(error)g(in)h(expansion;)195 657 y Fn(2)216 b Fo(if)16
+b(the)g(returned)f(line)j(should)e(b)q(e)g(displa)o(y)o(ed,)h(but)e
+(not)g(executed,)i(as)e(with)435 712 y(the)g Fn(:p)g
+Fo(mo)q(di\014er)h(\(see)f(Section)i(1.1.3)c([Mo)q(di\014ers],)i(page)g
+(2\).)195 789 y(If)g(an)g(error)f(o)q(curred)i(in)g(expansion,)f(then)h
+Fj(output)f Fo(con)o(tains)g(a)g(descriptiv)o(e)i(error)d(mes-)195
+844 y(sage.)1650 932 y(F)l(unction)-1749 b Fh(char)20
+b(*)f Fg(history)p 422 932 V 21 w(arg)p 524 932 V 19
+w(extract)24 b Ff(\()p Fn(int)14 b(first,)h(int)g(last,)f(char)283
+987 y(*string)p Ff(\))195 1042 y Fo(Extract)g(a)g(string)g(segmen)o(t)g
+(consisting)i(of)e(the)g Fj(\014rst)i Fo(through)e Fj(last)h
+Fo(argumen)o(ts)f(presen)o(t)195 1097 y(in)i Fj(string)p
+Fo(.)k(Argumen)o(ts)15 b(are)f(brok)o(en)i(up)f(as)g(in)h(Bash.)1650
+1185 y(F)l(unction)-1749 b Fh(char)20 b(*)f Fg(get)p
+324 1185 V 21 w(history)p 520 1185 V 20 w(ev)n(en)n(t)25
+b Ff(\()p Fn(char)14 b(*string,)g(int)h(*cindex,)f(int)283
+1240 y(qchar)p Ff(\))195 1295 y Fo(Returns)h(the)g(text)f(of)g(the)h
+(history)g(ev)o(en)o(t)f(b)q(eginning)j(at)d Fj(string)k
+Fn(+)d Fj(*cindex)p Fo(.)20 b Fj(*cindex)f Fo(is)195
+1350 y(mo)q(di\014ed)e(to)e(p)q(oin)o(t)h(to)f(after)g(the)h(ev)o(en)o
+(t)f(sp)q(eci\014er.)23 b(A)o(t)16 b(function)g(en)o(try)l(,)f
+Fj(cindex)21 b Fo(p)q(oin)o(ts)195 1404 y(to)16 b(the)h(index)h(in)o
+(to)e Fj(string)21 b Fo(where)c(the)g(history)f(ev)o(en)o(t)h(sp)q
+(eci\014cation)h(b)q(egins.)26 b Fj(qc)o(har)19 b Fo(is)195
+1459 y(a)h(c)o(haracter)g(that)g(is)h(allo)o(w)o(ed)f(to)g(end)h(the)g
+(ev)o(en)o(t)f(sp)q(eci\014cation)i(in)g(addition)f(to)f(the)195
+1514 y(\\normal")15 b(terminating)g(c)o(haracters.)1650
+1602 y(F)l(unction)-1749 b Fh(char)20 b(**)f Fg(history)p
+448 1602 V 21 w(tok)n(enize)25 b Ff(\()p Fn(char)14 b(*string)p
+Ff(\))195 1657 y Fo(Return)j(an)g(arra)o(y)f(of)g(tok)o(ens)g(parsed)h
+(out)g(of)f Fj(string)p Fo(,)h(m)o(uc)o(h)g(as)f(the)h(shell)h(migh)o
+(t.)25 b(The)195 1712 y(tok)o(ens)d(are)g(split)i(on)f(white)g(space)g
+(and)f(on)h(the)g(c)o(haracters)f Fn(\(\)<>;&|$)p Fo(,)h(and)f(shell)
+195 1767 y(quoting)15 b(con)o(v)o(en)o(tions)h(are)e(ob)q(ey)o(ed.)75
+1892 y Fm(2.4)33 b(History)22 b(V)-6 b(ariables)137 1987
+y Fo(This)23 b(section)f(describ)q(es)h(the)f(externally)h(visible)h(v)
+m(ariables)f(exp)q(orted)f(b)o(y)g(the)g(GNU)f(History)75
+2042 y(Library)l(.)1661 2130 y(V)l(ariable)-1749 b Fh(int)20
+b Fg(history)p 351 2130 V 20 w(base)195 2185 y Fo(The)15
+b(logical)i(o\013set)d(of)h(the)g(\014rst)g(en)o(try)g(in)h(the)f
+(history)g(list.)1661 2274 y(V)l(ariable)-1749 b Fh(int)20
+b Fg(history)p 351 2274 V 20 w(length)195 2329 y Fo(The)15
+b(n)o(um)o(b)q(er)h(of)f(en)o(tries)g(curren)o(tly)h(stored)f(in)h(the)
+f(history)g(list.)1661 2417 y(V)l(ariable)-1749 b Fh(int)20
+b Fg(max)p 283 2417 V 19 w(input)p 435 2417 V 21 w(history)195
+2472 y Fo(The)14 b(maxim)o(um)f(n)o(um)o(b)q(er)h(of)e(history)i(en)o
+(tries.)19 b(This)14 b(m)o(ust)f(b)q(e)h(c)o(hanged)g(using)g
+Fn(stifle_)195 2527 y(history)g(\(\))p Fo(.)1661 2615
+y(V)l(ariable)-1749 b Fh(char)20 b Fg(history)p 377 2615
+V 20 w(expansion)p 644 2615 V 21 w(c)n(har)195 2670 y
+Fo(The)15 b(c)o(haracter)g(that)f(starts)g(a)h(history)g(ev)o(en)o(t.)
+20 b(The)15 b(default)h(is)g(`)p Fn(!)p Fo('.)p eop
+%%Page: 10 12
+10 11 bop 75 -58 a Fo(10)1324 b(GNU)15 b(History)g(Library)1661
+183 y(V)l(ariable)-1749 b Fh(char)20 b Fg(history)p 377
+183 18 3 v 20 w(subst)p 529 183 V 20 w(c)n(har)195 238
+y Fo(The)13 b(c)o(haracter)e(that)h(in)o(v)o(ok)o(es)g(w)o(ord)g
+(substitution)h(if)g(found)g(at)e(the)i(start)e(of)h(a)g(line.)21
+b(The)195 293 y(default)16 b(is)f(`)p Fn(^)p Fo('.)1661
+388 y(V)l(ariable)-1749 b Fh(char)20 b Fg(history)p 377
+388 V 20 w(commen)n(t)p 627 388 V 19 w(c)n(har)195 443
+y Fo(During)e(tok)o(enization,)h(if)f(this)h(c)o(haracter)e(is)i(seen)f
+(as)g(the)g(\014rst)g(c)o(haracter)f(of)g(a)h(w)o(ord,)195
+498 y(then)e(it)g(and)g(all)h(subsequen)o(t)g(c)o(haracters)e(up)h(to)g
+(a)f(newline)j(are)e(ignored,)g(suppressing)195 553 y(history)f
+(expansion)h(for)f(the)g(remainder)h(of)f(the)g(line.)22
+b(This)15 b(is)h(disabled)h(b)o(y)e(default.)1661 648
+y(V)l(ariable)-1749 b Fh(char)20 b(*)f Fg(history)p 422
+648 V 21 w(no)p 504 648 V 20 w(expand)p 704 648 V 20
+w(c)n(hars)195 703 y Fo(The)j(list)h(of)f(c)o(haracters)f(whic)o(h)i
+(inhibit)h(history)e(expansion)h(if)g(found)f(immediately)195
+758 y(follo)o(wing)16 b Fj(history)p 528 758 14 2 v 16
+w(expansion)p 739 758 V 18 w(c)o(har)p Fo(.)j(The)d(default)f(is)h
+(whitespace)g(and)g(`)p Fn(=)p Fo('.)1661 853 y(V)l(ariable)-1749
+b Fh(char)20 b(*)f Fg(history)p 422 853 18 3 v 21 w(searc)n(h)p
+599 853 V 20 w(delimiter)p 843 853 V 23 w(c)n(hars)195
+908 y Fo(The)f(list)h(of)e(additional)i(c)o(haracters)e(whic)o(h)i(can)
+f(delimit)h(a)f(history)g(searc)o(h)f(string,)h(in)195
+963 y(addition)c(to)d(whitespace,)j(`)p Fn(:)p Fo(')d(and)i(`)p
+Fn(?)p Fo(')f(in)h(the)f(case)h(of)f(a)g(substring)h(searc)o(h.)19
+b(The)12 b(default)195 1018 y(is)k(empt)o(y)l(.)1661
+1113 y(V)l(ariable)-1749 b Fh(int)20 b Fg(history)p 351
+1113 V 20 w(quotes)p 533 1113 V 21 w(inhibit)p 717 1113
+V 23 w(expansion)195 1168 y Fo(If)13 b(non-zero,)f(single-quoted)i(w)o
+(ords)e(are)g(not)g(scanned)h(for)f(the)g(history)h(expansion)g(c)o
+(har-)195 1223 y(acter.)19 b(The)d(default)g(v)m(alue)g(is)g(0.)1661
+1318 y(V)l(ariable)-1749 b Fh(Function)20 b(*)g Fg(history)p
+527 1318 V 20 w(inhibit)p 710 1318 V 23 w(expansion)p
+980 1318 V 21 w(function)195 1373 y Fo(This)12 b(should)g(b)q(e)g(set)f
+(to)f(the)i(address)f(of)g(a)g(function)h(that)e(tak)o(es)h(t)o(w)o(o)f
+(argumen)o(ts:)17 b(a)11 b Fn(char)195 1428 y(*)j Fo(\()p
+Fj(string)t Fo(\))f(and)i(an)f(in)o(teger)g(index)h(in)o(to)f(that)g
+(string)g(\()p Fj(i)r Fo(\).)20 b(It)14 b(should)h(return)f(a)g
+(non-zero)195 1482 y(v)m(alue)g(if)e(the)h(history)f(expansion)h
+(starting)f(at)g Fj(string[i])i Fo(should)f(not)f(b)q(e)h(p)q
+(erformed;)g(zero)195 1537 y(if)g(the)h(expansion)f(should)h(b)q(e)g
+(done.)20 b(It)13 b(is)g(in)o(tended)i(for)d(use)h(b)o(y)g
+(applications)i(lik)o(e)f(Bash)195 1592 y(that)j(use)h(the)g(history)f
+(expansion)i(c)o(haracter)e(for)g(additional)i(purp)q(oses.)28
+b(By)18 b(default,)195 1647 y(this)e(v)m(ariable)g(is)g(set)f(to)f
+(NULL.)75 1780 y Fm(2.5)33 b(History)22 b(Programming)h(Example)137
+1878 y Fo(The)16 b(follo)o(wing)g(program)e(demonstrates)g(simple)j
+(use)e(of)g(the)g(GNU)g(History)g(Library)l(.)195 1944
+y Fn(main)23 b(\(\))195 1995 y({)243 2047 y(char)g(line[1024],)f(*t;)
+243 2099 y(int)h(len,)g(done)h(=)g(0;)243 2203 y(line[0])f(=)g(0;)243
+2307 y(using_history)f(\(\);)243 2359 y(while)h(\(!done\))290
+2411 y({)338 2462 y(printf)g(\("history$)g("\);)338 2514
+y(fflush)g(\(stdout\);)338 2566 y(t)h(=)g(fgets)f(\(line,)g(sizeof)g
+(\(line\))g(-)h(1,)f(stdin\);)338 2618 y(if)h(\(t)f(&&)h(*t\))386
+2670 y({)p eop
+%%Page: 11 13
+11 12 bop 75 -58 a Fo(Chapter)15 b(2:)k(Programming)c(with)g(GNU)g
+(History)867 b(11)434 183 y Fn(len)23 b(=)h(strlen)f(\(t\);)434
+235 y(if)g(\(t[len)g(-)h(1])g(==)f('\\n'\))481 287 y(t[len)h(-)f(1])h
+(=)g('\\0';)386 339 y(})338 443 y(if)g(\(!t\))386 495
+y(strcpy)f(\(line,)g("quit"\);)338 598 y(if)h(\(line[0]\))386
+650 y({)434 702 y(char)f(*expansion;)434 754 y(int)g(result;)434
+858 y(result)g(=)g(history_expand)f(\(line,)h(&expansion\);)434
+910 y(if)g(\(result\))481 962 y(fprintf)g(\(stderr,)g("\045s\\n",)g
+(expansion\);)434 1065 y(if)g(\(result)g(<)h(0)g(||)f(result)g(==)h
+(2\))481 1117 y({)529 1169 y(free)f(\(expansion\);)529
+1221 y(continue;)481 1273 y(})434 1377 y(add_history)f(\(expansion\);)
+434 1429 y(strncpy)h(\(line,)g(expansion,)f(sizeof)h(\(line\))g(-)h
+(1\);)434 1480 y(free)f(\(expansion\);)386 1532 y(})338
+1636 y(if)h(\(strcmp)f(\(line,)g("quit"\))g(==)g(0\))386
+1688 y(done)g(=)h(1;)338 1740 y(else)f(if)h(\(strcmp)f(\(line,)g
+("save"\))g(==)h(0\))386 1792 y(write_history)e(\("history_file"\);)338
+1844 y(else)h(if)h(\(strcmp)f(\(line,)g("read"\))g(==)h(0\))386
+1896 y(read_history)e(\("history_file"\);)338 1947 y(else)h(if)h
+(\(strcmp)f(\(line,)g("list"\))g(==)h(0\))386 1999 y({)434
+2051 y(register)e(HIST_ENTRY)h(**the_list;)434 2103 y(register)f(int)i
+(i;)434 2207 y(the_list)e(=)i(history_list)e(\(\);)434
+2259 y(if)h(\(the_list\))481 2311 y(for)h(\(i)f(=)h(0;)g(the_list[i];)e
+(i++\))529 2363 y(printf)h(\("\045d:)g(\045s\\n",)g(i)h(+)g
+(history_base,)e(the_list[i]->line\);)386 2414 y(})338
+2466 y(else)h(if)h(\(strncmp)f(\(line,)g("delete",)g(6\))g(==)h(0\))386
+2518 y({)434 2570 y(int)f(which;)434 2622 y(if)g(\(\(sscanf)g(\(line)g
+(+)h(6,)f("\045d",)h(&which\)\))e(==)i(1\))p eop
+%%Page: 12 14
+12 13 bop 75 -58 a Fo(12)1324 b(GNU)15 b(History)g(Library)481
+183 y Fn({)529 235 y(HIST_ENTRY)23 b(*entry)g(=)g(remove_history)f
+(\(which\);)529 287 y(if)i(\(!entry\))577 339 y(fprintf)f(\(stderr,)f
+("No)i(such)f(entry)g(\045d\\n",)g(which\);)529 391 y(else)577
+443 y({)625 495 y(free)g(\(entry->line\);)625 546 y(free)g(\(entry\);)
+577 598 y(})481 650 y(})434 702 y(else)481 754 y({)529
+806 y(fprintf)g(\(stderr,)g("non-numeric)f(arg)h(given)h(to)f
+(`delete'\\n"\);)481 858 y(})386 910 y(})290 962 y(})195
+1013 y(})p eop
+%%Page: 13 15
+13 14 bop 75 -58 a Fo(App)q(endix)17 b(A:)e(Concept)g(Index)1196
+b(13)75 183 y Fk(App)r(endix)25 b(A)41 b(Concept)27 b(Index)75
+359 y Fm(A)75 417 y Fe(anc)o(hored)14 b(searc)o(h)s Fd(.)7
+b(.)f(.)g(.)h(.)f(.)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(.)16
+b Fe(7)75 517 y Fm(E)75 575 y Fe(ev)o(en)o(t)d(designators)c
+Fd(.)g(.)d(.)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(.)h(.)21
+b Fe(1)1012 359 y Fm(H)1012 417 y Fe(history)15 b(ev)o(en)o(ts)s
+Fd(.)7 b(.)f(.)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(.)h(.)f(.)g(.)g(.)g
+(.)16 b Fe(1)1012 467 y(history)f(expansion)6 b Fd(.)j(.)d(.)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(.)h(.)f(.)19 b Fe(1)1012 517 y(History)14
+b(Searc)o(hing)5 b Fd(.)j(.)e(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
+g(.)18 b Fe(7)p eop
+%%Page: 14 16
+14 15 bop 75 -58 a Fo(14)1324 b(GNU)15 b(History)g(Library)p
+eop
+%%Page: 15 17
+15 16 bop 75 -58 a Fo(App)q(endix)17 b(B:)e(F)l(unction)h(and)g(V)l
+(ariable)g(Index)919 b(15)75 183 y Fk(App)r(endix)25
+b(B)41 b(F)-7 b(unction)26 b(and)h(V)-7 b(ariable)26
+b(Index)75 359 y Fm(A)75 417 y Fc(add)p 137 417 12 2
+v 13 w(history)6 b Fd(.)s(.)g(.)g(.)h(.)f(.)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(.)h(.)18 b Fe(6)75 467 y Fc(append)p
+197 467 V 12 w(history)8 b Fd(.)e(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)
+g(.)g(.)g(.)g(.)23 b Fe(8)75 567 y Fm(C)75 625 y Fc(clear)p
+177 625 V 12 w(history)s Fd(.)t(.)6 b(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)
+g(.)g(.)g(.)g(.)g(.)g(.)16 b Fe(6)75 675 y Fc(current)p
+217 675 V 11 w(history)7 b Fd(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)
+g(.)g(.)g(.)22 b Fe(7)75 774 y Fm(G)75 832 y Fc(get)p
+137 832 V 13 w(history)p 290 832 V 11 w(event)8 b Fd(.)e(.)g(.)g(.)g(.)
+g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h
+(.)f(.)g(.)g(.)g(.)g(.)g(.)22 b Fe(9)75 932 y Fm(H)75
+990 y Fc(history)p 217 990 V 11 w(arg)p 288 990 V 13
+w(extract)7 b Fd(.)t(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)
+g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)20
+b Fe(9)75 1040 y Fc(history)p 217 1040 V 11 w(base)f
+Fd(.)6 b(.)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(.)h(.)f(.)g(.)19
+b Fe(9)75 1090 y Fc(history_co)o(mm)o(ent)o(_c)o(har)g
+Fd(.)6 b(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
+g(.)g(.)g(.)g(.)g(.)g(.)23 b Fe(10)75 1139 y Fc(history)p
+217 1139 V 11 w(expand)9 b Fd(.)d(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)
+g(.)g(.)g(.)g(.)23 b Fe(9)75 1189 y Fc(history)p 217
+1189 V 11 w(expansion)p 408 1189 V 11 w(char)17 b Fd(.)6
+b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)18 b Fe(9)75 1239 y Fc(history)p 217
+1239 V 11 w(get)6 b Fd(.)f(.)h(.)g(.)h(.)f(.)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(.)h(.)18 b Fe(7)75 1289 y Fc(history)p
+217 1289 V 11 w(get)p 288 1289 V 13 w(history)p 441 1289
+V 12 w(state)9 b Fd(.)d(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)h(.)f(.)g(.)g(.)g(.)g(.)23 b Fe(6)75 1339 y Fc(history_in)o(hi)o
+(bit)o(_e)o(xpa)o(nsi)o(on)o(_fu)o(nc)o(tio)o(n)c Fd(.)6
+b(.)g(.)g(.)g(.)g(.)g(.)22 b Fe(10)75 1389 y Fc(history)p
+217 1389 V 11 w(is)p 268 1389 V 14 w(stifled)8 b Fd(.)s(.)f(.)f(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)
+g(.)g(.)g(.)g(.)g(.)21 b Fe(6)75 1438 y Fc(history)p
+217 1438 V 11 w(length)15 b Fd(.)6 b(.)g(.)g(.)g(.)h(.)f(.)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(.)17 b Fe(9)75 1488 y Fc(history)p 217
+1488 V 11 w(list)5 b Fd(.)g(.)h(.)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(.)h(.)
+f(.)g(.)g(.)g(.)g(.)17 b Fe(7)75 1538 y Fc(history_no)o(_e)o(xpa)o(nd)o
+(_ch)o(ars)e Fd(.)6 b(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)19 b Fe(10)75 1588 y Fc(history_qu)o(ot)o
+(es_)o(in)o(hib)o(it_)o(ex)o(pan)o(si)o(on)13 b Fd(.)6
+b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)16 b Fe(10)75 1638
+y Fc(history)p 217 1638 V 11 w(search)9 b Fd(.)d(.)g(.)g(.)g(.)g(.)g(.)
+g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)23 b Fe(7)75 1687 y Fc(history_se)o(ar)o
+(ch_)o(de)o(lim)o(ite)o(r_)o(cha)o(rs)15 b Fd(.)6 b(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)h(.)f(.)g(.)18 b Fe(10)75 1737 y Fc(history)p
+217 1737 V 11 w(search)p 348 1737 V 12 w(pos)8 b Fd(.)d(.)i(.)f(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)
+g(.)g(.)g(.)g(.)g(.)21 b Fe(8)75 1787 y Fc(history)p
+217 1787 V 11 w(search)p 348 1787 V 12 w(prefix)5 b Fd(.)t(.)h(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)
+g(.)g(.)g(.)17 b Fe(8)75 1837 y Fc(history)p 217 1837
+V 11 w(set)p 288 1837 V 13 w(history)p 441 1837 V 12
+w(state)9 b Fd(.)d(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h
+(.)f(.)g(.)g(.)g(.)g(.)23 b Fe(6)75 1887 y Fc(history)p
+217 1887 V 11 w(set)p 288 1887 V 13 w(pos)t Fd(.)5 b(.)h(.)g(.)g(.)g(.)
+g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)16 b Fe(7)1012 359
+y Fc(history_sub)o(st)o(_ch)o(ar)d Fd(.)6 b(.)g(.)g(.)g(.)g(.)h(.)f(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)
+17 b Fe(10)1012 409 y Fc(history)p 1154 409 V 12 w(tokenize)8
+b Fd(.)s(.)e(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)
+g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)21
+b Fe(9)1012 459 y Fc(history)p 1154 459 V 12 w(total)p
+1266 459 V 12 w(bytes)7 b Fd(.)t(.)f(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)
+g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)20
+b Fe(7)1012 509 y Fc(history)p 1154 509 V 12 w(truncate)p
+1326 509 V 11 w(file)5 b Fd(.)t(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h
+(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)18
+b Fe(8)1012 612 y Fm(M)1012 670 y Fc(max)p 1074 670 V
+13 w(input)p 1187 670 V 13 w(history)13 b Fd(.)6 b(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
+g(.)h(.)f(.)g(.)g(.)16 b Fe(9)1012 773 y Fm(N)1012 831
+y Fc(next)p 1094 831 V 13 w(history)5 b Fd(.)s(.)h(.)g(.)g(.)g(.)g(.)g
+(.)h(.)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(.)18 b Fe(7)1012
+934 y Fm(P)1012 992 y Fc(previous)p 1174 992 V 11 w(history)8
+b Fd(.)t(.)e(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)
+g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)21
+b Fe(7)1012 1096 y Fm(R)1012 1154 y Fc(read)p 1094 1154
+V 13 w(history)5 b Fd(.)s(.)h(.)g(.)g(.)g(.)g(.)g(.)h(.)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(.)18 b Fe(8)1012 1204 y Fc(read)p 1094
+1204 V 13 w(history)p 1247 1204 V 11 w(range)8 b Fd(.)d(.)h(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
+g(.)g(.)g(.)h(.)f(.)21 b Fe(8)1012 1253 y Fc(remove)p
+1134 1253 V 12 w(history)8 b Fd(.)e(.)g(.)g(.)g(.)h(.)f(.)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(.)24 b Fe(6)1012 1303 y Fc(replace)p 1154
+1303 V 12 w(history)p 1306 1303 V 11 w(entry)5 b Fd(.)t(.)h(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
+g(.)g(.)18 b Fe(6)1012 1406 y Fm(S)1012 1464 y Fc(stifle)p
+1134 1464 V 12 w(history)8 b Fd(.)e(.)g(.)g(.)g(.)h(.)f(.)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(.)24 b Fe(6)1012 1568 y Fm(U)1012 1626
+y Fc(unstifle)p 1174 1626 V 11 w(history)8 b Fd(.)t(.)e(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
+g(.)h(.)f(.)g(.)g(.)g(.)21 b Fe(6)1012 1676 y Fc(using)p
+1114 1676 V 13 w(history)s Fd(.)s(.)6 b(.)h(.)f(.)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(.)17 b Fe(6)1012 1779 y Fm(W)1012
+1837 y Fc(where)p 1114 1837 V 13 w(history)s Fd(.)s(.)6
+b(.)h(.)f(.)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(.)17
+b Fe(7)1012 1887 y Fc(write)p 1114 1887 V 13 w(history)s
+Fd(.)s(.)6 b(.)h(.)f(.)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(.)17
+b Fe(8)p eop
+%%Page: 16 18
+16 17 bop 75 -58 a Fo(16)1324 b(GNU)15 b(History)g(Library)p
+eop
+%%Page: -1 19
+-1 18 bop 1862 -58 a Fo(i)75 183 y Fk(T)-7 b(able)27
+b(of)f(Con)n(ten)n(ts)75 354 y Fm(1)67 b(Using)22 b(History)h(In)n
+(teractiv)n(ely)9 b Fb(.)k(.)d(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)h
+(.)f(.)g(.)g(.)h(.)31 b Fm(1)224 423 y Fo(1.1)45 b(History)15
+b(Expansion)5 b Fa(.)j(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f
+(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)
+f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)19 b Fo(1)374 478 y(1.1.1)44
+b(Ev)o(en)o(t)14 b(Designators)e Fa(.)7 b(.)h(.)f(.)h(.)f(.)h(.)f(.)h
+(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)
+f(.)h(.)f(.)h(.)26 b Fo(1)374 532 y(1.1.2)44 b(W)l(ord)15
+b(Designators)5 b Fa(.)h(.)i(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)
+f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h
+(.)19 b Fo(2)374 587 y(1.1.3)44 b(Mo)q(di\014ers)t Fa(.)8
+b(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f
+(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)
+f(.)h(.)f(.)19 b Fo(2)75 708 y Fm(2)67 b(Programming)23
+b(with)g(GNU)f(History)16 b Fb(.)10 b(.)g(.)g(.)h(.)f(.)g(.)g(.)h(.)f
+(.)g(.)38 b Fm(5)224 777 y Fo(2.1)45 b(In)o(tro)q(duction)16
+b(to)f(History)10 b Fa(.)d(.)g(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f
+(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)
+f(.)h(.)f(.)h(.)24 b Fo(5)224 832 y(2.2)45 b(History)15
+b(Storage)c Fa(.)d(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f
+(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)
+g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)26 b Fo(5)224 886
+y(2.3)45 b(History)15 b(F)l(unctions)d Fa(.)c(.)f(.)h(.)f(.)h(.)f(.)h
+(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)
+f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)26
+b Fo(6)374 941 y(2.3.1)44 b(Initializing)18 b(History)d(and)h(State)e
+(Managemen)o(t)g Fa(.)7 b(.)h(.)g(.)f(.)h(.)f(.)29 b
+Fo(6)374 996 y(2.3.2)44 b(History)15 b(List)h(Managemen)o(t)d
+Fa(.)7 b(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)
+h(.)f(.)h(.)f(.)h(.)f(.)29 b Fo(6)374 1051 y(2.3.3)44
+b(Information)15 b(Ab)q(out)g(the)h(History)f(List)c
+Fa(.)d(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)26
+b Fo(7)374 1106 y(2.3.4)44 b(Mo)o(ving)15 b(Around)g(the)g(History)g
+(List)c Fa(.)d(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f
+(.)h(.)25 b Fo(7)374 1160 y(2.3.5)44 b(Searc)o(hing)16
+b(the)f(History)g(List)7 b Fa(.)h(.)g(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f
+(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)22
+b Fo(7)374 1215 y(2.3.6)44 b(Managing)15 b(the)g(History)g(File)6
+b Fa(.)i(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)
+f(.)h(.)f(.)h(.)f(.)h(.)20 b Fo(8)374 1270 y(2.3.7)44
+b(History)15 b(Expansion)9 b Fa(.)f(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h
+(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)
+h(.)f(.)24 b Fo(8)224 1325 y(2.4)45 b(History)15 b(V)l(ariables)6
+b Fa(.)j(.)e(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)
+f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h
+(.)f(.)h(.)f(.)h(.)f(.)21 b Fo(9)224 1380 y(2.5)45 b(History)15
+b(Programming)f(Example)7 b Fa(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h
+(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)22
+b Fo(10)75 1501 y Fm(App)r(endix)i(A)67 b(Concept)22
+b(Index)17 b Fb(.)10 b(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)h(.)f(.)g(.)g
+(.)h(.)f(.)g(.)38 b Fm(13)75 1636 y(App)r(endix)24 b(B)67
+b(F)-6 b(unction)25 b(and)e(V)-6 b(ariable)24 b(Index)16
+b Fb(.)10 b(.)g(.)g(.)38 b Fm(15)p eop
+%%Page: -2 20
+-2 19 bop 75 -58 a Fo(ii)1346 b(GNU)15 b(History)g(Library)p
+eop
+%%Trailer
+end
+userdict /end-hook known{end-hook}if
+%%EOF
diff --git a/gnu/lib/libreadline/doc/hstech.texinfo b/gnu/lib/libreadline/doc/hstech.texinfo
new file mode 100644
index 00000000000..12fff2c9a75
--- /dev/null
+++ b/gnu/lib/libreadline/doc/hstech.texinfo
@@ -0,0 +1,522 @@
+@ignore
+This file documents the user interface to the GNU History library.
+
+Copyright (C) 1988, 1991, 1994, 1996 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 GNU History Library.
+It should be considered a technical guide.
+For information on the interactive use of 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 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 struct _hist_entry @{
+ char *line;
+ char *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 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;
+@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
+present in GNU History.
+
+@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 ()
+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 ()
+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 (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 {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 {HIST_ENTRY *} replace_history_entry (int which, char *line, char *data)
+Make the history entry at offset @var{which} have @var{line} and @var{data}.
+This returns the old entry so you can dispose of the data. In the case
+of an invalid @var{which}, a @code{NULL} pointer is returned.
+@end deftypefun
+
+@deftypefun void clear_history ()
+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 ()
+Stop stifling the history. This returns the previous amount the
+history was stifled. The value is positive if the history was
+stifled, negative if it wasn't.
+@end deftypefun
+
+@deftypefun int history_is_stifled ()
+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 ()
+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 ()
+Returns the offset of the current history element.
+@end deftypefun
+
+@deftypefun {HIST_ENTRY *} current_history ()
+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}. If there is no entry there, or if @var{offset}
+is greater than the history length, return a @code{NULL} pointer.
+@end deftypefun
+
+@deftypefun int history_total_bytes ()
+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 position in the history list to @var{pos}, an absolute index
+into the list.
+@end deftypefun
+
+@deftypefun {HIST_ENTRY *} previous_history ()
+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 ()
+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 (char *string, int direction)
+Search the history for @var{string}, starting at the current history
+offset. If @var{direction} < 0, then the search is through previous entries,
+else through subsequent. 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 (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} < 0, then the search is through previous
+entries, else through subsequent. 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 (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 (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 errno if not.
+@end deftypefun
+
+@deftypefun int read_history_range (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 (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}. Values
+returned are as in @code{read_history ()}.
+@end deftypefun
+
+@deftypefun int append_history (int nelements, char *filename)
+Append the last @var{nelements} of the history list to @var{filename}.
+@end deftypefun
+
+@deftypefun int history_truncate_file (char *filename, int nlines)
+Truncate the history file @var{filename}, leaving only the last
+@var{nlines} lines.
+@end deftypefun
+
+@node History Expansion
+@subsection History Expansion
+
+These functions implement @code{csh}-like 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 de-slashifying of 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 *} history_arg_extract (int first, int last, char *string)
+Extract a string segment consisting of the @var{first} through @var{last}
+arguments present in @var{string}. Arguments are broken up as in Bash.
+@end deftypefun
+
+@deftypefun {char *} get_history_event (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 (char *string)
+Return an array of tokens parsed out of @var{string}, much as the
+shell might. The tokens are split on white space and on the
+characters @code{()<>;&|$}, and shell quoting conventions are
+obeyed.
+@end deftypefun
+
+@node History Variables
+@section History Variables
+
+This section describes the externally visible variables exported by
+the 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 max_input_history
+The maximum number of history entries. This must be changed using
+@code{stifle_history ()}.
+@end deftypevar
+
+@deftypevar char history_expansion_char
+The character that starts a history event. The default is @samp{!}.
+@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_no_expand_chars
+The list of characters which inhibit history expansion if found immediately
+following @var{history_expansion_char}. The default is whitespace and
+@samp{=}.
+@end deftypevar
+
+@deftypevar {char *} history_search_delimiter_chars
+The list of additional characters which can delimit a history search
+string, in addition to whitespace, @samp{:} and @samp{?} in the case of
+a substring search. The default is empty.
+@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 {Function *} 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 integer 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 NULL.
+@end deftypevar
+
+@node History Programming Example
+@section History Programming Example
+
+The following program demonstrates simple use of the GNU History Library.
+
+@smallexample
+main ()
+@{
+ 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/gnu/lib/libreadline/doc/hsuser.texinfo b/gnu/lib/libreadline/doc/hsuser.texinfo
new file mode 100644
index 00000000000..5f75f5df490
--- /dev/null
+++ b/gnu/lib/libreadline/doc/hsuser.texinfo
@@ -0,0 +1,437 @@
+@ignore
+This file documents the user interface to the GNU History library.
+
+Copyright (C) 1988-1999 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 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,
+@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 @samp{-o history} option to the @code{set} builtin
+is enabled (@pxref{The Set Builtin}),
+the shell provides access to the @var{command history},
+the list of commands previously typed.
+The value of the @code{HISTSIZE} shell variable is used as the
+number of commands to save in a history list.
+The text of the last @code{$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
+@code{HISTIGNORE} and @code{HISTCONTROL}.
+
+When the shell starts up, the history is initialized from the
+file named by the @code{HISTFILE} variable (default @file{~/.bash_history}).
+The file named by the value of @code{HISTFILE} is truncated, if
+necessary, to contain no more than the number of lines specified by
+the value of the @code{HISTFILESIZE} variable.
+When an interactive shell exits, the last
+@code{$HISTSIZE} lines are copied from the history list to the file
+named by @code{$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 @code{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 @code{$HISTFILESIZE}
+lines. If @code{HISTFILESIZE} is not set, no truncation is performed.
+
+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 @code{HISTCONTROL} and @code{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 @samp{-l} flag is
+given, the commands are listed on standard output. The @samp{-n} flag
+suppresses the command numbers when listing. The @samp{-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 @code{FCEDIT} variable if set, or the value of the
+@code{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 with a @samp{*} have been modified.
+An argument of @var{n} lists only the last @var{n} lines.
+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 @samp{-w}, @samp{-r}, @samp{-a}, or @samp{-n} options is
+used, if @var{filename}
+is given, then it is used as the history file. If not, then
+the value of the @code{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 @samp{-p} option to the @code{history} builtin command
+may be used to see what a history expansion will do before using it.
+The @samp{-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{!}
+Start a history substitution, except when followed by a space, tab,
+the end of the line, @samp{=} or @samp{(}.
+
+@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
+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{&}.
+
+@end table
diff --git a/gnu/lib/libreadline/doc/manvers.texinfo b/gnu/lib/libreadline/doc/manvers.texinfo
new file mode 100644
index 00000000000..3122b6c6fad
--- /dev/null
+++ b/gnu/lib/libreadline/doc/manvers.texinfo
@@ -0,0 +1,6 @@
+@set EDITION 4.1
+@set VERSION 4.1
+@set UPDATED 2000 January 19
+@set UPDATE-MONTH January 2000
+
+@set LASTCHANGE Wed Jan 19 12:16:30 EST 2000
diff --git a/gnu/lib/libreadline/doc/readline.0 b/gnu/lib/libreadline/doc/readline.0
new file mode 100644
index 00000000000..8d453cd098f
--- /dev/null
+++ b/gnu/lib/libreadline/doc/readline.0
@@ -0,0 +1,1188 @@
+
+
+
+READLINE(3) READLINE(3)
+
+
+NNAAMMEE
+ readline - get a line from a user with editing
+
+SSYYNNOOPPSSIISS
+ ##iinncclluuddee <<ssttddiioo..hh>>
+ ##iinncclluuddee <<rreeaaddlliinnee..hh>>
+ ##iinncclluuddee <<hhiissttoorryy..hh>>
+
+ cchhaarr **rreeaaddlliinnee ((pprroommpptt))
+ cchhaarr **pprroommpptt;;
+
+CCOOPPYYRRIIGGHHTT
+ Readline is Copyright (C) 1989, 1991, 1993, 1995, 1996 by
+ the Free Software Foundation, Inc.
+
+DDEESSCCRRIIPPTTIIOONN
+ rreeaaddlliinnee will read a line from the terminal and return it,
+ using pprroommpptt as a prompt. If pprroommpptt is null, no prompt is
+ issued. The line returned is allocated with _m_a_l_l_o_c(3), so
+ the caller must free it when finished. The line returned
+ has the final newline removed, so only the text of the
+ line remains.
+
+ rreeaaddlliinnee 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.
+
+RREETTUURRNN VVAALLUUEE
+ rreeaaddlliinnee returns the text of the line read. A blank line
+ returns the empty string. If EEOOFF is encountered while
+ reading a line, and the line is empty, NNUULLLL is returned.
+ If an EEOOFF is read with a non-empty line, it is treated as
+ a newline.
+
+NNOOTTAATTIIOONN
+ An emacs-style notation is used to denote keystrokes.
+ Control keys are denoted by C-_k_e_y, e.g., C-n means Con-
+ trol-N. Similarly, _m_e_t_a keys are denoted by M-_k_e_y, so M-x
+ means Meta-X. (On keyboards without a _m_e_t_a key, M-_x means
+ ESC _x, i.e., press the Escape key then the _x key. This
+ makes ESC the _m_e_t_a _p_r_e_f_i_x. The combination M-C-_x means
+ ESC-Control-_x, or press the Escape key then hold the Con-
+ trol key while pressing the _x key.)
+
+ Readline commands may be given numeric _a_r_g_u_m_e_n_t_s, 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., kkiillll--lliinnee) causes that command to act in
+ a backward direction. Commands whose behavior with argu-
+ ments deviates from this are noted.
+
+ When a command is described as _k_i_l_l_i_n_g text, the text
+
+
+
+GNU 1999 Jun 1 1
+
+
+
+
+
+READLINE(3) READLINE(3)
+
+
+ deleted is saved for possible future retrieval (_y_a_n_k_i_n_g).
+ The killed text is saved in a _k_i_l_l _r_i_n_g. 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.
+
+IINNIITTIIAALLIIZZAATTIIOONN FFIILLEE
+ Readline is customized by putting commands in an initial-
+ ization file (the _i_n_p_u_t_r_c file). The name of this file is
+ taken from the value of the IINNPPUUTTRRCC environment variable.
+ If that variable is unset, the default is _~_/_._i_n_p_u_t_r_c.
+ 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 ## are comments. Lines beginning with a $$
+ 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 _i_n_p_u_t_r_c would make M-C-u execute the readline
+ command _u_n_i_v_e_r_s_a_l_-_a_r_g_u_m_e_n_t.
+
+ The following symbolic character names are recognized
+ while processing key bindings: _R_U_B_O_U_T, _D_E_L, _E_S_C, _L_F_D, _N_E_W_-
+ _L_I_N_E, _R_E_T, _R_E_T_U_R_N, _S_P_C, _S_P_A_C_E, and _T_A_B.
+
+ In addition to command names, readline allows keys to be
+ bound to a string that is inserted when the key is pressed
+ (a _m_a_c_r_o).
+
+
+ KKeeyy BBiinnddiinnggss
+ The syntax for controlling key bindings in the _i_n_p_u_t_r_c
+ 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 _M_e_t_a_- or
+ _C_o_n_t_r_o_l_- prefixes, or as a key sequence. When using the
+ form kkeeyynnaammee:_f_u_n_c_t_i_o_n_-_n_a_m_e or _m_a_c_r_o, _k_e_y_n_a_m_e 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 uunniivveerr--
+ ssaall--aarrgguummeenntt, _M_-_D_E_L is bound to the function bbaacckk--
+ wwaarrdd--kkiillll--wwoorrdd, and _C_-_o is bound to run the macro
+
+
+
+GNU 1999 Jun 1 2
+
+
+
+
+
+READLINE(3) READLINE(3)
+
+
+ expressed on the right hand side (that is, to insert the
+ text _>_&_o_u_t_p_u_t into the line).
+
+ In the second form, ""kkeeyysseeqq"":_f_u_n_c_t_i_o_n_-_n_a_m_e or _m_a_c_r_o, kkeeyy--
+ sseeqq differs from kkeeyynnaammee 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.
+
+ "\C-u": universal-argument
+ "\C-x\C-r": re-read-init-file
+ "\e[11~": "Function Key 1"
+
+ In this example, _C_-_u is again bound to the function uunnii--
+ vveerrssaall--aarrgguummeenntt. _C_-_x _C_-_r is bound to the function
+ rree--rreeaadd--iinniitt--ffiillee, and _E_S_C _[ _1 _1 _~ is bound to insert the
+ text FFuunnccttiioonn KKeeyy 11. The full set of GNU Emacs style
+ escape sequences is
+ \\CC-- control prefix
+ \\MM-- meta prefix
+ \\ee an escape character
+ \\\\ backslash
+ \\"" literal "
+ \\'' literal '
+
+ In addition to the GNU Emacs style escape sequences, a
+ second set of backslash escapes is available:
+ \\aa alert (bell)
+ \\bb backspace
+ \\dd delete
+ \\ff form feed
+ \\nn newline
+ \\rr carriage return
+ \\tt horizontal tab
+ \\vv vertical tab
+ \\_n_n_n the character whose ASCII code is the octal
+ value _n_n_n (one to three digits)
+ \\xx_n_n_n the character whose ASCII code is the hex-
+ adecimal value _n_n_n (one to three 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. Back-
+ slash will quote any other character in the macro text,
+ including " and '.
+
+ BBaasshh allows the current readline key bindings to be dis-
+ played or modified with the bbiinndd builtin command. The
+ editing mode may be switched during interactive use by
+ using the --oo option to the sseett builtin command. Other
+ programs using this library provide similar mechanisms.
+ The _i_n_p_u_t_r_c file may be edited and re-read if a program
+ does not provide any other means to incorporate new
+
+
+
+GNU 1999 Jun 1 3
+
+
+
+
+
+READLINE(3) READLINE(3)
+
+
+ bindings.
+
+ VVaarriiaabblleess
+ Readline has variables that can be used to further cus-
+ tomize its behavior. A variable may be set in the _i_n_p_u_t_r_c
+ file with a statement of the form
+
+ sseett _v_a_r_i_a_b_l_e_-_n_a_m_e _v_a_l_u_e
+
+ Except where noted, readline variables can take the values
+ OOnn or OOffff. The variables and their default values are:
+
+ bbeellll--ssttyyllee ((aauuddiibbllee))
+ Controls what happens when readline wants to ring
+ the terminal bell. If set to nnoonnee, readline never
+ rings the bell. If set to vviissiibbllee, readline uses a
+ visible bell if one is available. If set to aauuddii--
+ bbllee, readline attempts to ring the terminal's bell.
+ ccoommmmeenntt--bbeeggiinn ((````##''''))
+ The string that is inserted in vvii mode when the
+ iinnsseerrtt--ccoommmmeenntt command is executed. This command
+ is bound to MM--## in emacs mode and to ## in vi com-
+ mand mode.
+ ccoommpplleettiioonn--iiggnnoorree--ccaassee ((OOffff))
+ If set to OOnn, readline performs filename matching
+ and completion in a case-insensitive fashion.
+ ccoommpplleettiioonn--qquueerryy--iitteemmss ((110000))
+ This determines when the user is queried about
+ viewing the number of possible completions gener-
+ ated by the ppoossssiibbllee--ccoommpplleettiioonnss 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 vari-
+ able, the user is asked whether or not he wishes to
+ view them; otherwise they are simply listed on the
+ terminal.
+ ccoonnvveerrtt--mmeettaa ((OOnn))
+ If set to OOnn, readline will convert characters with
+ the eighth bit set to an ASCII key sequence by
+ stripping the eighth bit and prepending an escape
+ character (in effect, using escape as the _m_e_t_a _p_r_e_-
+ _f_i_x).
+ ddiissaabbllee--ccoommpplleettiioonn ((OOffff))
+ If set to OOnn, readline will inhibit word comple-
+ tion. Completion characters will be inserted into
+ the line as if they had been mapped to sseellff--iinnsseerrtt.
+ eeddiittiinngg--mmooddee ((eemmaaccss))
+ Controls whether readline begins with a set of key
+ bindings similar to _e_m_a_c_s or _v_i. eeddiittiinngg--mmooddee can
+ be set to either eemmaaccss or vvii.
+ eennaabbllee--kkeeyyppaadd ((OOffff))
+ When set to OOnn, readline will try to enable the
+ application keypad when it is called. Some systems
+ need this to enable the arrow keys.
+
+
+
+GNU 1999 Jun 1 4
+
+
+
+
+
+READLINE(3) READLINE(3)
+
+
+ eexxppaanndd--ttiillddee ((OOffff))
+ If set to oonn, tilde expansion is performed when
+ readline attempts word completion.
+ hhoorriizzoonnttaall--ssccrroollll--mmooddee ((OOffff))
+ When set to OOnn, 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.
+ iinnppuutt--mmeettaa ((OOffff))
+ If set to OOnn, readline will enable eight-bit input
+ (that is, it will not strip the high bit from the
+ characters it reads), regardless of what the termi-
+ nal claims it can support. The name mmeettaa--ffllaagg is a
+ synonym for this variable.
+ iisseeaarrcchh--tteerrmmiinnaattoorrss ((````CC--[[CC--JJ''''))
+ 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 _E_S_C and _C_-_J
+ will terminate an incremental search.
+ kkeeyymmaapp ((eemmaaccss))
+ Set the current readline keymap. The set of legal
+ keymap names is _e_m_a_c_s_, _e_m_a_c_s_-_s_t_a_n_d_a_r_d_, _e_m_a_c_s_-_m_e_t_a_,
+ _e_m_a_c_s_-_c_t_l_x_, _v_i_, _v_i_-_m_o_v_e_, _v_i_-_c_o_m_m_a_n_d, and _v_i_-_i_n_s_e_r_t.
+ _v_i is equivalent to _v_i_-_c_o_m_m_a_n_d; _e_m_a_c_s is equivalent
+ to _e_m_a_c_s_-_s_t_a_n_d_a_r_d. The default value is _e_m_a_c_s; the
+ value of eeddiittiinngg--mmooddee also affects the default
+ keymap.
+ mmaarrkk--ddiirreeccttoorriieess ((OOnn))
+ If set to OOnn, complete<d directory names have a
+ slash appended.
+ mmaarrkk--mmooddiiffiieedd--lliinneess ((OOffff))
+ If set to OOnn, history lines that have been modified
+ are displayed with a preceding asterisk (**).
+ oouuttppuutt--mmeettaa ((OOffff))
+ If set to OOnn, readline will display characters with
+ the eighth bit set directly rather than as a meta-
+ prefixed escape sequence.
+ pprriinntt--ccoommpplleettiioonnss--hhoorriizzoonnttaallllyy ((OOffff))
+ If set to OOnn, readline will display completions
+ with matches sorted horizontally in alphabetical
+ order, rather than down the screen.
+ sshhooww--aallll--iiff--aammbbiigguuoouuss ((OOffff))
+ This alters the default behavior of the completion
+ functions. If set to oonn, words which have more
+ than one possible completion cause the matches to
+ be listed immediately instead of ringing the bell.
+ vviissiibbllee--ssttaattss ((OOffff))
+ If set to OOnn, a character denoting a file's type as
+ reported by ssttaatt(2) is appended to the filename
+ when listing possible completions.
+
+ CCoonnddiittiioonnaall CCoonnssttrruuccttss
+ Readline implements a facility similar in spirit to the
+
+
+
+GNU 1999 Jun 1 5
+
+
+
+
+
+READLINE(3) READLINE(3)
+
+
+ conditional compilation features of the C preprocessor
+ which allows key bindings and variable settings to be per-
+ formed as the result of tests. There are four parser
+ directives used.
+
+ $$iiff The $$iiff 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.
+
+ mmooddee The mmooddee== form of the $$iiff directive is used
+ to test whether readline is in emacs or vi
+ mode. This may be used in conjunction with
+ the sseett kkeeyymmaapp command, for instance, to set
+ bindings in the _e_m_a_c_s_-_s_t_a_n_d_a_r_d and _e_m_a_c_s_-
+ _c_t_l_x keymaps only if readline is starting
+ out in emacs mode.
+
+ tteerrmm The tteerrmm== form may be used to include termi-
+ nal-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 the full name of
+ the terminal and the portion of the terminal
+ name before the first --. This allows _s_u_n to
+ match both _s_u_n and _s_u_n_-_c_m_d, for instance.
+
+ aapppplliiccaattiioonn
+ The aapppplliiccaattiioonn construct is used to include
+ application-specific settings. Each program
+ using the readline library sets the _a_p_p_l_i_c_a_-
+ _t_i_o_n _n_a_m_e, and an initialization file can
+ test for a particular value. This could be
+ used to bind key sequences to functions use-
+ ful for a specific program. For instance,
+ the following command adds a key sequence
+ that quotes the current or previous word in
+ Bash:
+
+ $$iiff bash
+ # Quote the current or previous word
+ "\C-xq": "\eb\"\ef\""
+ $$eennddiiff
+
+ $$eennddiiff This command, as seen in the previous example, ter-
+ minates an $$iiff command.
+
+ $$eellssee Commands in this branch of the $$iiff directive are
+ executed if the test fails.
+
+ $$iinncclluuddee
+ This directive takes a single filename as an argu-
+ ment and reads commands and bindings from that
+
+
+
+GNU 1999 Jun 1 6
+
+
+
+
+
+READLINE(3) READLINE(3)
+
+
+ file. For example, the following directive would
+ read _/_e_t_c_/_i_n_p_u_t_r_c:
+
+ $$iinncclluuddee _/_e_t_c_/_i_n_p_u_t_r_c
+
+SSEEAARRCCHHIINNGG
+ Readline provides commands for searching through the com-
+ mand history for lines containing a specified string.
+ There are two search modes: _i_n_c_r_e_m_e_n_t_a_l and _n_o_n_-_i_n_c_r_e_m_e_n_-
+ _t_a_l.
+
+ 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. The characters present in the
+ value of the _i_s_e_a_r_c_h_-_t_e_r_m_i_n_a_t_o_r_s variable are used to ter-
+ minate an incremental search. If that variable has not
+ been assigned a value the Escape and Control-J characters
+ will terminate an incremental search. Control-G will
+ abort an incremental search and restore the original line.
+ When the search is terminated, the history entry contain-
+ ing the search string becomes the current line. To find
+ other matching entries in the history list, type Control-S
+ or Control-R 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 _n_e_w_l_i_n_e will terminate
+ the search and accept the line, thereby executing the com-
+ mand from the history list.
+
+ 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.
+
+EEDDIITTIINNGG CCOOMMMMAANNDDSS
+ The following is a list of the names of the commands and
+ the default key sequences to which they are bound. Com-
+ mand names without an accompanying key sequence are
+ unbound by default.
+
+ CCoommmmaannddss ffoorr MMoovviinngg
+ bbeeggiinnnniinngg--ooff--lliinnee ((CC--aa))
+ Move to the start of the current line.
+ eenndd--ooff--lliinnee ((CC--ee))
+ Move to the end of the line.
+ ffoorrwwaarrdd--cchhaarr ((CC--ff))
+ Move forward a character.
+ bbaacckkwwaarrdd--cchhaarr ((CC--bb))
+ Move back a character.
+
+
+
+
+GNU 1999 Jun 1 7
+
+
+
+
+
+READLINE(3) READLINE(3)
+
+
+ ffoorrwwaarrdd--wwoorrdd ((MM--ff))
+ Move forward to the end of the next word. Words
+ are composed of alphanumeric characters (letters
+ and digits).
+ bbaacckkwwaarrdd--wwoorrdd ((MM--bb))
+ Move back to the start of the current or previous
+ word. Words are composed of alphanumeric charac-
+ ters (letters and digits).
+ cclleeaarr--ssccrreeeenn ((CC--ll))
+ Clear the screen leaving the current line at the
+ top of the screen. With an argument, refresh the
+ current line without clearing the screen.
+ rreeddrraaww--ccuurrrreenntt--lliinnee
+ Refresh the current line.
+
+ CCoommmmaannddss ffoorr MMaanniippuullaattiinngg tthhee HHiissttoorryy
+ aacccceepptt--lliinnee ((NNeewwlliinnee,, RReettuurrnn))
+ Accept the line regardless of where the cursor is.
+ If this line is non-empty, add it to the history
+ list. If the line is a modified history line, then
+ restore the history line to its original state.
+ pprreevviioouuss--hhiissttoorryy ((CC--pp))
+ Fetch the previous command from the history list,
+ moving back in the list.
+ nneexxtt--hhiissttoorryy ((CC--nn))
+ Fetch the next command from the history list, mov-
+ ing forward in the list.
+ bbeeggiinnnniinngg--ooff--hhiissttoorryy ((MM--<<))
+ Move to the first line in the history.
+ eenndd--ooff--hhiissttoorryy ((MM-->>))
+ Move to the end of the input history, i.e., the
+ line currently being entered.
+ rreevveerrssee--sseeaarrcchh--hhiissttoorryy ((CC--rr))
+ Search backward starting at the current line and
+ moving `up' through the history as necessary. This
+ is an incremental search.
+ ffoorrwwaarrdd--sseeaarrcchh--hhiissttoorryy ((CC--ss))
+ Search forward starting at the current line and
+ moving `down' through the history as necessary.
+ This is an incremental search.
+ nnoonn--iinnccrreemmeennttaall--rreevveerrssee--sseeaarrcchh--hhiissttoorryy ((MM--pp))
+ Search backward through the history starting at the
+ current line using a non-incremental search for a
+ string supplied by the user.
+ nnoonn--iinnccrreemmeennttaall--ffoorrwwaarrdd--sseeaarrcchh--hhiissttoorryy ((MM--nn))
+ Search forward through the history using a non-
+ incremental search for a string supplied by the
+ user.
+ hhiissttoorryy--sseeaarrcchh--ffoorrwwaarrdd
+ Search forward through the history for the string
+ of characters between the start of the current line
+ and the current cursor position (the _p_o_i_n_t). This
+ is a non-incremental search.
+
+
+
+
+GNU 1999 Jun 1 8
+
+
+
+
+
+READLINE(3) READLINE(3)
+
+
+ hhiissttoorryy--sseeaarrcchh--bbaacckkwwaarrdd
+ 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.
+ yyaannkk--nntthh--aarrgg ((MM--CC--yy))
+ Insert the first argument to the previous command
+ (usually the second word on the previous line) at
+ point (the current cursor position). With an argu-
+ ment _n, insert the _nth word from the previous com-
+ mand (the words in the previous command begin with
+ word 0). A negative argument inserts the _nth word
+ from the end of the previous command.
+ yyaannkk--llaasstt--aarrgg ((MM--..,, MM--__))
+ Insert the last argument to the previous command
+ (the last word of the previous history entry).
+ With an argument, behave exactly like yyaannkk--nntthh--aarrgg.
+ Successive calls to yyaannkk--llaasstt--aarrgg move back through
+ the history list, inserting the last argument of
+ each line in turn.
+
+ CCoommmmaannddss ffoorr CChhaannggiinngg TTeexxtt
+ ddeelleettee--cchhaarr ((CC--dd))
+ Delete the character under the cursor. If point is
+ at the beginning of the line, there are no charac-
+ ters in the line, and the last character typed was
+ not bound to BBddeelleettee--cchhaarr, then return EEOOFF.
+ bbaacckkwwaarrdd--ddeelleettee--cchhaarr ((RRuubboouutt))
+ Delete the character behind the cursor. When given
+ a numeric argument, save the deleted text on the
+ kill ring.
+ ffoorrwwaarrdd--bbaacckkwwaarrdd--ddeelleettee--cchhaarr
+ 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.
+ qquuootteedd--iinnsseerrtt ((CC--qq,, CC--vv))
+ Add the next character that you type to the line
+ verbatim. This is how to insert characters like
+ CC--qq, for example.
+ ttaabb--iinnsseerrtt ((MM--TTAABB))
+ Insert a tab character.
+ sseellff--iinnsseerrtt ((aa,, bb,, AA,, 11,, !!,, ......))
+ Insert the character typed.
+ ttrraannssppoossee--cchhaarrss ((CC--tt))
+ Drag the character before point forward over the
+ character at point. Point moves forward as well.
+ If point is at the end of the line, then transpose
+ the two characters before point. Negative argu-
+ ments don't work.
+ ttrraannssppoossee--wwoorrddss ((MM--tt))
+ Drag the word behind the cursor past the word in
+ front of the cursor moving the cursor over that
+ word as well.
+
+
+
+
+GNU 1999 Jun 1 9
+
+
+
+
+
+READLINE(3) READLINE(3)
+
+
+ uuppccaassee--wwoorrdd ((MM--uu))
+ Uppercase the current (or following) word. With a
+ negative argument, uppercase the previous word, but
+ do not move point.
+ ddoowwnnccaassee--wwoorrdd ((MM--ll))
+ Lowercase the current (or following) word. With a
+ negative argument, lowercase the previous word, but
+ do not move point.
+ ccaappiittaalliizzee--wwoorrdd ((MM--cc))
+ Capitalize the current (or following) word. With a
+ negative argument, capitalize the previous word,
+ but do not move point.
+
+ KKiilllliinngg aanndd YYaannkkiinngg
+ kkiillll--lliinnee ((CC--kk))
+ Kill the text from the current cursor position to
+ the end of the line.
+ bbaacckkwwaarrdd--kkiillll--lliinnee ((CC--xx RRuubboouutt))
+ Kill backward to the beginning of the line.
+ uunniixx--lliinnee--ddiissccaarrdd ((CC--uu))
+ Kill backward from point to the beginning of the
+ line. The killed text is saved on the kill-ring.
+ kkiillll--wwhhoollee--lliinnee
+ Kill all characters on the current line, no matter
+ where the cursor is.
+ kkiillll--wwoorrdd ((MM--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 ffoorrwwaarrdd--wwoorrdd.
+ bbaacckkwwaarrdd--kkiillll--wwoorrdd ((MM--RRuubboouutt))
+ Kill the word behind the cursor. Word boundaries
+ are the same as those used by bbaacckkwwaarrdd--wwoorrdd.
+ uunniixx--wwoorrdd--rruubboouutt ((CC--ww))
+ Kill the word behind the cursor, using white space
+ as a word boundary. The word boundaries are dif-
+ ferent from bbaacckkwwaarrdd--kkiillll--wwoorrdd.
+ ddeelleettee--hhoorriizzoonnttaall--ssppaaccee ((MM--\\))
+ Delete all spaces and tabs around point.
+ kkiillll--rreeggiioonn
+ Kill the text between the point and _m_a_r_k (saved
+ cursor position). This text is referred to as the
+ _r_e_g_i_o_n.
+ ccooppyy--rreeggiioonn--aass--kkiillll
+ Copy the text in the region to the kill buffer.
+ ccooppyy--bbaacckkwwaarrdd--wwoorrdd
+ Copy the word before point to the kill buffer. The
+ word boundaries are the same as bbaacckkwwaarrdd--wwoorrdd.
+ ccooppyy--ffoorrwwaarrdd--wwoorrdd
+ Copy the word following point to the kill buffer.
+ The word boundaries are the same as ffoorrwwaarrdd--wwoorrdd.
+ yyaannkk ((CC--yy))
+ Yank the top of the kill ring into the buffer at
+ the cursor.
+
+
+
+GNU 1999 Jun 1 10
+
+
+
+
+
+READLINE(3) READLINE(3)
+
+
+ yyaannkk--ppoopp ((MM--yy))
+ Rotate the kill ring, and yank the new top. Only
+ works following yyaannkk or yyaannkk--ppoopp.
+
+ NNuummeerriicc AArrgguummeennttss
+ ddiiggiitt--aarrgguummeenntt ((MM--00,, MM--11,, ......,, MM----))
+ Add this digit to the argument already accumulat-
+ ing, or start a new argument. M-- starts a nega-
+ tive argument.
+ uunniivveerrssaall--aarrgguummeenntt
+ 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 uunniivveerrssaall--aarrgguummeenntt again ends the
+ numeric argument, but is otherwise ignored. As a
+ special case, if this command is immediately fol-
+ lowed 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 ini-
+ tially one, so executing this function the first
+ time makes the argument count four, a second time
+ makes the argument count sixteen, and so on.
+
+ CCoommpplleettiinngg
+ ccoommpplleettee ((TTAABB))
+ Attempt to perform completion on the text before
+ point. The actual completion performed is applica-
+ tion-specific. BBaasshh, for instance, attempts com-
+ pletion treating the text as a variable (if the
+ text begins with $$), username (if the text begins
+ with ~~), hostname (if the text begins with @@), or
+ command (including aliases and functions) in turn.
+ If none of these produces a match, filename comple-
+ tion is attempted. GGddbb, on the other hand, allows
+ completion of program functions and variables, and
+ only attempts filename completion under certain
+ circumstances.
+ ppoossssiibbllee--ccoommpplleettiioonnss ((MM--??))
+ List the possible completions of the text before
+ point.
+ iinnsseerrtt--ccoommpplleettiioonnss ((MM--**))
+ Insert all completions of the text before point
+ that would have been generated by ppoossssiibbllee--ccoommppllee--
+ ttiioonnss.
+ mmeennuu--ccoommpplleettee
+ Similar to ccoommpplleettee, but replaces the word to be
+ completed with a single match from the list of pos-
+ sible completions. Repeated execution of mmeennuu--ccoomm--
+ pplleettee steps through the list of possible comple-
+ tions, inserting each match in turn. At the end of
+ the list of completions, the bell is rung and the
+ original text is restored. An argument of _n moves
+ _n positions forward in the list of matches; a
+
+
+
+GNU 1999 Jun 1 11
+
+
+
+
+
+READLINE(3) READLINE(3)
+
+
+ negative argument may be used to move backward
+ through the list. This command is intended to be
+ bound to TTAABB, but is unbound by default.
+ ddeelleettee--cchhaarr--oorr--lliisstt
+ Deletes the character under the cursor if not at
+ the beginning or end of the line (like ddeelleettee--
+ cchhaarr). If at the end of the line, behaves identi-
+ cally to ppoossssiibbllee--ccoommpplleettiioonnss. This command is
+ unbound by default.
+
+ KKeeyybbooaarrdd MMaaccrrooss
+ ssttaarrtt--kkbbdd--mmaaccrroo ((CC--xx (())
+ Begin saving the characters typed into the current
+ keyboard macro.
+ eenndd--kkbbdd--mmaaccrroo ((CC--xx ))))
+ Stop saving the characters typed into the current
+ keyboard macro and store the definition.
+ ccaallll--llaasstt--kkbbdd--mmaaccrroo ((CC--xx ee))
+ Re-execute the last keyboard macro defined, by mak-
+ ing the characters in the macro appear as if typed
+ at the keyboard.
+
+ MMiisscceellllaanneeoouuss
+ rree--rreeaadd--iinniitt--ffiillee ((CC--xx CC--rr))
+ Read in the contents of the _i_n_p_u_t_r_c file, and
+ incorporate any bindings or variable assignments
+ found there.
+ aabboorrtt ((CC--gg))
+ Abort the current editing command and ring the ter-
+ minal's bell (subject to the setting of
+ bbeellll--ssttyyllee).
+ ddoo--uuppppeerrccaassee--vveerrssiioonn ((MM--aa,, MM--bb,, MM--_x,, ......))
+ If the metafied character _x is lowercase, run the
+ command that is bound to the corresponding upper-
+ case character.
+ pprreeffiixx--mmeettaa ((EESSCC))
+ Metafy the next character typed. EESSCC ff is equiva-
+ lent to MMeettaa--ff.
+ uunnddoo ((CC--__,, CC--xx CC--uu))
+ Incremental undo, separately remembered for each
+ line.
+ rreevveerrtt--lliinnee ((MM--rr))
+ Undo all changes made to this line. This is like
+ executing the uunnddoo command enough times to return
+ the line to its initial state.
+ ttiillddee--eexxppaanndd ((MM--&&))
+ Perform tilde expansion on the current word.
+ sseett--mmaarrkk ((CC--@@,, MM--<<ssppaaccee>>))
+ Set the mark to the current point. If a numeric
+ argument is supplied, the mark is set to that posi-
+ tion.
+ eexxcchhaannggee--ppooiinntt--aanndd--mmaarrkk ((CC--xx CC--xx))
+ Swap the point with the mark. The current cursor
+ position is set to the saved position, and the old
+
+
+
+GNU 1999 Jun 1 12
+
+
+
+
+
+READLINE(3) READLINE(3)
+
+
+ cursor position is saved as the mark.
+ cchhaarraacctteerr--sseeaarrcchh ((CC--]]))
+ A character is read and point is moved to the next
+ occurrence of that character. A negative count
+ searches for previous occurrences.
+ cchhaarraacctteerr--sseeaarrcchh--bbaacckkwwaarrdd ((MM--CC--]]))
+ A character is read and point is moved to the pre-
+ vious occurrence of that character. A negative
+ count searches for subsequent occurrences.
+ iinnsseerrtt--ccoommmmeenntt ((MM--##))
+ The value of the readline ccoommmmeenntt--bbeeggiinn variable is
+ inserted at the beginning of the current line, and
+ the line is accepted as if a newline had been
+ typed. This makes the current line a shell com-
+ ment.
+ dduummpp--ffuunnccttiioonnss
+ Print all of the functions and their key bindings
+ to the readline output stream. If a numeric argu-
+ ment is supplied, the output is formatted in such a
+ way that it can be made part of an _i_n_p_u_t_r_c file.
+ dduummpp--vvaarriiaabblleess
+ Print all of the settable variables and their val-
+ ues 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 _i_n_p_u_t_r_c
+ file.
+ dduummpp--mmaaccrrooss
+ Print all of the readline key sequences bound to
+ macros and the strings they ouput. If a numeric
+ argument is supplied, the output is formatted in
+ such a way that it can be made part of an _i_n_p_u_t_r_c
+ file.
+ eemmaaccss--eeddiittiinngg--mmooddee ((CC--ee))
+ When in vvii editing mode, this causes a switch to
+ eemmaaccss editing mode.
+ vvii--eeddiittiinngg--mmooddee ((MM--CC--jj))
+ When in eemmaaccss editing mode, this causes a switch to
+ vvii editing mode.
+
+DDEEFFAAUULLTT KKEEYY BBIINNDDIINNGGSS
+ The following is a list of the default emacs and vi bind-
+ ings. Characters with the 8th bit set are written as
+ M-<character>, and are referred to as _m_e_t_a_f_i_e_d characters.
+ The printable ASCII characters not mentioned in the list
+ of emacs standard bindings are bound to the _s_e_l_f_-_i_n_s_e_r_t
+ function, which just inserts the given character into the
+ input line. In vi insertion mode, all characters not
+ specifically mentioned are bound to _s_e_l_f_-_i_n_s_e_r_t. Charac-
+ ters assigned to signal generation by _s_t_t_y(1) or the ter-
+ minal driver, such as C-Z or C-C, retain that function.
+ Upper and lower case _m_e_t_a_f_i_e_d characters are bound to the
+ same function in the emacs mode meta keymap. The remain-
+ ing characters are unbound, which causes readline to ring
+ the bell (subject to the setting of the bbeellll--ssttyyllee
+
+
+
+GNU 1999 Jun 1 13
+
+
+
+
+
+READLINE(3) READLINE(3)
+
+
+ variable).
+
+ EEmmaaccss MMooddee
+ 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
+
+
+
+GNU 1999 Jun 1 14
+
+
+
+
+
+READLINE(3) READLINE(3)
+
+
+ "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-delete-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
+
+
+ VVII MMooddee bbiinnddiinnggss
+ 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
+
+
+
+GNU 1999 Jun 1 15
+
+
+
+
+
+READLINE(3) READLINE(3)
+
+
+ "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
+ " " 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
+
+
+
+GNU 1999 Jun 1 16
+
+
+
+
+
+READLINE(3) READLINE(3)
+
+
+ "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" undo
+ "w" vi-next-word
+ "x" vi-delete
+ "y" vi-yank-to
+ "|" vi-column
+ "~" vi-change-case
+
+SSEEEE AALLSSOO
+ _T_h_e _G_n_u _R_e_a_d_l_i_n_e _L_i_b_r_a_r_y, Brian Fox and Chet Ramey
+ _T_h_e _G_n_u _H_i_s_t_o_r_y _L_i_b_r_a_r_y, Brian Fox and Chet Ramey
+ _b_a_s_h(1)
+
+FFIILLEESS
+ _~_/_._i_n_p_u_t_r_c
+ Individual rreeaaddlliinnee initialization file
+
+AAUUTTHHOORRSS
+ Brian Fox, Free Software Foundation
+ bfox@gnu.org
+
+ Chet Ramey, Case Western Reserve University
+ chet@ins.CWRU.Edu
+
+BBUUGG RREEPPOORRTTSS
+ If you find a bug in rreeaaddlliinnee,, 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 rreeaaddlliinnee
+ library that you have.
+
+
+
+GNU 1999 Jun 1 17
+
+
+
+
+
+READLINE(3) READLINE(3)
+
+
+ Once you have determined that a bug actually exists, mail
+ a bug report to _b_u_g_-_r_e_a_d_l_i_n_e@_g_n_u_._o_r_g. If you have a fix,
+ you are welcome to mail that as well! Suggestions and
+ `philosophical' bug reports may be mailed to _b_u_g_-_r_e_a_d_-
+ _l_i_n_e@_g_n_u_._o_r_g or posted to the Usenet newsgroup
+ ggnnuu..bbaasshh..bbuugg.
+
+ Comments and bug reports concerning this manual page
+ should be directed to _c_h_e_t_@_i_n_s_._C_W_R_U_._E_d_u.
+
+BBUUGGSS
+ It's too big and too slow.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+GNU 1999 Jun 1 18
+
+
diff --git a/gnu/lib/libreadline/doc/readline.3 b/gnu/lib/libreadline/doc/readline.3
new file mode 100644
index 00000000000..c1ed9cf7da5
--- /dev/null
+++ b/gnu/lib/libreadline/doc/readline.3
@@ -0,0 +1,1205 @@
+.\"
+.\" MAN PAGE COMMENTS to
+.\"
+.\" Chet Ramey
+.\" Information Network Services
+.\" Case Western Reserve University
+.\" chet@ins.CWRU.Edu
+.\"
+.\" Last Change: Tue Jun 1 13:28:03 EDT 1999
+.\"
+.TH READLINE 3 "1999 Jun 1" GNU
+.\"
+.\" 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.h>
+#include <history.h>
+.ft
+.fi
+.LP
+.nf
+.ft B
+char *readline (prompt)
+char *prompt;
+.ft
+.fi
+.SH COPYRIGHT
+.if n Readline is Copyright (C) 1989, 1991, 1993, 1995, 1996 by the Free Software Foundation, Inc.
+.if t Readline is Copyright \(co 1989, 1991, 1993, 1995, 1996 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 null, no prompt is issued. The line returned is allocated with
+.IR malloc (3),
+so 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.
+.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 .
+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
+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 RUBOUT ,
+.IR DEL ,
+.IR ESC ,
+.IR LFD ,
+.IR NEWLINE ,
+.IR RET ,
+.IR RETURN ,
+.IR SPC ,
+.IR SPACE ,
+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.
+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
+.I >&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.
+.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
+.BR "Function Key 1" .
+The full set of GNU Emacs style escape 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 "
+.TP
+.B \e'
+literal '
+.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 character whose ASCII code is the octal value \fInnn\fP
+(one to three digits)
+.TP
+.B \ex\fInnn\fP
+the character whose ASCII code is the hexadecimal value \fInnn\fP
+(one to three 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
+.BR Off .
+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 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.
+.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 prepending 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 \fIemacs\fP or \fIvi\fP.
+.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 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 strip the high bit from 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, complete<d 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 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 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 visible\-stats (Off)
+If set to \fBOn\fP, a character denoting a file's type as reported
+by \fBstat\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.
+The characters present in the value of the \fIisearch-terminators\fP
+variable are used to terminate an incremental search.
+If that variable has not been assigned a value the Escape and
+Control-J characters will terminate an incremental search.
+Control-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 Control-S or
+Control-R 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 \fInewline\fP will terminate the search and accept
+the line, thereby executing the command from the history list.
+.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.
+.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, add it to the history list. If the line is a modified
+history line, then restore the history line 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 (the current
+cursor position). 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.
+.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.
+.PD
+.SS Commands for Changing Text
+.PP
+.PD 0
+.TP
+.B delete\-char (C\-d)
+Delete the character under the cursor. 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 \fBBdelete\-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. By default, this is not bound to a key.
+.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.
+Point moves forward as well. If point is at the end of the line, then
+transpose the two characters before point. Negative arguments don't work.
+.TP
+.B transpose\-words (M\-t)
+Drag the word behind the cursor past the word in front of the cursor
+moving the cursor over that word as well.
+.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.
+.PD
+.SS Killing and Yanking
+.PP
+.PD 0
+.TP
+.B kill\-line (C\-k)
+Kill the text from the current cursor position 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 the
+cursor is.
+.TP
+.B kill\-word (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 \fBforward\-word\fP.
+.TP
+.B backward\-kill\-word (M\-Rubout)
+Kill the word behind the cursor. Word boundaries are the same as
+those used by \fBbackward\-word\fP.
+.TP
+.B unix\-word\-rubout (C\-w)
+Kill the word behind the cursor, using white space as a word boundary.
+The word boundaries are different from
+.BR backward\-kill\-word .
+.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 the cursor.
+.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 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.
+This command is unbound by default.
+.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 current 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\-#)
+The value of the readline
+.B comment\-begin
+variable is inserted at the beginning of the current line, and the line
+is accepted as if a newline had been typed. This makes the current line
+a shell comment.
+.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 ouput. 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
+editing 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 8th 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
+.I 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
+.IR 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
+.I 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-delete-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
+"\^ " 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" 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/gnu/lib/libreadline/doc/readline.dvi b/gnu/lib/libreadline/doc/readline.dvi
new file mode 100644
index 00000000000..5d859d82c66
--- /dev/null
+++ b/gnu/lib/libreadline/doc/readline.dvi
Binary files differ
diff --git a/gnu/lib/libreadline/doc/readline.html b/gnu/lib/libreadline/doc/readline.html
new file mode 100644
index 00000000000..d8a2edaf7d4
--- /dev/null
+++ b/gnu/lib/libreadline/doc/readline.html
@@ -0,0 +1,4327 @@
+<HTML>
+<HEAD>
+<!-- This HTML file has been created by texi2html 1.52
+ from /usr/homes/chet/src/bash/readline-src/doc/rlman.texinfo on 1 March 2000 -->
+
+<TITLE>GNU Readline Library</TITLE>
+</HEAD>
+<BODY>
+<H1>GNU Readline Library</H1>
+<H2>Edition 4.1, for <CODE>Readline Library</CODE> Version 4.1.</H2>
+<H2>January 2000</H2>
+<ADDRESS>Brian Fox, Free Software Foundation</ADDRESS>
+<ADDRESS>Chet Ramey, Case Western Reserve University</ADDRESS>
+<P>
+<P><HR><P>
+<H1>Table of Contents</H1>
+<UL>
+<LI><A NAME="TOC1" HREF="readline.html#SEC1">Command Line Editing</A>
+<UL>
+<LI><A NAME="TOC2" HREF="readline.html#SEC2">Introduction to Line Editing</A>
+<LI><A NAME="TOC3" HREF="readline.html#SEC3">Readline Interaction</A>
+<UL>
+<LI><A NAME="TOC4" HREF="readline.html#SEC4">Readline Bare Essentials</A>
+<LI><A NAME="TOC5" HREF="readline.html#SEC5">Readline Movement Commands</A>
+<LI><A NAME="TOC6" HREF="readline.html#SEC6">Readline Killing Commands</A>
+<LI><A NAME="TOC7" HREF="readline.html#SEC7">Readline Arguments</A>
+<LI><A NAME="TOC8" HREF="readline.html#SEC8">Searching for Commands in the History</A>
+</UL>
+<LI><A NAME="TOC9" HREF="readline.html#SEC9">Readline Init File</A>
+<UL>
+<LI><A NAME="TOC10" HREF="readline.html#SEC10">Readline Init File Syntax</A>
+<LI><A NAME="TOC11" HREF="readline.html#SEC11">Conditional Init Constructs</A>
+<LI><A NAME="TOC12" HREF="readline.html#SEC12">Sample Init File</A>
+</UL>
+<LI><A NAME="TOC13" HREF="readline.html#SEC13">Bindable Readline Commands</A>
+<UL>
+<LI><A NAME="TOC14" HREF="readline.html#SEC14">Commands For Moving</A>
+<LI><A NAME="TOC15" HREF="readline.html#SEC15">Commands For Manipulating The History</A>
+<LI><A NAME="TOC16" HREF="readline.html#SEC16">Commands For Changing Text</A>
+<LI><A NAME="TOC17" HREF="readline.html#SEC17">Killing And Yanking</A>
+<LI><A NAME="TOC18" HREF="readline.html#SEC18">Specifying Numeric Arguments</A>
+<LI><A NAME="TOC19" HREF="readline.html#SEC19">Letting Readline Type For You</A>
+<LI><A NAME="TOC20" HREF="readline.html#SEC20">Keyboard Macros</A>
+<LI><A NAME="TOC21" HREF="readline.html#SEC21">Some Miscellaneous Commands</A>
+</UL>
+<LI><A NAME="TOC22" HREF="readline.html#SEC22">Readline vi Mode</A>
+</UL>
+<LI><A NAME="TOC23" HREF="readline.html#SEC23">Programming with GNU Readline</A>
+<UL>
+<LI><A NAME="TOC24" HREF="readline.html#SEC24">Basic Behavior</A>
+<LI><A NAME="TOC25" HREF="readline.html#SEC25">Custom Functions</A>
+<UL>
+<LI><A NAME="TOC26" HREF="readline.html#SEC26">The Function Type</A>
+<LI><A NAME="TOC27" HREF="readline.html#SEC27">Writing a New Function</A>
+</UL>
+<LI><A NAME="TOC28" HREF="readline.html#SEC28">Readline Variables</A>
+<LI><A NAME="TOC29" HREF="readline.html#SEC29">Readline Convenience Functions</A>
+<UL>
+<LI><A NAME="TOC30" HREF="readline.html#SEC30">Naming a Function</A>
+<LI><A NAME="TOC31" HREF="readline.html#SEC31">Selecting a Keymap</A>
+<LI><A NAME="TOC32" HREF="readline.html#SEC32">Binding Keys</A>
+<LI><A NAME="TOC33" HREF="readline.html#SEC33">Associating Function Names and Bindings</A>
+<LI><A NAME="TOC34" HREF="readline.html#SEC34">Allowing Undoing</A>
+<LI><A NAME="TOC35" HREF="readline.html#SEC35">Redisplay</A>
+<LI><A NAME="TOC36" HREF="readline.html#SEC36">Modifying Text</A>
+<LI><A NAME="TOC37" HREF="readline.html#SEC37">Utility Functions</A>
+<LI><A NAME="TOC38" HREF="readline.html#SEC38">Alternate Interface</A>
+<LI><A NAME="TOC39" HREF="readline.html#SEC39">An Example</A>
+</UL>
+<LI><A NAME="TOC40" HREF="readline.html#SEC40">Readline Signal Handling</A>
+<LI><A NAME="TOC41" HREF="readline.html#SEC41">Custom Completers</A>
+<UL>
+<LI><A NAME="TOC42" HREF="readline.html#SEC42">How Completing Works</A>
+<LI><A NAME="TOC43" HREF="readline.html#SEC43">Completion Functions</A>
+<LI><A NAME="TOC44" HREF="readline.html#SEC44">Completion Variables</A>
+<LI><A NAME="TOC45" HREF="readline.html#SEC45">A Short Completion Example</A>
+</UL>
+</UL>
+<LI><A NAME="TOC46" HREF="readline.html#SEC46">Concept Index</A>
+<LI><A NAME="TOC47" HREF="readline.html#SEC47">Function and Variable Index</A>
+</UL>
+<P><HR><P>
+
+<P>
+This document describes the GNU Readline Library, a utility which aids
+in the consistency of user interface across discrete programs that need
+to provide a command line interface.
+
+</P>
+<P>
+Published by the Free Software Foundation <BR>
+59 Temple Place, Suite 330, <BR>
+Boston, MA 02111 USA
+
+</P>
+<P>
+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.
+
+</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 Free Software Foundation.
+
+</P>
+<P>
+Copyright (C) 1988-1999 Free Software Foundation, Inc.
+
+</P>
+
+
+
+<H1><A NAME="SEC1" HREF="readline.html#TOC1">Command Line Editing</A></H1>
+
+<P>
+This chapter describes the basic features of the GNU
+command line editing interface.
+
+</P>
+
+<UL>
+<LI><A HREF="readline.html#SEC2">Introduction and Notation</A>: Notation used in this text.
+<LI><A HREF="readline.html#SEC3">Readline Interaction</A>: The minimum set of commands for editing a line.
+<LI><A HREF="readline.html#SEC9">Readline Init File</A>: Customizing Readline from a user's view.
+<LI><A HREF="readline.html#SEC13">Bindable Readline Commands</A>: A description of most of the Readline commands
+ available for binding
+<LI><A HREF="readline.html#SEC22">Readline vi Mode</A>: A short description of how to make Readline
+ behave like the vi editor.
+</UL>
+
+
+
+<H2><A NAME="SEC2" HREF="readline.html#TOC2">Introduction to Line Editing</A></H2>
+
+<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>
+<I>first</I>, 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">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>
+
+
+<H2><A NAME="SEC3" HREF="readline.html#TOC3">Readline Interaction</A></H2>
+<P>
+<A NAME="IDX1"></A>
+
+</P>
+<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>RETURN</KBD>. You do not have to be at the
+end of the line to press <KBD>RETURN</KBD>; the entire line is accepted
+regardless of the location of the cursor within the line.
+
+</P>
+
+<UL>
+<LI><A HREF="readline.html#SEC4">Readline Bare Essentials</A>: The least you need to know about Readline.
+<LI><A HREF="readline.html#SEC5">Readline Movement Commands</A>: Moving about the input line.
+<LI><A HREF="readline.html#SEC6">Readline Killing Commands</A>: How to delete text, and how to get it back!
+<LI><A HREF="readline.html#SEC7">Readline Arguments</A>: Giving numeric arguments to commands.
+<LI><A HREF="readline.html#SEC8">Searching</A>: Searching through previous lines.
+</UL>
+
+
+
+<H3><A NAME="SEC4" HREF="readline.html#TOC4">Readline Bare Essentials</A></H3>
+<P>
+<A NAME="IDX2"></A>
+<A NAME="IDX3"></A>
+<A NAME="IDX4"></A>
+
+</P>
+<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>
+<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>
+
+
+<H3><A NAME="SEC5" HREF="readline.html#TOC5">Readline Movement Commands</A></H3>
+
+<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>
+<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>
+
+
+<H3><A NAME="SEC6" HREF="readline.html#TOC6">Readline Killing Commands</A></H3>
+
+<P>
+<A NAME="IDX5"></A>
+<A NAME="IDX6"></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="IDX7"></A>
+
+</P>
+<P>
+Here is the list of commands for killing text.
+
+</P>
+<DL COMPACT>
+
+<DT><KBD>C-k</KBD>
+<DD>
+Kill the text from the current cursor position to the end of the line.
+
+<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>.
+
+<DT><KBD>M-DEL</KBD>
+<DD>
+Kill from the cursor the start of the previous 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>.
+
+<DT><KBD>C-w</KBD>
+<DD>
+Kill from the cursor to the previous whitespace. This is different than
+<KBD>M-DEL</KBD> because the word boundaries differ.
+
+</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>
+<DL COMPACT>
+
+<DT><KBD>C-y</KBD>
+<DD>
+Yank the most recently killed text back into the buffer at the cursor.
+
+<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>
+
+
+
+<H3><A NAME="SEC7" HREF="readline.html#TOC7">Readline Arguments</A></H3>
+
+<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>.
+
+</P>
+
+
+<H3><A NAME="SEC8" HREF="readline.html#TOC8">Searching for Commands in the History</A></H3>
+
+<P>
+Readline provides commands for searching through the command history
+for lines containing a specified string.
+There are two search modes: <VAR>incremental</VAR> and <VAR>non-incremental</VAR>.
+
+</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.
+
+</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>
+
+
+<H2><A NAME="SEC9" HREF="readline.html#TOC9">Readline Init File</A></H2>
+<P>
+<A NAME="IDX8"></A>
+
+</P>
+<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>.
+
+</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>
+
+<UL>
+<LI><A HREF="readline.html#SEC10">Readline Init File Syntax</A>: Syntax for the commands in the inputrc file.
+
+<LI><A HREF="readline.html#SEC11">Conditional Init Constructs</A>: Conditional key bindings in the inputrc file.
+
+<LI><A HREF="readline.html#SEC12">Sample Init File</A>: An example inputrc file.
+</UL>
+
+
+
+<H3><A NAME="SEC10" HREF="readline.html#TOC10">Readline Init File Syntax</A></H3>
+
+<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">Conditional Init Constructs</A>). Other lines
+denote variable settings and key bindings.
+
+</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. Here is how to
+change from the default Emacs-like key binding to use
+<CODE>vi</CODE> line editing commands:
+
+
+<PRE>
+set editing-mode vi
+</PRE>
+
+A great deal of run-time behavior is changeable with the following
+variables.
+
+<DL COMPACT>
+
+<DT><CODE>bell-style</CODE>
+<DD>
+<A NAME="IDX9"></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.
+
+<DT><CODE>comment-begin</CODE>
+<DD>
+<A NAME="IDX10"></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>.
+
+<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>.
+
+<DT><CODE>completion-query-items</CODE>
+<DD>
+<A NAME="IDX11"></A>
+The number of possible completions that determines when the user is
+asked whether he wants to see the list of possibilities. 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. The default limit is
+<CODE>100</CODE>.
+
+<DT><CODE>convert-meta</CODE>
+<DD>
+<A NAME="IDX12"></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>.
+
+<DT><CODE>disable-completion</CODE>
+<DD>
+<A NAME="IDX13"></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>.
+
+<DT><CODE>editing-mode</CODE>
+<DD>
+<A NAME="IDX14"></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>.
+
+<DT><CODE>enable-keypad</CODE>
+<DD>
+<A NAME="IDX15"></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>.
+
+<DT><CODE>expand-tilde</CODE>
+<DD>
+<A NAME="IDX16"></A>
+If set to <SAMP>`on'</SAMP>, tilde expansion is performed when Readline
+attempts word completion. The default is <SAMP>`off'</SAMP>.
+
+<DT><CODE>horizontal-scroll-mode</CODE>
+<DD>
+<A NAME="IDX17"></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>.
+
+<DT><CODE>input-meta</CODE>
+<DD>
+<A NAME="IDX18"></A>
+<A NAME="IDX19"></A>
+If set to <SAMP>`on'</SAMP>, Readline will enable eight-bit input (it
+will not strip the eighth bit from 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.
+
+<DT><CODE>isearch-terminators</CODE>
+<DD>
+<A NAME="IDX20"></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">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.
+
+<DT><CODE>keymap</CODE>
+<DD>
+<A NAME="IDX21"></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-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.
+
+<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>.
+
+<DT><CODE>mark-modified-lines</CODE>
+<DD>
+<A NAME="IDX22"></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.
+
+<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>.
+
+<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>.
+
+<DT><CODE>show-all-if-ambiguous</CODE>
+<DD>
+<A NAME="IDX24"></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>.
+
+<DT><CODE>visible-stats</CODE>
+<DD>
+<A NAME="IDX25"></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>.
+
+</DL>
+
+<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.
+
+Once you know the name of the command, simply place the name of the key
+you wish to bind the command to, a colon, and then the name of the
+command on a line in the init file. The name of the key
+can be expressed in different ways, depending on which is most
+comfortable for you.
+
+<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:
+
+<PRE>
+Control-u: universal-argument
+Meta-Rubout: backward-kill-word
+Control-o: "&#62; output"
+</PRE>
+
+In the above example, <KBD>C-u</KBD> is bound to the function
+<CODE>universal-argument</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).
+
+<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.
+
+
+<PRE>
+"\C-u": universal-argument
+"\C-x\C-r": re-read-init-file
+"\e[11~": "Function Key 1"
+</PRE>
+
+In the above example, <KBD>C-u</KBD> is 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>.
+
+</DL>
+
+The following GNU Emacs style escape sequences are available when
+specifying key sequences:
+
+<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>
+
+In addition to the GNU Emacs style escape sequences, a second
+set of backslash escapes is available:
+
+<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 character whose <CODE>ASCII</CODE> code is the octal value <VAR>nnn</VAR>
+(one to three digits)
+<DT><CODE>\x<VAR>nnn</VAR></CODE>
+<DD>
+the character whose <CODE>ASCII</CODE> code is the hexadecimal value <VAR>nnn</VAR>
+(one to three digits)
+</DL>
+
+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>`C-x \'</SAMP>
+insert a single <SAMP>`\'</SAMP> into the line:
+
+<PRE>
+"\C-x\\": "\\"
+</PRE>
+
+</DL>
+
+
+
+<H3><A NAME="SEC11" HREF="readline.html#TOC11">Conditional Init Constructs</A></H3>
+
+<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>
+<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.
+
+<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.
+
+<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.
+
+<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 it.
+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:
+
+<PRE>
+$if Bash
+# Quote the current or previous word
+"\C-xq": "\eb\"\ef\""
+$endif
+</PRE>
+
+</DL>
+
+<DT><CODE>$endif</CODE>
+<DD>
+This command, as seen in the previous example, terminates an
+<CODE>$if</CODE> command.
+
+<DT><CODE>$else</CODE>
+<DD>
+Commands in this branch of the <CODE>$if</CODE> directive are executed if
+the test fails.
+
+<DT><CODE>$include</CODE>
+<DD>
+This directive takes a single filename as an argument and reads commands
+and bindings from that file.
+
+<PRE>
+$include /etc/inputrc
+</PRE>
+
+</DL>
+
+
+
+<H3><A NAME="SEC12" HREF="readline.html#TOC12">Sample Init File</A></H3>
+
+<P>
+Here is an example of an inputrc file. This illustrates key
+binding, variable assignment, and conditional syntax.
+
+</P>
+
+<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>
+
+
+
+<H2><A NAME="SEC13" HREF="readline.html#TOC13">Bindable Readline Commands</A></H2>
+
+
+<UL>
+<LI><A HREF="readline.html#SEC14">Commands For Moving</A>: Moving about the line.
+<LI><A HREF="readline.html#SEC15">Commands For History</A>: Getting at previous lines.
+<LI><A HREF="readline.html#SEC16">Commands For Text</A>: Commands for changing text.
+<LI><A HREF="readline.html#SEC17">Commands For Killing</A>: Commands for killing and yanking.
+<LI><A HREF="readline.html#SEC18">Numeric Arguments</A>: Specifying numeric arguments, repeat counts.
+<LI><A HREF="readline.html#SEC19">Commands For Completion</A>: Getting Readline to do the typing for you.
+<LI><A HREF="readline.html#SEC20">Keyboard Macros</A>: Saving and re-executing typed characters
+<LI><A HREF="readline.html#SEC21">Miscellaneous Commands</A>: Other miscellaneous commands.
+</UL>
+
+<P>
+This section describes Readline commands that may be bound to key
+sequences.
+
+</P>
+<P>
+Command names without an accompanying key sequence are unbound by default.
+In the following descriptions, <VAR>point</VAR> refers to the current cursor
+position, and <VAR>mark</VAR> 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 <VAR>region</VAR>.
+
+</P>
+
+
+<H3><A NAME="SEC14" HREF="readline.html#TOC14">Commands For Moving</A></H3>
+<DL COMPACT>
+
+<DT><CODE>beginning-of-line (C-a)</CODE>
+<DD>
+<A NAME="IDX26"></A>
+Move to the start of the current line.
+
+<DT><CODE>end-of-line (C-e)</CODE>
+<DD>
+<A NAME="IDX27"></A>
+Move to the end of the line.
+
+<DT><CODE>forward-char (C-f)</CODE>
+<DD>
+<A NAME="IDX28"></A>
+Move forward a character.
+
+<DT><CODE>backward-char (C-b)</CODE>
+<DD>
+<A NAME="IDX29"></A>
+Move back a character.
+
+<DT><CODE>forward-word (M-f)</CODE>
+<DD>
+<A NAME="IDX30"></A>
+Move forward to the end of the next word. Words are composed of
+letters and digits.
+
+<DT><CODE>backward-word (M-b)</CODE>
+<DD>
+<A NAME="IDX31"></A>
+Move back to the start of the current or previous word. Words are
+composed of letters and digits.
+
+<DT><CODE>clear-screen (C-l)</CODE>
+<DD>
+<A NAME="IDX32"></A>
+Clear the screen and redraw the current line,
+leaving the current line at the top of the screen.
+
+<DT><CODE>redraw-current-line ()</CODE>
+<DD>
+<A NAME="IDX33"></A>
+Refresh the current line. By default, this is unbound.
+
+</DL>
+
+
+
+<H3><A NAME="SEC15" HREF="readline.html#TOC15">Commands For Manipulating The History</A></H3>
+
+<DL COMPACT>
+
+<DT><CODE>accept-line (Newline, Return)</CODE>
+<DD>
+<A NAME="IDX34"></A>
+Accept the line regardless of where the cursor is. If this line is
+non-empty, add it to the history list. If this line was a history
+line, then restore the history line to its original state.
+
+<DT><CODE>previous-history (C-p)</CODE>
+<DD>
+<A NAME="IDX35"></A>
+Move `up' through the history list.
+
+<DT><CODE>next-history (C-n)</CODE>
+<DD>
+<A NAME="IDX36"></A>
+Move `down' through the history list.
+
+<DT><CODE>beginning-of-history (M-&#60;)</CODE>
+<DD>
+<A NAME="IDX37"></A>
+Move to the first line in the history.
+
+<DT><CODE>end-of-history (M-&#62;)</CODE>
+<DD>
+<A NAME="IDX38"></A>
+Move to the end of the input history, i.e., the line currently
+being entered.
+
+<DT><CODE>reverse-search-history (C-r)</CODE>
+<DD>
+<A NAME="IDX39"></A>
+Search backward starting at the current line and moving `up' through
+the history as necessary. This is an incremental search.
+
+<DT><CODE>forward-search-history (C-s)</CODE>
+<DD>
+<A NAME="IDX40"></A>
+Search forward starting at the current line and moving `down' through
+the the history as necessary. This is an incremental search.
+
+<DT><CODE>non-incremental-reverse-search-history (M-p)</CODE>
+<DD>
+<A NAME="IDX41"></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.
+
+<DT><CODE>non-incremental-forward-search-history (M-n)</CODE>
+<DD>
+<A NAME="IDX42"></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.
+
+<DT><CODE>history-search-forward ()</CODE>
+<DD>
+<A NAME="IDX43"></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.
+
+<DT><CODE>history-search-backward ()</CODE>
+<DD>
+<A NAME="IDX44"></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.
+
+<DT><CODE>yank-nth-arg (M-C-y)</CODE>
+<DD>
+<A NAME="IDX45"></A>
+Insert the first argument to the previous command (usually
+the second word on the previous line). 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.
+
+<DT><CODE>yank-last-arg (M-., M-_)</CODE>
+<DD>
+<A NAME="IDX46"></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.
+
+</DL>
+
+
+
+<H3><A NAME="SEC16" HREF="readline.html#TOC16">Commands For Changing Text</A></H3>
+
+<DL COMPACT>
+
+<DT><CODE>delete-char (C-d)</CODE>
+<DD>
+<A NAME="IDX47"></A>
+Delete the character under the cursor. If the cursor 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 <CODE>EOF</CODE>.
+
+<DT><CODE>backward-delete-char (Rubout)</CODE>
+<DD>
+<A NAME="IDX48"></A>
+Delete the character behind the cursor. A numeric argument means
+to kill the characters instead of deleting them.
+
+<DT><CODE>forward-backward-delete-char ()</CODE>
+<DD>
+<A NAME="IDX49"></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.
+
+<DT><CODE>quoted-insert (C-q, C-v)</CODE>
+<DD>
+<A NAME="IDX50"></A>
+Add the next character typed to the line verbatim. This is
+how to insert key sequences like <KBD>C-q</KBD>, for example.
+
+<DT><CODE>tab-insert (M-TAB)</CODE>
+<DD>
+<A NAME="IDX51"></A>
+Insert a tab character.
+
+<DT><CODE>self-insert (a, b, A, 1, !, ...)</CODE>
+<DD>
+<A NAME="IDX52"></A>
+Insert yourself.
+
+<DT><CODE>transpose-chars (C-t)</CODE>
+<DD>
+<A NAME="IDX53"></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.
+
+<DT><CODE>transpose-words (M-t)</CODE>
+<DD>
+<A NAME="IDX54"></A>
+Drag the word before point past the word after point,
+moving point past that word as well.
+
+<DT><CODE>upcase-word (M-u)</CODE>
+<DD>
+<A NAME="IDX55"></A>
+Uppercase the current (or following) word. With a negative argument,
+uppercase the previous word, but do not move the cursor.
+
+<DT><CODE>downcase-word (M-l)</CODE>
+<DD>
+<A NAME="IDX56"></A>
+Lowercase the current (or following) word. With a negative argument,
+lowercase the previous word, but do not move the cursor.
+
+<DT><CODE>capitalize-word (M-c)</CODE>
+<DD>
+<A NAME="IDX57"></A>
+Capitalize the current (or following) word. With a negative argument,
+capitalize the previous word, but do not move the cursor.
+
+</DL>
+
+
+
+<H3><A NAME="SEC17" HREF="readline.html#TOC17">Killing And Yanking</A></H3>
+
+<DL COMPACT>
+
+<DT><CODE>kill-line (C-k)</CODE>
+<DD>
+<A NAME="IDX58"></A>
+Kill the text from point to the end of the line.
+
+<DT><CODE>backward-kill-line (C-x Rubout)</CODE>
+<DD>
+<A NAME="IDX59"></A>
+Kill backward to the beginning of the line.
+
+<DT><CODE>unix-line-discard (C-u)</CODE>
+<DD>
+<A NAME="IDX60"></A>
+Kill backward from the cursor to the beginning of the current line.
+
+<DT><CODE>kill-whole-line ()</CODE>
+<DD>
+<A NAME="IDX61"></A>
+Kill all characters on the current line, no matter point is.
+By default, this is unbound.
+
+<DT><CODE>kill-word (M-d)</CODE>
+<DD>
+<A NAME="IDX62"></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>.
+
+<DT><CODE>backward-kill-word (M-DEL)</CODE>
+<DD>
+<A NAME="IDX63"></A>
+Kill the word behind point.
+Word boundaries are the same as <CODE>backward-word</CODE>.
+
+<DT><CODE>unix-word-rubout (C-w)</CODE>
+<DD>
+<A NAME="IDX64"></A>
+Kill the word behind point, using white space as a word boundary.
+The killed text is saved on the kill-ring.
+
+<DT><CODE>delete-horizontal-space ()</CODE>
+<DD>
+<A NAME="IDX65"></A>
+Delete all spaces and tabs around point. By default, this is unbound.
+
+<DT><CODE>kill-region ()</CODE>
+<DD>
+<A NAME="IDX66"></A>
+Kill the text in the current region.
+By default, this command is unbound.
+
+<DT><CODE>copy-region-as-kill ()</CODE>
+<DD>
+<A NAME="IDX67"></A>
+Copy the text in the region to the kill buffer, so it can be yanked
+right away. By default, this command is unbound.
+
+<DT><CODE>copy-backward-word ()</CODE>
+<DD>
+<A NAME="IDX68"></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.
+
+<DT><CODE>copy-forward-word ()</CODE>
+<DD>
+<A NAME="IDX69"></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.
+
+<DT><CODE>yank (C-y)</CODE>
+<DD>
+<A NAME="IDX70"></A>
+Yank the top of the kill ring into the buffer at the current
+cursor position.
+
+<DT><CODE>yank-pop (M-y)</CODE>
+<DD>
+<A NAME="IDX71"></A>
+Rotate the kill-ring, and yank the new top. You can only do this if
+the prior command is yank or yank-pop.
+</DL>
+
+
+
+<H3><A NAME="SEC18" HREF="readline.html#TOC18">Specifying Numeric Arguments</A></H3>
+<DL COMPACT>
+
+<DT><CODE>digit-argument (M-0, M-1, ... M--)</CODE>
+<DD>
+<A NAME="IDX72"></A>
+Add this digit to the argument already accumulating, or start a new
+argument. <KBD>M--</KBD> starts a negative argument.
+
+<DT><CODE>universal-argument ()</CODE>
+<DD>
+<A NAME="IDX73"></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>
+
+
+
+<H3><A NAME="SEC19" HREF="readline.html#TOC19">Letting Readline Type For You</A></H3>
+
+<DL COMPACT>
+
+<DT><CODE>complete (TAB)</CODE>
+<DD>
+<A NAME="IDX74"></A>
+Attempt to do completion on the text before the cursor. This is
+application-specific. Generally, if you are typing a filename
+argument, you can do filename completion; if you are typing a command,
+you can do command completion; if you are typing in a symbol to GDB, you
+can do symbol name completion; if you are typing in a variable to Bash,
+you can do variable name completion, and so on.
+
+<DT><CODE>possible-completions (M-?)</CODE>
+<DD>
+<A NAME="IDX75"></A>
+List the possible completions of the text before the cursor.
+
+<DT><CODE>insert-completions (M-*)</CODE>
+<DD>
+<A NAME="IDX76"></A>
+Insert all completions of the text before point that would have
+been generated by <CODE>possible-completions</CODE>.
+
+<DT><CODE>menu-complete ()</CODE>
+<DD>
+<A NAME="IDX77"></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 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 <CODE>TAB</CODE>, but is unbound
+by default.
+
+<DT><CODE>delete-char-or-list ()</CODE>
+<DD>
+<A NAME="IDX78"></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.
+
+</DL>
+
+
+
+<H3><A NAME="SEC20" HREF="readline.html#TOC20">Keyboard Macros</A></H3>
+<DL COMPACT>
+
+<DT><CODE>start-kbd-macro (C-x ()</CODE>
+<DD>
+<A NAME="IDX79"></A>
+Begin saving the characters typed into the current keyboard macro.
+
+<DT><CODE>end-kbd-macro (C-x ))</CODE>
+<DD>
+<A NAME="IDX80"></A>
+Stop saving the characters typed into the current keyboard macro
+and save the definition.
+
+<DT><CODE>call-last-kbd-macro (C-x e)</CODE>
+<DD>
+<A NAME="IDX81"></A>
+Re-execute the last keyboard macro defined, by making the characters
+in the macro appear as if typed at the keyboard.
+
+</DL>
+
+
+
+<H3><A NAME="SEC21" HREF="readline.html#TOC21">Some Miscellaneous Commands</A></H3>
+<DL COMPACT>
+
+<DT><CODE>re-read-init-file (C-x C-r)</CODE>
+<DD>
+<A NAME="IDX82"></A>
+Read in the contents of the <VAR>inputrc</VAR> file, and incorporate
+any bindings or variable assignments found there.
+
+<DT><CODE>abort (C-g)</CODE>
+<DD>
+<A NAME="IDX83"></A>
+Abort the current editing command and
+ring the terminal's bell (subject to the setting of
+<CODE>bell-style</CODE>).
+
+<DT><CODE>do-uppercase-version (M-a, M-b, M-<VAR>x</VAR>, ...)</CODE>
+<DD>
+<A NAME="IDX84"></A>
+If the metafied character <VAR>x</VAR> is lowercase, run the command
+that is bound to the corresponding uppercase character.
+
+<DT><CODE>prefix-meta (ESC)</CODE>
+<DD>
+<A NAME="IDX85"></A>
+Make the next character typed be metafied. This is for keyboards
+without a meta key. Typing <SAMP>`ESC f'</SAMP> is equivalent to typing
+<SAMP>`M-f'</SAMP>.
+
+<DT><CODE>undo (C-_, C-x C-u)</CODE>
+<DD>
+<A NAME="IDX86"></A>
+Incremental undo, separately remembered for each line.
+
+<DT><CODE>revert-line (M-r)</CODE>
+<DD>
+<A NAME="IDX87"></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.
+
+<DT><CODE>tilde-expand (M-~)</CODE>
+<DD>
+<A NAME="IDX88"></A>
+Perform tilde expansion on the current word.
+
+<DT><CODE>set-mark (C-@)</CODE>
+<DD>
+<A NAME="IDX89"></A>
+Set the mark to the current point. If a
+numeric argument is supplied, the mark is set to that position.
+
+<DT><CODE>exchange-point-and-mark (C-x C-x)</CODE>
+<DD>
+<A NAME="IDX90"></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.
+
+<DT><CODE>character-search (C-])</CODE>
+<DD>
+<A NAME="IDX91"></A>
+A character is read and point is moved to the next occurrence of that
+character. A negative count searches for previous occurrences.
+
+<DT><CODE>character-search-backward (M-C-])</CODE>
+<DD>
+<A NAME="IDX92"></A>
+A character is read and point is moved to the previous occurrence
+of that character. A negative count searches for subsequent
+occurrences.
+
+<DT><CODE>insert-comment (M-#)</CODE>
+<DD>
+<A NAME="IDX93"></A>
+The value of the <CODE>comment-begin</CODE>
+variable is inserted at the beginning of the current line,
+and the line is accepted as if a newline had been typed.
+
+<DT><CODE>dump-functions ()</CODE>
+<DD>
+<A NAME="IDX94"></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.
+
+<DT><CODE>dump-variables ()</CODE>
+<DD>
+<A NAME="IDX95"></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.
+
+<DT><CODE>dump-macros ()</CODE>
+<DD>
+<A NAME="IDX96"></A>
+Print all of the Readline key sequences bound to macros and the
+strings they ouput. 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.
+
+</DL>
+
+
+
+<H2><A NAME="SEC22" HREF="readline.html#TOC22">Readline vi Mode</A></H2>
+
+<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 M-C-j (toggle-editing-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>
+
+
+
+<H1><A NAME="SEC23" HREF="readline.html#TOC23">Programming with GNU Readline</A></H1>
+
+<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>
+
+<UL>
+<LI><A HREF="readline.html#SEC24">Basic Behavior</A>: Using the default behavior of Readline.
+<LI><A HREF="readline.html#SEC25">Custom Functions</A>: Adding your own functions to Readline.
+<LI><A HREF="readline.html#SEC28">Readline Variables</A>: Variables accessible to custom
+ functions.
+<LI><A HREF="readline.html#SEC29">Readline Convenience Functions</A>: Functions which Readline supplies to
+ aid in writing your own custom
+ functions.
+<LI><A HREF="readline.html#SEC40">Readline Signal Handling</A>: How Readline behaves when it receives signals.
+<LI><A HREF="readline.html#SEC41">Custom Completers</A>: Supplanting or supplementing Readline's
+ completion functions.
+</UL>
+
+
+
+<H2><A NAME="SEC24" HREF="readline.html#TOC24">Basic Behavior</A></H2>
+
+<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="IDX97"></A>
+<A NAME="IDX98"></A>
+The function <CODE>readline ()</CODE> prints a prompt and then reads and returns
+a single line of text from the user. The line <CODE>readline</CODE>
+returns is allocated with <CODE>malloc ()</CODE>; you should <CODE>free ()</CODE>
+the line when you are done with it. The declaration for <CODE>readline</CODE>
+in ANSI C is
+
+</P>
+
+<PRE>
+<CODE>char *readline (char *<VAR>prompt</VAR>);</CODE>
+</PRE>
+
+<P>
+So, one might say
+
+<PRE>
+<CODE>char *line = readline ("Enter a line: ");</CODE>
+</PRE>
+
+<P>
+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>
+
+<PRE>
+<CODE>add_history (line)</CODE>;
+</PRE>
+
+<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>
+
+<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>
+
+<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>
+
+<PRE>
+<CODE>int rl_bind_key (int <VAR>key</VAR>, int (*<VAR>function</VAR>)());</CODE>
+</PRE>
+
+<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:
+
+<PRE>
+<CODE>rl_bind_key ('\t', rl_insert);</CODE>
+</PRE>
+
+<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#SEC41">Custom Completers</A>).
+
+</P>
+
+
+<H2><A NAME="SEC25" HREF="readline.html#TOC25">Custom Functions</A></H2>
+
+<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>
+
+<UL>
+<LI><A HREF="readline.html#SEC26">The Function Type</A>: C declarations to make code readable.
+<LI><A HREF="readline.html#SEC27">Function Writing</A>: Variables and calling conventions.
+</UL>
+
+
+
+<H3><A NAME="SEC26" HREF="readline.html#TOC26">The Function Type</A></H3>
+
+<P>
+For readabilty, we declare a new type of object, called
+<EM>Function</EM>. A <CODE>Function</CODE> is a C function which
+returns an <CODE>int</CODE>. The type declaration for <CODE>Function</CODE> is:
+
+</P>
+<P>
+<CODE>typedef int Function ();</CODE>
+
+</P>
+<P>
+The reason for declaring this new type is to make it easier to write
+code describing pointers to C functions. Let us say we had a variable
+called <VAR>func</VAR> which was a pointer to a function. Instead of the
+classic C declaration
+
+</P>
+<P>
+<CODE>int (*)()func;</CODE>
+
+</P>
+<P>
+we may write
+
+</P>
+<P>
+<CODE>Function *func;</CODE>
+
+</P>
+<P>
+Similarly, there are
+
+</P>
+
+<PRE>
+typedef void VFunction ();
+typedef char *CPFunction (); and
+typedef char **CPPFunction ();
+</PRE>
+
+<P>
+for functions returning no value, <CODE>pointer to char</CODE>, and
+<CODE>pointer to pointer to char</CODE>, respectively.
+
+</P>
+
+
+<H3><A NAME="SEC27" HREF="readline.html#TOC27">Writing a New Function</A></H3>
+
+<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>
+
+<PRE>
+<CODE>foo (int count, int key)</CODE>
+</PRE>
+
+<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>
+
+
+<H2><A NAME="SEC28" HREF="readline.html#TOC28">Readline Variables</A></H2>
+
+<P>
+These variables are available to function writers.
+
+</P>
+<P>
+<DL>
+<DT><U>Variable:</U> char * <B>rl_line_buffer</B>
+<DD><A NAME="IDX99"></A>
+This is the line gathered so far. You are welcome to modify the
+contents of the line, but see section <A HREF="readline.html#SEC34">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>
+<DL>
+<DT><U>Variable:</U> int <B>rl_point</B>
+<DD><A NAME="IDX100"></A>
+The offset of the current cursor position in <CODE>rl_line_buffer</CODE>
+(the <EM>point</EM>).
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Variable:</U> int <B>rl_end</B>
+<DD><A NAME="IDX101"></A>
+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>
+<DL>
+<DT><U>Variable:</U> int <B>rl_mark</B>
+<DD><A NAME="IDX102"></A>
+The mark (saved position) in the current line. If set, the mark
+and point define a <EM>region</EM>.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Variable:</U> int <B>rl_done</B>
+<DD><A NAME="IDX103"></A>
+Setting this to a non-zero value causes Readline to return the current
+line immediately.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Variable:</U> int <B>rl_pending_input</B>
+<DD><A NAME="IDX104"></A>
+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>
+<DL>
+<DT><U>Variable:</U> int <B>rl_erase_empty_line</B>
+<DD><A NAME="IDX105"></A>
+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>
+<DL>
+<DT><U>Variable:</U> char * <B>rl_prompt</B>
+<DD><A NAME="IDX106"></A>
+The prompt Readline uses. This is set from the argument to
+<CODE>readline ()</CODE>, and should not be assigned to directly.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Variable:</U> int <B>rl_already_prompted</B>
+<DD><A NAME="IDX107"></A>
+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>
+<DL>
+<DT><U>Variable:</U> char * <B>rl_library_version</B>
+<DD><A NAME="IDX108"></A>
+The version number of this revision of the library.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Variable:</U> char * <B>rl_terminal_name</B>
+<DD><A NAME="IDX109"></A>
+The terminal type, used for initialization.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Variable:</U> char * <B>rl_readline_name</B>
+<DD><A NAME="IDX110"></A>
+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">Conditional Init Constructs</A>).
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Variable:</U> FILE * <B>rl_instream</B>
+<DD><A NAME="IDX111"></A>
+The stdio stream from which Readline reads input.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Variable:</U> FILE * <B>rl_outstream</B>
+<DD><A NAME="IDX112"></A>
+The stdio stream to which Readline performs output.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Variable:</U> Function * <B>rl_startup_hook</B>
+<DD><A NAME="IDX113"></A>
+If non-zero, this is the address of a function to call just
+before <CODE>readline</CODE> prints the first prompt.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Variable:</U> Function * <B>rl_pre_input_hook</B>
+<DD><A NAME="IDX114"></A>
+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>
+<DL>
+<DT><U>Variable:</U> Function * <B>rl_event_hook</B>
+<DD><A NAME="IDX115"></A>
+If non-zero, this is the address of a function to call periodically
+when readline is waiting for terminal input.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Variable:</U> Function * <B>rl_getc_function</B>
+<DD><A NAME="IDX116"></A>
+If non-zero, <CODE>readline</CODE> 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 <CODE>readline</CODE> character input function
+(see section <A HREF="readline.html#SEC37">Utility Functions</A>).
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Variable:</U> VFunction * <B>rl_redisplay_function</B>
+<DD><A NAME="IDX117"></A>
+If non-zero, <CODE>readline</CODE> 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 <CODE>readline</CODE>
+redisplay function (see section <A HREF="readline.html#SEC35">Redisplay</A>).
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Variable:</U> Keymap <B>rl_executing_keymap</B>
+<DD><A NAME="IDX118"></A>
+This variable is set to the keymap (see section <A HREF="readline.html#SEC31">Selecting a Keymap</A>) in which the
+currently executing readline function was found.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Variable:</U> Keymap <B>rl_binding_keymap</B>
+<DD><A NAME="IDX119"></A>
+This variable is set to the keymap (see section <A HREF="readline.html#SEC31">Selecting a Keymap</A>) in which the
+last key binding occurred.
+</DL>
+
+</P>
+
+
+<H2><A NAME="SEC29" HREF="readline.html#TOC29">Readline Convenience Functions</A></H2>
+
+
+<UL>
+<LI><A HREF="readline.html#SEC30">Function Naming</A>: How to give a function you write a name.
+<LI><A HREF="readline.html#SEC31">Keymaps</A>: Making keymaps.
+<LI><A HREF="readline.html#SEC32">Binding Keys</A>: Changing Keymaps.
+<LI><A HREF="readline.html#SEC33">Associating Function Names and Bindings</A>: Translate function names to
+ key sequences.
+<LI><A HREF="readline.html#SEC34">Allowing Undoing</A>: How to make your functions undoable.
+<LI><A HREF="readline.html#SEC35">Redisplay</A>: Functions to control line display.
+<LI><A HREF="readline.html#SEC36">Modifying Text</A>: Functions to modify <CODE>rl_line_buffer</CODE>.
+<LI><A HREF="readline.html#SEC37">Utility Functions</A>: Generally useful functions and hooks.
+<LI><A HREF="readline.html#SEC38">Alternate Interface</A>: Using Readline in a `callback' fashion.
+</UL>
+
+
+
+<H3><A NAME="SEC30" HREF="readline.html#TOC30">Naming a Function</A></H3>
+
+<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>
+
+<PRE>
+Meta-Rubout: backward-kill-word
+</PRE>
+
+<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>
+<DL>
+<DT><U>Function:</U> int <B>rl_add_defun</B> <I>(char *name, Function *function, int key)</I>
+<DD><A NAME="IDX120"></A>
+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>
+
+
+<H3><A NAME="SEC31" HREF="readline.html#TOC31">Selecting a Keymap</A></H3>
+
+<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>
+<DL>
+<DT><U>Function:</U> Keymap <B>rl_make_bare_keymap</B> <I>()</I>
+<DD><A NAME="IDX121"></A>
+Returns a new, empty keymap. The space for the keymap is allocated with
+<CODE>malloc ()</CODE>; you should <CODE>free ()</CODE> it when you are done.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Function:</U> Keymap <B>rl_copy_keymap</B> <I>(Keymap map)</I>
+<DD><A NAME="IDX122"></A>
+Return a new keymap which is a copy of <VAR>map</VAR>.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Function:</U> Keymap <B>rl_make_keymap</B> <I>()</I>
+<DD><A NAME="IDX123"></A>
+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>
+<DL>
+<DT><U>Function:</U> void <B>rl_discard_keymap</B> <I>(Keymap keymap)</I>
+<DD><A NAME="IDX124"></A>
+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>
+<DL>
+<DT><U>Function:</U> Keymap <B>rl_get_keymap</B> <I>()</I>
+<DD><A NAME="IDX125"></A>
+Returns the currently active keymap.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Function:</U> void <B>rl_set_keymap</B> <I>(Keymap keymap)</I>
+<DD><A NAME="IDX126"></A>
+Makes <VAR>keymap</VAR> the currently active keymap.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Function:</U> Keymap <B>rl_get_keymap_by_name</B> <I>(char *name)</I>
+<DD><A NAME="IDX127"></A>
+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">Readline Init File</A>).
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Function:</U> char * <B>rl_get_keymap_name</B> <I>(Keymap keymap)</I>
+<DD><A NAME="IDX128"></A>
+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">Readline Init File</A>).
+</DL>
+
+</P>
+
+
+<H3><A NAME="SEC32" HREF="readline.html#TOC32">Binding Keys</A></H3>
+
+<P>
+You associate keys 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">Readline Variables</A>).
+
+</P>
+<P>
+These functions manage key bindings.
+
+</P>
+<P>
+<DL>
+<DT><U>Function:</U> int <B>rl_bind_key</B> <I>(int key, Function *function)</I>
+<DD><A NAME="IDX129"></A>
+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>
+<DL>
+<DT><U>Function:</U> int <B>rl_bind_key_in_map</B> <I>(int key, Function *function, Keymap map)</I>
+<DD><A NAME="IDX130"></A>
+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>
+<DL>
+<DT><U>Function:</U> int <B>rl_unbind_key</B> <I>(int key)</I>
+<DD><A NAME="IDX131"></A>
+Bind <VAR>key</VAR> to the null function in the currently active keymap.
+Returns non-zero in case of error.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Function:</U> int <B>rl_unbind_key_in_map</B> <I>(int key, Keymap map)</I>
+<DD><A NAME="IDX132"></A>
+Bind <VAR>key</VAR> to the null function in <VAR>map</VAR>.
+Returns non-zero in case of error.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Function:</U> int <B>rl_unbind_function_in_map</B> <I>(Function *function, Keymap map)</I>
+<DD><A NAME="IDX133"></A>
+Unbind all keys that execute <VAR>function</VAR> in <VAR>map</VAR>.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Function:</U> int <B>rl_unbind_command_in_map</B> <I>(char *command, Keymap map)</I>
+<DD><A NAME="IDX134"></A>
+Unbind all keys that are bound to <VAR>command</VAR> in <VAR>map</VAR>.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Function:</U> int <B>rl_generic_bind</B> <I>(int type, char *keyseq, char *data, Keymap map)</I>
+<DD><A NAME="IDX135"></A>
+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>
+<DL>
+<DT><U>Function:</U> int <B>rl_parse_and_bind</B> <I>(char *line)</I>
+<DD><A NAME="IDX136"></A>
+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">Readline Init File</A>).
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Function:</U> int <B>rl_read_init_file</B> <I>(char *filename)</I>
+<DD><A NAME="IDX137"></A>
+Read keybindings and variable assignments from <VAR>filename</VAR>
+(see section <A HREF="readline.html#SEC9">Readline Init File</A>).
+</DL>
+
+</P>
+
+
+<H3><A NAME="SEC33" HREF="readline.html#TOC33">Associating Function Names and Bindings</A></H3>
+
+<P>
+These functions allow you to find out what keys invoke named functions
+and the functions invoked by a particular key sequence.
+
+</P>
+<P>
+<DL>
+<DT><U>Function:</U> Function * <B>rl_named_function</B> <I>(char *name)</I>
+<DD><A NAME="IDX138"></A>
+Return the function with name <VAR>name</VAR>.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Function:</U> Function * <B>rl_function_of_keyseq</B> <I>(char *keyseq, Keymap map, int *type)</I>
+<DD><A NAME="IDX139"></A>
+Return the function invoked by <VAR>keyseq</VAR> in keymap <VAR>map</VAR>.
+If <VAR>map</VAR> is NULL, the current keymap is used. If <VAR>type</VAR> is
+not NULL, the type of the object is returned in it (one of <CODE>ISFUNC</CODE>,
+<CODE>ISKMAP</CODE>, or <CODE>ISMACR</CODE>).
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Function:</U> char ** <B>rl_invoking_keyseqs</B> <I>(Function *function)</I>
+<DD><A NAME="IDX140"></A>
+Return an array of strings representing the key sequences used to
+invoke <VAR>function</VAR> in the current keymap.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Function:</U> char ** <B>rl_invoking_keyseqs_in_map</B> <I>(Function *function, Keymap map)</I>
+<DD><A NAME="IDX141"></A>
+Return an array of strings representing the key sequences used to
+invoke <VAR>function</VAR> in the keymap <VAR>map</VAR>.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Function:</U> void <B>rl_function_dumper</B> <I>(int readable)</I>
+<DD><A NAME="IDX142"></A>
+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>
+<DL>
+<DT><U>Function:</U> void <B>rl_list_funmap_names</B> <I>()</I>
+<DD><A NAME="IDX143"></A>
+Print the names of all bindable Readline functions to <CODE>rl_outstream</CODE>.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Function:</U> char ** <B>rl_funmap_names</B> <I>()</I>
+<DD><A NAME="IDX144"></A>
+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 done, but not the pointrs.
+</DL>
+
+</P>
+
+
+<H3><A NAME="SEC34" HREF="readline.html#TOC34">Allowing Undoing</A></H3>
+
+<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. I could use an undo function for
+the stock market.
+
+</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>
+
+<PRE>
+enum undo_code { UNDO_DELETE, UNDO_INSERT, UNDO_BEGIN, UNDO_END };
+</PRE>
+
+<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 undo 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>
+<DL>
+<DT><U>Function:</U> int <B>rl_begin_undo_group</B> <I>()</I>
+<DD><A NAME="IDX145"></A>
+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>
+<DL>
+<DT><U>Function:</U> int <B>rl_end_undo_group</B> <I>()</I>
+<DD><A NAME="IDX146"></A>
+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>
+<DL>
+<DT><U>Function:</U> void <B>rl_add_undo</B> <I>(enum undo_code what, int start, int end, char *text)</I>
+<DD><A NAME="IDX147"></A>
+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>
+<DL>
+<DT><U>Function:</U> void <B>free_undo_list</B> <I>()</I>
+<DD><A NAME="IDX148"></A>
+Free the existing undo list.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Function:</U> int <B>rl_do_undo</B> <I>()</I>
+<DD><A NAME="IDX149"></A>
+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>
+<DL>
+<DT><U>Function:</U> int <B>rl_modifying</B> <I>(int start, int end)</I>
+<DD><A NAME="IDX150"></A>
+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>
+
+
+<H3><A NAME="SEC35" HREF="readline.html#TOC35">Redisplay</A></H3>
+
+<P>
+<DL>
+<DT><U>Function:</U> void <B>rl_redisplay</B> <I>()</I>
+<DD><A NAME="IDX151"></A>
+Change what's displayed on the screen to reflect the current contents
+of <CODE>rl_line_buffer</CODE>.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Function:</U> int <B>rl_forced_update_display</B> <I>()</I>
+<DD><A NAME="IDX152"></A>
+Force the line to be updated and redisplayed, whether or not
+Readline thinks the screen display is correct.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Function:</U> int <B>rl_on_new_line</B> <I>()</I>
+<DD><A NAME="IDX153"></A>
+Tell the update functions that we have moved onto a new (empty) line,
+usually after ouputting a newline.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Function:</U> int <B>rl_on_new_line_with_prompt</B> <I>()</I>
+<DD><A NAME="IDX154"></A>
+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>
+<DL>
+<DT><U>Function:</U> int <B>rl_reset_line_state</B> <I>()</I>
+<DD><A NAME="IDX155"></A>
+Reset the display state to a clean state and redisplay the current line
+starting on a new line.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Function:</U> int <B>rl_message</B> <I>(va_alist)</I>
+<DD><A NAME="IDX156"></A>
+The arguments are a string as would be supplied to <CODE>printf</CODE>. The
+resulting string is displayed in the <EM>echo area</EM>. The echo area
+is also used to display numeric arguments and search strings.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Function:</U> int <B>rl_clear_message</B> <I>()</I>
+<DD><A NAME="IDX157"></A>
+Clear the message in the echo area.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Function:</U> void <B>rl_save_prompt</B> <I>()</I>
+<DD><A NAME="IDX158"></A>
+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>
+<DL>
+<DT><U>Function:</U> void <B>rl_restore_prompt</B> <I>()</I>
+<DD><A NAME="IDX159"></A>
+Restore the local Readline prompt display state saved by the most
+recent call to <CODE>rl_save_prompt</CODE>.
+</DL>
+
+</P>
+
+
+<H3><A NAME="SEC36" HREF="readline.html#TOC36">Modifying Text</A></H3>
+
+<P>
+<DL>
+<DT><U>Function:</U> int <B>rl_insert_text</B> <I>(char *text)</I>
+<DD><A NAME="IDX160"></A>
+Insert <VAR>text</VAR> into the line at the current cursor position.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Function:</U> int <B>rl_delete_text</B> <I>(int start, int end)</I>
+<DD><A NAME="IDX161"></A>
+Delete the text between <VAR>start</VAR> and <VAR>end</VAR> in the current line.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Function:</U> char * <B>rl_copy_text</B> <I>(int start, int end)</I>
+<DD><A NAME="IDX162"></A>
+Return a copy of the text between <VAR>start</VAR> and <VAR>end</VAR> in
+the current line.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Function:</U> int <B>rl_kill_text</B> <I>(int start, int end)</I>
+<DD><A NAME="IDX163"></A>
+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>
+
+
+<H3><A NAME="SEC37" HREF="readline.html#TOC37">Utility Functions</A></H3>
+
+<P>
+<DL>
+<DT><U>Function:</U> int <B>rl_read_key</B> <I>()</I>
+<DD><A NAME="IDX164"></A>
+Return the next character available. This handles input inserted into
+the input stream via <VAR>pending input</VAR> (see section <A HREF="readline.html#SEC28">Readline Variables</A>)
+and <CODE>rl_stuff_char ()</CODE>, macros, and characters read from the keyboard.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Function:</U> int <B>rl_getc</B> <I>(FILE *)</I>
+<DD><A NAME="IDX165"></A>
+Return the next character available from the keyboard.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Function:</U> int <B>rl_stuff_char</B> <I>(int c)</I>
+<DD><A NAME="IDX166"></A>
+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>.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Function:</U> int <B>rl_extend_line_buffer</B> <I>(int len)</I>
+<DD><A NAME="IDX167"></A>
+Ensure that <CODE>rl_line_buffer</CODE> has enough space to hold <VAR>len</VAR>
+characters, possibly reallocating it if necessary.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Function:</U> int <B>rl_initialize</B> <I>()</I>
+<DD><A NAME="IDX168"></A>
+Initialize or re-initialize Readline's internal state.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Function:</U> int <B>rl_reset_terminal</B> <I>(char *terminal_name)</I>
+<DD><A NAME="IDX169"></A>
+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 NULL, the value of the <CODE>TERM</CODE>
+environment variable is used.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Function:</U> int <B>alphabetic</B> <I>(int c)</I>
+<DD><A NAME="IDX170"></A>
+Return 1 if <VAR>c</VAR> is an alphabetic character.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Function:</U> int <B>numeric</B> <I>(int c)</I>
+<DD><A NAME="IDX171"></A>
+Return 1 if <VAR>c</VAR> is a numeric character.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Function:</U> int <B>ding</B> <I>()</I>
+<DD><A NAME="IDX172"></A>
+Ring the terminal bell, obeying the setting of <CODE>bell-style</CODE>.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Function:</U> void <B>rl_display_match_list</B> <I>(char **matches, int len, int max)</I>
+<DD><A NAME="IDX173"></A>
+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">Readline Init File Syntax</A>).
+</DL>
+
+</P>
+<P>
+The following are implemented as macros, defined in <CODE>chartypes.h</CODE>.
+
+</P>
+<P>
+<DL>
+<DT><U>Function:</U> int <B>uppercase_p</B> <I>(int c)</I>
+<DD><A NAME="IDX174"></A>
+Return 1 if <VAR>c</VAR> is an uppercase alphabetic character.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Function:</U> int <B>lowercase_p</B> <I>(int c)</I>
+<DD><A NAME="IDX175"></A>
+Return 1 if <VAR>c</VAR> is a lowercase alphabetic character.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Function:</U> int <B>digit_p</B> <I>(int c)</I>
+<DD><A NAME="IDX176"></A>
+Return 1 if <VAR>c</VAR> is a numeric character.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Function:</U> int <B>to_upper</B> <I>(int c)</I>
+<DD><A NAME="IDX177"></A>
+If <VAR>c</VAR> is a lowercase alphabetic character, return the corresponding
+uppercase character.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Function:</U> int <B>to_lower</B> <I>(int c)</I>
+<DD><A NAME="IDX178"></A>
+If <VAR>c</VAR> is an uppercase alphabetic character, return the corresponding
+lowercase character.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Function:</U> int <B>digit_value</B> <I>(int c)</I>
+<DD><A NAME="IDX179"></A>
+If <VAR>c</VAR> is a number, return the value it represents.
+</DL>
+
+</P>
+
+
+<H3><A NAME="SEC38" HREF="readline.html#TOC38">Alternate Interface</A></H3>
+
+<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>
+<DL>
+<DT><U>Function:</U> void <B>rl_callback_handler_install</B> <I>(char *prompt, Vfunction *lhandler)</I>
+<DD><A NAME="IDX180"></A>
+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 callback when a complete line of input has been entered.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Function:</U> void <B>rl_callback_read_char</B> <I>()</I>
+<DD><A NAME="IDX181"></A>
+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. <CODE>EOF</CODE> is indicated by calling <VAR>lhandler</VAR> with a
+<CODE>NULL</CODE> line.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Function:</U> void <B>rl_callback_handler_remove</B> <I>()</I>
+<DD><A NAME="IDX182"></A>
+Restore the terminal to its initial state and remove the line handler.
+This may be called from within a callback as well as independently.
+</DL>
+
+</P>
+
+
+<H3><A NAME="SEC39" HREF="readline.html#TOC39">An Example</A></H3>
+
+<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>
+
+<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 (uppercase_p (rl_line_buffer[i]))
+ rl_line_buffer[i] = to_lower (rl_line_buffer[i]);
+ else if (lowercase_p (rl_line_buffer[i]))
+ rl_line_buffer[i] = 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>
+
+
+
+<H2><A NAME="SEC40" HREF="readline.html#TOC40">Readline Signal Handling</A></H2>
+
+<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 a signal is
+received 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>).
+
+</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 state, 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>
+<DL>
+<DT><U>Variable:</U> int <B>rl_catch_signals</B>
+<DD><A NAME="IDX183"></A>
+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>
+<DL>
+<DT><U>Variable:</U> int <B>rl_catch_sigwinch</B>
+<DD><A NAME="IDX184"></A>
+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>
+<DL>
+<DT><U>Function:</U> void <B>rl_cleanup_after_signal</B> <I>(void)</I>
+<DD><A NAME="IDX185"></A>
+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>
+<DL>
+<DT><U>Function:</U> void <B>rl_free_line_state</B> <I>(void)</I>
+<DD><A NAME="IDX186"></A>
+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>
+<DL>
+<DT><U>Function:</U> void <B>rl_reset_after_signal</B> <I>(void)</I>
+<DD><A NAME="IDX187"></A>
+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> to force Readline to update its idea of
+the terminal size when a <CODE>SIGWINCH</CODE> is received.
+
+</P>
+<P>
+<DL>
+<DT><U>Function:</U> void <B>rl_resize_terminal</B> <I>(void)</I>
+<DD><A NAME="IDX188"></A>
+Update Readline's internal screen size.
+</DL>
+
+</P>
+<P>
+The following functions install and remove Readline's signal handlers.
+
+</P>
+<P>
+<DL>
+<DT><U>Function:</U> int <B>rl_set_signals</B> <I>(void)</I>
+<DD><A NAME="IDX189"></A>
+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>
+<DL>
+<DT><U>Function:</U> int <B>rl_clear_signals</B> <I>(void)</I>
+<DD><A NAME="IDX190"></A>
+Remove all of the Readline signal handlers installed by
+<CODE>rl_set_signals ()</CODE>.
+</DL>
+
+</P>
+
+
+<H2><A NAME="SEC41" HREF="readline.html#TOC41">Custom Completers</A></H2>
+
+<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>
+
+<UL>
+<LI><A HREF="readline.html#SEC42">How Completing Works</A>: The logic used to do completion.
+<LI><A HREF="readline.html#SEC43">Completion Functions</A>: Functions provided by Readline.
+<LI><A HREF="readline.html#SEC44">Completion Variables</A>: Variables which control completion.
+<LI><A HREF="readline.html#SEC45">A Short Completion Example</A>: An example of writing completer subroutines.
+</UL>
+
+
+
+<H3><A NAME="SEC42" HREF="readline.html#TOC42">How Completing Works</A></H3>
+
+<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>
+
+<OL>
+<LI>
+
+The user-interface function <CODE>rl_complete ()</CODE>. This function is
+called with the same arguments as other Readline
+functions intended for interactive use: <VAR>count</VAR> and
+<VAR>invoking_key</VAR>. It isolates the word to be completed and calls
+<CODE>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.
+
+<LI>
+
+The internal function <CODE>completion_matches ()</CODE> uses your
+<EM>generator</EM> function to generate the list of possible matches, and
+then returns the array of these matches. You should place the address
+of your generator function in <CODE>rl_completion_entry_function</CODE>.
+
+<LI>
+
+The generator function is called repeatedly from
+<CODE>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. When the generator function returns
+<CODE>(char *)NULL</CODE> this signals <CODE>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.
+
+</OL>
+
+<P>
+<DL>
+<DT><U>Function:</U> int <B>rl_complete</B> <I>(int ignore, int invoking_key)</I>
+<DD><A NAME="IDX191"></A>
+Complete the word at or before point. You have supplied the function
+that does the initial simple matching selection algorithm (see
+<CODE>completion_matches ()</CODE>). The default is to do filename completion.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Variable:</U> Function * <B>rl_completion_entry_function</B>
+<DD><A NAME="IDX192"></A>
+This is a pointer to the generator function for <CODE>completion_matches
+()</CODE>. If the value of <CODE>rl_completion_entry_function</CODE> is
+<CODE>(Function *)NULL</CODE> then the default filename generator function,
+<CODE>filename_completion_function ()</CODE>, is used.
+</DL>
+
+</P>
+
+
+<H3><A NAME="SEC43" HREF="readline.html#TOC43">Completion Functions</A></H3>
+
+<P>
+Here is the complete list of callable completion functions present in
+Readline.
+
+</P>
+<P>
+<DL>
+<DT><U>Function:</U> int <B>rl_complete_internal</B> <I>(int what_to_do)</I>
+<DD><A NAME="IDX193"></A>
+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.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Function:</U> int <B>rl_complete</B> <I>(int ignore, int invoking_key)</I>
+<DD><A NAME="IDX194"></A>
+Complete the word at or before point. You have supplied the function
+that does the initial simple matching selection algorithm (see
+<CODE>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>
+<DL>
+<DT><U>Function:</U> int <B>rl_possible_completions</B> <I>(int count, int invoking_key))</I>
+<DD><A NAME="IDX195"></A>
+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>
+<DL>
+<DT><U>Function:</U> int <B>rl_insert_completions</B> <I>(int count, int invoking_key))</I>
+<DD><A NAME="IDX196"></A>
+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>
+<DL>
+<DT><U>Function:</U> char ** <B>completion_matches</B> <I>(char *text, CPFunction *entry_func)</I>
+<DD><A NAME="IDX197"></A>
+Returns an array of <CODE>(char *)</CODE> which is a list of completions for
+<VAR>text</VAR>. If there are no completions, returns <CODE>(char **)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>
+<DL>
+<DT><U>Function:</U> char * <B>filename_completion_function</B> <I>(char *text, int state)</I>
+<DD><A NAME="IDX198"></A>
+A generator function for filename completion in the general case. Note
+that completion in Bash is a little different because of all
+the pathnames that must be followed when looking up completions for a
+command. The Bash source is a useful reference for writing custom
+completion functions.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Function:</U> char * <B>username_completion_function</B> <I>(char *text, int state)</I>
+<DD><A NAME="IDX199"></A>
+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>
+
+
+<H3><A NAME="SEC44" HREF="readline.html#TOC44">Completion Variables</A></H3>
+
+<P>
+<DL>
+<DT><U>Variable:</U> Function * <B>rl_completion_entry_function</B>
+<DD><A NAME="IDX200"></A>
+A pointer to the generator function for <CODE>completion_matches ()</CODE>.
+<CODE>NULL</CODE> means to use <CODE>filename_completion_function ()</CODE>, the default
+filename completer.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Variable:</U> CPPFunction * <B>rl_attempted_completion_function</B>
+<DD><A NAME="IDX201"></A>
+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> saying
+what the boundaries of <VAR>text</VAR> are. 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.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Variable:</U> CPFunction * <B>rl_filename_quoting_function</B>
+<DD><A NAME="IDX202"></A>
+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>
+<DL>
+<DT><U>Variable:</U> CPFunction * <B>rl_filename_dequoting_function</B>
+<DD><A NAME="IDX203"></A>
+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>
+<DL>
+<DT><U>Variable:</U> Function * <B>rl_char_is_quoted_p</B>
+<DD><A NAME="IDX204"></A>
+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>
+<DL>
+<DT><U>Variable:</U> int <B>rl_completion_query_items</B>
+<DD><A NAME="IDX205"></A>
+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.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Variable:</U> char * <B>rl_basic_word_break_characters</B>
+<DD><A NAME="IDX206"></A>
+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, i.e.,
+<CODE>" \t\n\"\\'`@$&#62;&#60;=;|&#38;{("</CODE>.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Variable:</U> char * <B>rl_basic_quote_characters</B>
+<DD><A NAME="IDX207"></A>
+List of quote characters which can cause a word break.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Variable:</U> char * <B>rl_completer_word_break_characters</B>
+<DD><A NAME="IDX208"></A>
+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>
+<DL>
+<DT><U>Variable:</U> char * <B>rl_completer_quote_characters</B>
+<DD><A NAME="IDX209"></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>
+<DL>
+<DT><U>Variable:</U> char * <B>rl_filename_quote_characters</B>
+<DD><A NAME="IDX210"></A>
+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>
+<DL>
+<DT><U>Variable:</U> char * <B>rl_special_prefixes</B>
+<DD><A NAME="IDX211"></A>
+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>
+<DL>
+<DT><U>Variable:</U> int <B>rl_completion_append_character</B>
+<DD><A NAME="IDX212"></A>
+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 custom completion functions to
+provide the "most sensible word separator character" according to
+an application-specific command line syntax specification.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Variable:</U> int <B>rl_ignore_completion_duplicates</B>
+<DD><A NAME="IDX213"></A>
+If non-zero, then disallow duplicates in the matches. Default is 1.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Variable:</U> int <B>rl_filename_completion_desired</B>
+<DD><A NAME="IDX214"></A>
+Non-zero means that the results of the matches are to be treated as
+filenames. This is <EM>always</EM> zero on entry, and can only be changed
+within a completion entry generator function. If it is set to a non-zero
+value, directory names have a slash appended and Readline attempts to
+quote completed filenames if they contain any embedded word break
+characters.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Variable:</U> int <B>rl_filename_quoting_desired</B>
+<DD><A NAME="IDX215"></A>
+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
+on entry, and can only be changed within a completion entry generator
+function. The quoting is effected via a call to the function pointed to
+by <CODE>rl_filename_quoting_function</CODE>.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Variable:</U> int <B>rl_inhibit_completion</B>
+<DD><A NAME="IDX216"></A>
+If this variable is non-zero, completion is inhibit&#60;ed. The completion
+character will be inserted as any other bound to <CODE>self-insert</CODE>.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Variable:</U> Function * <B>rl_ignore_some_completions_function</B>
+<DD><A NAME="IDX217"></A>
+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>
+<DL>
+<DT><U>Variable:</U> Function * <B>rl_directory_completion_hook</B>
+<DD><A NAME="IDX218"></A>
+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. It could be used
+to expand symbolic links or shell variables in pathnames.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Variable:</U> VFunction * <B>rl_completion_display_matches_hook</B>
+<DD><A NAME="IDX219"></A>
+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>
+
+
+<H3><A NAME="SEC45" HREF="readline.html#TOC45">A Short Completion Example</A></H3>
+
+<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>
+
+<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 *getwd ();
+extern char *xmalloc ();
+
+/* The names of functions that actually do the manipulation. */
+int com_list (), com_view (), com_rename (), com_stat (), com_pwd ();
+int com_delete (), com_help (), com_cd (), com_quit ();
+
+/* A structure which contains information on the commands this program
+ can understand. */
+
+typedef struct {
+ char *name; /* User printable name of the function. */
+ Function *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, (Function *)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)
+ 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 ();
+char **fileman_completion ();
+
+/* 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 = (CPPFunction *)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)
+ 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 = 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)
+ 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 = getwd (dir);
+ 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);
+}
+</PRE>
+
+
+
+<H1><A NAME="SEC46" HREF="readline.html#TOC46">Concept Index</A></H1>
+<P>
+Jump to:
+<A HREF="#cindex_c">c</A>
+-
+<A HREF="#cindex_e">e</A>
+-
+<A HREF="#cindex_i">i</A>
+-
+<A HREF="#cindex_k">k</A>
+-
+<A HREF="#cindex_n">n</A>
+-
+<A HREF="#cindex_r">r</A>
+-
+<A HREF="#cindex_y">y</A>
+<P>
+<H2><A NAME="cindex_c">c</A></H2>
+<DIR>
+<LI><A HREF="readline.html#IDX3">command editing</A>
+</DIR>
+<H2><A NAME="cindex_e">e</A></H2>
+<DIR>
+<LI><A HREF="readline.html#IDX4">editing command lines</A>
+</DIR>
+<H2><A NAME="cindex_i">i</A></H2>
+<DIR>
+<LI><A HREF="readline.html#IDX8">initialization file, readline</A>
+<LI><A HREF="readline.html#IDX1">interaction, readline</A>
+</DIR>
+<H2><A NAME="cindex_k">k</A></H2>
+<DIR>
+<LI><A HREF="readline.html#IDX7">kill ring</A>
+<LI><A HREF="readline.html#IDX5">killing text</A>
+</DIR>
+<H2><A NAME="cindex_n">n</A></H2>
+<DIR>
+<LI><A HREF="readline.html#IDX2">notation, readline</A>
+</DIR>
+<H2><A NAME="cindex_r">r</A></H2>
+<DIR>
+<LI><A HREF="readline.html#IDX98">readline, function</A>
+</DIR>
+<H2><A NAME="cindex_y">y</A></H2>
+<DIR>
+<LI><A HREF="readline.html#IDX6">yanking text</A>
+</DIR>
+
+</P>
+
+
+<H1><A NAME="SEC47" HREF="readline.html#TOC47">Function and Variable Index</A></H1>
+<P>
+Jump to:
+<A HREF="#findex_a">a</A>
+-
+<A HREF="#findex_b">b</A>
+-
+<A HREF="#findex_c">c</A>
+-
+<A HREF="#findex_d">d</A>
+-
+<A HREF="#findex_e">e</A>
+-
+<A HREF="#findex_f">f</A>
+-
+<A HREF="#findex_h">h</A>
+-
+<A HREF="#findex_i">i</A>
+-
+<A HREF="#findex_k">k</A>
+-
+<A HREF="#findex_l">l</A>
+-
+<A HREF="#findex_m">m</A>
+-
+<A HREF="#findex_n">n</A>
+-
+<A HREF="#findex_o">o</A>
+-
+<A HREF="#findex_p">p</A>
+-
+<A HREF="#findex_q">q</A>
+-
+<A HREF="#findex_r">r</A>
+-
+<A HREF="#findex_s">s</A>
+-
+<A HREF="#findex_t">t</A>
+-
+<A HREF="#findex_u">u</A>
+-
+<A HREF="#findex_v">v</A>
+-
+<A HREF="#findex_y">y</A>
+<P>
+<H2><A NAME="findex_a">a</A></H2>
+<DIR>
+<LI><A HREF="readline.html#IDX83">abort (C-g)</A>
+<LI><A HREF="readline.html#IDX34">accept-line (Newline, Return)</A>
+<LI><A HREF="readline.html#IDX170">alphabetic</A>
+</DIR>
+<H2><A NAME="findex_b">b</A></H2>
+<DIR>
+<LI><A HREF="readline.html#IDX29">backward-char (C-b)</A>
+<LI><A HREF="readline.html#IDX48">backward-delete-char (Rubout)</A>
+<LI><A HREF="readline.html#IDX59">backward-kill-line (C-x Rubout)</A>
+<LI><A HREF="readline.html#IDX63">backward-kill-word (M-DEL)</A>
+<LI><A HREF="readline.html#IDX31">backward-word (M-b)</A>
+<LI><A HREF="readline.html#IDX37">beginning-of-history (M-&#38;#60;)</A>
+<LI><A HREF="readline.html#IDX26">beginning-of-line (C-a)</A>
+<LI><A HREF="readline.html#IDX9">bell-style</A>
+</DIR>
+<H2><A NAME="findex_c">c</A></H2>
+<DIR>
+<LI><A HREF="readline.html#IDX81">call-last-kbd-macro (C-x e)</A>
+<LI><A HREF="readline.html#IDX57">capitalize-word (M-c)</A>
+<LI><A HREF="readline.html#IDX91">character-search (C-])</A>
+<LI><A HREF="readline.html#IDX92">character-search-backward (M-C-])</A>
+<LI><A HREF="readline.html#IDX32">clear-screen (C-l)</A>
+<LI><A HREF="readline.html#IDX10">comment-begin</A>
+<LI><A HREF="readline.html#IDX74">complete (TAB)</A>
+<LI><A HREF="readline.html#IDX11">completion-query-items</A>
+<LI><A HREF="readline.html#IDX197">completion_matches</A>
+<LI><A HREF="readline.html#IDX12">convert-meta</A>
+<LI><A HREF="readline.html#IDX68">copy-backward-word ()</A>
+<LI><A HREF="readline.html#IDX69">copy-forward-word ()</A>
+<LI><A HREF="readline.html#IDX67">copy-region-as-kill ()</A>
+</DIR>
+<H2><A NAME="findex_d">d</A></H2>
+<DIR>
+<LI><A HREF="readline.html#IDX47">delete-char (C-d)</A>
+<LI><A HREF="readline.html#IDX78">delete-char-or-list ()</A>
+<LI><A HREF="readline.html#IDX65">delete-horizontal-space ()</A>
+<LI><A HREF="readline.html#IDX72">digit-argument (M-0, M-1, ... M--)</A>
+<LI><A HREF="readline.html#IDX176">digit_p</A>
+<LI><A HREF="readline.html#IDX179">digit_value</A>
+<LI><A HREF="readline.html#IDX172">ding</A>
+<LI><A HREF="readline.html#IDX13">disable-completion</A>
+<LI><A HREF="readline.html#IDX84">do-uppercase-version (M-a, M-b, M-<VAR>x</VAR>, ...)</A>
+<LI><A HREF="readline.html#IDX56">downcase-word (M-l)</A>
+<LI><A HREF="readline.html#IDX94">dump-functions ()</A>
+<LI><A HREF="readline.html#IDX96">dump-macros ()</A>
+<LI><A HREF="readline.html#IDX95">dump-variables ()</A>
+</DIR>
+<H2><A NAME="findex_e">e</A></H2>
+<DIR>
+<LI><A HREF="readline.html#IDX14">editing-mode</A>
+<LI><A HREF="readline.html#IDX15">enable-keypad</A>
+<LI><A HREF="readline.html#IDX80">end-kbd-macro (C-x ))</A>
+<LI><A HREF="readline.html#IDX38">end-of-history (M-&#38;#62;)</A>
+<LI><A HREF="readline.html#IDX27">end-of-line (C-e)</A>
+<LI><A HREF="readline.html#IDX90">exchange-point-and-mark (C-x C-x)</A>
+<LI><A HREF="readline.html#IDX16">expand-tilde</A>
+</DIR>
+<H2><A NAME="findex_f">f</A></H2>
+<DIR>
+<LI><A HREF="readline.html#IDX198">filename_completion_function</A>
+<LI><A HREF="readline.html#IDX49">forward-backward-delete-char ()</A>
+<LI><A HREF="readline.html#IDX28">forward-char (C-f)</A>
+<LI><A HREF="readline.html#IDX40">forward-search-history (C-s)</A>
+<LI><A HREF="readline.html#IDX30">forward-word (M-f)</A>
+<LI><A HREF="readline.html#IDX148">free_undo_list</A>
+</DIR>
+<H2><A NAME="findex_h">h</A></H2>
+<DIR>
+<LI><A HREF="readline.html#IDX44">history-search-backward ()</A>
+<LI><A HREF="readline.html#IDX43">history-search-forward ()</A>
+<LI><A HREF="readline.html#IDX17">horizontal-scroll-mode</A>
+</DIR>
+<H2><A NAME="findex_i">i</A></H2>
+<DIR>
+<LI><A HREF="readline.html#IDX18">input-meta</A>
+<LI><A HREF="readline.html#IDX93">insert-comment (M-#)</A>
+<LI><A HREF="readline.html#IDX76">insert-completions (M-*)</A>
+<LI><A HREF="readline.html#IDX20">isearch-terminators</A>
+</DIR>
+<H2><A NAME="findex_k">k</A></H2>
+<DIR>
+<LI><A HREF="readline.html#IDX21">keymap</A>
+<LI><A HREF="readline.html#IDX58">kill-line (C-k)</A>
+<LI><A HREF="readline.html#IDX66">kill-region ()</A>
+<LI><A HREF="readline.html#IDX61">kill-whole-line ()</A>
+<LI><A HREF="readline.html#IDX62">kill-word (M-d)</A>
+</DIR>
+<H2><A NAME="findex_l">l</A></H2>
+<DIR>
+<LI><A HREF="readline.html#IDX175">lowercase_p</A>
+</DIR>
+<H2><A NAME="findex_m">m</A></H2>
+<DIR>
+<LI><A HREF="readline.html#IDX22">mark-modified-lines</A>
+<LI><A HREF="readline.html#IDX77">menu-complete ()</A>
+<LI><A HREF="readline.html#IDX19">meta-flag</A>
+</DIR>
+<H2><A NAME="findex_n">n</A></H2>
+<DIR>
+<LI><A HREF="readline.html#IDX36">next-history (C-n)</A>
+<LI><A HREF="readline.html#IDX42">non-incremental-forward-search-history (M-n)</A>
+<LI><A HREF="readline.html#IDX41">non-incremental-reverse-search-history (M-p)</A>
+<LI><A HREF="readline.html#IDX171">numeric</A>
+</DIR>
+<H2><A NAME="findex_o">o</A></H2>
+<DIR>
+<LI><A HREF="readline.html#IDX23">output-meta</A>
+</DIR>
+<H2><A NAME="findex_p">p</A></H2>
+<DIR>
+<LI><A HREF="readline.html#IDX75">possible-completions (M-?)</A>
+<LI><A HREF="readline.html#IDX85">prefix-meta (ESC)</A>
+<LI><A HREF="readline.html#IDX35">previous-history (C-p)</A>
+</DIR>
+<H2><A NAME="findex_q">q</A></H2>
+<DIR>
+<LI><A HREF="readline.html#IDX50">quoted-insert (C-q, C-v)</A>
+</DIR>
+<H2><A NAME="findex_r">r</A></H2>
+<DIR>
+<LI><A HREF="readline.html#IDX82">re-read-init-file (C-x C-r)</A>
+<LI><A HREF="readline.html#IDX97">readline</A>
+<LI><A HREF="readline.html#IDX33">redraw-current-line ()</A>
+<LI><A HREF="readline.html#IDX39">reverse-search-history (C-r)</A>
+<LI><A HREF="readline.html#IDX87">revert-line (M-r)</A>
+<LI><A HREF="readline.html#IDX120">rl_add_defun</A>
+<LI><A HREF="readline.html#IDX147">rl_add_undo</A>
+<LI><A HREF="readline.html#IDX107">rl_already_prompted</A>
+<LI><A HREF="readline.html#IDX201">rl_attempted_completion_function</A>
+<LI><A HREF="readline.html#IDX207">rl_basic_quote_characters</A>
+<LI><A HREF="readline.html#IDX206">rl_basic_word_break_characters</A>
+<LI><A HREF="readline.html#IDX145">rl_begin_undo_group</A>
+<LI><A HREF="readline.html#IDX129">rl_bind_key</A>
+<LI><A HREF="readline.html#IDX130">rl_bind_key_in_map</A>
+<LI><A HREF="readline.html#IDX119">rl_binding_keymap</A>
+<LI><A HREF="readline.html#IDX180">rl_callback_handler_install</A>
+<LI><A HREF="readline.html#IDX182">rl_callback_handler_remove</A>
+<LI><A HREF="readline.html#IDX181">rl_callback_read_char</A>
+<LI><A HREF="readline.html#IDX183">rl_catch_signals</A>
+<LI><A HREF="readline.html#IDX184">rl_catch_sigwinch</A>
+<LI><A HREF="readline.html#IDX204">rl_char_is_quoted_p</A>
+<LI><A HREF="readline.html#IDX185">rl_cleanup_after_signal</A>
+<LI><A HREF="readline.html#IDX157">rl_clear_message</A>
+<LI><A HREF="readline.html#IDX190">rl_clear_signals</A>
+<LI><A HREF="readline.html#IDX191">rl_complete</A>, <A HREF="readline.html#IDX194">rl_complete</A>
+<LI><A HREF="readline.html#IDX193">rl_complete_internal</A>
+<LI><A HREF="readline.html#IDX209">rl_completer_quote_characters</A>
+<LI><A HREF="readline.html#IDX208">rl_completer_word_break_characters</A>
+<LI><A HREF="readline.html#IDX212">rl_completion_append_character</A>
+<LI><A HREF="readline.html#IDX219">rl_completion_display_matches_hook</A>
+<LI><A HREF="readline.html#IDX192">rl_completion_entry_function</A>, <A HREF="readline.html#IDX200">rl_completion_entry_function</A>
+<LI><A HREF="readline.html#IDX205">rl_completion_query_items</A>
+<LI><A HREF="readline.html#IDX122">rl_copy_keymap</A>
+<LI><A HREF="readline.html#IDX162">rl_copy_text</A>
+<LI><A HREF="readline.html#IDX161">rl_delete_text</A>
+<LI><A HREF="readline.html#IDX218">rl_directory_completion_hook</A>
+<LI><A HREF="readline.html#IDX124">rl_discard_keymap</A>
+<LI><A HREF="readline.html#IDX173">rl_display_match_list</A>
+<LI><A HREF="readline.html#IDX149">rl_do_undo</A>
+<LI><A HREF="readline.html#IDX103">rl_done</A>
+<LI><A HREF="readline.html#IDX101">rl_end</A>
+<LI><A HREF="readline.html#IDX146">rl_end_undo_group</A>
+<LI><A HREF="readline.html#IDX105">rl_erase_empty_line</A>
+<LI><A HREF="readline.html#IDX115">rl_event_hook</A>
+<LI><A HREF="readline.html#IDX118">rl_executing_keymap</A>
+<LI><A HREF="readline.html#IDX167">rl_extend_line_buffer</A>
+<LI><A HREF="readline.html#IDX214">rl_filename_completion_desired</A>
+<LI><A HREF="readline.html#IDX203">rl_filename_dequoting_function</A>
+<LI><A HREF="readline.html#IDX210">rl_filename_quote_characters</A>
+<LI><A HREF="readline.html#IDX215">rl_filename_quoting_desired</A>
+<LI><A HREF="readline.html#IDX202">rl_filename_quoting_function</A>
+<LI><A HREF="readline.html#IDX152">rl_forced_update_display</A>
+<LI><A HREF="readline.html#IDX186">rl_free_line_state</A>
+<LI><A HREF="readline.html#IDX142">rl_function_dumper</A>
+<LI><A HREF="readline.html#IDX139">rl_function_of_keyseq</A>
+<LI><A HREF="readline.html#IDX144">rl_funmap_names</A>
+<LI><A HREF="readline.html#IDX135">rl_generic_bind</A>
+<LI><A HREF="readline.html#IDX125">rl_get_keymap</A>
+<LI><A HREF="readline.html#IDX127">rl_get_keymap_by_name</A>
+<LI><A HREF="readline.html#IDX128">rl_get_keymap_name</A>
+<LI><A HREF="readline.html#IDX165">rl_getc</A>
+<LI><A HREF="readline.html#IDX116">rl_getc_function</A>
+<LI><A HREF="readline.html#IDX213">rl_ignore_completion_duplicates</A>
+<LI><A HREF="readline.html#IDX217">rl_ignore_some_completions_function</A>
+<LI><A HREF="readline.html#IDX216">rl_inhibit_completion</A>
+<LI><A HREF="readline.html#IDX168">rl_initialize</A>
+<LI><A HREF="readline.html#IDX196">rl_insert_completions</A>
+<LI><A HREF="readline.html#IDX160">rl_insert_text</A>
+<LI><A HREF="readline.html#IDX111">rl_instream</A>
+<LI><A HREF="readline.html#IDX140">rl_invoking_keyseqs</A>
+<LI><A HREF="readline.html#IDX141">rl_invoking_keyseqs_in_map</A>
+<LI><A HREF="readline.html#IDX163">rl_kill_text</A>
+<LI><A HREF="readline.html#IDX108">rl_library_version</A>
+<LI><A HREF="readline.html#IDX99">rl_line_buffer</A>
+<LI><A HREF="readline.html#IDX143">rl_list_funmap_names</A>
+<LI><A HREF="readline.html#IDX121">rl_make_bare_keymap</A>
+<LI><A HREF="readline.html#IDX123">rl_make_keymap</A>
+<LI><A HREF="readline.html#IDX102">rl_mark</A>
+<LI><A HREF="readline.html#IDX156">rl_message</A>
+<LI><A HREF="readline.html#IDX150">rl_modifying</A>
+<LI><A HREF="readline.html#IDX138">rl_named_function</A>
+<LI><A HREF="readline.html#IDX153">rl_on_new_line</A>
+<LI><A HREF="readline.html#IDX154">rl_on_new_line_with_prompt</A>
+<LI><A HREF="readline.html#IDX112">rl_outstream</A>
+<LI><A HREF="readline.html#IDX136">rl_parse_and_bind</A>
+<LI><A HREF="readline.html#IDX104">rl_pending_input</A>
+<LI><A HREF="readline.html#IDX100">rl_point</A>
+<LI><A HREF="readline.html#IDX195">rl_possible_completions</A>
+<LI><A HREF="readline.html#IDX114">rl_pre_input_hook</A>
+<LI><A HREF="readline.html#IDX106">rl_prompt</A>
+<LI><A HREF="readline.html#IDX137">rl_read_init_file</A>
+<LI><A HREF="readline.html#IDX164">rl_read_key</A>
+<LI><A HREF="readline.html#IDX110">rl_readline_name</A>
+<LI><A HREF="readline.html#IDX151">rl_redisplay</A>
+<LI><A HREF="readline.html#IDX117">rl_redisplay_function</A>
+<LI><A HREF="readline.html#IDX187">rl_reset_after_signal</A>
+<LI><A HREF="readline.html#IDX155">rl_reset_line_state</A>
+<LI><A HREF="readline.html#IDX169">rl_reset_terminal</A>
+<LI><A HREF="readline.html#IDX188">rl_resize_terminal</A>
+<LI><A HREF="readline.html#IDX159">rl_restore_prompt</A>
+<LI><A HREF="readline.html#IDX158">rl_save_prompt</A>
+<LI><A HREF="readline.html#IDX126">rl_set_keymap</A>
+<LI><A HREF="readline.html#IDX189">rl_set_signals</A>
+<LI><A HREF="readline.html#IDX211">rl_special_prefixes</A>
+<LI><A HREF="readline.html#IDX113">rl_startup_hook</A>
+<LI><A HREF="readline.html#IDX166">rl_stuff_char</A>
+<LI><A HREF="readline.html#IDX109">rl_terminal_name</A>
+<LI><A HREF="readline.html#IDX134">rl_unbind_command_in_map</A>
+<LI><A HREF="readline.html#IDX133">rl_unbind_function_in_map</A>
+<LI><A HREF="readline.html#IDX131">rl_unbind_key</A>
+<LI><A HREF="readline.html#IDX132">rl_unbind_key_in_map</A>
+</DIR>
+<H2><A NAME="findex_s">s</A></H2>
+<DIR>
+<LI><A HREF="readline.html#IDX52">self-insert (a, b, A, 1, !, ...)</A>
+<LI><A HREF="readline.html#IDX89">set-mark (C-@)</A>
+<LI><A HREF="readline.html#IDX24">show-all-if-ambiguous</A>
+<LI><A HREF="readline.html#IDX79">start-kbd-macro (C-x ()</A>
+</DIR>
+<H2><A NAME="findex_t">t</A></H2>
+<DIR>
+<LI><A HREF="readline.html#IDX51">tab-insert (M-TAB)</A>
+<LI><A HREF="readline.html#IDX88">tilde-expand (M-~)</A>
+<LI><A HREF="readline.html#IDX178">to_lower</A>
+<LI><A HREF="readline.html#IDX177">to_upper</A>
+<LI><A HREF="readline.html#IDX53">transpose-chars (C-t)</A>
+<LI><A HREF="readline.html#IDX54">transpose-words (M-t)</A>
+</DIR>
+<H2><A NAME="findex_u">u</A></H2>
+<DIR>
+<LI><A HREF="readline.html#IDX86">undo (C-_, C-x C-u)</A>
+<LI><A HREF="readline.html#IDX73">universal-argument ()</A>
+<LI><A HREF="readline.html#IDX60">unix-line-discard (C-u)</A>
+<LI><A HREF="readline.html#IDX64">unix-word-rubout (C-w)</A>
+<LI><A HREF="readline.html#IDX55">upcase-word (M-u)</A>
+<LI><A HREF="readline.html#IDX174">uppercase_p</A>
+<LI><A HREF="readline.html#IDX199">username_completion_function</A>
+</DIR>
+<H2><A NAME="findex_v">v</A></H2>
+<DIR>
+<LI><A HREF="readline.html#IDX25">visible-stats</A>
+</DIR>
+<H2><A NAME="findex_y">y</A></H2>
+<DIR>
+<LI><A HREF="readline.html#IDX70">yank (C-y)</A>
+<LI><A HREF="readline.html#IDX46">yank-last-arg (M-., M-_)</A>
+<LI><A HREF="readline.html#IDX45">yank-nth-arg (M-C-y)</A>
+<LI><A HREF="readline.html#IDX71">yank-pop (M-y)</A>
+</DIR>
+
+</P>
+<P><HR><P>
+This document was generated on 1 March 2000 using the
+<A HREF="http://wwwinfo.cern.ch/dis/texi2html/">texi2html</A>
+translator version 1.52.</P>
+</BODY>
+</HTML>
diff --git a/gnu/lib/libreadline/doc/readline.info b/gnu/lib/libreadline/doc/readline.info
new file mode 100644
index 00000000000..ae6767fa19c
--- /dev/null
+++ b/gnu/lib/libreadline/doc/readline.info
@@ -0,0 +1,3107 @@
+This is Info file readline.info, produced by Makeinfo version 1.68 from
+the input file /usr/homes/chet/src/bash/readline-src/doc/rlman.texinfo.
+
+INFO-DIR-SECTION Libraries
+START-INFO-DIR-ENTRY
+* Readline: (readline). The GNU readline library API
+END-INFO-DIR-ENTRY
+
+ This document describes the GNU Readline Library, a utility which
+aids in the consistency of user interface across discrete programs that
+need to provide a command line interface.
+
+ Copyright (C) 1988-1999 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 Free Software Foundation.
+
+
+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 that
+need to provide a command line interface.
+
+* Menu:
+
+* Command Line Editing:: GNU Readline User's Manual.
+* Programming with GNU Readline:: GNU Readline Programmer's Manual.
+* Concept Index:: Index of concepts described in this manual.
+* Function and Variable Index:: Index of externally visible functions
+ and variables.
+
+
+File: readline.info, Node: Command Line Editing, Next: Programming with GNU Readline, Prev: Top, Up: Top
+
+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.
+
+
+File: readline.info, Node: Introduction and Notation, Next: Readline Interaction, Up: Command Line Editing
+
+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.
+
+
+File: readline.info, Node: Readline Interaction, Next: Readline Init File, Prev: Introduction and Notation, Up: Command Line Editing
+
+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 <RETURN>. You do not have to be at the end
+of the line to press <RETURN>; 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.
+
+
+File: readline.info, Node: Readline Bare Essentials, Next: Readline Movement Commands, Up: Readline Interaction
+
+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.)
+
+
+File: readline.info, Node: Readline Movement Commands, Next: Readline Killing Commands, Prev: Readline Bare Essentials, Up: Readline Interaction
+
+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.
+
+
+File: readline.info, Node: Readline Killing Commands, Next: Readline Arguments, Prev: Readline Movement Commands, Up: Readline Interaction
+
+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 previous 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>.
+
+
+File: readline.info, Node: Readline Arguments, Next: Searching, Prev: Readline Killing Commands, Up: Readline Interaction
+
+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'.
+
+
+File: readline.info, Node: Searching, Prev: Readline Arguments, Up: Readline Interaction
+
+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.
+
+ 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.
+
+
+File: readline.info, Node: Readline Init File, Next: Bindable Readline Commands, Prev: Readline Interaction, Up: Command Line Editing
+
+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'.
+
+ 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.
+
+
+File: readline.info, Node: Readline Init File Syntax, Next: Conditional Init Constructs, Up: Readline Init File
+
+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. Here is how to change from the default Emacs-like key
+ binding to use `vi' line editing commands:
+
+ set editing-mode vi
+
+ 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.
+
+ `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 he wants to see the list of
+ possibilities. 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. 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'.
+
+ `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 strip the eighth bit from 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-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.
+
+ `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'.
+
+ `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'.
+
+ `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 the name of
+ the key you wish to bind the command to, a colon, and then the
+ name of the command on a line in the init file. The name of the
+ key can be expressed in different ways, depending on which is most
+ comfortable for you.
+
+ 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', 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).
+
+ "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 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 character whose `ASCII' code is the octal value NNN (one
+ to three digits)
+
+ `\xNNN'
+ the character whose `ASCII' code is the hexadecimal value NNN
+ (one to three 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\\": "\\"
+
+
+File: readline.info, Node: Conditional Init Constructs, Next: Sample Init File, Prev: Readline Init File Syntax, Up: Readline Init File
+
+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 it. 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.
+ $include /etc/inputrc
+
+
+File: readline.info, Node: Sample Init File, Prev: Conditional Init Constructs, Up: Readline Init File
+
+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
+
+
+File: readline.info, Node: Bindable Readline Commands, Next: Readline vi Mode, Prev: Readline Init File, Up: Command Line Editing
+
+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.
+
+
+File: readline.info, Node: Commands For Moving, Next: Commands For History, Up: Bindable Readline Commands
+
+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.
+
+
+File: readline.info, Node: Commands For History, Next: Commands For Text, Prev: Commands For Moving, Up: Bindable Readline Commands
+
+Commands For Manipulating The History
+-------------------------------------
+
+`accept-line (Newline, Return)'
+ Accept the line regardless of where the cursor is. If this line is
+ non-empty, add it to the history list. If this line was a history
+ line, then restore the history line to its original state.
+
+`previous-history (C-p)'
+ Move `up' through the history list.
+
+`next-history (C-n)'
+ Move `down' through the history list.
+
+`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). 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.
+
+`yank-last-arg (M-., 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.
+
+
+File: readline.info, Node: Commands For Text, Next: Commands For Killing, Prev: Commands For History, Up: Bindable Readline Commands
+
+Commands For Changing Text
+--------------------------
+
+`delete-char (C-d)'
+ Delete the character under the cursor. If the cursor 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, 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.
+
+`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.
+
+
+File: readline.info, Node: Commands For Killing, Next: Numeric Arguments, Prev: Commands For Text, Up: Bindable Readline Commands
+
+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 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.
+
+`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 the current
+ cursor position.
+
+`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.
+
+
+File: readline.info, Node: Numeric Arguments, Next: Commands For Completion, Prev: Commands For Killing, Up: Bindable Readline Commands
+
+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.
+
+
+File: readline.info, Node: Commands For Completion, Next: Keyboard Macros, Prev: Numeric Arguments, Up: Bindable Readline Commands
+
+Letting Readline Type For You
+-----------------------------
+
+`complete (TAB)'
+ Attempt to do completion on the text before the cursor. This is
+ application-specific. Generally, if you are typing a filename
+ argument, you can do filename completion; if you are typing a
+ command, you can do command completion; if you are typing in a
+ symbol to GDB, you can do symbol name completion; if you are
+ typing in a variable to Bash, you can do variable name completion,
+ and so on.
+
+`possible-completions (M-?)'
+ List the possible completions of the text before the cursor.
+
+`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 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.
+
+
+File: readline.info, Node: Keyboard Macros, Next: Miscellaneous Commands, Prev: Commands For Completion, Up: Bindable Readline Commands
+
+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.
+
+
+File: readline.info, Node: Miscellaneous Commands, Prev: Keyboard Macros, Up: Bindable Readline Commands
+
+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)'
+ Make the next character typed be metafied. This is for keyboards
+ without a meta key. Typing `ESC f' is equivalent to typing `M-f'.
+
+`undo (C-_, 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 current 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-#)'
+ The value of the `comment-begin' variable is inserted at the
+ beginning of the current line, and 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 ouput. 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.
+
+
+File: readline.info, Node: Readline vi Mode, Prev: Bindable Readline Commands, Up: Command Line Editing
+
+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 (toggle-editing-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 consitency of user interface across discrete programs
+that need to provide a command line interface.
+
+ Copyright (C) 1988, 1994, 1996, 1998, 1999 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.
+
+
+File: readline.info, Node: Programming with GNU Readline, Next: Concept Index, Prev: Command Line Editing, Up: Top
+
+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.
+
+
+File: readline.info, Node: Basic Behavior, Next: Custom Functions, Up: Programming with GNU Readline
+
+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 and then reads and returns
+a single line of text from the user. The line `readline' returns is
+allocated with `malloc ()'; you should `free ()' the line when you are
+done with it. The declaration for `readline' in ANSI C is
+
+ `char *readline (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, int (*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::.).
+
+
+File: readline.info, Node: Custom Functions, Next: Readline Variables, Prev: Basic Behavior, Up: Programming with GNU Readline
+
+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'.
+
+* Menu:
+
+* The Function Type:: C declarations to make code readable.
+* Function Writing:: Variables and calling conventions.
+
+
+File: readline.info, Node: The Function Type, Next: Function Writing, Up: Custom Functions
+
+The Function Type
+-----------------
+
+ For readabilty, we declare a new type of object, called "Function".
+A `Function' is a C function which returns an `int'. The type
+declaration for `Function' is:
+
+`typedef int Function ();'
+
+ The reason for declaring this new type is to make it easier to write
+code describing pointers to C functions. Let us say we had a variable
+called FUNC which was a pointer to a function. Instead of the classic
+C declaration
+
+ `int (*)()func;'
+
+we may write
+
+ `Function *func;'
+
+Similarly, there are
+
+ typedef void VFunction ();
+ typedef char *CPFunction (); and
+ typedef char **CPPFunction ();
+
+for functions returning no value, `pointer to char', and `pointer to
+pointer to char', respectively.
+
+
+File: readline.info, Node: Function Writing, Prev: The Function Type, Up: Custom Functions
+
+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
+
+ `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.
+
+
+File: readline.info, Node: Readline Variables, Next: Readline Convenience Functions, Prev: Custom Functions, Up: Programming with GNU Readline
+
+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_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_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.
+
+ - 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: char * rl_library_version
+ The version number of this revision of the library.
+
+ - Variable: char * rl_terminal_name
+ The terminal type, used for initialization.
+
+ - Variable: 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.
+
+ - Variable: FILE * rl_outstream
+ The stdio stream to which Readline performs output.
+
+ - Variable: Function * rl_startup_hook
+ If non-zero, this is the address of a function to call just before
+ `readline' prints the first prompt.
+
+ - Variable: Function * 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: Function * rl_event_hook
+ If non-zero, this is the address of a function to call periodically
+ when readline is waiting for terminal input.
+
+ - Variable: Function * 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
+ Utility Functions::.).
+
+ - Variable: VFunction * 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: 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.
+
+
+File: readline.info, Node: Readline Convenience Functions, Next: Readline Signal Handling, Prev: Readline Variables, Up: Programming with GNU Readline
+
+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'.
+* Utility Functions:: Generally useful functions and hooks.
+* Alternate Interface:: Using Readline in a `callback' fashion.
+
+
+File: readline.info, Node: Function Naming, Next: Keymaps, Up: Readline Convenience Functions
+
+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 (char *name, Function *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.
+
+
+File: readline.info, Node: Keymaps, Next: Binding Keys, Prev: Function Naming, Up: Readline Convenience Functions
+
+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 ()
+ Returns a new, empty keymap. The space for the keymap is
+ allocated with `malloc ()'; you should `free ()' it when you are
+ done.
+
+ - Function: Keymap rl_copy_keymap (Keymap map)
+ Return a new keymap which is a copy of MAP.
+
+ - Function: Keymap rl_make_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.
+
+ - 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 ()
+ 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 (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::.).
+
+
+File: readline.info, Node: Binding Keys, Next: Associating Function Names and Bindings, Prev: Keymaps, Up: Readline Convenience Functions
+
+Binding Keys
+------------
+
+ You associate keys 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, Function *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, Function *function,
+ Keymap map)
+ Bind KEY to FUNCTION in MAP. Returns non-zero in the case of an
+ invalid KEY.
+
+ - 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 (Function *function, Keymap
+ map)
+ Unbind all keys that execute FUNCTION in MAP.
+
+ - Function: int rl_unbind_command_in_map (char *command, Keymap map)
+ Unbind all keys that are bound to COMMAND in MAP.
+
+ - Function: int rl_generic_bind (int type, 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 (char *filename)
+ Read keybindings and variable assignments from FILENAME (*note
+ Readline Init File::.).
+
+
+File: readline.info, Node: Associating Function Names and Bindings, Next: Allowing Undoing, Prev: Binding Keys, Up: Readline Convenience Functions
+
+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.
+
+ - Function: Function * rl_named_function (char *name)
+ Return the function with name NAME.
+
+ - Function: Function * rl_function_of_keyseq (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 it (one of `ISFUNC', `ISKMAP', or
+ `ISMACR').
+
+ - Function: char ** rl_invoking_keyseqs (Function *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 (Function *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 ()
+ Print the names of all bindable Readline functions to
+ `rl_outstream'.
+
+ - Function: char ** rl_funmap_names ()
+ 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 done, but not the
+ pointrs.
+
+
+File: readline.info, Node: Allowing Undoing, Next: Redisplay, Prev: Associating Function Names and Bindings, Up: Readline Convenience Functions
+
+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. I could use an undo function for the stock
+market.
+
+ 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
+undo 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 ()
+ 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 ()
+ 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 free_undo_list ()
+ Free the existing undo list.
+
+ - Function: int rl_do_undo ()
+ 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.
+
+
+File: readline.info, Node: Redisplay, Next: Modifying Text, Prev: Allowing Undoing, Up: Readline Convenience Functions
+
+Redisplay
+---------
+
+ - Function: void rl_redisplay ()
+ Change what's displayed on the screen to reflect the current
+ contents of `rl_line_buffer'.
+
+ - Function: int rl_forced_update_display ()
+ Force the line to be updated and redisplayed, whether or not
+ Readline thinks the screen display is correct.
+
+ - Function: int rl_on_new_line ()
+ 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 ()
+ 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 ()
+ Reset the display state to a clean state and redisplay the current
+ line starting on a new line.
+
+ - Function: int rl_message (va_alist)
+ The arguments are a string as would be supplied to `printf'. The
+ resulting string is displayed in the "echo area". The echo area
+ is also used to display numeric arguments and search strings.
+
+ - Function: int rl_clear_message ()
+ Clear the message in the echo area.
+
+ - Function: void rl_save_prompt ()
+ 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 ()
+ Restore the local Readline prompt display state saved by the most
+ recent call to `rl_save_prompt'.
+
+
+File: readline.info, Node: Modifying Text, Next: Utility Functions, Prev: Redisplay, Up: Readline Convenience Functions
+
+Modifying Text
+--------------
+
+ - Function: int rl_insert_text (char *text)
+ Insert TEXT into the line at the current cursor position.
+
+ - Function: int rl_delete_text (int start, int end)
+ Delete the text between START and END in the current line.
+
+ - 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.
+
+
+File: readline.info, Node: Utility Functions, Next: Alternate Interface, Prev: Modifying Text, Up: Readline Convenience Functions
+
+Utility Functions
+-----------------
+
+ - Function: int rl_read_key ()
+ Return the next character available. This handles input inserted
+ into the input stream via PENDING INPUT (*note Readline
+ Variables::.) and `rl_stuff_char ()', macros, and characters read
+ from the keyboard.
+
+ - Function: int rl_getc (FILE *)
+ Return the next character available from 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 ()'.
+
+ - 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 ()
+ Initialize or re-initialize Readline's internal state.
+
+ - Function: int rl_reset_terminal (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.
+
+ - Function: int alphabetic (int c)
+ Return 1 if C is an alphabetic character.
+
+ - Function: int numeric (int c)
+ Return 1 if C is a numeric character.
+
+ - Function: int ding ()
+ Ring the terminal bell, obeying the setting of `bell-style'.
+
+ - 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 `chartypes.h'.
+
+ - Function: int uppercase_p (int c)
+ Return 1 if C is an uppercase alphabetic character.
+
+ - Function: int lowercase_p (int c)
+ Return 1 if C is a lowercase alphabetic character.
+
+ - Function: int digit_p (int c)
+ Return 1 if C is a numeric character.
+
+ - Function: int to_upper (int c)
+ If C is a lowercase alphabetic character, return the corresponding
+ uppercase character.
+
+ - Function: int to_lower (int c)
+ If C is an uppercase alphabetic character, return the corresponding
+ lowercase character.
+
+ - Function: int digit_value (int c)
+ If C is a number, return the value it represents.
+
+
+File: readline.info, Node: Alternate Interface, Prev: Utility Functions, Up: Readline Convenience Functions
+
+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 (char *prompt, Vfunction
+ *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
+ callback when a complete line of input has been entered.
+
+ - Function: void rl_callback_read_char ()
+ 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. `EOF' is indicated by calling LHANDLER with a
+ `NULL' line.
+
+ - Function: void rl_callback_handler_remove ()
+ Restore the terminal to its initial state and remove the line
+ handler. This may be called from within a callback as well as
+ independently.
+
+An 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 (uppercase_p (rl_line_buffer[i]))
+ rl_line_buffer[i] = to_lower (rl_line_buffer[i]);
+ else if (lowercase_p (rl_line_buffer[i]))
+ rl_line_buffer[i] = 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);
+ }
+
+
+File: readline.info, Node: Readline Signal Handling, Next: Custom Completers, Prev: Readline Convenience Functions, Up: Programming with GNU Readline
+
+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 a signal is
+received 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 ()').
+
+ 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 state, 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 ()' 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.
+
+ 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 ()'.
+
+
+File: readline.info, Node: Custom Completers, Prev: Readline Signal Handling, Up: Programming with GNU Readline
+
+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.
+
+
+File: readline.info, Node: How Completing Works, Next: Completion Functions, Up: Custom Completers
+
+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 Readline functions
+ intended for interactive use: COUNT and INVOKING_KEY. It
+ isolates the word to be completed and calls `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 `completion_matches ()' uses your
+ "generator" function to generate the list of possible matches, and
+ then returns the array of these matches. You should place the
+ address of your generator function in
+ `rl_completion_entry_function'.
+
+ 3. The generator function is called repeatedly from
+ `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. When the generator function returns `(char
+ *)NULL' this signals `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.
+
+
+ - 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 `completion_matches ()'). The default is to do filename
+ completion.
+
+ - Variable: Function * rl_completion_entry_function
+ This is a pointer to the generator function for `completion_matches
+ ()'. If the value of `rl_completion_entry_function' is `(Function
+ *)NULL' then the default filename generator function,
+ `filename_completion_function ()', is used.
+
+
+File: readline.info, Node: Completion Functions, Next: Completion Variables, Prev: How Completing Works, Up: Custom Completers
+
+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.
+
+ - 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 `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: char ** completion_matches (char *text, CPFunction
+ *entry_func)
+ Returns an array of `(char *)' which is a list of completions for
+ TEXT. If there are no completions, returns `(char **)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 * filename_completion_function (char *text, int state)
+ A generator function for filename completion in the general case.
+ Note that completion in Bash is a little different because of all
+ the pathnames that must be followed when looking up completions
+ for a command. The Bash source is a useful reference for writing
+ custom completion functions.
+
+ - Function: char * username_completion_function (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.
+
+
+File: readline.info, Node: Completion Variables, Next: A Short Completion Example, Prev: Completion Functions, Up: Custom Completers
+
+Completion Variables
+--------------------
+
+ - Variable: Function * rl_completion_entry_function
+ A pointer to the generator function for `completion_matches ()'.
+ `NULL' means to use `filename_completion_function ()', the default
+ filename completer.
+
+ - Variable: CPPFunction * 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' saying what the boundaries of TEXT
+ are. 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.
+
+ - Variable: CPFunction * 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: CPFunction * 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: Function * 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: int rl_completion_query_items
+ 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.
+
+ - Variable: 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, i.e., `"
+ \t\n\"\\'`@$><=;|&{("'.
+
+ - Variable: char * rl_basic_quote_characters
+ List of quote characters which can cause a word break.
+
+ - Variable: 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: char * rl_completer_quote_characters
+ 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: 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: 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_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 custom completion functions
+ to provide the "most sensible word separator character" according
+ to an application-specific command line syntax specification.
+
+ - Variable: int rl_ignore_completion_duplicates
+ If non-zero, then disallow duplicates in the matches. 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 on entry, and can only be changed
+ within a completion entry generator function. If it is set to a
+ non-zero value, directory names have a slash appended and Readline
+ attempts to quote completed filenames if they contain any embedded
+ word break characters.
+
+ - 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 on entry,
+ and can only be changed within a completion entry generator
+ function. The quoting is effected via a call to the function
+ pointed to by `rl_filename_quoting_function'.
+
+ - Variable: int rl_inhibit_completion
+ If this variable is non-zero, completion is inhibit<ed. The
+ completion character will be inserted as any other bound to
+ `self-insert'.
+
+ - Variable: Function * 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: Function * 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.
+ It could be used to expand symbolic links or shell variables in
+ pathnames.
+
+ - Variable: VFunction * 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.
+
+
+File: readline.info, Node: A Short Completion Example, Prev: Completion Variables, Up: Custom Completers
+
+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 *getwd ();
+ extern char *xmalloc ();
+
+ /* The names of functions that actually do the manipulation. */
+ int com_list (), com_view (), com_rename (), com_stat (), com_pwd ();
+ int com_delete (), com_help (), com_cd (), com_quit ();
+
+ /* A structure which contains information on the commands this program
+ can understand. */
+
+ typedef struct {
+ char *name; /* User printable name of the function. */
+ Function *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, (Function *)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)
+ 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 ();
+ char **fileman_completion ();
+
+ /* 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 = (CPPFunction *)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)
+ 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 = 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)
+ 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 = getwd (dir);
+ 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);
+ }
+
+
+File: readline.info, Node: Concept Index, Next: Function and Variable Index, Prev: Programming with GNU Readline, Up: Top
+
+Concept Index
+*************
+
+* Menu:
+
+* command editing: Readline Bare Essentials.
+* editing command lines: Readline Bare Essentials.
+* initialization file, readline: Readline Init File.
+* interaction, readline: Readline Interaction.
+* kill ring: Readline Killing Commands.
+* killing text: Readline Killing Commands.
+* notation, readline: Readline Bare Essentials.
+* readline, function: Basic Behavior.
+* yanking text: Readline Killing Commands.
+
+
+File: readline.info, Node: Function and Variable Index, Prev: Concept Index, Up: Top
+
+Function and Variable Index
+***************************
+
+* Menu:
+
+* abort (C-g): Miscellaneous Commands.
+* accept-line (Newline, Return): Commands For History.
+* alphabetic: Utility Functions.
+* backward-char (C-b): Commands For Moving.
+* backward-delete-char (Rubout): Commands For Text.
+* backward-kill-line (C-x Rubout): Commands For Killing.
+* backward-kill-word (M-DEL): Commands For Killing.
+* backward-word (M-b): Commands For Moving.
+* beginning-of-history (M-<): Commands For History.
+* beginning-of-line (C-a): Commands For Moving.
+* bell-style: Readline Init File Syntax.
+* call-last-kbd-macro (C-x e): Keyboard Macros.
+* capitalize-word (M-c): Commands For Text.
+* character-search (C-]): Miscellaneous Commands.
+* character-search-backward (M-C-]): Miscellaneous Commands.
+* clear-screen (C-l): Commands For Moving.
+* comment-begin: Readline Init File Syntax.
+* complete (TAB): Commands For Completion.
+* completion-query-items: Readline Init File Syntax.
+* completion_matches: Completion Functions.
+* convert-meta: Readline Init File Syntax.
+* copy-backward-word (): Commands For Killing.
+* copy-forward-word (): Commands For Killing.
+* copy-region-as-kill (): Commands For Killing.
+* delete-char (C-d): Commands For Text.
+* delete-char-or-list (): Commands For Completion.
+* delete-horizontal-space (): Commands For Killing.
+* digit-argument (M-0, M-1, ... M--): Numeric Arguments.
+* digit_p: Utility Functions.
+* digit_value: Utility Functions.
+* ding: Utility Functions.
+* disable-completion: Readline Init File Syntax.
+* do-uppercase-version (M-a, M-b, M-X, ...): Miscellaneous Commands.
+* downcase-word (M-l): Commands For Text.
+* dump-functions (): Miscellaneous Commands.
+* dump-macros (): Miscellaneous Commands.
+* dump-variables (): Miscellaneous Commands.
+* editing-mode: Readline Init File Syntax.
+* enable-keypad: Readline Init File Syntax.
+* end-kbd-macro (C-x )): Keyboard Macros.
+* end-of-history (M->): Commands For History.
+* end-of-line (C-e): Commands For Moving.
+* exchange-point-and-mark (C-x C-x): Miscellaneous Commands.
+* expand-tilde: Readline Init File Syntax.
+* filename_completion_function: Completion Functions.
+* forward-backward-delete-char (): Commands For Text.
+* forward-char (C-f): Commands For Moving.
+* forward-search-history (C-s): Commands For History.
+* forward-word (M-f): Commands For Moving.
+* free_undo_list: Allowing Undoing.
+* history-search-backward (): Commands For History.
+* history-search-forward (): Commands For History.
+* horizontal-scroll-mode: Readline Init File Syntax.
+* input-meta: Readline Init File Syntax.
+* insert-comment (M-#): Miscellaneous Commands.
+* insert-completions (M-*): Commands For Completion.
+* isearch-terminators: Readline Init File Syntax.
+* keymap: Readline Init File Syntax.
+* kill-line (C-k): Commands For Killing.
+* kill-region (): Commands For Killing.
+* kill-whole-line (): Commands For Killing.
+* kill-word (M-d): Commands For Killing.
+* lowercase_p: Utility Functions.
+* mark-modified-lines: Readline Init File Syntax.
+* menu-complete (): Commands For Completion.
+* meta-flag: Readline Init File Syntax.
+* next-history (C-n): Commands For History.
+* non-incremental-forward-search-history (M-n): Commands For History.
+* non-incremental-reverse-search-history (M-p): Commands For History.
+* numeric: Utility Functions.
+* output-meta: Readline Init File Syntax.
+* possible-completions (M-?): Commands For Completion.
+* prefix-meta (ESC): Miscellaneous Commands.
+* previous-history (C-p): Commands For History.
+* quoted-insert (C-q, C-v): Commands For Text.
+* re-read-init-file (C-x C-r): Miscellaneous Commands.
+* readline: Basic Behavior.
+* redraw-current-line (): Commands For Moving.
+* reverse-search-history (C-r): Commands For History.
+* revert-line (M-r): Miscellaneous Commands.
+* rl_add_defun: Function Naming.
+* rl_add_undo: Allowing Undoing.
+* rl_already_prompted: Readline Variables.
+* rl_attempted_completion_function: Completion Variables.
+* rl_basic_quote_characters: Completion Variables.
+* rl_basic_word_break_characters: Completion Variables.
+* rl_begin_undo_group: Allowing Undoing.
+* rl_bind_key: Binding Keys.
+* rl_bind_key_in_map: Binding Keys.
+* rl_binding_keymap: Readline Variables.
+* rl_callback_handler_install: Alternate Interface.
+* rl_callback_handler_remove: Alternate Interface.
+* rl_callback_read_char: Alternate Interface.
+* rl_catch_signals: Readline Signal Handling.
+* rl_catch_sigwinch: Readline Signal Handling.
+* rl_char_is_quoted_p: Completion Variables.
+* rl_cleanup_after_signal: Readline Signal Handling.
+* rl_clear_message: Redisplay.
+* rl_clear_signals: Readline Signal Handling.
+* rl_complete <1>: Completion Functions.
+* rl_complete: How Completing Works.
+* rl_complete_internal: Completion Functions.
+* rl_completer_quote_characters: Completion Variables.
+* rl_completer_word_break_characters: Completion Variables.
+* rl_completion_append_character: Completion Variables.
+* rl_completion_display_matches_hook: Completion Variables.
+* rl_completion_entry_function <1>: Completion Variables.
+* rl_completion_entry_function: How Completing Works.
+* rl_completion_query_items: Completion Variables.
+* rl_copy_keymap: Keymaps.
+* rl_copy_text: Modifying Text.
+* rl_delete_text: Modifying Text.
+* rl_directory_completion_hook: Completion Variables.
+* rl_discard_keymap: Keymaps.
+* rl_display_match_list: Utility Functions.
+* rl_do_undo: Allowing Undoing.
+* rl_done: Readline Variables.
+* rl_end: Readline Variables.
+* rl_end_undo_group: Allowing Undoing.
+* rl_erase_empty_line: Readline Variables.
+* rl_event_hook: Readline Variables.
+* rl_executing_keymap: Readline Variables.
+* rl_extend_line_buffer: Utility Functions.
+* rl_filename_completion_desired: Completion Variables.
+* rl_filename_dequoting_function: Completion Variables.
+* rl_filename_quote_characters: Completion Variables.
+* rl_filename_quoting_desired: Completion Variables.
+* rl_filename_quoting_function: Completion Variables.
+* rl_forced_update_display: Redisplay.
+* rl_free_line_state: Readline Signal Handling.
+* rl_function_dumper: Associating Function Names and Bindings.
+* rl_function_of_keyseq: Associating Function Names and Bindings.
+* rl_funmap_names: Associating Function Names and Bindings.
+* rl_generic_bind: Binding Keys.
+* rl_get_keymap: Keymaps.
+* rl_get_keymap_by_name: Keymaps.
+* rl_get_keymap_name: Keymaps.
+* rl_getc: Utility Functions.
+* rl_getc_function: Readline Variables.
+* rl_ignore_completion_duplicates: Completion Variables.
+* rl_ignore_some_completions_function: Completion Variables.
+* rl_inhibit_completion: Completion Variables.
+* rl_initialize: Utility Functions.
+* rl_insert_completions: Completion Functions.
+* rl_insert_text: Modifying Text.
+* rl_instream: Readline Variables.
+* rl_invoking_keyseqs: Associating Function Names and Bindings.
+* rl_invoking_keyseqs_in_map: Associating Function Names and Bindings.
+* rl_kill_text: Modifying Text.
+* rl_library_version: Readline Variables.
+* rl_line_buffer: Readline Variables.
+* rl_list_funmap_names: Associating Function Names and Bindings.
+* rl_make_bare_keymap: Keymaps.
+* rl_make_keymap: Keymaps.
+* rl_mark: Readline Variables.
+* rl_message: Redisplay.
+* rl_modifying: Allowing Undoing.
+* rl_named_function: Associating Function Names and Bindings.
+* rl_on_new_line: Redisplay.
+* rl_on_new_line_with_prompt: Redisplay.
+* rl_outstream: Readline Variables.
+* rl_parse_and_bind: Binding Keys.
+* rl_pending_input: Readline Variables.
+* rl_point: Readline Variables.
+* rl_possible_completions: Completion Functions.
+* rl_pre_input_hook: Readline Variables.
+* rl_prompt: Readline Variables.
+* rl_read_init_file: Binding Keys.
+* rl_read_key: Utility Functions.
+* rl_readline_name: Readline Variables.
+* rl_redisplay: Redisplay.
+* rl_redisplay_function: Readline Variables.
+* rl_reset_after_signal: Readline Signal Handling.
+* rl_reset_line_state: Redisplay.
+* rl_reset_terminal: Utility Functions.
+* rl_resize_terminal: Readline Signal Handling.
+* rl_restore_prompt: Redisplay.
+* rl_save_prompt: Redisplay.
+* rl_set_keymap: Keymaps.
+* rl_set_signals: Readline Signal Handling.
+* rl_special_prefixes: Completion Variables.
+* rl_startup_hook: Readline Variables.
+* rl_stuff_char: Utility Functions.
+* rl_terminal_name: Readline Variables.
+* rl_unbind_command_in_map: Binding Keys.
+* rl_unbind_function_in_map: Binding Keys.
+* rl_unbind_key: Binding Keys.
+* rl_unbind_key_in_map: Binding Keys.
+* self-insert (a, b, A, 1, !, ...): Commands For Text.
+* set-mark (C-@): Miscellaneous Commands.
+* show-all-if-ambiguous: Readline Init File Syntax.
+* start-kbd-macro (C-x (): Keyboard Macros.
+* to_lower: Utility Functions.
+* to_upper: Utility Functions.
+* transpose-chars (C-t): Commands For Text.
+* transpose-words (M-t): Commands For Text.
+* undo (C-_, C-x C-u): Miscellaneous Commands.
+* universal-argument (): Numeric Arguments.
+* unix-line-discard (C-u): Commands For Killing.
+* unix-word-rubout (C-w): Commands For Killing.
+* upcase-word (M-u): Commands For Text.
+* uppercase_p: Utility Functions.
+* username_completion_function: Completion Functions.
+* visible-stats: Readline Init File Syntax.
+* yank (C-y): Commands For Killing.
+* yank-last-arg (M-., M-_): Commands For History.
+* yank-nth-arg (M-C-y): Commands For History.
+* yank-pop (M-y): Commands For Killing.
+
+
+
+Tag Table:
+Node: Top1190
+Node: Command Line Editing1789
+Node: Introduction and Notation2440
+Node: Readline Interaction4058
+Node: Readline Bare Essentials5251
+Node: Readline Movement Commands7032
+Node: Readline Killing Commands7989
+Node: Readline Arguments9895
+Node: Searching10870
+Node: Readline Init File12713
+Node: Readline Init File Syntax13774
+Node: Conditional Init Constructs23039
+Node: Sample Init File25478
+Node: Bindable Readline Commands28648
+Node: Commands For Moving29692
+Node: Commands For History30541
+Node: Commands For Text33258
+Node: Commands For Killing35261
+Node: Numeric Arguments37228
+Node: Commands For Completion38355
+Node: Keyboard Macros40103
+Node: Miscellaneous Commands40662
+Node: Readline vi Mode43466
+Node: Programming with GNU Readline45236
+Node: Basic Behavior46204
+Node: Custom Functions49530
+Node: The Function Type50508
+Node: Function Writing51353
+Node: Readline Variables52437
+Node: Readline Convenience Functions56649
+Node: Function Naming57387
+Node: Keymaps58615
+Node: Binding Keys60329
+Node: Associating Function Names and Bindings62903
+Node: Allowing Undoing64746
+Node: Redisplay67331
+Node: Modifying Text69108
+Node: Utility Functions70019
+Node: Alternate Interface72799
+Node: Readline Signal Handling76093
+Node: Custom Completers81139
+Node: How Completing Works81854
+Node: Completion Functions84850
+Node: Completion Variables87865
+Node: A Short Completion Example95768
+Node: Concept Index108074
+Node: Function and Variable Index108828
+
+End Tag Table
diff --git a/gnu/lib/libreadline/doc/readline.ps b/gnu/lib/libreadline/doc/readline.ps
new file mode 100644
index 00000000000..c16dca605bd
--- /dev/null
+++ b/gnu/lib/libreadline/doc/readline.ps
@@ -0,0 +1,4570 @@
+%!PS-Adobe-2.0
+%%Creator: dvips(k) 5.82 Copyright 1998 Radical Eye Software
+%%Title: readline.dvi
+%%Pages: 56
+%%PageOrder: Ascend
+%%BoundingBox: 0 0 612 792
+%%EndComments
+%DVIPSWebPage: (www.radicaleye.com)
+%DVIPSCommandLine: dvips -D 300 -t letter -o readline.ps readline.dvi
+%DVIPSParameters: dpi=300, compressed
+%DVIPSSource: TeX output 2000.03.01:1453
+%%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/IE 0 N/ctr 0 N/df-tail{/nn 8 dict N nn begin
+/FontType 3 N/FontMatrix fntrx N/FontBBox FBB N string/base X array
+/BitMaps X/BuildChar{CharBuilder}N/Encoding IE N end 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/IE 256 array N 2 string 0 1 255{IE 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
+TeXDict begin 40258431 52099146 1000 300 300 (readline.dvi)
+@start
+%DVIPSBitmapFont: Fa cmti10 10.95 1
+/Fa 1 47 df<127012F8A212F012E005057B840E>46 D E
+%EndDVIPSBitmapFont
+%DVIPSBitmapFont: Fb cmbxti10 14.4 1
+/Fb 1 47 df<120E123FEA7F80A212FFA21300127E123C0909798815>46
+D E
+%EndDVIPSBitmapFont
+%DVIPSBitmapFont: Fc cmmi9 9 1
+/Fc 1 59 df<126012F0A2126004047D830B>58 D E
+%EndDVIPSBitmapFont
+%DVIPSBitmapFont: Fd cmtt9 9 53
+/Fd 53 127 df<126012F0AD12601200A4126012F0A212600417789614>33
+D<EA071CA5B51280A27E380E3800A7387FFF80B5FCA2381C7000A511177F9614>35
+D<EA01801203EA06005A121C121812385AA35AA91270A37E1218121C120C7EEA03801201
+091D799914>40 D<128012C01260123012381218121C120EA31207A9120EA3121C121812
+381230126012C01280081D7C9914>I<EA0380A3EA638CEAF39EEA7FFCEA3FF8EA0FE0A2
+EA3FF8EA7FFCEAF39EEA638CEA0380A30F107E9214>I<127012F812FCA2127C120C1218
+123012E012C0060A798414>44 D<EAFFFEA30F037E8C14>I<127012F8A3127005057984
+14>I<EA07C0EA0FE0EA1C70EA3838EA3018EA701CA2EAE00EA9EA701CA2EA3838A2EA1C
+70EA0FE0EA07C00F177E9614>48 D<1203A25A5A123F12F712471207AEEA7FF0A20C177C
+9614>I<1306131E133E13F8EA01F0EA03C0EA0F80EA1F00123C12F85A7E123C121FEA0F
+80EA03C0EA01F0EA00F8133E131E13060F157E9514>60 D<12C012F07E123E7EEA0780EA
+03E0EA01F0EA0078133E131E133E1378EA01F0EA03E0EA0780EA1F00123E12F85A12C00F
+157E9514>62 D<EA1FE0EA3FF8EA701CEAE00EA21240EA003C137013E0EA01C0EA0380A4
+1300C7FCA41203EA0780A2EA03000F177E9614>I<EA01E0EA07F0EA0E38EA181CEA38FC
+1271EA731E1277EAEE0EA7EA771CEA7318EA71F0EA38E0EA1806EA0E1EEA07F8EA01F00F
+177E9614>I<EA01C0487EA21360A2EA0770A4EA0630EA0E38A4487EEA1FFCA2EA1C1CA2
+487EA238FE3F80A211177F9614>I<EAFFF013FCEA381E130E1307A4130E131EEA3FFCA2
+EA381E130E1307A5130E131EEAFFFC13F810177F9614>I<3801F180EA07FFEA0E1FEA1C
+071238EA7003A348C7FCA738700380A338380700121CEA0E0EEA07FCEA01F011177F9614
+>I<EAFFE013F8EA383C7F130E7FA3EB0380A8EB0700A2130E131E5BEAFFF813E011177F
+9614>I<B5FCA2EA3807A490C7FCA21338A2EA3FF8A2EA3838A290C7FCA3EB0380A4B5FC
+A211177F9614>I<B4FCA21238AF1307A4B5FCA210177E9614>76
+D<38FC1F80A2007C1300EA7637A4EA7777A2EA7367A313E7EA71C7A2EA7007A638F80F80
+A211177F9614>I<38FE3F80A2383E0E00123BA4138E1239A213CEA31238A213EE136EA4
+133E12FEA211177F9614>I<EAFFE013F8EA383C131C7FA45B133CEA3FF85BEA38387FA5
+1480EB1DC0A238FE0F80EB070012177F9614>82 D<EA0FCCEA1FFCEA307CEA603CEAE01C
+A313001270127EEA3FE0EA0FF0EA01F8EA001C131E130E126012E0A2EAF01CEAF838EAFF
+F0EAC7E00F177E9614>I<387FFF80B5FCEAE1C3A43801C000AFEA0FF8A211177F9614>I<
+EAFFE0A21200B3A712FFA20B1D7F9914>93 D<EAFFFEA30F037E7E14>95
+D<EA1FC0EA7FF0EA7078EA2018EA001CA2EA07FC121FEA3C1C127012E0A3EA707C383FFF
+80EA0F8F11107E8F14>97 D<12FCA2121CA513F8EA1DFEEA1F07EA1E03001C1380EB01C0
+A6EB0380001E1300EA1F0EEA1DFCEA0CF81217809614>I<EA03F8EA0FFEEA1C0EEA3804
+EA7000126012E0A412601270EA380EEA1C1EEA0FFCEA03F00F107E8F14>I<137EA2130E
+A5EA07CEEA0FFEEA1C3EEA301EEA700E12E0A61270EA301EEA383E381FEFC0EA07CF1217
+7F9614>I<EA07E0EA0FF0EA1C38EA301CEA700CEAE00EA2EAFFFEA2EAE00012601270EA
+380EEA1C1EEA0FFCEA03F00F107E8F14>I<13FCEA01FEEA038EEA07041300A3EA7FFE12
+FFEA0700ACEAFFF8A20F177F9614>I<EA07CF381FFF80EA383B38301800EA701CA3EA30
+18EA3838EA3FF0EA37C00070C7FCA2EA3FF86C7E487EEA700F38E00380A438700700EA3C
+1EEA1FFCEA07F011197F8F14>I<12FCA2121CA51378EA1DFEEA1F86EA1E07121CAA38FF
+8FE0A21317809614>I<1206120FA21206C7FCA4B4FCA21207ACEAFFF8A20D187C9714>I<
+12FCA2121CA5EBFF80A2EB1C005B5B5BEA1DC0EA1FE0A2EA1E70EA1C38133C131C7F38FF
+1F80A21117809614>107 D<EAFF80A21203B3EAFFFEA20F177E9614>I<EAFB8EEAFFDF38
+3CF380A2EA38E3AA38FEFBE013791310808F14>I<EAFC78EAFDFEEA1F86EA1E07121CAA
+38FF8FE0A21310808F14>I<EA07C0EA1FF0EA3C78EA701CA2EAE00EA6EA701CEA783CEA
+3C78EA1FF0EA07C00F107E8F14>I<EAFCF8EAFDFEEA1F07EA1E03001C1380EB01C0A6EB
+0380001E1300EA1F0EEA1DFCEA1CF890C7FCA6B47EA21218808F14>I<EA03E7EA0FF7EA
+1C1FEA300F1270487EA6EA700F1230EA1C3FEA0FF7EA07C7EA0007A6EB3FE0A213187F8F
+14>I<EAFE1FEB7F80EA0EE3380F810090C7FCA2120EA8EAFFF0A211107F8F14>I<EA0FD8
+EA3FF8EA603812C0A2EAF000EA7F80EA3FF0EA07F8EA001CEA600612E012F0EAF81CEAFF
+F8EACFE00F107E8F14>I<1206120EA4EA7FFC12FFEA0E00A8130EA3131CEA07F8EA01F0
+0F157F9414>I<EAFC3FA2EA1C07AB131F380FFFE0EA03E71310808F14>I<38FE3F80A238
+3C1E00EA1C1CA36C5AA3EA0630EA0770A36C5AA311107F8F14>I<38FE3F80A238700700
+EA380EA3EA39CEA3EA1B6C121AA3EA1E7CA2EA0E3811107F8F14>I<EA7E3FA2EA1E3CEA
+0E78EA07705B12036C5A12037FEA0770EA0E781338487E38FE3F80A211107F8F14>I<38
+FE3F80A2381C0E005BA2120E5BA212071330A2EA0370A25B1201A25BA3485A12730077C7
+FC127E123C11187F8F14>I<EA3FFF5AEA700E131C1338EA007013E0EA01C0EA0380EA07
+00120EEA1C0712381270B5FCA210107F8F14>I<EA1C10EA3F38EAE7E0EA41C00D047D96
+14>126 D E
+%EndDVIPSBitmapFont
+%DVIPSBitmapFont: Fe cmsl9 9 2
+/Fe 2 121 df<1270A212F0126004047D830B>46 D<383FC7E038078380EB0200EA0384
+13C8EA01D8EA00F05B7F120113381202487EEA081E123838FC3FC013107F8F14>120
+D E
+%EndDVIPSBitmapFont
+%DVIPSBitmapFont: Ff cmr9 9 39
+/Ff 39 123 df<13FEEA038138060180EA0E03381C010090C7FCA5B51280EA1C03AE38FF
+8FF0141A809915>12 D<EBFF80EA0383EA0603120E121CA6B5FCEA1C03AE38FF9FF0141A
+809915>I<126012F0A212701210A31220A21240A2040B7D830B>44
+D<EAFFC0A20A0280880D>I<EA07E0EA1C38EA381CEA300CEA700EEA6006A2EAE007AAEA
+6006A2EA700EEA300CEA381CEA1C38EA07E010187F9713>48 D<12035AB4FC1207B3A2EA
+7FF80D187D9713>I<EA0F80EA1060EA2030EA4038EA803CEAC01C12E01240EA003C1338
+A21370136013C0EA018013001202EA040412081210EA3008EA3FF8127F12FF0E187E9713
+>I<EA07E0EA1838EA201CEA601EEA700EEA201E1200131CA213381370EA07E0EA003813
+1C130E130FA212E0A212C0EA400EEA601CEA1838EA07E010187F9713>I<1318A2133813
+7813F813B8EA01381202A212041208121812101220124012C0B5FCEA0038A6EA03FF1018
+7F9713>I<EA3018EA3FF013E01380EA2000A5EA2FC0EA3060EA2030EA00381318131CA2
+124012E0A2EA8018EA40381330EA30E0EA0F800E187E9713>I<EA01F8EA0704EA0C06EA
+180E123013001270126012E0EAE3E0EAE418EAE80CEAF00EEAE0061307A31260A2EA7006
+EA300EEA180CEA0C38EA07E010187F9713>I<1240EA7FFF13FEA2EA4004EA80081310A2
+EA00201340A21380120113005AA25A1206A2120EA5120410197E9813>I<EA07E0EA1818
+EA300CEA20061260A21270EA780CEA3E18EA1F30EA07C0EA03E0EA0CF8EA307CEA601E13
+0FEAC0071303A3EA6002EA2004EA1818EA07E010187F9713>I<EA07E0EA1C30EA3018EA
+700CEA600EEAE006A21307A31260EA700FEA3017EA1827EA07C7EA00071306130E130C12
+701318EA6030EA3060EA0F8010187F9713>I<EA1FC0EA38707FEA101C1200A2EA03FCEA
+1E1C1238127012E01480A2133CEA705F381F8F0011107F8F13>97
+D<12FC121CA913FCEA1D07381E0380381C01C0130014E0A6EB01C01480381E0300EA1906
+EA10F8131A809915>I<EA07F8EA1C1C1238EA700813005AA612701304EA3808EA1C18EA
+07E00E107F8F11>I<133F1307A9EA03E7EA0C17EA180F487E127012E0A6126012706C5A
+EA1C373807C7E0131A7F9915>I<EA07C0EA1C30EA30181270EA600C12E0EAFFFCEAE000
+A41260EA7004EA3808EA1C18EA07E00E107F8F11>I<EA01F0EA0718EA0E38EA1C101300
+A6EAFFC0EA1C00AEEAFF800D1A80990C>I<EA0FCF3818718038303000EA7038A4EA3030
+6C5AEA2FC00060C7FCA21270EA3FF013FC6C7EEA600FEAC003A4EA6006EA381CEA07E011
+187F8F13>I<12FC121CA9137CEA1D87381E0380A2121CAB38FF9FF0141A809915>I<1218
+123CA212181200A612FC121CAE12FF081A80990A>I<12FC121CA9EB1FC0EB0F00130C5B
+13205B13E0121DEA1E70EA1C7813387F131E7F148038FF9FE0131A809914>107
+D<12FC121CB3A6EAFF80091A80990A>I<38FC7C1F391D8E6380391E0781C0A2001C1301
+AB39FF9FE7F81D107F8F20>I<EAFC7CEA1D87381E0380A2121CAB38FF9FF01410808F15>
+I<EA07E0EA1C38EA300CEA700EEA6006EAE007A6EA6006EA700EEA381CEA1C38EA07E010
+107F8F13>I<EAFCFCEA1D07381E0380381C01C0A2EB00E0A6EB01C01480381E0300EA1D
+06EA1CF890C7FCA6B47E1317808F15>I<EA03E1EA0C13EA180BEA300FEA700712E0A612
+70A26C5AEA1C37EA07C7EA0007A6EB3FE013177F8F14>I<EAFC78EA1D9CEA1E1C1308EA
+1C00ABEAFF800E10808F0F>I<EA1F20EA60E0EA402012C0A2EAF000127FEA3FC0EA1FE0
+EA00F0EA8070133012C01320EAF040EA8F800C107F8F0F>I<1208A41218A21238EAFFC0
+EA3800A81320A41218EA1C40EA07800B177F960F>I<38FC1F80EA1C03AB1307120CEA0E
+0B3803F3F01410808F15>I<38FF0F80383C0700EA1C061304A26C5AA26C5AA3EA03A0A2
+EA01C0A36C5A11107F8F14>I<39FE7F1F8039381C0700003C1306381C0C04130E380E16
+081317A238072310149013A33803C1A014E0380180C0A319107F8F1C>I<38FE3F80383C
+1E00EA1C086C5AEA0F306C5A6C5A12017F1203EA0270487E1208EA181CEA381E38FC3FC0
+12107F8F14>I<38FF0F80383C0700EA1C061304A26C5AA26C5AA3EA03A0A2EA01C0A36C
+5AA248C7FCA212E112E212E4127811177F8F14>I<EAFFF8EAE07012C0EA80E0EA81C0A2
+EA0380EA0700A2EA0E04121CA2EA380812701338EAFFF80E107F8F11>I
+E
+%EndDVIPSBitmapFont
+%DVIPSBitmapFont: Fg cmss10 10.95 2
+/Fg 2 42 df<13E0EA01C0EA0380120713005A121EA2121C123CA212381278A3127012F0
+AE12701278A31238123CA2121C121EA27E7E13801203EA01C0EA00E00B2E7CA112>40
+D<12E012707E123C121C121E7EA27E1380A2120313C0A3120113E0AE13C01203A3138012
+07A213005AA2121E121C123C12385A5A0B2E7EA112>I E
+%EndDVIPSBitmapFont
+%DVIPSBitmapFont: Fh cmbx10 12 27
+/Fh 27 123 df<90380FF83F90397FFDFFC03A01FC1FE3E03903F03FC7EA07E0D80FC013
+87ED83C091381F8000A6B612FCA2390FC01F80B2397FF8FFF8A223237FA221>11
+D<EB07F8EB7FFC3801FC0E3803F01F48485AEA0FC0A3141E140C91C7FCA2ECFF80B6FCA2
+380FC01FB2397FF8FFF0A21C237FA220>I<EA07FE381FFF80383F07E06D7E130180121E
+1200A2133FEA03FDEA1F81EA3E01127C12F8A4EA7C02EA7E0C391FF87F803807E03F1916
+7E951C>97 D<B47EA2121FABEB87F0EBBFFCEBF03EEBC01F9038800F8015C0140715E0A7
+15C0A2140F15809038C01F00381E707E381C3FFC38180FE01B237EA220>I<EBFF800007
+13E0380F83F0EA1F03123E127E387C01E090C7FC12FCA6127C127EA2003E13186C133038
+0FC0603807FFC0C6130015167E9519>I<49B4FCA2EB003FAB13FE3807FFBF380FC1FF48
+C67E003E7F127E127CA212FCA7127C127E123E6C5B380F81FF3907FF3FE0EA01FC1B237E
+A220>I<13FE3807FF80380F83C0381E01E0383E00F0127E007C13F8147812FCB512F8A2
+00FCC7FCA3127CA26C1318A26C1330380F80E03803FFC0C6130015167E951A>I<EB1F80
+EBFFE03801F1F0EA03E31207EA0FC3EBC1E0EBC000A6EAFFFEA2EA0FC0B2EA7FFCA21423
+7EA212>I<9038FE0F803903FF9FC0380F83E3381F01F3391E00F000003E7FA5001E5BEA
+1F01380F83E0380BFF80D808FEC7FC0018C8FCA2121C381FFFE014FC6C13FF7E001F1480
+397C001FC00078130F00F81307A3007CEB0F806CEB1F00381F807E6CB45A000113E01A21
+7F951D>I<B47EA2121FABEB83F0EB8FFCEB987EEBA03EEBC03FA21380AE39FFF1FFE0A2
+1B237DA220>I<121E123FEA7F80A4EA3F00121EC7FCA6EAFF80A2121FB2EAFFF0A20C24
+7EA30F>I<B47EA2121FABECFF80A2EC3C00143014E0EB81C00183C7FC1386139E13BE13
+FFEBDF80EB8FC01307806D7E6D7E130080147E39FFE1FFC0A21A237EA21E>107
+D<EAFF80A2121FB3ADEAFFF0A20C237EA20F>I<3AFF03F803F890390FFE0FFE3A1F183F
+183F9039201F201F014001C01380A201801380AE3BFFF0FFF0FFF0A22C167D9531>I<38
+FF03F0EB0FFC381F187EEB203EEB403FA21380AE39FFF1FFE0A21B167D9520>I<13FF00
+0713E0380F81F0381F00F8003E137C48133EA300FC133FA7007C133E007E137E003E137C
+6C13F8380F81F03807FFE0C6130018167E951D>I<38FF87F0EBBFFC381FF07EEBC01F90
+38800F8015C0A2EC07E0A715C0140FA2EC1F8001C01300EBF07EEBBFFCEB8FE00180C7FC
+A8EAFFF0A21B207E9520>I<EBFE033807FF07380FC1CF381F00DF48137F007E7FA2127C
+12FCA7127EA2003E5B6C5BEA0FC13807FF3FEA00FC1300A8903801FFE0A21B207E951E>
+I<38FF0F80EB1FE0381F33F013631343A2EBC1E0EB8000ADEAFFF8A214167E9518>I<38
+07F980EA1FFFEA3807EA7003EAF001A26CC7FCB4FC13F8EA7FFE6C7E6C1380120738003F
+C0EAC007130312E0A200F0138038FC0F00EAEFFEEAC3F812167E9517>I<487EA41203A2
+1207A2120F123FB5FCA2EA1F80ABEB8180A5380F830013C3EA07FEEA01F811207F9F16>
+I<38FF81FFA2381F803FAF5C5C380FC1BF3907FF3FE0EA01FC1B167D9520>I<39FFF01F
+E0A2391FC00700000F1306EBE00E0007130C13F000035BA26C6C5AA26C6C5AA2EBFEE0EB
+7EC0137F6D5AA26DC7FCA2130EA21B167F951E>I<3AFFF3FF83FCA23A1F807C00E0D80F
+C014C08001E013010007017F1380A2D803F0EB0300ECCF8301F81387D801F913C61487D8
+00FD13ECEBFF0315FC017F5BEB7E01013E5BEB3C00A20118136026167F9529>I<39FFF0
+7FC0A2390FC01C006C6C5A6D5A00035B6C6C5A3800FD80137F91C7FC7F6D7E497EEB37E0
+EB67F013C33801C1F8380380FC48487E000E137F39FF81FFE0A21B167F951E>I<39FFF0
+1FE0A2391FC00700000F1306EBE00E0007130C13F000035BA26C6C5AA26C6C5AA2EBFEE0
+EB7EC0137F6D5AA26DC7FCA2130EA2130CA25B1278EAFC3813305BEA69C0EA7F80001FC8
+FC1B207F951E>I<387FFFF0A2387C07E038700FC0EA601F00E0138038C03F005B137EC6
+5A1201485AEBF030EA07E0120FEBC070EA1F80003F1360EB00E0EA7E03B5FCA214167E95
+19>I E
+%EndDVIPSBitmapFont
+%DVIPSBitmapFont: Fi cmtt10 12 24
+/Fi 24 122 df<13E0A538F0E1E0EAFCE7387EEFC0381FFF00EA07FCEA01F0EA07FCEA1F
+FF387EEFC038FCE7E0EAF0E13800E000A513157D991A>42 D<EB7C38EA01FF000713F8EA
+0F83EA1E00001C13785A14385AA214005AA812701438A27EA26C1370001E13F0380F83E0
+3807FFC00001138038007C00151E7E9D1A>67 D<B512F8A3381C0038A51400A2130EA3EA
+1FFEA3EA1C0EA390C7FCA3141CA5B512FCA3161E7E9D1A>69 D<387FFFFCB5FC7E380E00
+1CA51400A2EB0380A3EA0FFFA3EA0E03A390C7FCA8EA7FE012FF127F161E7F9D1A>I<B5
+1280A33801C000B3A6B51280A3111E7C9D1A>73 D<387F03F838FF87FC387F03F8381C01
+E0EB03C01480EB07005B131E131C5B13785B7F121DEA1FDC139C130EEA1E0F7F001C1380
+1303EB01C0A2EB00E0A21470007F13FC38FF81FE387F00FC171E7F9D1A>75
+D<EA7FE0487E6C5A000EC7FCB3141CA5387FFFFCB5FC7E161E7F9D1A>I<EAFFFEEBFF80
+14C0381C03E0EB00F0147014781438A41478147014F0EB03E0381FFFC01480EBFE00001C
+C7FCA9B47EA3151E7E9D1A>80 D<38FF01FEA3381C0070A3001E13F0000E13E0A3380701
+C0A438038380A43801C700A4EA00C613EEA3136C137CA21338171E7F9D1A>86
+D<EA1FF0EA3FFC487EEA780FEA300738000380A2137FEA07FF121FEA3F83EA7803127012
+E0A3EA7007EA780F383FFFFCEA1FFDEA07F016157D941A>97 D<EBFF80000313C0000F13
+E0EA1F01383C00C04813001270A25AA51270A2007813707E381F01F0380FFFE0000313C0
+3800FE0014157D941A>99 D<EB1FC0A31301A6EA01F1EA07FDEA0FFFEA1E0FEA3C07EA78
+03EA700112E0A7EA7003A2EA3807EA3E0F381FFFFCEA07FDEA01F1161E7E9D1A>I<EA01
+F8EA07FF481380381E07C0EA3C01387800E01270481370A2B512F0A300E0C7FC1270A200
+7813707E381F01F0380FFFE0000313803800FE0014157D941A>I<12FEA3120EA6133EEB
+FF80000F13C013C1EB80E01300120EAC38FFE3FE13E713E3171E7F9D1A>104
+D<EA01C0487EA36C5AC8FCA5EA7FE0A31200AF387FFF80B512C06C1380121F7C9E1A>I<
+387CE0E038FFFBF8EA7FFF381F1F1CEA1E1EA2EA1C1CAC387F1F1F39FF9F9F80397F1F1F
+00191580941A>109 D<EAFE3EEBFF80B512C0EA0FC1EB80E01300120EAC38FFE3FE13E7
+13E317157F941A>I<EA01F0EA07FCEA1FFF383E0F80EA3C07387803C0EA700138E000E0
+A6EAF001007013C0EA7803383C0780EA3E0F381FFF00EA07FCEA01F013157D941A>I<EA
+FE3EEBFF80B512E0380FC1F0EB8070EB0038120E141CA7000F13381478EB80F0EBC1E0EB
+FFC0000E1380EB3E0090C7FCA8EAFFE0A316207F941A>I<387F81F838FF8FFC387F9FFE
+3803FE1EEBF80CEBE000A25B5BAAEA7FFFB5FC7E17157F941A>114
+D<487E1203A6387FFFE0B5FCA238038000AA1470A43801C1E013FF6C1380EB3F00141C7F
+9B1A>116 D<38FE0FE0A3EA0E00AD1301EA0F033807FFFE7EEA00FC17157F941A>I<387F
+C7FC00FF13FE007F13FC380E00E0A3380701C0A338038380A33801C700A3EA00EEA3137C
+A2133817157F941A>I<387FC7FC00FF13FE007F13FC380E00E0A27EEB01C013811203EB
+8380EA01C3A2EBC700EA00E7A213E61366136E133CA31338A3137813701230EA78E01271
+EA7FC06C5A001EC7FC17207F941A>121 D E
+%EndDVIPSBitmapFont
+%DVIPSBitmapFont: Fj cmmi10 10.95 1
+/Fj 1 59 df<127012F8A3127005057C840D>58 D E
+%EndDVIPSBitmapFont
+%DVIPSBitmapFont: Fk cmsltt10 10.95 6
+/Fk 6 102 df<1206120FEA1F80120FA21203EA0700A25A120E123C127C12F01260090E
+769B18>39 D<387FFFC0B512E0A26C13C013047C8F18>45 D<EB3E18EBFFB84813F8EA07
+C1EB8078EA0E00121E001C137048133014005AA35AA614C0EA7001A2130338380780383C
+0F00EA1FFE6C5AEA03F0151C7C9B18>67 D<3907E01F80000FEB3FC0000714803903B02E
+00146EA214CE380730DC1331149CA21333141C000E5B13371336133E133C131848C65AA6
+38FE03F800FF7F00FE5B1A1C7F9B18>77 D<126012F0A37E1278A3127C123CA3123E121E
+A3121F7EA313801207A313C01203A413E01201A313F0120013600C24789F18>92
+D<13F8EA07FE487E381F0780EA3C03387801C0127012E0A2B5FCA2148000E0C7FCA21303
+3870078038780F00EA3FFE6C5AEA07F012147B9318>101 D E
+%EndDVIPSBitmapFont
+%DVIPSBitmapFont: Fl cmbx12 13.14 52
+/Fl 52 122 df<123C127E12FFA4127E123C08087C8711>46 D<EB7F803803FFF03807E1
+F8380F807C48487E48133F003E7F007E1480A400FE14C0AD007E1480A46CEB3F00A26C13
+3E6C6C5A3807E1F86CB45A38007F801A237EA21F>48 D<131C133C13FC12FFA21200B3AA
+387FFFFCA216237CA21F>I<48B4FC000713C0381E07F0383803F8386001FC387C00FE12
+FE14FF147FA2127C003813FFC7FC14FEA2EB01FC14F8EB03F0EB07E01480EB0F00131E5B
+1370EBE003EA01C038038007380700061206380FFFFE5A5A4813FCB5FCA218237DA21F>
+I<48B4FC000713E0381E03F0383801F8003C13FC387E00FEA3123EEA1C01000013FCA2EB
+03F8EB07F0EB0FC03801FF00A2380007E0EB01F014F8EB00FC14FE14FFA21210127C12FE
+A214FEA2387C01FC007013F8383E07F0380FFFC00001130018237DA21F>I<14381478A2
+14F81301130313071306130C131C13381330136013E0EA01C01380EA03005A120E5A1218
+5A12705AB612C0A2390001F800A790387FFFC0A21A237EA21F>I<0018130C001F137CEB
+FFF814F014E014C01480EBFC000018C7FCA513FF001B13E0381F03F0381C00F8000813FC
+C7127EA3147FA2127812FCA3147E5A006013FC1270383801F8381E07E03807FFC03801FE
+0018237DA21F>I<EB1FC0EB7FF03801F0383803E00C3807803E000F137EEA1F005AA200
+7E133C1400A338FE3FC0EB7FF0EB80F800FF13FCEB007C147E5A147FA4127EA4003E137E
+123F6C137C380F80F83807C1F03803FFC038007F0018237DA21F>I<1230123C003FB512
+C0A215804814005C5C38600018A200E05B485B5CC6485AA249C7FC1306130EA25BA2133C
+A25BA213F8A41201A66C5A13601A257DA41F>I<EBFF80000313E0380F01F8381C007C48
+133C141E1278A2127C127E387F803C13E0383FF878381FFDF0EBFFC07E000313E014F800
+0F13FCEA1E1F383C07FEEA7803EB00FF48133F141F140FA3140E1278141C6C1338381F80
+F03807FFE00001130018237DA21F>I<13FF000313C0380F83E0381F00F04813F8007E13
+7CA2147E12FEA3147FA4127E14FF123EEA3F01001F137FEA0FFEEA03FCC7FC147EA2123C
+007E13FCA214F814F0EA7C01383003E0381C0F80380FFF00EA03F818237DA21F>I<141C
+A2143EA3147FA24A7EA39038019FC0A29038031FE0140F01077FEB0607A2010C7F140301
+1C7FEB1801A2496C7EA2017FB5FCA29039E0007F8049133FA2484880151F00038190C712
+0FA2486E7ED8FFF090B51280A229257EA42E>65 D<B612E015FC3903F0007FED3F80ED1F
+C0ED0FE0A216F0A21507150FA216E0151F16C0ED7F80913801FE0090B512F815FF9039F0
+003FC0ED0FE0ED07F016F8150316FCA616F81507ED0FF0ED1FE0ED7FC0B7120015F82625
+7EA42C>I<9138FF8008010FEBF01890393FC03C789039FE0006F8D801F8130348481301
+4848130048481478121F48481438A2007F151890C8FCA2481500A97E16187F123FA26C6C
+1430120F6C6C14606C6C14C06C6CEB0180D800FEEB070090383FC01E90380FFFF8010013
+C025257DA42C>I<B7FCA23903F8007FED0F8015071503A21501A3ED00C01406A21600A2
+140E141EEBFFFEA2EBF81E140E1406A21660A291C7FC16C0A415011503A2ED0F80153FB7
+FCA223257EA428>69 D<B612FEA23803F800151F8181A281A3ED01801403A292C7FCA25C
+5C90B5FCA2EBF80F8080A491C8FCAAB512F0A221257EA427>I<B500E0B512E0A23B03F8
+0003F800AF90B6FCA29038F80003B0B500E0B512E0A22B257EA430>72
+D<B512E0A23803F800B3AFB512E0A213257EA417>I<B539E007FF80A2D803F8C7EA7800
+16605E4B5A0307C7FC150E15185D5D5DEC03804AC8FC140E141F4A7E147FECDFC09038FB
+8FE09038FF0FF0EBFC07496C7E816E7E1400157F82153F6F7E6F7E8215076F7E82B539E0
+3FFFC0A22A257EA430>75 D<B512F0A2D803F8C7FCB3A31503A31506A3150EA2151E153E
+157CEC03FCB6FCA220257EA425>I<D8FFF8EDFFF86D5C0003EEFE00017EEC037EA36D14
+06A26D6C130CA26D6C1318A26D6C1330A36D6C1360A26D6C13C0A2903900FC0180A29138
+7E0300A3EC3F06A2EC1F8CA2EC0FD8A2EC07F0A36E5AEA07803CFFFC01C01FFFF8A23525
+7EA43A>I<D8FFF8903807FFE07FD803FE9038003C006D14187F6D7E6D7E806D7E6D7E13
+036D7E6D7E80EC7F80EC3FC0141FEC0FE015F0EC07F8EC03FC1401EC00FE157F1698ED3F
+D8ED1FF8150F15071503A2150115001678486C1438D8FFFC1418A22B257EA430>I<B67E
+15F83903F801FEEC007F6F7E6F7EA282A55EA24B5A4BC7FCEC01FE90B512F815C09038F8
+03F06E7E6E7E157EA2157FA482A31760ED3FC017C0ED1FE1B539E00FFF80923801FE002B
+257EA42E>82 D<01FF1380000713E3380F80F7381E001F48130F481307140312F81401A2
+7E91C7FCB4FCEA7FE013FE383FFFE014F86C13FE00077F6C1480C67E010313C0EB003FEC
+0FE01407A200C01303A315C07E6C13076C14806CEB0F0038FFC03E38E3FFF838803FE01B
+257DA422>I<007FB612F8A2397E00FE010078EC00780070153800601518A200E0151C16
+0C5AA4C71400B3A390B512FEA226247EA32B>I<B539E00FFFC0A2D803F8C7EA78001630
+B3A700015D7F00005D137C6D495A6D0107C7FC90380FE03E903803FFF89038007FC02A25
+7EA42F>I<B5398001FFE0A2D807F8C7EA1C0000031518A26D1438000115306D14700000
+15607F6D5C80013F495AA2ECC003011F91C7FC6E5A010F130614F001075BA26D6C5AA2EC
+FC3801011330ECFE700100136014FF6E5AA26E5AA36EC8FCA2140EA22B257FA42E>I<B5
+3B81FFFE01FFF0A23D07F0001FC0000F007013066C6C010F5CA26F7E6C6C5EA26D496C13
+38000017304B7E017F01195CA291388030FE013F5E829139C0607F01011F5E03E0138190
+280FE0C03F83C7FCA29139F1801FC3010715C617E69139FB000FEE010315EC02FF14FC6D
+486D5AA24A130301005DA24A130102785CA202306D5A3C257FA43F>I<B539C001FFE0A2
+D807F8C7EA1C006C6C141816386C6C14306C6C5C16E06D6C5B6D6C485A1503D91FE090C7
+FC90380FF006150E903807F80C6D6C5A15386D6C5A903800FF6015E06E5A6E5AAE90380F
+FFFCA22B257FA42E>89 D<EA07FF001F13E0383E03F0383F00F880147E121EC7FCA3EB1F
+FE3803FE7EEA0FC0EA1F00123E127E5AA314BEEA7E01383F073E391FFE1FE03807F00F1B
+187E971E>97 D<EAFFC0A2120FACEBC1FCEBCFFF9038FC0FC09038F007E09038C003F0A2
+EC01F8A215FCA815F8A2EC03F013E09038F007E090381C1F80390E0FFF00380C03F81E26
+7FA522>I<EB7FE03803FFF83807C07C381F80FC13005A007E1378140012FEA8127E127F
+6C130CEA1F80EBC0183807E0703803FFE038007F0016187E971B>I<ECFFC0A2140FAC13
+7F3803FFCF380FE0FF381F803F383F000FA2127EA212FEA8127EA27E141F381F803F380F
+C0EF3903FFCFFC3800FE0F1E267EA522>I<137F3803FFC03807C1F0380F80F8EA1F0048
+137C127E147E12FEA2B512FEA248C7FCA3127EA214067E6C130C380F80183807E0703803
+FFE038007F8017187E971C>I<EB1FC0EB7FF0EA01F83803E1F8120713C1380FC0F01400
+A7B5FCA2EA0FC0B3A2EAFFFEA215267EA513>I<3901FF07C00007EBDFE0380F83F1EA1F
+01393E00F800007E7FA6003E5B6C485A380F83E0EBFFC0001190C7FC0030C8FCA2123812
+3C383FFFE06C13FC806C7F481480383C003F48EB0FC000F81307A4007CEB0F806CEB1F00
+381F807E3807FFF8C613C01B247E971F>I<EAFFC0A2120FAC14FE9038C3FF809038CE0F
+C013D89038D007E013E0A213C0AF39FFFC7FFEA21F267EA522>I<120FEA1F80EA3FC0A4
+EA1F80EA0F00C7FCA7EA7FC0A2120FB3A2EAFFF8A20D277EA611>I<EAFFC0A2120FACEC
+1FF0A2EC0780EC0E005C14305CEBC1C0EBC38013C713DFEBFFC0EBE7E0EBC3F0138180EB
+80FC147E80A2EC1F80EC0FC039FFF83FF8A21D267FA520>107 D<EAFFC0A2120FB3B0EA
+FFFCA20E267EA511>I<26FF80FE137F903A83FF81FFC03B0F8E0FC707E0019813CC903A
+9007E803F001A013F0A201C013E0AF3BFFFC7FFE3FFFA230187E9733>I<38FF80FE9038
+83FF80390F8E0FC0139890389007E013A0A213C0AF39FFFC7FFEA21F187E9722>I<EB7F
+803803FFF03807C0F8381F807E48487EA2007EEB1F80A200FE14C0A8007E1480A26CEB3F
+00A2381F807E6C6C5A3803FFF038007F801A187E971F>I<38FFC1FCEBCFFF390FFC1FC0
+9038F007E001C013F0140315F8140115FCA8EC03F8A215F0EBE0079038F00FE09038DC1F
+809038CFFF00EBC3F801C0C7FCA9EAFFFCA21E237F9722>I<38FF83E0EB8FF8380F8C7C
+EB90FC13B013A01478EBE0005BAEEAFFFEA216187F9719>114 D<3807F8C0EA1FFFEA3C
+07EA7001EAF000A300FC1300B47EEA7FFC7F383FFF80000F13C0120338001FE01303EAC0
+01A212E014C0EAF00338FC078038EFFF00EAC3FC13187E9718>I<13C0A41201A3120312
+07120F121FB512C0A2380FC000AC1460A63807E0C013E13801FF8038007E0013237FA218
+>I<39FFC07FE0A2000F1307B0140FA200071317EBE0673903FFC7FE38007F071F187E97
+22>I<39FFF80FF8A2390FC001C015803907E00300A26D5A00031306EBF80E0001130C13
+FC00005B13FEEB7E30A26D5AA214E06D5AA26D5AA26DC7FCA21D187F9720>I<3BFFF9FF
+E0FF80A23B1FC03F001C00000F6D13181580D807E05CA29039F03FC07000030137136015
+E02601F8635BA29038FCE3F1000001C15B15F990267F80FBC7FCA215FF90383F007EA201
+1E133CA3010C131829187F972C>I<39FFF83FF0A2390FC00F003807E00E6C6C5A6D5A6C
+6C5A00001360EB7EC06D5AA2131F6D7E497E80EB33F81361EBE0FC3801C07E3803807F39
+07003F8048131F39FFC07FF8A21D187F9720>I<39FFF80FF8A2390FC001C015803907E0
+0300A26D5A00031306EBF80E0001130C13FC00005B13FEEB7E30A26D5AA214E06D5AA26D
+5AA26DC7FCA21306A25B1230EA781CEAFC185B1370EA68E0EA7FC0001FC8FC1D237F9720
+>I E
+%EndDVIPSBitmapFont
+%DVIPSBitmapFont: Fm cmsl10 10.95 28
+/Fm 28 122 df<EB03E0EB1C181338EB703C13E014383801C000A5485A387FFFF0380380
+70A4380700E0A6380E01C0A6381C0380001E13C038FF0FF016207E9F19>12
+D<EAFFF0A20C027E8A0F>45 D<0007B512F83900F800780178133815185B1508A53901E0
+0800A314181438EBFFF83803C0301410A491C7FC485AA648C8FC7FEAFFFC1D1F7E9E1E>
+70 D<3A07FF803FE03A00F8001F000178130C5D4913205D5D4AC7FC1402140848485A5C
+146014F013E1EBE4F83803C878EBD07CEBE03CEBC03E141E141F48487E81140781140381
+380F00016D487E39FFF00FFE231F7E9E23>75 D<EA07F8EA0C0CEA1E061307121C1200A3
+13FFEA07C7EA1E07EA3C0E127800F01310A3131EEB2E2038784F40381F878014147D9317
+>97 D<1207123F120F7EA2120EA65A137CEA1D83381E0180001C13C0EB00E05A14F0A538
+7001E0A214C013031480EB0700EAE80EEACC38EA83E014207B9F19>I<13FEEA0383380E
+0780121C0038130090C7FC12785AA45AA37E5BEA70026C5AEA1C18EA07E011147D9314>
+I<1438EB01F8EB00781438A21470A614E013FCEA0382EA0601121CEA3C00383801C01278
+12F0A438E00380A412F0EA700738380F00381C37803807C7E015207D9F19>I<13F8EA07
+0EEA0E07121C383803801278127012F0A2B5FC00F0C7FC5AA46C5AEA7002EA3004EA1C18
+EA07E011147D9314>I<EB07C0EB1C60EB30F01360EBE0E0EBC0001201A5485AEA3FFCEA
+0380A448C7FCA6120EA65A121EEAFFC014207F9F0E>I<140EEB3E11EBE1A33801C1C238
+0381E0EA07801301120FA3380703C01480EB8700EA04FC48C7FCA21218121CEA0FFF14C0
+14E0381800F04813305A5AA3006013606C13C0381C0700EA07FC181F809417>I<13E012
+0712011200A2485AA6485AEB8F80EB90E013A0EBC0601380000713E01300A5380E01C0A6
+381C0380001E13C038FF8FF014207E9F19>I<EA01C0EA03E0A213C0EA0180C7FCA6EA03
+80121F12071203A2EA0700A6120EA65A121EEAFF800B1F7F9E0C>I<13E0120712011200
+A2485AA6485AEB81FCEB80F014C0EB81801400EA07045B13181338137C131C120E7FA213
+0F7F1480EA1C03381E07C038FF8FF016207E9F18>107 D<13E0120712011200A2EA01C0
+A6EA0380A6EA0700A6120EA65A121EEAFF800B207F9F0C>I<390387C07C391F98618639
+07A072073903C03403EB80380007EB7807EB0070A5000EEBE00EA64848485A001EEBE01E
+3AFFCFFCFFC022147E9326>I<38038F80381F90E0EA07A03803C0601380000713E01300
+A5380E01C0A6381C0380001E13C038FF8FF014147E9319>I<13FCEA0387380E0180381C
+00C04813E0A24813F012F0A438E001E0A214C0130300F0138038700700EA380E6C5AEA07
+E014147D9317>I<EBE3E03807EC383801F01C6C487E140F48487E1580A53903800F00A2
+140E141E141C5C38074070EB61C0011FC7FC90C8FCA3120EA4121EEAFFC0191D809319>
+I<EBFC2038038260EA0702381E01E0123C003813C0127812F0A438E00380A212F0A21307
+127038380F00EA1C37EA07C7EA0007A3130EA4131EEBFFC0131D7D9318>I<EA038E381F
+B380EA07C71203EB8300EA078090C7FCA5120EA65A121EEAFFC011147E9312>I<EA01F9
+EA0607EA080312181301EA3802EA3C00121F13F0EA07FCEA01FEEA001FEA40071303A212
+601306EAF004EAC818EA87E010147F9312>I<1380EA0100A35A5A5A121EEAFFF8EA0E00
+A45AA65A1310A41320A2EA1840EA0F800D1C7C9B12>I<381C0380EAFC1FEA3C07EA1C03
+A238380700A6EA700EA4131EA25BEA305E381F9F8011147B9319>I<38FF83F8381E00E0
+001C13C01480121E380E01005B13025B12075BA25BEA039013A013E05B5B120190C7FC15
+147C9318>I<39FF9FE1FC393C078070391C030060148015401580EA0E0790380D810013
+09EB19C21311380F21C4EA0720EB40C814E8EB80F0A26C485A1460000213401E147C9321
+>I<381FF0FF3803C0780001137014403800E0C0EBE180EB73001376133CA2131C132E13
+4E1387EA0107380203801204380C01C0383C03E038FE07FC18147F9318>I<390FF83F80
+3901E00E00EBC00C140813E000005B143014205C13705CA20171C7FC1339133A133E133C
+133813181310A25BA25BEA70C0EAF08000F1C8FC12E61278191D809318>I
+E
+%EndDVIPSBitmapFont
+%DVIPSBitmapFont: Fn cmr8 8 41
+/Fn 41 124 df<126012F0A212701210A21220A21240A2040A7D960A>39
+D<EAFF80A2090280870C>45 D<1206120E12FE120EB1EAFFE00B157D9412>49
+D<13101338A3135CA3138EA3EA0107A238020380A33807FFC0EA0401A2380800E0A20018
+13F0123838FE03FE17177F961A>65 D<EAFFFE381C0380EB00E014601470A414E0EB01C0
+381FFF8014C0381C00E0147014301438A4147014E0EB01C0B5120015177F9619>I<EBFC
+1038038330380E00B0481370481330123000701310126012E01400A51410126012700030
+132012386C13406C138038038300EA00FC14177E9619>I<B5FC381C01C0EB00E0143014
+381418141C140C140EA7140C141CA2143814301460EB01C0B5120017177F961B>I<B512
+E0EA1C00146014201410A3EB0400A3130CEA1FFCEA1C0C13041408A2130014181410A214
+3014F0B5FC15177F9618>I<B512E0EA1C00146014201410A3EB0400A3130CEA1FFCEA1C
+0C1304A390C7FCA6EAFFC014177F9617>I<EA0FF8EA00E0B112E0A2EAC1C0EA6180EA1F
+000D177E9612>74 D<EAFFC0001CC7FCAD1420A31460A2144014C01303B5FC13177F9616
+>76 D<00FEEB03F8001E14C000171305A338138009A23811C011A33810E021A2EB7041A3
+EB3881A2EB1D01A2130EA2123839FE040FF81D177F9620>I<00FC13FE001E1338001F13
+101217EA1380EA11C0A2EA10E013701338A2131C130E130F1307EB0390EB01D0A2EB00F0
+14701430123800FE131017177F961A>I<EAFFFE381C0380EB00C014601470A4146014C0
+EB0380381FFE00001CC7FCAAB47E14177F9618>80 D<EAFFFC381C0380EB00C014E01470
+A414E014C0EB0380381FFE00381C0780EB01C0EB00E0A514E1A2147238FF803C18177F96
+1A>82 D<EA0FC4EA302CEA601CEA400CEAC004A3EAE0001270127FEA3FE0EA0FF8EA01FC
+EA001C130E13061280A3EAC004EAE008EAD810EA87E00F177E9614>I<387FFFF8386038
+1800401308A200801304A300001300AF3803FF8016177F9619>I<38FF80FE381C003814
+10B06C132012066C13403801818038007E0017177F961A>I<12FCA212C0B3AB12FCA206
+217D980A>91 D<EA3FC0EA70601330EA20381200EA03F8EA1E3812301270EAE039A21379
+EA70FFEA1F1E100E7F8D12>97 D<12F81238A8EA39F0EA3E0CEA380613077F1480A41400
+5B1306EA361CEA21F011177F9614>I<EA07F0EA18381230EA7010EA600012E0A41260EA
+70081230EA1830EA07C00D0E7F8D10>I<133E130EA8EA07CEEA1C3EEA300E1270126012
+E0A412601270EA301EEA182E3807CF8011177F9614>I<EA0FC0EA1860EA3030EA7038EA
+E018EAFFF8EAE000A31260EA7008EA3010EA1830EA07C00D0E7F8D10>I<EA03E0EA0670
+120EEA1C201300A5EAFF80EA1C00ACEA7F800C1780960B>I<EA0F9EEA18E3EA3060EA70
+70A3EA3060EA18C0EA2F80EA20001260EA3FE013F813FCEA600EEAC006A3EA600CEA3838
+EA0FE010157F8D12>I<1203EA0780A2EA0300C7FCA5EA1F801203AF1243EAE30012E712
+7C091D82960B>106 D<12F81238A8133E13381330134013801239EA3FC0EA39E0123813
+F01378133CA2EAFE7F10177F9613>I<12F81238B3A312FE07177F960A>I<EAF8F8EA3B1C
+EA3C0E1238AA38FE3F80110E7F8D14>110 D<EA07C0EA1830EA3018EA600CA2EAE00EA5
+EA701CEA3018EA1830EA07C00F0E7F8D12>I<EAF9F0EA3E1CEA380613077F1480A41400
+5B130EEA3E1CEA39F00038C7FCA512FE11147F8D14>I<EA07C2EA1C26EA381EEA700E12
+6012E0A412601270EA301EEA1C2EEA07CEEA000EA5EB3F8011147F8D13>I<EAF9E0EA3A
+70123CEA38201300A9B4FC0C0E7F8D0E>I<EA1F40EA60C0EAC040A2EAE000B4FCEA7F80
+EA1FC0EA01E0EA8060A212C0EAE0C0EA9F000B0E7F8D0E>I<1208A31218A21238EAFFC0
+EA3800A71340A4EA1C80EA0F000A147F930E>I<EAF83EEA380EAA131EEA1C2E3807CF80
+110E7F8D14>I<38FEFE7C383838381410133C001C1320134C381E4E60380ECE40138700
+0713801303A200031300EA0201160E7F8D19>119 D<EAFE3FEA3C1CEA1C10EA0E20EA07
+4013C0EA0380EA01C0EA02E0EA04F0EA0870EA1838EA383CEAFC7F100E7F8D13>I<EAFE
+1FEA380EEA3C0CEA1C08A2EA0E10A2EA0720A213E0EA03C0A2EA0180A21300A212E2A212
+A4127810147F8D13>I<B512801101808812>123 D E
+%EndDVIPSBitmapFont
+%DVIPSBitmapFont: Fo cmsy9 9 2
+/Fo 2 106 df<13801201EA0300A31206A25AA35AA35AA25AA35AA21260A37EA27EA37E
+A37EA27EA3EA0180120009267D9B0F>104 D<12C0A21260A37EA27EA37EA37EA27EA3EA
+0180A2EA0300A31206A25AA35AA35AA25AA35AA209267E9B0F>I
+E
+%EndDVIPSBitmapFont
+%DVIPSBitmapFont: Fp cmcsc10 10.95 8
+/Fp 8 118 df<EAFFF0EA0F00B3ABEAFFF00C1F7D9E12>73 D<EB1FE0EB70383801C00E
+48487E39070003804814C0001EEB01E048EB00F0A2007C14F8A20078147800F8147CA900
+781478007C14F8A2003C14F0003E1301001E14E06CEB03C06C148039038007003801E01E
+38007038EB1FE01E217C9F26>79 D<B512F0380F803E0007130FEC0780EC03C0A215E0A4
+15C0A2EC0780EC0F00143EEBFFF00180C7FCAD487EEAFFFC1B1F7D9E22>I<3803F02038
+0C0C60381803E0EA30005A146012E01420A36C13007E127CEA7F80EA3FFC6CB4FC000713
+80000113C038000FE013031301EB00F014707EA46C136014E06C13C038F8018038C60300
+EA81FC14217C9F1C>83 D<397FF807FE390FE001F0D807C013C06C6C6C5A000149C7FCEB
+F0023800F806EB78046D5AEB3E18EB1F106D5A14C0130713036D7E497EEB06F8EB0478EB
+087CEB183EEB101EEB201F496C7EEBC007496C7ED801007F486D7E481300391F8001F83A
+FFC007FF80211F7E9E25>88 D<EB7E083803819838070078000C1338001C13185A007813
+08127000F01300A5EB03FEEB00381270127812387E120C1207380380D838007F0817177E
+961D>103 D<38FC01FC381E007014201217EA1380A2EA11C0EA10E0A213701338A2131C
+130E1307A2EB03A0EB01E0A213001460123800FE132016177E961C>110
+D<38FF81FC381C00701420B0000C1340120E6C138038018300EA007C16177E961C>117
+D E
+%EndDVIPSBitmapFont
+%DVIPSBitmapFont: Fq cmbx12 17.28 34
+/Fq 34 121 df<EB01C01303130F137FEA1FFFB5FC13BFEAE03F1200B3B1007FB512F0A3
+1C2E7AAD28>49 D<EB3FE03801FFFE0007EBFF80D80F8013C0391E003FE00038EB1FF000
+7CEB0FF8007EEB07FCB4FC018013FEA21403A2EA7F00003E1307C7FC15FCA2EC0FF8A215
+F0EC1FE015C0EC3F80EC7F00147E14F8495A495A495A49C7FC011E130E5B133849131E49
+131C485A48C7123C48B512FC5A5A5A4814F8B6FCA31F2E7CAD28>I<913A03FF80018002
+3FEBF00349B5EAFC0701079038003F0FD91FF8EB079FD93FC0EB01FFD9FF807F4848C812
+7F4848153F0007161F49150F485A001F1607A2485A1703127FA24992C7FCA212FFA9127F
+A27FEF0380123FA26C7E1707000F17006C7E6D150E0003161E6C6C151C6C6C6C1478D93F
+C05CD91FF8EB03E0D907FFEB3F800101D9FFFEC7FCD9003F13F80203138031317CB03A>
+67 D<B812F0A3C6903880003FEE07F816031600A21778A21738A3171C1507A31700A25D
+5D5D91B5FCA3EC803F818181A21707A392C7120EA4171EA2173CA2177C17FC1601160716
+3FB812F8A330317EB035>69 D<B812E0A3C6903880007FEE0FF016031601A21600A21770
+A31738A21507A21700A35D5D5D91B5FCA3EC803F818181A592C8FCACB612C0A32D317EB0
+33>I<DA03FF1303027FEBF00749B5EAFC0F01079038007E1FD91FF0EB0FBFD97FC0EB03
+FF49487F4848C87E485A0007824848815B001F82A2484881A2127FA24992C7FC12FFAA03
+07B512F8127F7FDB00011300123FA26C7EA2120F7F6C7E12036C7E6C6C7E6D6C5BD91FF8
+497ED907FFEB3E3F01019038FFFC1F6D6CEBF00F0203EB800335317CB03F>I<B61280A3
+C6EB8000B3B3A7B61280A319317EB01E>73 D<B67EA3000190C9FCB3A9EE0380A4160717
+00A25EA35E5E5E5E4B5A150FB7FCA329317DB030>76 D<B56C49B512C08080C66D903900
+03E0006E6E5AEBEFFC13E780EBE3FF01E17F01E07F6E7E143F816E7E6E7E6E7E14036E7E
+16806E13C0ED7FE0ED3FF0151F16F8ED0FFCED07FEED03FF6F13818117C1EE7FE1EE3FF1
+EE1FF9EE0FFD160717FF828282177F173FA2171F170F486C1507B500E014031701A23A31
+7EB03F>78 D<B712E016FEEEFF80C6D9800013E0EE3FF0EE0FF8EE07FCA2EE03FEA217FF
+A717FEA2EE07FC17F8160FEE3FE0EEFFC091B6120016F80280C8FCB3A2B67EA330317EB0
+37>80 D<B77E16F816FEC690398003FF809238007FE0EE1FF0707EA283160783A65F160F
+5F4C5A4C5A4C5ADB03FFC8FC91B512F816E091388007F8ED01FC6F7E167F83707EA283A5
+83A4F0038017F8161F1900706C5AB6398003FE0E933801FFFC9338001FF039317EB03C>
+82 D<007FB8FCA39039C00FF801D87E00EC003F007C82007882A200708200F01780A348
+1603A5C792C7FCB3AA017FB6FCA331307DAF38>84 D<B6D88003B51280A3C60180C73807
+C000715AB3AE137F4DC7FC80013F150EA26D6C5C6D6C5C6D6C5C6D6C495A903A00FF801F
+C0023FB55A020F49C8FC020013E039317EB03E>I<B500FC91B5FCA3000390C8EA03C06C
+17806E14076C170080017F150EA26E141E013F151C6E143C011F153880010F5D8001075D
+A26E130101035D6E13036D5D15806D4AC7FCA26F5A027F130EEDE01E023F131CEDF03C02
+1F133815F8020F5BA2EDFCF002075B15FF6E5BA26E5BA26E90C8FCA3157EA2153CA23831
+7EB03D>I<EBFFF0000313FF390F803F809038C00FE0486C6C7EA26E7ED80FC07FEA0780
+C7FCA414FF131FEBFFE33803FC03EA0FF0EA1FC0123FEA7F80A2EAFF00A31407A2387F80
+0D393FC01DFE3A1FE078FFF03907FFE07FC6EB803F24207E9F27>97
+D<EA01F812FFA3120F1207ADEC3FE0ECFFFC9038FBE07F9039FF001F8049EB0FC04914E0
+49EB07F016F8A2ED03FCA316FEA816FCA3ED07F8A216F06DEB0FE06D14C001E7EB3F8090
+39C3C0FE00903880FFF89038003FC027327EB12D>I<EB0FFF017F13C03901FC01F03803
+F0033907E007F8120FEA1FC0003FEB03F0EC01E04848C7FCA312FFA8127FA36C6C131CA2
+001F14386C7E000714703903F001E03901FC07C039007FFF00EB0FF81E207D9F24>I<ED
+0FC0EC07FFA3EC007F153FADEB07F8EB3FFF9038FE07BF3903F801FF3907E0007F120F48
+48133F123FA2485AA312FFA8127FA36C7EA2121F6C6C137F000714FF2603F00313E03A01
+FC0F3FFE38007FFEEB0FF027327DB12D>I<EB0FFC90387FFF803901FC0FC03903F003E0
+3907E001F0000F14F8391FC000FC003F14FEA24848137E157FA212FFA290B6FCA20180C7
+FCA4127FA36C6C1307121F150E6C7E6C6C131C6C6C13783900FE03E090383FFFC0903807
+FE0020207E9F25>I<EB01FE90380FFF8090381FC3C090387F07E09038FE0FF0120113FC
+1203EC07E0EC018091C7FCA8B512FCA3D803FCC7FCB3A8387FFFF0A31C327EB119>I<90
+391FF007C09039FFFE3FE03A01F83F79F03907E00FC3000F14E19039C007E0E0001FECF0
+00A2003F80A5001F5CA2000F5CEBE00F00075C2603F83FC7FC3806FFFE380E1FF090C9FC
+121EA2121F7F90B57E6C14F015FC6C806C801680000F15C0003FC7127F007EEC1FE0007C
+140F00FC1407A4007EEC0FC0003E1580003F141FD80FC0EB7E003907F803FC0001B512F0
+D8001F90C7FC242F7E9F28>I<EA01F812FFA3120F1207ADEC07F8EC3FFEEC783F02C013
+809039F9801FC0EBFB0001FE14E05BA35BB3B500C3B5FCA328327DB12D>I<EA03C0487E
+487E487EA46C5A6C5A6C5AC8FCA9EA01F8127FA31207B3A7B51280A311337DB217>I<EA
+01F812FFA3120F1207B3B3A6B512C0A312327DB117>108 D<2703F007F8EB1FE000FFD9
+3FFEEBFFF8913A783F01E0FC02C090388300FE280FF1801FC6137F2607F30013CC01F602
+F8148001FC5CA3495CB3B500C3B5380FFFFCA33E207D9F43>I<3903F007F800FFEB3FFE
+EC783F02C013803A0FF1801FC03807F30001F614E013FCA35BB3B500C3B5FCA328207D9F
+2D>I<EB07FC90387FFFC03901FC07F03903F001F848486C7E4848137E001F147F003F15
+8049133F007F15C0A300FF15E0A8007F15C0A36C6CEB7F80A2001F15006C6C13FE00075C
+3903F803F83901FE0FF039007FFFC0D907FCC7FC23207E9F28>I<3901F83FE000FFEBFF
+FC9038FBE07F9039FF003F80D80FFEEB1FC06C48EB0FE04914F0ED07F8A216FC1503A216
+FEA816FC1507A216F8A2ED0FF06D14E06DEB1FC06DEB3F809039FBC0FE009038F8FFF8EC
+3FC091C8FCABB512C0A3272E7E9F2D>I<3803F03F00FFEB7FC09038F1C3E01487390FF3
+0FF0EA07F6A29038FC07E0EC03C091C7FCA25BB2B512E0A31C207E9F21>114
+D<3801FF86000713FEEA1F00003C133E48131E140E12F8A36C90C7FCB47E13FC387FFFC0
+6C13F0806C7F00077F00017FEA003F01001380143F0060131F00E0130FA27E15007E6C13
+1E6C131C38FF807838F3FFF038C07F8019207D9F20>I<131CA5133CA3137CA213FC1201
+12031207381FFFFEB5FCA2D803FCC7FCB0EC0380A71201EC0700EA00FEEB7F0EEB3FFCEB
+07F0192E7FAD1F>I<D801F8EB07E000FFEB03FFA3000FEB003F0007141FB3153FA20003
+147FA26C6CEBDFF03A00FE039FFF90387FFF1FEB0FFC28207D9F2D>I<B53A1FFFE03FF8
+A33C0FF000FE0007806D150300076EEB0700816D5D00039138FF800EA26C6C486D5A15DF
+01FF153C6C9039038FE038A2D97F876D5A150702C714F0D93FCF6D5AECCE03D91FFEEBF9
+C09138FC01FD16FF010F5D4A7EA26D486DC7FCA20103147E4A133EA26D48131C35207E9F
+3A>119 D<3A7FFF807FFCA33A03FC000F006C6C131E6C6C5BEC803890387FC078013F5B
+90381FE1E090380FF3C0ECFF806D90C7FC6D5A13016D7E81815B903803DFE09038078FF0
+8190380F07FC90381E03FEEB3C01496C7E4914804848EB7FC00003EC3FE026FFFC01B5FC
+A328207F9F2B>I E
+%EndDVIPSBitmapFont
+%DVIPSBitmapFont: Fr cmsy10 10.95 1
+/Fr 1 14 df<14FF010713E090381F00F80178131E01E01307D80180EB018048C812C000
+061560481530A248151848150CA2481506A4481503A900601506A46C150CA26C15186C15
+30A26C15606C15C06C6CEB0180D800E0EB07000178131E011F13F8903807FFE0010090C7
+FC282B7EA02D>13 D E
+%EndDVIPSBitmapFont
+%DVIPSBitmapFont: Fs cmbx12 14.4 55
+/Fs 55 122 df<123C127FEAFF80A213C0A3127F123E1200A2EA0180A3EA0300A2120612
+0E5A5A12100A157B8813>44 D<121C127FA2EAFF80A3EA7F00A2121C09097B8813>46
+D<130E131E137EEA07FE12FFA212F81200B3ABB512FEA317277BA622>49
+D<EBFF80000713F04813FC381E03FE393800FF80007C133F00FE14C06C131F15E0140FA2
+127E003C131FC7FC15C0A2EC3F801500147E5C5C495A495AEB078049C7FC131E4913E013
+705B3901C001C0EA0380EA0600000FB5FC5A5A5AB61280A31B277DA622>I<EB7F803803
+FFF04813FC380F81FE381F007FEA3F80EC3F80A3121F1300C7EA7F00A2147E5C495AEB07
+F0EBFFC0A2EB01F8EB007E801580EC1FC0A215E0A2123C127EB4FCA215C0143F48148000
+7CEB7F00383F01FE6CB45A000713F0C613801B277DA622>I<140FA25C5C5C5C5BA2EB03
+BFEB073F130E131C133C1338137013E0EA01C0EA038012071300120E5A5A5A12F0B612F8
+A3C7EA7F00A890381FFFF8A31D277EA622>I<00181303381F801FEBFFFE5C5C5C14C091
+C7FC001CC8FCA7EB7FC0381DFFF8381F80FC381E003F1208C7EA1F8015C0A215E0A21218
+127C12FEA315C05A0078EB3F80A26CEB7F00381F01FE6CB45A000313F0C613801B277DA6
+22>I<EB07F8EB3FFE90B5FC3901FC07803903F00FC03807C01FEA0F80121F130048EB0F
+8091C7FC127EA3EAFE02EB1FF0EB3FFCEB603EEB801F00FF14809038000FC0A24814E0A4
+127EA4123E003F14C07EEC1F80D80F8013003807E07E6CB45A6C5B38003FC01B277DA622
+>I<1238123E003FB512F0A34814E015C0158015003870000EA25C485B5C5CC6485AA249
+5A130791C7FC5B5B131E133EA2137E137CA213FCA41201A76C5A13701C297CA822>I<EB
+7F803801FFF000077F380FC0FC381F803E48487E007E1480A2140F00FE14C0A315E0A500
+7E131FA26C133F6C132F380F80CF3807FF8F0001130FEA0008010013C0A3EC1F80123E12
+7FEC3F00143E147E007E5B383E03F8381FFFE06C1380D801FEC7FC1B277DA622>57
+D<EC0780A24A7EA34A7EA24A7EA3EC77F8A2ECF7FC14E3A2903801C1FEA201037F1480A2
+49486C7EA24980010E133FA2496D7EA2013FB57EA39039700007F8A201F0804913030001
+81491301A2000381D8FFFE013F13FCA32E297EA833>65 D<B612F815FF16C03A03F8001F
+E0ED0FF0ED07F8150316FCA21501A3150316F8A2ED07F0150FED1FC0EDFF8090B5EAFE00
+EDFFC09039F8000FF0ED03F8ED01FC16FE1500A216FFA616FE1501ED03FC1507ED1FF8B7
+12E016C0EDFE0028297DA830>I<91387FE003903907FFFC07011FEBFF0F90397FF00F9F
+9039FF0001FFD801FC7F4848147F4848143F4848141F485A160F485A1607127FA290C9FC
+5AA97E7F1607123FA26C7E160E6C7E6C6C141C6C6C143C6C6C14786CB4EB01F090397FF0
+07C0011FB512800107EBFE009038007FF028297CA831>I<B612FCEDFF8016E03A03FC00
+1FF8ED03FCED00FE167FEE3F80EE1FC0A2EE0FE0A2EE07F0A417F8AA17F0A3EE0FE0A217
+C0161FEE3F80EE7F005EED03FCED1FF8B75A168003FCC7FC2D297EA834>I<B712E0A339
+03FC001FED07F01501A215001670A3913801C0781638A302031300A2140F90B5FCA3EBFC
+0F1403A20201130EA3161C91C7FCA3163C1638167816F815011503151FB712F0A327297E
+A82C>I<B712C0A33903FC003FED0FE015031501A21500A316F0913801C070A316001403
+A2140F90B5FCA3EBFC0F1403A21401A491C8FCA9B512FCA324297EA82A>I<91387FE003
+903907FFFC07011FEBFF0F90397FF00F9F9039FF0001FFD801FC7F484880484880484880
+485A82485A82127FA290CAFC5AA892B512F87E7F03001300123FA26C7EA26C7E6C7E6C7E
+6C7E6CB45B90387FF007011FB5129F0107EBFE0F9039007FF0032D297CA835>I<B5D8F0
+0FB5FCA3D803FCC7EA3FC0AF90B7FCA301FCC7123FB1B5D8F00FB5FCA330297EA835>I<
+B512F0A33803FC00B3B1B512F0A314297EA819>I<B500F0EBFFFEA3D803FCC7EA0F0016
+1E5E5E16E0ED03C04B5A4BC7FC151E5D15F04A5A4A5A1407140F4A7EEC7FF04A7EEBFDE7
+9038FFC3FCEC83FE9038FE01FF497E6F7E826F7E151F6F7E8215076F7E6F7E8281EE7F80
+B539F00FFFFEA32F297EA835>75 D<B512FCA3D803FCC8FCB3A3ED01C0A415031680A215
+07A2150FA2151F157F913801FF00B7FCA322297EA828>I<D8FFFE92383FFF80A26D5D00
+03EFE000A2D9BF8014EFA2D99FC0EB01CFA2D98FE0EB038FA3D987F0EB070FA2D983F813
+0EA2D981FC131CA3D980FE1338A2027F1370A291383F80E0A391381FC1C0A291380FE380
+A2913807F700A3EC03FEA26E5AA26E5AD8FFFE0203B51280A2157039297DA840>I<D8FF
+FCEC7FFF7F7F00036DEB01C080EBBFE0139F80EB8FF8EB87FCEB83FEEB81FF0180138014
+7F15C0EC3FE0EC1FF0EC0FF8EC07FC140315FEEC01FF6E1381ED7FC1ED3FE1ED1FF1150F
+16F9ED07FDED03FF8181167FA2163F161F160F1607D8FFFE14031601A230297EA835>I<
+ECFFC0010F13FC90383F807F9039FE001FC0D801F8EB07E048486D7E48486D7E000F8148
+486D7EA24848147FA2007F168090C8123FA34816C0AA6C16806D147FA2003F1600A26C6C
+14FEA26C6C495A6C6C495A6C6C495A6C6C495A6C6C495A90263FC0FFC7FC90380FFFFC01
+0013C02A297CA833>I<B612F815FF16C03A03FC003FE0ED07F0ED03F816FC150116FEA7
+16FC150316F8ED07F0ED3FE090B61280EDFE0001FCC8FCB0B512F0A327297EA82E>I<EC
+FFC0010F13FC90383FC0FF9039FE001FC048486D7ED803F0EB03F000078148486D7E4848
+6D7EA24848147FA2007F1680A290C8123FA24816C0AA6C16806D147FA2003F1600A26C6C
+14FE143E3A0FE07F81FC00079038C1C1F83A03F18063F0D801F9EB67E0D800FFEB3FC090
+263FC07FC7FC90380FFFFC01004913C0EC003C811601ED1F8316FF6F1380A21700816F5A
+6F5A6F5A2A357CA833>I<B612E015FE6F7E3A03FC003FE0ED0FF06F7E6F7E150182A65E
+4B5A1507ED0FE0ED3FC090B500FEC7FCA29039FC00FF80ED3FC06F7E6F7E6F7EA9170EA2
+1503923801FC1CB538F000FEEE7FF8EE0FE02F297EA832>I<9038FF80600003EBF0E000
+0F13F8381F80FD383F001F003E1307481303A200FC1301A214007EA26C140013C0EA7FFC
+EBFFE06C13F86C13FE80000714806C14C0C6FC010F13E0EB007FEC1FF0140F140700E013
+03A46C14E0A26C13076C14C0B4EB0F80EBE03F39E3FFFE0000E15B38C01FF01C297CA825
+>I<007FB71280A39039807F807FD87C00140F00781507A20070150300F016C0A2481501
+A5C791C7FCB3A490B612C0A32A287EA72F>I<B500F0EBFFFEA3D803FCC7EA0380B3AA00
+01ED07007F0000150E137F6D143CD91FC05B90390FF003F06DB55A01001480DA1FFCC7FC
+2F297EA834>I<B500F0EB7FFFA3D803FEC7EA01C00001ED0380A26D14076C16006E5B01
+7F140E80013F5CA26E133C011F14386E1378010F14708001075CA26D6C485AA2ECFE0301
+015CECFF076D91C7FC1587EC7F8EA215DEEC3FDC15FC6E5AA26E5AA36E5AA26E5AA23029
+7FA833>I<B53CE07FFFE01FFFC0A32803FC0003FCC7EA7000A26D6D7E000160A26D6E13
+016C604B138002801503017F5F4B13C0D93FC0013F49C7FCA2913AE00E1FE00F011F160E
+17F09126F01C0F131E010F161C033C13F8902707F838075BA2037813FC902703FC70035B
+A2913AFEE001FEF001015E02FF14FF4B7E6D5EA26E486D5AA36EC76CC8FCA2023E80021E
+141EA242297FA845>I<B500F0EB3FFFA3D803FEC7EA03C06C6C15806C6DEB07005E6D6C
+130E6E5B013F143C6D6C13386E5B010F14F06D6C5B6E485A01031303D901FF5B0387C7FC
+6D138FEC7FCE15FC143F6E5A5D140FAE0103B512C0A330297FA833>89
+D<3803FF80000F13F0381F01FC383F80FE147F801580EA1F00C7FCA4EB3FFF3801FC3FEA
+0FE0EA1F80EA3F00127E5AA4145F007E13DF393F839FFC381FFE0F3803FC031E1B7E9A21
+>97 D<EAFFE0A3120FACEBE1FE9038EFFF809038FE07E09038F803F09038F001F89038E0
+00FCA2157EA2157FA8157EA315FCA29038F001F89038F803F090389C0FE090380FFF8039
+0E01FC00202A7EA925>I<EB3FF03801FFFC3803F03E380FC07FEA1F80EA3F00A248133E
+007E90C7FCA212FEA7127EA2127F6CEB03801380001FEB0700380FE00E3803F83C3801FF
+F838003FC0191B7E9A1E>I<EC7FF0A31407ACEB3F873801FFF73807F03F380FC00F381F
+8007EA3F00A2127EA312FEA8127EA27EA2381F800F380FC01F3907E07FFF3801FFE73800
+7F87202A7EA925>I<EB3FC03801FFF03803E07C380F803E001F7F130048EB0F80127E15
+C0A200FE1307A2B6FCA248C8FCA3127EA2127F6CEB01C07E390F8003803907C007003803
+F01E3800FFFCEB3FE01A1B7E9A1F>I<EB07F8EB3FFCEB7E3E3801FC7FEA03F813F01207
+143E1400A7B512C0A33807F000B3A3387FFF80A3182A7EA915>I<9038FF80F00003EBE3
+F8390FC1FE1C391F007C7C48137E003EEB3E10007EEB3F00A6003E133E003F137E6C137C
+380FC1F8380BFFE00018138090C8FC1238A2123C383FFFF814FF6C14C06C14E06C14F012
+1F383C0007007CEB01F8481300A4007CEB01F0A2003FEB07E0390FC01F806CB512003800
+7FF01E287E9A22>I<EAFFE0A3120FAC147E9038E1FF809038E30FC001E413E0EBE80701
+F813F013F0A213E0B039FFFE3FFFA3202A7DA925>I<1207EA0F80EA1FC0EA3FE0A3EA1F
+C0EA0F80EA0700C7FCA7EAFFE0A3120FB3A3EAFFFEA30F2B7EAA12>I<EAFFE0A3120FB3
+B2EAFFFEA30F2A7EA912>108 D<26FFC07FEB1FC0903AC1FFC07FF0903AC307E0C1F8D8
+0FC49038F101FC9039C803F20001D801FE7F01D05BA201E05BB03CFFFE3FFF8FFFE0A333
+1B7D9A38>I<38FFC07E9038C1FF809038C30FC0D80FC413E0EBC80701D813F013D0A213
+E0B039FFFE3FFFA3201B7D9A25>I<EB3FE03801FFFC3803F07E390FC01F80391F800FC0
+393F0007E0A2007EEB03F0A300FE14F8A8007E14F0A26CEB07E0A2391F800FC0390FC01F
+803907F07F003801FFFC38003FE01D1B7E9A22>I<38FFE1FE9038EFFF809038FE0FE039
+0FF803F09038F001F801E013FC140015FEA2157FA8157E15FEA215FC140101F013F89038
+F807F09038FC0FE09038EFFF809038E1FC0001E0C7FCA9EAFFFEA320277E9A25>I<38FF
+C1F0EBC7FCEBC63E380FCC7F13D813D0A2EBF03EEBE000B0B5FCA3181B7F9A1B>114
+D<3803FE30380FFFF0EA3E03EA7800127000F01370A27E00FE1300EAFFE06CB4FC14C06C
+13E06C13F0000713F8C6FCEB07FC130000E0137C143C7E14387E6C137038FF01E038E7FF
+C000C11300161B7E9A1B>I<13E0A41201A31203A21207120F381FFFE0B5FCA2380FE000
+AD1470A73807F0E0000313C03801FF8038007F0014267FA51A>I<39FFE07FF0A3000F13
+07B2140FA2000713173903F067FF3801FFC738007F87201B7D9A25>I<39FFFC03FFA339
+0FF000F0000714E07F0003EB01C0A2EBFC0300011480EBFE070000140013FFEB7F0EA214
+9EEB3F9C14FC6D5AA26D5AA36D5AA26D5AA2201B7F9A23>I<3BFFFC7FFC1FFCA33B0FE0
+0FE001C02607F007EB0380A201F8EBF00700031600EC0FF801FC5C0001150EEC1FFC2600
+FE1C5B15FE9039FF387E3C017F1438EC787F6D486C5A16F0ECE01F011F5CA26D486C5AA2
+EC800701075CA22E1B7F9A31>I<39FFFC1FFEA33907F003803803F8079038FC0F003801
+FE1E00005BEB7F3814F86D5A6D5A130F806D7E130F497EEB3CFEEB38FFEB787F9038F03F
+803901E01FC0D803C013E0EB800F39FFF03FFFA3201B7F9A23>I<39FFFC03FFA3390FF0
+00F0000714E07F0003EB01C0A2EBFC0300011480EBFE070000140013FFEB7F0EA2149EEB
+3F9C14FC6D5AA26D5AA36D5AA26D5AA25CA21307003890C7FCEA7C0FEAFE0E131E131C5B
+EA74F0EA3FE0EA0F8020277F9A23>I E
+%EndDVIPSBitmapFont
+%DVIPSBitmapFont: Ft cmtt10 10.95 90
+/Ft 90 127 df<127012F8B012701200A5127012F8A31270051C779B18>33
+D<EA4010EAE038EAF078EAE038AAEA60300D0E7B9C18>I<EA0306EA078FA6387FFFC0B5
+12E0A26C13C0380F1E00A6387FFFC0B512E0A26C13C0381E3C00A6EA0C18131C7E9B18>
+I<13C01201A3EA03F0EA0FFCEA3FFEEA7DCFEA71C738E1C38013C7A338F1C0001279123F
+6C7EEA0FF8EA01FC13DE13CF13C73861C38012F1A212E1EBC7001271EA79DEEA3FFEEA1F
+F8EA07E0EA01C0A3120011247D9F18>I<EA3803387C0780A2EAEE0F1400A25B131EA213
+3EEA7C3CA2EA387CEA0078A213F85B12015BA212035BA21207EB8380EB87C0120FEB0EE0
+A2121F121EA2123E383C07C0A23818038013247E9F18>I<EA01C0EA07E0487EEA0E7048
+7EA4EB73F813F313E3380FC1C0EBC38013831303381F0700EA3F87EA7B8EEA71CEEAE1FC
+12E0137CEB7870A2EA70FE387FFFE0EA3FC7380F03C0151C7F9B18>I<1238127CA2127E
+123E120EA3121CA2123812F812F012C0070E789B18>I<137013F0EA01E0EA03C0EA0780
+EA0F00121E121C5AA25AA45AA81270A47EA27E121E7EEA0780EA03C0EA01F0120013700C
+24799F18>I<126012F012787E7E7EEA07801203EA01C0A2EA00E0A41370A813E0A4EA01
+C0A2EA03801207EA0F00121E5A5A5A12600C247C9F18>I<EA01C0A4EA41C138F1C780EA
+FDDF387FFF00EA1FFCEA07F0A2EA1FFCEA7FFF38FDDF80EAF1C73841C100EA01C0A41114
+7D9718>I<136013F0A7387FFFC0B512E0A26C13C03800F000A7136013147E9718>I<121C
+123E127E127F123F121F1207120E121E127C12F81260080C788518>I<387FFFC0B512E0
+A26C13C013047E8F18>I<1230127812FCA2127812300606778518>I<1303EB0780A2130F
+14005B131EA2133E133C137C1378A213F85B12015B12035BA212075B120F90C7FCA25A12
+1E123E123CA2127C127812F85AA2126011247D9F18>I<EA01F0EA07FC487EEA1F1FEA1C
+0738380380007813C0EA7001A238E000E0A9EAF001007013C0A2EA780300381380381C07
+00EA1F1FEA0FFE6C5AEA01F0131C7E9B18>I<EA01801203A21207120F123F12FF12FB12
+431203B0EA7FFCEAFFFEEA7FFC0F1C7B9B18>I<EA03F0EA0FFEEA3FFF387C0F80387003
+C0EAE00138F000E0A21260C7FCA2EB01C0A21303EB0780EB0F00131E5B5B5B485AEA07C0
+485A381E00E05AEA7FFFB5FC7E131C7E9B18>I<131F5B1377A213E7120113C7EA038712
+071307120E121E123C1238127812F0B512F8A338000700A6EB7FF0A3151C7F9B18>52
+D<383FFF80A30038C7FCA8EA3BF8EA3FFE7F383C0780383003C0EA0001EB00E0A2126012
+F0A238E001C0EA7003387C0F80383FFF00EA1FFCEA03F0131C7E9B18>I<137E48B4FC00
+071380380F83C0EA1E03121C3838018090C7FC5AA2EAE1F8EAE7FEB5FC38FE078038F803
+C0EAF001EB00E05AA21270A3383801C0EA3C03381E0780380FFF006C5AEA01F8131C7E9B
+18>I<12E0B512E0A214C038E00380EB0700C65A131E131C5BA25B13F05BA2485AA3485A
+A448C7FCA7131D7E9C18>I<EA03F8EA0FFE487E383E0F80EA3803387001C0A438380380
+EA3C07381FFF00EA07FC487EEA1F1F383C0780387001C000F013E0EAE000A4387001C0EA
+7803383E0F80381FFF006C5AEA03F8131C7E9B18>I<1230127812FCA2127812301200A8
+1230127812FCA2127812300614779318>58 D<1218123C127EA2123C12181200A8121812
+3C127EA2123E121E120E121C123C127812F01260071A789318>I<14C0EB03E01307EB1F
+C0EB3F80EBFE00485AEA07F0485AEA3F8048C7FC12FCA2127F6C7EEA0FE06C7EEA01FC6C
+7EEB3F80EB1FC0EB07E01303EB00C013187E9918>I<387FFFC0B512E0A26C13C0C8FCA4
+387FFFC0B512E0A26C13C0130C7E9318>I<126012F87E127F6C7EEA0FE06C7EEA01FC6C
+7EEB3F80EB1FC0EB07E0A2EB1FC0EB3F80EBFE00485AEA07F0485AEA3F8048C7FC12FC5A
+126013187E9918>I<EA0FF0EA3FFC48B4FCEA700F38F00380A2EA600738000F00133E5B
+EA01F05B485AA55BC8FCA5EA0380487EA36C5A111C7D9B18>I<137CEA01FEEA07FF380F
+8780381E03C0EA3C1DEA387F3870FFE0EA71E313C112E1EAE380A638E1C1C0127113E338
+70FF8038387F00EA3C1C381E00E0EA0F833807FFC00001138038007E00131C7E9B18>I<
+137013F8A213D8A2EA01DCA3138CEA038EA4EA0707A5380FFF80A3EA0E03381C01C0A338
+7F07F000FF13F8007F13F0151C7F9B18>I<EA7FFCB5FC6C1380381C03C01301EB00E0A4
+130114C01307381FFF80140014C0EA1C03EB00E014F01470A414F014E01303387FFFC0B5
+1280387FFE00141C7F9B18>I<EBF8E0EA03FEEA07FFEA0F07EA1E03EA3C01EA38005AA2
+14005AA8127014E0A27E123C381E01C0EA0F073807FF803803FE00EA00F8131C7E9B18>
+I<EA7FF8EAFFFE6C7E381C0F80EB03C0A2EB01E01300A214F01470A814F014E0A2130114
+C01303EB0F80387FFF00485AEA7FF8141C7F9B18>I<B512F0A3381C0070A41400A2130E
+A3EA1FFEA3EA1C0EA390C7FCA21438A5B512F8A3151C7F9B18>I<B512F8A3381C0038A4
+1400A21307A3EA1FFFA3EA1C07A390C7FCA7EAFFC0A3151C7F9B18>I<3801F1C0EA03FD
+EA0FFFEA1F0FEA1C03123813011270A290C7FC5AA5EB0FF0131F130F387001C0A2130312
+38A2EA1C07EA1F0FEA0FFFEA03FDEA01F1141C7E9B18>I<387F07F038FF8FF8387F07F0
+381C01C0A9EA1FFFA3EA1C01AA387F07F038FF8FF8387F07F0151C7F9B18>I<EA7FFFB5
+12806C1300EA01C0B3A4EA7FFFB512806C1300111C7D9B18>I<3801FFC0A338000E00B3
+12F0A2133CEA7FFCEA3FF0EA0FC0121C7D9B18>I<387F07F038FF87F8387F07F0381C03
+C0EB07801400130E131E5B13385B13F0121DA2EA1FB8A2131C121EEA1C0EA27FA2EB0380
+A2EB01C0387F03F038FF87F8387F03F0151C7F9B18>I<EAFFC0A3001CC7FCB114E0A5B5
+FCA3131C7E9B18>I<38FC01F8EAFE03A2383B06E0A4138EA2EA398CA213DCA3EA38D8A2
+13F81370A21300A638FE03F8A3151C7F9B18>I<387E07F038FF0FF8387F07F0381D81C0
+A313C1121CA213E1A313611371A213311339A31319A2131D130DA3EA7F07EAFF87EA7F03
+151C7F9B18>I<EA0FFE383FFF804813C0EA7803EA700100F013E0EAE000B0EAF0010070
+13C0EA7C07EA7FFF6C1380380FFE00131C7E9B18>I<EAFFFEEBFF8014C0EA1C03EB01E0
+13001470A514E01301EB03C0EA1FFF1480EBFE00001CC7FCA8B47EA3141C7F9B18>I<EA
+0FFE383FFF804813C0EA7803EA700100F013E0EAE000AE1370A2EAF079387039C0EA783F
+EA7FFF6C1380380FFE00EA000FEB0780A2EB03C01301A213227E9B18>I<EA7FF8EAFFFE
+6C7E381C0F80130314C01301A313031480130F381FFF005BA2EA1C0F7FEB0380A5149CA3
+387F01F8EAFF81387F00F0161C7F9B18>I<3803F1C0EA1FFF5AEA7C0FEA7003EAE001A3
+90C7FC12701278123FEA1FF0EA07FEC67EEB0F80EB03C01301EB00E0A2126012E0130100
+F013C038F80780B5FCEBFE00EAE7F8131C7E9B18>I<387FFFF8B5FCA238E07038A40000
+1300B2EA07FFA3151C7F9B18>I<38FF83FEA3381C0070B36C13E0EA0F01380783C03803
+FF806C1300EA007C171C809B18>I<38FE03F8EAFF07EAFE03383C01E0001C13C0A3EA1E
+03000E1380A438070700A4EA038EA4EA018C13DCA3EA00D813F8A21370151C7F9B18>I<
+38FE03F8A338700070A36C13E0A513F8EA39FC13DCA2001913C0A3138CA2EA1D8DA31305
+000D1380EA0F07A2EA0E03151C7F9B18>I<387F0FE0139F130F380E0700120FEA070E13
+8EEA039C13DCEA01F8A212005B137013F07F487E13DCEA039E138EEA070F7F000E138013
+03001E13C0387F07F000FF13F8007F13F0151C7F9B18>I<38FE03F8EAFF07EAFE03381C
+01C0EA1E03000E1380EA0F0700071300A2EA038EA2EA01DCA3EA00F8A21370A9EA01FC48
+7E6C5A151C7F9B18>I<EAFFF8A3EAE000B3ACEAFFF8A30D24779F18>91
+D<126012F0A27E1278127C123CA2123E121E121F7EA27F12077F1203A27F12017F12007F
+1378A2137C133C133E131EA2131F7F14801307A2EB030011247D9F18>I<EAFFF8A3EA00
+38B3ACEAFFF8A30D247F9F18>I<387FFFC0B512E0A26C13C013047E7F18>95
+D<1206121E123E12381270A212E0A312F812FC127CA21238070E789E18>I<EA0FF0EA1F
+FC487EEA3C0FEA180738000380A213FF1207121FEA7F03127812E0A3EAF007EA780F383F
+FFF8EA1FFDEA07F015147E9318>I<127E12FE127E120EA5133EEBFF80000F13C0EBC1E0
+1380EB0070120E1438A6000F1370A2EB80E013C1EBFFC0000E138038063E00151C809B18
+>I<EA01FEEA07FF001F1380EA3E073838030048C7FCA25AA61270EB01C01238EA3E0338
+1FFF8000071300EA01FC12147D9318>I<EB1F80133F131F1303A5EA03E3EA0FFBEA1FFF
+EA3C1FEA380FEA7007130312E0A6EA7007A2EA380FEA3C1F381FFFF0380FFBF83803E3F0
+151C7E9B18>I<EA01F0EA07FCEA1FFEEA3E0F38380780EA7003A238E001C0A2B5FCA300
+E0C7FC1270EB01C01238EA3E07381FFF8000071300EA01F812147D9318>I<EB1F80EB7F
+C0EBFFE013E13801C0C01400A3387FFFC0B5FCA23801C000AEEA7FFFA3131C7F9B18>I<
+3801E1F03807FFF85A381E1E30381C0E00487EA5EA1C0EEA1E1EEA1FFC5BEA39E00038C7
+FC7EEA1FFEEBFFC04813E0387801F038700070481338A4007813F0EA7E03381FFFC06C13
+803801FC00151F7F9318>I<127E12FE127E120EA5133EEBFF80000F13C013C1EB80E013
+00120EAB387FC7FC38FFE7FE387FC7FC171C809B18>I<EA0380EA07C0A3EA0380C7FCA4
+EA7FC012FF127F1201AEB5FCA3101D7C9C18>I<1338137CA313381300A4EA0FFCA3EA00
+1CB3A4EA6038EAF078EAFFF0EA7FE0EA3F800E277E9C18>I<127E12FE127E120EA5EB3F
+F0A3EB0780EB0F00131E5B5B5BEA0FF87F139C130EEA0E0F7FEB038014C0387FC7F812FF
+127F151C7F9B18>I<EAFFC0A31201B3A4B51280A3111C7D9B18>I<38F9C1C038FFF7F013
+FF383E3E38EA3C3CA2EA3838AB38FE3E3EEB7E7EEB3E3E1714809318>I<EA7E3E38FEFF
+80007F13C0EA0FC1EB80E01300120EAB387FC7FC38FFE7FE387FC7FC1714809318>I<EA
+01F0EA0FFE487E383E0F80EA3803387001C0A238E000E0A5EAF001007013C0EA7803383C
+0780EA3E0F381FFF006C5AEA01F013147E9318>I<EA7E3E38FEFF80007F13C0380FC1E0
+1380EB0070120E1438A6000F1370A2EB80E013C1EBFFC0000E1380EB3E0090C7FCA7EA7F
+C0487E6C5A151E809318>I<3801F380EA07FBEA1FFFEA3E1FEA380FEA7007A2EAE003A6
+EA7007A2EA380FEA3C1FEA1FFFEA0FFBEA03E3EA0003A7EB1FF0EB3FF8EB1FF0151E7E93
+18>I<38FF0FC0EB3FE0EB7FF0EA07F0EBE060EBC0005BA290C7FCA9EAFFFC7F5B14147E
+9318>I<EA07F7EA3FFF5AEA780FEAE007A3007CC7FCEA7FE0EA1FFCEA03FEEA001F3860
+0780EAE003A212F038F80F00B5FC13FCEAE7F011147D9318>I<487E1203A4387FFFC0B5
+FCA238038000A9144014E0A33801C1C013FF6C1380EB3E0013197F9818>I<387E07E0EA
+FE0FEA7E07EA0E00AC1301EA0F033807FFFC6C13FE3801FCFC1714809318>I<387F8FF0
+00FF13F8007F13F0381C01C0380E0380A338070700A3138FEA038EA3EA01DCA3EA00F8A2
+137015147F9318>I<38FF07F8138F1307383800E0A4381C01C0137113F9A213D9EA1DDD
+000D1380A3138DEA0F8FA23807070015147F9318>I<387F8FF0139F138F380F0700EA07
+8EEA039EEA01DC13F81200137013F07FEA01DCEA039E138EEA0707000E1380387F8FF000
+FF13F8007F13F015147F9318>I<387F8FF000FF13F8007F13F0380E01C0EB0380A21207
+EB0700A2EA0387A2138EEA01CEA213CC120013DC1378A31370A313F05B1279EA7BC0EA7F
+806CC7FC121E151E7F9318>I<383FFFF05AA2387001E0EB03C0EB078038000F00131E5B
+13F8485AEA03C0485A380F0070121E5A5AB512F0A314147F9318>I<EB07E0131F137FEB
+780013E0AB1201EA7FC0485AA26C7EEA01E01200AB1378EB7FE0131F130713247E9F18>
+I<126012F0B3B012600424769F18>I<127CB4FC13C01203C67EAB7FEB7FC0EB3FE0A2EB
+7FC0EBF0005BABEA03C012FF90C7FC127C13247E9F18>I<EA060CEA1F1EEA3FBEEAFBF8
+EAF1F0EA60C00F067C9B18>I E
+%EndDVIPSBitmapFont
+%DVIPSBitmapFont: Fu cmr10 10.95 78
+/Fu 78 123 df<90381F83E09038F06E303901C07878380380F8903800F03048EB7000A7
+B612803907007000B2383FE3FF1D20809F1B>11 D<133FEBE0C0EA01C0380381E0EA0701
+A290C7FCA6B512E0EA0700B2383FC3FC1620809F19>I<EB3FE013E0EA01C1EA0381EA07
+00A8B5FCEA0700B2383FE7FC1620809F19>I<90381F81F89038F04F043901C07C063903
+80F80FEB00F05A0270C7FCA6B7FC3907007007B23A3FE3FE3FE02320809F26>I<EA7038
+EAF87CEAFC7EA2EA743AEA0402A3EA0804A2EA1008A2EA2010EA40200F0E7F9F17>34
+D<1340A2EA03F0EA0C4EEA10413820408012600040134038C041C01343A238E04180EB40
+001270127CEA3FC0EA1FF86C7EEA03FEEA007FEB4F801343EB41C0A2EAF040A312801480
+EA404100201300EA3042EA0C4CEA03F0EA0040A312257EA117>36
+D<127012F812FCA212741204A31208A21210A212201240060E7C9F0D>39
+D<13401380EA01005A12061204120C5AA212381230A212701260A412E0AC1260A4127012
+30A212381218A27E120412067E7EEA008013400A2E7BA112>I<7E12407E12307E120812
+0C7EA212077EA213801201A413C0AC1380A412031300A25A1206A25A120812185A12205A
+5A0A2E7EA112>I<127012F012F8A212781208A31210A31220A21240050E7C840D>44
+D<EAFFF0A20C02808A0F>I<127012F8A3127005057C840D>I<144014C0EB0180A3EB0300
+A31306A25BA35BA35BA25BA35BA3485AA348C7FCA21206A35AA35AA25AA35AA35AA2122D
+7EA117>I<EA03F0EA0E1C487EEA1806EA380738700380A400F013C0AD00701380A3EA78
+0700381300EA1806EA1C0E6C5AEA03F0121F7E9D17>I<13801203120F12F31203B3A6EA
+07C0EAFFFE0F1E7C9D17>I<EA03F0EA0C1CEA100E487E00401380128000F013C0EAF803
+A3EA200712001480A2EB0F00130E5B5B5B13605B485A48C7FC000613405A5A00101380EA
+3FFF5AB5FC121E7E9D17>I<EA03F0EA0C1CEA100EEA200F007813801307A2EA380F1200
+1400A2131E131C1370EA07F0EA003C130E130FEB0780A214C0122012F8A300F013801240
+EB0F00EA200EEA183CEA07F0121F7E9D17>I<1306A2130EA2131E132EA2134E138EA2EA
+010E1202A212041208A212101220A2124012C0B512F038000E00A7EBFFE0141E7F9D17>
+I<EA1803EA1FFE5B5B13E00010C7FCA6EA11F0EA161CEA180EEA10071480EA0003A214C0
+A3127012F0A200E013801240EB0700EA20066C5AEA0838EA07E0121F7E9D17>I<137CEA
+0182EA0701380E0380EA0C0712183838030090C7FC12781270A2EAF1F0EAF21CEAF406EA
+F807EB0380A200F013C0A51270A214801238EB07001218EA0C0E6C5AEA01F0121F7E9D17
+>I<1240387FFFE014C0A23840008038800100A21302485AA25B5BA25BA21360A213E05B
+1201A41203A76C5A131F7E9D17>I<EA03F0EA0C0CEA1006EA3003382001801260A31270
+38780300123EEA3F06EA1FC8EA0FF0EA03F8487EEA0C7EEA103F38300F80EA6007EB01C0
+12C01300A31480EA600100201300EA1002EA0C0CEA03F0121F7E9D17>I<EA03F0EA0E18
+487E487E13071270EB038012F0A214C0A5EA7007A21238EA180BEA0E13EA03E338000380
+A3EB07001230EA7806130EEA700CEA2018EA1070EA0FC0121F7E9D17>I<127012F8A312
+701200AA127012F8A3127005147C930D>I<127012F8A312701200AA127012F012F8A212
+781208A31210A31220A21240051D7C930D>I<5B497EA3497EA3EB09E0A3EB10F0A3EB20
+78A3497EA2EBC03EEB801EA248B5FCEB000FA20002EB0780A348EB03C0A2120C001E14E0
+39FF801FFE1F207F9F22>65 D<B512E0380F0078141EA2801580A515005C141E147CEBFF
+F0EB007C141FEC0F80EC07C0140315E0A515C014071580EC0F00143EB512F01B1F7E9E20
+>I<90380FE0109038381C309038E002703803C00139078000F048C71270121E15305A15
+10127C127800F81400A91278007C1410123CA26C1420A27E6C6C13406C6C13803900E003
+00EB380CEB0FF01C217E9F21>I<B512F83807801EEC0780EC03C0EC01E0EC00F0157015
+78A2153CA3153EA8153CA2157C1578A215F0EC01E0EC03C0EC0780EC1E00B512F81F1F7F
+9E23>I<B61280380F000F14031401140015C01540A314401500A214C0130113FF130113
+001440A3EC0020A31540A315C01401EC0380140FB6FC1B1F7E9E1F>I<B6128038078007
+1401A2140015C01540A4EC2000A3146014E013FF138014601420A391C7FCA87FEAFFFE1A
+1F7F9E1E>I<90380FE0109038381C309038E002703803C00139078000F048C71270121E
+15305A1510127C127800F81400A7EC3FFEEC01F000781300127C123CA27EA27E6C7E3903
+C001703900E002309038380C1090380FF0001F217E9F24>I<39FFF07FF8390F000780AD
+90B5FCEB0007AF39FFF07FF81D1F7E9E22>I<EAFFF0EA0F00B3ABEAFFF00C1F7E9E10>I<
+3807FFC038003E00131EB3A3122012F8A3EAF01CEA403CEA6038EA1070EA0FC012207F9E
+17>I<39FFF007FC390F0003E0EC0180150014025C5C5C5C5C5C49C7FC5B497E130FEB13
+C0EB21E01341EB80F0EB0078A28080A280EC0780A2EC03C015E015F039FFF01FFE1F1F7E
+9E23>I<EAFFF8EA0F8090C7FCB21402A414061404A2140C141C147CB512FC171F7E9E1C>
+I<B46CEB07FE000715C0A2D805C0130BA2D804E01313A301701323A26D1343A36D1383A2
+90380E0103A3EB0702A3EB0384A2EB01C8A3EB00F0A21460121FD8FFE0EB7FFE271F7F9E
+2A>I<B4EB0FF8390F8003E0EC0080EA0BC0EA09E0A2EA08F01378A27F7FA27FEB0780A2
+EB03C0EB01E0A2EB00F01478A2143C141EA2140F1407A214031401123E38FF80001D1F7E
+9E22>I<EB1FE0EB70383801C00E48487E39070003804814C0001EEB01E048EB00F0A200
+7C14F8A20078147800F8147CA900781478007C14F8A2003C14F0003E1301001E14E06CEB
+03C06C148039038007003801E01E38007038EB1FE01E217E9F23>I<B512E0380F007C14
+1E80EC0780A215C0A41580A2EC0F00141E147CEBFFE090C8FCAEEAFFF01A1F7E9E1F>I<
+B57E380F00F0143C8080A21580A41500A2141E5C14F0EBFF80EB01C0EB0070A280143CA3
+143EA31504143F141FEC0F0839FFF00788C7EA01F01E207E9E21>82
+D<3803F040380C0CC0EA1803EA3001EA6000A212E01440A36C13007E127CEA7F80EA3FF8
+6CB4FC00071380C613C0EB1FE013031301EB00F014707EA46C136014E06C13C038F80180
+38C60300EA81FC14217E9F19>I<007FB512E038780F010060EB006000401420A200C014
+3000801410A400001400B3497E3803FFFC1C1F7E9E21>I<39FFF00FF8390F0003E0EC00
+80B3A46CEB01001380120314026C6C5A6C6C5AEB3830EB0FC01D207E9E22>I<39FFF003
+FE391F8000F86CC7126015206C6C1340A36C6C1380A2EBE00100011400A23800F002A213
+F8EB7804A26D5AA36D5AA2131F6D5AA2EB07C0A36D5AA36DC7FC1F207F9E22>I<3BFFF0
+7FF81FF03B1F000FC007C06C903907800180170015C001805C00071502EC09E013C00003
+5DEC19F01410D801E05CA2EC2078D800F05CA2EC403C01785CA2EC801E017C1460013C14
+4090383D000F133F6D5CA2011E1307010E91C7FCA2010C7F010413022C207F9E2F>I<39
+FFF001FF391F800078000F146012076D1340000314807F3901F001001200EBF802EB7C06
+EB3C04EB3E08131EEB1F10EB0FB0EB07A014E06D5AACEB3FFC201F7F9E22>89
+D<12FFA212C0B3B3A512FFA2082D7CA10D>91 D<EA0804EA1008EA2010A2EA4020A2EA80
+40A3EAB85CEAFC7EA2EA7C3EEA381C0F0E7A9F17>I<12FFA21203B3B3A512FFA2082D80
+A10D>I<120812101220A21240A21280A312B812FCA2127C1238060E7D9F0D>96
+D<EA1FE0EA3030EA7818131CEA300E1200A313FEEA078EEA1E0E1238127800F01310A313
+1E127838386720380F83C014147E9317>I<121C12FC121CAA137CEA1D87381E0180EB00
+C0001C13E01470A21478A6147014F014E0001E13C0381A018038198700EA107C15207E9F
+19>I<EA01FCEA0706EA1C0F123813060078C7FC127012F0A61270127800381380A2381C
+0100EA0706EA01F811147F9314>I<EB01C0130F1301AAEA01F1EA070DEA0C03EA180112
+381278127012F0A61270A21238EA1803120CEA070D3801F1F815207F9F19>I<EA03F0EA
+0E1C487E487EA21270EB038012F0A2B5FC00F0C7FCA31270A26C1380A2381C0100EA0706
+EA01F811147F9314>I<137CEA01C6EA030F1207EA0E061300A7EAFFF0EA0E00B2EA7FE0
+1020809F0E>I<14E03803E330EA0E3CEA1C1C38380E00EA780FA5EA380E6C5AEA1E38EA
+33E00020C7FCA21230A2EA3FFE381FFF8014C0383001E038600070481330A4006013606C
+13C0381C03803803FC00141F7F9417>I<121C12FC121CAA137C1386EA1D03001E1380A2
+121CAE38FF8FF014207E9F19>I<1238127CA31238C7FCA6121C12FC121CB1EAFF80091F
+7F9E0C>I<13E0EA01F0A3EA00E01300A61370EA07F012001370B3A31260EAF06013C0EA
+6180EA3F000C28829E0E>I<121C12FC121CAAEB1FE0EB0780EB060013045B5B5B136013
+E0EA1DF0EA1E70EA1C38133C131C7F130F7F148014C038FF9FF014207E9F18>I<121C12
+FC121CB3ABEAFF8009207F9F0C>I<391C3E03E039FCC30C30391D039038391E01E01CA2
+001C13C0AE3AFF8FF8FF8021147E9326>I<EA1C7CEAFC86EA1D03001E1380A2121CAE38
+FF8FF014147E9319>I<EA01F8EA070E381C0380383801C0A2387000E0A200F013F0A600
+7013E0A2383801C0A2381C038038070E00EA01F814147F9317>I<EA1C7CEAFD87381E01
+8014C0381C00E014F014701478A6147014F014E0381E01C0EB0380381D8700EA1C7C90C7
+FCA8B47E151D7E9319>I<3801F04038070CC0EA0E02EA1C03EA38011278127012F0A612
+7012781238EA1C03EA0C05EA0709EA01F1EA0001A8EB0FF8151D7F9318>I<EA1CF0EAFD
+18EA1E3CA21318EA1C00AEEAFFC00E147E9312>I<EA0FC8EA3038EA6018EAC008A3EAE0
+00127CEA3FE0EA1FF0EA07F8EA003CEA800E130612C0A21304EAE00CEAD818EA87E00F14
+7F9312>I<1202A31206A2120EA2123EEAFFF8EA0E00AB1304A5EA07081203EA01F00E1C
+7F9B12>I<381C0380EAFC1FEA1C03AE1307120CEA061B3803E3F014147E9319>I<38FF83
+F8383E00E0001C13C06C1380A338070100A21383EA0382A2EA01C4A213E4EA00E8A21370
+A3132015147F9318>I<39FF9FE1FC393C078070391C030060EC8020000E1440A214C0D8
+0704138014E0A239038861001471A23801D032143A143E3800E01CA2EB6018EB40081E14
+7F9321>I<38FF87F8381E03C0380E0180EB0300EA0702EA0384EA01C813D8EA00F01370
+137813F8139CEA010E1202EA060738040380000C13C0003C13E038FE07FC16147F9318>
+I<38FF83F8383E00E0001C13C06C1380A338070100A21383EA0382A2EA01C4A213E4EA00
+E8A21370A31320A25BA3EAF080A200F1C7FC1262123C151D7F9318>I<EA7FFFEA700E12
+60EA401C133813781370EA00E0120113C0EA038012071301120E121EEA1C03EA3802EA70
+06130EEAFFFE10147F9314>I E
+%EndDVIPSBitmapFont
+%DVIPSBitmapFont: Fv cmbx12 20.736 14
+/Fv 14 122 df<DB1FFC14C00203B5EAC001021FECF003027FECFC07903B01FFFC00FE0F
+010701C0EB1F9F4948C7EA07FFD93FF880494814004948157F485B4A153F4890C9121F48
+5A000F170F5B001F1707A2485A1803A2127FA24993C8FCA212FFAA041FB61280127FA27F
+DC0001EBC000123FA36C7EA26C7EA26C7E7E6C7F806C7F6D6C5CEB3FFCD90FFF5C6D01C0
+EB1FBF010101FCEBFF1F6D6CB5EAFE0F021FECF8030203ECE0009126001FFEC9FC413D7B
+BB4C>71 D<B612FEA426007FF0C9FCB3ADEF03C0A517071880A3170FA3171FA2173F177F
+17FF5E04071300163FB9FCA4323B7DBA3A>76 D<B500F00207B512E0808080D8007F9239
+0007E0006E6F5A81017B7F81137901787F6E7E6E7E81141F6E7E6E7F6E7F82806E7F6F7E
+6F7E826F7E816F13806F13C017E06F13F081EE7FF8EE3FFC17FEEE1FFF827013837013C3
+18E37013F382EF7FFBEF3FFFA283838383A28383187F183FA201FC161FB500FC150F1807
+1803A2433B7CBA4C>78 D<B712F8EEFFC017F817FE3B007FF0001FFF040313C004007F71
+7E717EA284171FA284A660A2173F604D5A604C485A4C5BDC1FFEC8FC91B612F817C0A291
+39F0007FF0EE1FF8707E707E707E8482A284A584A5F101E0A27013F0A2F103C0EF7FF8B6
+00F890393FFC078094381FFE0F0507B51200050113FCCBEA1FF0433C7CBA48>82
+D<B600F80107B512E0A426007FF0C83807E000725AB3B3A3013F4C5AA280011F4CC7FCA2
+6D6C151E0107163E6E5D6D6C5D6D6D13019026007FE0EB0FE0DA3FFCEB7FC0020FB65A02
+034AC8FCDA007F13F003071380433C7DBA4A>85 D<EB3FFE48B512E0000714F8390FE007
+FC9038F001FE486C6C7E6F7E82153F6C48806C5A6C5AC8FCA491B5FC131F90387FF83F38
+03FF803807FC00EA0FF0485A123F485AA2485AA4157F6C7E15DF3A3FE0039FF03B1FF80F
+0FFFE03807FFFE0001497E39003FE0002B267DA52F>97 D<13FE12FFA412071203B04AB4
+FC021F13F0027F13FC9138FC03FE9039FFF000FF02C0EB3F8091C7EA1FC04915E0EE0FF0
+17F8A2EE07FCA317FEA917FCA3160F17F817F0161F6D15E06EEB3FC06EEB7F80D9F9E0EB
+FF009039F0FC07FE91387FFFF8D9E01F13E09026C003FEC7FC2F3C7DBB36>I<EE3F80ED
+3FFFA4150181B0ECFF80010F13F0013F13FC9038FFC03F3901FE000F4848130348487F48
+487F121F485AA2127F5BA312FFA9127FA36C7EA2121F6C6C5B6C6C5B00035CD801FE011F
+13C02700FF807E13FE90387FFFF8010F13E0010113002F3C7DBB36>100
+D<49B47E010F13F0017F13FC9038FF81FE3A03FE007F80D807F8133F4848EB1FC0ED0FE0
+485A003F15F01507485A16F8A212FFA290B6FCA301C0C8FCA4127FA36C7E1678121F7F00
+0F15F06C6C13016C6CEB03E06C6CEB0FC03A00FFC07F8090393FFFFE00010F13F8010013
+C025267DA52C>I<EA01E0EA07F8487EA2487EA46C5AA26C5AEA01E0C8FCAB13FE127FA4
+12071203B3AAB512F0A4143D7DBC1A>105 D<13FE12FFA412071203B3B3AEB512F8A415
+3C7DBB1A>108 D<D801FCEBFF8000FF010313F0020F7F91381E03FC91383801FE000701
+607F0003497E01FD15805C01FFC7FCA35BB3A4B5D8F83F13FEA42F267CA536>110
+D<3901FC03F000FFEB0FFC4AB4FC91383C3F80EC707F00079038E0FFC000035BEBFD80A2
+01FFEB7F809138003F00151E92C7FC5BB3A3B512FCA422267DA528>114
+D<B500F0EBFFFCA4D803FEC7EA1F806D15006C151E806C5DA26E137C017F14786E13F801
+3F5CECF001011F5CECF803010F5CA2ECFC0701075CECFE0F010391C7FC6E5A6D131E15BE
+6D13BC15FC6E5AA36E5AA26E5AA26E5AA26E5AA2140F92C8FC5C141E0008133E007F133C
+147C38FF807814F8EB81F0EB83E06C485A387C1F80D83FFFC9FCEA1FFCEA07F02E377EA5
+33>121 D E
+%EndDVIPSBitmapFont
+end
+%%EndProlog
+%%BeginSetup
+%%Feature: *Resolution 300dpi
+TeXDict begin
+%%BeginPaperSize: Letter
+letter
+%%EndPaperSize
+
+%%EndSetup
+%%Page: 1 1
+1 0 bop 75 693 a Fv(GNU)33 b(Readline)h(Library)p 75
+743 1800 17 v 936 791 a Fu(Edition)17 b(4.1,)c(for)i
+Ft(Readline)f(Library)g Fu(V)l(ersion)i(4.1.)1609 845
+y(Jan)o(uary)f(2000)75 2467 y Fs(Brian)23 b(F)-6 b(o)n(x,)23
+b(F)-6 b(ree)23 b(Soft)n(w)n(are)f(F)-6 b(oundation)75
+2534 y(Chet)22 b(Ramey)-6 b(,)23 b(Case)e(W)-6 b(estern)23
+b(Reserv)n(e)f(Univ)n(ersit)n(y)p 75 2570 1800 9 v eop
+%%Page: 2 2
+2 1 bop 75 250 a Fu(This)14 b(do)q(cumen)o(t)h(describ)q(es)g(the)f
+(GNU)g(Readline)i(Library)l(,)e(a)g(utilit)o(y)h(whic)o(h)f(aids)g(in)h
+(the)f(consistency)75 305 y(of)h(user)g(in)o(terface)h(across)e
+(discrete)i(programs)e(that)h(need)h(to)e(pro)o(vide)i(a)f(command)g
+(line)i(in)o(terface.)75 373 y(Published)g(b)o(y)f(the)f(F)l(ree)g
+(Soft)o(w)o(are)f(F)l(oundation)75 427 y(59)h(T)l(emple)h(Place,)f
+(Suite)i(330,)75 482 y(Boston,)d(MA)h(02111)f(USA)75
+549 y(P)o(ermission)j(is)f(gran)o(ted)g(to)f(mak)o(e)h(and)g
+(distribute)i(v)o(erbatim)d(copies)i(of)f(this)h(man)o(ual)f(pro)o
+(vided)h(the)75 604 y(cop)o(yrigh)o(t)e(notice)h(and)f(this)h(p)q
+(ermission)g(notice)g(are)f(preserv)o(ed)h(on)f(all)h(copies.)75
+671 y(P)o(ermission)c(is)h(gran)o(ted)e(to)g(cop)o(y)h(and)g
+(distribute)h(mo)q(di\014ed)g(v)o(ersions)f(of)f(this)h(man)o(ual)g
+(under)h(the)f(con-)75 726 y(ditions)k(for)e(v)o(erbatim)h(cop)o(ying,)
+g(pro)o(vided)h(that)e(the)h(en)o(tire)h(resulting)g(deriv)o(ed)g(w)o
+(ork)e(is)h(distributed)75 781 y(under)h(the)f(terms)g(of)g(a)f(p)q
+(ermission)j(notice)f(iden)o(tical)h(to)e(this)g(one.)75
+848 y(P)o(ermission)i(is)g(gran)o(ted)f(to)g(cop)o(y)h(and)f
+(distribute)i(translations)f(of)f(this)h(man)o(ual)g(in)o(to)f(another)
+g(lan-)75 903 y(guage,)e(under)h(the)f(ab)q(o)o(v)o(e)g(conditions)i
+(for)d(mo)q(di\014ed)j(v)o(ersions,)e(except)h(that)f(this)h(p)q
+(ermission)g(notice)75 958 y(ma)o(y)f(b)q(e)i(stated)f(in)h(a)f
+(translation)g(appro)o(v)o(ed)g(b)o(y)g(the)g(F)l(ree)h(Soft)o(w)o(are)
+d(F)l(oundation.)75 2661 y(Cop)o(yrigh)o(t)301 2660 y(c)289
+2661 y Fr(\015)i Fu(1988-1999)e(F)l(ree)i(Soft)o(w)o(are)f(F)l
+(oundation,)h(Inc.)p eop
+%%Page: 1 3
+1 2 bop 75 -58 a Fu(Chapter)15 b(1:)k(Command)c(Line)i(Editing)1077
+b(1)75 183 y Fq(1)41 b(Command)28 b(Line)e(Editing)137
+299 y Fu(This)16 b(c)o(hapter)f(describ)q(es)i(the)e(basic)h(features)f
+(of)g(the)g Fp(gnu)g Fu(command)g(line)i(editing)f(in)o(terface.)75
+426 y Fs(1.1)33 b(In)n(tro)r(duction)24 b(to)e(Line)i(Editing)137
+522 y Fu(The)16 b(follo)o(wing)g(paragraphs)e(describ)q(e)j(the)e
+(notation)g(used)h(to)e(represen)o(t)i(k)o(eystrok)o(es.)137
+589 y(The)h(text)327 587 y Fo(h)p 339 561 56 2 v 339
+589 a Fn(C-k)p 339 597 V 393 587 a Fo(i)424 589 y Fu(is)f(read)g(as)g
+(`Con)o(trol-K')f(and)h(describ)q(es)i(the)e(c)o(haracter)g(pro)q
+(duced)h(when)f(the)1831 587 y Fo(h)p 1844 561 19 2 v
+1844 589 a Fn(k)p 1844 597 V 1860 587 a Fo(i)75 644 y
+Fu(k)o(ey)f(is)h(pressed)g(while)g(the)f(Con)o(trol)g(k)o(ey)g(is)h
+(depressed.)137 711 y(The)f(text)325 709 y Fo(h)p 337
+683 63 2 v 337 711 a Fn(M-k)p 337 719 V 397 709 a Fo(i)427
+711 y Fu(is)g(read)g(as)f(`Meta-K')g(and)h(describ)q(es)i(the)e(c)o
+(haracter)f(pro)q(duced)i(when)f(the)g(Meta)75 766 y(k)o(ey)f(\(if)g(y)
+o(ou)g(ha)o(v)o(e)g(one\))g(is)h(depressed,)g(and)f(the)930
+764 y Fo(h)p 942 738 19 2 v 942 766 a Fn(k)p 942 774
+V 958 764 a Fo(i)987 766 y Fu(k)o(ey)g(is)h(pressed.)20
+b(The)15 b(Meta)e(k)o(ey)h(is)h(lab)q(eled)1779 764 y
+Fo(h)p 1791 738 72 2 v 1791 766 a Fn(AL)m(T)p 1791 774
+V 1860 764 a Fo(i)75 821 y Fu(on)e(man)o(y)g(k)o(eyb)q(oards.)19
+b(On)13 b(k)o(eyb)q(oards)g(with)h(t)o(w)o(o)e(k)o(eys)g(lab)q(eled)
+1213 819 y Fo(h)p 1225 793 V 1225 821 a Fn(AL)m(T)p 1225
+828 V 1294 819 a Fo(i)1322 821 y Fu(\(usually)i(to)e(either)i(side)g
+(of)f(the)75 876 y(space)j(bar\),)f(the)388 874 y Fo(h)p
+400 847 V 400 876 a Fn(AL)m(T)p 400 883 V 469 874 a Fo(i)499
+876 y Fu(on)h(the)g(left)g(side)g(is)g(generally)h(set)f(to)f(w)o(ork)g
+(as)g(a)g(Meta)g(k)o(ey)l(.)22 b(The)1697 874 y Fo(h)p
+1709 847 V 1709 876 a Fn(AL)m(T)p 1709 883 V 1778 874
+a Fo(i)1808 876 y Fu(k)o(ey)75 930 y(on)17 b(the)f(righ)o(t)h(ma)o(y)f
+(also)h(b)q(e)g(con\014gured)g(to)f(w)o(ork)g(as)g(a)h(Meta)f(k)o(ey)g
+(or)g(ma)o(y)g(b)q(e)i(con\014gured)f(as)f(some)75 985
+y(other)f(mo)q(di\014er,)h(suc)o(h)f(as)g(a)g(Comp)q(ose)g(k)o(ey)g
+(for)f(t)o(yping)i(accen)o(ted)f(c)o(haracters.)137 1052
+y(If)c(y)o(ou)g(do)g(not)f(ha)o(v)o(e)h(a)f(Meta)h(or)694
+1050 y Fo(h)p 706 1024 V 706 1052 a Fn(AL)m(T)p 706 1060
+V 775 1050 a Fo(i)801 1052 y Fu(k)o(ey)l(,)g(or)g(another)f(k)o(ey)h(w)
+o(orking)f(as)h(a)f(Meta)h(k)o(ey)l(,)g(the)g(iden)o(tical)75
+1107 y(k)o(eystrok)o(e)f(can)i(b)q(e)f(generated)h(b)o(y)f(t)o(yping)
+809 1105 y Fo(h)p 821 1079 70 2 v 821 1107 a Fn(ESC)p
+821 1115 V 888 1105 a Fo(i)915 1107 y Fm(\014rst)p Fu(,)g(and)g(then)h
+(t)o(yping)1339 1105 y Fo(h)p 1351 1079 19 2 v 1351 1107
+a Fn(k)p 1351 1115 V 1368 1105 a Fo(i)1383 1107 y Fu(.)18
+b(Either)12 b(pro)q(cess)f(is)h(kno)o(wn)75 1162 y(as)j
+Fm(metafying)k Fu(the)425 1160 y Fo(h)p 437 1134 V 437
+1162 a Fn(k)p 437 1169 V 454 1160 a Fo(i)484 1162 y Fu(k)o(ey)l(.)137
+1229 y(The)h(text)334 1227 y Fo(h)p 347 1201 100 2 v
+347 1229 a Fn(M-C-k)p 347 1236 V 444 1227 a Fo(i)479
+1229 y Fu(is)g(read)g(as)f(`Meta-Con)o(trol-k')f(and)i(describ)q(es)h
+(the)f(c)o(haracter)f(pro)q(duced)i(b)o(y)75 1283 y Fm(metafying)291
+1281 y Fo(h)p 303 1255 56 2 v 303 1283 a Fn(C-k)p 303
+1291 V 357 1281 a Fo(i)372 1283 y Fu(.)137 1350 y(In)e(addition,)h(sev)
+o(eral)f(k)o(eys)f(ha)o(v)o(e)g(their)h(o)o(wn)f(names.)30
+b(Sp)q(eci\014cally)l(,)1384 1348 y Fo(h)p 1396 1322
+73 2 v 1396 1350 a Fn(DEL)p 1396 1358 V 1467 1348 a Fo(i)1482
+1350 y Fu(,)1514 1348 y Fo(h)p 1526 1322 70 2 v 1526
+1350 a Fn(ESC)p 1526 1358 V 1593 1348 a Fo(i)1608 1350
+y Fu(,)1640 1348 y Fo(h)p 1652 1322 72 2 v 1652 1350
+a Fn(LFD)p 1652 1358 V 1722 1348 a Fo(i)1737 1350 y Fu(,)1768
+1348 y Fo(h)p 1780 1322 70 2 v 1780 1350 a Fn(SPC)p 1780
+1358 V 1847 1348 a Fo(i)1862 1350 y Fu(,)75 1403 y Fo(h)p
+87 1377 76 2 v 87 1405 a Fn(RET)p 87 1413 V 160 1403
+a Fo(i)175 1405 y Fu(,)23 b(and)306 1403 y Fo(h)p 318
+1377 74 2 v 318 1405 a Fn(T)m(AB)p 318 1413 V 390 1403
+a Fo(i)427 1405 y Fu(all)f(stand)g(for)f(themselv)o(es)h(when)h(seen)f
+(in)g(this)g(text,)h(or)e(in)i(an)e(init)i(\014le)g(\(see)75
+1460 y(Section)d(1.3)f([Readline)i(Init)f(File],)h(page)e(4\).)32
+b(If)19 b(y)o(our)g(k)o(eyb)q(oard)h(lac)o(ks)f(a)1444
+1458 y Fo(h)p 1456 1432 72 2 v 1456 1460 a Fn(LFD)p 1456
+1468 V 1526 1458 a Fo(i)1560 1460 y Fu(k)o(ey)l(,)h(t)o(yping)1802
+1458 y Fo(h)p 1814 1432 49 2 v 1814 1460 a Fn(C-j)p 1814
+1468 V 1860 1458 a Fo(i)75 1515 y Fu(will)c(pro)q(duce)g(the)f(desired)
+h(c)o(haracter.)j(The)874 1513 y Fo(h)p 886 1487 76 2
+v 886 1515 a Fn(RET)p 886 1522 V 959 1513 a Fo(i)989
+1515 y Fu(k)o(ey)c(ma)o(y)f(b)q(e)h(lab)q(eled)1385 1513
+y Fo(h)p 1397 1487 109 2 v 1397 1515 a Fn(Return)p 1397
+1522 V 1503 1513 a Fo(i)1533 1515 y Fu(or)1588 1513 y
+Fo(h)p 1600 1487 86 2 v 1600 1515 a Fn(En)o(ter)p 1600
+1522 V 1684 1513 a Fo(i)1714 1515 y Fu(on)f(some)75 1569
+y(k)o(eyb)q(oards.)75 1697 y Fs(1.2)33 b(Readline)23
+b(In)n(teraction)137 1793 y Fu(Often)13 b(during)h(an)e(in)o(teractiv)o
+(e)h(session)g(y)o(ou)g(t)o(yp)q(e)f(in)i(a)e(long)h(line)h(of)e(text,)
+h(only)g(to)f(notice)h(that)f(the)75 1848 y(\014rst)k(w)o(ord)f(on)h
+(the)h(line)h(is)e(missp)q(elled.)26 b(The)16 b(Readline)j(library)e
+(giv)o(es)f(y)o(ou)g(a)g(set)g(of)g(commands)g(for)75
+1903 y(manipulating)g(the)f(text)g(as)f(y)o(ou)h(t)o(yp)q(e)g(it)g(in,)
+g(allo)o(wing)h(y)o(ou)f(to)f(just)h(\014x)g(y)o(our)f(t)o(yp)q(o,)g
+(and)h(not)g(forcing)75 1958 y(y)o(ou)f(to)f(ret)o(yp)q(e)h(the)g(ma)s
+(jorit)o(y)f(of)h(the)g(line.)21 b(Using)15 b(these)f(editing)h
+(commands,)f(y)o(ou)g(mo)o(v)o(e)f(the)h(cursor)75 2012
+y(to)i(the)i(place)g(that)e(needs)i(correction,)g(and)f(delete)h(or)f
+(insert)g(the)h(text)e(of)h(the)g(corrections.)26 b(Then,)75
+2067 y(when)16 b(y)o(ou)f(are)h(satis\014ed)g(with)g(the)f(line,)i(y)o
+(ou)e(simply)i(press)1160 2065 y Fo(h)p 1172 2039 155
+2 v 1172 2067 a Fn(RETURN)p 1172 2075 V 1324 2065 a Fo(i)1339
+2067 y Fu(.)k(Y)l(ou)16 b(do)f(not)g(ha)o(v)o(e)g(to)g(b)q(e)i(at)75
+2122 y(the)g(end)g(of)f(the)g(line)i(to)e(press)634 2120
+y Fo(h)p 646 2094 V 646 2122 a Fn(RETURN)p 646 2130 V
+798 2120 a Fo(i)813 2122 y Fu(;)g(the)h(en)o(tire)g(line)h(is)f
+(accepted)g(regardless)g(of)f(the)g(lo)q(cation)75 2177
+y(of)f(the)g(cursor)g(within)h(the)g(line.)75 2288 y
+Fl(1.2.1)30 b(Readline)20 b(Bare)g(Essen)n(tials)137
+2384 y Fu(In)12 b(order)g(to)f(en)o(ter)g(c)o(haracters)g(in)o(to)g
+(the)h(line,)h(simply)g(t)o(yp)q(e)f(them.)18 b(The)12
+b(t)o(yp)q(ed)g(c)o(haracter)f(app)q(ears)75 2439 y(where)16
+b(the)h(cursor)f(w)o(as,)f(and)h(then)h(the)f(cursor)g(mo)o(v)o(es)g
+(one)g(space)g(to)g(the)g(righ)o(t.)23 b(If)17 b(y)o(ou)f(mist)o(yp)q
+(e)g(a)75 2493 y(c)o(haracter,)e(y)o(ou)h(can)g(use)h(y)o(our)f(erase)g
+(c)o(haracter)f(to)h(bac)o(k)g(up)g(and)h(delete)g(the)f(mist)o(yp)q
+(ed)h(c)o(haracter.)137 2560 y(Sometimes)g(y)o(ou)f(ma)o(y)g(mist)o(yp)
+q(e)h(a)f(c)o(haracter,)f(and)i(not)f(notice)h(the)f(error)g(un)o(til)i
+(y)o(ou)e(ha)o(v)o(e)g(t)o(yp)q(ed)75 2615 y(sev)o(eral)f(other)f(c)o
+(haracters.)19 b(In)14 b(that)g(case,)f(y)o(ou)h(can)g(t)o(yp)q(e)1102
+2613 y Fo(h)p 1114 2587 57 2 v 1114 2615 a Fn(C-b)p 1114
+2623 V 1168 2613 a Fo(i)1197 2615 y Fu(to)f(mo)o(v)o(e)g(the)h(cursor)g
+(to)f(the)h(left,)g(and)75 2670 y(then)i(correct)e(y)o(our)h(mistak)o
+(e.)20 b(Afterw)o(ards,)13 b(y)o(ou)i(can)g(mo)o(v)o(e)g(the)g(cursor)g
+(to)g(the)g(righ)o(t)g(with)1714 2668 y Fo(h)p 1727 2642
+49 2 v 1727 2670 a Fn(C-f)p 1727 2678 V 1772 2668 a Fo(i)1787
+2670 y Fu(.)p eop
+%%Page: 2 4
+2 3 bop 75 -58 a Fu(2)1322 b(GNU)15 b(Readline)i(Library)137
+183 y(When)g(y)o(ou)f(add)g(text)g(in)h(the)g(middle)h(of)e(a)f(line,)j
+(y)o(ou)e(will)i(notice)f(that)f(c)o(haracters)f(to)h(the)g(righ)o(t)75
+238 y(of)e(the)g(cursor)g(are)g(`pushed)h(o)o(v)o(er')f(to)f(mak)o(e)h
+(ro)q(om)g(for)f(the)i(text)f(that)f(y)o(ou)h(ha)o(v)o(e)g(inserted.)21
+b(Lik)o(ewise,)75 293 y(when)e(y)o(ou)g(delete)h(text)e(b)q(ehind)j
+(the)e(cursor,)g(c)o(haracters)f(to)g(the)h(righ)o(t)f(of)g(the)h
+(cursor)g(are)f(`pulled)75 348 y(bac)o(k')11 b(to)g(\014ll)h(in)h(the)e
+(blank)h(space)g(created)f(b)o(y)h(the)f(remo)o(v)m(al)g(of)g(the)h
+(text.)18 b(A)11 b(list)h(of)f(the)h(bare)f(essen)o(tials)75
+402 y(for)k(editing)h(the)f(text)g(of)g(an)g(input)h(line)h(follo)o
+(ws.)75 479 y Fo(h)p 87 453 57 2 v 87 481 a Fn(C-b)p
+87 489 V 142 479 a Fo(i)315 481 y Fu(Mo)o(v)o(e)d(bac)o(k)h(one)h(c)o
+(haracter.)75 558 y Fo(h)p 87 532 49 2 v 87 560 a Fn(C-f)p
+87 567 V 133 558 a Fo(i)315 560 y Fu(Mo)o(v)o(e)e(forw)o(ard)g(one)h(c)
+o(haracter.)75 636 y Fo(h)p 87 610 73 2 v 87 638 a Fn(DEL)p
+87 646 V 158 636 a Fo(i)188 638 y Fu(or)244 636 y Fo(h)p
+256 610 159 2 v 256 638 a Fn(Bac)o(kspace)p 256 646 V
+412 636 a Fo(i)315 693 y Fu(Delete)h(the)f(c)o(haracter)g(to)f(the)h
+(left)h(of)f(the)g(cursor.)75 770 y Fo(h)p 87 744 57
+2 v 87 772 a Fn(C-d)p 87 779 V 142 770 a Fo(i)315 772
+y Fu(Delete)h(the)f(c)o(haracter)g(underneath)h(the)f(cursor.)75
+850 y(Prin)o(ting)h(c)o(haracters)315 905 y(Insert)f(the)h(c)o
+(haracter)e(in)o(to)h(the)h(line)h(at)d(the)h(cursor.)75
+981 y Fo(h)p 87 955 50 2 v 87 983 a Fn(C-)p 126 983 11
+2 v 87 991 50 2 v 135 981 a Fo(i)165 983 y Fu(or)221
+981 y Fo(h)p 233 955 125 2 v 233 983 a Fn(C-x)c(C-u)p
+233 991 V 355 981 a Fo(i)315 1038 y Fu(Undo)17 b(the)g(last)f(editing)i
+(command.)25 b(Y)l(ou)17 b(can)g(undo)g(all)g(the)g(w)o(a)o(y)f(bac)o
+(k)h(to)f(an)g(empt)o(y)315 1093 y(line.)75 1172 y(\(Dep)q(ending)i(on)
+f(y)o(our)g(con\014guration,)g(the)863 1170 y Fo(h)p
+875 1144 159 2 v 875 1172 a Fn(Bac)o(kspace)p 875 1179
+V 1032 1170 a Fo(i)1063 1172 y Fu(k)o(ey)g(b)q(e)h(set)f(to)f(delete)i
+(the)f(c)o(haracter)g(to)f(the)75 1226 y(left)h(of)f(the)h(cursor)f
+(and)g(the)596 1224 y Fo(h)p 608 1198 73 2 v 608 1226
+a Fn(DEL)p 608 1234 V 679 1224 a Fo(i)710 1226 y Fu(k)o(ey)h(set)f(to)g
+(delete)h(the)g(c)o(haracter)f(underneath)h(the)g(cursor,)f(lik)o(e)75
+1279 y Fo(h)p 87 1253 57 2 v 87 1281 a Fn(C-d)p 87 1289
+V 142 1279 a Fo(i)157 1281 y Fu(,)f(rather)f(than)h(the)h(c)o(haracter)
+e(to)h(the)g(left)g(of)g(the)g(cursor.\))75 1392 y Fl(1.2.2)30
+b(Readline)20 b(Mo)n(v)n(emen)n(t)i(Commands)137 1487
+y Fu(The)14 b(ab)q(o)o(v)o(e)e(table)i(describ)q(es)g(the)g(most)e
+(basic)i(k)o(eystrok)o(es)d(that)i(y)o(ou)g(need)h(in)f(order)g(to)g
+(do)g(editing)75 1542 y(of)f(the)h(input)h(line.)21 b(F)l(or)12
+b(y)o(our)g(con)o(v)o(enience,)i(man)o(y)f(other)f(commands)h(ha)o(v)o
+(e)f(b)q(een)i(added)f(in)h(addition)75 1597 y(to)130
+1595 y Fo(h)p 142 1569 V 142 1597 a Fn(C-b)p 142 1605
+V 197 1595 a Fo(i)212 1597 y Fu(,)239 1595 y Fo(h)p 251
+1569 49 2 v 251 1597 a Fn(C-f)p 251 1605 V 297 1595 a
+Fo(i)312 1597 y Fu(,)339 1595 y Fo(h)p 351 1569 57 2
+v 351 1597 a Fn(C-d)p 351 1605 V 406 1595 a Fo(i)421
+1597 y Fu(,)g(and)536 1595 y Fo(h)p 548 1569 73 2 v 548
+1597 a Fn(DEL)p 548 1605 V 619 1595 a Fo(i)634 1597 y
+Fu(.)20 b(Here)15 b(are)f(some)g(commands)h(for)f(mo)o(ving)g(more)h
+(rapidly)g(ab)q(out)g(the)75 1652 y(line.)75 1728 y Fo(h)p
+87 1702 55 2 v 87 1730 a Fn(C-a)p 87 1738 V 140 1728
+a Fo(i)315 1730 y Fu(Mo)o(v)o(e)f(to)h(the)g(start)f(of)h(the)g(line.)
+75 1807 y Fo(h)p 87 1781 53 2 v 87 1809 a Fn(C-e)p 87
+1817 V 138 1807 a Fo(i)315 1809 y Fu(Mo)o(v)o(e)f(to)h(the)g(end)h(of)f
+(the)g(line.)75 1885 y Fo(h)p 87 1859 55 2 v 87 1887
+a Fn(M-f)p 87 1895 V 140 1885 a Fo(i)315 1887 y Fu(Mo)o(v)o(e)f(forw)o
+(ard)g(a)h(w)o(ord,)f(where)i(a)e(w)o(ord)h(is)h(comp)q(osed)f(of)g
+(letters)g(and)h(digits.)75 1964 y Fo(h)p 87 1938 64
+2 v 87 1966 a Fn(M-b)p 87 1974 V 149 1964 a Fo(i)315
+1966 y Fu(Mo)o(v)o(e)e(bac)o(kw)o(ard)h(a)g(w)o(ord.)75
+2043 y Fo(h)p 87 2017 48 2 v 87 2045 a Fn(C-l)p 87 2052
+V 132 2043 a Fo(i)315 2045 y Fu(Clear)g(the)h(screen,)f(reprin)o(ting)h
+(the)f(curren)o(t)g(line)i(at)e(the)g(top.)137 2123 y(Notice)d(ho)o(w)
+368 2121 y Fo(h)p 380 2095 49 2 v 380 2123 a Fn(C-f)p
+380 2131 V 426 2121 a Fo(i)452 2123 y Fu(mo)o(v)o(es)f(forw)o(ard)f(a)i
+(c)o(haracter,)f(while)1105 2121 y Fo(h)p 1117 2095 55
+2 v 1117 2123 a Fn(M-f)p 1117 2131 V 1170 2121 a Fo(i)1197
+2123 y Fu(mo)o(v)o(es)f(forw)o(ard)h(a)g(w)o(ord.)18
+b(It)12 b(is)g(a)g(lo)q(ose)75 2178 y(con)o(v)o(en)o(tion)j(that)f(con)
+o(trol)h(k)o(eystrok)o(es)f(op)q(erate)h(on)f(c)o(haracters)h(while)h
+(meta)e(k)o(eystrok)o(es)g(op)q(erate)h(on)75 2233 y(w)o(ords.)75
+2343 y Fl(1.2.3)30 b(Readline)20 b(Killing)h(Commands)137
+2439 y Fm(Killing)26 b Fu(text)18 b(means)g(to)g(delete)i(the)f(text)f
+(from)g(the)h(line,)i(but)d(to)g(sa)o(v)o(e)g(it)h(a)o(w)o(a)o(y)e(for)
+h(later)h(use,)75 2494 y(usually)f(b)o(y)f Fm(y)o(anking)22
+b Fu(\(re-inserting\))17 b(it)g(bac)o(k)g(in)o(to)g(the)h(line.)27
+b(\(`Cut')15 b(and)j(`paste')e(are)g(more)h(recen)o(t)75
+2549 y(jargon)d(for)h(`kill')h(and)g(`y)o(ank'.\))137
+2615 y(If)g(the)f(description)h(for)f(a)g(command)g(sa)o(ys)f(that)h
+(it)g(`kills')h(text,)e(then)i(y)o(ou)f(can)g(b)q(e)h(sure)f(that)f(y)o
+(ou)75 2670 y(can)h(get)g(the)g(text)g(bac)o(k)g(in)h(a)f(di\013eren)o
+(t)g(\(or)g(the)g(same\))g(place)h(later.)p eop
+%%Page: 3 5
+3 4 bop 75 -58 a Fu(Chapter)15 b(1:)k(Command)c(Line)i(Editing)1077
+b(3)137 183 y(When)12 b(y)o(ou)g(use)g(a)f(kill)i(command,)f(the)g
+(text)f(is)h(sa)o(v)o(ed)f(in)i(a)e Fm(kill-ring)p Fu(.)21
+b(An)o(y)12 b(n)o(um)o(b)q(er)g(of)f(consecutiv)o(e)75
+238 y(kills)17 b(sa)o(v)o(e)e(all)h(of)f(the)h(killed)i(text)d
+(together,)f(so)h(that)g(when)h(y)o(ou)f(y)o(ank)g(it)h(bac)o(k,)f(y)o
+(ou)g(get)g(it)h(all.)22 b(The)75 293 y(kill)c(ring)f(is)f(not)g(line)i
+(sp)q(eci\014c;)g(the)e(text)g(that)f(y)o(ou)h(killed)j(on)d(a)g
+(previously)h(t)o(yp)q(ed)g(line)h(is)e(a)o(v)m(ailable)75
+348 y(to)f(b)q(e)g(y)o(ank)o(ed)g(bac)o(k)h(later,)e(when)i(y)o(ou)f
+(are)g(t)o(yping)g(another)g(line.)137 415 y(Here)h(is)f(the)h(list)g
+(of)e(commands)h(for)g(killing)j(text.)75 492 y Fo(h)p
+87 466 56 2 v 87 494 a Fn(C-k)p 87 502 V 141 492 a Fo(i)315
+494 y Fu(Kill)f(the)f(text)e(from)h(the)g(curren)o(t)g(cursor)g(p)q
+(osition)h(to)f(the)g(end)h(of)f(the)g(line.)75 571 y
+Fo(h)p 87 545 64 2 v 87 573 a Fn(M-d)p 87 581 V 149 571
+a Fo(i)315 573 y Fu(Kill)g(from)e(the)g(cursor)g(to)f(the)i(end)g(of)e
+(the)i(curren)o(t)f(w)o(ord,)f(or,)h(if)g(b)q(et)o(w)o(een)h(w)o(ords,)
+e(to)h(the)315 628 y(end)j(of)f(the)g(next)g(w)o(ord.)k(W)l(ord)c(b)q
+(oundaries)i(are)e(the)g(same)g(as)g(those)f(used)i(b)o(y)1728
+626 y Fo(h)p 1740 600 55 2 v 1740 628 a Fn(M-f)p 1740
+636 V 1793 626 a Fo(i)1808 628 y Fu(.)75 705 y Fo(h)p
+87 679 118 2 v 87 707 a Fn(M-DEL)p 87 715 V 202 705 a
+Fo(i)315 707 y Fu(Kill)21 b(from)e(the)g(cursor)f(the)h(start)f(of)h
+(the)g(previous)h(w)o(ord,)f(or,)g(if)g(b)q(et)o(w)o(een)h(w)o(ords,)f
+(to)315 762 y(the)14 b(start)f(of)g(the)h(previous)g(w)o(ord.)19
+b(W)l(ord)14 b(b)q(oundaries)h(are)e(the)h(same)g(as)f(those)h(used)g
+(b)o(y)315 815 y Fo(h)p 327 789 64 2 v 327 817 a Fn(M-b)p
+327 825 V 389 815 a Fo(i)404 817 y Fu(.)75 894 y Fo(h)p
+87 868 63 2 v 87 896 a Fn(C-w)p 87 904 V 148 894 a Fo(i)315
+896 y Fu(Kill)k(from)d(the)h(cursor)g(to)f(the)h(previous)h
+(whitespace.)22 b(This)17 b(is)f(di\013eren)o(t)g(than)1733
+894 y Fo(h)p 1745 868 118 2 v 1745 896 a Fn(M-DEL)p 1745
+904 V 1860 894 a Fo(i)315 951 y Fu(b)q(ecause)g(the)f(w)o(ord)g(b)q
+(oundaries)h(di\013er.)137 1030 y(Here)21 b(is)h(ho)o(w)e(to)g
+Fm(y)o(ank)j Fu(the)e(text)f(bac)o(k)h(in)o(to)g(the)f(line.)39
+b(Y)l(anking)21 b(means)g(to)f(cop)o(y)h(the)g(most-)75
+1085 y(recen)o(tly-killed)d(text)d(from)f(the)i(kill)h(bu\013er.)75
+1163 y Fo(h)p 87 1137 56 2 v 87 1165 a Fn(C-y)p 87 1172
+V 141 1163 a Fo(i)315 1165 y Fu(Y)l(ank)e(the)h(most)e(recen)o(tly)i
+(killed)h(text)e(bac)o(k)g(in)o(to)g(the)h(bu\013er)f(at)f(the)i
+(cursor.)75 1242 y Fo(h)p 87 1216 63 2 v 87 1244 a Fn(M-y)p
+87 1252 V 148 1242 a Fo(i)315 1244 y Fu(Rotate)h(the)g(kill-ring,)j
+(and)d(y)o(ank)g(the)h(new)f(top.)26 b(Y)l(ou)17 b(can)h(only)g(do)f
+(this)h(if)f(the)h(prior)315 1299 y(command)d(is)568
+1297 y Fo(h)p 580 1271 56 2 v 580 1299 a Fn(C-y)p 580
+1306 V 634 1297 a Fo(i)664 1299 y Fu(or)719 1297 y Fo(h)p
+732 1271 63 2 v 732 1299 a Fn(M-y)p 732 1306 V 792 1297
+a Fo(i)807 1299 y Fu(.)75 1410 y Fl(1.2.4)30 b(Readline)20
+b(Argumen)n(ts)137 1506 y Fu(Y)l(ou)15 b(can)g(pass)f(n)o(umeric)i
+(argumen)o(ts)e(to)g(Readline)i(commands.)k(Sometimes)15
+b(the)g(argumen)o(t)e(acts)75 1561 y(as)20 b(a)g(rep)q(eat)g(coun)o(t,)
+h(other)f(times)g(it)h(is)g(the)f Fm(sign)h Fu(of)f(the)g(argumen)o(t)f
+(that)h(is)h(signi\014can)o(t.)36 b(If)20 b(y)o(ou)75
+1616 y(pass)d(a)f(negativ)o(e)h(argumen)o(t)f(to)g(a)g(command)h(whic)o
+(h)h(normally)f(acts)f(in)i(a)e(forw)o(ard)g(direction,)i(that)75
+1671 y(command)g(will)h(act)e(in)i(a)e(bac)o(kw)o(ard)g(direction.)28
+b(F)l(or)17 b(example,)i(to)e(kill)j(text)d(bac)o(k)g(to)g(the)h(start)
+e(of)75 1726 y(the)f(line,)i(y)o(ou)e(migh)o(t)g(t)o(yp)q(e)g(`)p
+Ft(M--)f(C-k)p Fu('.)137 1793 y(The)h(general)f(w)o(a)o(y)f(to)h(pass)g
+(n)o(umeric)h(argumen)o(ts)e(to)g(a)h(command)g(is)h(to)e(t)o(yp)q(e)h
+(meta)g(digits)h(b)q(efore)75 1847 y(the)h(command.)k(If)c(the)f
+(\014rst)g(`digit')h(t)o(yp)q(ed)f(is)h(a)g(min)o(us)g(sign)g(\(`)p
+Ft(-)p Fu('\),)d(then)j(the)f(sign)h(of)f(the)h(argumen)o(t)75
+1902 y(will)g(b)q(e)f(negativ)o(e.)k(Once)c(y)o(ou)f(ha)o(v)o(e)g(t)o
+(yp)q(ed)g(one)h(meta)e(digit)i(to)f(get)f(the)h(argumen)o(t)g
+(started,)f(y)o(ou)h(can)75 1957 y(t)o(yp)q(e)19 b(the)g(remainder)g
+(of)f(the)h(digits,)h(and)f(then)g(the)g(command.)30
+b(F)l(or)18 b(example,)i(to)e(giv)o(e)h(the)1793 1955
+y Fo(h)p 1805 1929 57 2 v 1805 1957 a Fn(C-d)p 1805 1965
+V 1860 1955 a Fo(i)75 2012 y Fu(command)c(an)g(argumen)o(t)g(of)f(10,)h
+(y)o(ou)f(could)j(t)o(yp)q(e)e(`)p Ft(M-1)f(0)h(C-d)p
+Fu('.)75 2123 y Fl(1.2.5)30 b(Searc)n(hing)21 b(for)f(Commands)h(in)f
+(the)h(History)137 2219 y Fu(Readline)e(pro)o(vides)d(commands)g(for)g
+(searc)o(hing)g(through)g(the)g(command)g(history)g(for)g(lines)i(con-)
+75 2274 y(taining)e(a)f(sp)q(eci\014ed)i(string.)j(There)c(are)e(t)o(w)
+o(o)g(searc)o(h)h(mo)q(des:)20 b Fm(incremen)o(tal)e
+Fu(and)e Fm(non-incremen)o(tal)p Fu(.)137 2341 y(Incremen)o(tal)e
+(searc)o(hes)f(b)q(egin)h(b)q(efore)f(the)g(user)g(has)g(\014nished)h
+(t)o(yping)f(the)g(searc)o(h)g(string.)19 b(As)13 b(eac)o(h)75
+2396 y(c)o(haracter)k(of)g(the)h(searc)o(h)g(string)f(is)h(t)o(yp)q
+(ed,)h(Readline)h(displa)o(ys)e(the)g(next)g(en)o(try)f(from)g(the)h
+(history)75 2451 y(matc)o(hing)12 b(the)g(string)g(t)o(yp)q(ed)g(so)g
+(far.)18 b(An)13 b(incremen)o(tal)g(searc)o(h)f(requires)g(only)h(as)f
+(man)o(y)f(c)o(haracters)g(as)75 2506 y(needed)16 b(to)d(\014nd)j(the)e
+(desired)i(history)e(en)o(try)l(.)19 b(T)l(o)c(searc)o(h)f(bac)o(kw)o
+(ard)f(in)j(the)e(history)g(for)g(a)g(particular)75 2560
+y(string,)g(t)o(yp)q(e)317 2558 y Fo(h)p 329 2532 51
+2 v 329 2560 a Fn(C-r)p 329 2568 V 378 2558 a Fo(i)393
+2560 y Fu(.)19 b(T)o(yping)580 2558 y Fo(h)p 592 2532
+52 2 v 592 2560 a Fn(C-s)p 592 2568 V 641 2558 a Fo(i)670
+2560 y Fu(searc)o(hes)14 b(forw)o(ard)f(through)g(the)h(history)l(.)20
+b(The)14 b(c)o(haracters)f(presen)o(t)75 2615 y(in)20
+b(the)f(v)m(alue)h(of)f(the)g Ft(isearch-terminators)d
+Fu(v)m(ariable)k(are)f(used)h(to)e(terminate)h(an)g(incremen)o(tal)75
+2670 y(searc)o(h.)29 b(If)19 b(that)e(v)m(ariable)j(has)e(not)g(b)q
+(een)i(assigned)f(a)f(v)m(alue,)i(the)1282 2668 y Fo(h)p
+1294 2642 70 2 v 1294 2670 a Fn(ESC)p 1294 2678 V 1361
+2668 a Fo(i)1395 2670 y Fu(and)1486 2668 y Fo(h)p 1498
+2642 56 2 v 1498 2670 a Fn(C-J)p 1498 2678 V 1551 2668
+a Fo(i)1585 2670 y Fu(c)o(haracters)d(will)p eop
+%%Page: 4 6
+4 5 bop 75 -58 a Fu(4)1322 b(GNU)15 b(Readline)i(Library)75
+183 y(terminate)k(an)f(incremen)o(tal)i(searc)o(h.)780
+181 y Fo(h)p 792 155 55 2 v 792 183 a Fn(C-g)p 792 191
+V 845 181 a Fo(i)880 183 y Fu(will)g(ab)q(ort)e(an)h(incremen)o(tal)h
+(searc)o(h)e(and)h(restore)f(the)75 238 y(original)c(line.)21
+b(When)15 b(the)f(searc)o(h)g(is)h(terminated,)g(the)f(history)h(en)o
+(try)f(con)o(taining)h(the)g(searc)o(h)f(string)75 293
+y(b)q(ecomes)i(the)f(curren)o(t)g(line.)137 357 y(T)l(o)g(\014nd)h
+(other)e(matc)o(hing)h(en)o(tries)h(in)f(the)g(history)g(list,)h(t)o
+(yp)q(e)1231 355 y Fo(h)p 1243 329 51 2 v 1243 357 a
+Fn(C-r)p 1243 364 V 1292 355 a Fo(i)1322 357 y Fu(or)1377
+355 y Fo(h)p 1389 329 52 2 v 1389 357 a Fn(C-s)p 1389
+364 V 1438 355 a Fo(i)1468 357 y Fu(as)f(appropriate.)k(This)75
+412 y(will)c(searc)o(h)e(bac)o(kw)o(ard)f(or)g(forw)o(ard)g(in)i(the)f
+(history)g(for)g(the)g(next)g(en)o(try)g(matc)o(hing)g(the)g(searc)o(h)
+g(string)75 466 y(t)o(yp)q(ed)19 b(so)g(far.)30 b(An)o(y)19
+b(other)f(k)o(ey)h(sequence)h(b)q(ound)g(to)e(a)h(Readline)i(command)d
+(will)j(terminate)e(the)75 521 y(searc)o(h)h(and)h(execute)g(that)f
+(command.)35 b(F)l(or)20 b(instance,)i(a)1151 519 y Fo(h)p
+1163 493 76 2 v 1163 521 a Fn(RET)p 1163 529 V 1236 519
+a Fo(i)1271 521 y Fu(will)g(terminate)f(the)f(searc)o(h)h(and)75
+576 y(accept)15 b(the)h(line,)g(thereb)o(y)f(executing)i(the)e(command)
+g(from)g(the)g(history)g(list.)137 640 y(Non-incremen)o(tal)25
+b(searc)o(hes)e(read)h(the)f(en)o(tire)h(searc)o(h)f(string)g(b)q
+(efore)h(starting)f(to)f(searc)o(h)i(for)75 695 y(matc)o(hing)d
+(history)h(lines.)39 b(The)22 b(searc)o(h)f(string)g(ma)o(y)g(b)q(e)h
+(t)o(yp)q(ed)f(b)o(y)h(the)f(user)h(or)e(b)q(e)i(part)f(of)g(the)75
+750 y(con)o(ten)o(ts)15 b(of)f(the)i(curren)o(t)f(line.)75
+868 y Fs(1.3)33 b(Readline)23 b(Init)h(File)137 961 y
+Fu(Although)f(the)g(Readline)i(library)e(comes)g(with)g(a)f(set)g(of)g
+(Emacs-lik)o(e)i(k)o(eybindings)g(installed)75 1016 y(b)o(y)d(default,)
+h(it)f(is)h(p)q(ossible)g(to)e(use)i(a)e(di\013eren)o(t)h(set)g(of)f(k)
+o(eybindings.)39 b(An)o(y)20 b(user)h(can)g(customize)75
+1071 y(programs)15 b(that)h(use)g(Readline)j(b)o(y)d(putting)g
+(commands)g(in)i(an)e Fm(inputrc)k Fu(\014le,)d(con)o(v)o(en)o
+(tionally)g(in)g(his)75 1126 y(home)g(directory)l(.)24
+b(The)17 b(name)g(of)f(this)h(\014le)g(is)g(tak)o(en)g(from)e(the)i(v)m
+(alue)h(of)e(the)h(en)o(vironmen)o(t)g(v)m(ariable)75
+1181 y Ft(INPUTRC)p Fu(.)i(If)c(that)g(v)m(ariable)h(is)g(unset,)f(the)
+g(default)h(is)g(`)p Ft(~/.inputrc)p Fu('.)137 1244 y(When)f(a)g
+(program)f(whic)o(h)h(uses)g(the)g(Readline)i(library)f(starts)d(up,)i
+(the)g(init)h(\014le)g(is)f(read,)g(and)g(the)75 1299
+y(k)o(ey)g(bindings)i(are)e(set.)137 1363 y(In)f(addition,)h(the)e
+Ft(C-x)i(C-r)e Fu(command)g(re-reads)h(this)g(init)g(\014le,)h(th)o(us)
+e(incorp)q(orating)h(an)o(y)f(c)o(hanges)75 1418 y(that)h(y)o(ou)h
+(migh)o(t)g(ha)o(v)o(e)g(made)g(to)g(it.)75 1520 y Fl(1.3.1)30
+b(Readline)20 b(Init)g(File)h(Syn)n(tax)137 1613 y Fu(There)c(are)g
+(only)g(a)g(few)f(basic)i(constructs)e(allo)o(w)o(ed)i(in)f(the)g
+(Readline)i(init)f(\014le.)26 b(Blank)18 b(lines)g(are)75
+1668 y(ignored.)36 b(Lines)22 b(b)q(eginning)h(with)d(a)h(`)p
+Ft(#)p Fu(')e(are)h(commen)o(ts.)35 b(Lines)22 b(b)q(eginning)h(with)e
+(a)f(`)p Ft($)p Fu(')f(indicate)75 1723 y(conditional)c(constructs)f
+(\(see)g(Section)g(1.3.2)f([Conditional)h(Init)h(Constructs],)e(page)h
+(8\).)k(Other)c(lines)75 1778 y(denote)h(v)m(ariable)i(settings)e(and)h
+(k)o(ey)f(bindings.)75 1851 y(V)l(ariable)h(Settings)315
+1906 y(Y)l(ou)k(can)h(mo)q(dify)g(the)f(run-time)h(b)q(eha)o(vior)g(of)
+e(Readline)k(b)o(y)d(altering)h(the)f(v)m(alues)h(of)315
+1960 y(v)m(ariables)13 b(in)g(Readline)i(using)d(the)g
+Ft(set)g Fu(command)g(within)h(the)f(init)h(\014le.)20
+b(Here)13 b(is)f(ho)o(w)g(to)315 2015 y(c)o(hange)e(from)g(the)g
+(default)h(Emacs-lik)o(e)g(k)o(ey)f(binding)i(to)e(use)g
+Ft(vi)g Fu(line)i(editing)g(commands:)435 2076 y Ft(set)23
+b(editing-mode)g(vi)315 2140 y Fu(A)15 b(great)g(deal)g(of)g(run-time)h
+(b)q(eha)o(vior)g(is)g(c)o(hangeable)g(with)f(the)h(follo)o(wing)f(v)m
+(ariables.)315 2213 y Ft(bell-style)555 2268 y Fu(Con)o(trols)21
+b(what)h(happ)q(ens)h(when)f(Readline)i(w)o(an)o(ts)d(to)g(ring)i(the)f
+(termi-)555 2323 y(nal)d(b)q(ell.)32 b(If)19 b(set)f(to)g(`)p
+Ft(none)p Fu(',)g(Readline)j(nev)o(er)e(rings)g(the)f(b)q(ell.)32
+b(If)19 b(set)g(to)555 2378 y(`)p Ft(visible)p Fu(',)c(Readline)j(uses)
+f(a)f(visible)j(b)q(ell)g(if)e(one)f(is)h(a)o(v)m(ailable.)26
+b(If)16 b(set)h(to)555 2432 y(`)p Ft(audible)p Fu(')g(\(the)h
+(default\),)i(Readline)h(attempts)d(to)g(ring)h(the)g(terminal's)555
+2487 y(b)q(ell.)315 2560 y Ft(comment-begin)555 2615
+y Fu(The)c(string)f(to)g(insert)i(at)d(the)i(b)q(eginning)i(of)d(the)h
+(line)h(when)f(the)g Ft(insert-)555 2670 y(comment)f
+Fu(command)h(is)h(executed.)21 b(The)15 b(default)h(v)m(alue)g(is)g
+Ft("#")p Fu(.)p eop
+%%Page: 5 7
+5 6 bop 75 -58 a Fu(Chapter)15 b(1:)k(Command)c(Line)i(Editing)1077
+b(5)315 183 y Ft(completion-ignore-case)555 238 y Fu(If)14
+b(set)f(to)g(`)p Ft(on)p Fu(',)g(Readline)j(p)q(erforms)d(\014lename)i
+(matc)o(hing)f(and)g(completion)555 293 y(in)i(a)f(case-insensitiv)o(e)
+i(fashion.)k(The)15 b(default)h(v)m(alue)g(is)g(`)p Ft(off)p
+Fu('.)315 384 y Ft(completion-query-items)555 439 y Fu(The)d(n)o(um)o
+(b)q(er)h(of)e(p)q(ossible)j(completions)g(that)d(determines)i(when)g
+(the)f(user)555 494 y(is)21 b(ask)o(ed)g(whether)g(he)h(w)o(an)o(ts)d
+(to)i(see)g(the)g(list)h(of)e(p)q(ossibilitie)q(s.)40
+b(If)21 b(the)555 549 y(n)o(um)o(b)q(er)14 b(of)f(p)q(ossible)i
+(completions)f(is)g(greater)f(than)g(this)h(v)m(alue,)h(Readline)555
+604 y(will)g(ask)e(the)g(user)h(whether)f(or)g(not)g(he)g(wishes)h(to)f
+(view)h(them;)f(otherwise,)555 658 y(they)i(are)g(simply)i(listed.)k
+(The)15 b(default)h(limit)h(is)e Ft(100)p Fu(.)315 750
+y Ft(convert-meta)555 805 y Fu(If)i(set)g(to)g(`)p Ft(on)p
+Fu(',)f(Readline)k(will)e(con)o(v)o(ert)f(c)o(haracters)f(with)i(the)f
+(eigh)o(th)g(bit)555 860 y(set)f(to)f(an)h(ASCI)q(I)h(k)o(ey)f
+(sequence)h(b)o(y)f(stripping)h(the)f(eigh)o(th)h(bit)f(and)h(pre-)555
+915 y(\014xing)i(an)749 913 y Fo(h)p 761 887 70 2 v 761
+915 a Fn(ESC)p 761 922 V 828 913 a Fo(i)861 915 y Fu(c)o(haracter,)f
+(con)o(v)o(erting)g(them)g(to)g(a)f(meta-pre\014xed)i(k)o(ey)555
+969 y(sequence.)i(The)15 b(default)h(v)m(alue)h(is)e(`)p
+Ft(on)p Fu('.)315 1061 y Ft(disable-completion)555 1116
+y Fu(If)k(set)f(to)f(`)p Ft(On)p Fu(',)h(Readline)j(will)f(inhibit)g(w)
+o(ord)e(completion.)30 b(Completion)555 1171 y(c)o(haracters)12
+b(will)j(b)q(e)f(inserted)g(in)o(to)f(the)g(line)h(as)f(if)h(they)f
+(had)g(b)q(een)h(mapp)q(ed)555 1225 y(to)h Ft(self-insert)p
+Fu(.)j(The)d(default)h(is)g(`)p Ft(off)p Fu('.)315 1317
+y Ft(editing-mode)555 1372 y Fu(The)f Ft(editing-mode)d
+Fu(v)m(ariable)k(con)o(trols)e(whic)o(h)h(default)g(set)f(of)g(k)o(ey)g
+(bind-)555 1427 y(ings)f(is)g(used.)20 b(By)12 b(default,)i(Readline)g
+(starts)e(up)h(in)g(Emacs)f(editing)i(mo)q(de,)555 1481
+y(where)h(the)f(k)o(eystrok)o(es)g(are)g(most)g(similar)i(to)d(Emacs.)
+20 b(This)15 b(v)m(ariable)h(can)555 1536 y(b)q(e)g(set)f(to)f(either)i
+(`)p Ft(emacs)p Fu(')e(or)h(`)p Ft(vi)p Fu('.)315 1628
+y Ft(enable-keypad)555 1683 y Fu(When)d(set)f(to)h(`)p
+Ft(on)p Fu(',)e(Readline)k(will)g(try)d(to)g(enable)i(the)f
+(application)h(k)o(eypad)555 1737 y(when)h(it)f(is)h(called.)21
+b(Some)13 b(systems)g(need)h(this)g(to)f(enable)h(the)g(arro)o(w)e(k)o
+(eys.)555 1792 y(The)j(default)h(is)g(`)p Ft(off)p Fu('.)315
+1884 y Ft(expand-tilde)555 1939 y Fu(If)e(set)g(to)f(`)p
+Ft(on)p Fu(',)f(tilde)k(expansion)e(is)h(p)q(erformed)f(when)g
+(Readline)i(attempts)555 1994 y(w)o(ord)f(completion.)21
+b(The)15 b(default)h(is)f(`)p Ft(off)p Fu('.)315 2085
+y Ft(horizontal-scroll-mode)555 2140 y Fu(This)k(v)m(ariable)g(can)f(b)
+q(e)g(set)g(to)f(either)i(`)p Ft(on)p Fu(')e(or)g(`)p
+Ft(off)p Fu('.)27 b(Setting)19 b(it)f(to)f(`)p Ft(on)p
+Fu(')555 2195 y(means)c(that)f(the)i(text)e(of)h(the)g(lines)i(b)q
+(eing)f(edited)g(will)h(scroll)f(horizon)o(tally)555
+2250 y(on)i(a)f(single)i(screen)g(line)g(when)g(they)f(are)f(longer)h
+(than)g(the)g(width)g(of)g(the)555 2304 y(screen,)e(instead)f(of)g
+(wrapping)g(on)o(to)f(a)h(new)g(screen)h(line.)21 b(By)13
+b(default,)h(this)555 2359 y(v)m(ariable)j(is)e(set)g(to)g(`)p
+Ft(off)p Fu('.)315 2451 y Ft(input-meta)555 2506 y Fu(If)h(set)g(to)f
+(`)p Ft(on)p Fu(',)f(Readline)k(will)g(enable)f(eigh)o(t-bit)f(input)h
+(\(it)f(will)h(not)f(strip)555 2560 y(the)f(eigh)o(th)g(bit)h(from)e
+(the)h(c)o(haracters)f(it)i(reads\),)e(regardless)h(of)f(what)h(the)555
+2615 y(terminal)21 b(claims)g(it)f(can)g(supp)q(ort.)34
+b(The)20 b(default)h(v)m(alue)g(is)g(`)p Ft(off)p Fu('.)33
+b(The)555 2670 y(name)15 b Ft(meta-flag)f Fu(is)i(a)f(synon)o(ym)g(for)
+f(this)i(v)m(ariable.)p eop
+%%Page: 6 8
+6 7 bop 75 -58 a Fu(6)1322 b(GNU)15 b(Readline)i(Library)315
+183 y Ft(isearch-terminators)555 238 y Fu(The)26 b(string)g(of)f(c)o
+(haracters)g(that)g(should)i(terminate)f(an)g(incremen)o(tal)555
+293 y(searc)o(h)e(without)h(subsequen)o(tly)g(executing)h(the)e(c)o
+(haracter)g(as)g(a)g(com-)555 348 y(mand)19 b(\(see)f(Section)i(1.2.5)d
+([Searc)o(hing],)i(page)f(3\).)29 b(If)19 b(this)g(v)m(ariable)h(has)
+555 402 y(not)13 b(b)q(een)h(giv)o(en)g(a)f(v)m(alue,)i(the)e(c)o
+(haracters)1312 400 y Fo(h)p 1324 374 70 2 v 1324 402
+a Fn(ESC)p 1324 410 V 1391 400 a Fo(i)1419 402 y Fu(and)1505
+400 y Fo(h)p 1518 374 56 2 v 1518 402 a Fn(C-J)p 1518
+410 V 1571 400 a Fo(i)1599 402 y Fu(will)i(terminate)555
+457 y(an)g(incremen)o(tal)h(searc)o(h.)315 540 y Ft(keymap)114
+b Fu(Sets)17 b(Readline's)j(idea)e(of)f(the)h(curren)o(t)g(k)o(eymap)f
+(for)g(k)o(ey)g(binding)j(com-)555 595 y(mands.)41 b(Acceptable)23
+b Ft(keymap)f Fu(names)g(are)f Ft(emacs)p Fu(,)i Ft(emacs-standard)p
+Fu(,)555 650 y Ft(emacs-meta)p Fu(,)15 b Ft(emacs-ctlx)p
+Fu(,)h Ft(vi)p Fu(,)g Ft(vi-command)p Fu(,)g(and)h Ft(vi-insert)p
+Fu(.)23 b Ft(vi)16 b Fu(is)555 705 y(equiv)m(alen)o(t)e(to)f
+Ft(vi-command)p Fu(;)e Ft(emacs)h Fu(is)i(equiv)m(alen)o(t)g(to)e
+Ft(emacs-standard)p Fu(.)555 759 y(The)f(default)h(v)m(alue)g(is)f
+Ft(emacs)p Fu(.)18 b(The)11 b(v)m(alue)i(of)d(the)h Ft(editing-mode)f
+Fu(v)m(ariable)555 814 y(also)15 b(a\013ects)g(the)g(default)h(k)o
+(eymap.)315 897 y Ft(mark-directories)555 952 y Fu(If)j(set)g(to)g(`)p
+Ft(on)p Fu(',)f(completed)i(directory)g(names)f(ha)o(v)o(e)f(a)h(slash)
+h(app)q(ended.)555 1007 y(The)15 b(default)h(is)g(`)p
+Ft(on)p Fu('.)315 1090 y Ft(mark-modified-lines)555 1145
+y Fu(This)j(v)m(ariable,)g(when)g(set)e(to)h(`)p Ft(on)p
+Fu(',)f(causes)h(Readline)i(to)d(displa)o(y)i(an)f(as-)555
+1200 y(terisk)f(\(`)p Ft(*)p Fu('\))e(at)i(the)f(start)g(of)h(history)f
+(lines)j(whic)o(h)e(ha)o(v)o(e)g(b)q(een)h(mo)q(di\014ed.)555
+1254 y(This)e(v)m(ariable)g(is)g(`)p Ft(off)p Fu(')e(b)o(y)h(default.)
+315 1337 y Ft(output-meta)555 1392 y Fu(If)j(set)f(to)g(`)p
+Ft(on)p Fu(',)g(Readline)j(will)g(displa)o(y)f(c)o(haracters)d(with)j
+(the)e(eigh)o(th)h(bit)555 1447 y(set)g(directly)i(rather)d(than)h(as)g
+(a)g(meta-pre\014xed)h(escap)q(e)g(sequence.)30 b(The)555
+1502 y(default)16 b(is)f(`)p Ft(off)p Fu('.)315 1585
+y Ft(print-completions-horizont)o(ally)555 1640 y Fu(If)d(set)g(to)f(`)
+p Ft(on)p Fu(',)h(Readline)i(will)f(displa)o(y)h(completions)f(with)f
+(matc)o(hes)f(sorted)555 1694 y(horizon)o(tally)23 b(in)f(alphab)q
+(etical)i(order,)f(rather)e(than)g(do)o(wn)h(the)g(screen.)555
+1749 y(The)15 b(default)h(is)g(`)p Ft(off)p Fu('.)315
+1832 y Ft(show-all-if-ambiguous)555 1887 y Fu(This)g(alters)e(the)i
+(default)f(b)q(eha)o(vior)h(of)e(the)h(completion)h(functions.)21
+b(If)15 b(set)555 1942 y(to)e(`)p Ft(on)p Fu(',)g(w)o(ords)g(whic)o(h)h
+(ha)o(v)o(e)g(more)f(than)g(one)h(p)q(ossible)i(completion)f(cause)555
+1997 y(the)20 b(matc)o(hes)f(to)f(b)q(e)j(listed)f(immediately)h
+(instead)f(of)f(ringing)i(the)e(b)q(ell.)555 2051 y(The)c(default)h(v)m
+(alue)h(is)e(`)p Ft(off)p Fu('.)315 2134 y Ft(visible-stats)555
+2189 y Fu(If)h(set)g(to)f(`)p Ft(on)p Fu(',)g(a)h(c)o(haracter)f
+(denoting)h(a)g(\014le's)h(t)o(yp)q(e)f(is)g(app)q(ended)i(to)d(the)555
+2244 y(\014lename)h(when)g(listing)h(p)q(ossible)g(completions.)j(The)c
+(default)g(is)f(`)p Ft(off)p Fu('.)75 2327 y(Key)h(Bindings)315
+2382 y(The)21 b(syn)o(tax)f(for)h(con)o(trolling)h(k)o(ey)f(bindings)h
+(in)g(the)f(init)h(\014le)g(is)g(simple.)39 b(First)20
+b(y)o(ou)315 2437 y(need)15 b(to)e(\014nd)h(the)g(name)g(of)g(the)f
+(command)h(that)f(y)o(ou)h(w)o(an)o(t)f(to)g(c)o(hange.)19
+b(The)14 b(follo)o(wing)315 2491 y(sections)k(con)o(tain)h(tables)f(of)
+f(the)h(command)g(name,)g(the)g(default)h(k)o(eybinding,)h(if)e(an)o(y)
+l(,)315 2546 y(and)d(a)g(short)g(description)i(of)d(what)h(the)g
+(command)g(do)q(es.)315 2615 y(Once)j(y)o(ou)g(kno)o(w)e(the)i(name)f
+(of)g(the)h(command,)f(simply)i(place)g(the)e(name)h(of)f(the)g(k)o(ey)
+315 2670 y(y)o(ou)c(wish)h(to)f(bind)i(the)f(command)f(to,)g(a)g
+(colon,)h(and)g(then)f(the)h(name)f(of)h(the)f(command)p
+eop
+%%Page: 7 9
+7 8 bop 75 -58 a Fu(Chapter)15 b(1:)k(Command)c(Line)i(Editing)1077
+b(7)315 183 y(on)19 b(a)g(line)i(in)f(the)g(init)g(\014le.)34
+b(The)19 b(name)h(of)e(the)i(k)o(ey)f(can)h(b)q(e)g(expressed)g(in)g
+(di\013eren)o(t)315 238 y(w)o(a)o(ys,)14 b(dep)q(ending)j(on)e(whic)o
+(h)h(is)g(most)e(comfortable)h(for)g(y)o(ou.)315 316
+y Fm(k)o(eyname)s Fu(:)k Fm(function-name)g Fu(or)c Fm(macro)555
+371 y(k)o(eyname)i Fu(is)e(the)f(name)h(of)f(a)g(k)o(ey)g(sp)q(elled)j
+(out)d(in)h(English.)21 b(F)l(or)13 b(example:)675 435
+y Ft(Control-u:)22 b(universal-argument)675 487 y(Meta-Rubout:)g
+(backward-kill-word)675 538 y(Control-o:)g(">)i(output")555
+605 y Fu(In)19 b(the)f(ab)q(o)o(v)o(e)g(example,)1023
+603 y Fo(h)p 1035 577 57 2 v 1035 605 a Fn(C-u)p 1035
+613 V 1090 603 a Fo(i)1123 605 y Fu(is)h(b)q(ound)g(to)f(the)g
+(function)h Ft(universal-)555 660 y(argument)p Fu(,)g(and)872
+658 y Fo(h)p 884 632 55 2 v 884 660 a Fn(C-o)p 884 667
+V 937 658 a Fo(i)971 660 y Fu(is)h(b)q(ound)g(to)f(run)h(the)f(macro)g
+(expressed)h(on)g(the)555 715 y(righ)o(t)13 b(hand)h(side)h(\(that)e
+(is,)h(to)f(insert)h(the)g(text)f(`)p Ft(>)h(output)p
+Fu(')f(in)o(to)g(the)h(line\).)315 793 y Ft(")p Fm(k)o(eyseq)q
+Ft(")p Fu(:)20 b Fm(function-name)e Fu(or)d Fm(macro)555
+848 y(k)o(eyseq)i Fu(di\013ers)e(from)g Fm(k)o(eyname)j
+Fu(ab)q(o)o(v)o(e)d(in)i(that)d(strings)i(denoting)g(an)f(en-)555
+902 y(tire)i(k)o(ey)g(sequence)h(can)f(b)q(e)g(sp)q(eci\014ed,)i(b)o(y)
+e(placing)h(the)f(k)o(ey)g(sequence)h(in)555 957 y(double)e(quotes.)j
+(Some)c Fp(gnu)g Fu(Emacs)f(st)o(yle)h(k)o(ey)g(escap)q(es)g(can)g(b)q
+(e)g(used,)g(as)555 1012 y(in)j(the)f(follo)o(wing)g(example,)h(but)f
+(the)g(sp)q(ecial)i(c)o(haracter)d(names)h(are)f(not)555
+1067 y(recognized.)675 1130 y Ft("\\C-u":)23 b(universal-argument)675
+1182 y("\\C-x\\C-r":)f(re-read-init-file)675 1234 y("\\e[11~":)h
+("Function)f(Key)i(1")555 1301 y Fu(In)19 b(the)f(ab)q(o)o(v)o(e)g
+(example,)1023 1299 y Fo(h)p 1035 1273 57 2 v 1035 1301
+a Fn(C-u)p 1035 1308 V 1090 1299 a Fo(i)1123 1301 y Fu(is)h(b)q(ound)g
+(to)f(the)g(function)h Ft(universal-)555 1355 y(argument)9
+b Fu(\(just)h(as)h(it)g(w)o(as)e(in)j(the)e(\014rst)h(example\),)g(`)
+1463 1353 y Fo(h)p 1475 1327 56 2 v 1475 1355 a Fn(C-x)p
+1475 1363 V 1529 1353 a Fo(i)k(h)p 1571 1327 51 2 v 1571
+1355 a Fn(C-r)p 1571 1363 V 1620 1353 a Fo(i)1635 1355
+y Fu(')10 b(is)h(b)q(ound)h(to)555 1410 y(the)k(function)i
+Ft(re-read-init-file)p Fu(,)c(and)i(`)1351 1408 y Fo(h)p
+1363 1382 70 2 v 1363 1410 a Fn(ESC)p 1363 1418 V 1430
+1408 a Fo(i)f(h)p 1472 1382 10 2 v 1472 1410 a Fn([)p
+1472 1419 V 1480 1408 a Fo(i)g(h)p 1522 1382 18 2 v 1522
+1410 a Fn(1)p 1522 1418 V 1538 1408 a Fo(i)g(h)p 1580
+1382 V 1580 1410 a Fn(1)p 1580 1418 V 1595 1408 a Fo(i)g(h)p
+1637 1382 24 2 v 1637 1410 a Ft(~)p 1637 1418 V 1659
+1408 a Fo(i)1674 1410 y Fu(')h(is)h(b)q(ound)555 1465
+y(to)e(insert)g(the)g(text)g(`)p Ft(Function)f(Key)h(1)p
+Fu('.)315 1543 y(The)g(follo)o(wing)h Fp(gnu)e Fu(Emacs)h(st)o(yle)g
+(escap)q(e)h(sequences)g(are)e(a)o(v)m(ailable)j(when)e(sp)q(ecifying)
+315 1598 y(k)o(ey)g(sequences:)315 1676 y Fk(\\C-)168
+b Fu(con)o(trol)15 b(pre\014x)315 1755 y Fk(\\M-)168
+b Fu(meta)15 b(pre\014x)315 1833 y Fk(\\e)192 b Fu(an)15
+b(escap)q(e)h(c)o(haracter)315 1911 y Fk(\\\\)192 b Fu(bac)o(kslash)315
+1989 y Fk(\\)p Ft(")555 1987 y Fo(h)p 567 1961 V 567
+1989 a Ft(")p 567 1997 V 589 1987 a Fo(i)604 1989 y Fu(,)15
+b(a)f(double)j(quotation)e(mark)315 2068 y Fk(\\')555
+2066 y Fo(h)p 567 2040 10 2 v 567 2068 a Fn(')p 567 2075
+V 575 2066 a Fo(i)590 2068 y Fu(,)g(a)f(single)j(quote)e(or)g(ap)q
+(ostrophe)315 2146 y(In)f(addition)h(to)f(the)f Fp(gnu)h
+Fu(Emacs)g(st)o(yle)f(escap)q(e)i(sequences,)g(a)e(second)i(set)e(of)h
+(bac)o(kslash)315 2201 y(escap)q(es)i(is)g(a)o(v)m(ailable:)315
+2279 y Ft(\\a)192 b Fu(alert)15 b(\(b)q(ell\))315 2357
+y Ft(\\b)192 b Fu(bac)o(kspace)315 2435 y Ft(\\d)g Fu(delete)315
+2514 y Ft(\\f)g Fu(form)14 b(feed)315 2592 y Ft(\\n)192
+b Fu(newline)315 2670 y Ft(\\r)g Fu(carriage)15 b(return)p
+eop
+%%Page: 8 10
+8 9 bop 75 -58 a Fu(8)1322 b(GNU)15 b(Readline)i(Library)315
+183 y Ft(\\t)192 b Fu(horizon)o(tal)16 b(tab)315 262
+y Ft(\\v)192 b Fu(v)o(ertical)16 b(tab)315 340 y Ft(\\)p
+Fm(nnn)141 b Fu(the)13 b(c)o(haracter)e(whose)i Ft(ASCII)e
+Fu(co)q(de)j(is)f(the)f(o)q(ctal)h(v)m(alue)h Fm(nnn)f
+Fu(\(one)f(to)g(three)555 395 y(digits\))315 473 y Ft(\\x)p
+Fm(nnn)117 b Fu(the)15 b(c)o(haracter)e(whose)i Ft(ASCII)e
+Fu(co)q(de)j(is)f(the)f(hexadecimal)i(v)m(alue)g Fm(nnn)f
+Fu(\(one)555 528 y(to)g(three)g(digits\))315 607 y(When)k(en)o(tering)g
+(the)g(text)f(of)g(a)h(macro,)f(single)i(or)e(double)i(quotes)f(m)o
+(ust)f(b)q(e)h(used)h(to)315 662 y(indicate)12 b(a)f(macro)f
+(de\014nition.)20 b(Unquoted)11 b(text)f(is)i(assumed)e(to)h(b)q(e)g(a)
+f(function)i(name.)18 b(In)315 716 y(the)11 b(macro)f(b)q(o)q(dy)l(,)i
+(the)f(bac)o(kslash)g(escap)q(es)g(describ)q(ed)i(ab)q(o)o(v)o(e)d(are)
+g(expanded.)20 b(Bac)o(kslash)315 771 y(will)i(quote)d(an)o(y)h(other)g
+(c)o(haracter)f(in)i(the)f(macro)f(text,)h(including)j(`)p
+Ft(")p Fu(')c(and)h(`)p Ft(')p Fu('.)34 b(F)l(or)315
+826 y(example,)14 b(the)f(follo)o(wing)g(binding)i(will)g(mak)o(e)d(`)p
+Ft(C-x)i(\\)p Fu(')f(insert)g(a)g(single)h(`)p Ft(\\)p
+Fu(')e(in)o(to)h(the)g(line:)435 890 y Ft("\\C-x\\\\":)23
+b("\\\\")75 1000 y Fl(1.3.2)30 b(Conditional)20 b(Init)g(Constructs)137
+1096 y Fu(Readline)g(implemen)o(ts)f(a)f(facilit)o(y)g(similar)h(in)g
+(spirit)f(to)f(the)h(conditional)h(compilation)g(features)75
+1150 y(of)e(the)g(C)g(prepro)q(cessor)g(whic)o(h)i(allo)o(ws)e(k)o(ey)g
+(bindings)i(and)f(v)m(ariable)g(settings)f(to)g(b)q(e)h(p)q(erformed)f
+(as)75 1205 y(the)e(result)h(of)f(tests.)k(There)c(are)g(four)g(parser)
+g(directiv)o(es)h(used.)75 1284 y Ft($if)168 b Fu(The)16
+b Ft($if)f Fu(construct)g(allo)o(ws)h(bindings)i(to)d(b)q(e)h(made)g
+(based)g(on)f(the)h(editing)h(mo)q(de,)f(the)315 1338
+y(terminal)k(b)q(eing)g(used,)g(or)f(the)g(application)i(using)e
+(Readline.)34 b(The)19 b(text)g(of)f(the)i(test)315 1393
+y(extends)c(to)e(the)h(end)h(of)f(the)g(line;)i(no)e(c)o(haracters)f
+(are)h(required)i(to)d(isolate)i(it.)315 1472 y Ft(mode)144
+b Fu(The)11 b Ft(mode=)e Fu(form)h(of)g(the)h Ft($if)f
+Fu(directiv)o(e)h(is)g(used)g(to)f(test)g(whether)h(Readline)555
+1527 y(is)k(in)h Ft(emacs)e Fu(or)g Ft(vi)g Fu(mo)q(de.)20
+b(This)c(ma)o(y)e(b)q(e)h(used)g(in)h(conjunction)g(with)f(the)555
+1581 y(`)p Ft(set)f(keymap)p Fu(')f(command,)g(for)h(instance,)g(to)f
+(set)h(bindings)h(in)g(the)f Ft(emacs-)555 1636 y(standard)d
+Fu(and)i Ft(emacs-ctlx)e Fu(k)o(eymaps)h(only)i(if)f(Readline)h(is)f
+(starting)f(out)555 1691 y(in)k Ft(emacs)f Fu(mo)q(de.)315
+1769 y Ft(term)144 b Fu(The)14 b Ft(term=)e Fu(form)h(ma)o(y)g(b)q(e)h
+(used)g(to)f(include)j(terminal-sp)q(eci\014c)g(k)o(ey)d(bind-)555
+1824 y(ings,)19 b(p)q(erhaps)g(to)e(bind)i(the)g(k)o(ey)e(sequences)j
+(output)e(b)o(y)g(the)g(terminal's)555 1879 y(function)13
+b(k)o(eys.)18 b(The)13 b(w)o(ord)e(on)h(the)g(righ)o(t)g(side)g(of)g
+(the)g(`)p Ft(=)p Fu(')f(is)h(tested)g(against)555 1934
+y(b)q(oth)j(the)g(full)i(name)e(of)f(the)h(terminal)h(and)f(the)g(p)q
+(ortion)h(of)e(the)h(terminal)555 1989 y(name)i(b)q(efore)g(the)g
+(\014rst)f(`)p Ft(-)p Fu('.)24 b(This)17 b(allo)o(ws)g
+Ft(sun)f Fu(to)g(matc)o(h)h(b)q(oth)f Ft(sun)h Fu(and)555
+2043 y Ft(sun-cmd)p Fu(,)d(for)g(instance.)315 2122 y
+Ft(application)555 2177 y Fu(The)d Fm(application)i Fu(construct)e(is)g
+(used)h(to)e(include)j(application-sp)q(eci)q(\014c)h(set-)555
+2231 y(tings.)19 b(Eac)o(h)12 b(program)f(using)j(the)e(Readline)j
+(library)e(sets)f(the)g Fm(application)555 2286 y(name)p
+Fu(,)17 b(and)f(y)o(ou)h(can)f(test)g(for)g(it.)24 b(This)18
+b(could)f(b)q(e)g(used)g(to)f(bind)i(k)o(ey)f(se-)555
+2341 y(quences)c(to)e(functions)i(useful)g(for)e(a)h(sp)q(eci\014c)i
+(program.)j(F)l(or)12 b(instance,)h(the)555 2396 y(follo)o(wing)i
+(command)f(adds)g(a)f(k)o(ey)h(sequence)h(that)f(quotes)f(the)i(curren)
+o(t)e(or)555 2451 y(previous)j(w)o(ord)e(in)i(Bash:)675
+2514 y Ft($if)23 b(Bash)675 2566 y(#)h(Quote)f(the)g(current)g(or)h
+(previous)f(word)675 2618 y("\\C-xq":)g("\\eb\\"\\ef\\"")675
+2670 y($endif)p eop
+%%Page: 9 11
+9 10 bop 75 -58 a Fu(Chapter)15 b(1:)k(Command)c(Line)i(Editing)1077
+b(9)75 183 y Ft($endif)96 b Fu(This)16 b(command,)e(as)h(seen)h(in)g
+(the)f(previous)h(example,)g(terminates)f(an)g Ft($if)f
+Fu(command.)75 263 y Ft($else)120 b Fu(Commands)15 b(in)h(this)f(branc)
+o(h)h(of)e(the)i Ft($if)e Fu(directiv)o(e)j(are)e(executed)h(if)g(the)f
+(test)g(fails.)75 343 y Ft($include)48 b Fu(This)14 b(directiv)o(e)i
+(tak)o(es)d(a)g(single)i(\014lename)g(as)f(an)f(argumen)o(t)g(and)h
+(reads)g(commands)g(and)315 397 y(bindings)j(from)e(that)f(\014le.)435
+462 y Ft($include)23 b(/etc/inputrc)75 574 y Fl(1.3.3)30
+b(Sample)20 b(Init)h(File)137 670 y Fu(Here)16 b(is)g(an)f(example)h
+(of)f(an)h(inputrc)g(\014le.)22 b(This)16 b(illustrates)g(k)o(ey)g
+(binding,)h(v)m(ariable)f(assignmen)o(t,)75 725 y(and)f(conditional)i
+(syn)o(tax.)p eop
+%%Page: 10 12
+10 11 bop 75 -58 a Fu(10)1299 b(GNU)15 b(Readline)i(Library)195
+235 y Ft(#)24 b(This)f(file)g(controls)g(the)h(behaviour)e(of)i(line)f
+(input)g(editing)g(for)195 287 y(#)h(programs)e(that)i(use)f(the)h(Gnu)
+f(Readline)g(library.)47 b(Existing)22 b(programs)195
+339 y(#)i(include)f(FTP,)g(Bash,)g(and)h(Gdb.)195 391
+y(#)195 443 y(#)g(You)f(can)h(re-read)f(the)g(inputrc)g(file)g(with)h
+(C-x)f(C-r.)195 495 y(#)h(Lines)f(beginning)g(with)g('#')g(are)h
+(comments.)195 546 y(#)195 598 y(#)g(First,)f(include)g(any)g
+(systemwide)g(bindings)f(and)i(variable)f(assignments)f(from)195
+650 y(#)i(/etc/Inputrc)195 702 y($include)f(/etc/Inputrc)195
+806 y(#)195 858 y(#)h(Set)f(various)g(bindings)g(for)g(emacs)g(mode.)
+195 962 y(set)g(editing-mode)g(emacs)195 1065 y($if)g(mode=emacs)195
+1169 y(Meta-Control-h:)46 b(backward-kill-word)21 b(Text)i(after)h(the)
+f(function)g(name)g(is)h(ignored)p 1986 1179 21 38 v
+195 1273 a(#)195 1325 y(#)g(Arrow)f(keys)g(in)h(keypad)f(mode)195
+1377 y(#)195 1429 y(#"\\M-OD":)190 b(backward-char)195
+1480 y(#"\\M-OC":)g(forward-char)195 1532 y(#"\\M-OA":)g
+(previous-history)195 1584 y(#"\\M-OB":)g(next-history)195
+1636 y(#)195 1688 y(#)24 b(Arrow)f(keys)g(in)h(ANSI)f(mode)195
+1740 y(#)195 1792 y("\\M-[D":)190 b(backward-char)195
+1844 y("\\M-[C":)g(forward-char)195 1896 y("\\M-[A":)g
+(previous-history)195 1947 y("\\M-[B":)g(next-history)195
+1999 y(#)195 2051 y(#)24 b(Arrow)f(keys)g(in)h(8)g(bit)f(keypad)g(mode)
+195 2103 y(#)195 2155 y(#"\\M-\\C-OD":)165 b(backward-char)195
+2207 y(#"\\M-\\C-OC":)g(forward-char)195 2259 y(#"\\M-\\C-OA":)g
+(previous-history)195 2311 y(#"\\M-\\C-OB":)g(next-history)195
+2363 y(#)195 2414 y(#)24 b(Arrow)f(keys)g(in)h(8)g(bit)f(ANSI)g(mode)
+195 2466 y(#)195 2518 y(#"\\M-\\C-[D":)165 b(backward-char)195
+2570 y(#"\\M-\\C-[C":)g(forward-char)195 2622 y(#"\\M-\\C-[A":)g
+(previous-history)p eop
+%%Page: 11 13
+11 12 bop 75 -58 a Fu(Chapter)15 b(1:)k(Command)c(Line)i(Editing)1055
+b(11)195 183 y Ft(#"\\M-\\C-[B":)165 b(next-history)195
+287 y(C-q:)23 b(quoted-insert)195 391 y($endif)195 495
+y(#)h(An)f(old-style)g(binding.)47 b(This)23 b(happens)g(to)g(be)h(the)
+f(default.)195 546 y(TAB:)g(complete)195 650 y(#)h(Macros)f(that)g(are)
+h(convenient)e(for)h(shell)h(interaction)195 702 y($if)f(Bash)195
+754 y(#)h(edit)f(the)g(path)195 806 y("\\C-xp":)g
+("PATH=${PATH}\\e\\C-e\\C-a\\)o(ef\\C-f")195 858 y(#)h(prepare)f(to)g
+(type)h(a)f(quoted)g(word)h(--)f(insert)g(open)h(and)f(close)g(double)g
+(quotes)195 910 y(#)h(and)f(move)g(to)h(just)f(after)h(the)f(open)g
+(quote)195 962 y("\\C-x\\"":)g("\\"\\"\\C-b")195 1013
+y(#)h(insert)f(a)g(backslash)g(\(testing)g(backslash)g(escapes)f(in)i
+(sequences)f(and)g(macros\))195 1065 y("\\C-x\\\\":)g("\\\\")195
+1117 y(#)h(Quote)f(the)g(current)g(or)h(previous)f(word)195
+1169 y("\\C-xq":)g("\\eb\\"\\ef\\"")195 1221 y(#)h(Add)f(a)h(binding)f
+(to)g(refresh)g(the)h(line,)f(which)g(is)h(unbound)195
+1273 y("\\C-xr":)f(redraw-current-line)195 1325 y(#)h(Edit)f(variable)g
+(on)g(current)g(line.)195 1377 y("\\M-\\C-v":)f
+("\\C-a\\C-k$\\C-y\\M-\\C-e\\C-a\\C-y=)o(")195 1429 y($endif)195
+1532 y(#)i(use)f(a)h(visible)f(bell)g(if)h(one)f(is)h(available)195
+1584 y(set)f(bell-style)g(visible)195 1688 y(#)h(don't)f(strip)g
+(characters)g(to)g(7)h(bits)f(when)h(reading)195 1740
+y(set)f(input-meta)g(on)195 1844 y(#)h(allow)f(iso-latin1)f(characters)
+h(to)g(be)h(inserted)f(rather)g(than)g(converted)g(to)195
+1896 y(#)h(prefix-meta)e(sequences)195 1947 y(set)h(convert-meta)g(off)
+195 2051 y(#)h(display)f(characters)f(with)h(the)h(eighth)f(bit)g(set)h
+(directly)f(rather)g(than)195 2103 y(#)h(as)f(meta-prefixed)f
+(characters)195 2155 y(set)h(output-meta)g(on)195 2259
+y(#)h(if)f(there)g(are)h(more)f(than)h(150)f(possible)g(completions)f
+(for)i(a)f(word,)h(ask)f(the)195 2311 y(#)h(user)f(if)h(he)f(wants)g
+(to)h(see)f(all)h(of)f(them)195 2363 y(set)g(completion-query-items)e
+(150)195 2466 y(#)j(For)f(FTP)195 2518 y($if)g(Ftp)195
+2570 y("\\C-xg":)g("get)g(\\M-?")195 2622 y("\\C-xt":)g("put)g(\\M-?")p
+eop
+%%Page: 12 14
+12 13 bop 75 -58 a Fu(12)1299 b(GNU)15 b(Readline)i(Library)195
+183 y Ft("\\M-.":)23 b(yank-last-arg)195 235 y($endif)75
+359 y Fs(1.4)33 b(Bindable)24 b(Readline)f(Commands)137
+453 y Fu(This)16 b(section)g(describ)q(es)h(Readline)g(commands)e(that)
+g(ma)o(y)f(b)q(e)i(b)q(ound)g(to)f(k)o(ey)g(sequences.)137
+519 y(Command)j(names)g(without)h(an)f(accompan)o(ying)g(k)o(ey)g
+(sequence)i(are)e(un)o(b)q(ound)h(b)o(y)g(default.)29
+b(In)75 573 y(the)15 b(follo)o(wing)h(descriptions,)g
+Fm(p)q(oin)o(t)h Fu(refers)e(to)f(the)i(curren)o(t)f(cursor)f(p)q
+(osition,)i(and)g Fm(mark)h Fu(refers)e(to)f(a)75 628
+y(cursor)h(p)q(osition)h(sa)o(v)o(ed)e(b)o(y)h(the)g
+Ft(set-mark)f Fu(command.)20 b(The)15 b(text)g(b)q(et)o(w)o(een)g(the)g
+(p)q(oin)o(t)h(and)f(mark)f(is)75 683 y(referred)h(to)g(as)g(the)g
+Fm(region)p Fu(.)75 790 y Fl(1.4.1)30 b(Commands)21 b(F)-5
+b(or)19 b(Mo)n(ving)75 895 y Ft(beginning-of-line)13
+b(\(C-a\))315 950 y Fu(Mo)o(v)o(e)h(to)h(the)g(start)f(of)h(the)g
+(curren)o(t)g(line.)75 1026 y Ft(end-of-line)f(\(C-e\))315
+1081 y Fu(Mo)o(v)o(e)g(to)h(the)g(end)h(of)f(the)g(line.)75
+1157 y Ft(forward-char)f(\(C-f\))315 1212 y Fu(Mo)o(v)o(e)g(forw)o(ard)
+g(a)h(c)o(haracter.)75 1288 y Ft(backward-char)e(\(C-b\))315
+1343 y Fu(Mo)o(v)o(e)h(bac)o(k)h(a)g(c)o(haracter.)75
+1419 y Ft(forward-word)f(\(M-f\))315 1474 y Fu(Mo)o(v)o(e)g(forw)o(ard)
+g(to)g(the)i(end)g(of)e(the)h(next)h(w)o(ord.)j(W)l(ords)c(are)f(comp)q
+(osed)i(of)f(letters)g(and)315 1529 y(digits.)75 1605
+y Ft(backward-word)e(\(M-b\))315 1660 y Fu(Mo)o(v)o(e)j(bac)o(k)g(to)h
+(the)f(start)g(of)g(the)h(curren)o(t)g(or)f(previous)i(w)o(ord.)24
+b(W)l(ords)16 b(are)h(comp)q(osed)315 1715 y(of)e(letters)g(and)g
+(digits.)75 1791 y Ft(clear-screen)f(\(C-l\))315 1846
+y Fu(Clear)f(the)h(screen)g(and)f(redra)o(w)g(the)g(curren)o(t)g(line,)
+i(lea)o(ving)g(the)e(curren)o(t)g(line)i(at)e(the)g(top)315
+1900 y(of)i(the)g(screen.)75 1977 y Ft(redraw-current-line)e(\(\))315
+2031 y Fu(Refresh)j(the)f(curren)o(t)g(line.)22 b(By)15
+b(default,)h(this)f(is)h(un)o(b)q(ound.)75 2138 y Fl(1.4.2)30
+b(Commands)21 b(F)-5 b(or)19 b(Manipulating)i(The)f(History)75
+2244 y Ft(accept-line)14 b(\(Newline,)g(Return\))315
+2298 y Fu(Accept)h(the)g(line)i(regardless)e(of)g(where)g(the)g(cursor)
+f(is.)20 b(If)c(this)f(line)h(is)g(non-empt)o(y)l(,)f(add)315
+2353 y(it)f(to)g(the)g(history)g(list.)20 b(If)14 b(this)h(line)g(w)o
+(as)e(a)h(history)g(line,)i(then)e(restore)f(the)h(history)g(line)315
+2408 y(to)h(its)g(original)h(state.)75 2484 y Ft(previous-history)d
+(\(C-p\))315 2539 y Fu(Mo)o(v)o(e)h(`up')h(through)g(the)g(history)g
+(list.)75 2615 y Ft(next-history)f(\(C-n\))315 2670 y
+Fu(Mo)o(v)o(e)g(`do)o(wn')g(through)h(the)h(history)f(list.)p
+eop
+%%Page: 13 15
+13 14 bop 75 -58 a Fu(Chapter)15 b(1:)k(Command)c(Line)i(Editing)1055
+b(13)75 183 y Ft(beginning-of-history)12 b(\(M-<\))315
+238 y Fu(Mo)o(v)o(e)i(to)h(the)g(\014rst)g(line)i(in)f(the)f(history)l
+(.)75 314 y Ft(end-of-history)e(\(M->\))315 369 y Fu(Mo)o(v)o(e)h(to)h
+(the)g(end)h(of)f(the)g(input)h(history)l(,)f(i.e.,)g(the)g(line)i
+(curren)o(tly)f(b)q(eing)g(en)o(tered.)75 445 y Ft
+(reverse-search-history)c(\(C-r\))315 500 y Fu(Searc)o(h)k(bac)o(kw)o
+(ard)e(starting)h(at)g(the)h(curren)o(t)f(line)j(and)d(mo)o(ving)h
+(`up')f(through)g(the)h(his-)315 555 y(tory)e(as)h(necessary)l(.)20
+b(This)c(is)g(an)f(incremen)o(tal)h(searc)o(h.)75 631
+y Ft(forward-search-history)c(\(C-s\))315 686 y Fu(Searc)o(h)j(forw)o
+(ard)e(starting)h(at)h(the)f(curren)o(t)h(line)h(and)f(mo)o(ving)g(`do)
+o(wn')f(through)g(the)h(the)315 741 y(history)g(as)g(necessary)l(.)20
+b(This)c(is)g(an)f(incremen)o(tal)h(searc)o(h.)75 817
+y Ft(non-incremental-reverse-se)o(arch-hi)o(story)c(\(M-p\))315
+872 y Fu(Searc)o(h)k(bac)o(kw)o(ard)e(starting)h(at)g(the)h(curren)o(t)
+f(line)j(and)d(mo)o(ving)h(`up')f(through)g(the)h(his-)315
+926 y(tory)h(as)h(necessary)g(using)h(a)e(non-incremen)o(tal)j(searc)o
+(h)e(for)f(a)h(string)g(supplied)i(b)o(y)e(the)315 981
+y(user.)75 1057 y Ft(non-incremental-forward-se)o(arch-hi)o(story)12
+b(\(M-n\))315 1112 y Fu(Searc)o(h)j(forw)o(ard)e(starting)h(at)h(the)f
+(curren)o(t)h(line)h(and)f(mo)o(ving)g(`do)o(wn')f(through)g(the)h(the)
+315 1167 y(history)e(as)g(necessary)h(using)g(a)f(non-incremen)o(tal)i
+(searc)o(h)e(for)g(a)g(string)g(supplied)j(b)o(y)d(the)315
+1222 y(user.)75 1298 y Ft(history-search-forward)f(\(\))315
+1353 y Fu(Searc)o(h)21 b(forw)o(ard)e(through)i(the)f(history)h(for)f
+(the)h(string)g(of)f(c)o(haracters)g(b)q(et)o(w)o(een)h(the)315
+1407 y(start)16 b(of)h(the)h(curren)o(t)g(line)h(and)e(the)h(p)q(oin)o
+(t.)28 b(This)18 b(is)g(a)f(non-incremen)o(tal)i(searc)o(h.)27
+b(By)315 1462 y(default,)15 b(this)h(command)f(is)h(un)o(b)q(ound.)75
+1538 y Ft(history-search-backward)c(\(\))315 1593 y Fu(Searc)o(h)18
+b(bac)o(kw)o(ard)e(through)h(the)h(history)f(for)g(the)g(string)h(of)f
+(c)o(haracters)f(b)q(et)o(w)o(een)i(the)315 1648 y(start)e(of)h(the)h
+(curren)o(t)g(line)h(and)e(the)h(p)q(oin)o(t.)28 b(This)18
+b(is)g(a)f(non-incremen)o(tal)i(searc)o(h.)27 b(By)315
+1703 y(default,)15 b(this)h(command)f(is)h(un)o(b)q(ound.)75
+1779 y Ft(yank-nth-arg)e(\(M-C-y\))315 1834 y Fu(Insert)f(the)g
+(\014rst)g(argumen)o(t)f(to)g(the)i(previous)f(command)g(\(usually)h
+(the)f(second)h(w)o(ord)e(on)315 1889 y(the)i(previous)i(line\).)21
+b(With)14 b(an)h(argumen)o(t)e Fm(n)p Fu(,)i(insert)f(the)h
+Fm(n)p Fu(th)f(w)o(ord)g(from)g(the)g(previous)315 1943
+y(command)f(\(the)h(w)o(ords)f(in)h(the)g(previous)g(command)g(b)q
+(egin)h(with)f(w)o(ord)e(0\).)19 b(A)14 b(negativ)o(e)315
+1998 y(argumen)o(t)g(inserts)i(the)f Fm(n)p Fu(th)h(w)o(ord)e(from)h
+(the)g(end)h(of)e(the)i(previous)g(command.)75 2074 y
+Ft(yank-last-arg)d(\(M-.,)i(M-_\))315 2129 y Fu(Insert)j(last)f
+(argumen)o(t)g(to)g(the)g(previous)i(command)e(\(the)g(last)h(w)o(ord)f
+(of)g(the)g(previous)315 2184 y(history)e(en)o(try\).)20
+b(With)15 b(an)g(argumen)o(t,)g(b)q(eha)o(v)o(e)g(exactly)h(lik)o(e)g
+Ft(yank-nth-arg)p Fu(.)j(Succes-)315 2239 y(siv)o(e)f(calls)g(to)f
+Ft(yank-last-arg)e Fu(mo)o(v)o(e)i(bac)o(k)g(through)g(the)g(history)g
+(list,)i(inserting)f(the)315 2294 y(last)d(argumen)o(t)g(of)f(eac)o(h)i
+(line)g(in)g(turn.)75 2400 y Fl(1.4.3)30 b(Commands)21
+b(F)-5 b(or)19 b(Changing)i(T)-5 b(ext)75 2506 y Ft(delete-char)14
+b(\(C-d\))315 2560 y Fu(Delete)j(the)f(c)o(haracter)g(under)h(the)f
+(cursor.)23 b(If)16 b(the)h(cursor)f(is)h(at)e(the)i(b)q(eginning)h(of)
+e(the)315 2615 y(line,)j(there)e(are)g(no)g(c)o(haracters)f(in)i(the)g
+(line,)h(and)e(the)g(last)g(c)o(haracter)g(t)o(yp)q(ed)g(w)o(as)f(not)
+315 2670 y(b)q(ound)g(to)f Ft(delete-char)p Fu(,)e(then)j(return)f
+Ft(EOF)p Fu(.)p eop
+%%Page: 14 16
+14 15 bop 75 -58 a Fu(14)1299 b(GNU)15 b(Readline)i(Library)75
+183 y Ft(backward-delete-char)12 b(\(Rubout\))315 238
+y Fu(Delete)k(the)f(c)o(haracter)f(b)q(ehind)j(the)f(cursor.)j(A)c(n)o
+(umeric)h(argumen)o(t)e(means)i(to)e(kill)j(the)315 293
+y(c)o(haracters)d(instead)i(of)f(deleting)i(them.)75
+378 y Ft(forward-backward-delete-ch)o(ar)12 b(\(\))315
+432 y Fu(Delete)20 b(the)f(c)o(haracter)f(under)i(the)f(cursor,)h
+(unless)g(the)f(cursor)g(is)h(at)e(the)h(end)h(of)f(the)315
+487 y(line,)e(in)g(whic)o(h)g(case)e(the)h(c)o(haracter)g(b)q(ehind)h
+(the)f(cursor)g(is)g(deleted.)23 b(By)16 b(default,)h(this)315
+542 y(is)f(not)f(b)q(ound)h(to)e(a)h(k)o(ey)l(.)75 627
+y Ft(quoted-insert)e(\(C-q,)i(C-v\))315 682 y Fu(Add)j(the)f(next)g(c)o
+(haracter)g(t)o(yp)q(ed)g(to)f(the)i(line)g(v)o(erbatim.)26
+b(This)18 b(is)f(ho)o(w)g(to)g(insert)g(k)o(ey)315 736
+y(sequences)f(lik)o(e)605 734 y Fo(h)p 617 708 56 2 v
+617 736 a Fn(C-q)p 617 744 V 671 734 a Fo(i)685 736 y
+Fu(,)f(for)g(example.)75 821 y Ft(tab-insert)f(\(M-TAB\))315
+876 y Fu(Insert)h(a)g(tab)g(c)o(haracter.)75 961 y Ft(self-insert)f
+(\(a,)g(b,)h(A,)g(1,)g(!,)g(...\))315 1016 y Fu(Insert)g(y)o(ourself.)
+75 1100 y Ft(transpose-chars)e(\(C-t\))315 1155 y Fu(Drag)i(the)h(c)o
+(haracter)f(b)q(efore)h(the)h(cursor)e(forw)o(ard)g(o)o(v)o(er)g(the)h
+(c)o(haracter)f(at)h(the)g(cursor,)315 1210 y(mo)o(ving)i(the)f(cursor)
+h(forw)o(ard)e(as)i(w)o(ell.)28 b(If)18 b(the)g(insertion)h(p)q(oin)o
+(t)f(is)g(at)f(the)h(end)h(of)e(the)315 1265 y(line,)c(then)e(this)h
+(transp)q(oses)e(the)h(last)g(t)o(w)o(o)f(c)o(haracters)g(of)h(the)g
+(line.)20 b(Negativ)o(e)11 b(argumen)o(ts)315 1320 y(ha)o(v)o(e)k(no)g
+(e\013ect.)75 1404 y Ft(transpose-words)e(\(M-t\))315
+1459 y Fu(Drag)i(the)h(w)o(ord)g(b)q(efore)g(p)q(oin)o(t)h(past)f(the)g
+(w)o(ord)f(after)h(p)q(oin)o(t,)g(mo)o(ving)g(p)q(oin)o(t)h(past)f
+(that)315 1514 y(w)o(ord)f(as)f(w)o(ell.)75 1599 y Ft(upcase-word)g
+(\(M-u\))315 1654 y Fu(Upp)q(ercase)j(the)f(curren)o(t)g(\(or)f(follo)o
+(wing\))h(w)o(ord.)22 b(With)16 b(a)g(negativ)o(e)g(argumen)o(t,)f(upp)
+q(er-)315 1708 y(case)g(the)g(previous)h(w)o(ord,)f(but)g(do)g(not)g
+(mo)o(v)o(e)f(the)i(cursor.)75 1793 y Ft(downcase-word)d(\(M-l\))315
+1848 y Fu(Lo)o(w)o(ercase)d(the)h(curren)o(t)g(\(or)f(follo)o(wing\))h
+(w)o(ord.)17 b(With)11 b(a)g(negativ)o(e)g(argumen)o(t,)f(lo)o(w)o
+(ercase)315 1903 y(the)15 b(previous)h(w)o(ord,)e(but)i(do)f(not)g(mo)o
+(v)o(e)f(the)h(cursor.)75 1988 y Ft(capitalize-word)e(\(M-c\))315
+2042 y Fu(Capitalize)f(the)f(curren)o(t)f(\(or)g(follo)o(wing\))h(w)o
+(ord.)18 b(With)11 b(a)f(negativ)o(e)h(argumen)o(t,)f(capitalize)315
+2097 y(the)15 b(previous)h(w)o(ord,)e(but)i(do)f(not)g(mo)o(v)o(e)f
+(the)h(cursor.)75 2220 y Fl(1.4.4)30 b(Killing)20 b(And)h(Y)-5
+b(anking)75 2336 y Ft(kill-line)14 b(\(C-k\))315 2391
+y Fu(Kill)j(the)f(text)e(from)h(p)q(oin)o(t)h(to)e(the)h(end)h(of)f
+(the)g(line.)75 2476 y Ft(backward-kill-line)e(\(C-x)h(Rubout\))315
+2530 y Fu(Kill)j(bac)o(kw)o(ard)e(to)f(the)i(b)q(eginning)h(of)e(the)g
+(line.)75 2615 y Ft(unix-line-discard)e(\(C-u\))315 2670
+y Fu(Kill)k(bac)o(kw)o(ard)e(from)f(the)i(cursor)e(to)h(the)g(b)q
+(eginning)j(of)c(the)i(curren)o(t)f(line.)p eop
+%%Page: 15 17
+15 16 bop 75 -58 a Fu(Chapter)15 b(1:)k(Command)c(Line)i(Editing)1055
+b(15)75 183 y Ft(kill-whole-line)13 b(\(\))315 238 y
+Fu(Kill)20 b(all)f(c)o(haracters)e(on)h(the)g(curren)o(t)f(line,)j(no)e
+(matter)f(p)q(oin)o(t)h(is.)28 b(By)18 b(default,)h(this)f(is)315
+293 y(un)o(b)q(ound.)75 374 y Ft(kill-word)c(\(M-d\))315
+429 y Fu(Kill)j(from)d(p)q(oin)o(t)h(to)f(the)h(end)g(of)f(the)h
+(curren)o(t)g(w)o(ord,)e(or)i(if)g(b)q(et)o(w)o(een)g(w)o(ords,)e(to)i
+(the)f(end)315 483 y(of)h(the)g(next)g(w)o(ord.)20 b(W)l(ord)14
+b(b)q(oundaries)j(are)e(the)g(same)g(as)g Ft(forward-word)p
+Fu(.)75 564 y Ft(backward-kill-word)e(\(M-DEL\))315 619
+y Fu(Kill)k(the)d(w)o(ord)g(b)q(ehind)i(p)q(oin)o(t.)21
+b(W)l(ord)14 b(b)q(oundaries)h(are)f(the)h(same)f(as)g
+Ft(backward-word)p Fu(.)75 700 y Ft(unix-word-rubout)f(\(C-w\))315
+755 y Fu(Kill)18 b(the)e(w)o(ord)f(b)q(ehind)j(p)q(oin)o(t,)e(using)h
+(white)f(space)g(as)g(a)f(w)o(ord)g(b)q(oundary)l(.)23
+b(The)16 b(killed)315 810 y(text)f(is)g(sa)o(v)o(ed)g(on)g(the)h
+(kill-ring.)75 891 y Ft(delete-horizontal-space)c(\(\))315
+946 y Fu(Delete)k(all)g(spaces)f(and)h(tabs)e(around)i(p)q(oin)o(t.)k
+(By)15 b(default,)h(this)f(is)h(un)o(b)q(ound.)75 1027
+y Ft(kill-region)e(\(\))315 1082 y Fu(Kill)j(the)f(text)e(in)i(the)g
+(curren)o(t)f(region.)20 b(By)15 b(default,)h(this)f(command)g(is)h(un)
+o(b)q(ound.)75 1163 y Ft(copy-region-as-kill)d(\(\))315
+1217 y Fu(Cop)o(y)j(the)i(text)e(in)i(the)f(region)g(to)g(the)g(kill)h
+(bu\013er,)f(so)g(it)g(can)g(b)q(e)h(y)o(ank)o(ed)f(righ)o(t)g(a)o(w)o
+(a)o(y)l(.)315 1272 y(By)e(default,)h(this)f(command)g(is)h(un)o(b)q
+(ound.)75 1353 y Ft(copy-backward-word)d(\(\))315 1408
+y Fu(Cop)o(y)19 b(the)g(w)o(ord)g(b)q(efore)g(p)q(oin)o(t)h(to)e(the)i
+(kill)h(bu\013er.)32 b(The)19 b(w)o(ord)g(b)q(oundaries)h(are)f(the)315
+1463 y(same)c(as)g Ft(backward-word)p Fu(.)j(By)d(default,)g(this)h
+(command)f(is)h(un)o(b)q(ound.)75 1544 y Ft(copy-forward-word)d(\(\))
+315 1599 y Fu(Cop)o(y)i(the)h(w)o(ord)e(follo)o(wing)j(p)q(oin)o(t)f
+(to)f(the)g(kill)j(bu\013er.)i(The)c(w)o(ord)f(b)q(oundaries)i(are)e
+(the)315 1653 y(same)g(as)g Ft(forward-word)p Fu(.)j(By)d(default,)h
+(this)f(command)g(is)h(un)o(b)q(ound.)75 1734 y Ft(yank)f(\(C-y\))315
+1789 y Fu(Y)l(ank)g(the)h(top)f(of)f(the)i(kill)h(ring)e(in)o(to)g(the)
+h(bu\013er)f(at)f(the)i(curren)o(t)f(cursor)g(p)q(osition.)75
+1870 y Ft(yank-pop)f(\(M-y\))315 1925 y Fu(Rotate)j(the)g(kill-ring,)j
+(and)d(y)o(ank)g(the)h(new)f(top.)26 b(Y)l(ou)17 b(can)h(only)g(do)f
+(this)h(if)f(the)h(prior)315 1980 y(command)d(is)h(y)o(ank)f(or)f(y)o
+(ank-p)q(op.)75 2095 y Fl(1.4.5)30 b(Sp)r(ecifying)20
+b(Numeric)h(Argumen)n(ts)75 2205 y Ft(digit-argument)13
+b(\(M-0,)i(M-1,)f(...)h(M--\))315 2260 y Fu(Add)f(this)g(digit)g(to)f
+(the)h(argumen)o(t)e(already)i(accum)o(ulating,)g(or)f(start)f(a)h(new)
+h(argumen)o(t.)315 2313 y Fo(h)p 327 2287 50 2 v 327
+2315 a Fn(M{)p 327 2323 V 375 2313 a Fo(i)405 2315 y
+Fu(starts)g(a)h(negativ)o(e)g(argumen)o(t.)75 2396 y
+Ft(universal-argument)e(\(\))315 2451 y Fu(This)g(is)h(another)e(w)o(a)
+o(y)g(to)g(sp)q(ecify)i(an)f(argumen)o(t.)18 b(If)13
+b(this)g(command)g(is)g(follo)o(w)o(ed)g(b)o(y)g(one)315
+2506 y(or)h(more)h(digits,)g(optionally)h(with)f(a)g(leading)h(min)o
+(us)f(sign,)g(those)g(digits)g(de\014ne)h(the)f(ar-)315
+2560 y(gumen)o(t.)k(If)c(the)g(command)f(is)h(follo)o(w)o(ed)g(b)o(y)g
+(digits,)g(executing)g Ft(universal-argument)315 2615
+y Fu(again)h(ends)g(the)g(n)o(umeric)h(argumen)o(t,)e(but)h(is)h
+(otherwise)f(ignored.)22 b(As)16 b(a)g(sp)q(ecial)h(case,)315
+2670 y(if)g(this)g(command)f(is)h(immediately)h(follo)o(w)o(ed)f(b)o(y)
+f(a)g(c)o(haracter)g(that)g(is)h(neither)g(a)f(digit)p
+eop
+%%Page: 16 18
+16 17 bop 75 -58 a Fu(16)1299 b(GNU)15 b(Readline)i(Library)315
+183 y(or)c(min)o(us)i(sign,)f(the)g(argumen)o(t)g(coun)o(t)f(for)h(the)
+g(next)g(command)g(is)g(m)o(ultiplied)j(b)o(y)d(four.)315
+238 y(The)19 b(argumen)o(t)f(coun)o(t)g(is)h(initially)j(one,)d(so)f
+(executing)i(this)f(function)h(the)e(\014rst)h(time)315
+293 y(mak)o(es)c(the)h(argumen)o(t)f(coun)o(t)h(four,)f(a)h(second)g
+(time)g(mak)o(es)g(the)g(argumen)o(t)f(coun)o(t)g(six-)315
+348 y(teen,)g(and)g(so)g(on.)20 b(By)15 b(default,)h(this)f(is)h(not)f
+(b)q(ound)h(to)f(a)g(k)o(ey)l(.)75 472 y Fl(1.4.6)30
+b(Letting)20 b(Readline)g(T)n(yp)r(e)h(F)-5 b(or)19 b(Y)-5
+b(ou)75 590 y Ft(complete)14 b(\(TAB\))315 644 y Fu(A)o(ttempt)j(to)g
+(do)h(completion)g(on)g(the)g(text)f(b)q(efore)h(the)g(cursor.)27
+b(This)18 b(is)g(application-)315 699 y(sp)q(eci\014c.)k(Generally)l(,)
+15 b(if)g(y)o(ou)g(are)f(t)o(yping)h(a)g(\014lename)g(argumen)o(t,)f(y)
+o(ou)g(can)h(do)g(\014lename)315 754 y(completion;)h(if)g(y)o(ou)f(are)
+g(t)o(yping)h(a)f(command,)f(y)o(ou)h(can)h(do)f(command)g(completion;)
+h(if)315 809 y(y)o(ou)i(are)g(t)o(yping)g(in)h(a)f(sym)o(b)q(ol)h(to)e
+(GDB,)h(y)o(ou)g(can)g(do)g(sym)o(b)q(ol)h(name)f(completion;)i(if)315
+864 y(y)o(ou)13 b(are)g(t)o(yping)g(in)h(a)f(v)m(ariable)h(to)f(Bash,)g
+(y)o(ou)g(can)g(do)g(v)m(ariable)h(name)f(completion,)i(and)315
+918 y(so)g(on.)75 1004 y Ft(possible-completions)d(\(M-?\))315
+1059 y Fu(List)k(the)f(p)q(ossible)i(completions)f(of)f(the)g(text)g(b)
+q(efore)h(the)f(cursor.)75 1145 y Ft(insert-completions)e(\(M-*\))315
+1199 y Fu(Insert)j(all)g(completions)g(of)f(the)g(text)g(b)q(efore)h(p)
+q(oin)o(t)f(that)g(w)o(ould)h(ha)o(v)o(e)f(b)q(een)h(generated)315
+1254 y(b)o(y)f Ft(possible-completions)p Fu(.)75 1340
+y Ft(menu-complete)e(\(\))315 1395 y Fu(Similar)g(to)f
+Ft(complete)p Fu(,)f(but)h(replaces)h(the)f(w)o(ord)f(to)g(b)q(e)i
+(completed)f(with)h(a)e(single)j(matc)o(h)315 1450 y(from)k(the)h(list)
+h(of)e(p)q(ossible)j(completions.)32 b(Rep)q(eated)20
+b(execution)g(of)f Ft(menu-complete)315 1504 y Fu(steps)h(through)g
+(the)g(list)h(of)f(p)q(ossible)i(completions,)g(inserting)f(eac)o(h)f
+(matc)o(h)f(in)i(turn.)315 1559 y(A)o(t)c(the)g(end)h(of)f(the)h(list)g
+(of)f(completions,)i(the)e(b)q(ell)j(is)e(rung)f(and)h(the)f(original)i
+(text)d(is)315 1614 y(restored.)26 b(An)17 b(argumen)o(t)g(of)g
+Fm(n)g Fu(mo)o(v)o(es)g Fm(n)g Fu(p)q(ositions)h(forw)o(ard)e(in)i(the)
+g(list)g(of)f(matc)o(hes;)315 1669 y(a)j(negativ)o(e)g(argumen)o(t)f
+(ma)o(y)g(b)q(e)i(used)f(to)f(mo)o(v)o(e)h(bac)o(kw)o(ard)f(through)g
+(the)h(list.)35 b(This)315 1724 y(command)15 b(is)h(in)o(tended)g(to)f
+(b)q(e)h(b)q(ound)g(to)f Ft(TAB)p Fu(,)f(but)h(is)h(un)o(b)q(ound)g(b)o
+(y)f(default.)75 1809 y Ft(delete-char-or-list)e(\(\))315
+1864 y Fu(Deletes)h(the)f(c)o(haracter)g(under)h(the)g(cursor)f(if)h
+(not)f(at)g(the)g(b)q(eginning)j(or)d(end)h(of)f(the)g(line)315
+1919 y(\(lik)o(e)i Ft(delete-char)p Fu(\).)j(If)d(at)f(the)h(end)g(of)f
+(the)g(line,)i(b)q(eha)o(v)o(es)f(iden)o(tically)i(to)d
+Ft(possible-)315 1974 y(completions)p Fu(.)k(This)e(command)f(is)h(un)o
+(b)q(ound)g(b)o(y)f(default.)75 2098 y Fl(1.4.7)30 b(Keyb)r(oard)20
+b(Macros)75 2216 y Ft(start-kbd-macro)13 b(\(C-x)i(\(\))315
+2270 y Fu(Begin)h(sa)o(ving)f(the)h(c)o(haracters)e(t)o(yp)q(ed)i(in)o
+(to)f(the)g(curren)o(t)g(k)o(eyb)q(oard)g(macro.)75 2356
+y Ft(end-kbd-macro)e(\(C-x)i(\)\))315 2411 y Fu(Stop)f(sa)o(ving)f(the)
+h(c)o(haracters)f(t)o(yp)q(ed)h(in)o(to)f(the)h(curren)o(t)g(k)o(eyb)q
+(oard)f(macro)g(and)h(sa)o(v)o(e)f(the)315 2466 y(de\014nition.)75
+2552 y Ft(call-last-kbd-macro)g(\(C-x)h(e\))315 2606
+y Fu(Re-execute)19 b(the)f(last)f(k)o(eyb)q(oard)h(macro)f(de\014ned,)i
+(b)o(y)e(making)h(the)g(c)o(haracters)e(in)j(the)315
+2661 y(macro)14 b(app)q(ear)i(as)f(if)g(t)o(yp)q(ed)h(at)e(the)i(k)o
+(eyb)q(oard.)p eop
+%%Page: 17 19
+17 18 bop 75 -58 a Fu(Chapter)15 b(1:)k(Command)c(Line)i(Editing)1055
+b(17)75 183 y Fl(1.4.8)30 b(Some)20 b(Miscellaneous)h(Commands)75
+298 y Ft(re-read-init-file)13 b(\(C-x)h(C-r\))315 353
+y Fu(Read)e(in)f(the)g(con)o(ten)o(ts)g(of)f(the)h Fm(inputrc)k
+Fu(\014le,)d(and)g(incorp)q(orate)f(an)o(y)f(bindings)j(or)e(v)m
+(ariable)315 407 y(assignmen)o(ts)k(found)h(there.)75
+491 y Ft(abort)e(\(C-g\))315 546 y Fu(Ab)q(ort)f(the)g(curren)o(t)h
+(editing)g(command)f(and)h(ring)f(the)h(terminal's)f(b)q(ell)i(\(sub)s
+(ject)e(to)g(the)315 600 y(setting)i(of)g Ft(bell-style)p
+Fu(\).)75 684 y Ft(do-uppercase-version)d(\(M-a,)j(M-b,)f(M-)p
+Fm(x)p Ft(,)h Fj(:)8 b(:)g(:)n Ft(\))315 739 y Fu(If)14
+b(the)g(meta\014ed)g(c)o(haracter)f Fm(x)k Fu(is)d(lo)o(w)o(ercase,)g
+(run)g(the)g(command)f(that)h(is)g(b)q(ound)h(to)e(the)315
+794 y(corresp)q(onding)j(upp)q(ercase)g(c)o(haracter.)75
+877 y Ft(prefix-meta)e(\(ESC\))315 932 y Fu(Mak)o(e)j(the)i(next)f(c)o
+(haracter)f(t)o(yp)q(ed)i(b)q(e)g(meta\014ed.)28 b(This)19
+b(is)g(for)e(k)o(eyb)q(oards)h(without)g(a)315 987 y(meta)d(k)o(ey)l(.)
+20 b(T)o(yping)15 b(`)p Ft(ESC)g(f)p Fu(')f(is)i(equiv)m(alen)o(t)h(to)
+d(t)o(yping)i(`)p Ft(M-f)p Fu('.)75 1070 y Ft(undo)f(\(C-_,)f(C-x)h
+(C-u\))315 1125 y Fu(Incremen)o(tal)h(undo,)f(separately)h(remem)o(b)q
+(ered)g(for)e(eac)o(h)h(line.)75 1209 y Ft(revert-line)f(\(M-r\))315
+1263 y Fu(Undo)j(all)g(c)o(hanges)g(made)f(to)g(this)h(line.)26
+b(This)17 b(is)g(lik)o(e)h(executing)f(the)g Ft(undo)f
+Fu(command)315 1318 y(enough)g(times)f(to)g(get)f(bac)o(k)h(to)g(the)g
+(b)q(eginning.)75 1402 y Ft(tilde-expand)f(\(M-~\))315
+1456 y Fu(P)o(erform)g(tilde)j(expansion)f(on)f(the)g(curren)o(t)g(w)o
+(ord.)75 1540 y Ft(set-mark)f(\(C-@\))315 1595 y Fu(Set)g(the)f(mark)g
+(to)g(the)h(curren)o(t)g(p)q(oin)o(t.)19 b(If)14 b(a)g(n)o(umeric)g
+(argumen)o(t)f(is)h(supplied,)i(the)e(mark)315 1650 y(is)i(set)f(to)f
+(that)h(p)q(osition.)75 1733 y Ft(exchange-point-and-mark)d(\(C-x)j
+(C-x\))315 1788 y Fu(Sw)o(ap)g(the)h(p)q(oin)o(t)g(with)g(the)g(mark.)k
+(The)c(curren)o(t)f(cursor)h(p)q(osition)g(is)g(set)g(to)f(the)g(sa)o
+(v)o(ed)315 1843 y(p)q(osition,)h(and)f(the)h(old)f(cursor)g(p)q
+(osition)h(is)g(sa)o(v)o(ed)f(as)g(the)g(mark.)75 1926
+y Ft(character-search)e(\(C-]\))315 1981 y Fu(A)f(c)o(haracter)g(is)h
+(read)g(and)f(p)q(oin)o(t)h(is)g(mo)o(v)o(ed)f(to)g(the)g(next)h(o)q
+(ccurrence)g(of)f(that)g(c)o(haracter.)315 2036 y(A)j(negativ)o(e)h
+(coun)o(t)f(searc)o(hes)g(for)f(previous)i(o)q(ccurrences.)75
+2119 y Ft(character-search-backward)c(\(M-C-]\))315 2174
+y Fu(A)22 b(c)o(haracter)g(is)h(read)f(and)h(p)q(oin)o(t)g(is)g(mo)o(v)
+o(ed)f(to)g(the)g(previous)h(o)q(ccurrence)h(of)e(that)315
+2229 y(c)o(haracter.)d(A)c(negativ)o(e)h(coun)o(t)f(searc)o(hes)g(for)f
+(subsequen)o(t)i(o)q(ccurrences.)75 2312 y Ft(insert-comment)d(\(M-#\))
+315 2367 y Fu(The)19 b(v)m(alue)i(of)e(the)g Ft(comment-begin)e
+Fu(v)m(ariable)k(is)f(inserted)g(at)e(the)i(b)q(eginning)h(of)e(the)315
+2422 y(curren)o(t)c(line,)i(and)e(the)g(line)i(is)f(accepted)g(as)e(if)
+i(a)f(newline)i(had)f(b)q(een)g(t)o(yp)q(ed.)75 2506
+y Ft(dump-functions)d(\(\))315 2560 y Fu(Prin)o(t)g(all)h(of)f(the)g
+(functions)h(and)g(their)g(k)o(ey)f(bindings)i(to)d(the)i(Readline)h
+(output)e(stream.)315 2615 y(If)j(a)g(n)o(umeric)g(argumen)o(t)f(is)i
+(supplied,)h(the)e(output)f(is)i(formatted)d(in)j(suc)o(h)f(a)g(w)o(a)o
+(y)f(that)315 2670 y(it)g(can)h(b)q(e)g(made)f(part)f(of)h(an)g
+Fm(inputrc)k Fu(\014le.)i(This)16 b(command)f(is)h(un)o(b)q(ound)g(b)o
+(y)f(default.)p eop
+%%Page: 18 20
+18 19 bop 75 -58 a Fu(18)1299 b(GNU)15 b(Readline)i(Library)75
+183 y Ft(dump-variables)c(\(\))315 238 y Fu(Prin)o(t)e(all)g(of)f(the)h
+(settable)g(v)m(ariables)h(and)f(their)g(v)m(alues)h(to)e(the)h
+(Readline)i(output)d(stream.)315 293 y(If)16 b(a)g(n)o(umeric)g
+(argumen)o(t)f(is)i(supplied,)h(the)e(output)f(is)i(formatted)d(in)j
+(suc)o(h)f(a)g(w)o(a)o(y)f(that)315 348 y(it)g(can)h(b)q(e)g(made)f
+(part)f(of)h(an)g Fm(inputrc)k Fu(\014le.)i(This)16 b(command)f(is)h
+(un)o(b)q(ound)g(b)o(y)f(default.)75 427 y Ft(dump-macros)f(\(\))315
+482 y Fu(Prin)o(t)j(all)h(of)e(the)h(Readline)i(k)o(ey)e(sequences)h(b)
+q(ound)g(to)e(macros)g(and)h(the)g(strings)g(they)315
+537 y(ouput.)30 b(If)19 b(a)f(n)o(umeric)i(argumen)o(t)d(is)i
+(supplied,)j(the)c(output)h(is)g(formatted)e(in)i(suc)o(h)g(a)315
+592 y(w)o(a)o(y)14 b(that)g(it)i(can)f(b)q(e)g(made)g(part)g(of)f(an)h
+Fm(inputrc)k Fu(\014le.)i(This)15 b(command)g(is)h(un)o(b)q(ound)g(b)o
+(y)315 647 y(default.)75 775 y Fs(1.5)33 b(Readline)23
+b(vi)h(Mo)r(de)137 871 y Fu(While)13 b(the)f(Readline)j(library)d(do)q
+(es)g(not)g(ha)o(v)o(e)f(a)h(full)h(set)f(of)f Ft(vi)g
+Fu(editing)j(functions,)f(it)f(do)q(es)g(con)o(tain)75
+926 y(enough)17 b(to)g(allo)o(w)g(simple)h(editing)h(of)d(the)i(line.)
+27 b(The)17 b(Readline)i Ft(vi)e Fu(mo)q(de)g(b)q(eha)o(v)o(es)g(as)g
+(sp)q(eci\014ed)i(in)75 981 y(the)c Fp(POSIX)h Fu(1003.2)d(standard.)
+137 1048 y(In)i(order)g(to)f(switc)o(h)g(in)o(teractiv)o(ely)i(b)q(et)o
+(w)o(een)f Ft(emacs)e Fu(and)i Ft(vi)f Fu(editing)i(mo)q(des,)f(use)f
+(the)h(command)75 1103 y(M-C-j)g(\(toggle-editing-mo)q(de\).)21
+b(The)15 b(Readline)j(default)d(is)h Ft(emacs)f Fu(mo)q(de.)137
+1170 y(When)h(y)o(ou)e(en)o(ter)h(a)g(line)i(in)e Ft(vi)g
+Fu(mo)q(de,)g(y)o(ou)g(are)f(already)i(placed)g(in)g(`insertion')f(mo)q
+(de,)g(as)g(if)g(y)o(ou)75 1225 y(had)e(t)o(yp)q(ed)h(an)f(`)p
+Ft(i)p Fu('.)18 b(Pressing)608 1223 y Fo(h)p 620 1197
+70 2 v 620 1225 a Fn(ESC)p 620 1233 V 687 1223 a Fo(i)715
+1225 y Fu(switc)o(hes)13 b(y)o(ou)g(in)o(to)g(`command')f(mo)q(de,)i
+(where)f(y)o(ou)g(can)g(edit)h(the)75 1280 y(text)i(of)h(the)g(line)h
+(with)g(the)f(standard)f Ft(vi)h Fu(mo)o(v)o(emen)o(t)f(k)o(eys,)g(mo)o
+(v)o(e)g(to)h(previous)g(history)g(lines)i(with)75 1335
+y(`)p Ft(k)p Fu(')14 b(and)i(subsequen)o(t)f(lines)i(with)f(`)p
+Ft(j)p Fu(',)e(and)h(so)g(forth.)p eop
+%%Page: 19 21
+19 20 bop 75 -58 a Fu(Chapter)15 b(2:)k(Programming)c(with)g(GNU)g
+(Readline)844 b(19)75 183 y Fq(2)41 b(Programming)28
+b(with)e(GNU)i(Readline)137 305 y Fu(This)16 b(c)o(hapter)f(describ)q
+(es)i(the)f(in)o(terface)g(b)q(et)o(w)o(een)f(the)h(GNU)f(Readline)j
+(Library)e(and)f(other)g(pro-)75 360 y(grams.)38 b(If)22
+b(y)o(ou)f(are)g(a)g(programmer,)h(and)f(y)o(ou)g(wish)i(to)d(include)k
+(the)e(features)f(found)h(in)g(GNU)75 414 y(Readline)16
+b(suc)o(h)e(as)f(completion,)h(line)h(editing,)g(and)f(in)o(teractiv)o
+(e)g(history)f(manipulation)i(in)g(y)o(our)d(o)o(wn)75
+469 y(programs,)i(this)h(section)h(is)g(for)e(y)o(ou.)75
+602 y Fs(2.1)33 b(Basic)22 b(Beha)n(vior)137 700 y Fu(Man)o(y)15
+b(programs)f(pro)o(vide)i(a)f(command)g(line)i(in)o(terface,)e(suc)o(h)
+h(as)f Ft(mail)p Fu(,)f Ft(ftp)p Fu(,)h(and)g Ft(sh)p
+Fu(.)20 b(F)l(or)15 b(suc)o(h)75 754 y(programs,)e(the)h(default)h(b)q
+(eha)o(viour)g(of)f(Readline)j(is)d(su\016cien)o(t.)21
+b(This)14 b(section)h(describ)q(es)h(ho)o(w)e(to)g(use)75
+809 y(Readline)19 b(in)g(the)e(simplest)h(w)o(a)o(y)e(p)q(ossible,)j(p)
+q(erhaps)f(to)f(replace)h(calls)g(in)g(y)o(our)f(co)q(de)h(to)e
+Ft(gets\(\))g Fu(or)75 864 y Ft(fgets)e(\(\))p Fu(.)137
+933 y(The)j(function)h Ft(readline)c(\(\))j Fu(prin)o(ts)g(a)g(prompt)f
+(and)h(then)g(reads)g(and)g(returns)g(a)g(single)h(line)g(of)75
+988 y(text)12 b(from)f(the)i(user.)19 b(The)12 b(line)i
+Ft(readline)d Fu(returns)h(is)h(allo)q(cated)g(with)g
+Ft(malloc)h(\(\))p Fu(;)e(y)o(ou)g(should)i Ft(free)75
+1042 y(\(\))h Fu(the)g(line)i(when)f(y)o(ou)f(are)f(done)i(with)g(it.)k
+(The)15 b(declaration)h(for)f Ft(readline)f Fu(in)i(ANSI)g(C)f(is)195
+1108 y Ft(char)23 b(*readline)g(\(char)g(*)p Fm(prompt)q
+Ft(\);)75 1177 y Fu(So,)15 b(one)g(migh)o(t)g(sa)o(y)195
+1243 y Ft(char)23 b(*line)g(=)h(readline)f(\("Enter)g(a)h(line:)f("\);)
+75 1312 y Fu(in)12 b(order)f(to)g(read)h(a)f(line)i(of)e(text)g(from)f
+(the)i(user.)19 b(The)11 b(line)j(returned)d(has)h(the)f(\014nal)h
+(newline)i(remo)o(v)o(ed,)75 1366 y(so)h(only)h(the)f(text)g(remains.)
+137 1435 y(If)21 b Ft(readline)e Fu(encoun)o(ters)h(an)g
+Ft(EOF)g Fu(while)i(reading)f(the)f(line,)j(and)d(the)h(line)g(is)g
+(empt)o(y)f(at)g(that)75 1490 y(p)q(oin)o(t,)15 b(then)g
+Ft(\(char)f(*\)NULL)g Fu(is)h(returned.)21 b(Otherwise,)15
+b(the)g(line)h(is)f(ended)h(just)e(as)h(if)g(a)f(newline)j(had)75
+1545 y(b)q(een)f(t)o(yp)q(ed.)137 1614 y(If)d(y)o(ou)g(w)o(an)o(t)f
+(the)h(user)g(to)f(b)q(e)i(able)g(to)e(get)g(at)h(the)g(line)h(later,)f
+(\(with)1325 1612 y Fo(h)p 1338 1586 57 2 v 1338 1614
+a Fn(C-p)p 1338 1621 V 1392 1612 a Fo(i)1420 1614 y Fu(for)f
+(example\),)i(y)o(ou)f(m)o(ust)75 1668 y(call)j Ft(add_history)e(\(\))h
+Fu(to)f(sa)o(v)o(e)h(the)g(line)i(a)o(w)o(a)o(y)d(in)i(a)f
+Fm(history)k Fu(list)d(of)e(suc)o(h)i(lines.)195 1734
+y Ft(add_history)22 b(\(line\);)75 1803 y Fu(F)l(or)15
+b(full)h(details)g(on)f(the)h(GNU)f(History)g(Library)l(,)g(see)h(the)f
+(asso)q(ciated)g(man)o(ual.)137 1872 y(It)h(is)g(preferable)h(to)e(a)o
+(v)o(oid)g(sa)o(ving)h(empt)o(y)f(lines)i(on)f(the)g(history)f(list,)i
+(since)f(users)g(rarely)g(ha)o(v)o(e)f(a)75 1927 y(burning)h(need)g(to)
+e(reuse)h(a)g(blank)g(line.)22 b(Here)15 b(is)g(a)g(function)g(whic)o
+(h)h(usefully)h(replaces)e(the)g(standard)75 1981 y Ft(gets)g(\(\))f
+Fu(library)i(function,)g(and)g(has)f(the)g(adv)m(an)o(tage)f(of)h(no)g
+(static)g(bu\013er)h(to)e(o)o(v)o(er\015o)o(w:)195 2047
+y Ft(/*)24 b(A)f(static)g(variable)g(for)h(holding)e(the)i(line.)f(*/)
+195 2099 y(static)g(char)g(*line_read)g(=)h(\(char)f(*\)NULL;)195
+2203 y(/*)h(Read)f(a)h(string,)f(and)g(return)g(a)h(pointer)f(to)g(it.)
+48 b(Returns)22 b(NULL)i(on)f(EOF.)h(*/)195 2255 y(char)f(*)195
+2307 y(rl_gets)g(\(\))195 2359 y({)243 2411 y(/*)g(If)h(the)f(buffer)g
+(has)h(already)f(been)g(allocated,)g(return)g(the)g(memory)314
+2462 y(to)h(the)f(free)h(pool.)f(*/)243 2514 y(if)g(\(line_read\))290
+2566 y({)338 2618 y(free)g(\(line_read\);)338 2670 y(line_read)g(=)h
+(\(char)f(*\)NULL;)p eop
+%%Page: 20 22
+20 21 bop 75 -58 a Fu(20)1299 b(GNU)15 b(Readline)i(Library)290
+183 y Ft(})243 287 y(/*)23 b(Get)h(a)f(line)h(from)f(the)h(user.)f(*/)
+243 339 y(line_read)f(=)i(readline)f(\(""\);)243 443
+y(/*)g(If)h(the)f(line)h(has)f(any)h(text)f(in)g(it,)h(save)f(it)h(on)f
+(the)h(history.)f(*/)243 495 y(if)g(\(line_read)g(&&)g(*line_read\))290
+546 y(add_history)g(\(line_read\);)243 650 y(return)g(\(line_read\);)
+195 702 y(})137 770 y Fu(This)13 b(function)f(giv)o(es)h(the)e(user)h
+(the)g(default)h(b)q(eha)o(viour)g(of)1169 768 y Fo(h)p
+1181 742 74 2 v 1181 770 a Fn(T)m(AB)p 1181 777 V 1253
+768 a Fo(i)1280 770 y Fu(completion:)19 b(completion)13
+b(on)f(\014le)75 824 y(names.)20 b(If)c(y)o(ou)f(do)g(not)g(w)o(an)o(t)
+f(Readline)k(to)c(complete)j(on)e(\014lenames,)h(y)o(ou)f(can)g(c)o
+(hange)h(the)f(binding)75 879 y(of)g(the)205 877 y Fo(h)p
+217 851 V 217 879 a Fn(T)m(AB)p 217 887 V 289 877 a Fo(i)319
+879 y Fu(k)o(ey)g(with)h Ft(rl_bind_key)d(\(\))p Fu(.)195
+944 y Ft(int)23 b(rl_bind_key)g(\(int)g Fm(k)o(ey)p Ft(,)h(int)f(\(*)p
+Fm(function)p Ft(\)\(\)\);)137 1011 y(rl_bind_key)14
+b(\(\))h Fu(tak)o(es)g(t)o(w)o(o)g(argumen)o(ts:)20 b
+Fm(k)o(ey)f Fu(is)d(the)g(c)o(haracter)f(that)g(y)o(ou)g(w)o(an)o(t)g
+(to)g(bind,)i(and)75 1066 y Fm(function)i Fu(is)f(the)g(address)g(of)g
+(the)g(function)g(to)g(call)h(when)f Fm(k)o(ey)k Fu(is)c(pressed.)29
+b(Binding)1628 1064 y Fo(h)p 1641 1038 V 1641 1066 a
+Fn(T)m(AB)p 1641 1074 V 1712 1064 a Fo(i)1745 1066 y
+Fu(to)17 b Ft(rl_)75 1121 y(insert)d(\(\))i Fu(mak)o(es)433
+1119 y Fo(h)p 446 1093 V 446 1121 a Fn(T)m(AB)p 446 1129
+V 517 1119 a Fo(i)548 1121 y Fu(insert)g(itself.)22 b
+Ft(rl_bind_key)13 b(\(\))i Fu(returns)h(non-zero)g(if)g
+Fm(k)o(ey)j Fu(is)d(not)f(a)g(v)m(alid)75 1176 y(ASCI)q(I)h(c)o
+(haracter)f(co)q(de)h(\(b)q(et)o(w)o(een)f(0)g(and)g(255\).)137
+1243 y(Th)o(us,)g(to)g(disable)h(the)g(default)703 1241
+y Fo(h)p 716 1215 V 716 1243 a Fn(T)m(AB)p 716 1251 V
+787 1241 a Fo(i)817 1243 y Fu(b)q(eha)o(vior,)g(the)f(follo)o(wing)h
+(su\016ces:)195 1308 y Ft(rl_bind_key)22 b(\('\\t',)h(rl_insert\);)137
+1375 y Fu(This)14 b(co)q(de)g(should)g(b)q(e)g(executed)g(once)g(at)e
+(the)h(start)f(of)h(y)o(our)g(program;)f(y)o(ou)h(migh)o(t)g(write)g(a)
+g(func-)75 1430 y(tion)i(called)h Ft(initialize_readline)d(\(\))h
+Fu(whic)o(h)i(p)q(erforms)e(this)h(and)g(other)g(desired)g
+(initializations,)75 1485 y(suc)o(h)h(as)e(installing)k(custom)c
+(completers)i(\(see)f(Section)h(2.6)f([Custom)f(Completers],)g(page)h
+(33\).)75 1614 y Fs(2.2)33 b(Custom)21 b(F)-6 b(unctions)137
+1711 y Fu(Readline)15 b(pro)o(vides)e(man)o(y)e(functions)i(for)f
+(manipulating)i(the)e(text)g(of)g(the)g(line,)i(but)e(it)h(isn't)f(p)q
+(ossi-)75 1765 y(ble)i(to)f(an)o(ticipate)h(the)f(needs)h(of)f(all)h
+(programs.)k(This)13 b(section)h(describ)q(es)h(the)e(v)m(arious)h
+(functions)g(and)75 1820 y(v)m(ariables)g(de\014ned)h(within)f(the)f
+(Readline)j(library)d(whic)o(h)h(allo)o(w)g(a)e(user)h(program)f(to)h
+(add)g(customized)75 1875 y(functionalit)o(y)j(to)f(Readline.)137
+1942 y(Before)j(declaring)i(an)o(y)e(functions)h(that)f(customize)g
+(Readline's)i(b)q(eha)o(vior,)g(or)d(using)i(an)o(y)f(func-)75
+1997 y(tionalit)o(y)23 b(Readline)i(pro)o(vides)f(in)f(other)g(co)q
+(de,)h(an)f(application)i(writer)d(should)i(include)h(the)e(\014le)75
+2052 y Ft(<readline/readline.h>)14 b Fu(in)j(an)o(y)g(\014le)h(that)e
+(uses)h(Readline's)h(features.)24 b(Since)19 b(some)d(of)g(the)h
+(de\014-)75 2107 y(nitions)g(in)f Ft(readline.h)e Fu(use)i(the)g
+Ft(stdio)f Fu(library)l(,)h(the)g(\014le)g Ft(<stdio.h>)f
+Fu(should)h(b)q(e)g(included)j(b)q(efore)75 2162 y Ft(readline.h)p
+Fu(.)75 2274 y Fl(2.2.1)30 b(The)20 b(F)-5 b(unction)20
+b(T)n(yp)r(e)137 2371 y Fu(F)l(or)f(readabilt)o(y)l(,)h(w)o(e)f
+(declare)h(a)f(new)g(t)o(yp)q(e)g(of)g(ob)s(ject,)g(called)i
+Fm(F)l(unction)p Fu(.)32 b(A)19 b Ft(Function)f Fu(is)h(a)g(C)75
+2425 y(function)d(whic)o(h)g(returns)f(an)g Ft(int)p
+Fu(.)20 b(The)15 b(t)o(yp)q(e)g(declaration)h(for)f Ft(Function)f
+Fu(is:)75 2493 y Ft(typedef)g(int)h(Function)f(\(\);)137
+2560 y Fu(The)21 b(reason)g(for)f(declaring)i(this)g(new)f(t)o(yp)q(e)g
+(is)g(to)g(mak)o(e)f(it)h(easier)g(to)g(write)g(co)q(de)g(describing)75
+2615 y(p)q(oin)o(ters)16 b(to)f(C)g(functions.)21 b(Let)16
+b(us)f(sa)o(y)g(w)o(e)g(had)h(a)f(v)m(ariable)i(called)g
+Fm(func)i Fu(whic)o(h)d(w)o(as)e(a)i(p)q(oin)o(ter)f(to)g(a)75
+2670 y(function.)21 b(Instead)15 b(of)g(the)g(classic)i(C)e
+(declaration)p eop
+%%Page: 21 23
+21 22 bop 75 -58 a Fu(Chapter)15 b(2:)k(Programming)c(with)g(GNU)g
+(Readline)844 b(21)137 183 y Ft(int)15 b(\(*\)\(\)func;)75
+250 y Fu(w)o(e)g(ma)o(y)f(write)137 317 y Ft(Function)g(*func;)75
+384 y Fu(Similarly)l(,)j(there)e(are)195 449 y Ft(typedef)23
+b(void)g(VFunction)g(\(\);)195 501 y(typedef)g(char)g(*CPFunction)g
+(\(\);)g Fu(and)195 552 y Ft(typedef)g(char)g(**CPPFunction)f(\(\);)75
+620 y Fu(for)17 b(functions)h(returning)g(no)f(v)m(alue,)h
+Ft(pointer)d(to)g(char)p Fu(,)h(and)i Ft(pointer)c(to)h(pointer)f(to)h
+(char)p Fu(,)i(re-)75 674 y(sp)q(ectiv)o(ely)l(.)75 786
+y Fl(2.2.2)30 b(W)-5 b(riting)20 b(a)h(New)f(F)-5 b(unction)137
+882 y Fu(In)17 b(order)f(to)f(write)h(new)h(functions)g(for)e
+(Readline,)j(y)o(ou)e(need)h(to)e(kno)o(w)h(the)g(calling)i(con)o(v)o
+(en)o(tions)75 937 y(for)g(k)o(eyb)q(oard-in)o(v)o(ok)o(ed)h
+(functions,)g(and)g(the)f(names)h(of)f(the)g(v)m(ariables)i(that)d
+(describ)q(e)k(the)d(curren)o(t)75 992 y(state)c(of)h(the)g(line)i
+(read)e(so)g(far.)137 1059 y(The)h(calling)h(sequence)f(for)f(a)f
+(command)i Ft(foo)e Fu(lo)q(oks)i(lik)o(e)195 1123 y
+Ft(foo)23 b(\(int)h(count,)f(int)g(key\))75 1190 y Fu(where)18
+b Fm(coun)o(t)h Fu(is)f(the)g(n)o(umeric)h(argumen)o(t)e(\(or)h(1)f(if)
+i(defaulted\))f(and)g Fm(k)o(ey)k Fu(is)d(the)f(k)o(ey)g(that)f(in)o(v)
+o(ok)o(ed)75 1245 y(this)f(function.)137 1312 y(It)c(is)g(completely)h
+(up)f(to)f(the)g(function)i(as)e(to)g(what)g(should)h(b)q(e)g(done)g
+(with)g(the)g(n)o(umeric)g(argumen)o(t.)75 1367 y(Some)20
+b(functions)h(use)f(it)g(as)g(a)g(rep)q(eat)g(coun)o(t,)g(some)g(as)g
+(a)f(\015ag,)i(and)f(others)g(to)f(c)o(ho)q(ose)h(alternate)75
+1421 y(b)q(eha)o(vior)i(\(refreshing)g(the)g(curren)o(t)f(line)j(as)d
+(opp)q(osed)h(to)f(refreshing)i(the)e(screen,)j(for)d(example\).)75
+1476 y(Some)c(c)o(ho)q(ose)f(to)g(ignore)h(it.)24 b(In)18
+b(general,)f(if)g(a)f(function)h(uses)g(the)g(n)o(umeric)h(argumen)o(t)
+d(as)i(a)f(rep)q(eat)75 1531 y(coun)o(t,)e(it)g(should)h(b)q(e)f(able)h
+(to)e(do)h(something)h(useful)g(with)f(b)q(oth)g(negativ)o(e)g(and)g(p)
+q(ositiv)o(e)h(argumen)o(ts.)75 1586 y(A)o(t)g(the)g(v)o(ery)g(least,)g
+(it)g(should)h(b)q(e)g(a)o(w)o(are)e(that)h(it)g(can)g(b)q(e)h(passed)g
+(a)f(negativ)o(e)g(argumen)o(t.)75 1714 y Fs(2.3)33 b(Readline)23
+b(V)-6 b(ariables)137 1810 y Fu(These)16 b(v)m(ariables)g(are)f(a)o(v)m
+(ailable)i(to)e(function)h(writers.)1661 1902 y(V)l(ariable)-1749
+b Fi(char)20 b(*)f Fh(rl)p 286 1902 18 3 v 21 w(line)p
+395 1902 V 23 w(bu\013er)195 1957 y Fu(This)h(is)f(the)h(line)h
+(gathered)e(so)f(far.)31 b(Y)l(ou)20 b(are)f(w)o(elcome)g(to)g(mo)q
+(dify)h(the)f(con)o(ten)o(ts)f(of)195 2011 y(the)f(line,)h(but)f(see)g
+(Section)g(2.4.5)e([Allo)o(wing)j(Undoing],)f(page)f(26.)24
+b(The)17 b(function)g Ft(rl_)195 2066 y(extend_line_buffer)8
+b Fu(is)k(a)o(v)m(ailable)g(to)f(increase)h(the)f(memory)f(allo)q
+(cated)i(to)e Ft(rl_line_)195 2121 y(buffer)p Fu(.)1661
+2213 y(V)l(ariable)-1749 b Fi(int)20 b Fh(rl)p 215 2213
+V 21 w(p)r(oin)n(t)195 2267 y Fu(The)15 b(o\013set)g(of)f(the)i(curren)
+o(t)f(cursor)g(p)q(osition)h(in)g Ft(rl_line_buffer)d
+Fu(\(the)i Fm(p)q(oin)o(t)q Fu(\).)1661 2359 y(V)l(ariable)-1749
+b Fi(int)20 b Fh(rl)p 215 2359 V 21 w(end)195 2414 y
+Fu(The)e(n)o(um)o(b)q(er)g(of)f(c)o(haracters)g(presen)o(t)h(in)g
+Ft(rl_line_buffer)p Fu(.)26 b(When)18 b Ft(rl_point)e
+Fu(is)j(at)195 2469 y(the)c(end)h(of)f(the)g(line,)i
+Ft(rl_point)d Fu(and)h Ft(rl_end)f Fu(are)h(equal.)1661
+2560 y(V)l(ariable)-1749 b Fi(int)20 b Fh(rl)p 215 2560
+V 21 w(mark)195 2615 y Fu(The)14 b(mark)e(\(sa)o(v)o(ed)h(p)q
+(osition\))h(in)g(the)g(curren)o(t)f(line.)21 b(If)14
+b(set,)f(the)h(mark)e(and)i(p)q(oin)o(t)g(de\014ne)195
+2670 y(a)h Fm(region)p Fu(.)p eop
+%%Page: 22 24
+22 23 bop 75 -58 a Fu(22)1299 b(GNU)15 b(Readline)i(Library)1661
+183 y(V)l(ariable)-1749 b Fi(int)20 b Fh(rl)p 215 183
+18 3 v 21 w(done)195 238 y Fu(Setting)j(this)g(to)f(a)h(non-zero)g(v)m
+(alue)h(causes)f(Readline)i(to)d(return)h(the)g(curren)o(t)f(line)195
+293 y(immediately)l(.)1661 384 y(V)l(ariable)-1749 b
+Fi(int)20 b Fh(rl)p 215 384 V 21 w(p)r(ending)p 436 384
+V 20 w(input)195 439 y Fu(Setting)15 b(this)h(to)f(a)f(v)m(alue)j(mak)o
+(es)d(it)i(the)f(next)g(k)o(eystrok)o(e)f(read.)20 b(This)c(is)f(a)g(w)
+o(a)o(y)f(to)h(stu\013)195 494 y(a)g(single)h(c)o(haracter)f(in)o(to)g
+(the)g(input)i(stream.)1661 586 y(V)l(ariable)-1749 b
+Fi(int)20 b Fh(rl)p 215 586 V 21 w(erase)p 363 586 V
+20 w(empt)n(y)p 540 586 V 20 w(line)195 640 y Fu(Setting)13
+b(this)h(to)e(a)h(non-zero)g(v)m(alue)h(causes)f(Readline)j(to)c
+(completely)i(erase)f(the)g(curren)o(t)195 695 y(line,)19
+b(including)g(an)o(y)e(prompt,)f(an)o(y)h(time)g(a)f(newline)j(is)f(t)o
+(yp)q(ed)f(as)f(the)h(only)h(c)o(haracter)195 750 y(on)13
+b(an)f(otherwise-empt)o(y)h(line.)20 b(The)13 b(cursor)g(is)g(mo)o(v)o
+(ed)f(to)g(the)g(b)q(eginning)j(of)d(the)h(newly-)195
+805 y(blank)j(line.)1661 896 y(V)l(ariable)-1749 b Fi(char)20
+b(*)f Fh(rl)p 286 896 V 21 w(prompt)195 951 y Fu(The)14
+b(prompt)f(Readline)j(uses.)k(This)14 b(is)g(set)g(from)f(the)g
+(argumen)o(t)g(to)g Ft(readline)h(\(\))p Fu(,)g(and)195
+1006 y(should)i(not)f(b)q(e)h(assigned)g(to)e(directly)l(.)1661
+1097 y(V)l(ariable)-1749 b Fi(int)20 b Fh(rl)p 215 1097
+V 21 w(already)p 419 1097 V 21 w(prompted)195 1152 y
+Fu(If)14 b(an)g(application)h(wishes)f(to)f(displa)o(y)i(the)f(prompt)f
+(itself,)i(rather)e(than)g(ha)o(v)o(e)h(Readline)195
+1207 y(do)j(it)h(the)f(\014rst)g(time)h Ft(readline\(\))e
+Fu(is)i(called,)h(it)f(should)g(set)f(this)h(v)m(ariable)h(to)e(a)g
+(non-)195 1262 y(zero)i(v)m(alue)i(after)e(displa)o(ying)i(the)f
+(prompt.)32 b(The)20 b(prompt)f(m)o(ust)g(also)g(b)q(e)i(passed)e(as)
+195 1317 y(the)c(argumen)o(t)e(to)h Ft(readline\(\))g
+Fu(so)g(the)g(redispla)o(y)i(functions)f(can)g(up)q(date)g(the)g
+(displa)o(y)195 1371 y(prop)q(erly)l(.)k(The)11 b(calling)h
+(application)f(is)g(resp)q(onsible)h(for)e(managing)g(the)g(v)m(alue;)j
+(Readline)195 1426 y(nev)o(er)i(sets)g(it.)1661 1518
+y(V)l(ariable)-1749 b Fi(char)20 b(*)f Fh(rl)p 286 1518
+V 21 w(library)p 475 1518 V 22 w(v)n(ersion)195 1573
+y Fu(The)c(v)o(ersion)h(n)o(um)o(b)q(er)f(of)g(this)h(revision)g(of)f
+(the)g(library)l(.)1661 1664 y(V)l(ariable)-1749 b Fi(char)20
+b(*)f Fh(rl)p 286 1664 V 21 w(terminal)p 518 1664 V 21
+w(name)195 1719 y Fu(The)c(terminal)h(t)o(yp)q(e,)f(used)h(for)f
+(initialization.)1661 1811 y(V)l(ariable)-1749 b Fi(char)20
+b(*)f Fh(rl)p 286 1811 V 21 w(readline)p 505 1811 V 22
+w(name)195 1865 y Fu(This)d(v)m(ariable)h(is)f(set)f(to)g(a)g(unique)i
+(name)f(b)o(y)f(eac)o(h)g(application)j(using)e(Readline.)23
+b(The)195 1920 y(v)m(alue)12 b(allo)o(ws)e(conditional)i(parsing)f(of)f
+(the)g(inputrc)h(\014le)h(\(see)e(Section)h(1.3.2)e([Conditional)195
+1975 y(Init)16 b(Constructs],)e(page)h(8\).)1661 2067
+y(V)l(ariable)-1749 b Fi(FILE)20 b(*)f Fh(rl)p 286 2067
+V 21 w(instream)195 2121 y Fu(The)c(stdio)h(stream)e(from)h(whic)o(h)h
+(Readline)h(reads)e(input.)1661 2213 y(V)l(ariable)-1749
+b Fi(FILE)20 b(*)f Fh(rl)p 286 2213 V 21 w(outstream)195
+2268 y Fu(The)c(stdio)h(stream)e(to)h(whic)o(h)h(Readline)h(p)q
+(erforms)e(output.)1661 2359 y(V)l(ariable)-1749 b Fi(Function)20
+b(*)g Fh(rl)p 391 2359 V 21 w(startup)p 595 2359 V 20
+w(ho)r(ok)195 2414 y Fu(If)15 b(non-zero,)f(this)h(is)g(the)f(address)h
+(of)e(a)h(function)i(to)d(call)j(just)e(b)q(efore)h Ft(readline)e
+Fu(prin)o(ts)195 2469 y(the)i(\014rst)g(prompt.)1661
+2560 y(V)l(ariable)-1749 b Fi(Function)20 b(*)g Fh(rl)p
+391 2560 V 21 w(pre)p 494 2560 V 20 w(input)p 647 2560
+V 21 w(ho)r(ok)195 2615 y Fu(If)d(non-zero,)h(this)f(is)h(the)f
+(address)g(of)g(a)g(function)h(to)e(call)i(after)f(the)g(\014rst)f
+(prompt)h(has)195 2670 y(b)q(een)f(prin)o(ted)g(and)g(just)f(b)q(efore)
+g Ft(readline)f Fu(starts)g(reading)i(input)g(c)o(haracters.)p
+eop
+%%Page: 23 25
+23 24 bop 75 -58 a Fu(Chapter)15 b(2:)k(Programming)c(with)g(GNU)g
+(Readline)844 b(23)1661 183 y(V)l(ariable)-1749 b Fi(Function)20
+b(*)g Fh(rl)p 391 183 18 3 v 21 w(ev)n(en)n(t)p 544 183
+V 22 w(ho)r(ok)195 238 y Fu(If)d(non-zero,)f(this)h(is)f(the)h(address)
+f(of)g(a)g(function)h(to)f(call)h(p)q(erio)q(dically)j(when)c(readline)
+195 293 y(is)g(w)o(aiting)f(for)g(terminal)h(input.)1661
+409 y(V)l(ariable)-1749 b Fi(Function)20 b(*)g Fh(rl)p
+391 409 V 21 w(getc)p 514 409 V 21 w(function)195 463
+y Fu(If)13 b(non-zero,)g Ft(readline)e Fu(will)k(call)e(indirectly)i
+(through)d(this)h(p)q(oin)o(ter)g(to)f(get)g(a)h(c)o(haracter)195
+518 y(from)i(the)i(input)g(stream.)22 b(By)16 b(default,)h(it)f(is)h
+(set)f(to)f Ft(rl_getc)p Fu(,)g(the)h(default)h Ft(readline)195
+573 y Fu(c)o(haracter)d(input)j(function)f(\(see)f(Section)h(2.4.8)e
+([Utilit)o(y)h(F)l(unctions],)h(page)f(28\).)1661 689
+y(V)l(ariable)-1749 b Fi(VFunction)20 b(*)g Fh(rl)p 417
+689 V 21 w(redispla)n(y)p 661 689 V 22 w(function)195
+744 y Fu(If)g(non-zero,)h Ft(readline)d Fu(will)j(call)g(indirectly)h
+(through)d(this)h(p)q(oin)o(ter)h(to)e(up)q(date)h(the)195
+798 y(displa)o(y)h(with)f(the)g(curren)o(t)g(con)o(ten)o(ts)g(of)f(the)
+h(editing)i(bu\013er.)34 b(By)20 b(default,)h(it)g(is)f(set)195
+853 y(to)f Ft(rl_redisplay)p Fu(,)f(the)i(default)g Ft(readline)e
+Fu(redispla)o(y)j(function)f(\(see)f(Section)i(2.4.6)195
+908 y([Redispla)o(y],)16 b(page)f(27\).)1661 1024 y(V)l(ariable)-1749
+b Fi(Keymap)20 b Fh(rl)p 293 1024 V 21 w(executing)p
+551 1024 V 22 w(k)n(eymap)195 1079 y Fu(This)g(v)m(ariable)g(is)f(set)g
+(to)f(the)h(k)o(eymap)g(\(see)g(Section)h(2.4.2)d([Keymaps],)i(page)g
+(24\))f(in)195 1133 y(whic)o(h)e(the)f(curren)o(tly)h(executing)g
+(readline)h(function)f(w)o(as)f(found.)1661 1249 y(V)l(ariable)-1749
+b Fi(Keymap)20 b Fh(rl)p 293 1249 V 21 w(binding)p 501
+1249 V 22 w(k)n(eymap)195 1304 y Fu(This)g(v)m(ariable)g(is)f(set)g(to)
+f(the)h(k)o(eymap)g(\(see)g(Section)h(2.4.2)d([Keymaps],)i(page)g(24\))
+f(in)195 1359 y(whic)o(h)e(the)f(last)g(k)o(ey)h(binding)h(o)q
+(ccurred.)75 1517 y Fs(2.4)33 b(Readline)23 b(Con)n(v)n(enience)g(F)-6
+b(unctions)75 1682 y Fl(2.4.1)30 b(Naming)20 b(a)g(F)-5
+b(unction)137 1790 y Fu(The)20 b(user)g(can)g(dynamically)i(c)o(hange)e
+(the)g(bindings)i(of)d(k)o(eys)h(while)h(using)g(Readline.)36
+b(This)20 b(is)75 1845 y(done)f(b)o(y)f(represen)o(ting)h(the)g
+(function)g(with)g(a)f(descriptiv)o(e)i(name.)29 b(The)19
+b(user)f(is)h(able)h(to)d(t)o(yp)q(e)i(the)75 1900 y(descriptiv)o(e)e
+(name)e(when)h(referring)f(to)g(the)g(function.)21 b(Th)o(us,)14
+b(in)i(an)f(init)i(\014le,)f(one)f(migh)o(t)g(\014nd)195
+1976 y Ft(Meta-Rubout:)46 b(backward-kill-word)137 2055
+y Fu(This)20 b(binds)h(the)f(k)o(eystrok)o(e)659 2053
+y Fo(h)p 671 2027 209 2 v 671 2055 a Fn(Meta-Rub)q(out)p
+671 2062 V 878 2053 a Fo(i)912 2055 y Fu(to)f(the)h(function)g
+Fm(descriptiv)o(ely)25 b Fu(named)20 b Ft(backward-)75
+2110 y(kill-word)p Fu(.)29 b(Y)l(ou,)19 b(as)f(the)h(programmer,)f
+(should)i(bind)f(the)g(functions)h(y)o(ou)e(write)h(to)e(descriptiv)o
+(e)75 2164 y(names)e(as)g(w)o(ell.)21 b(Readline)c(pro)o(vides)f(a)f
+(function)h(for)e(doing)i(that:)1650 2280 y(F)l(unction)-1749
+b Fi(int)20 b Fh(rl)p 215 2280 18 3 v 21 w(add)p 328
+2280 V 20 w(defun)i Fg(\()p Ft(char)14 b(*name,)g(Function)g
+(*function,)g(int)h(key)p Fg(\))195 2335 y Fu(Add)i Fm(name)h
+Fu(to)e(the)g(list)h(of)e(named)i(functions.)23 b(Mak)o(e)15
+b Fm(function)i Fu(b)q(e)g(the)f(function)h(that)195
+2390 y(gets)e(called.)21 b(If)16 b Fm(k)o(ey)j Fu(is)c(not)g(-1,)g
+(then)g(bind)i(it)e(to)g Fm(function)h Fu(using)g Ft(rl_bind_key)d
+(\(\))p Fu(.)137 2506 y(Using)j(this)f(function)h(alone)g(is)f
+(su\016cien)o(t)h(for)f(most)f(applications.)21 b(It)15
+b(is)h(the)f(recommended)h(w)o(a)o(y)75 2560 y(to)d(add)h(a)f(few)g
+(functions)h(to)f(the)h(default)g(functions)g(that)f(Readline)j(has)d
+(built)i(in.)20 b(If)14 b(y)o(ou)f(need)h(to)f(do)75
+2615 y(something)k(other)g(than)f(adding)i(a)e(function)i(to)e
+(Readline,)j(y)o(ou)e(ma)o(y)f(need)i(to)e(use)h(the)g(underlying)75
+2670 y(functions)f(describ)q(ed)h(b)q(elo)o(w.)p eop
+%%Page: 24 26
+24 25 bop 75 -58 a Fu(24)1299 b(GNU)15 b(Readline)i(Library)75
+183 y Fl(2.4.2)30 b(Selecting)20 b(a)h(Keymap)137 278
+y Fu(Key)16 b(bindings)i(tak)o(e)c(place)j(on)e(a)g Fm(k)o(eymap)p
+Fu(.)21 b(The)15 b(k)o(eymap)h(is)f(the)h(asso)q(ciation)g(b)q(et)o(w)o
+(een)g(the)f(k)o(eys)75 333 y(that)f(the)g(user)g(t)o(yp)q(es)g(and)h
+(the)f(functions)h(that)f(get)g(run.)19 b(Y)l(ou)c(can)f(mak)o(e)g(y)o
+(our)g(o)o(wn)f(k)o(eymaps,)h(cop)o(y)75 388 y(existing)i(k)o(eymaps,)f
+(and)g(tell)h(Readline)i(whic)o(h)e(k)o(eymap)f(to)f(use.)1650
+476 y(F)l(unction)-1749 b Fi(Keymap)20 b Fh(rl)p 293
+476 18 3 v 21 w(mak)n(e)p 445 476 V 20 w(bare)p 575 476
+V 20 w(k)n(eymap)j Fg(\(\))195 531 y Fu(Returns)d(a)f(new,)i(empt)o(y)e
+(k)o(eymap.)32 b(The)20 b(space)g(for)e(the)i(k)o(eymap)f(is)h(allo)q
+(cated)h(with)195 586 y Ft(malloc)14 b(\(\))p Fu(;)h(y)o(ou)g(should)h
+Ft(free)e(\(\))h Fu(it)h(when)g(y)o(ou)e(are)h(done.)1650
+674 y(F)l(unction)-1749 b Fi(Keymap)20 b Fh(rl)p 293
+674 V 21 w(cop)n(y)p 428 674 V 21 w(k)n(eymap)j Fg(\()p
+Ft(Keymap)14 b(map)p Fg(\))195 729 y Fu(Return)i(a)f(new)g(k)o(eymap)g
+(whic)o(h)h(is)g(a)f(cop)o(y)g(of)g Fm(map)p Fu(.)1650
+818 y(F)l(unction)-1749 b Fi(Keymap)20 b Fh(rl)p 293
+818 V 21 w(mak)n(e)p 445 818 V 20 w(k)n(eymap)j Fg(\(\))195
+872 y Fu(Return)15 b(a)f(new)h(k)o(eymap)f(with)h(the)g(prin)o(ting)h
+(c)o(haracters)d(b)q(ound)j(to)e(rl)p 1443 872 14 2 v
+17 w(insert,)g(the)h(lo)o(w-)195 927 y(ercase)21 b(Meta)f(c)o
+(haracters)g(b)q(ound)i(to)f(run)g(their)g(equiv)m(alen)o(ts,)j(and)d
+(the)g(Meta)f(digits)195 982 y(b)q(ound)c(to)f(pro)q(duce)h(n)o(umeric)
+g(argumen)o(ts.)1650 1070 y(F)l(unction)-1749 b Fi(void)20
+b Fh(rl)p 241 1070 18 3 v 21 w(discard)p 441 1070 V 21
+w(k)n(eymap)i Fg(\()p Ft(Keymap)14 b(keymap)p Fg(\))195
+1125 y Fu(F)l(ree)h(the)h(storage)d(asso)q(ciated)j(with)f
+Fm(k)o(eymap)p Fu(.)137 1214 y(Readline)25 b(has)e(sev)o(eral)g(in)o
+(ternal)g(k)o(eymaps.)42 b(These)23 b(functions)g(allo)o(w)g(y)o(ou)f
+(to)g(c)o(hange)h(whic)o(h)75 1268 y(k)o(eymap)15 b(is)h(activ)o(e.)
+1650 1357 y(F)l(unction)-1749 b Fi(Keymap)20 b Fh(rl)p
+293 1357 V 21 w(get)p 391 1357 V 21 w(k)n(eymap)i Fg(\(\))195
+1412 y Fu(Returns)16 b(the)f(curren)o(tly)h(activ)o(e)f(k)o(eymap.)1650
+1500 y(F)l(unction)-1749 b Fi(void)20 b Fh(rl)p 241 1500
+V 21 w(set)p 333 1500 V 21 w(k)n(eymap)i Fg(\()p Ft(Keymap)14
+b(keymap)p Fg(\))195 1555 y Fu(Mak)o(es)g Fm(k)o(eymap)j
+Fu(the)e(curren)o(tly)h(activ)o(e)f(k)o(eymap.)1650 1643
+y(F)l(unction)-1749 b Fi(Keymap)20 b Fh(rl)p 293 1643
+V 21 w(get)p 391 1643 V 21 w(k)n(eymap)p 605 1643 V 20
+w(b)n(y)p 685 1643 V 21 w(name)i Fg(\()p Ft(char)14 b(*name)p
+Fg(\))195 1698 y Fu(Return)h(the)f(k)o(eymap)g(matc)o(hing)h
+Fm(name)p Fu(.)k Fm(name)e Fu(is)e(one)g(whic)o(h)g(w)o(ould)f(b)q(e)h
+(supplied)i(in)e(a)195 1753 y Ft(set)g(keymap)f Fu(inputrc)i(line)h
+(\(see)e(Section)h(1.3)f([Readline)i(Init)f(File],)f(page)g(4\).)1650
+1841 y(F)l(unction)-1749 b Fi(char)20 b(*)f Fh(rl)p 286
+1841 V 21 w(get)p 384 1841 V 21 w(k)n(eymap)p 598 1841
+V 20 w(name)i Fg(\()p Ft(Keymap)14 b(keymap)p Fg(\))195
+1896 y Fu(Return)h(the)f(name)h(matc)o(hing)f Fm(k)o(eymap)p
+Fu(.)19 b Fm(name)e Fu(is)e(one)g(whic)o(h)g(w)o(ould)f(b)q(e)h
+(supplied)i(in)e(a)195 1951 y Ft(set)g(keymap)f Fu(inputrc)i(line)h
+(\(see)e(Section)h(1.3)f([Readline)i(Init)f(File],)f(page)g(4\).)75
+2059 y Fl(2.4.3)30 b(Binding)20 b(Keys)137 2154 y Fu(Y)l(ou)j(asso)q
+(ciate)f(k)o(eys)g(with)h(functions)g(through)f(the)g(k)o(eymap.)41
+b(Readline)25 b(has)d(sev)o(eral)h(in)o(ter-)75 2209
+y(nal)h(k)o(eymaps:)35 b Ft(emacs_standard_keymap)p Fu(,)22
+b Ft(emacs_meta_keymap)p Fu(,)g Ft(emacs_ctlx_keymap)p
+Fu(,)g Ft(vi_)75 2264 y(movement_keymap)p Fu(,)e(and)i
+Ft(vi_insertion_keymap)p Fu(.)35 b Ft(emacs_standard_keymap)18
+b Fu(is)k(the)f(default,)75 2319 y(and)15 b(the)h(examples)g(in)g(this)
+f(man)o(ual)h(assume)f(that.)137 2385 y(Since)k Ft(readline)c
+Fu(installs)j(a)f(set)f(of)h(default)g(k)o(ey)g(bindings)h(the)f
+(\014rst)g(time)g(it)g(is)g(called,)i(there)d(is)75 2440
+y(alw)o(a)o(ys)f(the)g(danger)g(that)g(a)g(custom)g(binding)i
+(installed)g(b)q(efore)f(the)f(\014rst)g(call)h(to)f
+Ft(readline)f Fu(will)j(b)q(e)75 2494 y(o)o(v)o(erridden.)28
+b(An)17 b(alternate)h(mec)o(hanism)g(is)g(to)f(install)i(custom)e(k)o
+(ey)h(bindings)h(in)f(an)g(initialization)75 2549 y(function)h
+(assigned)h(to)d(the)i Ft(rl_startup_hook)e Fu(v)m(ariable)j(\(see)e
+(Section)h(2.3)f([Readline)j(V)l(ariables],)75 2604 y(page)15
+b(21\).)137 2670 y(These)h(functions)g(manage)e(k)o(ey)i(bindings.)p
+eop
+%%Page: 25 27
+25 26 bop 75 -58 a Fu(Chapter)15 b(2:)k(Programming)c(with)g(GNU)g
+(Readline)844 b(25)1650 183 y(F)l(unction)-1749 b Fi(int)20
+b Fh(rl)p 215 183 18 3 v 21 w(bind)p 347 183 V 21 w(k)n(ey)k
+Fg(\()p Ft(int)14 b(key,)h(Function)f(*function)p Fg(\))195
+238 y Fu(Binds)i Fm(k)o(ey)j Fu(to)14 b Fm(function)h
+Fu(in)h(the)f(curren)o(tly)g(activ)o(e)g(k)o(eymap.)20
+b(Returns)15 b(non-zero)g(in)h(the)195 293 y(case)f(of)g(an)g(in)o(v)m
+(alid)j Fm(k)o(ey)p Fu(.)1650 374 y(F)l(unction)-1749
+b Fi(int)20 b Fh(rl)p 215 374 V 21 w(bind)p 347 374 V
+21 w(k)n(ey)p 452 374 V 21 w(in)p 520 374 V 22 w(map)h
+Fg(\()p Ft(int)14 b(key,)h(Function)f(*function,)283
+429 y(Keymap)g(map)p Fg(\))195 484 y Fu(Bind)i Fm(k)o(ey)j
+Fu(to)c Fm(function)h Fu(in)g Fm(map)p Fu(.)k(Returns)15
+b(non-zero)h(in)g(the)f(case)g(of)g(an)g(in)o(v)m(alid)j
+Fm(k)o(ey)p Fu(.)1650 565 y(F)l(unction)-1749 b Fi(int)20
+b Fh(rl)p 215 565 V 21 w(un)n(bind)p 409 565 V 21 w(k)n(ey)k
+Fg(\()p Ft(int)14 b(key)p Fg(\))195 620 y Fu(Bind)g Fm(k)o(ey)j
+Fu(to)c(the)g(n)o(ull)i(function)f(in)g(the)f(curren)o(tly)h(activ)o(e)
+f(k)o(eymap.)19 b(Returns)14 b(non-zero)195 675 y(in)i(case)f(of)g
+(error.)1650 756 y(F)l(unction)-1749 b Fi(int)20 b Fh(rl)p
+215 756 V 21 w(un)n(bind)p 409 756 V 21 w(k)n(ey)p 514
+756 V 21 w(in)p 582 756 V 22 w(map)h Fg(\()p Ft(int)14
+b(key,)h(Keymap)f(map)p Fg(\))195 811 y Fu(Bind)i Fm(k)o(ey)j
+Fu(to)c(the)g(n)o(ull)i(function)f(in)g Fm(map)p Fu(.)k(Returns)15
+b(non-zero)h(in)g(case)f(of)g(error.)1650 892 y(F)l(unction)-1749
+b Fi(int)20 b Fh(rl)p 215 892 V 21 w(un)n(bind)p 409
+892 V 21 w(function)p 635 892 V 21 w(in)p 703 892 V 21
+w(map)h Fg(\()p Ft(Function)14 b(*function,)283 947 y(Keymap)g(map)p
+Fg(\))195 1002 y Fu(Un)o(bind)j(all)f(k)o(eys)f(that)f(execute)i
+Fm(function)g Fu(in)g Fm(map)p Fu(.)1650 1083 y(F)l(unction)-1749
+b Fi(int)20 b Fh(rl)p 215 1083 V 21 w(un)n(bind)p 409
+1083 V 21 w(command)p 674 1083 V 17 w(in)p 738 1083 V
+22 w(map)h Fg(\()p Ft(char)14 b(*command,)g(Keymap)283
+1138 y(map)p Fg(\))195 1193 y Fu(Un)o(bind)j(all)f(k)o(eys)f(that)f
+(are)h(b)q(ound)h(to)f Fm(command)i Fu(in)f Fm(map)p
+Fu(.)1650 1274 y(F)l(unction)-1749 b Fi(int)20 b Fh(rl)p
+215 1274 V 21 w(generic)p 413 1274 V 21 w(bind)j Fg(\()p
+Ft(int)15 b(type,)f(char)h(*keyseq,)f(char)h(*data,)283
+1329 y(Keymap)f(map)p Fg(\))195 1384 y Fu(Bind)g(the)f(k)o(ey)g
+(sequence)i(represen)o(ted)e(b)o(y)g(the)g(string)g Fm(k)o(eyseq)h
+Fu(to)f(the)g(arbitrary)f(p)q(oin)o(ter)195 1438 y Fm(data)p
+Fu(.)19 b Fm(t)o(yp)q(e)e Fu(sa)o(ys)c(what)h(kind)i(of)e(data)f(is)i
+(p)q(oin)o(ted)g(to)f(b)o(y)g Fm(data)p Fu(;)g(this)h(can)f(b)q(e)h(a)f
+(function)195 1493 y(\()p Ft(ISFUNC)p Fu(\),)f(a)h(macro)g(\()p
+Ft(ISMACR)p Fu(\),)f(or)i(a)f(k)o(eymap)h(\()p Ft(ISKMAP)p
+Fu(\).)j(This)d(mak)o(es)f(new)h(k)o(eymaps)195 1548
+y(as)g(necessary)l(.)20 b(The)c(initial)h(k)o(eymap)e(in)h(whic)o(h)g
+(to)e(do)i(bindings)h(is)e Fm(map)p Fu(.)1650 1629 y(F)l(unction)-1749
+b Fi(int)20 b Fh(rl)p 215 1629 V 21 w(parse)p 369 1629
+V 19 w(and)p 480 1629 V 21 w(bind)j Fg(\()p Ft(char)14
+b(*line)p Fg(\))195 1684 y Fu(P)o(arse)k Fm(line)23 b
+Fu(as)c(if)g(it)g(had)g(b)q(een)h(read)e(from)h(the)f
+Ft(inputrc)g Fu(\014le)i(and)f(p)q(erform)g(an)o(y)f(k)o(ey)195
+1739 y(bindings)i(and)e(v)m(ariable)i(assignmen)o(ts)d(found)i(\(see)f
+(Section)h(1.3)e([Readline)j(Init)f(File],)195 1794 y(page)c(4\).)1650
+1875 y(F)l(unction)-1749 b Fi(int)20 b Fh(rl)p 215 1875
+V 21 w(read)p 346 1875 V 20 w(init)p 450 1875 V 22 w(\014le)k
+Fg(\()p Ft(char)14 b(*filename)p Fg(\))195 1930 y Fu(Read)25
+b(k)o(eybindings)i(and)e(v)m(ariable)h(assignmen)o(ts)e(from)g
+Fm(\014lename)29 b Fu(\(see)24 b(Section)i(1.3)195 1985
+y([Readline)17 b(Init)f(File],)g(page)f(4\).)75 2086
+y Fl(2.4.4)30 b(Asso)r(ciating)20 b(F)-5 b(unction)20
+b(Names)h(and)f(Bindings)137 2179 y Fu(These)11 b(functions)h(allo)o(w)
+e(y)o(ou)h(to)f(\014nd)h(out)f(what)g(k)o(eys)h(in)o(v)o(ok)o(e)f
+(named)h(functions)h(and)e(the)h(functions)75 2233 y(in)o(v)o(ok)o(ed)k
+(b)o(y)h(a)e(particular)i(k)o(ey)f(sequence.)1650 2315
+y(F)l(unction)-1749 b Fi(Function)20 b(*)g Fh(rl)p 391
+2315 V 21 w(named)p 579 2315 V 19 w(function)j Fg(\()p
+Ft(char)14 b(*name)p Fg(\))195 2369 y Fu(Return)i(the)f(function)h
+(with)g(name)f Fm(name)p Fu(.)1650 2451 y(F)l(unction)-1749
+b Fi(Function)20 b(*)g Fh(rl)p 391 2451 V 21 w(function)p
+617 2451 V 21 w(of)p 685 2451 V 19 w(k)n(eyseq)k Fg(\()p
+Ft(char)15 b(*keyseq,)f(Keymap)283 2506 y(map,)g(int)h(*type)p
+Fg(\))195 2560 y Fu(Return)j(the)f(function)g(in)o(v)o(ok)o(ed)g(b)o(y)
+g Fm(k)o(eyseq)h Fu(in)g(k)o(eymap)f Fm(map)p Fu(.)25
+b(If)17 b Fm(map)h Fu(is)f(NULL,)h(the)195 2615 y(curren)o(t)13
+b(k)o(eymap)g(is)h(used.)20 b(If)14 b Fm(t)o(yp)q(e)i
+Fu(is)e(not)f(NULL,)h(the)f(t)o(yp)q(e)g(of)g(the)h(ob)s(ject)f(is)h
+(returned)195 2670 y(in)i(it)f(\(one)g(of)g Ft(ISFUNC)p
+Fu(,)f Ft(ISKMAP)p Fu(,)g(or)h Ft(ISMACR)p Fu(\).)p eop
+%%Page: 26 28
+26 27 bop 75 -58 a Fu(26)1299 b(GNU)15 b(Readline)i(Library)1650
+183 y(F)l(unction)-1749 b Fi(char)20 b(**)f Fh(rl)p 312
+183 18 3 v 21 w(in)n(v)n(oking)p 541 183 V 23 w(k)n(eyseqs)k
+Fg(\()p Ft(Function)14 b(*function)p Fg(\))195 238 y
+Fu(Return)i(an)f(arra)o(y)f(of)h(strings)g(represen)o(ting)h(the)g(k)o
+(ey)f(sequences)h(used)g(to)f(in)o(v)o(ok)o(e)g Fm(func-)195
+293 y(tion)g Fu(in)h(the)g(curren)o(t)f(k)o(eymap.)1650
+387 y(F)l(unction)-1749 b Fi(char)20 b(**)f Fh(rl)p 312
+387 V 21 w(in)n(v)n(oking)p 541 387 V 23 w(k)n(eyseqs)p
+750 387 V 21 w(in)p 818 387 V 22 w(map)i Fg(\()p Ft(Function)14
+b(*function,)283 442 y(Keymap)g(map)p Fg(\))195 497 y
+Fu(Return)i(an)f(arra)o(y)f(of)h(strings)g(represen)o(ting)h(the)g(k)o
+(ey)f(sequences)h(used)g(to)f(in)o(v)o(ok)o(e)g Fm(func-)195
+552 y(tion)g Fu(in)h(the)g(k)o(eymap)f Fm(map)p Fu(.)1650
+646 y(F)l(unction)-1749 b Fi(void)20 b Fh(rl)p 241 646
+V 21 w(function)p 467 646 V 21 w(dump)r(er)g Fg(\()p
+Ft(int)15 b(readable)p Fg(\))195 701 y Fu(Prin)o(t)k(the)h(readline)g
+(function)g(names)g(and)f(the)g(k)o(ey)g(sequences)i(curren)o(tly)e(b)q
+(ound)i(to)195 756 y(them)16 b(to)f Ft(rl_outstream)p
+Fu(.)k(If)d Fm(readable)j Fu(is)d(non-zero,)g(the)g(list)g(is)g
+(formatted)f(in)h(suc)o(h)g(a)195 810 y(w)o(a)o(y)e(that)h(it)g(can)g
+(b)q(e)h(made)g(part)e(of)h(an)g Ft(inputrc)f Fu(\014le)i(and)g
+(re-read.)1650 905 y(F)l(unction)-1749 b Fi(void)20 b
+Fh(rl)p 241 905 V 21 w(list)p 337 905 V 22 w(funmap)p
+550 905 V 18 w(names)h Fg(\(\))195 960 y Fu(Prin)o(t)15
+b(the)g(names)h(of)e(all)j(bindable)g(Readline)g(functions)f(to)f
+Ft(rl_outstream)p Fu(.)1650 1054 y(F)l(unction)-1749
+b Fi(char)20 b(**)f Fh(rl)p 312 1054 V 21 w(funmap)p
+524 1054 V 18 w(names)i Fg(\(\))195 1109 y Fu(Return)12
+b(a)e(NULL)i(terminated)g(arra)o(y)d(of)i(kno)o(wn)g(function)h(names.)
+18 b(The)11 b(arra)o(y)f(is)i(sorted.)195 1163 y(The)k(arra)o(y)f
+(itself)i(is)f(allo)q(cated,)h(but)f(not)f(the)h(strings)g(inside.)24
+b(Y)l(ou)16 b(should)h(free)f(\(\))f(the)195 1218 y(arra)o(y)f(when)i
+(y)o(ou)e(done,)i(but)f(not)g(the)g(p)q(oin)o(trs.)75
+1333 y Fl(2.4.5)30 b(Allo)n(wing)21 b(Undoing)137 1430
+y Fu(Supp)q(orting)14 b(the)g(undo)f(command)g(is)h(a)f(painless)h
+(thing,)g(and)f(mak)o(es)g(y)o(our)f(functions)i(m)o(uc)o(h)f(more)75
+1485 y(useful.)28 b(It)17 b(is)h(certainly)h(easy)e(to)g(try)g
+(something)g(if)h(y)o(ou)f(kno)o(w)g(y)o(ou)h(can)f(undo)h(it.)27
+b(I)18 b(could)g(use)g(an)75 1540 y(undo)e(function)g(for)e(the)i(sto)q
+(c)o(k)e(mark)o(et.)137 1608 y(If)g(y)o(our)e(function)i(simply)h
+(inserts)f(text)e(once,)i(or)e(deletes)j(text)d(once,)i(and)f(uses)h
+Ft(rl_insert_text)75 1663 y(\(\))h Fu(or)g Ft(rl_delete_text)e(\(\))i
+Fu(to)f(do)h(it,)g(then)h(undoing)g(is)g(already)f(done)h(for)f(y)o(ou)
+f(automatically)l(.)137 1731 y(If)d(y)o(ou)f(do)g(m)o(ultiple)i
+(insertions)f(or)f(m)o(ultiple)i(deletions,)g(or)e(an)o(y)g(com)o
+(bination)h(of)f(these)g(op)q(erations,)75 1786 y(y)o(ou)19
+b(should)h(group)e(them)h(together)g(in)o(to)g(one)g(op)q(eration.)31
+b(This)20 b(is)f(done)h(with)f Ft(rl_begin_undo_)75 1841
+y(group)14 b(\(\))h Fu(and)h Ft(rl_end_undo_group)d(\(\))p
+Fu(.)137 1909 y(The)j(t)o(yp)q(es)f(of)g(ev)o(en)o(ts)g(that)f(can)h(b)
+q(e)h(undone)g(are:)195 1975 y Ft(enum)23 b(undo_code)g({)h
+(UNDO_DELETE,)e(UNDO_INSERT,)g(UNDO_BEGIN,)g(UNDO_END)h(};)137
+2043 y Fu(Notice)16 b(that)e Ft(UNDO_DELETE)g Fu(means)h(to)g(insert)g
+(some)g(text,)f(and)i Ft(UNDO_INSERT)d Fu(means)i(to)g(delete)75
+2098 y(some)d(text.)18 b(That)12 b(is,)h(the)f(undo)g(co)q(de)h(tells)g
+(undo)g(what)e(to)h(undo,)h(not)f(ho)o(w)f(to)h(undo)g(it.)19
+b Ft(UNDO_BEGIN)75 2152 y Fu(and)c Ft(UNDO_END)f Fu(are)h(tags)g(added)
+g(b)o(y)h Ft(rl_begin_undo_group)c(\(\))j Fu(and)g Ft
+(rl_end_undo_group)e(\(\))p Fu(.)1650 2247 y(F)l(unction)-1749
+b Fi(int)20 b Fh(rl)p 215 2247 V 21 w(b)r(egin)p 372
+2247 V 20 w(undo)p 517 2247 V 20 w(group)h Fg(\(\))195
+2302 y Fu(Begins)e(sa)o(ving)g(undo)g(information)f(in)i(a)e(group)g
+(construct.)29 b(The)19 b(undo)g(information)195 2356
+y(usually)f(comes)f(from)f(calls)h(to)g Ft(rl_insert_text)c(\(\))j
+Fu(and)h Ft(rl_delete_text)c(\(\))p Fu(,)k(but)195 2411
+y(could)f(b)q(e)g(the)f(result)h(of)f(calls)h(to)f Ft(rl_add_undo)e
+(\(\))p Fu(.)1650 2506 y(F)l(unction)-1749 b Fi(int)20
+b Fh(rl)p 215 2506 V 21 w(end)p 326 2506 V 20 w(undo)p
+471 2506 V 20 w(group)h Fg(\(\))195 2560 y Fu(Closes)c(the)g(curren)o
+(t)g(undo)h(group)e(started)h(with)g Ft(rl_begin_undo_group)c(\(\))p
+Fu(.)25 b(There)195 2615 y(should)17 b(b)q(e)f(one)f(call)i(to)e
+Ft(rl_end_undo_group)e(\(\))i Fu(for)g(eac)o(h)g(call)i(to)e
+Ft(rl_begin_undo_)195 2670 y(group)f(\(\))p Fu(.)p eop
+%%Page: 27 29
+27 28 bop 75 -58 a Fu(Chapter)15 b(2:)k(Programming)c(with)g(GNU)g
+(Readline)844 b(27)1650 183 y(F)l(unction)-1749 b Fi(void)20
+b Fh(rl)p 241 183 18 3 v 21 w(add)p 354 183 V 20 w(undo)i
+Fg(\()p Ft(enum)14 b(undo_code)g(what,)g(int)h(start,)g(int)f(end,)283
+238 y(char)g(*text)p Fg(\))195 293 y Fu(Remem)o(b)q(er)j(ho)o(w)f(to)f
+(undo)i(an)f(ev)o(en)o(t)g(\(according)h(to)e Fm(what)q
+Fu(\).)23 b(The)16 b(a\013ected)g(text)g(runs)195 348
+y(from)e Fm(start)h Fu(to)g Fm(end)p Fu(,)g(and)h(encompasses)f
+Fm(text)p Fu(.)1650 445 y(F)l(unction)-1749 b Fi(void)20
+b Fh(free)p 296 445 V 20 w(undo)p 441 445 V 20 w(list)k
+Fg(\(\))195 500 y Fu(F)l(ree)15 b(the)h(existing)g(undo)f(list.)1650
+597 y(F)l(unction)-1749 b Fi(int)20 b Fh(rl)p 215 597
+V 21 w(do)p 297 597 V 20 w(undo)i Fg(\(\))195 651 y Fu(Undo)16
+b(the)g(\014rst)f(thing)h(on)g(the)f(undo)h(list.)22
+b(Returns)17 b Ft(0)e Fu(if)h(there)g(w)o(as)f(nothing)h(to)f(undo,)195
+706 y(non-zero)g(if)h(something)g(w)o(as)e(undone.)137
+803 y(Finally)l(,)j(if)f(y)o(ou)f(neither)i(insert)f(nor)f(delete)i
+(text,)e(but)g(directly)i(mo)q(dify)f(the)g(existing)g(text)g(\(e.g.,)
+75 858 y(c)o(hange)i(its)h(case\),)g(call)g Ft(rl_modifying)14
+b(\(\))k Fu(once,)h(just)f(b)q(efore)h(y)o(ou)f(mo)q(dify)h(the)f
+(text.)29 b(Y)l(ou)19 b(m)o(ust)75 913 y(supply)d(the)g(indices)h(of)e
+(the)g(text)g(range)g(that)f(y)o(ou)h(are)g(going)g(to)g(mo)q(dify)l(.)
+1650 1010 y(F)l(unction)-1749 b Fi(int)20 b Fh(rl)p 215
+1010 V 21 w(mo)r(difying)h Fg(\()p Ft(int)15 b(start,)f(int)h(end)p
+Fg(\))195 1065 y Fu(T)l(ell)i(Readline)i(to)c(sa)o(v)o(e)g(the)i(text)e
+(b)q(et)o(w)o(een)h Fm(start)g Fu(and)g Fm(end)j Fu(as)c(a)h(single)h
+(undo)g(unit.)23 b(It)195 1120 y(is)16 b(assumed)f(that)g(y)o(ou)f
+(will)j(subsequen)o(tly)g(mo)q(dify)e(that)g(text.)75
+1237 y Fl(2.4.6)30 b(Redispla)n(y)1650 1363 y Fu(F)l(unction)-1749
+b Fi(void)20 b Fh(rl)p 241 1363 V 21 w(redispla)n(y)k
+Fg(\(\))195 1417 y Fu(Change)19 b(what's)f(displa)o(y)o(ed)i(on)f(the)f
+(screen)i(to)e(re\015ect)h(the)g(curren)o(t)g(con)o(ten)o(ts)f(of)g
+Ft(rl_)195 1472 y(line_buffer)p Fu(.)1650 1569 y(F)l(unction)-1749
+b Fi(int)20 b Fh(rl)p 215 1569 V 21 w(forced)p 390 1569
+V 20 w(up)r(date)p 584 1569 V 20 w(displa)n(y)k Fg(\(\))195
+1624 y Fu(F)l(orce)17 b(the)f(line)j(to)d(b)q(e)i(up)q(dated)f(and)g
+(redispla)o(y)o(ed,)h(whether)f(or)g(not)f(Readline)j(thinks)195
+1679 y(the)c(screen)h(displa)o(y)g(is)g(correct.)1650
+1776 y(F)l(unction)-1749 b Fi(int)20 b Fh(rl)p 215 1776
+V 21 w(on)p 297 1776 V 20 w(new)p 416 1776 V 21 w(line)k
+Fg(\(\))195 1831 y Fu(T)l(ell)15 b(the)f(up)q(date)h(functions)g(that)e
+(w)o(e)g(ha)o(v)o(e)h(mo)o(v)o(ed)f(on)o(to)g(a)h(new)g(\(empt)o(y\))f
+(line,)j(usually)195 1886 y(after)e(ouputting)i(a)f(newline.)1650
+1983 y(F)l(unction)-1749 b Fi(int)20 b Fh(rl)p 215 1983
+V 21 w(on)p 297 1983 V 20 w(new)p 416 1983 V 21 w(line)p
+525 1983 V 22 w(with)p 657 1983 V 22 w(prompt)h Fg(\(\))195
+2037 y Fu(T)l(ell)c(the)e(up)q(date)h(functions)g(that)f(w)o(e)g(ha)o
+(v)o(e)g(mo)o(v)o(ed)f(on)o(to)h(a)g(new)g(line,)i(with)f
+Fm(rl)p 1595 2037 14 2 v 16 w(prompt)195 2092 y Fu(already)f(displa)o
+(y)o(ed.)22 b(This)15 b(could)h(b)q(e)g(used)g(b)o(y)f(applications)i
+(that)d(w)o(an)o(t)g(to)h(output)g(the)195 2147 y(prompt)j(string)g
+(themselv)o(es,)h(but)g(still)h(need)f(Readline)h(to)e(kno)o(w)g(the)g
+(prompt)g(string)195 2202 y(length)e(for)e(redispla)o(y)l(.)22
+b(It)15 b(should)h(b)q(e)g(used)g(after)e(setting)h Fm(rl)p
+1258 2202 V 17 w(already)p 1420 2202 V 17 w(prompted)p
+Fu(.)1650 2299 y(F)l(unction)-1749 b Fi(int)20 b Fh(rl)p
+215 2299 18 3 v 21 w(reset)p 357 2299 V 20 w(line)p 465
+2299 V 23 w(state)j Fg(\(\))195 2354 y Fu(Reset)17 b(the)f(displa)o(y)h
+(state)f(to)f(a)h(clean)h(state)f(and)g(redispla)o(y)h(the)g(curren)o
+(t)f(line)i(starting)195 2409 y(on)d(a)g(new)g(line.)1650
+2506 y(F)l(unction)-1749 b Fi(int)20 b Fh(rl)p 215 2506
+V 21 w(message)g Fg(\()p Ft(va_alist)p Fg(\))195 2560
+y Fu(The)h(argumen)o(ts)f(are)g(a)g(string)h(as)f(w)o(ould)h(b)q(e)g
+(supplied)i(to)d Ft(printf)p Fu(.)35 b(The)21 b(resulting)195
+2615 y(string)h(is)g(displa)o(y)o(ed)h(in)g(the)f Fm(ec)o(ho)g(area)p
+Fu(.)39 b(The)23 b(ec)o(ho)f(area)f(is)h(also)g(used)h(to)e(displa)o(y)
+195 2670 y(n)o(umeric)16 b(argumen)o(ts)e(and)i(searc)o(h)f(strings.)p
+eop
+%%Page: 28 30
+28 29 bop 75 -58 a Fu(28)1299 b(GNU)15 b(Readline)i(Library)1650
+183 y(F)l(unction)-1749 b Fi(int)20 b Fh(rl)p 215 183
+18 3 v 21 w(clear)p 354 183 V 21 w(message)h Fg(\(\))195
+238 y Fu(Clear)15 b(the)h(message)e(in)i(the)g(ec)o(ho)f(area.)1650
+333 y(F)l(unction)-1749 b Fi(void)20 b Fh(rl)p 241 333
+V 21 w(sa)n(v)n(e)p 365 333 V 21 w(prompt)h Fg(\(\))195
+388 y Fu(Sa)o(v)o(e)e(the)h(lo)q(cal)h(Readline)h(prompt)d(displa)o(y)i
+(state)e(in)h(preparation)g(for)f(displa)o(ying)i(a)195
+443 y(new)15 b(message)g(in)h(the)f(message)g(area)g(with)g
+Ft(rl_message)p Fu(.)1650 538 y(F)l(unction)-1749 b Fi(void)20
+b Fh(rl)p 241 538 V 21 w(restore)p 436 538 V 20 w(prompt)g
+Fg(\(\))195 593 y Fu(Restore)c(the)h(lo)q(cal)h(Readline)g(prompt)e
+(displa)o(y)i(state)e(sa)o(v)o(ed)g(b)o(y)g(the)h(most)e(recen)o(t)i
+(call)195 648 y(to)e Ft(rl_save_prompt)p Fu(.)75 763
+y Fl(2.4.7)30 b(Mo)r(difying)20 b(T)-5 b(ext)1650 887
+y Fu(F)l(unction)-1749 b Fi(int)20 b Fh(rl)p 215 887
+V 21 w(insert)p 378 887 V 21 w(text)k Fg(\()p Ft(char)14
+b(*text)p Fg(\))195 942 y Fu(Insert)h Fm(text)h Fu(in)o(to)f(the)h
+(line)g(at)f(the)g(curren)o(t)g(cursor)g(p)q(osition.)1650
+1037 y(F)l(unction)-1749 b Fi(int)20 b Fh(rl)p 215 1037
+V 21 w(delete)p 383 1037 V 22 w(text)k Fg(\()p Ft(int)14
+b(start,)h(int)f(end)p Fg(\))195 1092 y Fu(Delete)i(the)f(text)g(b)q
+(et)o(w)o(een)g Fm(start)g Fu(and)h Fm(end)h Fu(in)f(the)g(curren)o(t)f
+(line.)1650 1187 y(F)l(unction)-1749 b Fi(char)20 b(*)f
+Fh(rl)p 286 1187 V 21 w(cop)n(y)p 421 1187 V 21 w(text)24
+b Fg(\()p Ft(int)14 b(start,)h(int)g(end)p Fg(\))195
+1242 y Fu(Return)h(a)f(cop)o(y)g(of)g(the)g(text)f(b)q(et)o(w)o(een)i
+Fm(start)f Fu(and)g Fm(end)j Fu(in)e(the)f(curren)o(t)g(line.)1650
+1337 y(F)l(unction)-1749 b Fi(int)20 b Fh(rl)p 215 1337
+V 21 w(kill)p 311 1337 V 23 w(text)k Fg(\()p Ft(int)14
+b(start,)h(int)g(end)p Fg(\))195 1392 y Fu(Cop)o(y)j(the)h(text)f(b)q
+(et)o(w)o(een)h Fm(start)f Fu(and)h Fm(end)i Fu(in)e(the)g(curren)o(t)f
+(line)i(to)e(the)h(kill)h(ring,)g(ap-)195 1447 y(p)q(ending)15
+b(or)f(prep)q(ending)h(to)e(the)h(last)f(kill)j(if)e(the)g(last)f
+(command)h(w)o(as)f(a)g(kill)i(command.)195 1502 y(The)j(text)f(is)h
+(deleted.)28 b(If)18 b Fm(start)f Fu(is)h(less)g(than)f
+Fm(end)p Fu(,)i(the)e(text)g(is)h(app)q(ended,)i(otherwise)195
+1556 y(prep)q(ended.)i(If)15 b(the)g(last)h(command)f(w)o(as)f(not)h(a)
+g(kill,)h(a)f(new)h(kill)h(ring)e(slot)g(is)h(used.)75
+1672 y Fl(2.4.8)30 b(Utilit)n(y)21 b(F)-5 b(unctions)1650
+1796 y Fu(F)l(unction)-1749 b Fi(int)20 b Fh(rl)p 215
+1796 V 21 w(read)p 346 1796 V 20 w(k)n(ey)k Fg(\(\))195
+1851 y Fu(Return)14 b(the)g(next)g(c)o(haracter)e(a)o(v)m(ailable.)22
+b(This)14 b(handles)h(input)f(inserted)h(in)o(to)e(the)h(input)195
+1905 y(stream)k(via)g Fm(p)q(ending)j(input)f Fu(\(see)f(Section)g(2.3)
+f([Readline)i(V)l(ariables],)g(page)e(21\))g(and)195
+1960 y Ft(rl_stuff_char)13 b(\(\))p Fu(,)i(macros,)f(and)h(c)o
+(haracters)g(read)g(from)f(the)i(k)o(eyb)q(oard.)1650
+2056 y(F)l(unction)-1749 b Fi(int)20 b Fh(rl)p 215 2056
+V 21 w(getc)j Fg(\()p Ft(FILE)14 b(*)p Fg(\))195 2110
+y Fu(Return)i(the)f(next)g(c)o(haracter)g(a)o(v)m(ailable)i(from)d(the)
+h(k)o(eyb)q(oard.)1650 2206 y(F)l(unction)-1749 b Fi(int)20
+b Fh(rl)p 215 2206 V 21 w(stu\013)p 346 2206 V 20 w(c)n(har)j
+Fg(\()p Ft(int)15 b(c)p Fg(\))195 2260 y Fu(Insert)22
+b Fm(c)i Fu(in)o(to)e(the)g(Readline)i(input)f(stream.)38
+b(It)22 b(will)h(b)q(e)f Ft(")p Fu(read)p Ft(")g Fu(b)q(efore)g
+(Readline)195 2315 y(attempts)14 b(to)h(read)g(c)o(haracters)f(from)h
+(the)g(terminal)h(with)f Ft(rl_read_key)f(\(\))p Fu(.)1650
+2410 y(F)l(unction)-1749 b Fi(int)20 b Fh(rl)p 215 2410
+V 21 w(extend)p 404 2410 V 21 w(line)p 513 2410 V 22
+w(bu\013er)j Fg(\()p Ft(int)15 b(len)p Fg(\))195 2465
+y Fu(Ensure)f(that)e Ft(rl_line_buffer)g Fu(has)h(enough)h(space)f(to)g
+(hold)h Fm(len)h Fu(c)o(haracters,)d(p)q(ossibly)195
+2520 y(reallo)q(cating)k(it)g(if)f(necessary)l(.)1650
+2615 y(F)l(unction)-1749 b Fi(int)20 b Fh(rl)p 215 2615
+V 21 w(initiali)q(z)q(e)26 b Fg(\(\))195 2670 y Fu(Initialize)18
+b(or)d(re-initialize)j(Readline's)f(in)o(ternal)f(state.)p
+eop
+%%Page: 29 31
+29 30 bop 75 -58 a Fu(Chapter)15 b(2:)k(Programming)c(with)g(GNU)g
+(Readline)844 b(29)1650 183 y(F)l(unction)-1749 b Fi(int)20
+b Fh(rl)p 215 183 18 3 v 21 w(reset)p 357 183 V 20 w(terminal)j
+Fg(\()p Ft(char)15 b(*terminal_name)p Fg(\))195 238 y
+Fu(Reinitializ)q(e)h(Readline's)g(idea)e(of)f(the)h(terminal)g
+(settings)g(using)g Fm(terminal)p 1501 238 14 2 v 17
+w(name)j Fu(as)c(the)195 293 y(terminal)k(t)o(yp)q(e)g(\(e.g.,)e
+Ft(vt100)p Fu(\).)24 b(If)16 b Fm(terminal)p 987 293
+V 18 w(name)j Fu(is)e(NULL,)g(the)g(v)m(alue)h(of)e(the)h
+Ft(TERM)195 348 y Fu(en)o(vironmen)o(t)e(v)m(ariable)i(is)f(used.)1650
+431 y(F)l(unction)-1749 b Fi(int)20 b Fh(alphab)r(etic)k
+Fg(\()p Ft(int)14 b(c)p Fg(\))195 486 y Fu(Return)i(1)f(if)g
+Fm(c)j Fu(is)e(an)f(alphab)q(etic)i(c)o(haracter.)1650
+570 y(F)l(unction)-1749 b Fi(int)20 b Fh(n)n(umeric)i
+Fg(\()p Ft(int)15 b(c)p Fg(\))195 624 y Fu(Return)h(1)f(if)g
+Fm(c)j Fu(is)e(a)f(n)o(umeric)h(c)o(haracter.)1650 708
+y(F)l(unction)-1749 b Fi(int)20 b Fh(ding)i Fg(\(\))195
+763 y Fu(Ring)16 b(the)f(terminal)h(b)q(ell,)h(ob)q(eying)f(the)g
+(setting)f(of)g Ft(bell-style)p Fu(.)1650 847 y(F)l(unction)-1749
+b Fi(void)20 b Fh(rl)p 241 847 18 3 v 21 w(displa)n(y)p
+435 847 V 22 w(matc)n(h)p 611 847 V 20 w(list)25 b Fg(\()p
+Ft(char)14 b(**matches,)g(int)g(len,)h(int)283 901 y(max)p
+Fg(\))195 956 y Fu(A)j(con)o(v)o(enience)i(function)g(for)d(displa)o
+(ying)j(a)e(list)i(of)e(strings)g(in)h(columnar)g(format)e(on)195
+1011 y(Readline's)e(output)e(stream.)18 b Ft(matches)12
+b Fu(is)h(the)g(list)h(of)f(strings,)f(in)i(argv)e(format,)g(suc)o(h)h
+(as)195 1066 y(a)h(list)h(of)e(completion)j(matc)o(hes.)j
+Ft(len)13 b Fu(is)i(the)f(n)o(um)o(b)q(er)h(of)e(strings)h(in)h
+Ft(matches)p Fu(,)e(and)h Ft(max)195 1120 y Fu(is)k(the)g(length)h(of)e
+(the)h(longest)g(string)g(in)h Ft(matches)p Fu(.)27 b(This)18
+b(function)h(uses)f(the)g(setting)195 1175 y(of)13 b
+Ft(print-completions-horizontally)d Fu(to)k(select)g(ho)o(w)g(the)g
+(matc)o(hes)f(are)h(displa)o(y)o(ed)195 1230 y(\(see)h(Section)h(1.3.1)
+e([Readline)j(Init)f(File)g(Syn)o(tax],)e(page)h(4\).)137
+1314 y(The)h(follo)o(wing)g(are)f(implemen)o(ted)h(as)f(macros,)f
+(de\014ned)j(in)f Ft(chartypes.h)p Fu(.)1650 1397 y(F)l(unction)-1749
+b Fi(int)20 b Fh(upp)r(ercase)p 426 1397 V 19 w(p)j Fg(\()p
+Ft(int)14 b(c)p Fg(\))195 1452 y Fu(Return)i(1)f(if)g
+Fm(c)j Fu(is)e(an)f(upp)q(ercase)i(alphab)q(etic)f(c)o(haracter.)1650
+1536 y(F)l(unction)-1749 b Fi(int)20 b Fh(lo)n(w)n(ercase)p
+409 1536 V 22 w(p)i Fg(\()p Ft(int)15 b(c)p Fg(\))195
+1591 y Fu(Return)h(1)f(if)g Fm(c)j Fu(is)e(a)f(lo)o(w)o(ercase)g
+(alphab)q(etic)i(c)o(haracter.)1650 1674 y(F)l(unction)-1749
+b Fi(int)20 b Fh(digit)p 289 1674 V 22 w(p)i Fg(\()p
+Ft(int)15 b(c)p Fg(\))195 1729 y Fu(Return)h(1)f(if)g
+Fm(c)j Fu(is)e(a)f(n)o(umeric)h(c)o(haracter.)1650 1813
+y(F)l(unction)-1749 b Fi(int)20 b Fh(to)p 227 1813 V
+20 w(upp)r(er)i Fg(\()p Ft(int)14 b(c)p Fg(\))195 1867
+y Fu(If)21 b Fm(c)i Fu(is)e(a)g(lo)o(w)o(ercase)f(alphab)q(etic)i(c)o
+(haracter,)f(return)g(the)f(corresp)q(onding)i(upp)q(ercase)195
+1922 y(c)o(haracter.)1650 2006 y(F)l(unction)-1749 b
+Fi(int)20 b Fh(to)p 227 2006 V 20 w(lo)n(w)n(er)k Fg(\()p
+Ft(int)15 b(c)p Fg(\))195 2061 y Fu(If)j Fm(c)j Fu(is)e(an)f(upp)q
+(ercase)h(alphab)q(etic)h(c)o(haracter,)e(return)g(the)g(corresp)q
+(onding)h(lo)o(w)o(ercase)195 2115 y(c)o(haracter.)1650
+2199 y(F)l(unction)-1749 b Fi(int)20 b Fh(digit)p 289
+2199 V 22 w(v)m(alue)j Fg(\()p Ft(int)15 b(c)p Fg(\))195
+2254 y Fu(If)g Fm(c)k Fu(is)c(a)g(n)o(um)o(b)q(er,)g(return)g(the)h(v)m
+(alue)g(it)g(represen)o(ts.)75 2357 y Fl(2.4.9)30 b(Alternate)20
+b(In)n(terface)137 2451 y Fu(An)j(alternate)f(in)o(terface)h(is)g(a)o
+(v)m(ailable)h(to)d(plain)j Ft(readline\(\))p Fu(.)40
+b(Some)22 b(applications)i(need)g(to)75 2506 y(in)o(terlea)o(v)o(e)15
+b(k)o(eyb)q(oard)f(I/O)h(with)g(\014le,)h(device,)f(or)f(windo)o(w)h
+(system)f(I/O,)h(t)o(ypically)h(b)o(y)e(using)h(a)g(main)75
+2560 y(lo)q(op)f(to)g Ft(select\(\))e Fu(on)i(v)m(arious)g(\014le)h
+(descriptors.)20 b(T)l(o)14 b(accomo)q(date)f(this)h(need,)h(readline)g
+(can)f(also)g(b)q(e)75 2615 y(in)o(v)o(ok)o(ed)i(as)f(a)g(`callbac)o
+(k')h(function)h(from)d(an)i(ev)o(en)o(t)f(lo)q(op.)22
+b(There)16 b(are)f(functions)h(a)o(v)m(ailable)i(to)c(mak)o(e)75
+2670 y(this)i(easy)l(.)p eop
+%%Page: 30 32
+30 31 bop 75 -58 a Fu(30)1299 b(GNU)15 b(Readline)i(Library)1650
+183 y(F)l(unction)-1749 b Fi(void)20 b Fh(rl)p 241 183
+18 3 v 21 w(callbac)n(k)p 458 183 V 23 w(handler)p 670
+183 V 21 w(install)25 b Fg(\()p Ft(char)14 b(*prompt,)g(Vfunction)283
+238 y(*lhandler)p Fg(\))195 293 y Fu(Set)i(up)h(the)g(terminal)g(for)f
+(readline)i(I/O)e(and)h(displa)o(y)g(the)g(initial)h(expanded)g(v)m
+(alue)f(of)195 348 y Fm(prompt)p Fu(.)24 b(Sa)o(v)o(e)17
+b(the)g(v)m(alue)h(of)e Fm(lhandler)22 b Fu(to)17 b(use)g(as)f(a)h
+(callbac)o(k)h(when)f(a)g(complete)g(line)195 402 y(of)e(input)h(has)f
+(b)q(een)h(en)o(tered.)1650 498 y(F)l(unction)-1749 b
+Fi(void)20 b Fh(rl)p 241 498 V 21 w(callbac)n(k)p 458
+498 V 23 w(read)p 591 498 V 20 w(c)n(har)j Fg(\(\))195
+553 y Fu(Whenev)o(er)14 b(an)f(application)i(determines)f(that)f(k)o
+(eyb)q(oard)g(input)h(is)g(a)o(v)m(ailable,)h(it)f(should)195
+608 y(call)20 b Ft(rl_callback_read_char\(\))p Fu(,)c(whic)o(h)k(will)g
+(read)f(the)g(next)g(c)o(haracter)f(from)g(the)195 663
+y(curren)o(t)25 b(input)h(source.)48 b(If)25 b(that)g(c)o(haracter)f
+(completes)h(the)g(line,)k Ft(rl_callback_)195 717 y(read_char)14
+b Fu(will)k(in)o(v)o(ok)o(e)e(the)f Fm(lhandler)21 b
+Fu(function)c(sa)o(v)o(ed)e(b)o(y)h Ft(rl_callback_handler_)195
+772 y(install)g Fu(to)h(pro)q(cess)g(the)g(line.)27 b
+Ft(EOF)17 b Fu(is)h(indicated)g(b)o(y)f(calling)i Fm(lhandler)j
+Fu(with)c(a)f Ft(NULL)195 827 y Fu(line.)1650 923 y(F)l(unction)-1749
+b Fi(void)20 b Fh(rl)p 241 923 V 21 w(callbac)n(k)p 458
+923 V 23 w(handler)p 670 923 V 21 w(remo)n(v)n(e)i Fg(\(\))195
+977 y Fu(Restore)15 b(the)g(terminal)g(to)g(its)g(initial)i(state)d
+(and)h(remo)o(v)o(e)f(the)h(line)h(handler.)21 b(This)16
+b(ma)o(y)195 1032 y(b)q(e)g(called)h(from)d(within)j(a)d(callbac)o(k)j
+(as)d(w)o(ell)j(as)d(indep)q(enden)o(tly)m(.)75 1148
+y Fl(2.4.10)29 b(An)21 b(Example)137 1246 y Fu(Here)f(is)g(a)f
+(function)i(whic)o(h)f(c)o(hanges)f(lo)o(w)o(ercase)h(c)o(haracters)e
+(to)h(their)h(upp)q(ercase)h(equiv)m(alen)o(ts,)75 1301
+y(and)e(upp)q(ercase)i(c)o(haracters)d(to)h(lo)o(w)o(ercase.)31
+b(If)20 b(this)f(function)h(w)o(as)f(b)q(ound)h(to)f(`)p
+Ft(M-c)p Fu(',)f(then)i(t)o(yping)75 1356 y(`)p Ft(M-c)p
+Fu(')12 b(w)o(ould)h(c)o(hange)h(the)f(case)g(of)g(the)g(c)o(haracter)g
+(under)g(p)q(oin)o(t.)20 b(T)o(yping)14 b(`)p Ft(M-1)g(0)h(M-c)p
+Fu(')d(w)o(ould)i(c)o(hange)75 1410 y(the)h(case)g(of)g(the)h(follo)o
+(wing)f(10)g(c)o(haracters,)f(lea)o(ving)i(the)f(cursor)g(on)g(the)h
+(last)f(c)o(haracter)f(c)o(hanged.)195 1477 y Ft(/*)24
+b(Invert)f(the)g(case)g(of)h(the)f(COUNT)h(following)e(characters.)h
+(*/)195 1528 y(int)195 1580 y(invert_case_line)f(\(count,)h(key\))314
+1632 y(int)h(count,)f(key;)195 1684 y({)243 1736 y(register)f(int)i
+(start,)f(end,)g(i;)243 1840 y(start)g(=)h(rl_point;)243
+1944 y(if)f(\(rl_point)g(>=)h(rl_end\))290 1995 y(return)f(\(0\);)243
+2099 y(if)g(\(count)g(<)h(0\))290 2151 y({)338 2203 y(direction)f(=)h
+(-1;)338 2255 y(count)f(=)h(-count;)290 2307 y(})243
+2359 y(else)290 2411 y(direction)f(=)h(1;)243 2514 y(/*)f(Find)h(the)f
+(end)h(of)f(the)h(range)f(to)g(modify.)g(*/)243 2566
+y(end)g(=)h(start)f(+)h(\(count)f(*)h(direction\);)243
+2670 y(/*)f(Force)g(it)h(to)g(be)f(within)g(range.)g(*/)p
+eop
+%%Page: 31 33
+31 32 bop 75 -58 a Fu(Chapter)15 b(2:)k(Programming)c(with)g(GNU)g
+(Readline)844 b(31)243 183 y Ft(if)23 b(\(end)h(>)f(rl_end\))290
+235 y(end)h(=)g(rl_end;)243 287 y(else)f(if)h(\(end)f(<)h(0\))290
+339 y(end)g(=)g(0;)243 443 y(if)f(\(start)g(==)h(end\))290
+495 y(return)f(\(0\);)243 598 y(if)g(\(start)g(>)h(end\))290
+650 y({)338 702 y(int)g(temp)f(=)h(start;)338 754 y(start)f(=)h(end;)
+338 806 y(end)g(=)f(temp;)290 858 y(})243 962 y(/*)g(Tell)h(readline)e
+(that)i(we)f(are)h(modifying)e(the)i(line,)f(so)h(it)f(will)h(save)314
+1013 y(the)g(undo)f(information.)f(*/)243 1065 y(rl_modifying)g
+(\(start,)h(end\);)243 1169 y(for)g(\(i)h(=)f(start;)h(i)f(!=)h(end;)f
+(i++\))290 1221 y({)338 1273 y(if)h(\(uppercase_p)e
+(\(rl_line_buffer[i]\)\))386 1325 y(rl_line_buffer[i])f(=)j(to_lower)f
+(\(rl_line_buffer[i]\);)338 1377 y(else)g(if)h(\(lowercase_p)e
+(\(rl_line_buffer[i]\)\))386 1429 y(rl_line_buffer[i])f(=)j(to_upper)f
+(\(rl_line_buffer[i]\);)290 1480 y(})243 1532 y(/*)g(Move)h(point)f(to)
+g(on)h(top)f(of)h(the)f(last)h(character)e(changed.)h(*/)243
+1584 y(rl_point)f(=)i(\(direction)f(==)g(1\))h(?)g(end)f(-)h(1)g(:)f
+(start;)243 1636 y(return)g(\(0\);)195 1688 y(})75 1835
+y Fs(2.5)33 b(Readline)23 b(Signal)h(Handling)137 1938
+y Fu(Signals)e(are)f(async)o(hronous)f(ev)o(en)o(ts)h(sen)o(t)f(to)h(a)
+f(pro)q(cess)h(b)o(y)g(the)g(Unix)h(k)o(ernel,)g(sometimes)f(on)75
+1993 y(b)q(ehalf)g(of)e(another)h(pro)q(cess.)34 b(They)20
+b(are)g(in)o(tended)h(to)e(indicate)j(exceptional)f(ev)o(en)o(ts,)f
+(lik)o(e)h(a)f(user)75 2048 y(pressing)c(the)f(in)o(terrupt)g(k)o(ey)g
+(on)g(his)h(terminal,)f(or)g(a)f(net)o(w)o(ork)g(connection)i(b)q(eing)
+g(brok)o(en.)k(There)15 b(is)75 2102 y(a)e(class)g(of)g(signals)h(that)
+f(can)g(b)q(e)h(sen)o(t)f(to)f(the)i(pro)q(cess)f(curren)o(tly)h
+(reading)f(input)i(from)d(the)h(k)o(eyb)q(oard.)75 2157
+y(Since)i(Readline)g(c)o(hanges)f(the)f(terminal)h(attributes)f(when)h
+(it)g(is)g(called,)h(it)e(needs)h(to)f(p)q(erform)g(sp)q(ecial)75
+2212 y(pro)q(cessing)22 b(when)f(a)g(signal)h(is)g(receiv)o(ed)g(to)e
+(restore)g(the)i(terminal)f(to)g(a)g(sane)g(state,)g(or)f(pro)o(vide)75
+2267 y(application)d(writers)e(with)g(functions)h(to)f(do)g(so)g(man)o
+(ually)l(.)137 2341 y(Readline)23 b(con)o(tains)d(an)g(in)o(ternal)h
+(signal)g(handler)g(that)f(is)h(installed)h(for)d(a)h(n)o(um)o(b)q(er)g
+(of)g(signals)75 2396 y(\()p Ft(SIGINT)p Fu(,)h Ft(SIGQUIT)p
+Fu(,)g Ft(SIGTERM)p Fu(,)g Ft(SIGALRM)p Fu(,)g Ft(SIGTSTP)p
+Fu(,)g Ft(SIGTTIN)p Fu(,)h(and)f Ft(SIGTTOU)p Fu(\).)36
+b(When)21 b(one)g(of)75 2451 y(these)16 b(signals)h(is)f(receiv)o(ed,)h
+(the)f(signal)h(handler)f(will)i(reset)e(the)g(terminal)g(attributes)g
+(to)f(those)h(that)75 2506 y(w)o(ere)22 b(in)h(e\013ect)f(b)q(efore)g
+Ft(readline)14 b(\(\))22 b Fu(w)o(as)f(called,)k(reset)d(the)g(signal)h
+(handling)h(to)d(what)g(it)i(w)o(as)75 2560 y(b)q(efore)e
+Ft(readline)14 b(\(\))20 b Fu(w)o(as)f(called,)k(and)e(resend)g(the)f
+(signal)i(to)d(the)i(calling)h(application.)37 b(If)21
+b(and)75 2615 y(when)15 b(the)f(calling)i(application's)g(signal)f
+(handler)g(returns,)f(Readline)j(will)e(reinitialize)j(the)c(terminal)
+75 2670 y(and)21 b(con)o(tin)o(ue)h(to)e(accept)h(input.)39
+b(When)21 b(a)g Ft(SIGINT)f Fu(is)h(receiv)o(ed,)j(the)d(Readline)i
+(signal)f(handler)p eop
+%%Page: 32 34
+32 33 bop 75 -58 a Fu(32)1299 b(GNU)15 b(Readline)i(Library)75
+183 y(p)q(erforms)h(some)f(additional)j(w)o(ork,)d(whic)o(h)i(will)h
+(cause)e(an)o(y)g(partially-en)o(tered)h(line)h(to)d(b)q(e)i(ab)q
+(orted)75 238 y(\(see)c(the)g(description)i(of)e Ft(rl_free_line_state)
+e(\(\))p Fu(\).)137 307 y(There)i(is)h(an)f(additional)h(Readline)h
+(signal)f(handler,)g(for)e Ft(SIGWINCH)p Fu(,)g(whic)o(h)h(the)g(k)o
+(ernel)h(sends)g(to)75 362 y(a)i(pro)q(cess)h(whenev)o(er)h(the)e
+(terminal's)h(size)h(c)o(hanges)f(\(for)f(example,)i(if)f(a)f(user)h
+(resizes)h(an)e Ft(xterm)p Fu(\).)75 417 y(The)k(Readline)h
+Ft(SIGWINCH)d Fu(handler)j(up)q(dates)e(Readline's)i(in)o(ternal)g
+(screen)e(size)i(state,)e(and)h(then)75 472 y(calls)c(an)o(y)f
+Ft(SIGWINCH)e Fu(signal)j(handler)g(the)f(calling)i(application)f(has)f
+(installed.)27 b(Readline)19 b(calls)f(the)75 527 y(application's)h
+Ft(SIGWINCH)d Fu(signal)j(handler)f(without)g(resetting)g(the)f
+(terminal)i(to)e(its)g(original)i(state.)75 581 y(If)d(the)g
+(application's)h(signal)g(handler)g(do)q(es)g(more)e(than)h(up)q(date)h
+(its)f(idea)h(of)e(the)h(terminal)h(size)g(and)75 636
+y(return)e(\(for)f(example,)h(a)g Ft(longjmp)f Fu(bac)o(k)g(to)h(a)f
+(main)h(pro)q(cessing)h(lo)q(op\),)f(it)g Fm(m)o(ust)g
+Fu(call)i Ft(rl_cleanup_)75 691 y(after_signal)d(\(\))g
+Fu(\(describ)q(ed)j(b)q(elo)o(w\),)e(to)g(restore)f(the)i(terminal)g
+(state.)137 760 y(Readline)h(pro)o(vides)e(t)o(w)o(o)e(v)m(ariables)i
+(that)f(allo)o(w)g(application)i(writers)e(to)g(con)o(trol)g(whether)h
+(or)e(not)75 815 y(it)k(will)h(catc)o(h)e(certain)h(signals)h(and)f
+(act)f(on)g(them)h(when)g(they)f(are)h(receiv)o(ed.)25
+b(It)16 b(is)i(imp)q(ortan)o(t)e(that)75 870 y(applications)j(c)o
+(hange)e(the)g(v)m(alues)i(of)d(these)i(v)m(ariables)g(only)g(when)g
+(calling)g Ft(readline)d(\(\))p Fu(,)h(not)h(in)h(a)75
+925 y(signal)e(handler,)g(so)f(Readline's)i(in)o(ternal)f(signal)g
+(state)e(is)i(not)f(corrupted.)1661 1021 y(V)l(ariable)-1749
+b Fi(int)20 b Fh(rl)p 215 1021 18 3 v 21 w(catc)n(h)p
+366 1021 V 22 w(signals)195 1076 y Fu(If)h(this)h(v)m(ariable)g(is)g
+(non-zero,)g(Readline)i(will)e(install)h(signal)f(handlers)g(for)e
+Ft(SIGINT)p Fu(,)195 1131 y Ft(SIGQUIT)p Fu(,)14 b Ft(SIGTERM)p
+Fu(,)g Ft(SIGALRM)p Fu(,)f Ft(SIGTSTP)p Fu(,)h Ft(SIGTTIN)p
+Fu(,)g(and)h Ft(SIGTTOU)p Fu(.)195 1200 y(The)g(default)h(v)m(alue)h
+(of)d Ft(rl_catch_signals)f Fu(is)j(1.)1661 1297 y(V)l(ariable)-1749
+b Fi(int)20 b Fh(rl)p 215 1297 V 21 w(catc)n(h)p 366
+1297 V 22 w(sigwinc)n(h)195 1351 y Fu(If)15 b(this)h(v)m(ariable)g(is)g
+(non-zero,)f(Readline)i(will)g(install)f(a)f(signal)h(handler)g(for)e
+Ft(SIGWINCH)p Fu(.)195 1421 y(The)h(default)h(v)m(alue)h(of)d
+Ft(rl_catch_sigwinch)f Fu(is)j(1.)137 1517 y(If)g(an)f(application)j
+(do)q(es)d(not)g(wish)i(to)d(ha)o(v)o(e)h(Readline)j(catc)o(h)e(an)o(y)
+f(signals,)h(or)f(to)f(handle)j(signals)75 1572 y(other)i(than)g(those)
+g(Readline)j(catc)o(hes)d(\()p Ft(SIGHUP)p Fu(,)g(for)g(example\),)h
+(Readline)i(pro)o(vides)d(con)o(v)o(enience)75 1627 y(functions)d(to)f
+(do)g(the)g(necessary)g(terminal)h(and)g(in)o(ternal)g(state)e(clean)o
+(up)i(up)q(on)g(receipt)g(of)f(a)g(signal.)1650 1723
+y(F)l(unction)-1749 b Fi(void)20 b Fh(rl)p 241 1723 V
+21 w(clean)n(up)p 450 1723 V 22 w(after)p 590 1723 V
+20 w(signal)j Fg(\()p Ft(void)p Fg(\))195 1778 y Fu(This)12
+b(function)h(will)g(reset)f(the)g(state)f(of)g(the)h(terminal)h(to)e
+(what)g(it)h(w)o(as)f(b)q(efore)h Ft(readline)195 1833
+y(\(\))f Fu(w)o(as)f(called,)j(and)e(remo)o(v)o(e)g(the)g(Readline)i
+(signal)f(handlers)g(for)e(all)i(signals,)h(dep)q(ending)195
+1888 y(on)i(the)g(v)m(alues)i(of)e Ft(rl_catch_signals)d
+Fu(and)k Ft(rl_catch_sigwinch)p Fu(.)1650 1984 y(F)l(unction)-1749
+b Fi(void)20 b Fh(rl)p 241 1984 V 21 w(free)p 356 1984
+V 20 w(line)p 464 1984 V 23 w(state)j Fg(\()p Ft(void)p
+Fg(\))195 2039 y Fu(This)e(will)h(free)e(an)o(y)g(partial)g(state)g
+(asso)q(ciated)g(with)g(the)h(curren)o(t)f(input)h(line)h(\(undo)195
+2094 y(information,)d(an)o(y)f(partial)h(history)f(en)o(try)l(,)h(an)o
+(y)f(partially-en)o(tered)i(k)o(eyb)q(oard)e(macro,)195
+2148 y(and)c(an)o(y)f(partially-en)o(tered)i(n)o(umeric)f(argumen)o
+(t\).)k(This)c(should)h(b)q(e)f(called)h(b)q(efore)e
+Ft(rl_)195 2203 y(cleanup_after_signal)f(\(\))p Fu(.)23
+b(The)16 b(Readline)j(signal)e(handler)g(for)f Ft(SIGINT)f
+Fu(calls)j(this)195 2258 y(to)d(ab)q(ort)f(the)h(curren)o(t)h(input)g
+(line.)1650 2354 y(F)l(unction)-1749 b Fi(void)20 b Fh(rl)p
+241 2354 V 21 w(reset)p 383 2354 V 20 w(after)p 521 2354
+V 21 w(signal)j Fg(\()p Ft(void)p Fg(\))195 2409 y Fu(This)d(will)h
+(reinitialize)i(the)c(terminal)i(and)e(reinstall)i(an)o(y)e(Readline)j
+(signal)e(handlers,)195 2464 y(dep)q(ending)d(on)f(the)f(v)m(alues)h
+(of)f Ft(rl_catch_signals)e Fu(and)i Ft(rl_catch_sigwinch)p
+Fu(.)137 2560 y(If)20 b(an)g(application)h(do)q(es)f(not)g(wish)g
+(Readline)i(to)d(catc)o(h)g Ft(SIGWINCH)p Fu(,)h(it)g(ma)o(y)f(call)h
+Ft(rl_resize_)75 2615 y(terminal)14 b(\(\))i Fu(to)g(force)g(Readline)j
+(to)d(up)q(date)h(its)g(idea)g(of)f(the)g(terminal)i(size)f(when)g(a)f
+Ft(SIGWINCH)f Fu(is)75 2670 y(receiv)o(ed.)p eop
+%%Page: 33 35
+33 34 bop 75 -58 a Fu(Chapter)15 b(2:)k(Programming)c(with)g(GNU)g
+(Readline)844 b(33)1650 183 y(F)l(unction)-1749 b Fi(void)20
+b Fh(rl)p 241 183 18 3 v 21 w(resize)p 401 183 V 22 w(terminal)j
+Fg(\()p Ft(void)p Fg(\))195 238 y Fu(Up)q(date)16 b(Readline's)h(in)o
+(ternal)f(screen)f(size.)137 319 y(The)h(follo)o(wing)g(functions)g
+(install)g(and)g(remo)o(v)o(e)e(Readline's)j(signal)f(handlers.)1650
+399 y(F)l(unction)-1749 b Fi(int)20 b Fh(rl)p 215 399
+V 21 w(set)p 307 399 V 20 w(signals)j Fg(\()p Ft(void)p
+Fg(\))195 454 y Fu(Install)28 b(Readline's)g(signal)f(handler)h(for)e
+Ft(SIGINT)p Fu(,)i Ft(SIGQUIT)p Fu(,)f Ft(SIGTERM)p Fu(,)h
+Ft(SIGALRM)p Fu(,)195 509 y Ft(SIGTSTP)p Fu(,)19 b Ft(SIGTTIN)p
+Fu(,)h Ft(SIGTTOU)p Fu(,)f(and)h Ft(SIGWINCH)p Fu(,)g(dep)q(ending)i
+(on)d(the)h(v)m(alues)h(of)e Ft(rl_)195 564 y(catch_signals)13
+b Fu(and)j Ft(rl_catch_sigwinch)p Fu(.)1650 644 y(F)l(unction)-1749
+b Fi(int)20 b Fh(rl)p 215 644 V 21 w(clear)p 354 644
+V 21 w(signals)j Fg(\()p Ft(void)p Fg(\))195 699 y Fu(Remo)o(v)o(e)15
+b(all)h(of)f(the)g(Readline)j(signal)e(handlers)g(installed)h(b)o(y)e
+Ft(rl_set_signals)e(\(\))p Fu(.)75 816 y Fs(2.6)33 b(Custom)21
+b(Completers)137 908 y Fu(T)o(ypically)l(,)e(a)d(program)f(that)h
+(reads)h(commands)f(from)g(the)h(user)f(has)h(a)f(w)o(a)o(y)g(of)g
+(disam)o(biguating)75 963 y(commands)i(and)f(data.)27
+b(If)18 b(y)o(our)f(program)g(is)h(one)g(of)f(these,)i(then)f(it)g(can)
+f(pro)o(vide)i(completion)g(for)75 1018 y(commands,)14
+b(data,)g(or)g(b)q(oth.)20 b(The)15 b(follo)o(wing)g(sections)g
+(describ)q(e)h(ho)o(w)e(y)o(our)g(program)g(and)h(Readline)75
+1073 y(co)q(op)q(erate)g(to)g(pro)o(vide)g(this)h(service.)75
+1173 y Fl(2.6.1)30 b(Ho)n(w)21 b(Completing)f(W)-5 b(orks)137
+1266 y Fu(In)18 b(order)f(to)f(complete)i(some)f(text,)g(the)g(full)i
+(list)e(of)g(p)q(ossible)i(completions)f(m)o(ust)f(b)q(e)h(a)o(v)m
+(ailable.)75 1321 y(That)e(is,)i(it)f(is)h(not)f(p)q(ossible)h(to)f
+(accurately)g(expand)h(a)e(partial)i(w)o(ord)e(without)h(kno)o(wing)g
+(all)h(of)f(the)75 1375 y(p)q(ossible)i(w)o(ords)e(whic)o(h)h(mak)o(e)f
+(sense)h(in)h(that)d(con)o(text.)26 b(The)18 b(Readline)i(library)e
+(pro)o(vides)g(the)g(user)75 1430 y(in)o(terface)f(to)f(completion,)i
+(and)e(t)o(w)o(o)g(of)g(the)h(most)f(common)g(completion)i(functions:)
+23 b(\014lename)18 b(and)75 1485 y(username.)h(F)l(or)10
+b(completing)i(other)e(t)o(yp)q(es)h(of)f(text,)h(y)o(ou)g(m)o(ust)f
+(write)h(y)o(our)f(o)o(wn)h(completion)g(function.)75
+1540 y(This)16 b(section)g(describ)q(es)g(exactly)g(what)f(suc)o(h)g
+(functions)h(m)o(ust)f(do,)f(and)i(pro)o(vides)f(an)h(example.)137
+1603 y(There)g(are)f(three)g(ma)s(jor)f(functions)i(used)f(to)g(p)q
+(erform)g(completion:)100 1667 y(1.)29 b(The)21 b(user-in)o(terface)g
+(function)g Ft(rl_complete)14 b(\(\))p Fu(.)35 b(This)21
+b(function)g(is)g(called)h(with)f(the)f(same)165 1721
+y(argumen)o(ts)c(as)g(other)h(Readline)i(functions)f(in)o(tended)g(for)
+e(in)o(teractiv)o(e)i(use:)23 b Fm(coun)o(t)18 b Fu(and)f
+Fm(in)o(v)o(ok-)165 1776 y(ing)p 228 1776 14 2 v 17 w(k)o(ey)p
+Fu(.)34 b(It)20 b(isolates)g(the)g(w)o(ord)f(to)h(b)q(e)g(completed)h
+(and)f(calls)h Ft(completion_matches)13 b(\(\))20 b Fu(to)165
+1831 y(generate)f(a)f(list)i(of)e(p)q(ossible)j(completions.)32
+b(It)18 b(then)i(either)f(lists)h(the)f(p)q(ossible)h(completions,)165
+1886 y(inserts)g(the)f(p)q(ossible)j(completions,)f(or)e(actually)h(p)q
+(erforms)f(the)h(completion,)h(dep)q(ending)h(on)165
+1940 y(whic)o(h)16 b(b)q(eha)o(vior)g(is)f(desired.)100
+2004 y(2.)29 b(The)11 b(in)o(ternal)g(function)g Ft(completion_matches)
+i(\(\))d Fu(uses)h(y)o(our)e Fm(generator)k Fu(function)e(to)f
+(generate)165 2059 y(the)16 b(list)h(of)f(p)q(ossible)i(matc)o(hes,)d
+(and)h(then)h(returns)f(the)g(arra)o(y)f(of)g(these)i(matc)o(hes.)22
+b(Y)l(ou)16 b(should)165 2113 y(place)g(the)f(address)h(of)e(y)o(our)h
+(generator)f(function)i(in)g Ft(rl_completion_entry_function)p
+Fu(.)100 2177 y(3.)29 b(The)19 b(generator)e(function)j(is)f(called)h
+(rep)q(eatedly)f(from)f Ft(completion_matches)13 b(\(\))p
+Fu(,)18 b(returning)165 2232 y(a)e(string)g(eac)o(h)h(time.)24
+b(The)17 b(argumen)o(ts)e(to)h(the)g(generator)g(function)h(are)f
+Fm(text)h Fu(and)g Fm(state)p Fu(.)22 b Fm(text)165 2286
+y Fu(is)17 b(the)f(partial)g(w)o(ord)f(to)h(b)q(e)h(completed.)23
+b Fm(state)18 b Fu(is)e(zero)g(the)g(\014rst)g(time)g(the)g(function)h
+(is)g(called,)165 2341 y(allo)o(wing)f(the)e(generator)g(to)g(p)q
+(erform)h(an)o(y)f(necessary)h(initialization,)j(and)d(a)f(p)q(ositiv)o
+(e)i(non-zero)165 2396 y(in)o(teger)i(for)f(eac)o(h)g(subsequen)o(t)h
+(call.)28 b(When)18 b(the)g(generator)f(function)h(returns)f
+Ft(\(char)e(*\)NULL)165 2451 y Fu(this)h(signals)h Ft
+(completion_matches)c(\(\))i Fu(that)g(there)h(are)g(no)g(more)f(p)q
+(ossibilitie)q(s)j(left.)23 b(Usually)165 2506 y(the)c(generator)g
+(function)h(computes)g(the)f(list)h(of)f(p)q(ossible)i(completions)g
+(when)e Fm(state)j Fu(is)d(zero,)165 2560 y(and)13 b(returns)g(them)f
+(one)h(at)f(a)h(time)g(on)g(subsequen)o(t)g(calls.)20
+b(Eac)o(h)13 b(string)f(the)h(generator)f(function)165
+2615 y(returns)k(as)f(a)h(matc)o(h)f(m)o(ust)h(b)q(e)g(allo)q(cated)h
+(with)g Ft(malloc\(\))p Fu(;)d(Readline)19 b(frees)d(the)g(strings)f
+(when)165 2670 y(it)g(has)h(\014nished)g(with)g(them.)p
+eop
+%%Page: 34 36
+34 35 bop 75 -58 a Fu(34)1299 b(GNU)15 b(Readline)i(Library)1650
+183 y(F)l(unction)-1749 b Fi(int)20 b Fh(rl)p 215 183
+18 3 v 21 w(complete)j Fg(\()p Ft(int)14 b(ignore,)g(int)h
+(invoking_key)p Fg(\))195 238 y Fu(Complete)20 b(the)g(w)o(ord)f(at)g
+(or)g(b)q(efore)h(p)q(oin)o(t.)34 b(Y)l(ou)20 b(ha)o(v)o(e)f(supplied)j
+(the)e(function)h(that)195 293 y(do)q(es)15 b(the)g(initial)h(simple)h
+(matc)o(hing)d(selection)i(algorithm)f(\(see)f Ft(completion_matches)
+195 348 y(\(\))p Fu(\).)19 b(The)d(default)f(is)h(to)f(do)g(\014lename)
+h(completion.)1661 448 y(V)l(ariable)-1749 b Fi(Function)20
+b(*)g Fh(rl)p 391 448 V 21 w(completion)p 686 448 V 21
+w(en)n(try)p 839 448 V 21 w(function)195 503 y Fu(This)c(is)f(a)g(p)q
+(oin)o(ter)g(to)g(the)g(generator)f(function)i(for)e
+Ft(completion_matches)f(\(\))p Fu(.)20 b(If)15 b(the)195
+558 y(v)m(alue)21 b(of)e Ft(rl_completion_entry_functio)o(n)e
+Fu(is)j Ft(\(Function)14 b(*\)NULL)19 b Fu(then)h(the)f(de-)195
+613 y(fault)11 b(\014lename)h(generator)d(function,)j
+Ft(filename_completion_function)g(\(\))p Fu(,)f(is)g(used.)75
+734 y Fl(2.6.2)30 b(Completion)20 b(F)-5 b(unctions)137
+834 y Fu(Here)16 b(is)f(the)h(complete)g(list)g(of)e(callable)k
+(completion)e(functions)g(presen)o(t)f(in)h(Readline.)1650
+935 y(F)l(unction)-1749 b Fi(int)20 b Fh(rl)p 215 935
+V 21 w(complete)p 460 935 V 21 w(in)n(ternal)k Fg(\()p
+Ft(int)15 b(what_to_do)p Fg(\))195 990 y Fu(Complete)k(the)f(w)o(ord)g
+(at)g(or)g(b)q(efore)g(p)q(oin)o(t.)30 b Fm(what)p 1105
+990 14 2 v 16 w(to)p 1162 990 V 16 w(do)21 b Fu(sa)o(ys)c(what)h(to)g
+(do)g(with)h(the)195 1045 y(completion.)33 b(A)19 b(v)m(alue)h(of)f(`)p
+Ft(?)p Fu(')f(means)h(list)h(the)f(p)q(ossible)i(completions.)33
+b(`)p Ft(TAB)p Fu(')18 b(means)195 1099 y(do)g(standard)g(completion.)
+30 b(`)p Ft(*)p Fu(')18 b(means)g(insert)g(all)i(of)d(the)i(p)q
+(ossible)h(completions.)30 b(`)p Ft(!)p Fu(')195 1154
+y(means)17 b(to)f(displa)o(y)i(all)g(of)e(the)h(p)q(ossible)i
+(completions,)f(if)f(there)g(is)g(more)g(than)f(one,)h(as)195
+1209 y(w)o(ell)f(as)f(p)q(erforming)h(partial)f(completion.)1650
+1310 y(F)l(unction)-1749 b Fi(int)20 b Fh(rl)p 215 1310
+18 3 v 21 w(complete)j Fg(\()p Ft(int)14 b(ignore,)g(int)h
+(invoking_key)p Fg(\))195 1365 y Fu(Complete)20 b(the)g(w)o(ord)f(at)g
+(or)g(b)q(efore)h(p)q(oin)o(t.)34 b(Y)l(ou)20 b(ha)o(v)o(e)f(supplied)j
+(the)e(function)h(that)195 1419 y(do)q(es)15 b(the)g(initial)h(simple)h
+(matc)o(hing)d(selection)i(algorithm)f(\(see)f Ft(completion_matches)
+195 1474 y(\(\))h Fu(and)h Ft(rl_completion_entry_functi)o(on)p
+Fu(\).)i(The)e(default)g(is)g(to)f(do)g(\014lename)i(com-)195
+1529 y(pletion.)k(This)15 b(calls)g Ft(rl_complete_internal)e(\(\))h
+Fu(with)h(an)f(argumen)o(t)f(dep)q(ending)k(on)195 1584
+y Fm(in)o(v)o(oking)p 364 1584 14 2 v 17 w(k)o(ey)p Fu(.)1650
+1685 y(F)l(unction)-1749 b Fi(int)19 b Fh(rl)p 214 1685
+18 3 v 21 w(p)r(ossible)p 432 1685 V 20 w(completions)k
+Fg(\()p Ft(int)15 b(count,)f(int)h(invoking_key)p Fg(\)\))195
+1739 y Fu(List)k(the)f(p)q(ossible)i(completions.)29
+b(See)19 b(description)h(of)d Ft(rl_complete)d(\(\))p
+Fu(.)28 b(This)19 b(calls)195 1794 y Ft(rl_complete_internal)12
+b(\(\))j Fu(with)h(an)f(argumen)o(t)f(of)h(`)p Ft(?)p
+Fu('.)1650 1895 y(F)l(unction)-1749 b Fi(int)20 b Fh(rl)p
+215 1895 V 21 w(insert)p 378 1895 V 21 w(completions)j
+Fg(\()p Ft(int)14 b(count,)g(int)h(invoking_key)p Fg(\)\))195
+1950 y Fu(Insert)24 b(the)h(list)f(of)g(p)q(ossible)i(completions)f(in)
+o(to)f(the)g(line,)k(deleting)e(the)e(partially-)195
+2004 y(completed)16 b(w)o(ord.)j(See)c(description)i(of)d
+Ft(rl_complete)g(\(\))p Fu(.)19 b(This)d(calls)g Ft(rl_complete_)195
+2059 y(internal)e(\(\))h Fu(with)g(an)h(argumen)o(t)e(of)h(`)p
+Ft(*)p Fu('.)1650 2160 y(F)l(unction)-1749 b Fi(char)20
+b(**)f Fh(completion)p 547 2160 V 21 w(matc)n(hes)j Fg(\()p
+Ft(char)15 b(*text,)f(CPFunction)283 2215 y(*entry_func)p
+Fg(\))195 2270 y Fu(Returns)f(an)f(arra)o(y)f(of)h Ft(\(char)j(*\))d
+Fu(whic)o(h)h(is)g(a)f(list)h(of)f(completions)i(for)e
+Fm(text)p Fu(.)18 b(If)13 b(there)f(are)195 2324 y(no)17
+b(completions,)g(returns)g Ft(\(char)d(**\)NULL)p Fu(.)23
+b(The)17 b(\014rst)f(en)o(try)g(in)i(the)e(returned)h(arra)o(y)195
+2379 y(is)c(the)h(substitution)f(for)g Fm(text)p Fu(.)18
+b(The)13 b(remaining)i(en)o(tries)e(are)f(the)i(p)q(ossible)g
+(completions.)195 2434 y(The)h(arra)o(y)f(is)i(terminated)g(with)f(a)g
+Ft(NULL)g Fu(p)q(oin)o(ter.)195 2506 y Fm(en)o(try)p
+302 2506 14 2 v 16 w(func)g Fu(is)d(a)f(function)h(of)g(t)o(w)o(o)e
+(args,)h(and)g(returns)h(a)f Ft(\(char)k(*\))p Fu(.)j(The)12
+b(\014rst)f(argumen)o(t)195 2560 y(is)j Fm(text)p Fu(.)19
+b(The)14 b(second)g(is)g(a)f(state)f(argumen)o(t;)h(it)h(is)g(zero)f
+(on)h(the)f(\014rst)g(call,)i(and)f(non-zero)195 2615
+y(on)g(subsequen)o(t)g(calls.)21 b Fm(en)o(try)p 714
+2615 V 16 w(func)c Fu(returns)d(a)f Ft(NULL)h Fu(p)q(oin)o(ter)g(to)f
+(the)h(caller)h(when)g(there)195 2670 y(are)g(no)g(more)g(matc)o(hes.)p
+eop
+%%Page: 35 37
+35 36 bop 75 -58 a Fu(Chapter)15 b(2:)k(Programming)c(with)g(GNU)g
+(Readline)844 b(35)1650 183 y(F)l(unction)-1749 b Fi(char)20
+b(*)f Fh(\014lename)p 455 183 18 3 v 20 w(completion)p
+749 183 V 21 w(function)k Fg(\()p Ft(char)15 b(*text,)f(int)283
+238 y(state)p Fg(\))195 293 y Fu(A)19 b(generator)g(function)h(for)f
+(\014lename)h(completion)h(in)f(the)f(general)h(case.)33
+b(Note)19 b(that)195 348 y(completion)e(in)f(Bash)f(is)h(a)f(little)i
+(di\013eren)o(t)f(b)q(ecause)g(of)f(all)h(the)g(pathnames)f(that)g(m)o
+(ust)195 402 y(b)q(e)i(follo)o(w)o(ed)g(when)g(lo)q(oking)h(up)f
+(completions)h(for)e(a)g(command.)24 b(The)17 b(Bash)g(source)f(is)195
+457 y(a)f(useful)h(reference)g(for)f(writing)g(custom)g(completion)h
+(functions.)1650 539 y(F)l(unction)-1749 b Fi(char)20
+b(*)f Fh(username)p 487 539 V 19 w(completion)p 780 539
+V 21 w(function)k Fg(\()p Ft(char)14 b(*text,)g(int)283
+594 y(state)p Fg(\))195 649 y Fu(A)k(completion)g(generator)f(for)g
+(usernames.)28 b Fm(text)18 b Fu(con)o(tains)f(a)h(partial)g(username)g
+(pre-)195 704 y(ceded)f(b)o(y)f(a)g(random)f(c)o(haracter)h(\(usually)h
+(`)p Ft(~)p Fu('\).)k(As)16 b(with)g(all)h(completion)g(generators,)195
+759 y Fm(state)g Fu(is)f(zero)f(on)g(the)g(\014rst)g(call)h(and)g
+(non-zero)f(for)g(subsequen)o(t)h(calls.)75 861 y Fl(2.6.3)30
+b(Completion)20 b(V)-5 b(ariables)1661 972 y Fu(V)l(ariable)-1749
+b Fi(Function)20 b(*)g Fh(rl)p 391 972 V 21 w(completion)p
+686 972 V 21 w(en)n(try)p 839 972 V 21 w(function)195
+1026 y Fu(A)c(p)q(oin)o(ter)h(to)e(the)i(generator)e(function)i(for)e
+Ft(completion_matches)e(\(\))p Fu(.)22 b Ft(NULL)16 b
+Fu(means)195 1081 y(to)f(use)g Ft(filename_completion_functio)o(n)d
+(\(\))p Fu(,)j(the)g(default)h(\014lename)g(completer.)1661
+1163 y(V)l(ariable)-1749 b Fi(CPPFunction)21 b(*)e Fh(rl)p
+469 1163 V 21 w(attempted)p 749 1163 V 20 w(completion)p
+1043 1163 V 21 w(function)195 1218 y Fu(A)d(p)q(oin)o(ter)h(to)f(an)g
+(alternativ)o(e)h(function)g(to)f(create)g(matc)o(hes.)23
+b(The)16 b(function)i(is)e(called)195 1273 y(with)f Fm(text)p
+Fu(,)g Fm(start)p Fu(,)e(and)i Fm(end)p Fu(.)21 b Fm(start)15
+b Fu(and)g Fm(end)i Fu(are)e(indices)i(in)f Ft(rl_line_buffer)d
+Fu(sa)o(ying)195 1328 y(what)22 b(the)h(b)q(oundaries)h(of)e
+Fm(text)h Fu(are.)42 b(If)23 b(this)g(function)h(exists)f(and)f
+(returns)h Ft(NULL)p Fu(,)195 1383 y(or)c(if)h(this)g(v)m(ariable)h(is)
+f(set)g(to)e Ft(NULL)p Fu(,)i(then)g Ft(rl_complete)14
+b(\(\))19 b Fu(will)i(call)g(the)f(v)m(alue)g(of)195
+1437 y Ft(rl_completion_entry_functi)o(on)14 b Fu(to)j(generate)g(matc)
+o(hes,)g(otherwise)g(the)g(arra)o(y)f(of)195 1492 y(strings)f(returned)
+h(will)h(b)q(e)e(used.)1661 1574 y(V)l(ariable)-1749
+b Fi(CPFunction)21 b(*)e Fh(rl)p 443 1574 V 21 w(\014lename)p
+672 1574 V 20 w(quoting)p 881 1574 V 21 w(function)195
+1629 y Fu(A)g(p)q(oin)o(ter)g(to)f(a)h(function)g(that)g(will)h(quote)f
+(a)f(\014lename)i(in)g(an)e(application-)j(sp)q(eci\014c)195
+1684 y(fashion.)33 b(This)20 b(is)g(called)h(if)f(\014lename)g
+(completion)h(is)f(b)q(eing)g(attempted)f(and)h(one)f(of)195
+1739 y(the)13 b(c)o(haracters)f(in)h Ft(rl_filename_quote_characte)o
+(rs)d Fu(app)q(ears)i(in)i(a)e(completed)i(\014le-)195
+1793 y(name.)29 b(The)18 b(function)h(is)g(called)h(with)e
+Fm(text)p Fu(,)g Fm(matc)o(h)p 1144 1793 14 2 v 16 w(t)o(yp)q(e)p
+Fu(,)h(and)f Fm(quote)p 1480 1793 V 16 w(p)q(oin)o(ter)p
+Fu(.)30 b(The)195 1848 y Fm(text)17 b Fu(is)h(the)f(\014lename)h(to)e
+(b)q(e)h(quoted.)25 b(The)17 b Fm(matc)o(h)p 1115 1848
+V 16 w(t)o(yp)q(e)i Fu(is)f(either)f Ft(SINGLE_MATCH)p
+Fu(,)e(if)195 1903 y(there)j(is)g(only)h(one)f(completion)h(matc)o(h,)f
+(or)f Ft(MULT_MATCH)p Fu(.)27 b(Some)18 b(functions)g(use)h(this)195
+1958 y(to)13 b(decide)i(whether)f(or)g(not)f(to)g(insert)h(a)f(closing)
+i(quote)f(c)o(haracter.)k(The)c Fm(quote)p 1600 1958
+V 16 w(p)q(oin)o(ter)195 2013 y Fu(is)20 b(a)g(p)q(oin)o(ter)g(to)f(an)
+o(y)g(op)q(ening)i(quote)e(c)o(haracter)g(the)h(user)g(t)o(yp)q(ed.)34
+b(Some)19 b(functions)195 2067 y(c)o(ho)q(ose)c(to)g(reset)g(this)g(c)o
+(haracter.)1661 2150 y(V)l(ariable)-1749 b Fi(CPFunction)21
+b(*)e Fh(rl)p 443 2150 18 3 v 21 w(\014lename)p 672 2150
+V 20 w(dequoting)p 939 2150 V 21 w(function)195 2204
+y Fu(A)14 b(p)q(oin)o(ter)g(to)e(a)i(function)g(that)f(will)i(remo)o(v)
+o(e)e(application-sp)q(eci\014c)k(quoting)d(c)o(haracters)195
+2259 y(from)21 b(a)g(\014lename)h(b)q(efore)f(completion)i(is)f
+(attempted,)g(so)f(those)g(c)o(haracters)f(do)h(not)195
+2314 y(in)o(terfere)e(with)f(matc)o(hing)h(the)f(text)g(against)g
+(names)g(in)h(the)f(\014lesystem.)30 b(It)19 b(is)f(called)195
+2369 y(with)g Fm(text)p Fu(,)g(the)g(text)g(of)g(the)g(w)o(ord)f(to)g
+(b)q(e)i(dequoted,)g(and)f Fm(quote)p 1381 2369 14 2
+v 16 w(c)o(har)p Fu(,)g(whic)o(h)h(is)g(the)195 2424
+y(quoting)e(c)o(haracter)f(that)g(delimits)i(the)f(\014lename)h
+(\(usually)f(`)p Ft(')p Fu(')f(or)g(`)p Ft(")p Fu('\).)23
+b(If)17 b Fm(quote)p 1657 2424 V 16 w(c)o(har)195 2478
+y Fu(is)f(zero,)e(the)i(\014lename)g(w)o(as)e(not)h(in)h(an)f(em)o(b)q
+(edded)i(string.)1661 2560 y(V)l(ariable)-1749 b Fi(Function)20
+b(*)g Fh(rl)p 391 2560 18 3 v 21 w(c)n(har)p 519 2560
+V 20 w(is)p 577 2560 V 22 w(quoted)p 770 2560 V 20 w(p)195
+2615 y Fu(A)c(p)q(oin)o(ter)g(to)f(a)h(function)g(to)g(call)g(that)g
+(determines)g(whether)g(or)g(not)f(a)g(sp)q(eci\014c)j(c)o(har-)195
+2670 y(acter)12 b(in)i(the)f(line)i(bu\013er)e(is)g(quoted,)g
+(according)h(to)e(whatev)o(er)g(quoting)h(mec)o(hanism)h(the)p
+eop
+%%Page: 36 38
+36 37 bop 75 -58 a Fu(36)1299 b(GNU)15 b(Readline)i(Library)195
+183 y(program)12 b(calling)j(readline)g(uses.)20 b(The)13
+b(function)h(is)g(called)h(with)f(t)o(w)o(o)e(argumen)o(ts:)18
+b Fm(text)p Fu(,)195 238 y(the)11 b(text)g(of)g(the)g(line,)i(and)f
+Fm(index)p Fu(,)g(the)g(index)g(of)f(the)g(c)o(haracter)g(in)h(the)f
+(line.)20 b(It)11 b(is)h(used)g(to)195 293 y(decide)20
+b(whether)e(a)g(c)o(haracter)g(found)h(in)g Ft
+(rl_completer_word_break_)o(charact)o(ers)195 348 y Fu(should)d(b)q(e)g
+(used)g(to)e(break)i(w)o(ords)e(for)h(the)g(completer.)1661
+447 y(V)l(ariable)-1749 b Fi(int)20 b Fh(rl)p 215 447
+18 3 v 21 w(completion)p 510 447 V 21 w(query)p 673 447
+V 21 w(items)195 502 y Fu(Up)d(to)e(this)i(man)o(y)f(items)h(will)h(b)q
+(e)f(displa)o(y)o(ed)g(in)g(resp)q(onse)g(to)f(a)g(p)q
+(ossible-completions)195 557 y(call.)26 b(After)16 b(that,)g(w)o(e)h
+(ask)f(the)h(user)g(if)g(she)g(is)h(sure)e(she)i(w)o(an)o(ts)d(to)h
+(see)h(them)g(all.)26 b(The)195 612 y(default)16 b(v)m(alue)g(is)g
+(100.)1661 712 y(V)l(ariable)-1749 b Fi(char)20 b(*)f
+Fh(rl)p 286 712 V 21 w(basic)p 430 712 V 21 w(w)n(ord)p
+575 712 V 21 w(break)p 736 712 V 20 w(c)n(haracters)195
+766 y Fu(The)13 b(basic)h(list)f(of)g(c)o(haracters)f(that)g(signal)i
+(a)e(break)h(b)q(et)o(w)o(een)g(w)o(ords)f(for)g(the)h(completer)195
+821 y(routine.)20 b(The)c(default)g(v)m(alue)g(of)f(this)g(v)m(ariable)
+i(is)f(the)f(c)o(haracters)g(whic)o(h)h(break)f(w)o(ords)195
+876 y(for)g(completion)h(in)g(Bash,)f(i.e.,)g Ft(")g
+(\\t\\n\\"\\\\'`@$><=;|&{\(")p Fu(.)1661 976 y(V)l(ariable)-1749
+b Fi(char)20 b(*)f Fh(rl)p 286 976 V 21 w(basic)p 430
+976 V 21 w(quote)p 590 976 V 21 w(c)n(haracters)195 1030
+y Fu(List)d(of)f(quote)g(c)o(haracters)f(whic)o(h)i(can)f(cause)h(a)f
+(w)o(ord)f(break.)1661 1130 y(V)l(ariable)-1749 b Fi(char)20
+b(*)f Fh(rl)p 286 1130 V 21 w(completer)p 555 1130 V
+21 w(w)n(ord)p 700 1130 V 20 w(break)p 860 1130 V 20
+w(c)n(haracters)195 1185 y Fu(The)j(list)g(of)f(c)o(haracters)g(that)g
+(signal)h(a)g(break)f(b)q(et)o(w)o(een)h(w)o(ords)f(for)g
+Ft(rl_complete_)195 1240 y(internal)14 b(\(\))p Fu(.)k(The)10
+b(default)h(list)g(is)g(the)f(v)m(alue)h(of)f Ft
+(rl_basic_word_break_charac)o(ters)p Fu(.)p 1909 1244
+21 36 v 1661 1340 a(V)l(ariable)-1749 b Fi(char)20 b(*)f
+Fh(rl)p 286 1340 18 3 v 21 w(completer)p 555 1340 V 21
+w(quote)p 715 1340 V 21 w(c)n(haracters)195 1394 y Fu(List)11
+b(of)g(c)o(haracters)f(whic)o(h)h(can)g(b)q(e)h(used)f(to)g(quote)f(a)h
+(substring)g(of)f(the)h(line.)20 b(Completion)195 1449
+y(o)q(ccurs)c(on)g(the)g(en)o(tire)g(substring,)g(and)g(within)h(the)e
+(substring)h Ft(rl_completer_word_)195 1504 y(break_characters)d
+Fu(are)h(treated)g(as)h(an)o(y)f(other)g(c)o(haracter,)g(unless)i(they)
+f(also)g(app)q(ear)195 1559 y(within)h(this)g(list.)1661
+1658 y(V)l(ariable)-1749 b Fi(char)20 b(*)f Fh(rl)p 286
+1658 V 21 w(\014lename)p 515 1658 V 20 w(quote)p 674
+1658 V 21 w(c)n(haracters)195 1713 y Fu(A)d(list)g(of)g(c)o(haracters)e
+(that)h(cause)h(a)g(\014lename)h(to)e(b)q(e)h(quoted)g(b)o(y)f(the)h
+(completer)g(when)195 1768 y(they)f(app)q(ear)h(in)g(a)f(completed)h
+(\014lename.)21 b(The)15 b(default)h(is)g(the)f(n)o(ull)i(string.)1661
+1868 y(V)l(ariable)-1749 b Fi(char)20 b(*)f Fh(rl)p 286
+1868 V 21 w(sp)r(ecial)p 473 1868 V 22 w(pre\014xes)195
+1923 y Fu(The)14 b(list)h(of)e(c)o(haracters)g(that)g(are)g(w)o(ord)g
+(break)h(c)o(haracters,)f(but)h(should)g(b)q(e)h(left)f(in)g
+Fm(text)195 1977 y Fu(when)19 b(it)g(is)g(passed)f(to)g(the)h
+(completion)g(function.)31 b(Programs)17 b(can)h(use)h(this)g(to)f
+(help)195 2032 y(determine)e(what)e(kind)i(of)e(completing)i(to)e(do.)
+19 b(F)l(or)14 b(instance,)h(Bash)g(sets)f(this)i(v)m(ariable)195
+2087 y(to)f Ft(")p Fu($)p Ft(@")f Fu(so)h(that)f(it)i(can)f(complete)h
+(shell)h(v)m(ariables)f(and)g(hostnames.)1661 2187 y(V)l(ariable)-1749
+b Fi(int)20 b Fh(rl)p 215 2187 V 21 w(completion)p 510
+2187 V 21 w(app)r(end)p 715 2187 V 19 w(c)n(haracter)195
+2241 y Fu(When)15 b(a)e(single)j(completion)f(alternativ)o(e)f(matc)o
+(hes)g(at)g(the)g(end)h(of)e(the)i(command)f(line,)195
+2296 y(this)20 b(c)o(haracter)e(is)i(app)q(ended)h(to)d(the)i(inserted)
+g(completion)g(text.)31 b(The)20 b(default)g(is)f(a)195
+2351 y(space)14 b(c)o(haracter)f(\(`)i('\).)j(Setting)c(this)h(to)e
+(the)h(n)o(ull)h(c)o(haracter)e(\(`)p Ft(\\0)p Fu('\))f(prev)o(en)o(ts)
+i(an)o(ything)195 2406 y(b)q(eing)24 b(app)q(ended)g(automatically)l(.)
+42 b(This)23 b(can)g(b)q(e)g(c)o(hanged)f(in)i(custom)e(completion)195
+2461 y(functions)15 b(to)e(pro)o(vide)i(the)f(\\most)f(sensible)j(w)o
+(ord)d(separator)g(c)o(haracter")g(according)i(to)195
+2515 y(an)g(application-sp)q(eci\014)q(c)j(command)d(line)i(syn)o(tax)d
+(sp)q(eci\014cation.)1661 2615 y(V)l(ariable)-1749 b
+Fi(int)20 b Fh(rl)p 215 2615 V 21 w(ignore)p 391 2615
+V 20 w(completion)p 685 2615 V 21 w(duplicates)195 2670
+y Fu(If)15 b(non-zero,)h(then)f(disallo)o(w)h(duplicates)h(in)f(the)g
+(matc)o(hes.)j(Default)c(is)h(1.)p eop
+%%Page: 37 39
+37 38 bop 75 -58 a Fu(Chapter)15 b(2:)k(Programming)c(with)g(GNU)g
+(Readline)844 b(37)1661 183 y(V)l(ariable)-1749 b Fi(int)20
+b Fh(rl)p 215 183 18 3 v 21 w(\014lename)p 444 183 V
+20 w(completion)p 738 183 V 21 w(desired)195 238 y Fu(Non-zero)15
+b(means)g(that)g(the)g(results)h(of)f(the)g(matc)o(hes)g(are)f(to)h(b)q
+(e)h(treated)f(as)f(\014lenames.)195 293 y(This)e(is)h
+Fm(alw)o(a)o(ys)f Fu(zero)g(on)g(en)o(try)l(,)g(and)g(can)f(only)i(b)q
+(e)f(c)o(hanged)g(within)h(a)e(completion)i(en)o(try)195
+348 y(generator)f(function.)20 b(If)14 b(it)f(is)h(set)f(to)g(a)g
+(non-zero)g(v)m(alue,)i(directory)e(names)h(ha)o(v)o(e)f(a)g(slash)195
+402 y(app)q(ended)k(and)f(Readline)h(attempts)e(to)f(quote)i(completed)
+g(\014lenames)g(if)g(they)g(con)o(tain)195 457 y(an)o(y)f(em)o(b)q
+(edded)i(w)o(ord)d(break)h(c)o(haracters.)1661 541 y(V)l(ariable)-1749
+b Fi(int)20 b Fh(rl)p 215 541 V 21 w(\014lename)p 444
+541 V 20 w(quoting)p 653 541 V 21 w(desired)195 596 y
+Fu(Non-zero)c(means)f(that)g(the)h(results)g(of)g(the)f(matc)o(hes)h
+(are)f(to)g(b)q(e)h(quoted)g(using)h(double)195 650 y(quotes)12
+b(\(or)f(an)g(application-sp)q(eci)q(\014c)k(quoting)d(mec)o(hanism\))g
+(if)g(the)g(completed)h(\014lename)195 705 y(con)o(tains)f(an)o(y)g(c)o
+(haracters)g(in)h Ft(rl_filename_quote_chars)p Fu(.)j(This)c(is)h
+Fm(alw)o(a)o(ys)h Fu(non-zero)195 760 y(on)d(en)o(try)l(,)g(and)h(can)f
+(only)h(b)q(e)g(c)o(hanged)f(within)h(a)f(completion)i(en)o(try)d
+(generator)g(function.)195 815 y(The)16 b(quoting)h(is)g(e\013ected)f
+(via)h(a)e(call)j(to)d(the)i(function)g(p)q(oin)o(ted)g(to)e(b)o(y)i
+Ft(rl_filename_)195 870 y(quoting_function)p Fu(.)1661
+953 y(V)l(ariable)-1749 b Fi(int)20 b Fh(rl)p 215 953
+V 21 w(inhibit)p 399 953 V 23 w(completion)195 1008 y
+Fu(If)15 b(this)f(v)m(ariable)i(is)f(non-zero,)f(completion)i(is)f
+(inhibit)p Ft(<)p Fu(ed.)22 b(The)14 b(completion)i(c)o(haracter)195
+1063 y(will)h(b)q(e)f(inserted)g(as)f(an)o(y)f(other)h(b)q(ound)h(to)f
+Ft(self-insert)p Fu(.)1661 1146 y(V)l(ariable)-1749 b
+Fi(Function)20 b(*)g Fh(rl)p 391 1146 V 21 w(ignore)p
+567 1146 V 20 w(some)p 714 1146 V 19 w(completions)p
+1030 1146 V 21 w(function)195 1201 y Fu(This)15 b(function,)g(if)f
+(de\014ned,)i(is)e(called)i(b)o(y)e(the)h(completer)f(when)h(real)g
+(\014lename)g(comple-)195 1256 y(tion)k(is)g(done,)g(after)f(all)i(the)
+f(matc)o(hing)f(names)h(ha)o(v)o(e)f(b)q(een)i(generated.)30
+b(It)19 b(is)g(passed)195 1311 y(a)h Ft(NULL)f Fu(terminated)h(arra)o
+(y)f(of)g(matc)o(hes.)34 b(The)20 b(\014rst)g(elemen)o(t)h(\()p
+Ft(matches[0])p Fu(\))c(is)k(the)195 1366 y(maximal)e(substring)f
+(common)g(to)g(all)h(matc)o(hes.)29 b(This)19 b(function)g(can)f
+(re-arrange)g(the)195 1420 y(list)h(of)e(matc)o(hes)h(as)f(required,)i
+(but)f(eac)o(h)g(elemen)o(t)h(deleted)g(from)e(the)h(arra)o(y)f(m)o
+(ust)g(b)q(e)195 1475 y(freed.)1661 1559 y(V)l(ariable)-1749
+b Fi(Function)20 b(*)g Fh(rl)p 391 1559 V 21 w(directory)p
+639 1559 V 21 w(completion)p 934 1559 V 21 w(ho)r(ok)195
+1613 y Fu(This)13 b(function,)h(if)g(de\014ned,)g(is)f(allo)o(w)o(ed)h
+(to)e(mo)q(dify)h(the)g(directory)g(p)q(ortion)g(of)g(\014lenames)195
+1668 y(Readline)k(completes.)j(It)15 b(is)g(called)h(with)f(the)g
+(address)g(of)f(a)g(string)h(\(the)f(curren)o(t)h(direc-)195
+1723 y(tory)f(name\))g(as)h(an)f(argumen)o(t.)19 b(It)c(could)h(b)q(e)f
+(used)h(to)e(expand)h(sym)o(b)q(olic)h(links)g(or)e(shell)195
+1778 y(v)m(ariables)j(in)f(pathnames.)1661 1861 y(V)l(ariable)-1749
+b Fi(VFunction)20 b(*)g Fh(rl)p 417 1861 V 21 w(completion)p
+712 1861 V 21 w(displa)n(y)p 906 1861 V 22 w(matc)n(hes)p
+1131 1861 V 20 w(ho)r(ok)195 1916 y Fu(If)g(non-zero,)g(then)f(this)h
+(is)g(the)f(address)h(of)f(a)g(function)h(to)f(call)h(when)g
+(completing)g(a)195 1971 y(w)o(ord)h(w)o(ould)h(normally)h(displa)o(y)g
+(the)f(list)h(of)e(p)q(ossible)j(matc)o(hes.)39 b(This)23
+b(function)f(is)195 2026 y(called)d(in)f(lieu)h(of)e(Readline)j(displa)
+o(ying)f(the)e(list.)27 b(It)18 b(tak)o(es)e(three)i(argumen)o(ts:)23
+b(\()p Ft(char)195 2081 y(**)p Fm(matc)o(hes)p Fu(,)g
+Ft(int)e Fm(n)o(um)p 623 2081 14 2 v 17 w(matc)o(hes)p
+Fu(,)h Ft(int)g Fm(max)p 1015 2081 V 16 w(length)p Fu(\))g(where)g
+Fm(matc)o(hes)i Fu(is)e(the)g(arra)o(y)195 2135 y(of)17
+b(matc)o(hing)h(strings,)f Fm(n)o(um)p 702 2135 V 17
+w(matc)o(hes)h Fu(is)g(the)g(n)o(um)o(b)q(er)g(of)f(strings)g(in)h
+(that)f(arra)o(y)l(,)g(and)195 2190 y Fm(max)p 283 2190
+V 16 w(length)f Fu(is)h(the)e(length)i(of)e(the)h(longest)g(string)f
+(in)i(that)e(arra)o(y)l(.)20 b(Readline)e(pro)o(vides)195
+2245 y(a)d(con)o(v)o(enience)i(function,)g Ft(rl_display_match_list)p
+Fu(,)12 b(that)j(tak)o(es)g(care)g(of)h(doing)g(the)195
+2300 y(displa)o(y)k(to)f(Readline's)i(output)f(stream.)31
+b(That)19 b(function)h(ma)o(y)f(b)q(e)h(called)h(from)e(this)195
+2355 y(ho)q(ok.)75 2458 y Fl(2.6.4)30 b(A)21 b(Short)f(Completion)g
+(Example)137 2552 y Fu(Here)11 b(is)f(a)g(small)h(application)h
+(demonstrating)e(the)g(use)h(of)e(the)i(GNU)f(Readline)i(library)l(.)19
+b(It)11 b(is)f(called)75 2606 y Ft(fileman)p Fu(,)17
+b(and)h(the)g(source)g(co)q(de)g(resides)h(in)f(`)p Ft
+(examples/fileman.c)p Fu('.)25 b(This)18 b(sample)g(application)75
+2661 y(pro)o(vides)c(completion)g(of)e(command)h(names,)g(line)i
+(editing)g(features,)d(and)i(access)f(to)f(the)h(history)h(list.)p
+eop
+%%Page: 38 40
+38 39 bop 75 -58 a Fu(38)1299 b(GNU)15 b(Readline)i(Library)195
+183 y Ft(/*)24 b(fileman.c)e(--)i(A)g(tiny)f(application)f(which)h
+(demonstrates)g(how)g(to)h(use)f(the)267 235 y(GNU)g(Readline)g
+(library.)46 b(This)24 b(application)e(interactively)g(allows)h(users)
+267 287 y(to)g(manipulate)g(files)g(and)g(their)g(modes.)h(*/)195
+391 y(#include)f(<stdio.h>)195 443 y(#include)g(<sys/types.h>)195
+495 y(#include)g(<sys/file.h>)195 546 y(#include)g(<sys/stat.h>)195
+598 y(#include)g(<sys/errno.h>)195 702 y(#include)g
+(<readline/readline.h>)195 754 y(#include)g(<readline/history.h>)195
+858 y(extern)g(char)g(*getwd)g(\(\);)195 910 y(extern)g(char)g
+(*xmalloc)g(\(\);)195 1013 y(/*)h(The)f(names)g(of)h(functions)e(that)i
+(actually)f(do)g(the)h(manipulation.)e(*/)195 1065 y(int)h(com_list)g
+(\(\),)h(com_view)e(\(\),)i(com_rename)e(\(\),)i(com_stat)f(\(\),)g
+(com_pwd)g(\(\);)195 1117 y(int)g(com_delete)g(\(\),)g(com_help)g
+(\(\),)h(com_cd)f(\(\),)g(com_quit)g(\(\);)195 1221 y(/*)h(A)f
+(structure)g(which)g(contains)g(information)f(on)i(the)f(commands)g
+(this)g(program)267 1273 y(can)g(understand.)f(*/)195
+1377 y(typedef)h(struct)g({)243 1429 y(char)g(*name;)g(/*)h(User)f
+(printable)g(name)g(of)h(the)f(function.)g(*/)243 1480
+y(Function)f(*func;)i(/*)f(Function)g(to)g(call)h(to)f(do)h(the)f(job.)
+h(*/)243 1532 y(char)f(*doc;)g(/*)h(Documentation)e(for)h(this)h
+(function.)46 b(*/)195 1584 y(})24 b(COMMAND;)195 1688
+y(COMMAND)f(commands[])f(=)i({)243 1740 y({)f("cd",)h(com_cd,)f
+("Change)f(to)i(directory)f(DIR")g(},)243 1792 y({)g("delete",)g
+(com_delete,)f("Delete)h(FILE")h(},)243 1844 y({)f("help",)g(com_help,)
+g("Display)g(this)g(text")g(},)243 1896 y({)g("?",)h(com_help,)e
+("Synonym)h(for)h(`help'")f(},)243 1947 y({)g("list",)g(com_list,)g
+("List)g(files)g(in)h(DIR")f(},)243 1999 y({)g("ls",)h(com_list,)e
+("Synonym)h(for)g(`list'")g(},)243 2051 y({)g("pwd",)g(com_pwd,)g
+("Print)g(the)h(current)f(working)g(directory")f(},)243
+2103 y({)h("quit",)g(com_quit,)g("Quit)g(using)g(Fileman")g(},)243
+2155 y({)g("rename",)g(com_rename,)f("Rename)h(FILE)h(to)f(NEWNAME")g
+(},)243 2207 y({)g("stat",)g(com_stat,)g("Print)g(out)g(statistics)g
+(on)h(FILE")f(},)243 2259 y({)g("view",)g(com_view,)g("View)g(the)h
+(contents)e(of)i(FILE")f(},)243 2311 y({)g(\(char)h(*\)NULL,)f
+(\(Function)f(*\)NULL,)h(\(char)g(*\)NULL)g(})195 2363
+y(};)195 2466 y(/*)h(Forward)e(declarations.)h(*/)195
+2518 y(char)g(*stripwhite)g(\(\);)195 2570 y(COMMAND)g(*find_command)f
+(\(\);)p eop
+%%Page: 39 41
+39 40 bop 75 -58 a Fu(Chapter)15 b(2:)k(Programming)c(with)g(GNU)g
+(Readline)844 b(39)195 183 y Ft(/*)24 b(The)f(name)g(of)h(this)f
+(program,)g(as)h(taken)f(from)g(argv[0].)g(*/)195 235
+y(char)g(*progname;)195 339 y(/*)h(When)f(non-zero,)g(this)g(global)g
+(means)g(the)h(user)f(is)g(done)h(using)f(this)g(program.)g(*/)p
+1985 349 21 42 v 195 391 a(int)g(done;)195 495 y(char)g(*)195
+546 y(dupstr)g(\(s\))314 598 y(int)h(s;)195 650 y({)243
+702 y(char)f(*r;)243 806 y(r)g(=)h(xmalloc)f(\(strlen)g(\(s\))g(+)h
+(1\);)243 858 y(strcpy)f(\(r,)g(s\);)243 910 y(return)g(\(r\);)195
+962 y(})195 1065 y(main)g(\(argc,)g(argv\))314 1117 y(int)h(argc;)314
+1169 y(char)g(**argv;)195 1221 y({)243 1273 y(char)f(*line,)g(*s;)243
+1377 y(progname)f(=)i(argv[0];)243 1480 y(initialize_readline)d(\(\);)i
+(/*)h(Bind)f(our)h(completer.)e(*/)243 1584 y(/*)h(Loop)h(reading)f
+(and)g(executing)g(lines)g(until)g(the)g(user)h(quits.)f(*/)243
+1636 y(for)g(\()h(;)g(done)f(==)h(0;)f(\))290 1688 y({)338
+1740 y(line)g(=)h(readline)f(\("FileMan:)f("\);)338 1844
+y(if)i(\(!line\))386 1896 y(break;)338 1999 y(/*)g(Remove)f(leading)g
+(and)g(trailing)g(whitespace)f(from)i(the)f(line.)410
+2051 y(Then,)g(if)h(there)f(is)g(anything)g(left,)g(add)h(it)f(to)h
+(the)f(history)g(list)410 2103 y(and)g(execute)g(it.)h(*/)338
+2155 y(s)g(=)g(stripwhite)e(\(line\);)338 2259 y(if)i(\(*s\))386
+2311 y({)434 2363 y(add_history)e(\(s\);)434 2414 y(execute_line)g
+(\(s\);)386 2466 y(})338 2570 y(free)h(\(line\);)290
+2622 y(})p eop
+%%Page: 40 42
+40 41 bop 75 -58 a Fu(40)1299 b(GNU)15 b(Readline)i(Library)243
+183 y Ft(exit)23 b(\(0\);)195 235 y(})195 339 y(/*)h(Execute)e(a)i
+(command)f(line.)g(*/)195 391 y(int)195 443 y(execute_line)f(\(line\))
+314 495 y(char)i(*line;)195 546 y({)243 598 y(register)e(int)i(i;)243
+650 y(COMMAND)f(*command;)243 702 y(char)g(*word;)243
+806 y(/*)g(Isolate)g(the)h(command)f(word.)g(*/)243 858
+y(i)g(=)h(0;)243 910 y(while)f(\(line[i])g(&&)g(whitespace)g
+(\(line[i]\)\))290 962 y(i++;)243 1013 y(word)g(=)h(line)f(+)h(i;)243
+1117 y(while)f(\(line[i])g(&&)g(!whitespace)g(\(line[i]\)\))290
+1169 y(i++;)243 1273 y(if)g(\(line[i]\))290 1325 y(line[i++])g(=)h
+('\\0';)243 1429 y(command)f(=)g(find_command)g(\(word\);)243
+1532 y(if)g(\(!command\))290 1584 y({)338 1636 y(fprintf)g(\(stderr,)g
+("\045s:)g(No)h(such)f(command)g(for)g(FileMan.\\n",)g(word\);)338
+1688 y(return)g(\(-1\);)290 1740 y(})243 1844 y(/*)g(Get)h(argument)f
+(to)g(command,)g(if)g(any.)h(*/)243 1896 y(while)f(\(whitespace)f
+(\(line[i]\)\))290 1947 y(i++;)243 2051 y(word)h(=)h(line)f(+)h(i;)243
+2155 y(/*)f(Call)h(the)f(function.)g(*/)243 2207 y(return)g
+(\(\(*\(command->func\)\))e(\(word\)\);)195 2259 y(})195
+2363 y(/*)j(Look)f(up)g(NAME)h(as)f(the)h(name)f(of)h(a)f(command,)g
+(and)h(return)f(a)g(pointer)g(to)h(that)267 2414 y(command.)46
+b(Return)23 b(a)h(NULL)f(pointer)g(if)h(NAME)f(isn't)g(a)h(command)f
+(name.)g(*/)195 2466 y(COMMAND)g(*)195 2518 y(find_command)f(\(name\))
+314 2570 y(char)i(*name;)195 2622 y({)p eop
+%%Page: 41 43
+41 42 bop 75 -58 a Fu(Chapter)15 b(2:)k(Programming)c(with)g(GNU)g
+(Readline)844 b(41)243 183 y Ft(register)22 b(int)i(i;)243
+287 y(for)f(\(i)h(=)f(0;)h(commands[i].name;)e(i++\))290
+339 y(if)i(\(strcmp)f(\(name,)g(commands[i].name\))f(==)h(0\))338
+391 y(return)g(\(&commands[i]\);)243 495 y(return)g(\(\(COMMAND)f
+(*\)NULL\);)195 546 y(})195 650 y(/*)i(Strip)f(whitespace)f(from)i(the)
+f(start)g(and)h(end)f(of)h(STRING.)46 b(Return)24 b(a)f(pointer)267
+702 y(into)g(STRING.)g(*/)195 754 y(char)g(*)195 806
+y(stripwhite)f(\(string\))314 858 y(char)i(*string;)195
+910 y({)243 962 y(register)e(char)i(*s,)f(*t;)243 1065
+y(for)g(\(s)h(=)f(string;)g(whitespace)g(\(*s\);)g(s++\))290
+1117 y(;)243 1221 y(if)g(\(*s)h(==)f(0\))290 1273 y(return)g(\(s\);)243
+1377 y(t)g(=)h(s)g(+)g(strlen)f(\(s\))g(-)h(1;)243 1429
+y(while)f(\(t)g(>)h(s)g(&&)g(whitespace)e(\(*t\)\))290
+1480 y(t--;)243 1532 y(*++t)h(=)h('\\0';)243 1636 y(return)f(s;)195
+1688 y(})195 1792 y(/*)h(***********************)o(*******)o(********)o
+(*******)o(*******)o(********)o(****)d(*/)195 1844 y(/*)1575
+b(*/)195 1896 y(/*)429 b(Interface)23 b(to)g(Readline)g(Completion)381
+b(*/)195 1947 y(/*)1575 b(*/)195 1999 y(/*)24 b
+(***********************)o(*******)o(********)o(*******)o(*******)o
+(********)o(****)d(*/)195 2103 y(char)i(*command_generator)f(\(\);)195
+2155 y(char)h(**fileman_completion)e(\(\);)195 2259 y(/*)j(Tell)f(the)g
+(GNU)h(Readline)f(library)f(how)i(to)g(complete.)46 b(We)24
+b(want)f(to)h(try)f(to)h(complete)p 2034 2269 21 42 v
+267 2311 a(on)f(command)g(names)g(if)h(this)f(is)h(the)f(first)g(word)h
+(in)f(the)h(line,)f(or)h(on)f(filenames)p 1962 2317 21
+35 v 267 2363 a(if)g(not.)g(*/)195 2414 y(initialize_readline)e(\(\))
+195 2466 y({)243 2518 y(/*)i(Allow)g(conditional)g(parsing)g(of)g(the)h
+(~/.inputrc)e(file.)h(*/)243 2570 y(rl_readline_name)e(=)j("FileMan";)p
+eop
+%%Page: 42 44
+42 43 bop 75 -58 a Fu(42)1299 b(GNU)15 b(Readline)i(Library)243
+183 y Ft(/*)23 b(Tell)h(the)f(completer)g(that)g(we)h(want)f(a)h(crack)
+f(first.)g(*/)243 235 y(rl_attempted_completion_)o(functio)o(n)e(=)j
+(\(CPPFunction)e(*\)fileman_completion;)195 287 y(})195
+391 y(/*)i(Attempt)e(to)i(complete)f(on)g(the)h(contents)f(of)g(TEXT.)
+47 b(START)23 b(and)h(END)f(bound)h(the)267 443 y(region)f(of)g
+(rl_line_buffer)f(that)h(contains)g(the)h(word)f(to)h(complete.)46
+b(TEXT)23 b(is)267 495 y(the)g(word)g(to)h(complete.)46
+b(We)24 b(can)f(use)h(the)f(entire)g(contents)g(of)h(rl_line_buffer)p
+1963 505 21 38 v 267 546 a(in)f(case)g(we)h(want)f(to)h(do)g(some)f
+(simple)g(parsing.)47 b(Return)23 b(the)g(array)g(of)h(matches,)p
+1986 557 V 267 598 a(or)f(NULL)g(if)h(there)f(aren't)g(any.)h(*/)195
+650 y(char)f(**)195 702 y(fileman_completion)e(\(text,)i(start,)g
+(end\))314 754 y(char)h(*text;)314 806 y(int)g(start,)f(end;)195
+858 y({)243 910 y(char)g(**matches;)243 1013 y(matches)g(=)g(\(char)h
+(**\)NULL;)243 1117 y(/*)f(If)h(this)f(word)h(is)f(at)h(the)f(start)g
+(of)h(the)f(line,)h(then)f(it)g(is)h(a)g(command)314
+1169 y(to)g(complete.)46 b(Otherwise)23 b(it)h(is)f(the)h(name)f(of)h
+(a)f(file)h(in)f(the)h(current)314 1221 y(directory.)f(*/)243
+1273 y(if)g(\(start)g(==)h(0\))290 1325 y(matches)f(=)h
+(completion_matches)d(\(text,)j(command_generator\);)243
+1429 y(return)f(\(matches\);)195 1480 y(})195 1584 y(/*)h(Generator)e
+(function)h(for)g(command)g(completion.)47 b(STATE)23
+b(lets)g(us)h(know)f(whether)p 1938 1594 21 42 v 267
+1636 a(to)g(start)g(from)h(scratch;)e(without)h(any)h(state)f(\(i.e.)g
+(STATE)g(==)h(0\),)f(then)h(we)267 1688 y(start)f(at)g(the)h(top)f(of)h
+(the)f(list.)g(*/)195 1740 y(char)g(*)195 1792 y(command_generator)f
+(\(text,)h(state\))314 1844 y(char)h(*text;)314 1896
+y(int)g(state;)195 1947 y({)243 1999 y(static)f(int)g(list_index,)g
+(len;)243 2051 y(char)g(*name;)243 2155 y(/*)g(If)h(this)f(is)h(a)g
+(new)f(word)g(to)h(complete,)f(initialize)f(now.)47 b(This)24
+b(includes)314 2207 y(saving)f(the)h(length)f(of)g(TEXT)h(for)f
+(efficiency,)g(and)g(initializing)f(the)i(index)p 1938
+2217 21 38 v 314 2259 a(variable)f(to)h(0.)f(*/)243 2311
+y(if)g(\(!state\))290 2363 y({)338 2414 y(list_index)g(=)g(0;)338
+2466 y(len)h(=)f(strlen)g(\(text\);)290 2518 y(})243
+2622 y(/*)g(Return)g(the)h(next)f(name)g(which)h(partially)e(matches)h
+(from)g(the)h(command)f(list.)g(*/)p 1985 2632 21 42
+v eop
+%%Page: 43 45
+43 44 bop 75 -58 a Fu(Chapter)15 b(2:)k(Programming)c(with)g(GNU)g
+(Readline)844 b(43)243 183 y Ft(while)23 b(\(name)g(=)h
+(commands[list_index].name)o(\))290 235 y({)338 287 y(list_index++;)338
+391 y(if)g(\(strncmp)f(\(name,)g(text,)g(len\))g(==)h(0\))386
+443 y(return)f(\(dupstr\(name\)\);)290 495 y(})243 598
+y(/*)g(If)h(no)f(names)h(matched,)e(then)i(return)f(NULL.)g(*/)243
+650 y(return)g(\(\(char)g(*\)NULL\);)195 702 y(})195
+806 y(/*)h(***********************)o(*******)o(********)o(*******)o
+(*******)o(********)o(****)d(*/)195 858 y(/*)1575 b(*/)195
+910 y(/*)549 b(FileMan)22 b(Commands)644 b(*/)195 962
+y(/*)1575 b(*/)195 1013 y(/*)24 b(***********************)o(*******)o
+(********)o(*******)o(*******)o(********)o(****)d(*/)195
+1117 y(/*)j(String)f(to)g(pass)h(to)f(system)g(\(\).)47
+b(This)24 b(is)f(for)h(the)f(LIST,)g(VIEW)h(and)f(RENAME)267
+1169 y(commands.)f(*/)195 1221 y(static)h(char)g(syscom[1024];)195
+1325 y(/*)h(List)f(the)g(file\(s\))g(named)g(in)h(arg.)f(*/)195
+1377 y(com_list)g(\(arg\))314 1429 y(char)h(*arg;)195
+1480 y({)243 1532 y(if)f(\(!arg\))290 1584 y(arg)h(=)g("";)243
+1688 y(sprintf)f(\(syscom,)f("ls)i(-FClg)f(\045s",)g(arg\);)243
+1740 y(return)g(\(system)g(\(syscom\)\);)195 1792 y(})195
+1896 y(com_view)g(\(arg\))314 1947 y(char)h(*arg;)195
+1999 y({)243 2051 y(if)f(\(!valid_argument)f(\("view",)h(arg\)\))290
+2103 y(return)g(1;)243 2207 y(sprintf)g(\(syscom,)f("more)i(\045s",)f
+(arg\);)243 2259 y(return)g(\(system)g(\(syscom\)\);)195
+2311 y(})195 2414 y(com_rename)f(\(arg\))314 2466 y(char)i(*arg;)195
+2518 y({)243 2570 y(too_dangerous)e(\("rename"\);)243
+2622 y(return)h(\(1\);)p eop
+%%Page: 44 46
+44 45 bop 75 -58 a Fu(44)1299 b(GNU)15 b(Readline)i(Library)195
+183 y Ft(})195 287 y(com_stat)23 b(\(arg\))314 339 y(char)h(*arg;)195
+391 y({)243 443 y(struct)f(stat)g(finfo;)243 546 y(if)g
+(\(!valid_argument)f(\("stat",)h(arg\)\))290 598 y(return)g(\(1\);)243
+702 y(if)g(\(stat)g(\(arg,)h(&finfo\))f(==)g(-1\))290
+754 y({)338 806 y(perror)g(\(arg\);)338 858 y(return)g(\(1\);)290
+910 y(})243 1013 y(printf)g(\("Statistics)f(for)h(`\045s':\\n",)g
+(arg\);)243 1117 y(printf)g(\("\045s)g(has)h(\045d)f(link\045s,)g(and)g
+(is)h(\045d)g(byte\045s)f(in)g(length.\\n",)g(arg,)434
+1169 y(finfo.st_nlink,)434 1221 y(\(finfo.st_nlink)e(==)j(1\))g(?)f("")
+h(:)g("s",)434 1273 y(finfo.st_size,)434 1325 y(\(finfo.st_size)e(==)h
+(1\))h(?)f("")h(:)g("s"\);)243 1377 y(printf)f(\("Inode)g(Last)g
+(Change)g(at:)g(\045s",)h(ctime)f(\(&finfo.st_ctime\)\);)243
+1429 y(printf)g(\(")143 b(Last)23 b(access)g(at:)g(\045s",)h(ctime)f
+(\(&finfo.st_atime\)\);)243 1480 y(printf)g(\(")95 b(Last)23
+b(modified)g(at:)g(\045s",)h(ctime)f(\(&finfo.st_mtime\)\);)243
+1532 y(return)g(\(0\);)195 1584 y(})195 1688 y(com_delete)f(\(arg\))314
+1740 y(char)i(*arg;)195 1792 y({)243 1844 y(too_dangerous)e
+(\("delete"\);)243 1896 y(return)h(\(1\);)195 1947 y(})195
+2051 y(/*)h(Print)f(out)g(help)h(for)f(ARG,)g(or)h(for)f(all)h(of)f
+(the)h(commands)f(if)g(ARG)h(is)267 2103 y(not)f(present.)g(*/)195
+2155 y(com_help)g(\(arg\))314 2207 y(char)h(*arg;)195
+2259 y({)243 2311 y(register)e(int)i(i;)243 2363 y(int)f(printed)g(=)h
+(0;)243 2466 y(for)f(\(i)h(=)f(0;)h(commands[i].name;)e(i++\))290
+2518 y({)338 2570 y(if)i(\(!*arg)f(||)g(\(strcmp)g(\(arg,)g
+(commands[i].name\))f(==)i(0\)\))386 2622 y({)p eop
+%%Page: 45 47
+45 46 bop 75 -58 a Fu(Chapter)15 b(2:)k(Programming)c(with)g(GNU)g
+(Readline)844 b(45)434 183 y Ft(printf)23 b(\("\045s\\t\\t\045s.\\n",)e
+(commands[i].name,)h(commands[i].doc\);)434 235 y(printed++;)386
+287 y(})290 339 y(})243 443 y(if)h(\(!printed\))290 495
+y({)338 546 y(printf)g(\("No)h(commands)e(match)h(`\045s'.)48
+b(Possibilties)22 b(are:\\n",)h(arg\);)338 650 y(for)h(\(i)f(=)h(0;)g
+(commands[i].name;)d(i++\))386 702 y({)434 754 y(/*)i(Print)g(in)h(six)
+f(columns.)g(*/)434 806 y(if)g(\(printed)g(==)h(6\))481
+858 y({)529 910 y(printed)f(=)h(0;)529 962 y(printf)f(\("\\n"\);)481
+1013 y(})434 1117 y(printf)g(\("\045s\\t",)f(commands[i].name\);)434
+1169 y(printed++;)386 1221 y(})338 1325 y(if)i(\(printed\))386
+1377 y(printf)f(\("\\n"\);)290 1429 y(})243 1480 y(return)g(\(0\);)195
+1532 y(})195 1636 y(/*)h(Change)f(to)g(the)h(directory)e(ARG.)i(*/)195
+1688 y(com_cd)f(\(arg\))314 1740 y(char)h(*arg;)195 1792
+y({)243 1844 y(if)f(\(chdir)g(\(arg\))h(==)f(-1\))290
+1896 y({)338 1947 y(perror)g(\(arg\);)338 1999 y(return)g(1;)290
+2051 y(})243 2155 y(com_pwd)g(\(""\);)243 2207 y(return)g(\(0\);)195
+2259 y(})195 2363 y(/*)h(Print)f(out)g(the)h(current)f(working)f
+(directory.)h(*/)195 2414 y(com_pwd)g(\(ignore\))314
+2466 y(char)h(*ignore;)195 2518 y({)243 2570 y(char)f(dir[1024],)g(*s;)
+p eop
+%%Page: 46 48
+46 47 bop 75 -58 a Fu(46)1299 b(GNU)15 b(Readline)i(Library)243
+183 y Ft(s)23 b(=)h(getwd)f(\(dir\);)243 235 y(if)g(\(s)h(==)f(0\))290
+287 y({)338 339 y(printf)g(\("Error)g(getting)g(pwd:)g(\045s\\n",)g
+(dir\);)338 391 y(return)g(1;)290 443 y(})243 546 y(printf)g
+(\("Current)f(directory)h(is)h(\045s\\n",)f(dir\);)243
+598 y(return)g(0;)195 650 y(})195 754 y(/*)h(The)f(user)g(wishes)g(to)h
+(quit)f(using)g(this)h(program.)46 b(Just)24 b(set)f(DONE)h(non-zero.)e
+(*/)p 1961 764 21 42 v 195 806 a(com_quit)h(\(arg\))314
+858 y(char)h(*arg;)195 910 y({)243 962 y(done)f(=)h(1;)243
+1013 y(return)f(\(0\);)195 1065 y(})195 1169 y(/*)h(Function)e(which)i
+(tells)f(you)g(that)g(you)h(can't)f(do)h(this.)f(*/)195
+1221 y(too_dangerous)f(\(caller\))314 1273 y(char)i(*caller;)195
+1325 y({)243 1377 y(fprintf)f(\(stderr,)457 1429 y("\045s:)h(Too)f
+(dangerous)g(for)g(me)h(to)g(distribute.)46 b(Write)23
+b(it)h(yourself.\\n",)p 1987 1439 V 457 1480 a(caller\);)195
+1532 y(})195 1636 y(/*)g(Return)f(non-zero)f(if)i(ARG)f(is)h(a)g(valid)
+f(argument)g(for)g(CALLER,)g(else)g(print)267 1688 y(an)g(error)g
+(message)g(and)h(return)f(zero.)g(*/)195 1740 y(int)195
+1792 y(valid_argument)f(\(caller,)h(arg\))314 1844 y(char)h(*caller,)e
+(*arg;)195 1896 y({)243 1947 y(if)h(\(!arg)g(||)h(!*arg\))290
+1999 y({)338 2051 y(fprintf)f(\(stderr,)g("\045s:)g(Argument)g
+(required.\\n",)f(caller\);)338 2103 y(return)h(\(0\);)290
+2155 y(})243 2259 y(return)g(\(1\);)195 2311 y(})p eop
+%%Page: 47 49
+47 48 bop 75 -58 a Fu(Concept)15 b(Index)1466 b(47)75
+183 y Fq(Concept)27 b(Index)75 359 y Fs(C)75 417 y Ff(command)14
+b(editing)9 b Fe(.)f(.)e(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)
+g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)21
+b Ff(1)75 517 y Fs(E)75 575 y Ff(editing)15 b(command)f(lines)8
+b Fe(.)f(.)f(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
+g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)20 b Ff(1)75 675
+y Fs(I)75 733 y Ff(initiali)q(zati)q(on)c(\014le,)e(readline)8
+b Fe(.)g(.)e(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)
+f(.)g(.)g(.)g(.)g(.)g(.)20 b Ff(4)75 782 y(in)o(teraction,)15
+b(readline)e Fe(.)7 b(.)f(.)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(.)24
+b Ff(1)75 882 y Fs(K)75 940 y Ff(kill)15 b(ring)e Fe(.)6
+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(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)
+g(.)g(.)g(.)g(.)24 b Ff(3)1012 359 y(killin)q(g)16 b(text)11
+b Fe(.)6 b(.)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(.)h(.)f(.)g(.)g(.)g(.)g(.)
+g(.)g(.)g(.)24 b Ff(2)1012 495 y Fs(N)1012 553 y Ff(notation,)15
+b(readline)5 b Fe(.)k(.)d(.)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(.)
+19 b Ff(1)1012 688 y Fs(R)1012 747 y Ff(readline,)c(function)6
+b Fe(.)i(.)e(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)
+g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)19
+b Ff(19)1012 882 y Fs(Y)1012 940 y Ff(y)o(anking)c(text)6
+b Fe(.)g(.)g(.)g(.)g(.)g(.)h(.)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(.)19 b Ff(2)p eop
+%%Page: 48 50
+48 49 bop 75 -58 a Fu(48)1299 b(GNU)15 b(Readline)i(Library)p
+eop
+%%Page: 49 51
+49 50 bop 75 -58 a Fu(F)l(unction)16 b(and)f(V)l(ariable)i(Index)1187
+b(49)75 183 y Fq(F)-7 b(unction)26 b(and)h(V)-7 b(ariable)26
+b(Index)75 345 y Fs(A)75 403 y Fd(abort)11 b(\(C-g\))6
+b Fe(.)t(.)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(.)h(.)f(.)g(.)g
+(.)18 b Ff(17)75 453 y Fd(accept-lin)o(e)10 b(\(Newline)o(,)g(Return\))
+s Fe(.)s(.)c(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)16
+b Ff(12)75 503 y Fd(alphabetic)r Fe(.)t(.)6 b(.)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(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)16 b Ff(29)75
+652 y Fs(B)75 711 y Fd(backward-c)o(ha)o(r)10 b(\(C-b\))t
+Fe(.)t(.)c(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)17 b Ff(12)75 760
+y Fd(backward-d)o(el)o(ete)o(-c)o(har)9 b(\(Rubout\))f
+Fe(.)s(.)e(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)21
+b Ff(14)75 810 y Fd(backward-k)o(il)o(l-l)o(in)o(e)10
+b(\(C-x)h(Rubout\))e Fe(.)t(.)d(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
+22 b Ff(14)75 860 y Fd(backward-k)o(il)o(l-w)o(or)o(d)10
+b(\(M-DEL\))t Fe(.)s(.)c(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)
+f(.)g(.)g(.)g(.)16 b Ff(15)75 910 y Fd(backward-w)o(or)o(d)10
+b(\(M-b\))t Fe(.)t(.)c(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)17 b Ff(12)75
+960 y Fd(beginning-)o(of)o(-hi)o(st)o(ory)9 b(\(M-<\))t
+Fe(.)t(.)d(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g
+(.)16 b Ff(13)75 1009 y Fd(beginning-)o(of)o(-li)o(ne)9
+b(\(C-a\))e Fe(.)e(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f
+(.)g(.)g(.)g(.)g(.)g(.)g(.)20 b Ff(12)75 1059 y(b)q(ell-st)o(yle)13
+b Fe(.)6 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)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(.)23 b Ff(4)75 1209 y Fs(C)75 1267
+y Fd(call-last-)o(kb)o(d-m)o(ac)o(ro)9 b(\(C-x)j(e\))6
+b Fe(.)f(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)
+18 b Ff(16)75 1317 y Fd(capitalize)o(-w)o(ord)9 b(\(M-c\))f
+Fe(.)e(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)23 b Ff(14)75 1366 y Fd(character-)o(se)o(arc)o
+(h)10 b(\(C-]\))f Fe(.)s(.)d(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
+g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)21 b Ff(17)75 1416
+y Fd(character-)o(se)o(arc)o(h-)o(bac)o(kwa)o(rd)9 b(\(M-C-]\))s
+Fe(.)t(.)d(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)16 b Ff(17)75
+1466 y Fd(clear-scre)o(en)9 b(\(C-l\))c Fe(.)g(.)h(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)
+g(.)g(.)18 b Ff(12)75 1516 y(commen)o(t-b)q(egin)9 b
+Fe(.)f(.)e(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)21
+b Ff(4)75 1566 y Fd(complete)10 b(\(TAB\))e Fe(.)e(.)g(.)g(.)g(.)g(.)g
+(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)
+g(.)g(.)g(.)g(.)g(.)g(.)g(.)23 b Ff(16)75 1616 y(completion-query-i)q
+(tems)9 b Fe(.)f(.)f(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
+g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)21 b Ff(5)75
+1665 y Fd(completion)p 276 1665 12 2 v 10 w(matches)5
+b Fe(.)s(.)h(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
+g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)17 b Ff(34)75
+1715 y(con)o(v)o(ert-meta)11 b Fe(.)6 b(.)g(.)g(.)g(.)g(.)g(.)h(.)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(.)23 b Ff(5)75 1765 y Fd(copy-backw)o(ar)
+o(d-w)o(or)o(d)10 b(\(\))f Fe(.)d(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)23
+b Ff(15)75 1815 y Fd(copy-forwa)o(rd)o(-wo)o(rd)9 b(\(\))i
+Fe(.)6 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)
+g(.)g(.)g(.)g(.)g(.)g(.)g(.)24 b Ff(15)75 1865 y Fd(copy-regio)o(n-)o
+(as-)o(ki)o(ll)9 b(\(\))g Fe(.)c(.)h(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)
+g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)21 b Ff(15)75
+2014 y Fs(D)75 2072 y Fd(delete-cha)o(r)10 b(\(C-d\))c
+Fe(.)t(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)19 b Ff(13)75
+2122 y Fd(delete-cha)o(r-)o(or-)o(li)o(st)9 b(\(\))g
+Fe(.)c(.)h(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)h(.)f(.)g(.)g(.)21 b Ff(16)75 2172 y Fd(delete-hor)o(iz)o(ont)o(al)o
+(-sp)o(ace)9 b(\(\))t Fe(.)c(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
+g(.)h(.)f(.)g(.)g(.)g(.)16 b Ff(15)75 2222 y Fd(digit-argu)o(me)o(nt)9
+b(\(M-0,)i(M-1,)h(...)f(M--\))t Fe(.)t(.)6 b(.)g(.)g(.)h(.)f(.)g(.)g(.)
+g(.)16 b Ff(15)75 2271 y Fd(digit)p 177 2271 V 12 w(p)10
+b Fe(.)c(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)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(.)23 b Ff(29)75 2321 y Fd(digit)p 177
+2321 V 12 w(value)5 b Fe(.)t(.)h(.)g(.)g(.)h(.)f(.)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(.)18 b Ff(29)75 2371 y Fd(ding)10
+b Fe(.)c(.)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(.)h(.)f(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)24 b Ff(29)75 2421 y(disable-comple)q
+(tion)7 b Fe(.)i(.)d(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
+g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)19
+b Ff(5)75 2471 y Fd(do-upperca)o(se)o(-ve)o(rs)o(ion)9
+b(\(M-a,)i(M-b,)g(M-)p Fe(x)p Fd(,)h Fc(:)6 b(:)g(:)p
+Fd(\))j Fe(.)d(.)23 b Ff(17)75 2521 y Fd(downcase-w)o(or)o(d)10
+b(\(M-l\))t Fe(.)t(.)c(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)17 b Ff(14)75
+2570 y Fd(dump-funct)o(io)o(ns)9 b(\(\))d Fe(.)g(.)g(.)g(.)g(.)g(.)g(.)
+h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g
+(.)g(.)g(.)g(.)19 b Ff(17)75 2620 y Fd(dump-macro)o(s)10
+b(\(\))f Fe(.)d(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)23
+b Ff(18)75 2670 y Fd(dump-varia)o(bl)o(es)9 b(\(\))d
+Fe(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)19 b Ff(18)1012
+345 y Fs(E)1012 403 y Ff(editing-mo)q(de)13 b Fe(.)6
+b(.)h(.)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(.)h(.)f(.)23
+b Ff(5)1012 453 y(enable-k)o(eypad)13 b Fe(.)6 b(.)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(.)h(.)f(.)g(.)22 b Ff(5)1012
+503 y Fd(end-kbd-mac)o(ro)9 b(\(C-x)i(\)\))5 b Fe(.)h(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)
+g(.)18 b Ff(16)1012 553 y Fd(end-of-hist)o(or)o(y)10
+b(\(M->\))f Fe(.)d(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)24 b Ff(13)1012
+603 y Fd(end-of-line)9 b(\(C-e\))d Fe(.)f(.)h(.)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(.)20 b Ff(12)1012 652 y Fd(exchange-po)o(in)o(t-a)o(nd)o(-ma)o
+(rk)9 b(\(C-x)j(C-x\))7 b Fe(.)t(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)20
+b Ff(17)1012 702 y(expand-tilde)8 b Fe(.)h(.)d(.)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(.)h(.)f(.)g(.)g(.)g(.)20 b Ff(5)1012
+811 y Fs(F)1012 869 y Fd(filename)p 1174 869 V 11 w(completion)p
+1385 869 V 11 w(function)s Fe(.)s(.)6 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)h(.)f(.)g(.)16 b Ff(35)1012 919 y Fd(forward-bac)o(kw)o(ard)
+o(-d)o(ele)o(te)o(-ch)o(ar)9 b(\(\))d Fe(.)f(.)h(.)h(.)f(.)g(.)g(.)g(.)
+g(.)g(.)g(.)g(.)19 b Ff(14)1012 969 y Fd(forward-cha)o(r)10
+b(\(C-f\))5 b Fe(.)t(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)
+g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)18
+b Ff(12)1012 1019 y Fd(forward-sea)o(rc)o(h-h)o(is)o(tor)o(y)10
+b(\(C-s\))d Fe(.)f(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)23 b Ff(13)1012 1069 y Fd(forward-wor)o(d)10 b(\(M-f\))5
+b Fe(.)t(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)
+g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)18 b Ff(12)1012
+1118 y Fd(free)p 1094 1118 V 13 w(undo)p 1187 1118 V
+13 w(list)t Fe(.)t(.)6 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)
+g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g
+(.)17 b Ff(27)1012 1228 y Fs(H)1012 1286 y Fd(history-sea)o(rc)o(h-b)o
+(ac)o(kwa)o(rd)9 b(\(\))t Fe(.)c(.)h(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)
+g(.)g(.)g(.)g(.)g(.)g(.)g(.)17 b Ff(13)1012 1336 y Fd(history-sea)o(rc)
+o(h-f)o(or)o(war)o(d)10 b(\(\))5 b Fe(.)g(.)h(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)18 b Ff(13)1012
+1385 y(horizon)o(tal-scrol)q(l-mo)r(de)c Fe(.)6 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(.)24 b Ff(5)1012 1495 y Fs(I)1012 1553 y Ff(input-meta)12
+b Fe(.)6 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(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)
+g(.)g(.)g(.)23 b Ff(5)1012 1602 y Fd(insert-comm)o(en)o(t)10
+b(\(M-#\))f Fe(.)d(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)24 b Ff(17)1012
+1652 y Fd(insert-comp)o(le)o(tio)o(ns)9 b(\(M-*\))d Fe(.)t(.)h(.)f(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)19
+b Ff(16)1012 1702 y(isearc)o(h-terminators)13 b Fe(.)6
+b(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)23 b Ff(6)1012
+1811 y Fs(K)1012 1869 y Ff(k)o(eymap)t Fe(.)7 b(.)g(.)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(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)17
+b Ff(6)1012 1919 y Fd(kill-line)10 b(\(C-k\))f Fe(.)t(.)d(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
+g(.)g(.)g(.)h(.)f(.)g(.)g(.)22 b Ff(14)1012 1969 y Fd(kill-region)9
+b(\(\))g Fe(.)e(.)f(.)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(.)24
+b Ff(15)1012 2019 y Fd(kill-whole-)o(li)o(ne)9 b(\(\))c
+Fe(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)18 b Ff(15)1012
+2069 y Fd(kill-word)10 b(\(M-d\))f Fe(.)t(.)d(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
+h(.)f(.)g(.)g(.)22 b Ff(15)1012 2178 y Fs(L)1012 2236
+y Fd(lowercase)p 1194 2236 V 11 w(p)5 b Fe(.)h(.)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(.)h(.)f(.)g(.)g(.)g(.)18 b Ff(29)1012
+2345 y Fs(M)1012 2403 y Ff(mark-mo)q(di\014ed-li)q(nes)6
+b Fe(.)j(.)d(.)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(.)h(.)18 b
+Ff(6)1012 2453 y Fd(menu-comple)o(te)9 b(\(\))f Fe(.)d(.)h(.)g(.)g(.)g
+(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)
+g(.)g(.)g(.)g(.)g(.)g(.)21 b Ff(16)1012 2503 y(meta-\015ag)8
+b Fe(.)f(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)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(.)21 b Ff(5)1012 2612 y Fs(N)1012 2670
+y Fd(next-histor)o(y)10 b(\(C-n\))5 b Fe(.)t(.)h(.)g(.)g(.)g(.)g(.)g(.)
+g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)h(.)18 b Ff(12)p eop
+%%Page: 50 52
+50 51 bop 75 -58 a Fu(50)1299 b(GNU)15 b(Readline)i(Library)75
+183 y Fd(non-increm)o(en)o(tal)o(-f)o(orw)o(ard)o(-s)o(ear)o(ch)o(-hi)o
+(st)o(ory)9 b(\(M-n\))155 233 y Fe(.)d(.)g(.)g(.)g(.)h(.)f(.)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(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)16
+b Ff(13)75 283 y Fd(non-increm)o(en)o(tal)o(-r)o(eve)o(rse)o(-s)o(ear)o
+(ch)o(-hi)o(st)o(ory)9 b(\(M-p\))155 333 y Fe(.)d(.)g(.)g(.)g(.)h(.)f
+(.)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(.)h(.)f(.)g(.)g(.)g(.)g
+(.)g(.)16 b Ff(13)75 382 y Fd(numeric)7 b Fe(.)t(.)f(.)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(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)20
+b Ff(29)75 485 y Fs(O)75 543 y Ff(output-meta)7 b Fe(.)g(.)f(.)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(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)19
+b Ff(6)75 646 y Fs(P)75 704 y Fd(possible-c)o(om)o(ple)o(ti)o(ons)9
+b(\(M-?\))t Fe(.)t(.)d(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f
+(.)g(.)g(.)g(.)16 b Ff(16)75 754 y Fd(prefix-met)o(a)10
+b(\(ESC\))c Fe(.)t(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)19
+b Ff(17)75 804 y Fd(previous-h)o(is)o(tor)o(y)10 b(\(C-p\))f
+Fe(.)s(.)d(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)h(.)f(.)g(.)g(.)21 b Ff(12)75 907 y Fs(Q)75 965 y
+Fd(quoted-ins)o(er)o(t)10 b(\(C-q,)h(C-v\))d Fe(.)e(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)22
+b Ff(14)75 1068 y Fs(R)75 1126 y Fd(re-read-in)o(it)o(-fi)o(le)9
+b(\(C-x)i(C-r\))6 b Fe(.)f(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)h(.)f(.)g(.)18 b Ff(17)75 1176 y Fd(readline)6
+b Fe(.)s(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)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(.)19 b Ff(19)75 1225 y Fd(redraw-cur)o(re)o(nt-)o(li)o(ne)
+9 b(\(\))g Fe(.)c(.)h(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)21 b Ff(12)75 1275 y Fd(reverse-se)o(ar)
+o(ch-)o(hi)o(sto)o(ry)9 b(\(C-r\))f Fe(.)e(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)h(.)f(.)g(.)g(.)g(.)22 b Ff(13)75 1325 y Fd(revert-lin)o(e)10
+b(\(M-r\))c Fe(.)t(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)19
+b Ff(17)75 1375 y Fd(rl)p 117 1375 12 2 v 13 w(add)p
+190 1375 V 13 w(defun)6 b Fe(.)f(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
+h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f
+(.)g(.)g(.)g(.)g(.)g(.)19 b Ff(23)75 1425 y Fd(rl)p 117
+1425 V 13 w(add)p 190 1425 V 13 w(undo)8 b Fe(.)d(.)h(.)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(.)h(.)f(.)g(.)20 b Ff(27)75
+1474 y Fd(rl)p 117 1474 V 13 w(already)p 270 1474 V 12
+w(prompted)e Fe(.)6 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)21 b Ff(22)75
+1524 y Fd(rl)p 117 1524 V 13 w(attempted)p 310 1524 V
+11 w(completion)p 520 1524 V 10 w(function)g Fe(.)6 b(.)g(.)h(.)f(.)g
+(.)g(.)g(.)g(.)g(.)24 b Ff(35)75 1574 y Fd(rl)p 117 1574
+V 13 w(basic)p 230 1574 V 13 w(quote)p 343 1574 V 12
+w(character)o(s)13 b Fe(.)6 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)16 b Ff(36)75 1624 y Fd(rl)p
+117 1624 V 13 w(basic)p 230 1624 V 13 w(word)p 323 1624
+V 12 w(break)p 435 1624 V 12 w(characters)h Fe(.)6 b(.)h(.)f(.)g(.)g(.)
+g(.)g(.)g(.)g(.)g(.)g(.)g(.)21 b Ff(36)75 1674 y Fd(rl)p
+117 1674 V 13 w(begin)p 230 1674 V 13 w(undo)p 323 1674
+V 12 w(group)9 b Fe(.)t(.)d(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)21
+b Ff(26)75 1724 y Fd(rl)p 117 1724 V 13 w(bind)p 210
+1724 V 13 w(key)8 b Fe(.)d(.)h(.)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(.)h(.)f(.)g(.)20 b Ff(25)75 1773 y Fd(rl)p 117
+1773 V 13 w(bind)p 210 1773 V 13 w(key)p 283 1773 V 13
+w(in)p 336 1773 V 13 w(map)t Fe(.)5 b(.)h(.)h(.)f(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
+g(.)17 b Ff(25)75 1823 y Fd(rl)p 117 1823 V 13 w(binding)p
+270 1823 V 12 w(keymap)k Fe(.)6 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)23
+b Ff(23)75 1873 y Fd(rl_callbac)o(k_)o(han)o(dl)o(er_)o(ins)o(ta)o(ll)7
+b Fe(.)s(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)20
+b Ff(30)75 1923 y Fd(rl_callbac)o(k_)o(han)o(dl)o(er_)o(rem)o(ov)o(e)9
+b Fe(.)s(.)d(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)
+21 b Ff(30)75 1973 y Fd(rl_callbac)o(k_)o(rea)o(d_)o(cha)o(r)6
+b Fe(.)s(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
+h(.)f(.)g(.)g(.)g(.)g(.)19 b Ff(30)75 2022 y Fd(rl)p
+117 2022 V 13 w(catch)p 230 2022 V 13 w(signals)13 b
+Fe(.)6 b(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
+g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)16 b
+Ff(32)75 2072 y Fd(rl)p 117 2072 V 13 w(catch)p 230 2072
+V 13 w(sigwinch)k Fe(.)6 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)23
+b Ff(32)75 2122 y Fd(rl)p 117 2122 V 13 w(char)p 210
+2122 V 13 w(is)p 263 2122 V 13 w(quoted)p 396 2122 V
+12 w(p)18 b Fe(.)6 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(.)18 b
+Ff(35)75 2172 y Fd(rl)p 117 2172 V 13 w(cleanup)p 270
+2172 V 12 w(after)p 382 2172 V 12 w(signal)t Fe(.)s(.)6
+b(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h
+(.)f(.)g(.)16 b Ff(32)75 2222 y Fd(rl)p 117 2222 V 13
+w(clear)p 230 2222 V 13 w(message)7 b Fe(.)f(.)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(.)h(.)22 b Ff(28)75 2271 y Fd(rl)p 117 2271
+V 13 w(clear)p 230 2271 V 13 w(signals)7 b Fe(.)f(.)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(.)h(.)22 b Ff(33)75 2321 y Fd(rl)p 117
+2321 V 13 w(complete)5 b Fe(.)s(.)h(.)g(.)g(.)h(.)f(.)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(.)18 b Ff(34)75 2371 y Fd(rl)p
+117 2371 V 13 w(complete)p 290 2371 V 11 w(internal)5
+b Fe(.)s(.)h(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
+g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)17 b Ff(34)75 2421 y
+Fd(rl)p 117 2421 V 13 w(completer)p 310 2421 V 11 w(quote)p
+421 2421 V 12 w(characters)f Fe(.)6 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)h(.)f(.)g(.)19 b Ff(36)75 2471 y Fd(rl)p 117 2471
+V 13 w(completer)p 310 2471 V 11 w(word)p 401 2471 V
+13 w(break)p 514 2471 V 12 w(character)o(s)13 b Fe(.)6
+b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)16 b Ff(36)75 2521 y
+Fd(rl)p 117 2521 V 13 w(completion)p 329 2521 V 11 w(append)p
+461 2521 V 11 w(character)f Fe(.)6 b(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)
+g(.)g(.)g(.)18 b Ff(36)75 2570 y Fd(rl)p 117 2570 V 13
+w(completion)p 329 2570 V 11 w(display)p 481 2570 V 11
+w(matches)p 632 2570 V 11 w(hook)d Fe(.)6 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)16 b Ff(37)75 2620 y Fd(rl)p 117 2620 V 13 w(completion)p
+329 2620 V 11 w(entry)p 441 2620 V 12 w(function)21 b
+Fe(.)6 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)24 b Ff(34,)13
+b(35)75 2670 y Fd(rl)p 117 2670 V 13 w(completion)p 329
+2670 V 11 w(query)p 441 2670 V 12 w(items)h Fe(.)6 b(.)g(.)g(.)g(.)g(.)
+g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)16
+b Ff(36)1012 183 y Fd(rl)p 1054 183 V 14 w(copy)p 1148
+183 V 12 w(keymap)t Fe(.)t(.)6 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)
+g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g
+(.)g(.)g(.)17 b Ff(24)1012 233 y Fd(rl)p 1054 233 V 14
+w(copy)p 1148 233 V 12 w(text)6 b Fe(.)f(.)h(.)g(.)g(.)g(.)h(.)f(.)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(.)20 b Ff(28)1012 283 y
+Fd(rl)p 1054 283 V 14 w(delete)p 1188 283 V 12 w(text)t
+Fe(.)t(.)6 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)
+g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)17
+b Ff(28)1012 333 y Fd(rl)p 1054 333 V 14 w(directory)p
+1247 333 V 10 w(completion)p 1458 333 V 11 w(hook)i Fe(.)6
+b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)21
+b Ff(37)1012 382 y Fd(rl)p 1054 382 V 14 w(discard)p
+1208 382 V 11 w(keymap)9 b Fe(.)s(.)e(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
+22 b Ff(24)1012 432 y Fd(rl)p 1054 432 V 14 w(display)p
+1208 432 V 11 w(match)p 1319 432 V 12 w(list)6 b Fe(.)f(.)h(.)g(.)g(.)g
+(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
+h(.)19 b Ff(29)1012 482 y Fd(rl)p 1054 482 V 14 w(do)p
+1108 482 V 13 w(undo)9 b Fe(.)c(.)h(.)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(.)h(.)f(.)g(.)g(.)g(.)22 b Ff(27)1012 532 y Fd(rl)p
+1054 532 V 14 w(done)15 b Fe(.)6 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(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)17 b Ff(22)1012
+582 y Fd(rl)p 1054 582 V 14 w(end)f Fe(.)6 b(.)g(.)g(.)h(.)f(.)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(.)h(.)f(.)g(.)g(.)g(.)g(.)18
+b Ff(21)1012 632 y Fd(rl)p 1054 632 V 14 w(end)p 1128
+632 V 13 w(undo)p 1221 632 V 12 w(group)10 b Fe(.)c(.)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(.)25 b Ff(26)1012 681 y Fd(rl)p 1054 681
+V 14 w(erase)p 1168 681 V 12 w(empty)p 1280 681 V 12
+w(line)d Fe(.)6 b(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)24 b Ff(22)1012
+731 y Fd(rl)p 1054 731 V 14 w(event)p 1168 731 V 12 w(hook)18
+b Fe(.)7 b(.)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(.)21
+b Ff(23)1012 781 y Fd(rl)p 1054 781 V 14 w(executing)p
+1247 781 V 10 w(keymap)e Fe(.)6 b(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)21
+b Ff(23)1012 831 y Fd(rl)p 1054 831 V 14 w(extend)p 1188
+831 V 12 w(line)p 1280 831 V 12 w(buffer)6 b Fe(.)t(.)g(.)g(.)g(.)g(.)g
+(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)
+19 b Ff(28)1012 881 y Fd(rl)p 1054 881 V 14 w(filename)p
+1228 881 V 11 w(completio)o(n)p 1438 881 V 11 w(desired)d
+Fe(.)6 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)19
+b Ff(37)1012 930 y Fd(rl)p 1054 930 V 14 w(filename)p
+1228 930 V 11 w(dequoting)p 1418 930 V 10 w(function)d
+Fe(.)6 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)19
+b Ff(35)1012 980 y Fd(rl)p 1054 980 V 14 w(filename)p
+1228 980 V 11 w(quote)p 1339 980 V 12 w(character)o(s)f
+Fe(.)6 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)21
+b Ff(36)1012 1030 y Fd(rl)p 1054 1030 V 14 w(filename)p
+1228 1030 V 11 w(quoting)p 1379 1030 V 11 w(desired)f
+Fe(.)6 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)23
+b Ff(37)1012 1080 y Fd(rl)p 1054 1080 V 14 w(filename)p
+1228 1080 V 11 w(quoting)p 1379 1080 V 11 w(function)18
+b Fe(.)6 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)21
+b Ff(35)1012 1130 y Fd(rl)p 1054 1130 V 14 w(forced)p
+1188 1130 V 12 w(update)p 1320 1130 V 11 w(display)9
+b Fe(.)d(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)
+g(.)g(.)g(.)24 b Ff(27)1012 1180 y Fd(rl)p 1054 1180
+V 14 w(free)p 1148 1180 V 12 w(line)p 1240 1180 V 13
+w(state)8 b Fe(.)e(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)23
+b Ff(32)1012 1229 y Fd(rl)p 1054 1229 V 14 w(function)p
+1228 1229 V 11 w(dumper)7 b Fe(.)t(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)21
+b Ff(26)1012 1279 y Fd(rl)p 1054 1279 V 14 w(function)p
+1228 1279 V 11 w(of)p 1279 1279 V 13 w(keyseq)6 b Fe(.)t(.)g(.)g(.)g(.)
+g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)h(.)19 b Ff(25)1012 1329 y Fd(rl)p 1054 1329 V 14
+w(funmap)p 1188 1329 V 12 w(names)9 b Fe(.)d(.)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(.)h(.)f(.)24 b Ff(26)1012 1379 y Fd(rl)p 1054
+1379 V 14 w(generic)p 1208 1379 V 11 w(bind)10 b Fe(.)c(.)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(.)h(.)f(.)24 b Ff(25)1012 1429 y Fd(rl)p
+1054 1429 V 14 w(get)p 1128 1429 V 13 w(keymap)5 b Fe(.)t(.)h(.)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(.)h(.)f(.)18 b Ff(24)1012
+1478 y Fd(rl)p 1054 1478 V 14 w(get)p 1128 1478 V 13
+w(keymap)p 1261 1478 V 11 w(by)p 1312 1478 V 14 w(name)9
+b Fe(.)t(.)d(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
+g(.)g(.)h(.)f(.)g(.)g(.)g(.)22 b Ff(24)1012 1528 y Fd(rl)p
+1054 1528 V 14 w(get)p 1128 1528 V 13 w(keymap)p 1261
+1528 V 11 w(name)9 b Fe(.)d(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)23
+b Ff(24)1012 1578 y Fd(rl)p 1054 1578 V 14 w(getc)8 b
+Fe(.)e(.)g(.)g(.)g(.)h(.)f(.)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(.)
+h(.)f(.)g(.)g(.)23 b Ff(28)1012 1628 y Fd(rl)p 1054 1628
+V 14 w(getc)p 1148 1628 V 12 w(function)13 b Fe(.)7 b(.)f(.)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(.)17 b Ff(23)1012 1678 y Fd(rl)p
+1054 1678 V 14 w(ignore)p 1188 1678 V 12 w(completi)o(on)p
+1399 1678 V 11 w(duplicate)o(s)d Fe(.)6 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)h(.)f(.)17 b Ff(36)1012 1727 y Fd(rl)p 1054 1727
+V 14 w(ignore)p 1188 1727 V 12 w(some)p 1280 1727 V 12
+w(completion)o(s)p 1511 1727 V 11 w(function)j Fe(.)6
+b(.)g(.)g(.)g(.)g(.)g(.)24 b Ff(37)1012 1777 y Fd(rl)p
+1054 1777 V 14 w(inhibit)p 1208 1777 V 11 w(completion)15
+b Fe(.)6 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)19 b Ff(37)1012 1827 y Fd(rl)p
+1054 1827 V 14 w(initializ)o(e)8 b Fe(.)e(.)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(.)h(.)f(.)g(.)g(.)g(.)24 b Ff(28)1012 1877 y Fd(rl)p
+1054 1877 V 14 w(insert)p 1188 1877 V 12 w(completi)o(ons)r
+Fe(.)t(.)6 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)
+g(.)g(.)g(.)g(.)g(.)g(.)g(.)17 b Ff(34)1012 1927 y Fd(rl)p
+1054 1927 V 14 w(insert)p 1188 1927 V 12 w(text)t Fe(.)t(.)6
+b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)17
+b Ff(28)1012 1977 y Fd(rl)p 1054 1977 V 14 w(instream)g
+Fe(.)6 b(.)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(.)h(.)f(.)g(.)20
+b Ff(22)1012 2026 y Fd(rl)p 1054 2026 V 14 w(invoking)p
+1228 2026 V 11 w(keyseqs)6 b Fe(.)s(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)19
+b Ff(26)1012 2076 y Fd(rl)p 1054 2076 V 14 w(invoking)p
+1228 2076 V 11 w(keyseqs)p 1379 2076 V 11 w(in)p 1430
+2076 V 14 w(map)9 b Fe(.)e(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)h(.)f(.)24 b Ff(26)1012 2126 y Fd(rl)p
+1054 2126 V 14 w(kill)p 1148 2126 V 12 w(text)6 b Fe(.)f(.)h(.)g(.)g(.)
+g(.)h(.)f(.)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(.)20 b Ff(28)1012
+2176 y Fd(rl)p 1054 2176 V 14 w(library)p 1208 2176 V
+11 w(version)g Fe(.)6 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h
+(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)23
+b Ff(22)1012 2226 y Fd(rl)p 1054 2226 V 14 w(line)p 1148
+2226 V 12 w(buffer)17 b Fe(.)6 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(.)h(.)f
+(.)g(.)g(.)19 b Ff(21)1012 2275 y Fd(rl)p 1054 2275 V
+14 w(list)p 1148 2275 V 12 w(funmap)p 1280 2275 V 12
+w(names)7 b Fe(.)e(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)21 b Ff(26)1012
+2325 y Fd(rl)p 1054 2325 V 14 w(make)p 1148 2325 V 12
+w(bare)p 1240 2325 V 13 w(keymap)9 b Fe(.)s(.)d(.)h(.)f(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)
+22 b Ff(24)1012 2375 y Fd(rl)p 1054 2375 V 14 w(make)p
+1148 2375 V 12 w(keymap)t Fe(.)t(.)6 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h
+(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)
+g(.)g(.)g(.)g(.)17 b Ff(24)1012 2425 y Fd(rl)p 1054 2425
+V 14 w(mark)e Fe(.)6 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(.)h(.)f(.)
+g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)17 b Ff(21)1012 2475
+y Fd(rl)p 1054 2475 V 14 w(message)6 b Fe(.)s(.)g(.)g(.)g(.)h(.)f(.)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(.)h(.)19 b Ff(27)1012
+2524 y Fd(rl)p 1054 2524 V 14 w(modifying)s Fe(.)s(.)6
+b(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)17
+b Ff(27)1012 2574 y Fd(rl)p 1054 2574 V 14 w(named)p
+1168 2574 V 12 w(function)8 b Fe(.)s(.)f(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)
+g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)22 b Ff(25)1012 2624 y Fd(rl)p 1054 2624 V 14 w(on)p
+1108 2624 V 13 w(new)p 1181 2624 V 13 w(line)7 b Fe(.)t(.)f(.)g(.)g(.)g
+(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)
+f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)20 b Ff(27)p eop
+%%Page: 51 53
+51 52 bop 75 -58 a Fu(F)l(unction)16 b(and)f(V)l(ariable)i(Index)1187
+b(51)75 183 y Fd(rl)p 117 183 12 2 v 13 w(on)p 170 183
+V 14 w(new)p 244 183 V 13 w(line)p 337 183 V 12 w(with)p
+429 183 V 13 w(prompt)5 b Fe(.)t(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
+h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)18 b Ff(27)75 233 y Fd(rl)p
+117 233 V 13 w(outstream)d Fe(.)7 b(.)f(.)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(.)h(.)18 b Ff(22)75 283 y Fd(rl)p 117 283
+V 13 w(parse)p 230 283 V 13 w(and)p 303 283 V 13 w(bind)9
+b Fe(.)d(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
+g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)24 b Ff(25)75
+333 y Fd(rl)p 117 333 V 13 w(pending)p 270 333 V 12 w(input)14
+b Fe(.)6 b(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)16
+b Ff(22)75 382 y Fd(rl)p 117 382 V 13 w(point)22 b Fe(.)6
+b(.)g(.)g(.)g(.)g(.)h(.)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(.)24 b Ff(21)75 432 y Fd(rl)p 117 432 V 13 w(possible)p
+290 432 V 11 w(completions)6 b Fe(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)22 b Ff(34)75
+482 y Fd(rl)p 117 482 V 13 w(pre)p 190 482 V 13 w(input)p
+303 482 V 13 w(hook)16 b Fe(.)6 b(.)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(.)
+18 b Ff(22)75 532 y Fd(rl)p 117 532 V 13 w(prompt)i Fe(.)7
+b(.)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(.)h(.)f(.)g(.)g(.)
+22 b Ff(22)75 582 y Fd(rl)p 117 582 V 13 w(read)p 210
+582 V 13 w(init)p 303 582 V 13 w(file)9 b Fe(.)d(.)g(.)g(.)h(.)f(.)g(.)
+g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)24 b Ff(25)75 632 y Fd(rl)p 117 632 V
+13 w(read)p 210 632 V 13 w(key)8 b Fe(.)d(.)h(.)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(.)h(.)f(.)g(.)20 b Ff(28)75 681
+y Fd(rl)p 117 681 V 13 w(readline)p 290 681 V 11 w(name)15
+b Fe(.)6 b(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)16
+b Ff(22)75 731 y Fd(rl)p 117 731 V 13 w(redisplay)t Fe(.)s(.)6
+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(.)h(.)f(.)g(.)16
+b Ff(27)75 781 y Fd(rl)p 117 781 V 13 w(redisplay)p 310
+781 V 11 w(function)f Fe(.)6 b(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)18 b Ff(23)75
+831 y Fd(rl)p 117 831 V 13 w(reset)p 230 831 V 13 w(after)p
+343 831 V 12 w(signal)6 b Fe(.)t(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
+g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)19
+b Ff(32)75 881 y Fd(rl)p 117 881 V 13 w(reset)p 230 881
+V 13 w(line)p 323 881 V 12 w(state)9 b Fe(.)t(.)d(.)g(.)g(.)g(.)g(.)g
+(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)
+f(.)21 b Ff(27)75 930 y Fd(rl)p 117 930 V 13 w(reset)p
+230 930 V 13 w(terminal)8 b Fe(.)s(.)e(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)
+21 b Ff(29)75 980 y Fd(rl)p 117 980 V 13 w(resize)p 250
+980 V 12 w(terminal)7 b Fe(.)s(.)f(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)20
+b Ff(33)75 1030 y Fd(rl)p 117 1030 V 13 w(restore)p 270
+1030 V 12 w(prompt)9 b Fe(.)s(.)d(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)21
+b Ff(28)75 1080 y Fd(rl)p 117 1080 V 13 w(save)p 210
+1080 V 13 w(prompt)t Fe(.)t(.)6 b(.)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(.)17 b Ff(28)75 1130 y Fd(rl)p 117 1130 V 13
+w(set)p 190 1130 V 13 w(keymap)5 b Fe(.)t(.)h(.)g(.)g(.)g(.)h(.)f(.)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(.)18 b Ff(24)75 1180 y Fd(rl)p
+117 1180 V 13 w(set)p 190 1180 V 13 w(signals)t Fe(.)t(.)6
+b(.)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(.)17
+b Ff(33)75 1229 y Fd(rl)p 117 1229 V 13 w(special)p 270
+1229 V 12 w(prefixes)h Fe(.)6 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)21
+b Ff(36)75 1279 y Fd(rl)p 117 1279 V 13 w(startup)p 270
+1279 V 12 w(hook)16 b Fe(.)6 b(.)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(.)h(.)f(.)
+g(.)17 b Ff(22)75 1329 y Fd(rl)p 117 1329 V 13 w(stuff)p
+230 1329 V 13 w(char)5 b Fe(.)t(.)h(.)g(.)g(.)g(.)h(.)f(.)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(.)18 b Ff(28)75 1379 y Fd(rl)p 117 1379
+V 13 w(terminal)p 290 1379 V 11 w(name)d Fe(.)6 b(.)g(.)g(.)g(.)g(.)g
+(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)
+g(.)g(.)g(.)g(.)g(.)16 b Ff(22)75 1429 y Fd(rl)p 117
+1429 V 13 w(unbind)p 250 1429 V 12 w(command)p 402 1429
+V 12 w(in)p 454 1429 V 13 w(map)5 b Fe(.)g(.)h(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)18
+b Ff(25)75 1478 y Fd(rl)p 117 1478 V 13 w(unbind)p 250
+1478 V 12 w(function)p 422 1478 V 11 w(in)p 473 1478
+V 14 w(map)t Fe(.)t(.)6 b(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)17 b Ff(25)75 1528 y Fd(rl)p
+117 1528 V 13 w(unbind)p 250 1528 V 12 w(key)5 b Fe(.)g(.)h(.)g(.)g(.)g
+(.)h(.)f(.)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(.)18 b Ff(25)75
+1578 y Fd(rl)p 117 1578 V 13 w(unbind)p 250 1578 V 12
+w(key)p 322 1578 V 13 w(in)p 375 1578 V 13 w(map)10 b
+Fe(.)c(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)23 b Ff(25)1012 183 y
+Fs(S)1012 241 y Fd(self-insert)9 b(\(a,)j(b,)g(A,)g(1,)g(!,)g(...\))t
+Fe(.)5 b(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)18
+b Ff(14)1012 291 y Fd(set-mark)10 b(\(C-@\))e Fe(.)f(.)f(.)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(.)24 b Ff(17)1012 341 y(sho)o(w-all-if-am)
+o(bigu)q(ous)8 b Fe(.)g(.)e(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)20
+b Ff(6)1012 391 y Fd(start-kbd-m)o(ac)o(ro)9 b(\(C-x)j(\(\))e
+Fe(.)c(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g
+(.)g(.)g(.)g(.)24 b Ff(16)1012 490 y Fs(T)1012 549 y
+Fd(tab-insert)9 b(\(M-TAB\))c Fe(.)t(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
+g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)18
+b Ff(14)1012 598 y Fd(tilde-expan)o(d)10 b(\(M-~\))5
+b Fe(.)t(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)
+g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)18 b Ff(17)1012
+648 y Fd(to)p 1054 648 V 14 w(lower)9 b Fe(.)t(.)d(.)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(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)22
+b Ff(29)1012 698 y Fd(to)p 1054 698 V 14 w(upper)9 b
+Fe(.)t(.)d(.)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(.)h(.)f(.)g(.)g(.)g(.)
+g(.)g(.)g(.)22 b Ff(29)1012 748 y Fd(transpose-c)o(ha)o(rs)9
+b(\(C-t\))f Fe(.)e(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)23 b Ff(14)1012 798
+y Fd(transpose-w)o(or)o(ds)9 b(\(M-t\))f Fe(.)e(.)h(.)f(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)23
+b Ff(14)1012 897 y Fs(U)1012 955 y Fd(undo)12 b(\(C-)p
+1166 955 V 13 w(,)g(C-x)g(C-u\))5 b Fe(.)t(.)h(.)g(.)g(.)g(.)g(.)h(.)f
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)
+g(.)18 b Ff(17)1012 1005 y Fd(universal-a)o(rg)o(ume)o(nt)9
+b(\(\))g Fe(.)d(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)23 b Ff(15)1012 1055 y
+Fd(unix-line-d)o(is)o(car)o(d)10 b(\(C-u\))d Fe(.)t(.)f(.)g(.)g(.)g(.)g
+(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)21
+b Ff(14)1012 1105 y Fd(unix-word-r)o(ub)o(out)9 b(\(C-w\))g
+Fe(.)t(.)d(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)22 b Ff(15)1012 1155 y Fd(upcase-word)9
+b(\(M-u\))d Fe(.)f(.)h(.)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(.)20
+b Ff(14)1012 1204 y Fd(uppercase)p 1194 1204 V 11 w(p)5
+b Fe(.)h(.)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(.)h(.)f(.)g(.)g(.)g
+(.)18 b Ff(29)1012 1254 y Fd(username)p 1174 1254 V 11
+w(completion)p 1385 1254 V 11 w(function)s Fe(.)s(.)6
+b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)16
+b Ff(35)1012 1354 y Fs(V)1012 1412 y Ff(visible-stats)t
+Fe(.)9 b(.)d(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)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(.)17 b Ff(6)1012 1512 y Fs(Y)1012 1570 y Fd(yank)12
+b(\(C-y\))7 b Fe(.)t(.)f(.)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(.)h(.)f
+(.)g(.)g(.)g(.)g(.)20 b Ff(15)1012 1620 y Fd(yank-last-a)o(rg)9
+b(\(M-.,)i(M-)p 1433 1620 V 13 w(\))t Fe(.)6 b(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)17
+b Ff(13)1012 1669 y Fd(yank-nth-ar)o(g)10 b(\(M-C-y\))e
+Fe(.)e(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)h(.)24 b Ff(13)1012 1719 y Fd(yank-pop)10
+b(\(M-y\))e Fe(.)f(.)f(.)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(.)24
+b Ff(15)p eop
+%%Page: 52 54
+52 53 bop 75 -58 a Fu(52)1299 b(GNU)15 b(Readline)i(Library)p
+eop
+%%Page: -1 55
+-1 54 bop 1862 -58 a Fu(i)75 183 y Fq(T)-7 b(able)27
+b(of)f(Con)n(ten)n(ts)75 354 y Fs(1)67 b(Command)22 b(Line)i(Editing)d
+Fb(.)10 b(.)h(.)f(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)h
+(.)f(.)g(.)g(.)42 b Fs(1)224 423 y Fu(1.1)j(In)o(tro)q(duction)16
+b(to)f(Line)h(Editing)e Fa(.)7 b(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)
+f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f
+(.)27 b Fu(1)224 478 y(1.2)45 b(Readline)17 b(In)o(teraction)8
+b Fa(.)g(.)g(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)
+h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f
+(.)h(.)f(.)23 b Fu(1)374 532 y(1.2.1)44 b(Readline)17
+b(Bare)e(Essen)o(tials)f Fa(.)7 b(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h
+(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)27
+b Fu(1)374 587 y(1.2.2)44 b(Readline)17 b(Mo)o(v)o(emen)o(t)d(Commands)
+7 b Fa(.)g(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f
+(.)h(.)21 b Fu(2)374 642 y(1.2.3)44 b(Readline)17 b(Killing)h(Commands)
+11 b Fa(.)c(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h
+(.)f(.)h(.)f(.)h(.)25 b Fu(2)374 697 y(1.2.4)44 b(Readline)17
+b(Argumen)o(ts)12 b Fa(.)c(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f
+(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)27
+b Fu(3)374 752 y(1.2.5)44 b(Searc)o(hing)16 b(for)e(Commands)h(in)h
+(the)f(History)e Fa(.)8 b(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)27
+b Fu(3)224 806 y(1.3)45 b(Readline)17 b(Init)g(File)e
+Fa(.)7 b(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)
+h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f
+(.)h(.)f(.)h(.)f(.)29 b Fu(4)374 861 y(1.3.1)44 b(Readline)17
+b(Init)f(File)h(Syn)o(tax)7 b Fa(.)g(.)g(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)
+f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)21
+b Fu(4)374 916 y(1.3.2)44 b(Conditional)16 b(Init)g(Constructs)5
+b Fa(.)i(.)g(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)
+h(.)f(.)h(.)g(.)f(.)19 b Fu(8)374 971 y(1.3.3)44 b(Sample)16
+b(Init)g(File)11 b Fa(.)e(.)e(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h
+(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)
+h(.)f(.)26 b Fu(9)224 1026 y(1.4)45 b(Bindable)17 b(Readline)h
+(Commands)6 b Fa(.)h(.)g(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)
+h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)21
+b Fu(12)374 1080 y(1.4.1)44 b(Commands)14 b(F)l(or)h(Mo)o(ving)e
+Fa(.)7 b(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)
+h(.)f(.)h(.)f(.)h(.)f(.)h(.)28 b Fu(12)374 1135 y(1.4.2)44
+b(Commands)14 b(F)l(or)h(Manipulating)i(The)e(History)9
+b Fa(.)e(.)h(.)f(.)h(.)f(.)h(.)24 b Fu(12)374 1190 y(1.4.3)44
+b(Commands)14 b(F)l(or)h(Changing)h(T)l(ext)e Fa(.)8
+b(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)30
+b Fu(13)374 1245 y(1.4.4)44 b(Killing)18 b(And)e(Y)l(anking)9
+b Fa(.)e(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)
+h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)24 b Fu(14)374
+1299 y(1.4.5)44 b(Sp)q(ecifying)17 b(Numeric)f(Argumen)o(ts)c
+Fa(.)c(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)27
+b Fu(15)374 1354 y(1.4.6)44 b(Letting)15 b(Readline)j(T)o(yp)q(e)d(F)l
+(or)g(Y)l(ou)10 b Fa(.)d(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)
+h(.)f(.)h(.)f(.)25 b Fu(16)374 1409 y(1.4.7)44 b(Keyb)q(oard)15
+b(Macros)6 b Fa(.)h(.)g(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f
+(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)21
+b Fu(16)374 1464 y(1.4.8)44 b(Some)15 b(Miscellaneous)i(Commands)7
+b Fa(.)g(.)g(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)
+22 b Fu(17)224 1519 y(1.5)45 b(Readline)17 b(vi)f(Mo)q(de)e
+Fa(.)7 b(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)
+f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f
+(.)h(.)f(.)h(.)28 b Fu(18)75 1640 y Fs(2)67 b(Programming)23
+b(with)g(GNU)f(Readline)12 b Fb(.)f(.)g(.)f(.)g(.)g(.)g(.)h(.)f(.)35
+b Fs(19)224 1708 y Fu(2.1)45 b(Basic)16 b(Beha)o(vior)8
+b Fa(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)
+f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f
+(.)h(.)f(.)h(.)f(.)h(.)f(.)23 b Fu(19)224 1763 y(2.2)45
+b(Custom)14 b(F)l(unctions)7 b Fa(.)i(.)f(.)f(.)h(.)f(.)h(.)f(.)h(.)f
+(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)
+f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)22 b Fu(20)374
+1818 y(2.2.1)44 b(The)15 b(F)l(unction)h(T)o(yp)q(e)11
+b Fa(.)d(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)
+h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)26 b Fu(20)374
+1873 y(2.2.2)44 b(W)l(riting)16 b(a)e(New)i(F)l(unction)6
+b Fa(.)i(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)
+f(.)h(.)f(.)h(.)f(.)h(.)f(.)21 b Fu(21)224 1928 y(2.3)45
+b(Readline)17 b(V)l(ariables)f Fa(.)8 b(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h
+(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)
+h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)29 b Fu(21)224
+1982 y(2.4)45 b(Readline)17 b(Con)o(v)o(enience)g(F)l(unctions)7
+b Fa(.)i(.)e(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)
+h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)23 b Fu(23)374 2037 y(2.4.1)44
+b(Naming)15 b(a)g(F)l(unction)e Fa(.)7 b(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)
+h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f
+(.)h(.)27 b Fu(23)374 2092 y(2.4.2)44 b(Selecting)17
+b(a)e(Keymap)6 b Fa(.)h(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h
+(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)21
+b Fu(24)374 2147 y(2.4.3)44 b(Binding)17 b(Keys)5 b Fa(.)j(.)f(.)h(.)f
+(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)
+f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)20 b
+Fu(24)374 2202 y(2.4.4)44 b(Asso)q(ciating)16 b(F)l(unction)g(Names)f
+(and)g(Bindings)8 b Fa(.)h(.)f(.)f(.)h(.)f(.)h(.)23 b
+Fu(25)374 2256 y(2.4.5)44 b(Allo)o(wing)16 b(Undoing)f
+Fa(.)8 b(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)
+f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)29 b
+Fu(26)374 2311 y(2.4.6)44 b(Redispla)o(y)10 b Fa(.)f(.)f(.)g(.)f(.)h(.)
+f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h
+(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)26
+b Fu(27)374 2366 y(2.4.7)44 b(Mo)q(difying)16 b(T)l(ext)7
+b Fa(.)g(.)g(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)
+f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)22
+b Fu(28)374 2421 y(2.4.8)44 b(Utilit)o(y)16 b(F)l(unctions)e
+Fa(.)7 b(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)
+h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)28
+b Fu(28)374 2475 y(2.4.9)44 b(Alternate)15 b(In)o(terface)5
+b Fa(.)i(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)
+h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)20 b
+Fu(29)374 2530 y(2.4.10)43 b(An)16 b(Example)f Fa(.)8
+b(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f
+(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)30
+b Fu(30)224 2585 y(2.5)45 b(Readline)17 b(Signal)g(Handling)12
+b Fa(.)c(.)g(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)
+h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)27
+b Fu(31)224 2640 y(2.6)45 b(Custom)14 b(Completers)f
+Fa(.)8 b(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)
+h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h
+(.)f(.)28 b Fu(33)p eop
+%%Page: -2 56
+-2 55 bop 75 -58 a Fu(ii)1321 b(GNU)15 b(Readline)i(Library)374
+42 y(2.6.1)44 b(Ho)o(w)14 b(Completing)i(W)l(orks)10
+b Fa(.)d(.)g(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)
+f(.)h(.)f(.)h(.)f(.)h(.)f(.)25 b Fu(33)374 96 y(2.6.2)44
+b(Completion)16 b(F)l(unctions)6 b Fa(.)i(.)g(.)f(.)h(.)f(.)h(.)f(.)h
+(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)
+21 b Fu(34)374 151 y(2.6.3)44 b(Completion)16 b(V)l(ariables)c
+Fa(.)c(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f
+(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)27 b Fu(35)374 206
+y(2.6.4)44 b(A)15 b(Short)g(Completion)h(Example)5 b
+Fa(.)j(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h
+(.)f(.)20 b Fu(37)75 327 y Fs(Concept)i(Index)10 b Fb(.)i(.)e(.)g(.)g
+(.)g(.)h(.)f(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)h(.)f(.)
+g(.)g(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)33 b Fs(47)75 462
+y(F)-6 b(unction)25 b(and)d(V)-6 b(ariable)24 b(Index)9
+b Fb(.)i(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)
+g(.)32 b Fs(49)p eop
+%%Trailer
+end
+userdict /end-hook known{end-hook}if
+%%EOF
diff --git a/gnu/lib/libreadline/doc/rlman.texinfo b/gnu/lib/libreadline/doc/rlman.texinfo
new file mode 100644
index 00000000000..759f0eb3d40
--- /dev/null
+++ b/gnu/lib/libreadline/doc/rlman.texinfo
@@ -0,0 +1,108 @@
+\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 manvers.texinfo
+
+@ifinfo
+@dircategory Libraries
+@direntry
+* Readline: (readline). The GNU readline library API
+@end direntry
+
+This document describes the GNU Readline Library, a utility which aids
+in the consistency of user interface across discrete programs that need
+to provide a command line interface.
+
+Copyright (C) 1988-1999 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 Free Software Foundation.
+@end ifinfo
+
+@titlepage
+@title GNU Readline Library
+@subtitle Edition @value{EDITION}, for @code{Readline Library} Version @value{VERSION}.
+@subtitle @value{UPDATE-MONTH}
+@author Brian Fox, Free Software Foundation
+@author Chet Ramey, Case Western Reserve University
+
+@page
+This document describes the GNU Readline Library, a utility which aids
+in the consistency of user interface across discrete programs that need
+to provide a command line interface.
+
+Published by the Free Software Foundation @*
+59 Temple Place, Suite 330, @*
+Boston, MA 02111 USA
+
+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 that the entire
+resulting derived work is distributed under the terms of a permission
+notice identical to this one.
+
+Permission is granted to copy and distribute translations of this manual
+into another language, under the above conditions for modified versions,
+except that this permission notice may be stated in a translation approved
+by the Free Software Foundation.
+
+@vskip 0pt plus 1filll
+Copyright @copyright{} 1988-1999 Free Software Foundation, Inc.
+@end titlepage
+
+@ifinfo
+@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 that need
+to provide a command line interface.
+
+@menu
+* Command Line Editing:: GNU Readline User's Manual.
+* Programming with GNU Readline:: GNU Readline Programmer's Manual.
+* Concept Index:: Index of concepts described in this manual.
+* Function and Variable Index:: Index of externally visible functions
+ and variables.
+@end menu
+@end ifinfo
+
+@include rluser.texinfo
+@include rltech.texinfo
+
+@node Concept Index
+@unnumbered Concept Index
+@printindex cp
+
+@node Function and Variable Index
+@unnumbered Function and Variable Index
+@printindex fn
+
+@contents
+@bye
diff --git a/gnu/lib/libreadline/doc/rltech.texinfo b/gnu/lib/libreadline/doc/rltech.texinfo
new file mode 100644
index 00000000000..51c340a99a2
--- /dev/null
+++ b/gnu/lib/libreadline/doc/rltech.texinfo
@@ -0,0 +1,1750 @@
+@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 consitency of user interface across discrete programs that need
+to provide a command line interface.
+
+Copyright (C) 1988, 1994, 1996, 1998, 1999 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 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.
+@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 and then reads and returns
+a single line of text from the user. The line @code{readline}
+returns is allocated with @code{malloc ()}; you should @code{free ()}
+the line when you are done with it. The declaration for @code{readline}
+in ANSI C is
+
+@example
+@code{char *readline (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}, int (*@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}.
+
+@menu
+* The Function Type:: C declarations to make code readable.
+* Function Writing:: Variables and calling conventions.
+@end menu
+
+@node The Function Type
+@subsection The Function Type
+
+For readabilty, we declare a new type of object, called
+@dfn{Function}. A @code{Function} is a C function which
+returns an @code{int}. The type declaration for @code{Function} is:
+
+@noindent
+@code{typedef int Function ();}
+
+The reason for declaring this new type is to make it easier to write
+code describing pointers to C functions. Let us say we had a variable
+called @var{func} which was a pointer to a function. Instead of the
+classic C declaration
+
+@code{int (*)()func;}
+
+@noindent
+we may write
+
+@code{Function *func;}
+
+@noindent
+Similarly, there are
+
+@example
+typedef void VFunction ();
+typedef char *CPFunction (); @r{and}
+typedef char **CPPFunction ();
+@end example
+
+@noindent
+for functions returning no value, @code{pointer to char}, and
+@code{pointer to pointer to char}, respectively.
+
+@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{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.
+
+@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 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_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_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.
+@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 {char *} rl_library_version
+The version number of this revision of the library.
+@end deftypevar
+
+@deftypevar {char *} rl_terminal_name
+The terminal type, used for initialization.
+@end deftypevar
+
+@deftypevar {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.
+@end deftypevar
+
+@deftypevar {FILE *} rl_outstream
+The stdio stream to which Readline performs output.
+@end deftypevar
+
+@deftypevar {Function *} 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 {Function *} 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 {Function *} rl_event_hook
+If non-zero, this is the address of a function to call periodically
+when readline is waiting for terminal input.
+@end deftypevar
+
+@deftypevar {Function *} rl_getc_function
+If non-zero, @code{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 @code{readline} character input function
+(@pxref{Utility Functions}).
+@end deftypevar
+
+@deftypevar {VFunction *} rl_redisplay_function
+If non-zero, @code{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 @code{readline}
+redisplay function (@pxref{Redisplay}).
+@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
+
+@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}.
+* Utility Functions:: Generally useful functions and hooks.
+* Alternate Interface:: Using Readline in a `callback' fashion.
+@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 (char *name, Function *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 ()
+Returns a new, empty keymap. The space for the keymap is allocated with
+@code{malloc ()}; you should @code{free ()} it when you are 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 ()
+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 ()
+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 (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
+
+You associate keys 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, Function *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, Function *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_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 (Function *function, Keymap map)
+Unbind all keys that execute @var{function} in @var{map}.
+@end deftypefun
+
+@deftypefun int rl_unbind_command_in_map (char *command, Keymap map)
+Unbind all keys that are bound to @var{command} in @var{map}.
+@end deftypefun
+
+@deftypefun int rl_generic_bind (int type, 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 (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.
+
+@deftypefun {Function *} rl_named_function (char *name)
+Return the function with name @var{name}.
+@end deftypefun
+
+@deftypefun {Function *} rl_function_of_keyseq (char *keyseq, Keymap map, int *type)
+Return the function invoked by @var{keyseq} in keymap @var{map}.
+If @var{map} is NULL, the current keymap is used. If @var{type} is
+not NULL, the type of the object is returned in it (one of @code{ISFUNC},
+@code{ISKMAP}, or @code{ISMACR}).
+@end deftypefun
+
+@deftypefun {char **} rl_invoking_keyseqs (Function *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 (Function *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 ()
+Print the names of all bindable Readline functions to @code{rl_outstream}.
+@end deftypefun
+
+@deftypefun {char **} rl_funmap_names ()
+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 done, but not the pointrs.
+@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. I could use an undo function for
+the stock market.
+
+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:
+
+@example
+enum undo_code @{ UNDO_DELETE, UNDO_INSERT, UNDO_BEGIN, UNDO_END @};
+@end example
+
+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 undo 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 ()
+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 ()
+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 free_undo_list ()
+Free the existing undo list.
+@end deftypefun
+
+@deftypefun int rl_do_undo ()
+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 ()
+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 ()
+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 ()
+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 ()
+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 ()
+Reset the display state to a clean state and redisplay the current line
+starting on a new line.
+@end deftypefun
+
+@deftypefun int rl_message (va_alist)
+The arguments are a string as would be supplied to @code{printf}. The
+resulting string is displayed in the @dfn{echo area}. The echo area
+is also used to display numeric arguments and search strings.
+@end deftypefun
+
+@deftypefun int rl_clear_message ()
+Clear the message in the echo area.
+@end deftypefun
+
+@deftypefun void rl_save_prompt ()
+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 ()
+Restore the local Readline prompt display state saved by the most
+recent call to @code{rl_save_prompt}.
+@end deftypefun
+
+@node Modifying Text
+@subsection Modifying Text
+
+@deftypefun int rl_insert_text (char *text)
+Insert @var{text} into the line at the current cursor position.
+@end deftypefun
+
+@deftypefun int rl_delete_text (int start, int end)
+Delete the text between @var{start} and @var{end} in the current line.
+@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
+
+@node Utility Functions
+@subsection Utility Functions
+
+@deftypefun int rl_read_key ()
+Return the next character available. This handles input inserted into
+the input stream via @var{pending input} (@pxref{Readline Variables})
+and @code{rl_stuff_char ()}, macros, and characters read from the keyboard.
+@end deftypefun
+
+@deftypefun int rl_getc (FILE *)
+Return the next character available from 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 ()}.
+@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 ()
+Initialize or re-initialize Readline's internal state.
+@end deftypefun
+
+@deftypefun int rl_reset_terminal (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 NULL, the value of the @code{TERM}
+environment variable is used.
+@end deftypefun
+
+@deftypefun int alphabetic (int c)
+Return 1 if @var{c} is an alphabetic character.
+@end deftypefun
+
+@deftypefun int numeric (int c)
+Return 1 if @var{c} is a numeric character.
+@end deftypefun
+
+@deftypefun int ding ()
+Ring the terminal bell, obeying the setting of @code{bell-style}.
+@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{chartypes.h}.
+
+@deftypefun int uppercase_p (int c)
+Return 1 if @var{c} is an uppercase alphabetic character.
+@end deftypefun
+
+@deftypefun int lowercase_p (int c)
+Return 1 if @var{c} is a lowercase alphabetic character.
+@end deftypefun
+
+@deftypefun int digit_p (int c)
+Return 1 if @var{c} is a numeric character.
+@end deftypefun
+
+@deftypefun int to_upper (int c)
+If @var{c} is a lowercase alphabetic character, return the corresponding
+uppercase character.
+@end deftypefun
+
+@deftypefun int to_lower (int c)
+If @var{c} is an uppercase alphabetic character, return the corresponding
+lowercase character.
+@end deftypefun
+
+@deftypefun int digit_value (int c)
+If @var{c} is a number, return the value it represents.
+@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 (char *prompt, Vfunction *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 callback when a complete line of input has been entered.
+@end deftypefun
+
+@deftypefun void rl_callback_read_char ()
+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. @code{EOF} is indicated by calling @var{lhandler} with a
+@code{NULL} line.
+@end deftypefun
+
+@deftypefun void rl_callback_handler_remove ()
+Restore the terminal to its initial state and remove the line handler.
+This may be called from within a callback as well as independently.
+@end deftypefun
+
+@subsection An 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 (uppercase_p (rl_line_buffer[i]))
+ rl_line_buffer[i] = to_lower (rl_line_buffer[i]);
+ else if (lowercase_p (rl_line_buffer[i]))
+ rl_line_buffer[i] = 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 a signal is
+received 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 ()}).
+
+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 state, 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 ()} 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.
+@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
+
+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 Readline
+functions intended for interactive use: @var{count} and
+@var{invoking_key}. It isolates the word to be completed and calls
+@code{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{completion_matches ()} uses your
+@dfn{generator} function to generate the list of possible matches, and
+then returns the array of these matches. You should place the address
+of your generator function in @code{rl_completion_entry_function}.
+
+@item
+The generator function is called repeatedly from
+@code{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. When the generator function returns
+@code{(char *)NULL} this signals @code{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.
+
+@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{completion_matches ()}). The default is to do filename completion.
+@end deftypefun
+
+@deftypevar {Function *} rl_completion_entry_function
+This is a pointer to the generator function for @code{completion_matches
+()}. If the value of @code{rl_completion_entry_function} is
+@code{(Function *)NULL} then the default filename generator function,
+@code{filename_completion_function ()}, is used.
+@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.
+@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{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 {char **} completion_matches (char *text, CPFunction *entry_func)
+Returns an array of @code{(char *)} which is a list of completions for
+@var{text}. If there are no completions, returns @code{(char **)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 *} filename_completion_function (char *text, int state)
+A generator function for filename completion in the general case. Note
+that completion in Bash is a little different because of all
+the pathnames that must be followed when looking up completions for a
+command. The Bash source is a useful reference for writing custom
+completion functions.
+@end deftypefun
+
+@deftypefun {char *} username_completion_function (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 {Function *} rl_completion_entry_function
+A pointer to the generator function for @code{completion_matches ()}.
+@code{NULL} means to use @code{filename_completion_function ()}, the default
+filename completer.
+@end deftypevar
+
+@deftypevar {CPPFunction *} 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} saying
+what the boundaries of @var{text} are. 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.
+@end deftypevar
+
+@deftypevar {CPFunction *} 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 {CPFunction *} 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 {Function *} 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 int rl_completion_query_items
+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.
+@end deftypevar
+
+@deftypevar {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, i.e.,
+@code{" \t\n\"\\'`@@$><=;|&@{("}.
+@end deftypevar
+
+@deftypevar {char *} rl_basic_quote_characters
+List of quote characters which can cause a word break.
+@end deftypevar
+
+@deftypevar {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 {char *} rl_completer_quote_characters
+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 {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 {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_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 custom completion functions to
+provide the ``most sensible word separator character'' according to
+an application-specific command line syntax specification.
+@end deftypevar
+
+@deftypevar int rl_ignore_completion_duplicates
+If non-zero, then disallow duplicates in the matches. 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 on entry, and can only be changed
+within a completion entry generator function. If it is set to a non-zero
+value, directory names have a slash appended and Readline attempts to
+quote completed filenames if they contain any embedded word break
+characters.
+@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
+on entry, and can only be changed within a completion entry generator
+function. The quoting is effected via a call to the function pointed to
+by @code{rl_filename_quoting_function}.
+@end deftypevar
+
+@deftypevar int rl_inhibit_completion
+If this variable is non-zero, completion is inhibit<ed. The completion
+character will be inserted as any other bound to @code{self-insert}.
+@end deftypevar
+
+@deftypevar {Function *} 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 {Function *} 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. It could be used
+to expand symbolic links or shell variables in pathnames.
+@end deftypevar
+
+@deftypevar {VFunction *} 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
+
+@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 *getwd ();
+extern char *xmalloc ();
+
+/* The names of functions that actually do the manipulation. */
+int com_list (), com_view (), com_rename (), com_stat (), com_pwd ();
+int com_delete (), com_help (), com_cd (), com_quit ();
+
+/* A structure which contains information on the commands this program
+ can understand. */
+
+typedef struct @{
+ char *name; /* User printable name of the function. */
+ Function *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, (Function *)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)
+ 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 ();
+char **fileman_completion ();
+
+/* 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 = (CPPFunction *)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)
+ 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 = 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)
+ 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 = getwd (dir);
+ 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);
+@}
+@end smallexample
diff --git a/gnu/lib/libreadline/doc/rluser.texinfo b/gnu/lib/libreadline/doc/rluser.texinfo
new file mode 100644
index 00000000000..9f088ff3d48
--- /dev/null
+++ b/gnu/lib/libreadline/doc/rluser.texinfo
@@ -0,0 +1,1629 @@
+@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-1999 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 @key{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 @key{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}
+@i{first}, and then typing @key{k}.
+Either process is known as @dfn{metafying} the @key{k} key.
+
+The text @key{M-C-k} is read as `Meta-Control-k' and describes the
+character produced by @dfn{metafying} @key{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{RETURN}. You do not have to be at the
+end of the line to press @key{RETURN}; 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 @key{C-b} to move the cursor to the left, and then
+correct your mistake. Afterwards, you can move the cursor to the right
+with @key{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 @key{C-b}
+Move back one character.
+@item @key{C-f}
+Move forward one character.
+@item @key{DEL} or @key{Backspace}
+Delete the character to the left of the cursor.
+@item @key{C-d}
+Delete the character underneath the cursor.
+@item @w{Printing characters}
+Insert the character into the line at the cursor.
+@item @key{C-_} or @key{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 @key{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 @key{C-b}, @key{C-f},
+@key{C-d}, and @key{DEL}. Here are some commands for moving more rapidly
+about the line.
+
+@table @key
+@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 @key{C-f} moves forward a character, while @key{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 @key
+@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 @key{M-f}.
+
+@item M-DEL
+Kill from the cursor the start of the previous word, or, if between
+words, to the start of the previous word.
+Word boundaries are the same as those used by @key{M-b}.
+
+@item C-w
+Kill from the cursor to the previous whitespace. This is different than
+@key{M-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 @key
+@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 @key{C-y} or @key{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 @key{C-d} command an argument of 10, you could type @samp{M-1 0 C-d}.
+
+@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: @var{incremental} and @var{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
+@key{C-r}. Typing @key{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
+@key{C-J} characters will terminate an incremental search.
+@key{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 @key{C-r} or
+@key{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.
+
+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 @code{INPUTRC}. If
+@end ifset
+@ifclear BashFeatures
+file is taken from the value of the environment variable @code{INPUTRC}. If
+@end ifclear
+that variable is unset, the default is @file{~/.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. Here 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
+
+@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.
+
+@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 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 he wants to see the list of possibilities. 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. 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 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 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 strip the eighth bit from 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
+@key{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-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 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 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 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 the name of the key
+you wish to bind the command to, a colon, and then the name of the
+command on a line in the init file. The name of the key
+can be expressed in different ways, depending on which is most
+comfortable for you.
+
+@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, @key{C-u} is bound to the function
+@code{universal-argument}, and @key{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).
+
+@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, @key{C-u} is bound to the function
+@code{universal-argument} (just as it was in the first example),
+@samp{@key{C-x} @key{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 character whose @code{ASCII} code is the octal value @var{nnn}
+(one to three digits)
+@item \x@var{nnn}
+the character whose @code{ASCII} code is the hexadecimal value @var{nnn}
+(one to three 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{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 it.
+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.
+@example
+$include /etc/inputrc
+@end example
+@end table
+
+@node Sample Init File
+@subsection Sample Init File
+
+Here is an example of an 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, @var{point} refers to the current cursor
+position, and @var{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 @var{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, 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 @code{HISTCONTROL} and @code{HISTIGNORE} variables.
+If this line was a 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, add it to the history list. If this line was a history
+line, then restore the history line to its original state.
+@end ifclear
+
+@item previous-history (C-p)
+Move `up' through the history list.
+
+@item next-history (C-n)
+Move `down' through the history list.
+
+@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). 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.
+
+@item yank-last-arg (M-., 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.
+
+@end ftable
+
+@node Commands For Text
+@subsection Commands For Changing Text
+
+@ftable @code
+@item delete-char (C-d)
+Delete the character under the cursor. If the cursor 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 @code{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, C-v)
+Add the next character typed to the line verbatim. This is
+how to insert key sequences like @key{C-q}, for example.
+
+@ifclear BashFeatures
+@item tab-insert (M-TAB)
+Insert a tab character.
+@end ifclear
+
+@item self-insert (a, b, A, 1, !, ...)
+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.
+
+@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.
+
+@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 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-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 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 the current
+cursor position.
+
+@item 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.
+@end ftable
+
+@node Numeric Arguments
+@subsection Specifying Numeric Arguments
+@ftable @code
+
+@item digit-argument (M-0, M-1, ... M--)
+Add this digit to the argument already accumulating, or start a new
+argument. @key{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 (TAB)
+Attempt to do completion on the text before the cursor. This is
+application-specific. Generally, if you are typing a filename
+argument, you can do filename completion; if you are typing a command,
+you can do command completion; if you are typing in a symbol to GDB, you
+can do symbol name completion; if you are typing in a variable to Bash,
+you can do variable name completion, and so on.
+@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
+
+@item possible-completions (M-?)
+List the possible completions of the text before the cursor.
+
+@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 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 @code{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-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 (ESC)
+Make the next character typed be metafied. This is for keyboards
+without a meta key. Typing @samp{ESC f} is equivalent to typing
+@samp{M-f}.
+
+@item undo (C-_, 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 current 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-#)
+The value of the @code{comment-begin}
+variable is inserted at the beginning of the current line,
+and 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.
+@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 ouput. 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-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.
+
+@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.
+
+@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-., 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 emacs-editing-mode (C-e)
+When in @code{vi} editing mode, this causes a switch back to
+@code{emacs} editing mode, as if the command @samp{set -o emacs} had
+been executed.
+
+@end ifset
+
+@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 M-C-j (toggle-editing-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 @samp{-f} or @samp{-d} option is used for filename or
+directory name completion, the shell variable @code{FIGNORE} is
+used to filter the matches.
+@xref{Bash Variables}, for a description of @code{FIGNORE}.
+
+Any completions specified by a filename expansion pattern to the
+@samp{-G} option are generated next.
+The words generated by the pattern need not match the word being completed.
+The @code{GLOBIGNORE} shell variable is not used to filter the matches,
+but the @code{FIGNORE} shell variable is used.
+
+Next, the string specified as the argument to the @samp{-W} option
+is considered.
+The string is first split using the characters in the @code{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, arithmetic expansion, and pathname 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 @samp{-F} and @samp{-C} options is invoked.
+When the command or function is invoked, the @code{COMP_LINE} and
+@code{COMP_POINT} variables are assigned values as described above
+(@pxref{Bash Variables}).
+If a shell function is being invoked, the @code{COMP_WORDS} and
+@code{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 @samp{-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 @code{COMPREPLY} array
+variable.
+
+Next, any command specified with the @samp{-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 @samp{-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 @samp{-P} and @samp{-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 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.
+
+@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 @samp{-p} and @samp{-r}, and write
+the matches to the standard output.
+When using the @samp{-F} or @samp{-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 [-abcdefjkvu] [-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 @samp{-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 @samp{-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 @samp{-G}, @samp{-W}, and @samp{-X} options
+(and, if necessary, the @samp{-P} and @samp{-S} options)
+should be quoted to protect them from expansion before the
+@code{complete} builtin is invoked.
+
+@table @code
+@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 @samp{-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 @samp{-b}.
+
+@item command
+Command names. May also be specified as @samp{-c}.
+
+@item directory
+Directory names. May also be specified as @samp{-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 @samp{-e}.
+
+@item file
+File names. May also be specified as @samp{-f}.
+
+@item function
+Names of shell functions.
+
+@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
+@code{HOSTFILE} shell variable (@pxref{Bash Variables}).
+
+@item job
+Job names, if job control is active. May also be specified as @samp{-j}.
+
+@item keyword
+Shell reserved words. May also be specified as @samp{-k}.
+
+@item running
+Names of running jobs, if job control is active.
+
+@item setopt
+Valid arguments for the @samp{-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 @samp{-u}.
+
+@item variable
+Names of all shell variables. May also be specified as @samp{-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
+@code{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 @code{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 @samp{-p} or @samp{-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/gnu/lib/libreadline/doc/rluserman.dvi b/gnu/lib/libreadline/doc/rluserman.dvi
new file mode 100644
index 00000000000..0d2bf71f771
--- /dev/null
+++ b/gnu/lib/libreadline/doc/rluserman.dvi
Binary files differ
diff --git a/gnu/lib/libreadline/doc/rluserman.html b/gnu/lib/libreadline/doc/rluserman.html
new file mode 100644
index 00000000000..b813dda6c1e
--- /dev/null
+++ b/gnu/lib/libreadline/doc/rluserman.html
@@ -0,0 +1,1566 @@
+<HTML>
+<HEAD>
+<!-- This HTML file has been created by texi2html 1.52
+ from /usr/homes/chet/src/bash/readline-src/doc/rluserman.texinfo on 1 March 2000 -->
+
+<TITLE>GNU Readline Library</TITLE>
+</HEAD>
+<BODY>
+<H1>GNU Readline Library User Interface</H1>
+<H2>Edition 4.1, for <CODE>Readline Library</CODE> Version 4.1.</H2>
+<H2>January 2000</H2>
+<ADDRESS>Brian Fox, Free Software Foundation</ADDRESS>
+<ADDRESS>Chet Ramey, Case Western Reserve University</ADDRESS>
+<P>
+<P><HR><P>
+<H1>Table of Contents</H1>
+<UL>
+<LI><A NAME="TOC1" HREF="rluserman.html#SEC1">Command Line Editing</A>
+<UL>
+<LI><A NAME="TOC2" HREF="rluserman.html#SEC2">Introduction to Line Editing</A>
+<LI><A NAME="TOC3" HREF="rluserman.html#SEC3">Readline Interaction</A>
+<UL>
+<LI><A NAME="TOC4" HREF="rluserman.html#SEC4">Readline Bare Essentials</A>
+<LI><A NAME="TOC5" HREF="rluserman.html#SEC5">Readline Movement Commands</A>
+<LI><A NAME="TOC6" HREF="rluserman.html#SEC6">Readline Killing Commands</A>
+<LI><A NAME="TOC7" HREF="rluserman.html#SEC7">Readline Arguments</A>
+<LI><A NAME="TOC8" HREF="rluserman.html#SEC8">Searching for Commands in the History</A>
+</UL>
+<LI><A NAME="TOC9" HREF="rluserman.html#SEC9">Readline Init File</A>
+<UL>
+<LI><A NAME="TOC10" HREF="rluserman.html#SEC10">Readline Init File Syntax</A>
+<LI><A NAME="TOC11" HREF="rluserman.html#SEC11">Conditional Init Constructs</A>
+<LI><A NAME="TOC12" HREF="rluserman.html#SEC12">Sample Init File</A>
+</UL>
+<LI><A NAME="TOC13" HREF="rluserman.html#SEC13">Bindable Readline Commands</A>
+<UL>
+<LI><A NAME="TOC14" HREF="rluserman.html#SEC14">Commands For Moving</A>
+<LI><A NAME="TOC15" HREF="rluserman.html#SEC15">Commands For Manipulating The History</A>
+<LI><A NAME="TOC16" HREF="rluserman.html#SEC16">Commands For Changing Text</A>
+<LI><A NAME="TOC17" HREF="rluserman.html#SEC17">Killing And Yanking</A>
+<LI><A NAME="TOC18" HREF="rluserman.html#SEC18">Specifying Numeric Arguments</A>
+<LI><A NAME="TOC19" HREF="rluserman.html#SEC19">Letting Readline Type For You</A>
+<LI><A NAME="TOC20" HREF="rluserman.html#SEC20">Keyboard Macros</A>
+<LI><A NAME="TOC21" HREF="rluserman.html#SEC21">Some Miscellaneous Commands</A>
+</UL>
+<LI><A NAME="TOC22" HREF="rluserman.html#SEC22">Readline vi Mode</A>
+</UL>
+</UL>
+<P><HR><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 that need to provide a command line interface.
+
+</P>
+<P>
+Published by the Free Software Foundation <BR>
+59 Temple Place, Suite 330, <BR>
+Boston, MA 02111 USA
+
+</P>
+<P>
+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.
+
+</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 Free Software Foundation.
+
+</P>
+<P>
+Copyright (C) 1988-1999 Free Software Foundation, Inc.
+
+</P>
+
+
+
+<H1><A NAME="SEC1" HREF="rluserman.html#TOC1">Command Line Editing</A></H1>
+
+<P>
+This chapter describes the basic features of the GNU
+command line editing interface.
+
+</P>
+
+<UL>
+<LI><A HREF="rluserman.html#SEC2">Introduction and Notation</A>: Notation used in this text.
+<LI><A HREF="rluserman.html#SEC3">Readline Interaction</A>: The minimum set of commands for editing a line.
+<LI><A HREF="rluserman.html#SEC9">Readline Init File</A>: Customizing Readline from a user's view.
+<LI><A HREF="rluserman.html#SEC13">Bindable Readline Commands</A>: A description of most of the Readline commands
+ available for binding
+<LI><A HREF="rluserman.html#SEC22">Readline vi Mode</A>: A short description of how to make Readline
+ behave like the vi editor.
+</UL>
+
+
+
+<H2><A NAME="SEC2" HREF="rluserman.html#TOC2">Introduction to Line Editing</A></H2>
+
+<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>
+<I>first</I>, 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">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>
+
+
+<H2><A NAME="SEC3" HREF="rluserman.html#TOC3">Readline Interaction</A></H2>
+<P>
+<A NAME="IDX1"></A>
+
+</P>
+<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>RETURN</KBD>. You do not have to be at the
+end of the line to press <KBD>RETURN</KBD>; the entire line is accepted
+regardless of the location of the cursor within the line.
+
+</P>
+
+<UL>
+<LI><A HREF="rluserman.html#SEC4">Readline Bare Essentials</A>: The least you need to know about Readline.
+<LI><A HREF="rluserman.html#SEC5">Readline Movement Commands</A>: Moving about the input line.
+<LI><A HREF="rluserman.html#SEC6">Readline Killing Commands</A>: How to delete text, and how to get it back!
+<LI><A HREF="rluserman.html#SEC7">Readline Arguments</A>: Giving numeric arguments to commands.
+<LI><A HREF="rluserman.html#SEC8">Searching</A>: Searching through previous lines.
+</UL>
+
+
+
+<H3><A NAME="SEC4" HREF="rluserman.html#TOC4">Readline Bare Essentials</A></H3>
+<P>
+<A NAME="IDX2"></A>
+<A NAME="IDX3"></A>
+<A NAME="IDX4"></A>
+
+</P>
+<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>
+<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>
+
+
+<H3><A NAME="SEC5" HREF="rluserman.html#TOC5">Readline Movement Commands</A></H3>
+
+<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>
+<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>
+
+
+<H3><A NAME="SEC6" HREF="rluserman.html#TOC6">Readline Killing Commands</A></H3>
+
+<P>
+<A NAME="IDX5"></A>
+<A NAME="IDX6"></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="IDX7"></A>
+
+</P>
+<P>
+Here is the list of commands for killing text.
+
+</P>
+<DL COMPACT>
+
+<DT><KBD>C-k</KBD>
+<DD>
+Kill the text from the current cursor position to the end of the line.
+
+<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>.
+
+<DT><KBD>M-DEL</KBD>
+<DD>
+Kill from the cursor the start of the previous 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>.
+
+<DT><KBD>C-w</KBD>
+<DD>
+Kill from the cursor to the previous whitespace. This is different than
+<KBD>M-DEL</KBD> because the word boundaries differ.
+
+</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>
+<DL COMPACT>
+
+<DT><KBD>C-y</KBD>
+<DD>
+Yank the most recently killed text back into the buffer at the cursor.
+
+<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>
+
+
+
+<H3><A NAME="SEC7" HREF="rluserman.html#TOC7">Readline Arguments</A></H3>
+
+<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>.
+
+</P>
+
+
+<H3><A NAME="SEC8" HREF="rluserman.html#TOC8">Searching for Commands in the History</A></H3>
+
+<P>
+Readline provides commands for searching through the command history
+for lines containing a specified string.
+There are two search modes: <VAR>incremental</VAR> and <VAR>non-incremental</VAR>.
+
+</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.
+
+</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>
+
+
+<H2><A NAME="SEC9" HREF="rluserman.html#TOC9">Readline Init File</A></H2>
+<P>
+<A NAME="IDX8"></A>
+
+</P>
+<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>.
+
+</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>
+
+<UL>
+<LI><A HREF="rluserman.html#SEC10">Readline Init File Syntax</A>: Syntax for the commands in the inputrc file.
+
+<LI><A HREF="rluserman.html#SEC11">Conditional Init Constructs</A>: Conditional key bindings in the inputrc file.
+
+<LI><A HREF="rluserman.html#SEC12">Sample Init File</A>: An example inputrc file.
+</UL>
+
+
+
+<H3><A NAME="SEC10" HREF="rluserman.html#TOC10">Readline Init File Syntax</A></H3>
+
+<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">Conditional Init Constructs</A>). Other lines
+denote variable settings and key bindings.
+
+</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. Here is how to
+change from the default Emacs-like key binding to use
+<CODE>vi</CODE> line editing commands:
+
+
+<PRE>
+set editing-mode vi
+</PRE>
+
+A great deal of run-time behavior is changeable with the following
+variables.
+
+<DL COMPACT>
+
+<DT><CODE>bell-style</CODE>
+<DD>
+<A NAME="IDX9"></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.
+
+<DT><CODE>comment-begin</CODE>
+<DD>
+<A NAME="IDX10"></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>.
+
+<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>.
+
+<DT><CODE>completion-query-items</CODE>
+<DD>
+<A NAME="IDX11"></A>
+The number of possible completions that determines when the user is
+asked whether he wants to see the list of possibilities. 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. The default limit is
+<CODE>100</CODE>.
+
+<DT><CODE>convert-meta</CODE>
+<DD>
+<A NAME="IDX12"></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>.
+
+<DT><CODE>disable-completion</CODE>
+<DD>
+<A NAME="IDX13"></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>.
+
+<DT><CODE>editing-mode</CODE>
+<DD>
+<A NAME="IDX14"></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>.
+
+<DT><CODE>enable-keypad</CODE>
+<DD>
+<A NAME="IDX15"></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>.
+
+<DT><CODE>expand-tilde</CODE>
+<DD>
+<A NAME="IDX16"></A>
+If set to <SAMP>`on'</SAMP>, tilde expansion is performed when Readline
+attempts word completion. The default is <SAMP>`off'</SAMP>.
+
+<DT><CODE>horizontal-scroll-mode</CODE>
+<DD>
+<A NAME="IDX17"></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>.
+
+<DT><CODE>input-meta</CODE>
+<DD>
+<A NAME="IDX18"></A>
+<A NAME="IDX19"></A>
+If set to <SAMP>`on'</SAMP>, Readline will enable eight-bit input (it
+will not strip the eighth bit from 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.
+
+<DT><CODE>isearch-terminators</CODE>
+<DD>
+<A NAME="IDX20"></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">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.
+
+<DT><CODE>keymap</CODE>
+<DD>
+<A NAME="IDX21"></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-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.
+
+<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>.
+
+<DT><CODE>mark-modified-lines</CODE>
+<DD>
+<A NAME="IDX22"></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.
+
+<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>.
+
+<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>.
+
+<DT><CODE>show-all-if-ambiguous</CODE>
+<DD>
+<A NAME="IDX24"></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>.
+
+<DT><CODE>visible-stats</CODE>
+<DD>
+<A NAME="IDX25"></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>.
+
+</DL>
+
+<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.
+
+Once you know the name of the command, simply place the name of the key
+you wish to bind the command to, a colon, and then the name of the
+command on a line in the init file. The name of the key
+can be expressed in different ways, depending on which is most
+comfortable for you.
+
+<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:
+
+<PRE>
+Control-u: universal-argument
+Meta-Rubout: backward-kill-word
+Control-o: "&#62; output"
+</PRE>
+
+In the above example, <KBD>C-u</KBD> is bound to the function
+<CODE>universal-argument</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).
+
+<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.
+
+
+<PRE>
+"\C-u": universal-argument
+"\C-x\C-r": re-read-init-file
+"\e[11~": "Function Key 1"
+</PRE>
+
+In the above example, <KBD>C-u</KBD> is 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>.
+
+</DL>
+
+The following GNU Emacs style escape sequences are available when
+specifying key sequences:
+
+<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>
+
+In addition to the GNU Emacs style escape sequences, a second
+set of backslash escapes is available:
+
+<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 character whose <CODE>ASCII</CODE> code is the octal value <VAR>nnn</VAR>
+(one to three digits)
+<DT><CODE>\x<VAR>nnn</VAR></CODE>
+<DD>
+the character whose <CODE>ASCII</CODE> code is the hexadecimal value <VAR>nnn</VAR>
+(one to three digits)
+</DL>
+
+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>`C-x \'</SAMP>
+insert a single <SAMP>`\'</SAMP> into the line:
+
+<PRE>
+"\C-x\\": "\\"
+</PRE>
+
+</DL>
+
+
+
+<H3><A NAME="SEC11" HREF="rluserman.html#TOC11">Conditional Init Constructs</A></H3>
+
+<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>
+<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.
+
+<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.
+
+<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.
+
+<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 it.
+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:
+
+<PRE>
+$if Bash
+# Quote the current or previous word
+"\C-xq": "\eb\"\ef\""
+$endif
+</PRE>
+
+</DL>
+
+<DT><CODE>$endif</CODE>
+<DD>
+This command, as seen in the previous example, terminates an
+<CODE>$if</CODE> command.
+
+<DT><CODE>$else</CODE>
+<DD>
+Commands in this branch of the <CODE>$if</CODE> directive are executed if
+the test fails.
+
+<DT><CODE>$include</CODE>
+<DD>
+This directive takes a single filename as an argument and reads commands
+and bindings from that file.
+
+<PRE>
+$include /etc/inputrc
+</PRE>
+
+</DL>
+
+
+
+<H3><A NAME="SEC12" HREF="rluserman.html#TOC12">Sample Init File</A></H3>
+
+<P>
+Here is an example of an inputrc file. This illustrates key
+binding, variable assignment, and conditional syntax.
+
+</P>
+
+<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>
+
+
+
+<H2><A NAME="SEC13" HREF="rluserman.html#TOC13">Bindable Readline Commands</A></H2>
+
+
+<UL>
+<LI><A HREF="rluserman.html#SEC14">Commands For Moving</A>: Moving about the line.
+<LI><A HREF="rluserman.html#SEC15">Commands For History</A>: Getting at previous lines.
+<LI><A HREF="rluserman.html#SEC16">Commands For Text</A>: Commands for changing text.
+<LI><A HREF="rluserman.html#SEC17">Commands For Killing</A>: Commands for killing and yanking.
+<LI><A HREF="rluserman.html#SEC18">Numeric Arguments</A>: Specifying numeric arguments, repeat counts.
+<LI><A HREF="rluserman.html#SEC19">Commands For Completion</A>: Getting Readline to do the typing for you.
+<LI><A HREF="rluserman.html#SEC20">Keyboard Macros</A>: Saving and re-executing typed characters
+<LI><A HREF="rluserman.html#SEC21">Miscellaneous Commands</A>: Other miscellaneous commands.
+</UL>
+
+<P>
+This section describes Readline commands that may be bound to key
+sequences.
+
+</P>
+<P>
+Command names without an accompanying key sequence are unbound by default.
+In the following descriptions, <VAR>point</VAR> refers to the current cursor
+position, and <VAR>mark</VAR> 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 <VAR>region</VAR>.
+
+</P>
+
+
+<H3><A NAME="SEC14" HREF="rluserman.html#TOC14">Commands For Moving</A></H3>
+<DL COMPACT>
+
+<DT><CODE>beginning-of-line (C-a)</CODE>
+<DD>
+<A NAME="IDX26"></A>
+Move to the start of the current line.
+
+<DT><CODE>end-of-line (C-e)</CODE>
+<DD>
+<A NAME="IDX27"></A>
+Move to the end of the line.
+
+<DT><CODE>forward-char (C-f)</CODE>
+<DD>
+<A NAME="IDX28"></A>
+Move forward a character.
+
+<DT><CODE>backward-char (C-b)</CODE>
+<DD>
+<A NAME="IDX29"></A>
+Move back a character.
+
+<DT><CODE>forward-word (M-f)</CODE>
+<DD>
+<A NAME="IDX30"></A>
+Move forward to the end of the next word. Words are composed of
+letters and digits.
+
+<DT><CODE>backward-word (M-b)</CODE>
+<DD>
+<A NAME="IDX31"></A>
+Move back to the start of the current or previous word. Words are
+composed of letters and digits.
+
+<DT><CODE>clear-screen (C-l)</CODE>
+<DD>
+<A NAME="IDX32"></A>
+Clear the screen and redraw the current line,
+leaving the current line at the top of the screen.
+
+<DT><CODE>redraw-current-line ()</CODE>
+<DD>
+<A NAME="IDX33"></A>
+Refresh the current line. By default, this is unbound.
+
+</DL>
+
+
+
+<H3><A NAME="SEC15" HREF="rluserman.html#TOC15">Commands For Manipulating The History</A></H3>
+
+<DL COMPACT>
+
+<DT><CODE>accept-line (Newline, Return)</CODE>
+<DD>
+<A NAME="IDX34"></A>
+Accept the line regardless of where the cursor is. If this line is
+non-empty, add it to the history list. If this line was a history
+line, then restore the history line to its original state.
+
+<DT><CODE>previous-history (C-p)</CODE>
+<DD>
+<A NAME="IDX35"></A>
+Move `up' through the history list.
+
+<DT><CODE>next-history (C-n)</CODE>
+<DD>
+<A NAME="IDX36"></A>
+Move `down' through the history list.
+
+<DT><CODE>beginning-of-history (M-&#60;)</CODE>
+<DD>
+<A NAME="IDX37"></A>
+Move to the first line in the history.
+
+<DT><CODE>end-of-history (M-&#62;)</CODE>
+<DD>
+<A NAME="IDX38"></A>
+Move to the end of the input history, i.e., the line currently
+being entered.
+
+<DT><CODE>reverse-search-history (C-r)</CODE>
+<DD>
+<A NAME="IDX39"></A>
+Search backward starting at the current line and moving `up' through
+the history as necessary. This is an incremental search.
+
+<DT><CODE>forward-search-history (C-s)</CODE>
+<DD>
+<A NAME="IDX40"></A>
+Search forward starting at the current line and moving `down' through
+the the history as necessary. This is an incremental search.
+
+<DT><CODE>non-incremental-reverse-search-history (M-p)</CODE>
+<DD>
+<A NAME="IDX41"></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.
+
+<DT><CODE>non-incremental-forward-search-history (M-n)</CODE>
+<DD>
+<A NAME="IDX42"></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.
+
+<DT><CODE>history-search-forward ()</CODE>
+<DD>
+<A NAME="IDX43"></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.
+
+<DT><CODE>history-search-backward ()</CODE>
+<DD>
+<A NAME="IDX44"></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.
+
+<DT><CODE>yank-nth-arg (M-C-y)</CODE>
+<DD>
+<A NAME="IDX45"></A>
+Insert the first argument to the previous command (usually
+the second word on the previous line). 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.
+
+<DT><CODE>yank-last-arg (M-., M-_)</CODE>
+<DD>
+<A NAME="IDX46"></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.
+
+</DL>
+
+
+
+<H3><A NAME="SEC16" HREF="rluserman.html#TOC16">Commands For Changing Text</A></H3>
+
+<DL COMPACT>
+
+<DT><CODE>delete-char (C-d)</CODE>
+<DD>
+<A NAME="IDX47"></A>
+Delete the character under the cursor. If the cursor 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 <CODE>EOF</CODE>.
+
+<DT><CODE>backward-delete-char (Rubout)</CODE>
+<DD>
+<A NAME="IDX48"></A>
+Delete the character behind the cursor. A numeric argument means
+to kill the characters instead of deleting them.
+
+<DT><CODE>forward-backward-delete-char ()</CODE>
+<DD>
+<A NAME="IDX49"></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.
+
+<DT><CODE>quoted-insert (C-q, C-v)</CODE>
+<DD>
+<A NAME="IDX50"></A>
+Add the next character typed to the line verbatim. This is
+how to insert key sequences like <KBD>C-q</KBD>, for example.
+
+<DT><CODE>tab-insert (M-TAB)</CODE>
+<DD>
+<A NAME="IDX51"></A>
+Insert a tab character.
+
+<DT><CODE>self-insert (a, b, A, 1, !, ...)</CODE>
+<DD>
+<A NAME="IDX52"></A>
+Insert yourself.
+
+<DT><CODE>transpose-chars (C-t)</CODE>
+<DD>
+<A NAME="IDX53"></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.
+
+<DT><CODE>transpose-words (M-t)</CODE>
+<DD>
+<A NAME="IDX54"></A>
+Drag the word before point past the word after point,
+moving point past that word as well.
+
+<DT><CODE>upcase-word (M-u)</CODE>
+<DD>
+<A NAME="IDX55"></A>
+Uppercase the current (or following) word. With a negative argument,
+uppercase the previous word, but do not move the cursor.
+
+<DT><CODE>downcase-word (M-l)</CODE>
+<DD>
+<A NAME="IDX56"></A>
+Lowercase the current (or following) word. With a negative argument,
+lowercase the previous word, but do not move the cursor.
+
+<DT><CODE>capitalize-word (M-c)</CODE>
+<DD>
+<A NAME="IDX57"></A>
+Capitalize the current (or following) word. With a negative argument,
+capitalize the previous word, but do not move the cursor.
+
+</DL>
+
+
+
+<H3><A NAME="SEC17" HREF="rluserman.html#TOC17">Killing And Yanking</A></H3>
+
+<DL COMPACT>
+
+<DT><CODE>kill-line (C-k)</CODE>
+<DD>
+<A NAME="IDX58"></A>
+Kill the text from point to the end of the line.
+
+<DT><CODE>backward-kill-line (C-x Rubout)</CODE>
+<DD>
+<A NAME="IDX59"></A>
+Kill backward to the beginning of the line.
+
+<DT><CODE>unix-line-discard (C-u)</CODE>
+<DD>
+<A NAME="IDX60"></A>
+Kill backward from the cursor to the beginning of the current line.
+
+<DT><CODE>kill-whole-line ()</CODE>
+<DD>
+<A NAME="IDX61"></A>
+Kill all characters on the current line, no matter point is.
+By default, this is unbound.
+
+<DT><CODE>kill-word (M-d)</CODE>
+<DD>
+<A NAME="IDX62"></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>.
+
+<DT><CODE>backward-kill-word (M-DEL)</CODE>
+<DD>
+<A NAME="IDX63"></A>
+Kill the word behind point.
+Word boundaries are the same as <CODE>backward-word</CODE>.
+
+<DT><CODE>unix-word-rubout (C-w)</CODE>
+<DD>
+<A NAME="IDX64"></A>
+Kill the word behind point, using white space as a word boundary.
+The killed text is saved on the kill-ring.
+
+<DT><CODE>delete-horizontal-space ()</CODE>
+<DD>
+<A NAME="IDX65"></A>
+Delete all spaces and tabs around point. By default, this is unbound.
+
+<DT><CODE>kill-region ()</CODE>
+<DD>
+<A NAME="IDX66"></A>
+Kill the text in the current region.
+By default, this command is unbound.
+
+<DT><CODE>copy-region-as-kill ()</CODE>
+<DD>
+<A NAME="IDX67"></A>
+Copy the text in the region to the kill buffer, so it can be yanked
+right away. By default, this command is unbound.
+
+<DT><CODE>copy-backward-word ()</CODE>
+<DD>
+<A NAME="IDX68"></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.
+
+<DT><CODE>copy-forward-word ()</CODE>
+<DD>
+<A NAME="IDX69"></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.
+
+<DT><CODE>yank (C-y)</CODE>
+<DD>
+<A NAME="IDX70"></A>
+Yank the top of the kill ring into the buffer at the current
+cursor position.
+
+<DT><CODE>yank-pop (M-y)</CODE>
+<DD>
+<A NAME="IDX71"></A>
+Rotate the kill-ring, and yank the new top. You can only do this if
+the prior command is yank or yank-pop.
+</DL>
+
+
+
+<H3><A NAME="SEC18" HREF="rluserman.html#TOC18">Specifying Numeric Arguments</A></H3>
+<DL COMPACT>
+
+<DT><CODE>digit-argument (M-0, M-1, ... M--)</CODE>
+<DD>
+<A NAME="IDX72"></A>
+Add this digit to the argument already accumulating, or start a new
+argument. <KBD>M--</KBD> starts a negative argument.
+
+<DT><CODE>universal-argument ()</CODE>
+<DD>
+<A NAME="IDX73"></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>
+
+
+
+<H3><A NAME="SEC19" HREF="rluserman.html#TOC19">Letting Readline Type For You</A></H3>
+
+<DL COMPACT>
+
+<DT><CODE>complete (TAB)</CODE>
+<DD>
+<A NAME="IDX74"></A>
+Attempt to do completion on the text before the cursor. This is
+application-specific. Generally, if you are typing a filename
+argument, you can do filename completion; if you are typing a command,
+you can do command completion; if you are typing in a symbol to GDB, you
+can do symbol name completion; if you are typing in a variable to Bash,
+you can do variable name completion, and so on.
+
+<DT><CODE>possible-completions (M-?)</CODE>
+<DD>
+<A NAME="IDX75"></A>
+List the possible completions of the text before the cursor.
+
+<DT><CODE>insert-completions (M-*)</CODE>
+<DD>
+<A NAME="IDX76"></A>
+Insert all completions of the text before point that would have
+been generated by <CODE>possible-completions</CODE>.
+
+<DT><CODE>menu-complete ()</CODE>
+<DD>
+<A NAME="IDX77"></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 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 <CODE>TAB</CODE>, but is unbound
+by default.
+
+<DT><CODE>delete-char-or-list ()</CODE>
+<DD>
+<A NAME="IDX78"></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.
+
+</DL>
+
+
+
+<H3><A NAME="SEC20" HREF="rluserman.html#TOC20">Keyboard Macros</A></H3>
+<DL COMPACT>
+
+<DT><CODE>start-kbd-macro (C-x ()</CODE>
+<DD>
+<A NAME="IDX79"></A>
+Begin saving the characters typed into the current keyboard macro.
+
+<DT><CODE>end-kbd-macro (C-x ))</CODE>
+<DD>
+<A NAME="IDX80"></A>
+Stop saving the characters typed into the current keyboard macro
+and save the definition.
+
+<DT><CODE>call-last-kbd-macro (C-x e)</CODE>
+<DD>
+<A NAME="IDX81"></A>
+Re-execute the last keyboard macro defined, by making the characters
+in the macro appear as if typed at the keyboard.
+
+</DL>
+
+
+
+<H3><A NAME="SEC21" HREF="rluserman.html#TOC21">Some Miscellaneous Commands</A></H3>
+<DL COMPACT>
+
+<DT><CODE>re-read-init-file (C-x C-r)</CODE>
+<DD>
+<A NAME="IDX82"></A>
+Read in the contents of the <VAR>inputrc</VAR> file, and incorporate
+any bindings or variable assignments found there.
+
+<DT><CODE>abort (C-g)</CODE>
+<DD>
+<A NAME="IDX83"></A>
+Abort the current editing command and
+ring the terminal's bell (subject to the setting of
+<CODE>bell-style</CODE>).
+
+<DT><CODE>do-uppercase-version (M-a, M-b, M-<VAR>x</VAR>, ...)</CODE>
+<DD>
+<A NAME="IDX84"></A>
+If the metafied character <VAR>x</VAR> is lowercase, run the command
+that is bound to the corresponding uppercase character.
+
+<DT><CODE>prefix-meta (ESC)</CODE>
+<DD>
+<A NAME="IDX85"></A>
+Make the next character typed be metafied. This is for keyboards
+without a meta key. Typing <SAMP>`ESC f'</SAMP> is equivalent to typing
+<SAMP>`M-f'</SAMP>.
+
+<DT><CODE>undo (C-_, C-x C-u)</CODE>
+<DD>
+<A NAME="IDX86"></A>
+Incremental undo, separately remembered for each line.
+
+<DT><CODE>revert-line (M-r)</CODE>
+<DD>
+<A NAME="IDX87"></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.
+
+<DT><CODE>tilde-expand (M-~)</CODE>
+<DD>
+<A NAME="IDX88"></A>
+Perform tilde expansion on the current word.
+
+<DT><CODE>set-mark (C-@)</CODE>
+<DD>
+<A NAME="IDX89"></A>
+Set the mark to the current point. If a
+numeric argument is supplied, the mark is set to that position.
+
+<DT><CODE>exchange-point-and-mark (C-x C-x)</CODE>
+<DD>
+<A NAME="IDX90"></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.
+
+<DT><CODE>character-search (C-])</CODE>
+<DD>
+<A NAME="IDX91"></A>
+A character is read and point is moved to the next occurrence of that
+character. A negative count searches for previous occurrences.
+
+<DT><CODE>character-search-backward (M-C-])</CODE>
+<DD>
+<A NAME="IDX92"></A>
+A character is read and point is moved to the previous occurrence
+of that character. A negative count searches for subsequent
+occurrences.
+
+<DT><CODE>insert-comment (M-#)</CODE>
+<DD>
+<A NAME="IDX93"></A>
+The value of the <CODE>comment-begin</CODE>
+variable is inserted at the beginning of the current line,
+and the line is accepted as if a newline had been typed.
+
+<DT><CODE>dump-functions ()</CODE>
+<DD>
+<A NAME="IDX94"></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.
+
+<DT><CODE>dump-variables ()</CODE>
+<DD>
+<A NAME="IDX95"></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.
+
+<DT><CODE>dump-macros ()</CODE>
+<DD>
+<A NAME="IDX96"></A>
+Print all of the Readline key sequences bound to macros and the
+strings they ouput. 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.
+
+</DL>
+
+
+
+<H2><A NAME="SEC22" HREF="rluserman.html#TOC22">Readline vi Mode</A></H2>
+
+<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 M-C-j (toggle-editing-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><HR><P>
+This document was generated on 1 March 2000 using the
+<A HREF="http://wwwinfo.cern.ch/dis/texi2html/">texi2html</A>
+translator version 1.52.</P>
+</BODY>
+</HTML>
diff --git a/gnu/lib/libreadline/doc/rluserman.info b/gnu/lib/libreadline/doc/rluserman.info
new file mode 100644
index 00000000000..b714421c402
--- /dev/null
+++ b/gnu/lib/libreadline/doc/rluserman.info
@@ -0,0 +1,1189 @@
+This is Info file rluserman.info, produced by Makeinfo version 1.68
+from the input file
+/usr/homes/chet/src/bash/readline-src/doc/rluserman.texinfo.
+
+INFO-DIR-SECTION Libraries
+START-INFO-DIR-ENTRY
+* Readline: (readline). The GNU readline library API
+END-INFO-DIR-ENTRY
+
+ 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 that need to provide a command line interface.
+
+ Copyright (C) 1988-1999 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 Free Software Foundation.
+
+
+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 that need to provide a command line interface.
+
+* Menu:
+
+* Command Line Editing:: GNU Readline User's Manual.
+
+
+File: rluserman.info, Node: Command Line Editing, Prev: Top, Up: Top
+
+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.
+
+
+File: rluserman.info, Node: Introduction and Notation, Next: Readline Interaction, Up: Command Line Editing
+
+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.
+
+
+File: rluserman.info, Node: Readline Interaction, Next: Readline Init File, Prev: Introduction and Notation, Up: Command Line Editing
+
+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 <RETURN>. You do not have to be at the end
+of the line to press <RETURN>; 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.
+
+
+File: rluserman.info, Node: Readline Bare Essentials, Next: Readline Movement Commands, Up: Readline Interaction
+
+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.)
+
+
+File: rluserman.info, Node: Readline Movement Commands, Next: Readline Killing Commands, Prev: Readline Bare Essentials, Up: Readline Interaction
+
+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.
+
+
+File: rluserman.info, Node: Readline Killing Commands, Next: Readline Arguments, Prev: Readline Movement Commands, Up: Readline Interaction
+
+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 previous 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>.
+
+
+File: rluserman.info, Node: Readline Arguments, Next: Searching, Prev: Readline Killing Commands, Up: Readline Interaction
+
+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'.
+
+
+File: rluserman.info, Node: Searching, Prev: Readline Arguments, Up: Readline Interaction
+
+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.
+
+ 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.
+
+
+File: rluserman.info, Node: Readline Init File, Next: Bindable Readline Commands, Prev: Readline Interaction, Up: Command Line Editing
+
+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'.
+
+ 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.
+
+
+File: rluserman.info, Node: Readline Init File Syntax, Next: Conditional Init Constructs, Up: Readline Init File
+
+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. Here is how to change from the default Emacs-like key
+ binding to use `vi' line editing commands:
+
+ set editing-mode vi
+
+ 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.
+
+ `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 he wants to see the list of
+ possibilities. 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. 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'.
+
+ `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 strip the eighth bit from 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-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.
+
+ `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'.
+
+ `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'.
+
+ `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 the name of
+ the key you wish to bind the command to, a colon, and then the
+ name of the command on a line in the init file. The name of the
+ key can be expressed in different ways, depending on which is most
+ comfortable for you.
+
+ 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', 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).
+
+ "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 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 character whose `ASCII' code is the octal value NNN (one
+ to three digits)
+
+ `\xNNN'
+ the character whose `ASCII' code is the hexadecimal value NNN
+ (one to three 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\\": "\\"
+
+
+File: rluserman.info, Node: Conditional Init Constructs, Next: Sample Init File, Prev: Readline Init File Syntax, Up: Readline Init File
+
+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 it. 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.
+ $include /etc/inputrc
+
+
+File: rluserman.info, Node: Sample Init File, Prev: Conditional Init Constructs, Up: Readline Init File
+
+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
+
+
+File: rluserman.info, Node: Bindable Readline Commands, Next: Readline vi Mode, Prev: Readline Init File, Up: Command Line Editing
+
+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.
+
+
+File: rluserman.info, Node: Commands For Moving, Next: Commands For History, Up: Bindable Readline Commands
+
+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.
+
+
+File: rluserman.info, Node: Commands For History, Next: Commands For Text, Prev: Commands For Moving, Up: Bindable Readline Commands
+
+Commands For Manipulating The History
+-------------------------------------
+
+`accept-line (Newline, Return)'
+ Accept the line regardless of where the cursor is. If this line is
+ non-empty, add it to the history list. If this line was a history
+ line, then restore the history line to its original state.
+
+`previous-history (C-p)'
+ Move `up' through the history list.
+
+`next-history (C-n)'
+ Move `down' through the history list.
+
+`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). 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.
+
+`yank-last-arg (M-., 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.
+
+
+File: rluserman.info, Node: Commands For Text, Next: Commands For Killing, Prev: Commands For History, Up: Bindable Readline Commands
+
+Commands For Changing Text
+--------------------------
+
+`delete-char (C-d)'
+ Delete the character under the cursor. If the cursor 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, 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.
+
+`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.
+
+
+File: rluserman.info, Node: Commands For Killing, Next: Numeric Arguments, Prev: Commands For Text, Up: Bindable Readline Commands
+
+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 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.
+
+`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 the current
+ cursor position.
+
+`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.
+
+
+File: rluserman.info, Node: Numeric Arguments, Next: Commands For Completion, Prev: Commands For Killing, Up: Bindable Readline Commands
+
+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.
+
+
+File: rluserman.info, Node: Commands For Completion, Next: Keyboard Macros, Prev: Numeric Arguments, Up: Bindable Readline Commands
+
+Letting Readline Type For You
+-----------------------------
+
+`complete (TAB)'
+ Attempt to do completion on the text before the cursor. This is
+ application-specific. Generally, if you are typing a filename
+ argument, you can do filename completion; if you are typing a
+ command, you can do command completion; if you are typing in a
+ symbol to GDB, you can do symbol name completion; if you are
+ typing in a variable to Bash, you can do variable name completion,
+ and so on.
+
+`possible-completions (M-?)'
+ List the possible completions of the text before the cursor.
+
+`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 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.
+
+
+File: rluserman.info, Node: Keyboard Macros, Next: Miscellaneous Commands, Prev: Commands For Completion, Up: Bindable Readline Commands
+
+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.
+
+
+File: rluserman.info, Node: Miscellaneous Commands, Prev: Keyboard Macros, Up: Bindable Readline Commands
+
+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)'
+ Make the next character typed be metafied. This is for keyboards
+ without a meta key. Typing `ESC f' is equivalent to typing `M-f'.
+
+`undo (C-_, 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 current 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-#)'
+ The value of the `comment-begin' variable is inserted at the
+ beginning of the current line, and 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 ouput. 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.
+
+
+File: rluserman.info, Node: Readline vi Mode, Prev: Bindable Readline Commands, Up: Command Line Editing
+
+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 (toggle-editing-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.
+
+
+
+Tag Table:
+Node: Top1221
+Node: Command Line Editing1617
+Node: Introduction and Notation2231
+Node: Readline Interaction3850
+Node: Readline Bare Essentials5044
+Node: Readline Movement Commands6826
+Node: Readline Killing Commands7784
+Node: Readline Arguments9691
+Node: Searching10667
+Node: Readline Init File12511
+Node: Readline Init File Syntax13573
+Node: Conditional Init Constructs22839
+Node: Sample Init File25279
+Node: Bindable Readline Commands28450
+Node: Commands For Moving29495
+Node: Commands For History30345
+Node: Commands For Text33063
+Node: Commands For Killing35067
+Node: Numeric Arguments37035
+Node: Commands For Completion38163
+Node: Keyboard Macros39912
+Node: Miscellaneous Commands40472
+Node: Readline vi Mode43277
+
+End Tag Table
diff --git a/gnu/lib/libreadline/doc/rluserman.ps b/gnu/lib/libreadline/doc/rluserman.ps
new file mode 100644
index 00000000000..4edf5787904
--- /dev/null
+++ b/gnu/lib/libreadline/doc/rluserman.ps
@@ -0,0 +1,1897 @@
+%!PS-Adobe-2.0
+%%Creator: dvips(k) 5.82 Copyright 1998 Radical Eye Software
+%%Title: rluserman.dvi
+%%Pages: 22
+%%PageOrder: Ascend
+%%BoundingBox: 0 0 612 792
+%%EndComments
+%DVIPSWebPage: (www.radicaleye.com)
+%DVIPSCommandLine: dvips -D 300 -t letter -o rluserman.ps rluserman.dvi
+%DVIPSParameters: dpi=300, compressed
+%DVIPSSource: TeX output 2000.03.01:1453
+%%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/IE 0 N/ctr 0 N/df-tail{/nn 8 dict N nn begin
+/FontType 3 N/FontMatrix fntrx N/FontBBox FBB N string/base X array
+/BitMaps X/BuildChar{CharBuilder}N/Encoding IE N end 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/IE 256 array N 2 string 0 1 255{IE 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
+TeXDict begin 40258431 52099146 1000 300 300 (rluserman.dvi)
+@start
+%DVIPSBitmapFont: Fa cmti10 10.95 1
+/Fa 1 47 df<127012F8A212F012E005057B840E>46 D E
+%EndDVIPSBitmapFont
+%DVIPSBitmapFont: Fb cmbxti10 14.4 1
+/Fb 1 47 df<120E123FEA7F80A212FFA21300127E123C0909798815>46
+D E
+%EndDVIPSBitmapFont
+%DVIPSBitmapFont: Fc cmmi10 10.95 1
+/Fc 1 59 df<127012F8A3127005057C840D>58 D E
+%EndDVIPSBitmapFont
+%DVIPSBitmapFont: Fd cmsltt10 10.95 6
+/Fd 6 102 df<1206120FEA1F80120FA21203EA0700A25A120E123C127C12F01260090E
+769B18>39 D<387FFFC0B512E0A26C13C013047C8F18>45 D<EB3E18EBFFB84813F8EA07
+C1EB8078EA0E00121E001C137048133014005AA35AA614C0EA7001A2130338380780383C
+0F00EA1FFE6C5AEA03F0151C7C9B18>67 D<3907E01F80000FEB3FC0000714803903B02E
+00146EA214CE380730DC1331149CA21333141C000E5B13371336133E133C131848C65AA6
+38FE03F800FF7F00FE5B1A1C7F9B18>77 D<126012F0A37E1278A3127C123CA3123E121E
+A3121F7EA313801207A313C01203A413E01201A313F0120013600C24789F18>92
+D<13F8EA07FE487E381F0780EA3C03387801C0127012E0A2B5FCA2148000E0C7FCA21303
+3870078038780F00EA3FFE6C5AEA07F012147B9318>101 D E
+%EndDVIPSBitmapFont
+%DVIPSBitmapFont: Fe cmbx12 13.14 46
+/Fe 46 122 df<123C127E12FFA4127E123C08087C8711>46 D<131C133C13FC12FFA212
+00B3AA387FFFFCA216237CA21F>49 D<48B4FC000713C0381E07F0383803F8386001FC38
+7C00FE12FE14FF147FA2127C003813FFC7FC14FEA2EB01FC14F8EB03F0EB07E01480EB0F
+00131E5B1370EBE003EA01C038038007380700061206380FFFFE5A5A4813FCB5FCA21823
+7DA21F>I<48B4FC000713E0381E03F0383801F8003C13FC387E00FEA3123EEA1C010000
+13FCA2EB03F8EB07F0EB0FC03801FF00A2380007E0EB01F014F8EB00FC14FE14FFA21210
+127C12FEA214FEA2387C01FC007013F8383E07F0380FFFC00001130018237DA21F>I<14
+381478A214F81301130313071306130C131C13381330136013E0EA01C01380EA03005A12
+0E5A12185A12705AB612C0A2390001F800A790387FFFC0A21A237EA21F>I<0018130C00
+1F137CEBFFF814F014E014C01480EBFC000018C7FCA513FF001B13E0381F03F0381C00F8
+000813FCC7127EA3147FA2127812FCA3147E5A006013FC1270383801F8381E07E03807FF
+C03801FE0018237DA21F>I<EB1FC0EB7FF03801F0383803E00C3807803E000F137EEA1F
+005AA2007E133C1400A338FE3FC0EB7FF0EB80F800FF13FCEB007C147E5A147FA4127EA4
+003E137E123F6C137C380F80F83807C1F03803FFC038007F0018237DA21F>I<1230123C
+003FB512C0A215804814005C5C38600018A200E05B485B5CC6485AA249C7FC1306130EA2
+5BA2133CA25BA213F8A41201A66C5A13601A257DA41F>I<EBFF80000313E0380F01F838
+1C007C48133C141E1278A2127C127E387F803C13E0383FF878381FFDF0EBFFC07E000313
+E014F8000F13FCEA1E1F383C07FEEA7803EB00FF48133F141F140FA3140E1278141C6C13
+38381F80F03807FFE00001130018237DA21F>I<141CA2143EA3147FA24A7EA39038019F
+C0A29038031FE0140F01077FEB0607A2010C7F1403011C7FEB1801A2496C7EA2017FB5FC
+A29039E0007F8049133FA2484880151F00038190C7120FA2486E7ED8FFF090B51280A229
+257EA42E>65 D<B612E015FC3903F0007FED3F80ED1FC0ED0FE0A216F0A21507150FA216
+E0151F16C0ED7F80913801FE0090B512F815FF9039F0003FC0ED0FE0ED07F016F8150316
+FCA616F81507ED0FF0ED1FE0ED7FC0B7120015F826257EA42C>I<9138FF8008010FEBF0
+1890393FC03C789039FE0006F8D801F81303484813014848130048481478121F48481438
+A2007F151890C8FCA2481500A97E16187F123FA26C6C1430120F6C6C14606C6C14C06C6C
+EB0180D800FEEB070090383FC01E90380FFFF8010013C025257DA42C>I<B7FCA23903F8
+007FED0F8015071503A21501A3ED00C01406A21600A2140E141EEBFFFEA2EBF81E140E14
+06A21660A291C7FC16C0A415011503A2ED0F80153FB7FCA223257EA428>69
+D<B612FEA23803F800151F8181A281A3ED01801403A292C7FCA25C5C90B5FCA2EBF80F80
+80A491C8FCAAB512F0A221257EA427>I<B500E0B512E0A23B03F80003F800AF90B6FCA2
+9038F80003B0B500E0B512E0A22B257EA430>72 D<B512E0A23803F800B3AFB512E0A213
+257EA417>I<B539E007FF80A2D803F8C7EA780016605E4B5A0307C7FC150E15185D5D5D
+EC03804AC8FC140E141F4A7E147FECDFC09038FB8FE09038FF0FF0EBFC07496C7E816E7E
+1400157F82153F6F7E6F7E8215076F7E82B539E03FFFC0A22A257EA430>75
+D<B512F0A2D803F8C7FCB3A31503A31506A3150EA2151E153E157CEC03FCB6FCA220257E
+A425>I<D8FFF8EDFFF86D5C0003EEFE00017EEC037EA36D1406A26D6C130CA26D6C1318
+A26D6C1330A36D6C1360A26D6C13C0A2903900FC0180A291387E0300A3EC3F06A2EC1F8C
+A2EC0FD8A2EC07F0A36E5AEA07803CFFFC01C01FFFF8A235257EA43A>I<D8FFF8903807
+FFE07FD803FE9038003C006D14187F6D7E6D7E806D7E6D7E13036D7E6D7E80EC7F80EC3F
+C0141FEC0FE015F0EC07F8EC03FC1401EC00FE157F1698ED3FD8ED1FF8150F15071503A2
+150115001678486C1438D8FFFC1418A22B257EA430>I<B67E15F83903F801FEEC007F6F
+7E6F7EA282A55EA24B5A4BC7FCEC01FE90B512F815C09038F803F06E7E6E7E157EA2157F
+A482A31760ED3FC017C0ED1FE1B539E00FFF80923801FE002B257EA42E>82
+D<01FF1380000713E3380F80F7381E001F48130F481307140312F81401A27E91C7FCB4FC
+EA7FE013FE383FFFE014F86C13FE00077F6C1480C67E010313C0EB003FEC0FE01407A200
+C01303A315C07E6C13076C14806CEB0F0038FFC03E38E3FFF838803FE01B257DA422>I<
+007FB612F8A2397E00FE010078EC00780070153800601518A200E0151C160C5AA4C71400
+B3A390B512FEA226247EA32B>I<B539C001FFE0A2D807F8C7EA1C006C6C141816386C6C
+14306C6C5C16E06D6C5B6D6C485A1503D91FE090C7FC90380FF006150E903807F80C6D6C
+5A15386D6C5A903800FF6015E06E5A6E5AAE90380FFFFCA22B257FA42E>89
+D<EA07FF001F13E0383E03F0383F00F880147E121EC7FCA3EB1FFE3803FE7EEA0FC0EA1F
+00123E127E5AA314BEEA7E01383F073E391FFE1FE03807F00F1B187E971E>97
+D<EAFFC0A2120FACEBC1FCEBCFFF9038FC0FC09038F007E09038C003F0A2EC01F8A215FC
+A815F8A2EC03F013E09038F007E090381C1F80390E0FFF00380C03F81E267FA522>I<EB
+7FE03803FFF83807C07C381F80FC13005A007E1378140012FEA8127E127F6C130CEA1F80
+EBC0183807E0703803FFE038007F0016187E971B>I<ECFFC0A2140FAC137F3803FFCF38
+0FE0FF381F803F383F000FA2127EA212FEA8127EA27E141F381F803F380FC0EF3903FFCF
+FC3800FE0F1E267EA522>I<137F3803FFC03807C1F0380F80F8EA1F0048137C127E147E
+12FEA2B512FEA248C7FCA3127EA214067E6C130C380F80183807E0703803FFE038007F80
+17187E971C>I<EB1FC0EB7FF0EA01F83803E1F8120713C1380FC0F01400A7B5FCA2EA0F
+C0B3A2EAFFFEA215267EA513>I<3901FF07C00007EBDFE0380F83F1EA1F01393E00F800
+007E7FA6003E5B6C485A380F83E0EBFFC0001190C7FC0030C8FCA21238123C383FFFE06C
+13FC806C7F481480383C003F48EB0FC000F81307A4007CEB0F806CEB1F00381F807E3807
+FFF8C613C01B247E971F>I<EAFFC0A2120FAC14FE9038C3FF809038CE0FC013D89038D0
+07E013E0A213C0AF39FFFC7FFEA21F267EA522>I<120FEA1F80EA3FC0A4EA1F80EA0F00
+C7FCA7EA7FC0A2120FB3A2EAFFF8A20D277EA611>I<EAFFC0A2120FACEC1FF0A2EC0780
+EC0E005C14305CEBC1C0EBC38013C713DFEBFFC0EBE7E0EBC3F0138180EB80FC147E80A2
+EC1F80EC0FC039FFF83FF8A21D267FA520>107 D<EAFFC0A2120FB3B0EAFFFCA20E267E
+A511>I<26FF80FE137F903A83FF81FFC03B0F8E0FC707E0019813CC903A9007E803F001
+A013F0A201C013E0AF3BFFFC7FFE3FFFA230187E9733>I<38FF80FE903883FF80390F8E
+0FC0139890389007E013A0A213C0AF39FFFC7FFEA21F187E9722>I<EB7F803803FFF038
+07C0F8381F807E48487EA2007EEB1F80A200FE14C0A8007E1480A26CEB3F00A2381F807E
+6C6C5A3803FFF038007F801A187E971F>I<38FFC1FCEBCFFF390FFC1FC09038F007E001
+C013F0140315F8140115FCA8EC03F8A215F0EBE0079038F00FE09038DC1F809038CFFF00
+EBC3F801C0C7FCA9EAFFFCA21E237F9722>I<38FF83E0EB8FF8380F8C7CEB90FC13B013
+A01478EBE0005BAEEAFFFEA216187F9719>114 D<3807F8C0EA1FFFEA3C07EA7001EAF0
+00A300FC1300B47EEA7FFC7F383FFF80000F13C0120338001FE01303EAC001A212E014C0
+EAF00338FC078038EFFF00EAC3FC13187E9718>I<13C0A41201A312031207120F121FB5
+12C0A2380FC000AC1460A63807E0C013E13801FF8038007E0013237FA218>I<39FFC07F
+E0A2000F1307B0140FA200071317EBE0673903FFC7FE38007F071F187E9722>I<39FFF8
+0FF8A2390FC001C015803907E00300A26D5A00031306EBF80E0001130C13FC00005B13FE
+EB7E30A26D5AA214E06D5AA26D5AA26DC7FCA21D187F9720>I<39FFF83FF0A2390FC00F
+003807E00E6C6C5A6D5A6C6C5A00001360EB7EC06D5AA2131F6D7E497E80EB33F81361EB
+E0FC3801C07E3803807F3907003F8048131F39FFC07FF8A21D187F9720>120
+D<39FFF80FF8A2390FC001C015803907E00300A26D5A00031306EBF80E0001130C13FC00
+005B13FEEB7E30A26D5AA214E06D5AA26D5AA26DC7FCA21306A25B1230EA781CEAFC185B
+1370EA68E0EA7FC0001FC8FC1D237F9720>I E
+%EndDVIPSBitmapFont
+%DVIPSBitmapFont: Ff cmsl10 10.95 22
+/Ff 22 122 df<EB03E0EB1C181338EB703C13E014383801C000A5485A387FFFF0380380
+70A4380700E0A6380E01C0A6381C0380001E13C038FF0FF016207E9F19>12
+D<EAFFF0A20C027E8A0F>45 D<3A07FF803FE03A00F8001F000178130C5D4913205D5D4A
+C7FC1402140848485A5C146014F013E1EBE4F83803C878EBD07CEBE03CEBC03E141E141F
+48487E81140781140381380F00016D487E39FFF00FFE231F7E9E23>75
+D<EA07F8EA0C0CEA1E061307121C1200A313FFEA07C7EA1E07EA3C0E127800F01310A313
+1EEB2E2038784F40381F878014147D9317>97 D<13FEEA0383380E0780121C0038130090
+C7FC12785AA45AA37E5BEA70026C5AEA1C18EA07E011147D9314>99
+D<13F8EA070EEA0E07121C383803801278127012F0A2B5FC00F0C7FC5AA46C5AEA7002EA
+3004EA1C18EA07E011147D9314>101 D<EB07C0EB1C60EB30F01360EBE0E0EBC0001201
+A5485AEA3FFCEA0380A448C7FCA6120EA65A121EEAFFC014207F9F0E>I<140EEB3E11EB
+E1A33801C1C2380381E0EA07801301120FA3380703C01480EB8700EA04FC48C7FCA21218
+121CEA0FFF14C014E0381800F04813305A5AA3006013606C13C0381C0700EA07FC181F80
+9417>I<EA01C0EA03E0A213C0EA0180C7FCA6EA0380121F12071203A2EA0700A6120EA6
+5A121EEAFF800B1F7F9E0C>105 D<13E0120712011200A2485AA6485AEB81FCEB80F014
+C0EB81801400EA07045B13181338137C131C120E7FA2130F7F1480EA1C03381E07C038FF
+8FF016207E9F18>107 D<13E0120712011200A2EA01C0A6EA0380A6EA0700A6120EA65A
+121EEAFF800B207F9F0C>I<390387C07C391F9861863907A072073903C03403EB803800
+07EB7807EB0070A5000EEBE00EA64848485A001EEBE01E3AFFCFFCFFC022147E9326>I<
+38038F80381F90E0EA07A03803C0601380000713E01300A5380E01C0A6381C0380001E13
+C038FF8FF014147E9319>I<13FCEA0387380E0180381C00C04813E0A24813F012F0A438
+E001E0A214C0130300F0138038700700EA380E6C5AEA07E014147D9317>I<EBE3E03807
+EC383801F01C6C487E140F48487E1580A53903800F00A2140E141E141C5C38074070EB61
+C0011FC7FC90C8FCA3120EA4121EEAFFC0191D809319>I<EBFC2038038260EA0702381E
+01E0123C003813C0127812F0A438E00380A212F0A21307127038380F00EA1C37EA07C7EA
+0007A3130EA4131EEBFFC0131D7D9318>I<EA038E381FB380EA07C71203EB8300EA0780
+90C7FCA5120EA65A121EEAFFC011147E9312>I<EA01F9EA0607EA080312181301EA3802
+EA3C00121F13F0EA07FCEA01FEEA001FEA40071303A212601306EAF004EAC818EA87E010
+147F9312>I<1380EA0100A35A5A5A121EEAFFF8EA0E00A45AA65A1310A41320A2EA1840
+EA0F800D1C7C9B12>I<381C0380EAFC1FEA3C07EA1C03A238380700A6EA700EA4131EA2
+5BEA305E381F9F8011147B9319>I<381FF0FF3803C0780001137014403800E0C0EBE180
+EB73001376133CA2131C132E134E1387EA0107380203801204380C01C0383C03E038FE07
+FC18147F9318>120 D<390FF83F803901E00E00EBC00C140813E000005B143014205C13
+705CA20171C7FC1339133A133E133C133813181310A25BA25BEA70C0EAF08000F1C8FC12
+E61278191D809318>I E
+%EndDVIPSBitmapFont
+%DVIPSBitmapFont: Fg cmr8 8 41
+/Fg 41 124 df<126012F0A212701210A21220A21240A2040A7D960A>39
+D<EAFF80A2090280870C>45 D<1206120E12FE120EB1EAFFE00B157D9412>49
+D<13101338A3135CA3138EA3EA0107A238020380A33807FFC0EA0401A2380800E0A20018
+13F0123838FE03FE17177F961A>65 D<EAFFFE381C0380EB00E014601470A414E0EB01C0
+381FFF8014C0381C00E0147014301438A4147014E0EB01C0B5120015177F9619>I<EBFC
+1038038330380E00B0481370481330123000701310126012E01400A51410126012700030
+132012386C13406C138038038300EA00FC14177E9619>I<B5FC381C01C0EB00E0143014
+381418141C140C140EA7140C141CA2143814301460EB01C0B5120017177F961B>I<B512
+E0EA1C00146014201410A3EB0400A3130CEA1FFCEA1C0C13041408A2130014181410A214
+3014F0B5FC15177F9618>I<B512E0EA1C00146014201410A3EB0400A3130CEA1FFCEA1C
+0C1304A390C7FCA6EAFFC014177F9617>I<EA0FF8EA00E0B112E0A2EAC1C0EA6180EA1F
+000D177E9612>74 D<EAFFC0001CC7FCAD1420A31460A2144014C01303B5FC13177F9616
+>76 D<00FEEB03F8001E14C000171305A338138009A23811C011A33810E021A2EB7041A3
+EB3881A2EB1D01A2130EA2123839FE040FF81D177F9620>I<00FC13FE001E1338001F13
+101217EA1380EA11C0A2EA10E013701338A2131C130E130F1307EB0390EB01D0A2EB00F0
+14701430123800FE131017177F961A>I<EAFFFE381C0380EB00C014601470A4146014C0
+EB0380381FFE00001CC7FCAAB47E14177F9618>80 D<EAFFFC381C0380EB00C014E01470
+A414E014C0EB0380381FFE00381C0780EB01C0EB00E0A514E1A2147238FF803C18177F96
+1A>82 D<EA0FC4EA302CEA601CEA400CEAC004A3EAE0001270127FEA3FE0EA0FF8EA01FC
+EA001C130E13061280A3EAC004EAE008EAD810EA87E00F177E9614>I<387FFFF8386038
+1800401308A200801304A300001300AF3803FF8016177F9619>I<38FF80FE381C003814
+10B06C132012066C13403801818038007E0017177F961A>I<12FCA212C0B3AB12FCA206
+217D980A>91 D<EA3FC0EA70601330EA20381200EA03F8EA1E3812301270EAE039A21379
+EA70FFEA1F1E100E7F8D12>97 D<12F81238A8EA39F0EA3E0CEA380613077F1480A41400
+5B1306EA361CEA21F011177F9614>I<EA07F0EA18381230EA7010EA600012E0A41260EA
+70081230EA1830EA07C00D0E7F8D10>I<133E130EA8EA07CEEA1C3EEA300E1270126012
+E0A412601270EA301EEA182E3807CF8011177F9614>I<EA0FC0EA1860EA3030EA7038EA
+E018EAFFF8EAE000A31260EA7008EA3010EA1830EA07C00D0E7F8D10>I<EA03E0EA0670
+120EEA1C201300A5EAFF80EA1C00ACEA7F800C1780960B>I<EA0F9EEA18E3EA3060EA70
+70A3EA3060EA18C0EA2F80EA20001260EA3FE013F813FCEA600EEAC006A3EA600CEA3838
+EA0FE010157F8D12>I<1203EA0780A2EA0300C7FCA5EA1F801203AF1243EAE30012E712
+7C091D82960B>106 D<12F81238A8133E13381330134013801239EA3FC0EA39E0123813
+F01378133CA2EAFE7F10177F9613>I<12F81238B3A312FE07177F960A>I<EAF8F8EA3B1C
+EA3C0E1238AA38FE3F80110E7F8D14>110 D<EA07C0EA1830EA3018EA600CA2EAE00EA5
+EA701CEA3018EA1830EA07C00F0E7F8D12>I<EAF9F0EA3E1CEA380613077F1480A41400
+5B130EEA3E1CEA39F00038C7FCA512FE11147F8D14>I<EA07C2EA1C26EA381EEA700E12
+6012E0A412601270EA301EEA1C2EEA07CEEA000EA5EB3F8011147F8D13>I<EAF9E0EA3A
+70123CEA38201300A9B4FC0C0E7F8D0E>I<EA1F40EA60C0EAC040A2EAE000B4FCEA7F80
+EA1FC0EA01E0EA8060A212C0EAE0C0EA9F000B0E7F8D0E>I<1208A31218A21238EAFFC0
+EA3800A71340A4EA1C80EA0F000A147F930E>I<EAF83EEA380EAA131EEA1C2E3807CF80
+110E7F8D14>I<38FEFE7C383838381410133C001C1320134C381E4E60380ECE40138700
+0713801303A200031300EA0201160E7F8D19>119 D<EAFE3FEA3C1CEA1C10EA0E20EA07
+4013C0EA0380EA01C0EA02E0EA04F0EA0870EA1838EA383CEAFC7F100E7F8D13>I<EAFE
+1FEA380EEA3C0CEA1C08A2EA0E10A2EA0720A213E0EA03C0A2EA0180A21300A212E2A212
+A4127810147F8D13>I<B512801101808812>123 D E
+%EndDVIPSBitmapFont
+%DVIPSBitmapFont: Fh cmsy9 9 2
+/Fh 2 106 df<13801201EA0300A31206A25AA35AA35AA25AA35AA21260A37EA27EA37E
+A37EA27EA3EA0180120009267D9B0F>104 D<12C0A21260A37EA27EA37EA37EA27EA3EA
+0180A2EA0300A31206A25AA35AA35AA25AA35AA209267E9B0F>I
+E
+%EndDVIPSBitmapFont
+%DVIPSBitmapFont: Fi cmcsc10 10.95 8
+/Fi 8 118 df<EAFFF0EA0F00B3ABEAFFF00C1F7D9E12>73 D<EB1FE0EB70383801C00E
+48487E39070003804814C0001EEB01E048EB00F0A2007C14F8A20078147800F8147CA900
+781478007C14F8A2003C14F0003E1301001E14E06CEB03C06C148039038007003801E01E
+38007038EB1FE01E217C9F26>79 D<B512F0380F803E0007130FEC0780EC03C0A215E0A4
+15C0A2EC0780EC0F00143EEBFFF00180C7FCAD487EEAFFFC1B1F7D9E22>I<3803F02038
+0C0C60381803E0EA30005A146012E01420A36C13007E127CEA7F80EA3FFC6CB4FC000713
+80000113C038000FE013031301EB00F014707EA46C136014E06C13C038F8018038C60300
+EA81FC14217C9F1C>83 D<397FF807FE390FE001F0D807C013C06C6C6C5A000149C7FCEB
+F0023800F806EB78046D5AEB3E18EB1F106D5A14C0130713036D7E497EEB06F8EB0478EB
+087CEB183EEB101EEB201F496C7EEBC007496C7ED801007F486D7E481300391F8001F83A
+FFC007FF80211F7E9E25>88 D<EB7E083803819838070078000C1338001C13185A007813
+08127000F01300A5EB03FEEB00381270127812387E120C1207380380D838007F0817177E
+961D>103 D<38FC01FC381E007014201217EA1380A2EA11C0EA10E0A213701338A2131C
+130E1307A2EB03A0EB01E0A213001460123800FE132016177E961C>110
+D<38FF81FC381C00701420B0000C1340120E6C138038018300EA007C16177E961C>117
+D E
+%EndDVIPSBitmapFont
+%DVIPSBitmapFont: Fj cmbx12 17.28 18
+/Fj 18 117 df<EB01C01303130F137FEA1FFFB5FC13BFEAE03F1200B3B1007FB512F0A3
+1C2E7AAD28>49 D<913A03FF800180023FEBF00349B5EAFC0701079038003F0FD91FF8EB
+079FD93FC0EB01FFD9FF807F4848C8127F4848153F0007161F49150F485A001F1607A248
+5A1703127FA24992C7FCA212FFA9127FA27FEF0380123FA26C7E1707000F17006C7E6D15
+0E0003161E6C6C151C6C6C6C1478D93FC05CD91FF8EB03E0D907FFEB3F800101D9FFFEC7
+FCD9003F13F80203138031317CB03A>67 D<B812F0A3C6903880003FEE07F816031600A2
+1778A21738A3171C1507A31700A25D5D5D91B5FCA3EC803F818181A21707A392C7120EA4
+171EA2173CA2177C17FC16011607163FB812F8A330317EB035>69
+D<B67EA3000190C9FCB3A9EE0380A416071700A25EA35E5E5E5E4B5A150FB7FCA329317D
+B030>76 D<007FB8FCA39039C00FF801D87E00EC003F007C82007882A200708200F01780
+A3481603A5C792C7FCB3AA017FB6FCA331307DAF38>84 D<EBFFF0000313FF390F803F80
+9038C00FE0486C6C7EA26E7ED80FC07FEA0780C7FCA414FF131FEBFFE33803FC03EA0FF0
+EA1FC0123FEA7F80A2EAFF00A31407A2387F800D393FC01DFE3A1FE078FFF03907FFE07F
+C6EB803F24207E9F27>97 D<EA01F812FFA3120F1207ADEC3FE0ECFFFC9038FBE07F9039
+FF001F8049EB0FC04914E049EB07F016F8A2ED03FCA316FEA816FCA3ED07F8A216F06DEB
+0FE06D14C001E7EB3F809039C3C0FE00903880FFF89038003FC027327EB12D>I<ED0FC0
+EC07FFA3EC007F153FADEB07F8EB3FFF9038FE07BF3903F801FF3907E0007F120F484813
+3F123FA2485AA312FFA8127FA36C7EA2121F6C6C137F000714FF2603F00313E03A01FC0F
+3FFE38007FFEEB0FF027327DB12D>100 D<EB0FFC90387FFF803901FC0FC03903F003E0
+3907E001F0000F14F8391FC000FC003F14FEA24848137E157FA212FFA290B6FCA20180C7
+FCA4127FA36C6C1307121F150E6C7E6C6C131C6C6C13783900FE03E090383FFFC0903807
+FE0020207E9F25>I<EB01FE90380FFF8090381FC3C090387F07E09038FE0FF0120113FC
+1203EC07E0EC018091C7FCA8B512FCA3D803FCC7FCB3A8387FFFF0A31C327EB119>I<90
+391FF007C09039FFFE3FE03A01F83F79F03907E00FC3000F14E19039C007E0E0001FECF0
+00A2003F80A5001F5CA2000F5CEBE00F00075C2603F83FC7FC3806FFFE380E1FF090C9FC
+121EA2121F7F90B57E6C14F015FC6C806C801680000F15C0003FC7127F007EEC1FE0007C
+140F00FC1407A4007EEC0FC0003E1580003F141FD80FC0EB7E003907F803FC0001B512F0
+D8001F90C7FC242F7E9F28>I<EA03C0487E487E487EA46C5A6C5A6C5AC8FCA9EA01F812
+7FA31207B3A7B51280A311337DB217>105 D<EA01F812FFA3120F1207B3B3A6B512C0A3
+12327DB117>108 D<2703F007F8EB1FE000FFD93FFEEBFFF8913A783F01E0FC02C09038
+8300FE280FF1801FC6137F2607F30013CC01F602F8148001FC5CA3495CB3B500C3B5380F
+FFFCA33E207D9F43>I<3903F007F800FFEB3FFEEC783F02C013803A0FF1801FC03807F3
+0001F614E013FCA35BB3B500C3B5FCA328207D9F2D>I<EB07FC90387FFFC03901FC07F0
+3903F001F848486C7E4848137E001F147F003F158049133F007F15C0A300FF15E0A8007F
+15C0A36C6CEB7F80A2001F15006C6C13FE00075C3903F803F83901FE0FF039007FFFC0D9
+07FCC7FC23207E9F28>I<3801FF86000713FEEA1F00003C133E48131E140E12F8A36C90
+C7FCB47E13FC387FFFC06C13F0806C7F00077F00017FEA003F01001380143F0060131F00
+E0130FA27E15007E6C131E6C131C38FF807838F3FFF038C07F8019207D9F20>115
+D<131CA5133CA3137CA213FC120112031207381FFFFEB5FCA2D803FCC7FCB0EC0380A712
+01EC0700EA00FEEB7F0EEB3FFCEB07F0192E7FAD1F>I E
+%EndDVIPSBitmapFont
+%DVIPSBitmapFont: Fk cmsy10 10.95 1
+/Fk 1 14 df<14FF010713E090381F00F80178131E01E01307D80180EB018048C812C000
+061560481530A248151848150CA2481506A4481503A900601506A46C150CA26C15186C15
+30A26C15606C15C06C6CEB0180D800E0EB07000178131E011F13F8903807FFE0010090C7
+FC282B7EA02D>13 D E
+%EndDVIPSBitmapFont
+%DVIPSBitmapFont: Fl cmbx12 14.4 39
+/Fl 39 122 df<123C127FEAFF80A213C0A3127F123E1200A2EA0180A3EA0300A2120612
+0E5A5A12100A157B8813>44 D<121C127FA2EAFF80A3EA7F00A2121C09097B8813>46
+D<130E131E137EEA07FE12FFA212F81200B3ABB512FEA317277BA622>49
+D<EBFF80000713F04813FC381E03FE393800FF80007C133F00FE14C06C131F15E0140FA2
+127E003C131FC7FC15C0A2EC3F801500147E5C5C495A495AEB078049C7FC131E4913E013
+705B3901C001C0EA0380EA0600000FB5FC5A5A5AB61280A31B277DA622>I<EB7F803803
+FFF04813FC380F81FE381F007FEA3F80EC3F80A3121F1300C7EA7F00A2147E5C495AEB07
+F0EBFFC0A2EB01F8EB007E801580EC1FC0A215E0A2123C127EB4FCA215C0143F48148000
+7CEB7F00383F01FE6CB45A000713F0C613801B277DA622>I<140FA25C5C5C5C5BA2EB03
+BFEB073F130E131C133C1338137013E0EA01C0EA038012071300120E5A5A5A12F0B612F8
+A3C7EA7F00A890381FFFF8A31D277EA622>I<00181303381F801FEBFFFE5C5C5C14C091
+C7FC001CC8FCA7EB7FC0381DFFF8381F80FC381E003F1208C7EA1F8015C0A215E0A21218
+127C12FEA315C05A0078EB3F80A26CEB7F00381F01FE6CB45A000313F0C613801B277DA6
+22>I<B612F815FF16C03A03F8001FE0ED0FF0ED07F8150316FCA21501A3150316F8A2ED
+07F0150FED1FC0EDFF8090B5EAFE00EDFFC09039F8000FF0ED03F8ED01FC16FE1500A216
+FFA616FE1501ED03FC1507ED1FF8B712E016C0EDFE0028297DA830>66
+D<91387FE003903907FFFC07011FEBFF0F90397FF00F9F9039FF0001FFD801FC7F484814
+7F4848143F4848141F485A160F485A1607127FA290C9FC5AA97E7F1607123FA26C7E160E
+6C7E6C6C141C6C6C143C6C6C14786CB4EB01F090397FF007C0011FB512800107EBFE0090
+38007FF028297CA831>I<B712E0A33903FC001FED07F01501A215001670A3913801C078
+1638A302031300A2140F90B5FCA3EBFC0F1403A20201130EA3161C91C7FCA3163C163816
+7816F815011503151FB712F0A327297EA82C>69 D<B712C0A33903FC003FED0FE0150315
+01A21500A316F0913801C070A316001403A2140F90B5FCA3EBFC0F1403A21401A491C8FC
+A9B512FCA324297EA82A>I<B512F0A33803FC00B3B1B512F0A314297EA819>73
+D<B512FCA3D803FCC8FCB3A3ED01C0A415031680A21507A2150FA2151F157F913801FF00
+B7FCA322297EA828>76 D<D8FFFE92383FFF80A26D5D0003EFE000A2D9BF8014EFA2D99F
+C0EB01CFA2D98FE0EB038FA3D987F0EB070FA2D983F8130EA2D981FC131CA3D980FE1338
+A2027F1370A291383F80E0A391381FC1C0A291380FE380A2913807F700A3EC03FEA26E5A
+A26E5AD8FFFE0203B51280A2157039297DA840>I<B612E015FE6F7E3A03FC003FE0ED0F
+F06F7E6F7E150182A65E4B5A1507ED0FE0ED3FC090B500FEC7FCA29039FC00FF80ED3FC0
+6F7E6F7E6F7EA9170EA21503923801FC1CB538F000FEEE7FF8EE0FE02F297EA832>82
+D<9038FF80600003EBF0E0000F13F8381F80FD383F001F003E1307481303A200FC1301A2
+14007EA26C140013C0EA7FFCEBFFE06C13F86C13FE80000714806C14C0C6FC010F13E0EB
+007FEC1FF0140F140700E01303A46C14E0A26C13076C14C0B4EB0F80EBE03F39E3FFFE00
+00E15B38C01FF01C297CA825>I<B500F0EBFFFEA3D803FCC7EA0380B3AA0001ED07007F
+0000150E137F6D143CD91FC05B90390FF003F06DB55A01001480DA1FFCC7FC2F297EA834
+>85 D<B53CE07FFFE01FFFC0A32803FC0003FCC7EA7000A26D6D7E000160A26D6E13016C
+604B138002801503017F5F4B13C0D93FC0013F49C7FCA2913AE00E1FE00F011F160E17F0
+9126F01C0F131E010F161C033C13F8902707F838075BA2037813FC902703FC70035BA291
+3AFEE001FEF001015E02FF14FF4B7E6D5EA26E486D5AA36EC76CC8FCA2023E80021E141E
+A242297FA845>87 D<3803FF80000F13F0381F01FC383F80FE147F801580EA1F00C7FCA4
+EB3FFF3801FC3FEA0FE0EA1F80EA3F00127E5AA4145F007E13DF393F839FFC381FFE0F38
+03FC031E1B7E9A21>97 D<EAFFE0A3120FACEBE1FE9038EFFF809038FE07E09038F803F0
+9038F001F89038E000FCA2157EA2157FA8157EA315FCA29038F001F89038F803F090389C
+0FE090380FFF80390E01FC00202A7EA925>I<EB3FF03801FFFC3803F03E380FC07FEA1F
+80EA3F00A248133E007E90C7FCA212FEA7127EA2127F6CEB03801380001FEB0700380FE0
+0E3803F83C3801FFF838003FC0191B7E9A1E>I<EC7FF0A31407ACEB3F873801FFF73807
+F03F380FC00F381F8007EA3F00A2127EA312FEA8127EA27EA2381F800F380FC01F3907E0
+7FFF3801FFE738007F87202A7EA925>I<EB3FC03801FFF03803E07C380F803E001F7F13
+0048EB0F80127E15C0A200FE1307A2B6FCA248C8FCA3127EA2127F6CEB01C07E390F8003
+803907C007003803F01E3800FFFCEB3FE01A1B7E9A1F>I<EB07F8EB3FFCEB7E3E3801FC
+7FEA03F813F01207143E1400A7B512C0A33807F000B3A3387FFF80A3182A7EA915>I<90
+38FF80F00003EBE3F8390FC1FE1C391F007C7C48137E003EEB3E10007EEB3F00A6003E13
+3E003F137E6C137C380FC1F8380BFFE00018138090C8FC1238A2123C383FFFF814FF6C14
+C06C14E06C14F0121F383C0007007CEB01F8481300A4007CEB01F0A2003FEB07E0390FC0
+1F806CB5120038007FF01E287E9A22>I<EAFFE0A3120FAC147E9038E1FF809038E30FC0
+01E413E0EBE80701F813F013F0A213E0B039FFFE3FFFA3202A7DA925>I<1207EA0F80EA
+1FC0EA3FE0A3EA1FC0EA0F80EA0700C7FCA7EAFFE0A3120FB3A3EAFFFEA30F2B7EAA12>
+I<EAFFE0A3120FB3B2EAFFFEA30F2A7EA912>108 D<26FFC07FEB1FC0903AC1FFC07FF0
+903AC307E0C1F8D80FC49038F101FC9039C803F20001D801FE7F01D05BA201E05BB03CFF
+FE3FFF8FFFE0A3331B7D9A38>I<38FFC07E9038C1FF809038C30FC0D80FC413E0EBC807
+01D813F013D0A213E0B039FFFE3FFFA3201B7D9A25>I<EB3FE03801FFFC3803F07E390F
+C01F80391F800FC0393F0007E0A2007EEB03F0A300FE14F8A8007E14F0A26CEB07E0A239
+1F800FC0390FC01F803907F07F003801FFFC38003FE01D1B7E9A22>I<38FFC1F0EBC7FC
+EBC63E380FCC7F13D813D0A2EBF03EEBE000B0B5FCA3181B7F9A1B>114
+D<3803FE30380FFFF0EA3E03EA7800127000F01370A27E00FE1300EAFFE06CB4FC14C06C
+13E06C13F0000713F8C6FCEB07FC130000E0137C143C7E14387E6C137038FF01E038E7FF
+C000C11300161B7E9A1B>I<13E0A41201A31203A21207120F381FFFE0B5FCA2380FE000
+AD1470A73807F0E0000313C03801FF8038007F0014267FA51A>I<39FFE07FF0A3000F13
+07B2140FA2000713173903F067FF3801FFC738007F87201B7D9A25>I<39FFFC03FFA339
+0FF000F0000714E07F0003EB01C0A2EBFC0300011480EBFE070000140013FFEB7F0EA214
+9EEB3F9C14FC6D5AA26D5AA36D5AA26D5AA2201B7F9A23>I<3BFFFC7FFC1FFCA33B0FE0
+0FE001C02607F007EB0380A201F8EBF00700031600EC0FF801FC5C0001150EEC1FFC2600
+FE1C5B15FE9039FF387E3C017F1438EC787F6D486C5A16F0ECE01F011F5CA26D486C5AA2
+EC800701075CA22E1B7F9A31>I<39FFFC1FFEA33907F003803803F8079038FC0F003801
+FE1E00005BEB7F3814F86D5A6D5A130F806D7E130F497EEB3CFEEB38FFEB787F9038F03F
+803901E01FC0D803C013E0EB800F39FFF03FFFA3201B7F9A23>I<39FFFC03FFA3390FF0
+00F0000714E07F0003EB01C0A2EBFC0300011480EBFE070000140013FFEB7F0EA2149EEB
+3F9C14FC6D5AA26D5AA36D5AA26D5AA25CA21307003890C7FCEA7C0FEAFE0E131E131C5B
+EA74F0EA3FE0EA0F8020277F9A23>I E
+%EndDVIPSBitmapFont
+%DVIPSBitmapFont: Fm cmtt10 10.95 77
+/Fm 77 127 df<127012F8B012701200A5127012F8A31270051C779B18>33
+D<EA4010EAE038EAF078EAE038AAEA60300D0E7B9C18>I<EA0306EA078FA6387FFFC0B5
+12E0A26C13C0380F1E00A6387FFFC0B512E0A26C13C0381E3C00A6EA0C18131C7E9B18>
+I<13C01201A3EA03F0EA0FFCEA3FFEEA7DCFEA71C738E1C38013C7A338F1C0001279123F
+6C7EEA0FF8EA01FC13DE13CF13C73861C38012F1A212E1EBC7001271EA79DEEA3FFEEA1F
+F8EA07E0EA01C0A3120011247D9F18>I<1238127CA2127E123E120EA3121CA2123812F8
+12F012C0070E789B18>39 D<137013F0EA01E0EA03C0EA0780EA0F00121E121C5AA25AA4
+5AA81270A47EA27E121E7EEA0780EA03C0EA01F0120013700C24799F18>I<126012F012
+787E7E7EEA07801203EA01C0A2EA00E0A41370A813E0A4EA01C0A2EA03801207EA0F0012
+1E5A5A5A12600C247C9F18>I<EA01C0A4EA41C138F1C780EAFDDF387FFF00EA1FFCEA07
+F0A2EA1FFCEA7FFF38FDDF80EAF1C73841C100EA01C0A411147D9718>I<121C123E127E
+127F123F121F1207120E121E127C12F81260080C788518>44 D<387FFFC0B512E0A26C13
+C013047E8F18>I<1230127812FCA2127812300606778518>I<1303EB0780A2130F14005B
+131EA2133E133C137C1378A213F85B12015B12035BA212075B120F90C7FCA25A121E123E
+123CA2127C127812F85AA2126011247D9F18>I<EA01F0EA07FC487EEA1F1FEA1C073838
+0380007813C0EA7001A238E000E0A9EAF001007013C0A2EA780300381380381C0700EA1F
+1FEA0FFE6C5AEA01F0131C7E9B18>I<EA01801203A21207120F123F12FF12FB12431203
+B0EA7FFCEAFFFEEA7FFC0F1C7B9B18>I<383FFF80A30038C7FCA8EA3BF8EA3FFE7F383C
+0780383003C0EA0001EB00E0A2126012F0A238E001C0EA7003387C0F80383FFF00EA1FFC
+EA03F0131C7E9B18>53 D<12E0B512E0A214C038E00380EB0700C65A131E131C5BA25B13
+F05BA2485AA3485AA448C7FCA7131D7E9C18>55 D<EA03F8EA0FFE487E383E0F80EA3803
+387001C0A438380380EA3C07381FFF00EA07FC487EEA1F1F383C0780387001C000F013E0
+EAE000A4387001C0EA7803383E0F80381FFF006C5AEA03F8131C7E9B18>I<1230127812
+FCA2127812301200A81230127812FCA2127812300614779318>58
+D<14C0EB03E01307EB1FC0EB3F80EBFE00485AEA07F0485AEA3F8048C7FC12FCA2127F6C
+7EEA0FE06C7EEA01FC6C7EEB3F80EB1FC0EB07E01303EB00C013187E9918>60
+D<387FFFC0B512E0A26C13C0C8FCA4387FFFC0B512E0A26C13C0130C7E9318>I<126012
+F87E127F6C7EEA0FE06C7EEA01FC6C7EEB3F80EB1FC0EB07E0A2EB1FC0EB3F80EBFE0048
+5AEA07F0485AEA3F8048C7FC12FC5A126013187E9918>I<EA0FF0EA3FFC48B4FCEA700F
+38F00380A2EA600738000F00133E5BEA01F05B485AA55BC8FCA5EA0380487EA36C5A111C
+7D9B18>I<137CEA01FEEA07FF380F8780381E03C0EA3C1DEA387F3870FFE0EA71E313C1
+12E1EAE380A638E1C1C0127113E33870FF8038387F00EA3C1C381E00E0EA0F833807FFC0
+0001138038007E00131C7E9B18>I<137013F8A213D8A2EA01DCA3138CEA038EA4EA0707
+A5380FFF80A3EA0E03381C01C0A3387F07F000FF13F8007F13F0151C7F9B18>I<EA7FFC
+B5FC6C1380381C03C01301EB00E0A4130114C01307381FFF80140014C0EA1C03EB00E014
+F01470A414F014E01303387FFFC0B51280387FFE00141C7F9B18>I<EBF8E0EA03FEEA07
+FFEA0F07EA1E03EA3C01EA38005AA214005AA8127014E0A27E123C381E01C0EA0F073807
+FF803803FE00EA00F8131C7E9B18>I<EA7FF8EAFFFE6C7E381C0F80EB03C0A2EB01E013
+00A214F01470A814F014E0A2130114C01303EB0F80387FFF00485AEA7FF8141C7F9B18>
+I<B512F0A3381C0070A41400A2130EA3EA1FFEA3EA1C0EA390C7FCA21438A5B512F8A315
+1C7F9B18>I<B512F8A3381C0038A41400A21307A3EA1FFFA3EA1C07A390C7FCA7EAFFC0
+A3151C7F9B18>I<3801F1C0EA03FDEA0FFFEA1F0FEA1C03123813011270A290C7FC5AA5
+EB0FF0131F130F387001C0A213031238A2EA1C07EA1F0FEA0FFFEA03FDEA01F1141C7E9B
+18>I<387F07F038FF8FF8387F07F0381C01C0A9EA1FFFA3EA1C01AA387F07F038FF8FF8
+387F07F0151C7F9B18>I<EA7FFFB512806C1300EA01C0B3A4EA7FFFB512806C1300111C
+7D9B18>I<387F07F038FF87F8387F07F0381C03C0EB07801400130E131E5B13385B13F0
+121DA2EA1FB8A2131C121EEA1C0EA27FA2EB0380A2EB01C0387F03F038FF87F8387F03F0
+151C7F9B18>75 D<EAFFC0A3001CC7FCB114E0A5B5FCA3131C7E9B18>I<38FC01F8EAFE
+03A2383B06E0A4138EA2EA398CA213DCA3EA38D8A213F81370A21300A638FE03F8A3151C
+7F9B18>I<387E07F038FF0FF8387F07F0381D81C0A313C1121CA213E1A313611371A213
+311339A31319A2131D130DA3EA7F07EAFF87EA7F03151C7F9B18>I<EA0FFE383FFF8048
+13C0EA7803EA700100F013E0EAE000B0EAF001007013C0EA7C07EA7FFF6C1380380FFE00
+131C7E9B18>I<EAFFFEEBFF8014C0EA1C03EB01E013001470A514E01301EB03C0EA1FFF
+1480EBFE00001CC7FCA8B47EA3141C7F9B18>I<EA0FFE383FFF804813C0EA7803EA7001
+00F013E0EAE000AE1370A2EAF079387039C0EA783FEA7FFF6C1380380FFE00EA000FEB07
+80A2EB03C01301A213227E9B18>I<EA7FF8EAFFFE6C7E381C0F80130314C01301A31303
+1480130F381FFF005BA2EA1C0F7FEB0380A5149CA3387F01F8EAFF81387F00F0161C7F9B
+18>I<3803F1C0EA1FFF5AEA7C0FEA7003EAE001A390C7FC12701278123FEA1FF0EA07FE
+C67EEB0F80EB03C01301EB00E0A2126012E0130100F013C038F80780B5FCEBFE00EAE7F8
+131C7E9B18>I<387FFFF8B5FCA238E07038A400001300B2EA07FFA3151C7F9B18>I<38FF
+83FEA3381C0070B36C13E0EA0F01380783C03803FF806C1300EA007C171C809B18>I<38
+FE03F8EAFF07EAFE03381C01C0EA1E03000E1380EA0F0700071300A2EA038EA2EA01DCA3
+EA00F8A21370A9EA01FC487E6C5A151C7F9B18>89 D<EAFFF8A3EAE000B3ACEAFFF8A30D
+24779F18>91 D<126012F0A27E1278127C123CA2123E121E121F7EA27F12077F1203A27F
+12017F12007F1378A2137C133C133E131EA2131F7F14801307A2EB030011247D9F18>I<
+EAFFF8A3EA0038B3ACEAFFF8A30D247F9F18>I<387FFFC0B512E0A26C13C013047E7F18>
+95 D<EA0FF0EA1FFC487EEA3C0FEA180738000380A213FF1207121FEA7F03127812E0A3
+EAF007EA780F383FFFF8EA1FFDEA07F015147E9318>97 D<127E12FE127E120EA5133EEB
+FF80000F13C0EBC1E01380EB0070120E1438A6000F1370A2EB80E013C1EBFFC0000E1380
+38063E00151C809B18>I<EA01FEEA07FF001F1380EA3E073838030048C7FCA25AA61270
+EB01C01238EA3E03381FFF8000071300EA01FC12147D9318>I<EB1F80133F131F1303A5
+EA03E3EA0FFBEA1FFFEA3C1FEA380FEA7007130312E0A6EA7007A2EA380FEA3C1F381FFF
+F0380FFBF83803E3F0151C7E9B18>I<EA01F0EA07FCEA1FFEEA3E0F38380780EA7003A2
+38E001C0A2B5FCA300E0C7FC1270EB01C01238EA3E07381FFF8000071300EA01F812147D
+9318>I<EB1F80EB7FC0EBFFE013E13801C0C01400A3387FFFC0B5FCA23801C000AEEA7F
+FFA3131C7F9B18>I<3801E1F03807FFF85A381E1E30381C0E00487EA5EA1C0EEA1E1EEA
+1FFC5BEA39E00038C7FC7EEA1FFEEBFFC04813E0387801F038700070481338A4007813F0
+EA7E03381FFFC06C13803801FC00151F7F9318>I<127E12FE127E120EA5133EEBFF8000
+0F13C013C1EB80E01300120EAB387FC7FC38FFE7FE387FC7FC171C809B18>I<EA0380EA
+07C0A3EA0380C7FCA4EA7FC012FF127F1201AEB5FCA3101D7C9C18>I<1338137CA31338
+1300A4EA0FFCA3EA001CB3A4EA6038EAF078EAFFF0EA7FE0EA3F800E277E9C18>I<127E
+12FE127E120EA5EB3FF0A3EB0780EB0F00131E5B5B5BEA0FF87F139C130EEA0E0F7FEB03
+8014C0387FC7F812FF127F151C7F9B18>I<EAFFC0A31201B3A4B51280A3111C7D9B18>I<
+38F9C1C038FFF7F013FF383E3E38EA3C3CA2EA3838AB38FE3E3EEB7E7EEB3E3E17148093
+18>I<EA7E3E38FEFF80007F13C0EA0FC1EB80E01300120EAB387FC7FC38FFE7FE387FC7
+FC1714809318>I<EA01F0EA0FFE487E383E0F80EA3803387001C0A238E000E0A5EAF001
+007013C0EA7803383C0780EA3E0F381FFF006C5AEA01F013147E9318>I<EA7E3E38FEFF
+80007F13C0380FC1E01380EB0070120E1438A6000F1370A2EB80E013C1EBFFC0000E1380
+EB3E0090C7FCA7EA7FC0487E6C5A151E809318>I<3801F380EA07FBEA1FFFEA3E1FEA38
+0FEA7007A2EAE003A6EA7007A2EA380FEA3C1FEA1FFFEA0FFBEA03E3EA0003A7EB1FF0EB
+3FF8EB1FF0151E7E9318>I<38FF0FC0EB3FE0EB7FF0EA07F0EBE060EBC0005BA290C7FC
+A9EAFFFC7F5B14147E9318>I<EA07F7EA3FFF5AEA780FEAE007A3007CC7FCEA7FE0EA1F
+FCEA03FEEA001F38600780EAE003A212F038F80F00B5FC13FCEAE7F011147D9318>I<48
+7E1203A4387FFFC0B5FCA238038000A9144014E0A33801C1C013FF6C1380EB3E0013197F
+9818>I<387E07E0EAFE0FEA7E07EA0E00AC1301EA0F033807FFFC6C13FE3801FCFC1714
+809318>I<387F8FF000FF13F8007F13F0381C01C0380E0380A338070700A3138FEA038E
+A3EA01DCA3EA00F8A2137015147F9318>I<38FF07F8138F1307383800E0A4381C01C013
+7113F9A213D9EA1DDD000D1380A3138DEA0F8FA23807070015147F9318>I<387F8FF013
+9F138F380F0700EA078EEA039EEA01DC13F81200137013F07FEA01DCEA039E138EEA0707
+000E1380387F8FF000FF13F8007F13F015147F9318>I<387F8FF000FF13F8007F13F038
+0E01C0EB0380A21207EB0700A2EA0387A2138EEA01CEA213CC120013DC1378A31370A313
+F05B1279EA7BC0EA7F806CC7FC121E151E7F9318>I<383FFFF05AA2387001E0EB03C0EB
+078038000F00131E5B13F8485AEA03C0485A380F0070121E5A5AB512F0A314147F9318>
+I<EB07E0131F137FEB780013E0AB1201EA7FC0485AA26C7EEA01E01200AB1378EB7FE013
+1F130713247E9F18>I<127CB4FC13C01203C67EAB7FEB7FC0EB3FE0A2EB7FC0EBF0005B
+ABEA03C012FF90C7FC127C13247E9F18>125 D<EA060CEA1F1EEA3FBEEAFBF8EAF1F0EA
+60C00F067C9B18>I E
+%EndDVIPSBitmapFont
+%DVIPSBitmapFont: Fn cmr10 10.95 72
+/Fn 72 123 df<90381F83E09038F06E303901C07878380380F8903800F03048EB7000A7
+B612803907007000B2383FE3FF1D20809F1B>11 D<133FEBE0C0EA01C0380381E0EA0701
+A290C7FCA6B512E0EA0700B2383FC3FC1620809F19>I<127012F812FCA212741204A312
+08A21210A212201240060E7C9F0D>39 D<13401380EA01005A12061204120C5AA2123812
+30A212701260A412E0AC1260A412701230A212381218A27E120412067E7EEA008013400A
+2E7BA112>I<7E12407E12307E1208120C7EA212077EA213801201A413C0AC1380A41203
+1300A25A1206A25A120812185A12205A5A0A2E7EA112>I<127012F012F8A212781208A3
+1210A31220A21240050E7C840D>44 D<EAFFF0A20C02808A0F>I<127012F8A312700505
+7C840D>I<EA03F0EA0E1C487EEA1806EA380738700380A400F013C0AD00701380A3EA78
+0700381300EA1806EA1C0E6C5AEA03F0121F7E9D17>48 D<13801203120F12F31203B3A6
+EA07C0EAFFFE0F1E7C9D17>I<EA03F0EA0C1CEA100E487E00401380128000F013C0EAF8
+03A3EA200712001480A2EB0F00130E5B5B5B13605B485A48C7FC000613405A5A00101380
+EA3FFF5AB5FC121E7E9D17>I<EA03F0EA0C1CEA100EEA200F007813801307A2EA380F12
+001400A2131E131C1370EA07F0EA003C130E130FEB0780A214C0122012F8A300F0138012
+40EB0F00EA200EEA183CEA07F0121F7E9D17>I<1306A2130EA2131E132EA2134E138EA2
+EA010E1202A212041208A212101220A2124012C0B512F038000E00A7EBFFE0141E7F9D17
+>I<EA1803EA1FFE5B5B13E00010C7FCA6EA11F0EA161CEA180EEA10071480EA0003A214
+C0A3127012F0A200E013801240EB0700EA20066C5AEA0838EA07E0121F7E9D17>I<137C
+EA0182EA0701380E0380EA0C0712183838030090C7FC12781270A2EAF1F0EAF21CEAF406
+EAF807EB0380A200F013C0A51270A214801238EB07001218EA0C0E6C5AEA01F0121F7E9D
+17>I<1240387FFFE014C0A23840008038800100A21302485AA25B5BA25BA21360A213E0
+5B1201A41203A76C5A131F7E9D17>I<EA03F0EA0C0CEA1006EA3003382001801260A312
+7038780300123EEA3F06EA1FC8EA0FF0EA03F8487EEA0C7EEA103F38300F80EA6007EB01
+C012C01300A31480EA600100201300EA1002EA0C0CEA03F0121F7E9D17>I<EA03F0EA0E
+18487E487E13071270EB038012F0A214C0A5EA7007A21238EA180BEA0E13EA03E3380003
+80A3EB07001230EA7806130EEA700CEA2018EA1070EA0FC0121F7E9D17>I<127012F8A3
+12701200AA127012F8A3127005147C930D>I<127012F8A312701200AA127012F012F8A2
+12781208A31210A31220A21240051D7C930D>I<5B497EA3497EA3EB09E0A3EB10F0A3EB
+2078A3497EA2EBC03EEB801EA248B5FCEB000FA20002EB0780A348EB03C0A2120C001E14
+E039FF801FFE1F207F9F22>65 D<B512E0380F0078141EA2801580A515005C141E147CEB
+FFF0EB007C141FEC0F80EC07C0140315E0A515C014071580EC0F00143EB512F01B1F7E9E
+20>I<90380FE0109038381C309038E002703803C00139078000F048C71270121E15305A
+1510127C127800F81400A91278007C1410123CA26C1420A27E6C6C13406C6C13803900E0
+0300EB380CEB0FF01C217E9F21>I<B512F83807801EEC0780EC03C0EC01E0EC00F01570
+1578A2153CA3153EA8153CA2157C1578A215F0EC01E0EC03C0EC0780EC1E00B512F81F1F
+7F9E23>I<B61280380F000F14031401140015C01540A314401500A214C0130113FF1301
+13001440A3EC0020A31540A315C01401EC0380140FB6FC1B1F7E9E1F>I<B61280380780
+071401A2140015C01540A4EC2000A3146014E013FF138014601420A391C7FCA87FEAFFFE
+1A1F7F9E1E>I<90380FE0109038381C309038E002703803C00139078000F048C7127012
+1E15305A1510127C127800F81400A7EC3FFEEC01F000781300127C123CA27EA27E6C7E39
+03C001703900E002309038380C1090380FF0001F217E9F24>I<39FFF07FF8390F000780
+AD90B5FCEB0007AF39FFF07FF81D1F7E9E22>I<EAFFF0EA0F00B3ABEAFFF00C1F7E9E10>
+I<3807FFC038003E00131EB3A3122012F8A3EAF01CEA403CEA6038EA1070EA0FC012207F
+9E17>I<39FFF007FC390F0003E0EC0180150014025C5C5C5C5C5C49C7FC5B497E130FEB
+13C0EB21E01341EB80F0EB0078A28080A280EC0780A2EC03C015E015F039FFF01FFE1F1F
+7E9E23>I<EAFFF8EA0F8090C7FCB21402A414061404A2140C141C147CB512FC171F7E9E
+1C>I<B46CEB07FE000715C0A2D805C0130BA2D804E01313A301701323A26D1343A36D13
+83A290380E0103A3EB0702A3EB0384A2EB01C8A3EB00F0A21460121FD8FFE0EB7FFE271F
+7F9E2A>I<B4EB0FF8390F8003E0EC0080EA0BC0EA09E0A2EA08F01378A27F7FA27FEB07
+80A2EB03C0EB01E0A2EB00F01478A2143C141EA2140F1407A214031401123E38FF80001D
+1F7E9E22>I<EB1FE0EB70383801C00E48487E39070003804814C0001EEB01E048EB00F0
+A2007C14F8A20078147800F8147CA900781478007C14F8A2003C14F0003E1301001E14E0
+6CEB03C06C148039038007003801E01E38007038EB1FE01E217E9F23>I<B512E0380F00
+7C141E80EC0780A215C0A41580A2EC0F00141E147CEBFFE090C8FCAEEAFFF01A1F7E9E1F
+>I<B57E380F00F0143C8080A21580A41500A2141E5C14F0EBFF80EB01C0EB0070A28014
+3CA3143EA31504143F141FEC0F0839FFF00788C7EA01F01E207E9E21>82
+D<3803F040380C0CC0EA1803EA3001EA6000A212E01440A36C13007E127CEA7F80EA3FF8
+6CB4FC00071380C613C0EB1FE013031301EB00F014707EA46C136014E06C13C038F80180
+38C60300EA81FC14217E9F19>I<007FB512E038780F010060EB006000401420A200C014
+3000801410A400001400B3497E3803FFFC1C1F7E9E21>I<39FFF00FF8390F0003E0EC00
+80B3A46CEB01001380120314026C6C5A6C6C5AEB3830EB0FC01D207E9E22>I<39FFF003
+FE391F8000F86CC7126015206C6C1340A36C6C1380A2EBE00100011400A23800F002A213
+F8EB7804A26D5AA36D5AA2131F6D5AA2EB07C0A36D5AA36DC7FC1F207F9E22>I<3BFFF0
+7FF81FF03B1F000FC007C06C903907800180170015C001805C00071502EC09E013C00003
+5DEC19F01410D801E05CA2EC2078D800F05CA2EC403C01785CA2EC801E017C1460013C14
+4090383D000F133F6D5CA2011E1307010E91C7FCA2010C7F010413022C207F9E2F>I<39
+FFF001FF391F800078000F146012076D1340000314807F3901F001001200EBF802EB7C06
+EB3C04EB3E08131EEB1F10EB0FB0EB07A014E06D5AACEB3FFC201F7F9E22>89
+D<12FFA212C0B3B3A512FFA2082D7CA10D>91 D<12FFA21203B3B3A512FFA2082D80A10D
+>93 D<120812101220A21240A21280A312B812FCA2127C1238060E7D9F0D>96
+D<EA1FE0EA3030EA7818131CEA300E1200A313FEEA078EEA1E0E1238127800F01310A313
+1E127838386720380F83C014147E9317>I<121C12FC121CAA137CEA1D87381E0180EB00
+C0001C13E01470A21478A6147014F014E0001E13C0381A018038198700EA107C15207E9F
+19>I<EA01FCEA0706EA1C0F123813060078C7FC127012F0A61270127800381380A2381C
+0100EA0706EA01F811147F9314>I<EB01C0130F1301AAEA01F1EA070DEA0C03EA180112
+381278127012F0A61270A21238EA1803120CEA070D3801F1F815207F9F19>I<EA03F0EA
+0E1C487E487EA21270EB038012F0A2B5FC00F0C7FCA31270A26C1380A2381C0100EA0706
+EA01F811147F9314>I<137CEA01C6EA030F1207EA0E061300A7EAFFF0EA0E00B2EA7FE0
+1020809F0E>I<14E03803E330EA0E3CEA1C1C38380E00EA780FA5EA380E6C5AEA1E38EA
+33E00020C7FCA21230A2EA3FFE381FFF8014C0383001E038600070481330A4006013606C
+13C0381C03803803FC00141F7F9417>I<121C12FC121CAA137C1386EA1D03001E1380A2
+121CAE38FF8FF014207E9F19>I<1238127CA31238C7FCA6121C12FC121CB1EAFF80091F
+7F9E0C>I<13E0EA01F0A3EA00E01300A61370EA07F012001370B3A31260EAF06013C0EA
+6180EA3F000C28829E0E>I<121C12FC121CAAEB1FE0EB0780EB060013045B5B5B136013
+E0EA1DF0EA1E70EA1C38133C131C7F130F7F148014C038FF9FF014207E9F18>I<121C12
+FC121CB3ABEAFF8009207F9F0C>I<391C3E03E039FCC30C30391D039038391E01E01CA2
+001C13C0AE3AFF8FF8FF8021147E9326>I<EA1C7CEAFC86EA1D03001E1380A2121CAE38
+FF8FF014147E9319>I<EA01F8EA070E381C0380383801C0A2387000E0A200F013F0A600
+7013E0A2383801C0A2381C038038070E00EA01F814147F9317>I<EA1C7CEAFD87381E01
+8014C0381C00E014F014701478A6147014F014E0381E01C0EB0380381D8700EA1C7C90C7
+FCA8B47E151D7E9319>I<3801F04038070CC0EA0E02EA1C03EA38011278127012F0A612
+7012781238EA1C03EA0C05EA0709EA01F1EA0001A8EB0FF8151D7F9318>I<EA1CF0EAFD
+18EA1E3CA21318EA1C00AEEAFFC00E147E9312>I<EA0FC8EA3038EA6018EAC008A3EAE0
+00127CEA3FE0EA1FF0EA07F8EA003CEA800E130612C0A21304EAE00CEAD818EA87E00F14
+7F9312>I<1202A31206A2120EA2123EEAFFF8EA0E00AB1304A5EA07081203EA01F00E1C
+7F9B12>I<381C0380EAFC1FEA1C03AE1307120CEA061B3803E3F014147E9319>I<38FF83
+F8383E00E0001C13C06C1380A338070100A21383EA0382A2EA01C4A213E4EA00E8A21370
+A3132015147F9318>I<39FF9FE1FC393C078070391C030060EC8020000E1440A214C0D8
+0704138014E0A239038861001471A23801D032143A143E3800E01CA2EB6018EB40081E14
+7F9321>I<38FF87F8381E03C0380E0180EB0300EA0702EA0384EA01C813D8EA00F01370
+137813F8139CEA010E1202EA060738040380000C13C0003C13E038FE07FC16147F9318>
+I<38FF83F8383E00E0001C13C06C1380A338070100A21383EA0382A2EA01C4A213E4EA00
+E8A21370A31320A25BA3EAF080A200F1C7FC1262123C151D7F9318>I<EA7FFFEA700E12
+60EA401C133813781370EA00E0120113C0EA038012071301120E121EEA1C03EA3802EA70
+06130EEAFFFE10147F9314>I E
+%EndDVIPSBitmapFont
+%DVIPSBitmapFont: Fo cmbx12 20.736 19
+/Fo 19 122 df<DB1FFC14C00203B5EAC001021FECF003027FECFC07903B01FFFC00FE0F
+010701C0EB1F9F4948C7EA07FFD93FF880494814004948157F485B4A153F4890C9121F48
+5A000F170F5B001F1707A2485A1803A2127FA24993C8FCA212FFAA041FB61280127FA27F
+DC0001EBC000123FA36C7EA26C7EA26C7E7E6C7F806C7F6D6C5CEB3FFCD90FFF5C6D01C0
+EB1FBF010101FCEBFF1F6D6CB5EAFE0F021FECF8030203ECE0009126001FFEC9FC413D7B
+BB4C>71 D<B612F8A439007FF000B3B3AFB612F8A41D3B7DBA24>73
+D<B612FEA426007FF0C9FCB3ADEF03C0A517071880A3170FA3171FA2173F177F17FF5E04
+071300163FB9FCA4323B7DBA3A>76 D<B500F00207B512E0808080D8007F92390007E000
+6E6F5A81017B7F81137901787F6E7E6E7E81141F6E7E6E7F6E7F82806E7F6F7E6F7E826F
+7E816F13806F13C017E06F13F081EE7FF8EE3FFC17FEEE1FFF827013837013C318E37013
+F382EF7FFBEF3FFFA283838383A28383187F183FA201FC161FB500FC150F18071803A243
+3B7CBA4C>78 D<B712F8EEFFC017F817FE3B007FF0001FFF040313C004007F717E717EA2
+84171FA284A660A2173F604D5A604C485A4C5BDC1FFEC8FC91B612F817C0A29139F0007F
+F0EE1FF8707E707E707E8482A284A584A5F101E0A27013F0A2F103C0EF7FF8B600F89039
+3FFC078094381FFE0F0507B51200050113FCCBEA1FF0433C7CBA48>82
+D<B600F80107B512E0A426007FF0C83807E000725AB3B3A3013F4C5AA280011F4CC7FCA2
+6D6C151E0107163E6E5D6D6C5D6D6D13019026007FE0EB0FE0DA3FFCEB7FC0020FB65A02
+034AC8FCDA007F13F003071380433C7DBA4A>85 D<EB3FFE48B512E0000714F8390FE007
+FC9038F001FE486C6C7E6F7E82153F6C48806C5A6C5AC8FCA491B5FC131F90387FF83F38
+03FF803807FC00EA0FF0485A123F485AA2485AA4157F6C7E15DF3A3FE0039FF03B1FF80F
+0FFFE03807FFFE0001497E39003FE0002B267DA52F>97 D<13FE12FFA412071203B04AB4
+FC021F13F0027F13FC9138FC03FE9039FFF000FF02C0EB3F8091C7EA1FC04915E0EE0FF0
+17F8A2EE07FCA317FEA917FCA3160F17F817F0161F6D15E06EEB3FC06EEB7F80D9F9E0EB
+FF009039F0FC07FE91387FFFF8D9E01F13E09026C003FEC7FC2F3C7DBB36>I<903801FF
+F0010F13FE013FEBFF809039FF801FC03901FE003F4848EB7FE0485A485A121F4848EB3F
+C0ED1F80007FEC0F004990C7FCA212FFAA127F7FA2123F6D14F0121F6C6CEB01E012076C
+6CEB03C06CB4EB0F806C9038C03F0090383FFFFE010F13F8010113C024267DA52B>I<EE
+3F80ED3FFFA4150181B0ECFF80010F13F0013F13FC9038FFC03F3901FE000F4848130348
+487F48487F121F485AA2127F5BA312FFA9127FA36C7EA2121F6C6C5B6C6C5B00035CD801
+FE011F13C02700FF807E13FE90387FFFF8010F13E0010113002F3C7DBB36>I<49B47E01
+0F13F0017F13FC9038FF81FE3A03FE007F80D807F8133F4848EB1FC0ED0FE0485A003F15
+F01507485A16F8A212FFA290B6FCA301C0C8FCA4127FA36C7E1678121F7F000F15F06C6C
+13016C6CEB03E06C6CEB0FC03A00FFC07F8090393FFFFE00010F13F8010013C025267DA5
+2C>I<EC1FF0ECFFFC010313FF90390FF83F8090381FE07F90393FC0FFC0495A13FFA248
+9038007F80ED3F00151E92C7FCAAB67EA4000190C8FCB3AC007F13FEA4223C7DBB1E>I<
+EA01E0EA07F8487EA2487EA46C5AA26C5AEA01E0C8FCAB13FE127FA412071203B3AAB512
+F0A4143D7DBC1A>105 D<13FE12FFA412071203B3B3AEB512F8A4153C7DBB1A>108
+D<D801FCEBFF8000FF010313F0020F7F91381E03FC91383801FE000701607F0003497E01
+FD15805C01FFC7FCA35BB3A4B5D8F83F13FEA42F267CA536>110
+D<3901FC03F000FFEB0FFC4AB4FC91383C3F80EC707F00079038E0FFC000035BEBFD80A2
+01FFEB7F809138003F00151E92C7FC5BB3A3B512FCA422267DA528>114
+D<90383FF0383903FFFE7848EBFFF8381FC00F383F0003003E13005A157812FCA27E6C14
+0013C013FC387FFFF06C13FEECFF806C14C06C14E0000314F0C614F8011F13FCEB007FEC
+07FE0070130100F01300157E7EA27E157C6C14FC6C14F890388001F09038F00FE000F9B5
+12C0D8F07F130038C01FF81F267DA526>I<130FA55BA45BA25BA25B5A5A5A001FEBFFF0
+B6FCA3000190C7FCB3153CA86C14781480017F13F090383FC1E090381FFFC06D13809038
+01FE001E377EB626>I<B500F0EBFFFCA4D803FEC7EA1F806D15006C151E806C5DA26E13
+7C017F14786E13F8013F5CECF001011F5CECF803010F5CA2ECFC0701075CECFE0F010391
+C7FC6E5A6D131E15BE6D13BC15FC6E5AA36E5AA26E5AA26E5AA26E5AA2140F92C8FC5C14
+1E0008133E007F133C147C38FF807814F8EB81F0EB83E06C485A387C1F80D83FFFC9FCEA
+1FFCEA07F02E377EA533>121 D E
+%EndDVIPSBitmapFont
+end
+%%EndProlog
+%%BeginSetup
+%%Feature: *Resolution 300dpi
+TeXDict begin
+%%BeginPaperSize: Letter
+letter
+%%EndPaperSize
+
+%%EndSetup
+%%Page: 1 1
+1 0 bop 75 693 a Fo(GNU)33 b(Readline)h(Library)e(User)h(In)m(terface)p
+75 743 1800 17 v 936 791 a Fn(Edition)17 b(4.1,)c(for)i
+Fm(Readline)f(Library)g Fn(V)l(ersion)i(4.1.)1609 845
+y(Jan)o(uary)f(2000)75 2467 y Fl(Brian)23 b(F)-6 b(o)n(x,)23
+b(F)-6 b(ree)23 b(Soft)n(w)n(are)f(F)-6 b(oundation)75
+2534 y(Chet)22 b(Ramey)-6 b(,)23 b(Case)e(W)-6 b(estern)23
+b(Reserv)n(e)f(Univ)n(ersit)n(y)p 75 2570 1800 9 v eop
+%%Page: 2 2
+2 1 bop 75 250 a Fn(This)22 b(do)q(cumen)o(t)f(describ)q(es)i(the)f
+(end)f(user)h(in)o(terface)f(of)g(the)g(GNU)g(Readline)j(Library)l(,)f
+(a)e(utilit)o(y)75 305 y(whic)o(h)14 b(aids)f(in)g(the)g(consistency)h
+(of)e(user)h(in)o(terface)g(across)f(discrete)h(programs)f(that)g(need)
+h(to)f(pro)o(vide)75 360 y(a)j(command)g(line)i(in)o(terface.)75
+427 y(Published)g(b)o(y)f(the)f(F)l(ree)g(Soft)o(w)o(are)f(F)l
+(oundation)75 482 y(59)h(T)l(emple)h(Place,)f(Suite)i(330,)75
+537 y(Boston,)d(MA)h(02111)f(USA)75 604 y(P)o(ermission)j(is)f(gran)o
+(ted)g(to)f(mak)o(e)h(and)g(distribute)i(v)o(erbatim)d(copies)i(of)f
+(this)h(man)o(ual)f(pro)o(vided)h(the)75 659 y(cop)o(yrigh)o(t)e
+(notice)h(and)f(this)h(p)q(ermission)g(notice)g(are)f(preserv)o(ed)h
+(on)f(all)h(copies.)75 726 y(P)o(ermission)c(is)h(gran)o(ted)e(to)g
+(cop)o(y)h(and)g(distribute)h(mo)q(di\014ed)g(v)o(ersions)f(of)f(this)h
+(man)o(ual)g(under)h(the)f(con-)75 781 y(ditions)k(for)e(v)o(erbatim)h
+(cop)o(ying,)g(pro)o(vided)h(that)e(the)h(en)o(tire)h(resulting)g
+(deriv)o(ed)g(w)o(ork)e(is)h(distributed)75 836 y(under)h(the)f(terms)g
+(of)g(a)f(p)q(ermission)j(notice)f(iden)o(tical)h(to)e(this)g(one.)75
+903 y(P)o(ermission)i(is)g(gran)o(ted)f(to)g(cop)o(y)h(and)f
+(distribute)i(translations)f(of)f(this)h(man)o(ual)g(in)o(to)f(another)
+g(lan-)75 958 y(guage,)e(under)h(the)f(ab)q(o)o(v)o(e)g(conditions)i
+(for)d(mo)q(di\014ed)j(v)o(ersions,)e(except)h(that)f(this)h(p)q
+(ermission)g(notice)75 1013 y(ma)o(y)f(b)q(e)i(stated)f(in)h(a)f
+(translation)g(appro)o(v)o(ed)g(b)o(y)g(the)g(F)l(ree)h(Soft)o(w)o(are)
+d(F)l(oundation.)75 2661 y(Cop)o(yrigh)o(t)301 2660 y(c)289
+2661 y Fk(\015)i Fn(1988-1999)e(F)l(ree)i(Soft)o(w)o(are)f(F)l
+(oundation,)h(Inc.)p eop
+%%Page: 1 3
+1 2 bop 75 -58 a Fn(Chapter)15 b(1:)k(Command)c(Line)i(Editing)1077
+b(1)75 183 y Fj(1)41 b(Command)28 b(Line)e(Editing)137
+299 y Fn(This)16 b(c)o(hapter)f(describ)q(es)i(the)e(basic)h(features)f
+(of)g(the)g Fi(gnu)g Fn(command)g(line)i(editing)f(in)o(terface.)75
+426 y Fl(1.1)33 b(In)n(tro)r(duction)24 b(to)e(Line)i(Editing)137
+522 y Fn(The)16 b(follo)o(wing)g(paragraphs)e(describ)q(e)j(the)e
+(notation)g(used)h(to)e(represen)o(t)i(k)o(eystrok)o(es.)137
+589 y(The)h(text)327 587 y Fh(h)p 339 561 56 2 v 339
+589 a Fg(C-k)p 339 597 V 393 587 a Fh(i)424 589 y Fn(is)f(read)g(as)g
+(`Con)o(trol-K')f(and)h(describ)q(es)i(the)e(c)o(haracter)g(pro)q
+(duced)h(when)f(the)1831 587 y Fh(h)p 1844 561 19 2 v
+1844 589 a Fg(k)p 1844 597 V 1860 587 a Fh(i)75 644 y
+Fn(k)o(ey)f(is)h(pressed)g(while)g(the)f(Con)o(trol)g(k)o(ey)g(is)h
+(depressed.)137 711 y(The)f(text)325 709 y Fh(h)p 337
+683 63 2 v 337 711 a Fg(M-k)p 337 719 V 397 709 a Fh(i)427
+711 y Fn(is)g(read)g(as)f(`Meta-K')g(and)h(describ)q(es)i(the)e(c)o
+(haracter)f(pro)q(duced)i(when)f(the)g(Meta)75 766 y(k)o(ey)f(\(if)g(y)
+o(ou)g(ha)o(v)o(e)g(one\))g(is)h(depressed,)g(and)f(the)930
+764 y Fh(h)p 942 738 19 2 v 942 766 a Fg(k)p 942 774
+V 958 764 a Fh(i)987 766 y Fn(k)o(ey)g(is)h(pressed.)20
+b(The)15 b(Meta)e(k)o(ey)h(is)h(lab)q(eled)1779 764 y
+Fh(h)p 1791 738 72 2 v 1791 766 a Fg(AL)m(T)p 1791 774
+V 1860 764 a Fh(i)75 821 y Fn(on)e(man)o(y)g(k)o(eyb)q(oards.)19
+b(On)13 b(k)o(eyb)q(oards)g(with)h(t)o(w)o(o)e(k)o(eys)g(lab)q(eled)
+1213 819 y Fh(h)p 1225 793 V 1225 821 a Fg(AL)m(T)p 1225
+828 V 1294 819 a Fh(i)1322 821 y Fn(\(usually)i(to)e(either)i(side)g
+(of)f(the)75 876 y(space)j(bar\),)f(the)388 874 y Fh(h)p
+400 847 V 400 876 a Fg(AL)m(T)p 400 883 V 469 874 a Fh(i)499
+876 y Fn(on)h(the)g(left)g(side)g(is)g(generally)h(set)f(to)f(w)o(ork)g
+(as)g(a)g(Meta)g(k)o(ey)l(.)22 b(The)1697 874 y Fh(h)p
+1709 847 V 1709 876 a Fg(AL)m(T)p 1709 883 V 1778 874
+a Fh(i)1808 876 y Fn(k)o(ey)75 930 y(on)17 b(the)f(righ)o(t)h(ma)o(y)f
+(also)h(b)q(e)g(con\014gured)g(to)f(w)o(ork)g(as)g(a)h(Meta)f(k)o(ey)g
+(or)g(ma)o(y)g(b)q(e)i(con\014gured)f(as)f(some)75 985
+y(other)f(mo)q(di\014er,)h(suc)o(h)f(as)g(a)g(Comp)q(ose)g(k)o(ey)g
+(for)f(t)o(yping)i(accen)o(ted)f(c)o(haracters.)137 1052
+y(If)c(y)o(ou)g(do)g(not)f(ha)o(v)o(e)h(a)f(Meta)h(or)694
+1050 y Fh(h)p 706 1024 V 706 1052 a Fg(AL)m(T)p 706 1060
+V 775 1050 a Fh(i)801 1052 y Fn(k)o(ey)l(,)g(or)g(another)f(k)o(ey)h(w)
+o(orking)f(as)h(a)f(Meta)h(k)o(ey)l(,)g(the)g(iden)o(tical)75
+1107 y(k)o(eystrok)o(e)f(can)i(b)q(e)f(generated)h(b)o(y)f(t)o(yping)
+809 1105 y Fh(h)p 821 1079 70 2 v 821 1107 a Fg(ESC)p
+821 1115 V 888 1105 a Fh(i)915 1107 y Ff(\014rst)p Fn(,)g(and)g(then)h
+(t)o(yping)1339 1105 y Fh(h)p 1351 1079 19 2 v 1351 1107
+a Fg(k)p 1351 1115 V 1368 1105 a Fh(i)1383 1107 y Fn(.)18
+b(Either)12 b(pro)q(cess)f(is)h(kno)o(wn)75 1162 y(as)j
+Ff(metafying)k Fn(the)425 1160 y Fh(h)p 437 1134 V 437
+1162 a Fg(k)p 437 1169 V 454 1160 a Fh(i)484 1162 y Fn(k)o(ey)l(.)137
+1229 y(The)h(text)334 1227 y Fh(h)p 347 1201 100 2 v
+347 1229 a Fg(M-C-k)p 347 1236 V 444 1227 a Fh(i)479
+1229 y Fn(is)g(read)g(as)f(`Meta-Con)o(trol-k')f(and)i(describ)q(es)h
+(the)f(c)o(haracter)f(pro)q(duced)i(b)o(y)75 1283 y Ff(metafying)291
+1281 y Fh(h)p 303 1255 56 2 v 303 1283 a Fg(C-k)p 303
+1291 V 357 1281 a Fh(i)372 1283 y Fn(.)137 1350 y(In)e(addition,)h(sev)
+o(eral)f(k)o(eys)f(ha)o(v)o(e)g(their)h(o)o(wn)f(names.)30
+b(Sp)q(eci\014cally)l(,)1384 1348 y Fh(h)p 1396 1322
+73 2 v 1396 1350 a Fg(DEL)p 1396 1358 V 1467 1348 a Fh(i)1482
+1350 y Fn(,)1514 1348 y Fh(h)p 1526 1322 70 2 v 1526
+1350 a Fg(ESC)p 1526 1358 V 1593 1348 a Fh(i)1608 1350
+y Fn(,)1640 1348 y Fh(h)p 1652 1322 72 2 v 1652 1350
+a Fg(LFD)p 1652 1358 V 1722 1348 a Fh(i)1737 1350 y Fn(,)1768
+1348 y Fh(h)p 1780 1322 70 2 v 1780 1350 a Fg(SPC)p 1780
+1358 V 1847 1348 a Fh(i)1862 1350 y Fn(,)75 1403 y Fh(h)p
+87 1377 76 2 v 87 1405 a Fg(RET)p 87 1413 V 160 1403
+a Fh(i)175 1405 y Fn(,)23 b(and)306 1403 y Fh(h)p 318
+1377 74 2 v 318 1405 a Fg(T)m(AB)p 318 1413 V 390 1403
+a Fh(i)427 1405 y Fn(all)f(stand)g(for)f(themselv)o(es)h(when)h(seen)f
+(in)g(this)g(text,)h(or)e(in)i(an)e(init)i(\014le)g(\(see)75
+1460 y(Section)d(1.3)f([Readline)i(Init)f(File],)h(page)e(4\).)32
+b(If)19 b(y)o(our)g(k)o(eyb)q(oard)h(lac)o(ks)f(a)1444
+1458 y Fh(h)p 1456 1432 72 2 v 1456 1460 a Fg(LFD)p 1456
+1468 V 1526 1458 a Fh(i)1560 1460 y Fn(k)o(ey)l(,)h(t)o(yping)1802
+1458 y Fh(h)p 1814 1432 49 2 v 1814 1460 a Fg(C-j)p 1814
+1468 V 1860 1458 a Fh(i)75 1515 y Fn(will)c(pro)q(duce)g(the)f(desired)
+h(c)o(haracter.)j(The)874 1513 y Fh(h)p 886 1487 76 2
+v 886 1515 a Fg(RET)p 886 1522 V 959 1513 a Fh(i)989
+1515 y Fn(k)o(ey)c(ma)o(y)f(b)q(e)h(lab)q(eled)1385 1513
+y Fh(h)p 1397 1487 109 2 v 1397 1515 a Fg(Return)p 1397
+1522 V 1503 1513 a Fh(i)1533 1515 y Fn(or)1588 1513 y
+Fh(h)p 1600 1487 86 2 v 1600 1515 a Fg(En)o(ter)p 1600
+1522 V 1684 1513 a Fh(i)1714 1515 y Fn(on)f(some)75 1569
+y(k)o(eyb)q(oards.)75 1697 y Fl(1.2)33 b(Readline)23
+b(In)n(teraction)137 1793 y Fn(Often)13 b(during)h(an)e(in)o(teractiv)o
+(e)h(session)g(y)o(ou)g(t)o(yp)q(e)f(in)i(a)e(long)h(line)h(of)e(text,)
+h(only)g(to)f(notice)h(that)f(the)75 1848 y(\014rst)k(w)o(ord)f(on)h
+(the)h(line)h(is)e(missp)q(elled.)26 b(The)16 b(Readline)j(library)e
+(giv)o(es)f(y)o(ou)g(a)g(set)g(of)g(commands)g(for)75
+1903 y(manipulating)g(the)f(text)g(as)f(y)o(ou)h(t)o(yp)q(e)g(it)g(in,)
+g(allo)o(wing)h(y)o(ou)f(to)f(just)h(\014x)g(y)o(our)f(t)o(yp)q(o,)g
+(and)h(not)g(forcing)75 1958 y(y)o(ou)f(to)f(ret)o(yp)q(e)h(the)g(ma)s
+(jorit)o(y)f(of)h(the)g(line.)21 b(Using)15 b(these)f(editing)h
+(commands,)f(y)o(ou)g(mo)o(v)o(e)f(the)h(cursor)75 2012
+y(to)i(the)i(place)g(that)e(needs)i(correction,)g(and)f(delete)h(or)f
+(insert)g(the)h(text)e(of)h(the)g(corrections.)26 b(Then,)75
+2067 y(when)16 b(y)o(ou)f(are)h(satis\014ed)g(with)g(the)f(line,)i(y)o
+(ou)e(simply)i(press)1160 2065 y Fh(h)p 1172 2039 155
+2 v 1172 2067 a Fg(RETURN)p 1172 2075 V 1324 2065 a Fh(i)1339
+2067 y Fn(.)k(Y)l(ou)16 b(do)f(not)g(ha)o(v)o(e)g(to)g(b)q(e)i(at)75
+2122 y(the)g(end)g(of)f(the)g(line)i(to)e(press)634 2120
+y Fh(h)p 646 2094 V 646 2122 a Fg(RETURN)p 646 2130 V
+798 2120 a Fh(i)813 2122 y Fn(;)g(the)h(en)o(tire)g(line)h(is)f
+(accepted)g(regardless)g(of)f(the)g(lo)q(cation)75 2177
+y(of)f(the)g(cursor)g(within)h(the)g(line.)75 2288 y
+Fe(1.2.1)30 b(Readline)20 b(Bare)g(Essen)n(tials)137
+2384 y Fn(In)12 b(order)g(to)f(en)o(ter)g(c)o(haracters)g(in)o(to)g
+(the)h(line,)h(simply)g(t)o(yp)q(e)f(them.)18 b(The)12
+b(t)o(yp)q(ed)g(c)o(haracter)f(app)q(ears)75 2439 y(where)16
+b(the)h(cursor)f(w)o(as,)f(and)h(then)h(the)f(cursor)g(mo)o(v)o(es)g
+(one)g(space)g(to)g(the)g(righ)o(t.)23 b(If)17 b(y)o(ou)f(mist)o(yp)q
+(e)g(a)75 2493 y(c)o(haracter,)e(y)o(ou)h(can)g(use)h(y)o(our)f(erase)g
+(c)o(haracter)f(to)h(bac)o(k)g(up)g(and)h(delete)g(the)f(mist)o(yp)q
+(ed)h(c)o(haracter.)137 2560 y(Sometimes)g(y)o(ou)f(ma)o(y)g(mist)o(yp)
+q(e)h(a)f(c)o(haracter,)f(and)i(not)f(notice)h(the)f(error)g(un)o(til)i
+(y)o(ou)e(ha)o(v)o(e)g(t)o(yp)q(ed)75 2615 y(sev)o(eral)f(other)f(c)o
+(haracters.)19 b(In)14 b(that)g(case,)f(y)o(ou)h(can)g(t)o(yp)q(e)1102
+2613 y Fh(h)p 1114 2587 57 2 v 1114 2615 a Fg(C-b)p 1114
+2623 V 1168 2613 a Fh(i)1197 2615 y Fn(to)f(mo)o(v)o(e)g(the)h(cursor)g
+(to)f(the)h(left,)g(and)75 2670 y(then)i(correct)e(y)o(our)h(mistak)o
+(e.)20 b(Afterw)o(ards,)13 b(y)o(ou)i(can)g(mo)o(v)o(e)g(the)g(cursor)g
+(to)g(the)g(righ)o(t)g(with)1714 2668 y Fh(h)p 1727 2642
+49 2 v 1727 2670 a Fg(C-f)p 1727 2678 V 1772 2668 a Fh(i)1787
+2670 y Fn(.)p eop
+%%Page: 2 4
+2 3 bop 75 -58 a Fn(2)1322 b(GNU)15 b(Readline)i(Library)137
+183 y(When)g(y)o(ou)f(add)g(text)g(in)h(the)g(middle)h(of)e(a)f(line,)j
+(y)o(ou)e(will)i(notice)f(that)f(c)o(haracters)f(to)h(the)g(righ)o(t)75
+238 y(of)e(the)g(cursor)g(are)g(`pushed)h(o)o(v)o(er')f(to)f(mak)o(e)h
+(ro)q(om)g(for)f(the)i(text)f(that)f(y)o(ou)h(ha)o(v)o(e)g(inserted.)21
+b(Lik)o(ewise,)75 293 y(when)e(y)o(ou)g(delete)h(text)e(b)q(ehind)j
+(the)e(cursor,)g(c)o(haracters)f(to)g(the)h(righ)o(t)f(of)g(the)h
+(cursor)g(are)f(`pulled)75 348 y(bac)o(k')11 b(to)g(\014ll)h(in)h(the)e
+(blank)h(space)g(created)f(b)o(y)h(the)f(remo)o(v)m(al)g(of)g(the)h
+(text.)18 b(A)11 b(list)h(of)f(the)h(bare)f(essen)o(tials)75
+402 y(for)k(editing)h(the)f(text)g(of)g(an)g(input)h(line)h(follo)o
+(ws.)75 479 y Fh(h)p 87 453 57 2 v 87 481 a Fg(C-b)p
+87 489 V 142 479 a Fh(i)315 481 y Fn(Mo)o(v)o(e)d(bac)o(k)h(one)h(c)o
+(haracter.)75 558 y Fh(h)p 87 532 49 2 v 87 560 a Fg(C-f)p
+87 567 V 133 558 a Fh(i)315 560 y Fn(Mo)o(v)o(e)e(forw)o(ard)g(one)h(c)
+o(haracter.)75 636 y Fh(h)p 87 610 73 2 v 87 638 a Fg(DEL)p
+87 646 V 158 636 a Fh(i)188 638 y Fn(or)244 636 y Fh(h)p
+256 610 159 2 v 256 638 a Fg(Bac)o(kspace)p 256 646 V
+412 636 a Fh(i)315 693 y Fn(Delete)h(the)f(c)o(haracter)g(to)f(the)h
+(left)h(of)f(the)g(cursor.)75 770 y Fh(h)p 87 744 57
+2 v 87 772 a Fg(C-d)p 87 779 V 142 770 a Fh(i)315 772
+y Fn(Delete)h(the)f(c)o(haracter)g(underneath)h(the)f(cursor.)75
+850 y(Prin)o(ting)h(c)o(haracters)315 905 y(Insert)f(the)h(c)o
+(haracter)e(in)o(to)h(the)h(line)h(at)d(the)h(cursor.)75
+981 y Fh(h)p 87 955 50 2 v 87 983 a Fg(C-)p 126 983 11
+2 v 87 991 50 2 v 135 981 a Fh(i)165 983 y Fn(or)221
+981 y Fh(h)p 233 955 125 2 v 233 983 a Fg(C-x)c(C-u)p
+233 991 V 355 981 a Fh(i)315 1038 y Fn(Undo)17 b(the)g(last)f(editing)i
+(command.)25 b(Y)l(ou)17 b(can)g(undo)g(all)g(the)g(w)o(a)o(y)f(bac)o
+(k)h(to)f(an)g(empt)o(y)315 1093 y(line.)75 1172 y(\(Dep)q(ending)i(on)
+f(y)o(our)g(con\014guration,)g(the)863 1170 y Fh(h)p
+875 1144 159 2 v 875 1172 a Fg(Bac)o(kspace)p 875 1179
+V 1032 1170 a Fh(i)1063 1172 y Fn(k)o(ey)g(b)q(e)h(set)f(to)f(delete)i
+(the)f(c)o(haracter)g(to)f(the)75 1226 y(left)h(of)f(the)h(cursor)f
+(and)g(the)596 1224 y Fh(h)p 608 1198 73 2 v 608 1226
+a Fg(DEL)p 608 1234 V 679 1224 a Fh(i)710 1226 y Fn(k)o(ey)h(set)f(to)g
+(delete)h(the)g(c)o(haracter)f(underneath)h(the)g(cursor,)f(lik)o(e)75
+1279 y Fh(h)p 87 1253 57 2 v 87 1281 a Fg(C-d)p 87 1289
+V 142 1279 a Fh(i)157 1281 y Fn(,)f(rather)f(than)h(the)h(c)o(haracter)
+e(to)h(the)g(left)g(of)g(the)g(cursor.\))75 1392 y Fe(1.2.2)30
+b(Readline)20 b(Mo)n(v)n(emen)n(t)i(Commands)137 1487
+y Fn(The)14 b(ab)q(o)o(v)o(e)e(table)i(describ)q(es)g(the)g(most)e
+(basic)i(k)o(eystrok)o(es)d(that)i(y)o(ou)g(need)h(in)f(order)g(to)g
+(do)g(editing)75 1542 y(of)f(the)h(input)h(line.)21 b(F)l(or)12
+b(y)o(our)g(con)o(v)o(enience,)i(man)o(y)f(other)f(commands)h(ha)o(v)o
+(e)f(b)q(een)i(added)f(in)h(addition)75 1597 y(to)130
+1595 y Fh(h)p 142 1569 V 142 1597 a Fg(C-b)p 142 1605
+V 197 1595 a Fh(i)212 1597 y Fn(,)239 1595 y Fh(h)p 251
+1569 49 2 v 251 1597 a Fg(C-f)p 251 1605 V 297 1595 a
+Fh(i)312 1597 y Fn(,)339 1595 y Fh(h)p 351 1569 57 2
+v 351 1597 a Fg(C-d)p 351 1605 V 406 1595 a Fh(i)421
+1597 y Fn(,)g(and)536 1595 y Fh(h)p 548 1569 73 2 v 548
+1597 a Fg(DEL)p 548 1605 V 619 1595 a Fh(i)634 1597 y
+Fn(.)20 b(Here)15 b(are)f(some)g(commands)h(for)f(mo)o(ving)g(more)h
+(rapidly)g(ab)q(out)g(the)75 1652 y(line.)75 1728 y Fh(h)p
+87 1702 55 2 v 87 1730 a Fg(C-a)p 87 1738 V 140 1728
+a Fh(i)315 1730 y Fn(Mo)o(v)o(e)f(to)h(the)g(start)f(of)h(the)g(line.)
+75 1807 y Fh(h)p 87 1781 53 2 v 87 1809 a Fg(C-e)p 87
+1817 V 138 1807 a Fh(i)315 1809 y Fn(Mo)o(v)o(e)f(to)h(the)g(end)h(of)f
+(the)g(line.)75 1885 y Fh(h)p 87 1859 55 2 v 87 1887
+a Fg(M-f)p 87 1895 V 140 1885 a Fh(i)315 1887 y Fn(Mo)o(v)o(e)f(forw)o
+(ard)g(a)h(w)o(ord,)f(where)i(a)e(w)o(ord)h(is)h(comp)q(osed)f(of)g
+(letters)g(and)h(digits.)75 1964 y Fh(h)p 87 1938 64
+2 v 87 1966 a Fg(M-b)p 87 1974 V 149 1964 a Fh(i)315
+1966 y Fn(Mo)o(v)o(e)e(bac)o(kw)o(ard)h(a)g(w)o(ord.)75
+2043 y Fh(h)p 87 2017 48 2 v 87 2045 a Fg(C-l)p 87 2052
+V 132 2043 a Fh(i)315 2045 y Fn(Clear)g(the)h(screen,)f(reprin)o(ting)h
+(the)f(curren)o(t)g(line)i(at)e(the)g(top.)137 2123 y(Notice)d(ho)o(w)
+368 2121 y Fh(h)p 380 2095 49 2 v 380 2123 a Fg(C-f)p
+380 2131 V 426 2121 a Fh(i)452 2123 y Fn(mo)o(v)o(es)f(forw)o(ard)f(a)i
+(c)o(haracter,)f(while)1105 2121 y Fh(h)p 1117 2095 55
+2 v 1117 2123 a Fg(M-f)p 1117 2131 V 1170 2121 a Fh(i)1197
+2123 y Fn(mo)o(v)o(es)f(forw)o(ard)h(a)g(w)o(ord.)18
+b(It)12 b(is)g(a)g(lo)q(ose)75 2178 y(con)o(v)o(en)o(tion)j(that)f(con)
+o(trol)h(k)o(eystrok)o(es)f(op)q(erate)h(on)f(c)o(haracters)h(while)h
+(meta)e(k)o(eystrok)o(es)g(op)q(erate)h(on)75 2233 y(w)o(ords.)75
+2343 y Fe(1.2.3)30 b(Readline)20 b(Killing)h(Commands)137
+2439 y Ff(Killing)26 b Fn(text)18 b(means)g(to)g(delete)i(the)f(text)f
+(from)g(the)h(line,)i(but)d(to)g(sa)o(v)o(e)g(it)h(a)o(w)o(a)o(y)e(for)
+h(later)h(use,)75 2494 y(usually)f(b)o(y)f Ff(y)o(anking)22
+b Fn(\(re-inserting\))17 b(it)g(bac)o(k)g(in)o(to)g(the)h(line.)27
+b(\(`Cut')15 b(and)j(`paste')e(are)g(more)h(recen)o(t)75
+2549 y(jargon)d(for)h(`kill')h(and)g(`y)o(ank'.\))137
+2615 y(If)g(the)f(description)h(for)f(a)g(command)g(sa)o(ys)f(that)h
+(it)g(`kills')h(text,)e(then)i(y)o(ou)f(can)g(b)q(e)h(sure)f(that)f(y)o
+(ou)75 2670 y(can)h(get)g(the)g(text)g(bac)o(k)g(in)h(a)f(di\013eren)o
+(t)g(\(or)g(the)g(same\))g(place)h(later.)p eop
+%%Page: 3 5
+3 4 bop 75 -58 a Fn(Chapter)15 b(1:)k(Command)c(Line)i(Editing)1077
+b(3)137 183 y(When)12 b(y)o(ou)g(use)g(a)f(kill)i(command,)f(the)g
+(text)f(is)h(sa)o(v)o(ed)f(in)i(a)e Ff(kill-ring)p Fn(.)21
+b(An)o(y)12 b(n)o(um)o(b)q(er)g(of)f(consecutiv)o(e)75
+238 y(kills)17 b(sa)o(v)o(e)e(all)h(of)f(the)h(killed)i(text)d
+(together,)f(so)h(that)g(when)h(y)o(ou)f(y)o(ank)g(it)h(bac)o(k,)f(y)o
+(ou)g(get)g(it)h(all.)22 b(The)75 293 y(kill)c(ring)f(is)f(not)g(line)i
+(sp)q(eci\014c;)g(the)e(text)g(that)f(y)o(ou)h(killed)j(on)d(a)g
+(previously)h(t)o(yp)q(ed)g(line)h(is)e(a)o(v)m(ailable)75
+348 y(to)f(b)q(e)g(y)o(ank)o(ed)g(bac)o(k)h(later,)e(when)i(y)o(ou)f
+(are)g(t)o(yping)g(another)g(line.)137 415 y(Here)h(is)f(the)h(list)g
+(of)e(commands)h(for)g(killing)j(text.)75 492 y Fh(h)p
+87 466 56 2 v 87 494 a Fg(C-k)p 87 502 V 141 492 a Fh(i)315
+494 y Fn(Kill)f(the)f(text)e(from)h(the)g(curren)o(t)g(cursor)g(p)q
+(osition)h(to)f(the)g(end)h(of)f(the)g(line.)75 571 y
+Fh(h)p 87 545 64 2 v 87 573 a Fg(M-d)p 87 581 V 149 571
+a Fh(i)315 573 y Fn(Kill)g(from)e(the)g(cursor)g(to)f(the)i(end)g(of)e
+(the)i(curren)o(t)f(w)o(ord,)f(or,)h(if)g(b)q(et)o(w)o(een)h(w)o(ords,)
+e(to)h(the)315 628 y(end)j(of)f(the)g(next)g(w)o(ord.)k(W)l(ord)c(b)q
+(oundaries)i(are)e(the)g(same)g(as)g(those)f(used)i(b)o(y)1728
+626 y Fh(h)p 1740 600 55 2 v 1740 628 a Fg(M-f)p 1740
+636 V 1793 626 a Fh(i)1808 628 y Fn(.)75 705 y Fh(h)p
+87 679 118 2 v 87 707 a Fg(M-DEL)p 87 715 V 202 705 a
+Fh(i)315 707 y Fn(Kill)21 b(from)e(the)g(cursor)f(the)h(start)f(of)h
+(the)g(previous)h(w)o(ord,)f(or,)g(if)g(b)q(et)o(w)o(een)h(w)o(ords,)f
+(to)315 762 y(the)14 b(start)f(of)g(the)h(previous)g(w)o(ord.)19
+b(W)l(ord)14 b(b)q(oundaries)h(are)e(the)h(same)g(as)f(those)h(used)g
+(b)o(y)315 815 y Fh(h)p 327 789 64 2 v 327 817 a Fg(M-b)p
+327 825 V 389 815 a Fh(i)404 817 y Fn(.)75 894 y Fh(h)p
+87 868 63 2 v 87 896 a Fg(C-w)p 87 904 V 148 894 a Fh(i)315
+896 y Fn(Kill)k(from)d(the)h(cursor)g(to)f(the)h(previous)h
+(whitespace.)22 b(This)17 b(is)f(di\013eren)o(t)g(than)1733
+894 y Fh(h)p 1745 868 118 2 v 1745 896 a Fg(M-DEL)p 1745
+904 V 1860 894 a Fh(i)315 951 y Fn(b)q(ecause)g(the)f(w)o(ord)g(b)q
+(oundaries)h(di\013er.)137 1030 y(Here)21 b(is)h(ho)o(w)e(to)g
+Ff(y)o(ank)j Fn(the)e(text)f(bac)o(k)h(in)o(to)g(the)f(line.)39
+b(Y)l(anking)21 b(means)g(to)f(cop)o(y)h(the)g(most-)75
+1085 y(recen)o(tly-killed)d(text)d(from)f(the)i(kill)h(bu\013er.)75
+1163 y Fh(h)p 87 1137 56 2 v 87 1165 a Fg(C-y)p 87 1172
+V 141 1163 a Fh(i)315 1165 y Fn(Y)l(ank)e(the)h(most)e(recen)o(tly)i
+(killed)h(text)e(bac)o(k)g(in)o(to)g(the)h(bu\013er)f(at)f(the)i
+(cursor.)75 1242 y Fh(h)p 87 1216 63 2 v 87 1244 a Fg(M-y)p
+87 1252 V 148 1242 a Fh(i)315 1244 y Fn(Rotate)h(the)g(kill-ring,)j
+(and)d(y)o(ank)g(the)h(new)f(top.)26 b(Y)l(ou)17 b(can)h(only)g(do)f
+(this)h(if)f(the)h(prior)315 1299 y(command)d(is)568
+1297 y Fh(h)p 580 1271 56 2 v 580 1299 a Fg(C-y)p 580
+1306 V 634 1297 a Fh(i)664 1299 y Fn(or)719 1297 y Fh(h)p
+732 1271 63 2 v 732 1299 a Fg(M-y)p 732 1306 V 792 1297
+a Fh(i)807 1299 y Fn(.)75 1410 y Fe(1.2.4)30 b(Readline)20
+b(Argumen)n(ts)137 1506 y Fn(Y)l(ou)15 b(can)g(pass)f(n)o(umeric)i
+(argumen)o(ts)e(to)g(Readline)i(commands.)k(Sometimes)15
+b(the)g(argumen)o(t)e(acts)75 1561 y(as)20 b(a)g(rep)q(eat)g(coun)o(t,)
+h(other)f(times)g(it)h(is)g(the)f Ff(sign)h Fn(of)f(the)g(argumen)o(t)f
+(that)h(is)h(signi\014can)o(t.)36 b(If)20 b(y)o(ou)75
+1616 y(pass)d(a)f(negativ)o(e)h(argumen)o(t)f(to)g(a)g(command)h(whic)o
+(h)h(normally)f(acts)f(in)i(a)e(forw)o(ard)g(direction,)i(that)75
+1671 y(command)g(will)h(act)e(in)i(a)e(bac)o(kw)o(ard)g(direction.)28
+b(F)l(or)17 b(example,)i(to)e(kill)j(text)d(bac)o(k)g(to)g(the)h(start)
+e(of)75 1726 y(the)f(line,)i(y)o(ou)e(migh)o(t)g(t)o(yp)q(e)g(`)p
+Fm(M--)f(C-k)p Fn('.)137 1793 y(The)h(general)f(w)o(a)o(y)f(to)h(pass)g
+(n)o(umeric)h(argumen)o(ts)e(to)g(a)h(command)g(is)h(to)e(t)o(yp)q(e)h
+(meta)g(digits)h(b)q(efore)75 1847 y(the)h(command.)k(If)c(the)f
+(\014rst)g(`digit')h(t)o(yp)q(ed)f(is)h(a)g(min)o(us)g(sign)g(\(`)p
+Fm(-)p Fn('\),)d(then)j(the)f(sign)h(of)f(the)h(argumen)o(t)75
+1902 y(will)g(b)q(e)f(negativ)o(e.)k(Once)c(y)o(ou)f(ha)o(v)o(e)g(t)o
+(yp)q(ed)g(one)h(meta)e(digit)i(to)f(get)f(the)h(argumen)o(t)g
+(started,)f(y)o(ou)h(can)75 1957 y(t)o(yp)q(e)19 b(the)g(remainder)g
+(of)f(the)h(digits,)h(and)f(then)g(the)g(command.)30
+b(F)l(or)18 b(example,)i(to)e(giv)o(e)h(the)1793 1955
+y Fh(h)p 1805 1929 57 2 v 1805 1957 a Fg(C-d)p 1805 1965
+V 1860 1955 a Fh(i)75 2012 y Fn(command)c(an)g(argumen)o(t)g(of)f(10,)h
+(y)o(ou)f(could)j(t)o(yp)q(e)e(`)p Fm(M-1)f(0)h(C-d)p
+Fn('.)75 2123 y Fe(1.2.5)30 b(Searc)n(hing)21 b(for)f(Commands)h(in)f
+(the)h(History)137 2219 y Fn(Readline)e(pro)o(vides)d(commands)g(for)g
+(searc)o(hing)g(through)g(the)g(command)g(history)g(for)g(lines)i(con-)
+75 2274 y(taining)e(a)f(sp)q(eci\014ed)i(string.)j(There)c(are)e(t)o(w)
+o(o)g(searc)o(h)h(mo)q(des:)20 b Ff(incremen)o(tal)e
+Fn(and)e Ff(non-incremen)o(tal)p Fn(.)137 2341 y(Incremen)o(tal)e
+(searc)o(hes)f(b)q(egin)h(b)q(efore)f(the)g(user)g(has)g(\014nished)h
+(t)o(yping)f(the)g(searc)o(h)g(string.)19 b(As)13 b(eac)o(h)75
+2396 y(c)o(haracter)k(of)g(the)h(searc)o(h)g(string)f(is)h(t)o(yp)q
+(ed,)h(Readline)h(displa)o(ys)e(the)g(next)g(en)o(try)f(from)g(the)h
+(history)75 2451 y(matc)o(hing)12 b(the)g(string)g(t)o(yp)q(ed)g(so)g
+(far.)18 b(An)13 b(incremen)o(tal)g(searc)o(h)f(requires)g(only)h(as)f
+(man)o(y)f(c)o(haracters)g(as)75 2506 y(needed)16 b(to)d(\014nd)j(the)e
+(desired)i(history)e(en)o(try)l(.)19 b(T)l(o)c(searc)o(h)f(bac)o(kw)o
+(ard)f(in)j(the)e(history)g(for)g(a)g(particular)75 2560
+y(string,)g(t)o(yp)q(e)317 2558 y Fh(h)p 329 2532 51
+2 v 329 2560 a Fg(C-r)p 329 2568 V 378 2558 a Fh(i)393
+2560 y Fn(.)19 b(T)o(yping)580 2558 y Fh(h)p 592 2532
+52 2 v 592 2560 a Fg(C-s)p 592 2568 V 641 2558 a Fh(i)670
+2560 y Fn(searc)o(hes)14 b(forw)o(ard)f(through)g(the)h(history)l(.)20
+b(The)14 b(c)o(haracters)f(presen)o(t)75 2615 y(in)20
+b(the)f(v)m(alue)h(of)f(the)g Fm(isearch-terminators)d
+Fn(v)m(ariable)k(are)f(used)h(to)e(terminate)h(an)g(incremen)o(tal)75
+2670 y(searc)o(h.)29 b(If)19 b(that)e(v)m(ariable)j(has)e(not)g(b)q
+(een)i(assigned)f(a)f(v)m(alue,)i(the)1282 2668 y Fh(h)p
+1294 2642 70 2 v 1294 2670 a Fg(ESC)p 1294 2678 V 1361
+2668 a Fh(i)1395 2670 y Fn(and)1486 2668 y Fh(h)p 1498
+2642 56 2 v 1498 2670 a Fg(C-J)p 1498 2678 V 1551 2668
+a Fh(i)1585 2670 y Fn(c)o(haracters)d(will)p eop
+%%Page: 4 6
+4 5 bop 75 -58 a Fn(4)1322 b(GNU)15 b(Readline)i(Library)75
+183 y(terminate)k(an)f(incremen)o(tal)i(searc)o(h.)780
+181 y Fh(h)p 792 155 55 2 v 792 183 a Fg(C-g)p 792 191
+V 845 181 a Fh(i)880 183 y Fn(will)g(ab)q(ort)e(an)h(incremen)o(tal)h
+(searc)o(h)e(and)h(restore)f(the)75 238 y(original)c(line.)21
+b(When)15 b(the)f(searc)o(h)g(is)h(terminated,)g(the)f(history)h(en)o
+(try)f(con)o(taining)h(the)g(searc)o(h)f(string)75 293
+y(b)q(ecomes)i(the)f(curren)o(t)g(line.)137 357 y(T)l(o)g(\014nd)h
+(other)e(matc)o(hing)h(en)o(tries)h(in)f(the)g(history)g(list,)h(t)o
+(yp)q(e)1231 355 y Fh(h)p 1243 329 51 2 v 1243 357 a
+Fg(C-r)p 1243 364 V 1292 355 a Fh(i)1322 357 y Fn(or)1377
+355 y Fh(h)p 1389 329 52 2 v 1389 357 a Fg(C-s)p 1389
+364 V 1438 355 a Fh(i)1468 357 y Fn(as)f(appropriate.)k(This)75
+412 y(will)c(searc)o(h)e(bac)o(kw)o(ard)f(or)g(forw)o(ard)g(in)i(the)f
+(history)g(for)g(the)g(next)g(en)o(try)g(matc)o(hing)g(the)g(searc)o(h)
+g(string)75 466 y(t)o(yp)q(ed)19 b(so)g(far.)30 b(An)o(y)19
+b(other)f(k)o(ey)h(sequence)h(b)q(ound)g(to)e(a)h(Readline)i(command)d
+(will)j(terminate)e(the)75 521 y(searc)o(h)h(and)h(execute)g(that)f
+(command.)35 b(F)l(or)20 b(instance,)i(a)1151 519 y Fh(h)p
+1163 493 76 2 v 1163 521 a Fg(RET)p 1163 529 V 1236 519
+a Fh(i)1271 521 y Fn(will)g(terminate)f(the)f(searc)o(h)h(and)75
+576 y(accept)15 b(the)h(line,)g(thereb)o(y)f(executing)i(the)e(command)
+g(from)g(the)g(history)g(list.)137 640 y(Non-incremen)o(tal)25
+b(searc)o(hes)e(read)h(the)f(en)o(tire)h(searc)o(h)f(string)g(b)q
+(efore)h(starting)f(to)f(searc)o(h)i(for)75 695 y(matc)o(hing)d
+(history)h(lines.)39 b(The)22 b(searc)o(h)f(string)g(ma)o(y)g(b)q(e)h
+(t)o(yp)q(ed)f(b)o(y)h(the)f(user)h(or)e(b)q(e)i(part)f(of)g(the)75
+750 y(con)o(ten)o(ts)15 b(of)f(the)i(curren)o(t)f(line.)75
+868 y Fl(1.3)33 b(Readline)23 b(Init)h(File)137 961 y
+Fn(Although)f(the)g(Readline)i(library)e(comes)g(with)g(a)f(set)g(of)g
+(Emacs-lik)o(e)i(k)o(eybindings)g(installed)75 1016 y(b)o(y)d(default,)
+h(it)f(is)h(p)q(ossible)g(to)e(use)i(a)e(di\013eren)o(t)h(set)g(of)f(k)
+o(eybindings.)39 b(An)o(y)20 b(user)h(can)g(customize)75
+1071 y(programs)15 b(that)h(use)g(Readline)j(b)o(y)d(putting)g
+(commands)g(in)i(an)e Ff(inputrc)k Fn(\014le,)d(con)o(v)o(en)o
+(tionally)g(in)g(his)75 1126 y(home)g(directory)l(.)24
+b(The)17 b(name)g(of)f(this)h(\014le)g(is)g(tak)o(en)g(from)e(the)i(v)m
+(alue)h(of)e(the)h(en)o(vironmen)o(t)g(v)m(ariable)75
+1181 y Fm(INPUTRC)p Fn(.)i(If)c(that)g(v)m(ariable)h(is)g(unset,)f(the)
+g(default)h(is)g(`)p Fm(~/.inputrc)p Fn('.)137 1244 y(When)f(a)g
+(program)f(whic)o(h)h(uses)g(the)g(Readline)i(library)f(starts)d(up,)i
+(the)g(init)h(\014le)g(is)f(read,)g(and)g(the)75 1299
+y(k)o(ey)g(bindings)i(are)e(set.)137 1363 y(In)f(addition,)h(the)e
+Fm(C-x)i(C-r)e Fn(command)g(re-reads)h(this)g(init)g(\014le,)h(th)o(us)
+e(incorp)q(orating)h(an)o(y)f(c)o(hanges)75 1418 y(that)h(y)o(ou)h
+(migh)o(t)g(ha)o(v)o(e)g(made)g(to)g(it.)75 1520 y Fe(1.3.1)30
+b(Readline)20 b(Init)g(File)h(Syn)n(tax)137 1613 y Fn(There)c(are)g
+(only)g(a)g(few)f(basic)i(constructs)e(allo)o(w)o(ed)i(in)f(the)g
+(Readline)i(init)f(\014le.)26 b(Blank)18 b(lines)g(are)75
+1668 y(ignored.)36 b(Lines)22 b(b)q(eginning)h(with)d(a)h(`)p
+Fm(#)p Fn(')e(are)h(commen)o(ts.)35 b(Lines)22 b(b)q(eginning)h(with)e
+(a)f(`)p Fm($)p Fn(')f(indicate)75 1723 y(conditional)c(constructs)f
+(\(see)g(Section)g(1.3.2)f([Conditional)h(Init)h(Constructs],)e(page)h
+(8\).)k(Other)c(lines)75 1778 y(denote)h(v)m(ariable)i(settings)e(and)h
+(k)o(ey)f(bindings.)75 1851 y(V)l(ariable)h(Settings)315
+1906 y(Y)l(ou)k(can)h(mo)q(dify)g(the)f(run-time)h(b)q(eha)o(vior)g(of)
+e(Readline)k(b)o(y)d(altering)h(the)f(v)m(alues)h(of)315
+1960 y(v)m(ariables)13 b(in)g(Readline)i(using)d(the)g
+Fm(set)g Fn(command)g(within)h(the)f(init)h(\014le.)20
+b(Here)13 b(is)f(ho)o(w)g(to)315 2015 y(c)o(hange)e(from)g(the)g
+(default)h(Emacs-lik)o(e)g(k)o(ey)f(binding)i(to)e(use)g
+Fm(vi)g Fn(line)i(editing)g(commands:)435 2076 y Fm(set)23
+b(editing-mode)g(vi)315 2140 y Fn(A)15 b(great)g(deal)g(of)g(run-time)h
+(b)q(eha)o(vior)g(is)g(c)o(hangeable)g(with)f(the)h(follo)o(wing)f(v)m
+(ariables.)315 2213 y Fm(bell-style)555 2268 y Fn(Con)o(trols)21
+b(what)h(happ)q(ens)h(when)f(Readline)i(w)o(an)o(ts)d(to)g(ring)i(the)f
+(termi-)555 2323 y(nal)d(b)q(ell.)32 b(If)19 b(set)f(to)g(`)p
+Fm(none)p Fn(',)g(Readline)j(nev)o(er)e(rings)g(the)f(b)q(ell.)32
+b(If)19 b(set)g(to)555 2378 y(`)p Fm(visible)p Fn(',)c(Readline)j(uses)
+f(a)f(visible)j(b)q(ell)g(if)e(one)f(is)h(a)o(v)m(ailable.)26
+b(If)16 b(set)h(to)555 2432 y(`)p Fm(audible)p Fn(')g(\(the)h
+(default\),)i(Readline)h(attempts)d(to)g(ring)h(the)g(terminal's)555
+2487 y(b)q(ell.)315 2560 y Fm(comment-begin)555 2615
+y Fn(The)c(string)f(to)g(insert)i(at)d(the)i(b)q(eginning)i(of)d(the)h
+(line)h(when)f(the)g Fm(insert-)555 2670 y(comment)f
+Fn(command)h(is)h(executed.)21 b(The)15 b(default)h(v)m(alue)g(is)g
+Fm("#")p Fn(.)p eop
+%%Page: 5 7
+5 6 bop 75 -58 a Fn(Chapter)15 b(1:)k(Command)c(Line)i(Editing)1077
+b(5)315 183 y Fm(completion-ignore-case)555 238 y Fn(If)14
+b(set)f(to)g(`)p Fm(on)p Fn(',)g(Readline)j(p)q(erforms)d(\014lename)i
+(matc)o(hing)f(and)g(completion)555 293 y(in)i(a)f(case-insensitiv)o(e)
+i(fashion.)k(The)15 b(default)h(v)m(alue)g(is)g(`)p Fm(off)p
+Fn('.)315 384 y Fm(completion-query-items)555 439 y Fn(The)d(n)o(um)o
+(b)q(er)h(of)e(p)q(ossible)j(completions)g(that)d(determines)i(when)g
+(the)f(user)555 494 y(is)21 b(ask)o(ed)g(whether)g(he)h(w)o(an)o(ts)d
+(to)i(see)g(the)g(list)h(of)e(p)q(ossibilitie)q(s.)40
+b(If)21 b(the)555 549 y(n)o(um)o(b)q(er)14 b(of)f(p)q(ossible)i
+(completions)f(is)g(greater)f(than)g(this)h(v)m(alue,)h(Readline)555
+604 y(will)g(ask)e(the)g(user)h(whether)f(or)g(not)g(he)g(wishes)h(to)f
+(view)h(them;)f(otherwise,)555 658 y(they)i(are)g(simply)i(listed.)k
+(The)15 b(default)h(limit)h(is)e Fm(100)p Fn(.)315 750
+y Fm(convert-meta)555 805 y Fn(If)i(set)g(to)g(`)p Fm(on)p
+Fn(',)f(Readline)k(will)e(con)o(v)o(ert)f(c)o(haracters)f(with)i(the)f
+(eigh)o(th)g(bit)555 860 y(set)f(to)f(an)h(ASCI)q(I)h(k)o(ey)f
+(sequence)h(b)o(y)f(stripping)h(the)f(eigh)o(th)h(bit)f(and)h(pre-)555
+915 y(\014xing)i(an)749 913 y Fh(h)p 761 887 70 2 v 761
+915 a Fg(ESC)p 761 922 V 828 913 a Fh(i)861 915 y Fn(c)o(haracter,)f
+(con)o(v)o(erting)g(them)g(to)g(a)f(meta-pre\014xed)i(k)o(ey)555
+969 y(sequence.)i(The)15 b(default)h(v)m(alue)h(is)e(`)p
+Fm(on)p Fn('.)315 1061 y Fm(disable-completion)555 1116
+y Fn(If)k(set)f(to)f(`)p Fm(On)p Fn(',)h(Readline)j(will)f(inhibit)g(w)
+o(ord)e(completion.)30 b(Completion)555 1171 y(c)o(haracters)12
+b(will)j(b)q(e)f(inserted)g(in)o(to)f(the)g(line)h(as)f(if)h(they)f
+(had)g(b)q(een)h(mapp)q(ed)555 1225 y(to)h Fm(self-insert)p
+Fn(.)j(The)d(default)h(is)g(`)p Fm(off)p Fn('.)315 1317
+y Fm(editing-mode)555 1372 y Fn(The)f Fm(editing-mode)d
+Fn(v)m(ariable)k(con)o(trols)e(whic)o(h)h(default)g(set)f(of)g(k)o(ey)g
+(bind-)555 1427 y(ings)f(is)g(used.)20 b(By)12 b(default,)i(Readline)g
+(starts)e(up)h(in)g(Emacs)f(editing)i(mo)q(de,)555 1481
+y(where)h(the)f(k)o(eystrok)o(es)g(are)g(most)g(similar)i(to)d(Emacs.)
+20 b(This)15 b(v)m(ariable)h(can)555 1536 y(b)q(e)g(set)f(to)f(either)i
+(`)p Fm(emacs)p Fn(')e(or)h(`)p Fm(vi)p Fn('.)315 1628
+y Fm(enable-keypad)555 1683 y Fn(When)d(set)f(to)h(`)p
+Fm(on)p Fn(',)e(Readline)k(will)g(try)d(to)g(enable)i(the)f
+(application)h(k)o(eypad)555 1737 y(when)h(it)f(is)h(called.)21
+b(Some)13 b(systems)g(need)h(this)g(to)f(enable)h(the)g(arro)o(w)e(k)o
+(eys.)555 1792 y(The)j(default)h(is)g(`)p Fm(off)p Fn('.)315
+1884 y Fm(expand-tilde)555 1939 y Fn(If)e(set)g(to)f(`)p
+Fm(on)p Fn(',)f(tilde)k(expansion)e(is)h(p)q(erformed)f(when)g
+(Readline)i(attempts)555 1994 y(w)o(ord)f(completion.)21
+b(The)15 b(default)h(is)f(`)p Fm(off)p Fn('.)315 2085
+y Fm(horizontal-scroll-mode)555 2140 y Fn(This)k(v)m(ariable)g(can)f(b)
+q(e)g(set)g(to)f(either)i(`)p Fm(on)p Fn(')e(or)g(`)p
+Fm(off)p Fn('.)27 b(Setting)19 b(it)f(to)f(`)p Fm(on)p
+Fn(')555 2195 y(means)c(that)f(the)i(text)e(of)h(the)g(lines)i(b)q
+(eing)f(edited)g(will)h(scroll)f(horizon)o(tally)555
+2250 y(on)i(a)f(single)i(screen)g(line)g(when)g(they)f(are)f(longer)h
+(than)g(the)g(width)g(of)g(the)555 2304 y(screen,)e(instead)f(of)g
+(wrapping)g(on)o(to)f(a)h(new)g(screen)h(line.)21 b(By)13
+b(default,)h(this)555 2359 y(v)m(ariable)j(is)e(set)g(to)g(`)p
+Fm(off)p Fn('.)315 2451 y Fm(input-meta)555 2506 y Fn(If)h(set)g(to)f
+(`)p Fm(on)p Fn(',)f(Readline)k(will)g(enable)f(eigh)o(t-bit)f(input)h
+(\(it)f(will)h(not)f(strip)555 2560 y(the)f(eigh)o(th)g(bit)h(from)e
+(the)h(c)o(haracters)f(it)i(reads\),)e(regardless)h(of)f(what)h(the)555
+2615 y(terminal)21 b(claims)g(it)f(can)g(supp)q(ort.)34
+b(The)20 b(default)h(v)m(alue)g(is)g(`)p Fm(off)p Fn('.)33
+b(The)555 2670 y(name)15 b Fm(meta-flag)f Fn(is)i(a)f(synon)o(ym)g(for)
+f(this)i(v)m(ariable.)p eop
+%%Page: 6 8
+6 7 bop 75 -58 a Fn(6)1322 b(GNU)15 b(Readline)i(Library)315
+183 y Fm(isearch-terminators)555 238 y Fn(The)26 b(string)g(of)f(c)o
+(haracters)g(that)g(should)i(terminate)f(an)g(incremen)o(tal)555
+293 y(searc)o(h)e(without)h(subsequen)o(tly)g(executing)h(the)e(c)o
+(haracter)g(as)g(a)g(com-)555 348 y(mand)19 b(\(see)f(Section)i(1.2.5)d
+([Searc)o(hing],)i(page)f(3\).)29 b(If)19 b(this)g(v)m(ariable)h(has)
+555 402 y(not)13 b(b)q(een)h(giv)o(en)g(a)f(v)m(alue,)i(the)e(c)o
+(haracters)1312 400 y Fh(h)p 1324 374 70 2 v 1324 402
+a Fg(ESC)p 1324 410 V 1391 400 a Fh(i)1419 402 y Fn(and)1505
+400 y Fh(h)p 1518 374 56 2 v 1518 402 a Fg(C-J)p 1518
+410 V 1571 400 a Fh(i)1599 402 y Fn(will)i(terminate)555
+457 y(an)g(incremen)o(tal)h(searc)o(h.)315 540 y Fm(keymap)114
+b Fn(Sets)17 b(Readline's)j(idea)e(of)f(the)h(curren)o(t)g(k)o(eymap)f
+(for)g(k)o(ey)g(binding)j(com-)555 595 y(mands.)41 b(Acceptable)23
+b Fm(keymap)f Fn(names)g(are)f Fm(emacs)p Fn(,)i Fm(emacs-standard)p
+Fn(,)555 650 y Fm(emacs-meta)p Fn(,)15 b Fm(emacs-ctlx)p
+Fn(,)h Fm(vi)p Fn(,)g Fm(vi-command)p Fn(,)g(and)h Fm(vi-insert)p
+Fn(.)23 b Fm(vi)16 b Fn(is)555 705 y(equiv)m(alen)o(t)e(to)f
+Fm(vi-command)p Fn(;)e Fm(emacs)h Fn(is)i(equiv)m(alen)o(t)g(to)e
+Fm(emacs-standard)p Fn(.)555 759 y(The)f(default)h(v)m(alue)g(is)f
+Fm(emacs)p Fn(.)18 b(The)11 b(v)m(alue)i(of)d(the)h Fm(editing-mode)f
+Fn(v)m(ariable)555 814 y(also)15 b(a\013ects)g(the)g(default)h(k)o
+(eymap.)315 897 y Fm(mark-directories)555 952 y Fn(If)j(set)g(to)g(`)p
+Fm(on)p Fn(',)f(completed)i(directory)g(names)f(ha)o(v)o(e)f(a)h(slash)
+h(app)q(ended.)555 1007 y(The)15 b(default)h(is)g(`)p
+Fm(on)p Fn('.)315 1090 y Fm(mark-modified-lines)555 1145
+y Fn(This)j(v)m(ariable,)g(when)g(set)e(to)h(`)p Fm(on)p
+Fn(',)f(causes)h(Readline)i(to)d(displa)o(y)i(an)f(as-)555
+1200 y(terisk)f(\(`)p Fm(*)p Fn('\))e(at)i(the)f(start)g(of)h(history)f
+(lines)j(whic)o(h)e(ha)o(v)o(e)g(b)q(een)h(mo)q(di\014ed.)555
+1254 y(This)e(v)m(ariable)g(is)g(`)p Fm(off)p Fn(')e(b)o(y)h(default.)
+315 1337 y Fm(output-meta)555 1392 y Fn(If)j(set)f(to)g(`)p
+Fm(on)p Fn(',)g(Readline)j(will)g(displa)o(y)f(c)o(haracters)d(with)j
+(the)e(eigh)o(th)h(bit)555 1447 y(set)g(directly)i(rather)d(than)h(as)g
+(a)g(meta-pre\014xed)h(escap)q(e)g(sequence.)30 b(The)555
+1502 y(default)16 b(is)f(`)p Fm(off)p Fn('.)315 1585
+y Fm(print-completions-horizont)o(ally)555 1640 y Fn(If)d(set)g(to)f(`)
+p Fm(on)p Fn(',)h(Readline)i(will)f(displa)o(y)h(completions)f(with)f
+(matc)o(hes)f(sorted)555 1694 y(horizon)o(tally)23 b(in)f(alphab)q
+(etical)i(order,)f(rather)e(than)g(do)o(wn)h(the)g(screen.)555
+1749 y(The)15 b(default)h(is)g(`)p Fm(off)p Fn('.)315
+1832 y Fm(show-all-if-ambiguous)555 1887 y Fn(This)g(alters)e(the)i
+(default)f(b)q(eha)o(vior)h(of)e(the)h(completion)h(functions.)21
+b(If)15 b(set)555 1942 y(to)e(`)p Fm(on)p Fn(',)g(w)o(ords)g(whic)o(h)h
+(ha)o(v)o(e)g(more)f(than)g(one)h(p)q(ossible)i(completion)f(cause)555
+1997 y(the)20 b(matc)o(hes)f(to)f(b)q(e)j(listed)f(immediately)h
+(instead)f(of)f(ringing)i(the)e(b)q(ell.)555 2051 y(The)c(default)h(v)m
+(alue)h(is)e(`)p Fm(off)p Fn('.)315 2134 y Fm(visible-stats)555
+2189 y Fn(If)h(set)g(to)f(`)p Fm(on)p Fn(',)g(a)h(c)o(haracter)f
+(denoting)h(a)g(\014le's)h(t)o(yp)q(e)f(is)g(app)q(ended)i(to)d(the)555
+2244 y(\014lename)h(when)g(listing)h(p)q(ossible)g(completions.)j(The)c
+(default)g(is)f(`)p Fm(off)p Fn('.)75 2327 y(Key)h(Bindings)315
+2382 y(The)21 b(syn)o(tax)f(for)h(con)o(trolling)h(k)o(ey)f(bindings)h
+(in)g(the)f(init)h(\014le)g(is)g(simple.)39 b(First)20
+b(y)o(ou)315 2437 y(need)15 b(to)e(\014nd)h(the)g(name)g(of)g(the)f
+(command)h(that)f(y)o(ou)h(w)o(an)o(t)f(to)g(c)o(hange.)19
+b(The)14 b(follo)o(wing)315 2491 y(sections)k(con)o(tain)h(tables)f(of)
+f(the)h(command)g(name,)g(the)g(default)h(k)o(eybinding,)h(if)e(an)o(y)
+l(,)315 2546 y(and)d(a)g(short)g(description)i(of)d(what)h(the)g
+(command)g(do)q(es.)315 2615 y(Once)j(y)o(ou)g(kno)o(w)e(the)i(name)f
+(of)g(the)h(command,)f(simply)i(place)g(the)e(name)h(of)f(the)g(k)o(ey)
+315 2670 y(y)o(ou)c(wish)h(to)f(bind)i(the)f(command)f(to,)g(a)g
+(colon,)h(and)g(then)f(the)h(name)f(of)h(the)f(command)p
+eop
+%%Page: 7 9
+7 8 bop 75 -58 a Fn(Chapter)15 b(1:)k(Command)c(Line)i(Editing)1077
+b(7)315 183 y(on)19 b(a)g(line)i(in)f(the)g(init)g(\014le.)34
+b(The)19 b(name)h(of)e(the)i(k)o(ey)f(can)h(b)q(e)g(expressed)g(in)g
+(di\013eren)o(t)315 238 y(w)o(a)o(ys,)14 b(dep)q(ending)j(on)e(whic)o
+(h)h(is)g(most)e(comfortable)h(for)g(y)o(ou.)315 316
+y Ff(k)o(eyname)s Fn(:)k Ff(function-name)g Fn(or)c Ff(macro)555
+371 y(k)o(eyname)i Fn(is)e(the)f(name)h(of)f(a)g(k)o(ey)g(sp)q(elled)j
+(out)d(in)h(English.)21 b(F)l(or)13 b(example:)675 435
+y Fm(Control-u:)22 b(universal-argument)675 487 y(Meta-Rubout:)g
+(backward-kill-word)675 538 y(Control-o:)g(">)i(output")555
+605 y Fn(In)19 b(the)f(ab)q(o)o(v)o(e)g(example,)1023
+603 y Fh(h)p 1035 577 57 2 v 1035 605 a Fg(C-u)p 1035
+613 V 1090 603 a Fh(i)1123 605 y Fn(is)h(b)q(ound)g(to)f(the)g
+(function)h Fm(universal-)555 660 y(argument)p Fn(,)g(and)872
+658 y Fh(h)p 884 632 55 2 v 884 660 a Fg(C-o)p 884 667
+V 937 658 a Fh(i)971 660 y Fn(is)h(b)q(ound)g(to)f(run)h(the)f(macro)g
+(expressed)h(on)g(the)555 715 y(righ)o(t)13 b(hand)h(side)h(\(that)e
+(is,)h(to)f(insert)h(the)g(text)f(`)p Fm(>)h(output)p
+Fn(')f(in)o(to)g(the)h(line\).)315 793 y Fm(")p Ff(k)o(eyseq)q
+Fm(")p Fn(:)20 b Ff(function-name)e Fn(or)d Ff(macro)555
+848 y(k)o(eyseq)i Fn(di\013ers)e(from)g Ff(k)o(eyname)j
+Fn(ab)q(o)o(v)o(e)d(in)i(that)d(strings)i(denoting)g(an)f(en-)555
+902 y(tire)i(k)o(ey)g(sequence)h(can)f(b)q(e)g(sp)q(eci\014ed,)i(b)o(y)
+e(placing)h(the)f(k)o(ey)g(sequence)h(in)555 957 y(double)e(quotes.)j
+(Some)c Fi(gnu)g Fn(Emacs)f(st)o(yle)h(k)o(ey)g(escap)q(es)g(can)g(b)q
+(e)g(used,)g(as)555 1012 y(in)j(the)f(follo)o(wing)g(example,)h(but)f
+(the)g(sp)q(ecial)i(c)o(haracter)d(names)h(are)f(not)555
+1067 y(recognized.)675 1130 y Fm("\\C-u":)23 b(universal-argument)675
+1182 y("\\C-x\\C-r":)f(re-read-init-file)675 1234 y("\\e[11~":)h
+("Function)f(Key)i(1")555 1301 y Fn(In)19 b(the)f(ab)q(o)o(v)o(e)g
+(example,)1023 1299 y Fh(h)p 1035 1273 57 2 v 1035 1301
+a Fg(C-u)p 1035 1308 V 1090 1299 a Fh(i)1123 1301 y Fn(is)h(b)q(ound)g
+(to)f(the)g(function)h Fm(universal-)555 1355 y(argument)9
+b Fn(\(just)h(as)h(it)g(w)o(as)e(in)j(the)e(\014rst)h(example\),)g(`)
+1463 1353 y Fh(h)p 1475 1327 56 2 v 1475 1355 a Fg(C-x)p
+1475 1363 V 1529 1353 a Fh(i)k(h)p 1571 1327 51 2 v 1571
+1355 a Fg(C-r)p 1571 1363 V 1620 1353 a Fh(i)1635 1355
+y Fn(')10 b(is)h(b)q(ound)h(to)555 1410 y(the)k(function)i
+Fm(re-read-init-file)p Fn(,)c(and)i(`)1351 1408 y Fh(h)p
+1363 1382 70 2 v 1363 1410 a Fg(ESC)p 1363 1418 V 1430
+1408 a Fh(i)f(h)p 1472 1382 10 2 v 1472 1410 a Fg([)p
+1472 1419 V 1480 1408 a Fh(i)g(h)p 1522 1382 18 2 v 1522
+1410 a Fg(1)p 1522 1418 V 1538 1408 a Fh(i)g(h)p 1580
+1382 V 1580 1410 a Fg(1)p 1580 1418 V 1595 1408 a Fh(i)g(h)p
+1637 1382 24 2 v 1637 1410 a Fm(~)p 1637 1418 V 1659
+1408 a Fh(i)1674 1410 y Fn(')h(is)h(b)q(ound)555 1465
+y(to)e(insert)g(the)g(text)g(`)p Fm(Function)f(Key)h(1)p
+Fn('.)315 1543 y(The)g(follo)o(wing)h Fi(gnu)e Fn(Emacs)h(st)o(yle)g
+(escap)q(e)h(sequences)g(are)e(a)o(v)m(ailable)j(when)e(sp)q(ecifying)
+315 1598 y(k)o(ey)g(sequences:)315 1676 y Fd(\\C-)168
+b Fn(con)o(trol)15 b(pre\014x)315 1755 y Fd(\\M-)168
+b Fn(meta)15 b(pre\014x)315 1833 y Fd(\\e)192 b Fn(an)15
+b(escap)q(e)h(c)o(haracter)315 1911 y Fd(\\\\)192 b Fn(bac)o(kslash)315
+1989 y Fd(\\)p Fm(")555 1987 y Fh(h)p 567 1961 V 567
+1989 a Fm(")p 567 1997 V 589 1987 a Fh(i)604 1989 y Fn(,)15
+b(a)f(double)j(quotation)e(mark)315 2068 y Fd(\\')555
+2066 y Fh(h)p 567 2040 10 2 v 567 2068 a Fg(')p 567 2075
+V 575 2066 a Fh(i)590 2068 y Fn(,)g(a)f(single)j(quote)e(or)g(ap)q
+(ostrophe)315 2146 y(In)f(addition)h(to)f(the)f Fi(gnu)h
+Fn(Emacs)g(st)o(yle)f(escap)q(e)i(sequences,)g(a)e(second)i(set)e(of)h
+(bac)o(kslash)315 2201 y(escap)q(es)i(is)g(a)o(v)m(ailable:)315
+2279 y Fm(\\a)192 b Fn(alert)15 b(\(b)q(ell\))315 2357
+y Fm(\\b)192 b Fn(bac)o(kspace)315 2435 y Fm(\\d)g Fn(delete)315
+2514 y Fm(\\f)g Fn(form)14 b(feed)315 2592 y Fm(\\n)192
+b Fn(newline)315 2670 y Fm(\\r)g Fn(carriage)15 b(return)p
+eop
+%%Page: 8 10
+8 9 bop 75 -58 a Fn(8)1322 b(GNU)15 b(Readline)i(Library)315
+183 y Fm(\\t)192 b Fn(horizon)o(tal)16 b(tab)315 262
+y Fm(\\v)192 b Fn(v)o(ertical)16 b(tab)315 340 y Fm(\\)p
+Ff(nnn)141 b Fn(the)13 b(c)o(haracter)e(whose)i Fm(ASCII)e
+Fn(co)q(de)j(is)f(the)f(o)q(ctal)h(v)m(alue)h Ff(nnn)f
+Fn(\(one)f(to)g(three)555 395 y(digits\))315 473 y Fm(\\x)p
+Ff(nnn)117 b Fn(the)15 b(c)o(haracter)e(whose)i Fm(ASCII)e
+Fn(co)q(de)j(is)f(the)f(hexadecimal)i(v)m(alue)g Ff(nnn)f
+Fn(\(one)555 528 y(to)g(three)g(digits\))315 607 y(When)k(en)o(tering)g
+(the)g(text)f(of)g(a)h(macro,)f(single)i(or)e(double)i(quotes)f(m)o
+(ust)f(b)q(e)h(used)h(to)315 662 y(indicate)12 b(a)f(macro)f
+(de\014nition.)20 b(Unquoted)11 b(text)f(is)i(assumed)e(to)h(b)q(e)g(a)
+f(function)i(name.)18 b(In)315 716 y(the)11 b(macro)f(b)q(o)q(dy)l(,)i
+(the)f(bac)o(kslash)g(escap)q(es)g(describ)q(ed)i(ab)q(o)o(v)o(e)d(are)
+g(expanded.)20 b(Bac)o(kslash)315 771 y(will)i(quote)d(an)o(y)h(other)g
+(c)o(haracter)f(in)i(the)f(macro)f(text,)h(including)j(`)p
+Fm(")p Fn(')c(and)h(`)p Fm(')p Fn('.)34 b(F)l(or)315
+826 y(example,)14 b(the)f(follo)o(wing)g(binding)i(will)g(mak)o(e)d(`)p
+Fm(C-x)i(\\)p Fn(')f(insert)g(a)g(single)h(`)p Fm(\\)p
+Fn(')e(in)o(to)h(the)g(line:)435 890 y Fm("\\C-x\\\\":)23
+b("\\\\")75 1000 y Fe(1.3.2)30 b(Conditional)20 b(Init)g(Constructs)137
+1096 y Fn(Readline)g(implemen)o(ts)f(a)f(facilit)o(y)g(similar)h(in)g
+(spirit)f(to)f(the)h(conditional)h(compilation)g(features)75
+1150 y(of)e(the)g(C)g(prepro)q(cessor)g(whic)o(h)i(allo)o(ws)e(k)o(ey)g
+(bindings)i(and)f(v)m(ariable)g(settings)f(to)g(b)q(e)h(p)q(erformed)f
+(as)75 1205 y(the)e(result)h(of)f(tests.)k(There)c(are)g(four)g(parser)
+g(directiv)o(es)h(used.)75 1284 y Fm($if)168 b Fn(The)16
+b Fm($if)f Fn(construct)g(allo)o(ws)h(bindings)i(to)d(b)q(e)h(made)g
+(based)g(on)f(the)h(editing)h(mo)q(de,)f(the)315 1338
+y(terminal)k(b)q(eing)g(used,)g(or)f(the)g(application)i(using)e
+(Readline.)34 b(The)19 b(text)g(of)f(the)i(test)315 1393
+y(extends)c(to)e(the)h(end)h(of)f(the)g(line;)i(no)e(c)o(haracters)f
+(are)h(required)i(to)d(isolate)i(it.)315 1472 y Fm(mode)144
+b Fn(The)11 b Fm(mode=)e Fn(form)h(of)g(the)h Fm($if)f
+Fn(directiv)o(e)h(is)g(used)g(to)f(test)g(whether)h(Readline)555
+1527 y(is)k(in)h Fm(emacs)e Fn(or)g Fm(vi)g Fn(mo)q(de.)20
+b(This)c(ma)o(y)e(b)q(e)h(used)g(in)h(conjunction)g(with)f(the)555
+1581 y(`)p Fm(set)f(keymap)p Fn(')f(command,)g(for)h(instance,)g(to)f
+(set)h(bindings)h(in)g(the)f Fm(emacs-)555 1636 y(standard)d
+Fn(and)i Fm(emacs-ctlx)e Fn(k)o(eymaps)h(only)i(if)f(Readline)h(is)f
+(starting)f(out)555 1691 y(in)k Fm(emacs)f Fn(mo)q(de.)315
+1769 y Fm(term)144 b Fn(The)14 b Fm(term=)e Fn(form)h(ma)o(y)g(b)q(e)h
+(used)g(to)f(include)j(terminal-sp)q(eci\014c)g(k)o(ey)d(bind-)555
+1824 y(ings,)19 b(p)q(erhaps)g(to)e(bind)i(the)g(k)o(ey)e(sequences)j
+(output)e(b)o(y)g(the)g(terminal's)555 1879 y(function)13
+b(k)o(eys.)18 b(The)13 b(w)o(ord)e(on)h(the)g(righ)o(t)g(side)g(of)g
+(the)g(`)p Fm(=)p Fn(')f(is)h(tested)g(against)555 1934
+y(b)q(oth)j(the)g(full)i(name)e(of)f(the)h(terminal)h(and)f(the)g(p)q
+(ortion)h(of)e(the)h(terminal)555 1989 y(name)i(b)q(efore)g(the)g
+(\014rst)f(`)p Fm(-)p Fn('.)24 b(This)17 b(allo)o(ws)g
+Fm(sun)f Fn(to)g(matc)o(h)h(b)q(oth)f Fm(sun)h Fn(and)555
+2043 y Fm(sun-cmd)p Fn(,)d(for)g(instance.)315 2122 y
+Fm(application)555 2177 y Fn(The)d Ff(application)i Fn(construct)e(is)g
+(used)h(to)e(include)j(application-sp)q(eci)q(\014c)h(set-)555
+2231 y(tings.)19 b(Eac)o(h)12 b(program)f(using)j(the)e(Readline)j
+(library)e(sets)f(the)g Ff(application)555 2286 y(name)p
+Fn(,)17 b(and)f(y)o(ou)h(can)f(test)g(for)g(it.)24 b(This)18
+b(could)f(b)q(e)g(used)g(to)f(bind)i(k)o(ey)f(se-)555
+2341 y(quences)c(to)e(functions)i(useful)g(for)e(a)h(sp)q(eci\014c)i
+(program.)j(F)l(or)12 b(instance,)h(the)555 2396 y(follo)o(wing)i
+(command)f(adds)g(a)f(k)o(ey)h(sequence)h(that)f(quotes)f(the)i(curren)
+o(t)e(or)555 2451 y(previous)j(w)o(ord)e(in)i(Bash:)675
+2514 y Fm($if)23 b(Bash)675 2566 y(#)h(Quote)f(the)g(current)g(or)h
+(previous)f(word)675 2618 y("\\C-xq":)g("\\eb\\"\\ef\\"")675
+2670 y($endif)p eop
+%%Page: 9 11
+9 10 bop 75 -58 a Fn(Chapter)15 b(1:)k(Command)c(Line)i(Editing)1077
+b(9)75 183 y Fm($endif)96 b Fn(This)16 b(command,)e(as)h(seen)h(in)g
+(the)f(previous)h(example,)g(terminates)f(an)g Fm($if)f
+Fn(command.)75 263 y Fm($else)120 b Fn(Commands)15 b(in)h(this)f(branc)
+o(h)h(of)e(the)i Fm($if)e Fn(directiv)o(e)j(are)e(executed)h(if)g(the)f
+(test)g(fails.)75 343 y Fm($include)48 b Fn(This)14 b(directiv)o(e)i
+(tak)o(es)d(a)g(single)i(\014lename)g(as)f(an)f(argumen)o(t)g(and)h
+(reads)g(commands)g(and)315 397 y(bindings)j(from)e(that)f(\014le.)435
+462 y Fm($include)23 b(/etc/inputrc)75 574 y Fe(1.3.3)30
+b(Sample)20 b(Init)h(File)137 670 y Fn(Here)16 b(is)g(an)f(example)h
+(of)f(an)h(inputrc)g(\014le.)22 b(This)16 b(illustrates)g(k)o(ey)g
+(binding,)h(v)m(ariable)f(assignmen)o(t,)75 725 y(and)f(conditional)i
+(syn)o(tax.)p eop
+%%Page: 10 12
+10 11 bop 75 -58 a Fn(10)1299 b(GNU)15 b(Readline)i(Library)195
+235 y Fm(#)24 b(This)f(file)g(controls)g(the)h(behaviour)e(of)i(line)f
+(input)g(editing)g(for)195 287 y(#)h(programs)e(that)i(use)f(the)h(Gnu)
+f(Readline)g(library.)47 b(Existing)22 b(programs)195
+339 y(#)i(include)f(FTP,)g(Bash,)g(and)h(Gdb.)195 391
+y(#)195 443 y(#)g(You)f(can)h(re-read)f(the)g(inputrc)g(file)g(with)h
+(C-x)f(C-r.)195 495 y(#)h(Lines)f(beginning)g(with)g('#')g(are)h
+(comments.)195 546 y(#)195 598 y(#)g(First,)f(include)g(any)g
+(systemwide)g(bindings)f(and)i(variable)f(assignments)f(from)195
+650 y(#)i(/etc/Inputrc)195 702 y($include)f(/etc/Inputrc)195
+806 y(#)195 858 y(#)h(Set)f(various)g(bindings)g(for)g(emacs)g(mode.)
+195 962 y(set)g(editing-mode)g(emacs)195 1065 y($if)g(mode=emacs)195
+1169 y(Meta-Control-h:)46 b(backward-kill-word)21 b(Text)i(after)h(the)
+f(function)g(name)g(is)h(ignored)p 1986 1179 21 38 v
+195 1273 a(#)195 1325 y(#)g(Arrow)f(keys)g(in)h(keypad)f(mode)195
+1377 y(#)195 1429 y(#"\\M-OD":)190 b(backward-char)195
+1480 y(#"\\M-OC":)g(forward-char)195 1532 y(#"\\M-OA":)g
+(previous-history)195 1584 y(#"\\M-OB":)g(next-history)195
+1636 y(#)195 1688 y(#)24 b(Arrow)f(keys)g(in)h(ANSI)f(mode)195
+1740 y(#)195 1792 y("\\M-[D":)190 b(backward-char)195
+1844 y("\\M-[C":)g(forward-char)195 1896 y("\\M-[A":)g
+(previous-history)195 1947 y("\\M-[B":)g(next-history)195
+1999 y(#)195 2051 y(#)24 b(Arrow)f(keys)g(in)h(8)g(bit)f(keypad)g(mode)
+195 2103 y(#)195 2155 y(#"\\M-\\C-OD":)165 b(backward-char)195
+2207 y(#"\\M-\\C-OC":)g(forward-char)195 2259 y(#"\\M-\\C-OA":)g
+(previous-history)195 2311 y(#"\\M-\\C-OB":)g(next-history)195
+2363 y(#)195 2414 y(#)24 b(Arrow)f(keys)g(in)h(8)g(bit)f(ANSI)g(mode)
+195 2466 y(#)195 2518 y(#"\\M-\\C-[D":)165 b(backward-char)195
+2570 y(#"\\M-\\C-[C":)g(forward-char)195 2622 y(#"\\M-\\C-[A":)g
+(previous-history)p eop
+%%Page: 11 13
+11 12 bop 75 -58 a Fn(Chapter)15 b(1:)k(Command)c(Line)i(Editing)1055
+b(11)195 183 y Fm(#"\\M-\\C-[B":)165 b(next-history)195
+287 y(C-q:)23 b(quoted-insert)195 391 y($endif)195 495
+y(#)h(An)f(old-style)g(binding.)47 b(This)23 b(happens)g(to)g(be)h(the)
+f(default.)195 546 y(TAB:)g(complete)195 650 y(#)h(Macros)f(that)g(are)
+h(convenient)e(for)h(shell)h(interaction)195 702 y($if)f(Bash)195
+754 y(#)h(edit)f(the)g(path)195 806 y("\\C-xp":)g
+("PATH=${PATH}\\e\\C-e\\C-a\\)o(ef\\C-f")195 858 y(#)h(prepare)f(to)g
+(type)h(a)f(quoted)g(word)h(--)f(insert)g(open)h(and)f(close)g(double)g
+(quotes)195 910 y(#)h(and)f(move)g(to)h(just)f(after)h(the)f(open)g
+(quote)195 962 y("\\C-x\\"":)g("\\"\\"\\C-b")195 1013
+y(#)h(insert)f(a)g(backslash)g(\(testing)g(backslash)g(escapes)f(in)i
+(sequences)f(and)g(macros\))195 1065 y("\\C-x\\\\":)g("\\\\")195
+1117 y(#)h(Quote)f(the)g(current)g(or)h(previous)f(word)195
+1169 y("\\C-xq":)g("\\eb\\"\\ef\\"")195 1221 y(#)h(Add)f(a)h(binding)f
+(to)g(refresh)g(the)h(line,)f(which)g(is)h(unbound)195
+1273 y("\\C-xr":)f(redraw-current-line)195 1325 y(#)h(Edit)f(variable)g
+(on)g(current)g(line.)195 1377 y("\\M-\\C-v":)f
+("\\C-a\\C-k$\\C-y\\M-\\C-e\\C-a\\C-y=)o(")195 1429 y($endif)195
+1532 y(#)i(use)f(a)h(visible)f(bell)g(if)h(one)f(is)h(available)195
+1584 y(set)f(bell-style)g(visible)195 1688 y(#)h(don't)f(strip)g
+(characters)g(to)g(7)h(bits)f(when)h(reading)195 1740
+y(set)f(input-meta)g(on)195 1844 y(#)h(allow)f(iso-latin1)f(characters)
+h(to)g(be)h(inserted)f(rather)g(than)g(converted)g(to)195
+1896 y(#)h(prefix-meta)e(sequences)195 1947 y(set)h(convert-meta)g(off)
+195 2051 y(#)h(display)f(characters)f(with)h(the)h(eighth)f(bit)g(set)h
+(directly)f(rather)g(than)195 2103 y(#)h(as)f(meta-prefixed)f
+(characters)195 2155 y(set)h(output-meta)g(on)195 2259
+y(#)h(if)f(there)g(are)h(more)f(than)h(150)f(possible)g(completions)f
+(for)i(a)f(word,)h(ask)f(the)195 2311 y(#)h(user)f(if)h(he)f(wants)g
+(to)h(see)f(all)h(of)f(them)195 2363 y(set)g(completion-query-items)e
+(150)195 2466 y(#)j(For)f(FTP)195 2518 y($if)g(Ftp)195
+2570 y("\\C-xg":)g("get)g(\\M-?")195 2622 y("\\C-xt":)g("put)g(\\M-?")p
+eop
+%%Page: 12 14
+12 13 bop 75 -58 a Fn(12)1299 b(GNU)15 b(Readline)i(Library)195
+183 y Fm("\\M-.":)23 b(yank-last-arg)195 235 y($endif)75
+359 y Fl(1.4)33 b(Bindable)24 b(Readline)f(Commands)137
+453 y Fn(This)16 b(section)g(describ)q(es)h(Readline)g(commands)e(that)
+g(ma)o(y)f(b)q(e)i(b)q(ound)g(to)f(k)o(ey)g(sequences.)137
+519 y(Command)j(names)g(without)h(an)f(accompan)o(ying)g(k)o(ey)g
+(sequence)i(are)e(un)o(b)q(ound)h(b)o(y)g(default.)29
+b(In)75 573 y(the)15 b(follo)o(wing)h(descriptions,)g
+Ff(p)q(oin)o(t)h Fn(refers)e(to)f(the)i(curren)o(t)f(cursor)f(p)q
+(osition,)i(and)g Ff(mark)h Fn(refers)e(to)f(a)75 628
+y(cursor)h(p)q(osition)h(sa)o(v)o(ed)e(b)o(y)h(the)g
+Fm(set-mark)f Fn(command.)20 b(The)15 b(text)g(b)q(et)o(w)o(een)g(the)g
+(p)q(oin)o(t)h(and)f(mark)f(is)75 683 y(referred)h(to)g(as)g(the)g
+Ff(region)p Fn(.)75 790 y Fe(1.4.1)30 b(Commands)21 b(F)-5
+b(or)19 b(Mo)n(ving)75 895 y Fm(beginning-of-line)13
+b(\(C-a\))315 950 y Fn(Mo)o(v)o(e)h(to)h(the)g(start)f(of)h(the)g
+(curren)o(t)g(line.)75 1026 y Fm(end-of-line)f(\(C-e\))315
+1081 y Fn(Mo)o(v)o(e)g(to)h(the)g(end)h(of)f(the)g(line.)75
+1157 y Fm(forward-char)f(\(C-f\))315 1212 y Fn(Mo)o(v)o(e)g(forw)o(ard)
+g(a)h(c)o(haracter.)75 1288 y Fm(backward-char)e(\(C-b\))315
+1343 y Fn(Mo)o(v)o(e)h(bac)o(k)h(a)g(c)o(haracter.)75
+1419 y Fm(forward-word)f(\(M-f\))315 1474 y Fn(Mo)o(v)o(e)g(forw)o(ard)
+g(to)g(the)i(end)g(of)e(the)h(next)h(w)o(ord.)j(W)l(ords)c(are)f(comp)q
+(osed)i(of)f(letters)g(and)315 1529 y(digits.)75 1605
+y Fm(backward-word)e(\(M-b\))315 1660 y Fn(Mo)o(v)o(e)j(bac)o(k)g(to)h
+(the)f(start)g(of)g(the)h(curren)o(t)g(or)f(previous)i(w)o(ord.)24
+b(W)l(ords)16 b(are)h(comp)q(osed)315 1715 y(of)e(letters)g(and)g
+(digits.)75 1791 y Fm(clear-screen)f(\(C-l\))315 1846
+y Fn(Clear)f(the)h(screen)g(and)f(redra)o(w)g(the)g(curren)o(t)g(line,)
+i(lea)o(ving)g(the)e(curren)o(t)g(line)i(at)e(the)g(top)315
+1900 y(of)i(the)g(screen.)75 1977 y Fm(redraw-current-line)e(\(\))315
+2031 y Fn(Refresh)j(the)f(curren)o(t)g(line.)22 b(By)15
+b(default,)h(this)f(is)h(un)o(b)q(ound.)75 2138 y Fe(1.4.2)30
+b(Commands)21 b(F)-5 b(or)19 b(Manipulating)i(The)f(History)75
+2244 y Fm(accept-line)14 b(\(Newline,)g(Return\))315
+2298 y Fn(Accept)h(the)g(line)i(regardless)e(of)g(where)g(the)g(cursor)
+f(is.)20 b(If)c(this)f(line)h(is)g(non-empt)o(y)l(,)f(add)315
+2353 y(it)f(to)g(the)g(history)g(list.)20 b(If)14 b(this)h(line)g(w)o
+(as)e(a)h(history)g(line,)i(then)e(restore)f(the)h(history)g(line)315
+2408 y(to)h(its)g(original)h(state.)75 2484 y Fm(previous-history)d
+(\(C-p\))315 2539 y Fn(Mo)o(v)o(e)h(`up')h(through)g(the)g(history)g
+(list.)75 2615 y Fm(next-history)f(\(C-n\))315 2670 y
+Fn(Mo)o(v)o(e)g(`do)o(wn')g(through)h(the)h(history)f(list.)p
+eop
+%%Page: 13 15
+13 14 bop 75 -58 a Fn(Chapter)15 b(1:)k(Command)c(Line)i(Editing)1055
+b(13)75 183 y Fm(beginning-of-history)12 b(\(M-<\))315
+238 y Fn(Mo)o(v)o(e)i(to)h(the)g(\014rst)g(line)i(in)f(the)f(history)l
+(.)75 314 y Fm(end-of-history)e(\(M->\))315 369 y Fn(Mo)o(v)o(e)h(to)h
+(the)g(end)h(of)f(the)g(input)h(history)l(,)f(i.e.,)g(the)g(line)i
+(curren)o(tly)f(b)q(eing)g(en)o(tered.)75 445 y Fm
+(reverse-search-history)c(\(C-r\))315 500 y Fn(Searc)o(h)k(bac)o(kw)o
+(ard)e(starting)h(at)g(the)h(curren)o(t)f(line)j(and)d(mo)o(ving)h
+(`up')f(through)g(the)h(his-)315 555 y(tory)e(as)h(necessary)l(.)20
+b(This)c(is)g(an)f(incremen)o(tal)h(searc)o(h.)75 631
+y Fm(forward-search-history)c(\(C-s\))315 686 y Fn(Searc)o(h)j(forw)o
+(ard)e(starting)h(at)h(the)f(curren)o(t)h(line)h(and)f(mo)o(ving)g(`do)
+o(wn')f(through)g(the)h(the)315 741 y(history)g(as)g(necessary)l(.)20
+b(This)c(is)g(an)f(incremen)o(tal)h(searc)o(h.)75 817
+y Fm(non-incremental-reverse-se)o(arch-hi)o(story)c(\(M-p\))315
+872 y Fn(Searc)o(h)k(bac)o(kw)o(ard)e(starting)h(at)g(the)h(curren)o(t)
+f(line)j(and)d(mo)o(ving)h(`up')f(through)g(the)h(his-)315
+926 y(tory)h(as)h(necessary)g(using)h(a)e(non-incremen)o(tal)j(searc)o
+(h)e(for)f(a)h(string)g(supplied)i(b)o(y)e(the)315 981
+y(user.)75 1057 y Fm(non-incremental-forward-se)o(arch-hi)o(story)12
+b(\(M-n\))315 1112 y Fn(Searc)o(h)j(forw)o(ard)e(starting)h(at)h(the)f
+(curren)o(t)h(line)h(and)f(mo)o(ving)g(`do)o(wn')f(through)g(the)h(the)
+315 1167 y(history)e(as)g(necessary)h(using)g(a)f(non-incremen)o(tal)i
+(searc)o(h)e(for)g(a)g(string)g(supplied)j(b)o(y)d(the)315
+1222 y(user.)75 1298 y Fm(history-search-forward)f(\(\))315
+1353 y Fn(Searc)o(h)21 b(forw)o(ard)e(through)i(the)f(history)h(for)f
+(the)h(string)g(of)f(c)o(haracters)g(b)q(et)o(w)o(een)h(the)315
+1407 y(start)16 b(of)h(the)h(curren)o(t)g(line)h(and)e(the)h(p)q(oin)o
+(t.)28 b(This)18 b(is)g(a)f(non-incremen)o(tal)i(searc)o(h.)27
+b(By)315 1462 y(default,)15 b(this)h(command)f(is)h(un)o(b)q(ound.)75
+1538 y Fm(history-search-backward)c(\(\))315 1593 y Fn(Searc)o(h)18
+b(bac)o(kw)o(ard)e(through)h(the)h(history)f(for)g(the)g(string)h(of)f
+(c)o(haracters)f(b)q(et)o(w)o(een)i(the)315 1648 y(start)e(of)h(the)h
+(curren)o(t)g(line)h(and)e(the)h(p)q(oin)o(t.)28 b(This)18
+b(is)g(a)f(non-incremen)o(tal)i(searc)o(h.)27 b(By)315
+1703 y(default,)15 b(this)h(command)f(is)h(un)o(b)q(ound.)75
+1779 y Fm(yank-nth-arg)e(\(M-C-y\))315 1834 y Fn(Insert)f(the)g
+(\014rst)g(argumen)o(t)f(to)g(the)i(previous)f(command)g(\(usually)h
+(the)f(second)h(w)o(ord)e(on)315 1889 y(the)i(previous)i(line\).)21
+b(With)14 b(an)h(argumen)o(t)e Ff(n)p Fn(,)i(insert)f(the)h
+Ff(n)p Fn(th)f(w)o(ord)g(from)g(the)g(previous)315 1943
+y(command)f(\(the)h(w)o(ords)f(in)h(the)g(previous)g(command)g(b)q
+(egin)h(with)f(w)o(ord)e(0\).)19 b(A)14 b(negativ)o(e)315
+1998 y(argumen)o(t)g(inserts)i(the)f Ff(n)p Fn(th)h(w)o(ord)e(from)h
+(the)g(end)h(of)e(the)i(previous)g(command.)75 2074 y
+Fm(yank-last-arg)d(\(M-.,)i(M-_\))315 2129 y Fn(Insert)j(last)f
+(argumen)o(t)g(to)g(the)g(previous)i(command)e(\(the)g(last)h(w)o(ord)f
+(of)g(the)g(previous)315 2184 y(history)e(en)o(try\).)20
+b(With)15 b(an)g(argumen)o(t,)g(b)q(eha)o(v)o(e)g(exactly)h(lik)o(e)g
+Fm(yank-nth-arg)p Fn(.)j(Succes-)315 2239 y(siv)o(e)f(calls)g(to)f
+Fm(yank-last-arg)e Fn(mo)o(v)o(e)i(bac)o(k)g(through)g(the)g(history)g
+(list,)i(inserting)f(the)315 2294 y(last)d(argumen)o(t)g(of)f(eac)o(h)i
+(line)g(in)g(turn.)75 2400 y Fe(1.4.3)30 b(Commands)21
+b(F)-5 b(or)19 b(Changing)i(T)-5 b(ext)75 2506 y Fm(delete-char)14
+b(\(C-d\))315 2560 y Fn(Delete)j(the)f(c)o(haracter)g(under)h(the)f
+(cursor.)23 b(If)16 b(the)h(cursor)f(is)h(at)e(the)i(b)q(eginning)h(of)
+e(the)315 2615 y(line,)j(there)e(are)g(no)g(c)o(haracters)f(in)i(the)g
+(line,)h(and)e(the)g(last)g(c)o(haracter)g(t)o(yp)q(ed)g(w)o(as)f(not)
+315 2670 y(b)q(ound)g(to)f Fm(delete-char)p Fn(,)e(then)j(return)f
+Fm(EOF)p Fn(.)p eop
+%%Page: 14 16
+14 15 bop 75 -58 a Fn(14)1299 b(GNU)15 b(Readline)i(Library)75
+183 y Fm(backward-delete-char)12 b(\(Rubout\))315 238
+y Fn(Delete)k(the)f(c)o(haracter)f(b)q(ehind)j(the)f(cursor.)j(A)c(n)o
+(umeric)h(argumen)o(t)e(means)i(to)e(kill)j(the)315 293
+y(c)o(haracters)d(instead)i(of)f(deleting)i(them.)75
+378 y Fm(forward-backward-delete-ch)o(ar)12 b(\(\))315
+432 y Fn(Delete)20 b(the)f(c)o(haracter)f(under)i(the)f(cursor,)h
+(unless)g(the)f(cursor)g(is)h(at)e(the)h(end)h(of)f(the)315
+487 y(line,)e(in)g(whic)o(h)g(case)e(the)h(c)o(haracter)g(b)q(ehind)h
+(the)f(cursor)g(is)g(deleted.)23 b(By)16 b(default,)h(this)315
+542 y(is)f(not)f(b)q(ound)h(to)e(a)h(k)o(ey)l(.)75 627
+y Fm(quoted-insert)e(\(C-q,)i(C-v\))315 682 y Fn(Add)j(the)f(next)g(c)o
+(haracter)g(t)o(yp)q(ed)g(to)f(the)i(line)g(v)o(erbatim.)26
+b(This)18 b(is)f(ho)o(w)g(to)g(insert)g(k)o(ey)315 736
+y(sequences)f(lik)o(e)605 734 y Fh(h)p 617 708 56 2 v
+617 736 a Fg(C-q)p 617 744 V 671 734 a Fh(i)685 736 y
+Fn(,)f(for)g(example.)75 821 y Fm(tab-insert)f(\(M-TAB\))315
+876 y Fn(Insert)h(a)g(tab)g(c)o(haracter.)75 961 y Fm(self-insert)f
+(\(a,)g(b,)h(A,)g(1,)g(!,)g(...\))315 1016 y Fn(Insert)g(y)o(ourself.)
+75 1100 y Fm(transpose-chars)e(\(C-t\))315 1155 y Fn(Drag)i(the)h(c)o
+(haracter)f(b)q(efore)h(the)h(cursor)e(forw)o(ard)g(o)o(v)o(er)g(the)h
+(c)o(haracter)f(at)h(the)g(cursor,)315 1210 y(mo)o(ving)i(the)f(cursor)
+h(forw)o(ard)e(as)i(w)o(ell.)28 b(If)18 b(the)g(insertion)h(p)q(oin)o
+(t)f(is)g(at)f(the)h(end)h(of)e(the)315 1265 y(line,)c(then)e(this)h
+(transp)q(oses)e(the)h(last)g(t)o(w)o(o)f(c)o(haracters)g(of)h(the)g
+(line.)20 b(Negativ)o(e)11 b(argumen)o(ts)315 1320 y(ha)o(v)o(e)k(no)g
+(e\013ect.)75 1404 y Fm(transpose-words)e(\(M-t\))315
+1459 y Fn(Drag)i(the)h(w)o(ord)g(b)q(efore)g(p)q(oin)o(t)h(past)f(the)g
+(w)o(ord)f(after)h(p)q(oin)o(t,)g(mo)o(ving)g(p)q(oin)o(t)h(past)f
+(that)315 1514 y(w)o(ord)f(as)f(w)o(ell.)75 1599 y Fm(upcase-word)g
+(\(M-u\))315 1654 y Fn(Upp)q(ercase)j(the)f(curren)o(t)g(\(or)f(follo)o
+(wing\))h(w)o(ord.)22 b(With)16 b(a)g(negativ)o(e)g(argumen)o(t,)f(upp)
+q(er-)315 1708 y(case)g(the)g(previous)h(w)o(ord,)f(but)g(do)g(not)g
+(mo)o(v)o(e)f(the)i(cursor.)75 1793 y Fm(downcase-word)d(\(M-l\))315
+1848 y Fn(Lo)o(w)o(ercase)d(the)h(curren)o(t)g(\(or)f(follo)o(wing\))h
+(w)o(ord.)17 b(With)11 b(a)g(negativ)o(e)g(argumen)o(t,)f(lo)o(w)o
+(ercase)315 1903 y(the)15 b(previous)h(w)o(ord,)e(but)i(do)f(not)g(mo)o
+(v)o(e)f(the)h(cursor.)75 1988 y Fm(capitalize-word)e(\(M-c\))315
+2042 y Fn(Capitalize)f(the)f(curren)o(t)f(\(or)g(follo)o(wing\))h(w)o
+(ord.)18 b(With)11 b(a)f(negativ)o(e)h(argumen)o(t,)f(capitalize)315
+2097 y(the)15 b(previous)h(w)o(ord,)e(but)i(do)f(not)g(mo)o(v)o(e)f
+(the)h(cursor.)75 2220 y Fe(1.4.4)30 b(Killing)20 b(And)h(Y)-5
+b(anking)75 2336 y Fm(kill-line)14 b(\(C-k\))315 2391
+y Fn(Kill)j(the)f(text)e(from)h(p)q(oin)o(t)h(to)e(the)h(end)h(of)f
+(the)g(line.)75 2476 y Fm(backward-kill-line)e(\(C-x)h(Rubout\))315
+2530 y Fn(Kill)j(bac)o(kw)o(ard)e(to)f(the)i(b)q(eginning)h(of)e(the)g
+(line.)75 2615 y Fm(unix-line-discard)e(\(C-u\))315 2670
+y Fn(Kill)k(bac)o(kw)o(ard)e(from)f(the)i(cursor)e(to)h(the)g(b)q
+(eginning)j(of)c(the)i(curren)o(t)f(line.)p eop
+%%Page: 15 17
+15 16 bop 75 -58 a Fn(Chapter)15 b(1:)k(Command)c(Line)i(Editing)1055
+b(15)75 183 y Fm(kill-whole-line)13 b(\(\))315 238 y
+Fn(Kill)20 b(all)f(c)o(haracters)e(on)h(the)g(curren)o(t)f(line,)j(no)e
+(matter)f(p)q(oin)o(t)h(is.)28 b(By)18 b(default,)h(this)f(is)315
+293 y(un)o(b)q(ound.)75 374 y Fm(kill-word)c(\(M-d\))315
+429 y Fn(Kill)j(from)d(p)q(oin)o(t)h(to)f(the)h(end)g(of)f(the)h
+(curren)o(t)g(w)o(ord,)e(or)i(if)g(b)q(et)o(w)o(een)g(w)o(ords,)e(to)i
+(the)f(end)315 483 y(of)h(the)g(next)g(w)o(ord.)20 b(W)l(ord)14
+b(b)q(oundaries)j(are)e(the)g(same)g(as)g Fm(forward-word)p
+Fn(.)75 564 y Fm(backward-kill-word)e(\(M-DEL\))315 619
+y Fn(Kill)k(the)d(w)o(ord)g(b)q(ehind)i(p)q(oin)o(t.)21
+b(W)l(ord)14 b(b)q(oundaries)h(are)f(the)h(same)f(as)g
+Fm(backward-word)p Fn(.)75 700 y Fm(unix-word-rubout)f(\(C-w\))315
+755 y Fn(Kill)18 b(the)e(w)o(ord)f(b)q(ehind)j(p)q(oin)o(t,)e(using)h
+(white)f(space)g(as)g(a)f(w)o(ord)g(b)q(oundary)l(.)23
+b(The)16 b(killed)315 810 y(text)f(is)g(sa)o(v)o(ed)g(on)g(the)h
+(kill-ring.)75 891 y Fm(delete-horizontal-space)c(\(\))315
+946 y Fn(Delete)k(all)g(spaces)f(and)h(tabs)e(around)i(p)q(oin)o(t.)k
+(By)15 b(default,)h(this)f(is)h(un)o(b)q(ound.)75 1027
+y Fm(kill-region)e(\(\))315 1082 y Fn(Kill)j(the)f(text)e(in)i(the)g
+(curren)o(t)f(region.)20 b(By)15 b(default,)h(this)f(command)g(is)h(un)
+o(b)q(ound.)75 1163 y Fm(copy-region-as-kill)d(\(\))315
+1217 y Fn(Cop)o(y)j(the)i(text)e(in)i(the)f(region)g(to)g(the)g(kill)h
+(bu\013er,)f(so)g(it)g(can)g(b)q(e)h(y)o(ank)o(ed)f(righ)o(t)g(a)o(w)o
+(a)o(y)l(.)315 1272 y(By)e(default,)h(this)f(command)g(is)h(un)o(b)q
+(ound.)75 1353 y Fm(copy-backward-word)d(\(\))315 1408
+y Fn(Cop)o(y)19 b(the)g(w)o(ord)g(b)q(efore)g(p)q(oin)o(t)h(to)e(the)i
+(kill)h(bu\013er.)32 b(The)19 b(w)o(ord)g(b)q(oundaries)h(are)f(the)315
+1463 y(same)c(as)g Fm(backward-word)p Fn(.)j(By)d(default,)g(this)h
+(command)f(is)h(un)o(b)q(ound.)75 1544 y Fm(copy-forward-word)d(\(\))
+315 1599 y Fn(Cop)o(y)i(the)h(w)o(ord)e(follo)o(wing)j(p)q(oin)o(t)f
+(to)f(the)g(kill)j(bu\013er.)i(The)c(w)o(ord)f(b)q(oundaries)i(are)e
+(the)315 1653 y(same)g(as)g Fm(forward-word)p Fn(.)j(By)d(default,)h
+(this)f(command)g(is)h(un)o(b)q(ound.)75 1734 y Fm(yank)f(\(C-y\))315
+1789 y Fn(Y)l(ank)g(the)h(top)f(of)f(the)i(kill)h(ring)e(in)o(to)g(the)
+h(bu\013er)f(at)f(the)i(curren)o(t)f(cursor)g(p)q(osition.)75
+1870 y Fm(yank-pop)f(\(M-y\))315 1925 y Fn(Rotate)j(the)g(kill-ring,)j
+(and)d(y)o(ank)g(the)h(new)f(top.)26 b(Y)l(ou)17 b(can)h(only)g(do)f
+(this)h(if)f(the)h(prior)315 1980 y(command)d(is)h(y)o(ank)f(or)f(y)o
+(ank-p)q(op.)75 2095 y Fe(1.4.5)30 b(Sp)r(ecifying)20
+b(Numeric)h(Argumen)n(ts)75 2205 y Fm(digit-argument)13
+b(\(M-0,)i(M-1,)f(...)h(M--\))315 2260 y Fn(Add)f(this)g(digit)g(to)f
+(the)h(argumen)o(t)e(already)i(accum)o(ulating,)g(or)f(start)f(a)h(new)
+h(argumen)o(t.)315 2313 y Fh(h)p 327 2287 50 2 v 327
+2315 a Fg(M{)p 327 2323 V 375 2313 a Fh(i)405 2315 y
+Fn(starts)g(a)h(negativ)o(e)g(argumen)o(t.)75 2396 y
+Fm(universal-argument)e(\(\))315 2451 y Fn(This)g(is)h(another)e(w)o(a)
+o(y)g(to)g(sp)q(ecify)i(an)f(argumen)o(t.)18 b(If)13
+b(this)g(command)g(is)g(follo)o(w)o(ed)g(b)o(y)g(one)315
+2506 y(or)h(more)h(digits,)g(optionally)h(with)f(a)g(leading)h(min)o
+(us)f(sign,)g(those)g(digits)g(de\014ne)h(the)f(ar-)315
+2560 y(gumen)o(t.)k(If)c(the)g(command)f(is)h(follo)o(w)o(ed)g(b)o(y)g
+(digits,)g(executing)g Fm(universal-argument)315 2615
+y Fn(again)h(ends)g(the)g(n)o(umeric)h(argumen)o(t,)e(but)h(is)h
+(otherwise)f(ignored.)22 b(As)16 b(a)g(sp)q(ecial)h(case,)315
+2670 y(if)g(this)g(command)f(is)h(immediately)h(follo)o(w)o(ed)f(b)o(y)
+f(a)g(c)o(haracter)g(that)g(is)h(neither)g(a)f(digit)p
+eop
+%%Page: 16 18
+16 17 bop 75 -58 a Fn(16)1299 b(GNU)15 b(Readline)i(Library)315
+183 y(or)c(min)o(us)i(sign,)f(the)g(argumen)o(t)g(coun)o(t)f(for)h(the)
+g(next)g(command)g(is)g(m)o(ultiplied)j(b)o(y)d(four.)315
+238 y(The)19 b(argumen)o(t)f(coun)o(t)g(is)h(initially)j(one,)d(so)f
+(executing)i(this)f(function)h(the)e(\014rst)h(time)315
+293 y(mak)o(es)c(the)h(argumen)o(t)f(coun)o(t)h(four,)f(a)h(second)g
+(time)g(mak)o(es)g(the)g(argumen)o(t)f(coun)o(t)g(six-)315
+348 y(teen,)g(and)g(so)g(on.)20 b(By)15 b(default,)h(this)f(is)h(not)f
+(b)q(ound)h(to)f(a)g(k)o(ey)l(.)75 472 y Fe(1.4.6)30
+b(Letting)20 b(Readline)g(T)n(yp)r(e)h(F)-5 b(or)19 b(Y)-5
+b(ou)75 590 y Fm(complete)14 b(\(TAB\))315 644 y Fn(A)o(ttempt)j(to)g
+(do)h(completion)g(on)g(the)g(text)f(b)q(efore)h(the)g(cursor.)27
+b(This)18 b(is)g(application-)315 699 y(sp)q(eci\014c.)k(Generally)l(,)
+15 b(if)g(y)o(ou)g(are)f(t)o(yping)h(a)g(\014lename)g(argumen)o(t,)f(y)
+o(ou)g(can)h(do)g(\014lename)315 754 y(completion;)h(if)g(y)o(ou)f(are)
+g(t)o(yping)h(a)f(command,)f(y)o(ou)h(can)h(do)f(command)g(completion;)
+h(if)315 809 y(y)o(ou)i(are)g(t)o(yping)g(in)h(a)f(sym)o(b)q(ol)h(to)e
+(GDB,)h(y)o(ou)g(can)g(do)g(sym)o(b)q(ol)h(name)f(completion;)i(if)315
+864 y(y)o(ou)13 b(are)g(t)o(yping)g(in)h(a)f(v)m(ariable)h(to)f(Bash,)g
+(y)o(ou)g(can)g(do)g(v)m(ariable)h(name)f(completion,)i(and)315
+918 y(so)g(on.)75 1004 y Fm(possible-completions)d(\(M-?\))315
+1059 y Fn(List)k(the)f(p)q(ossible)i(completions)f(of)f(the)g(text)g(b)
+q(efore)h(the)f(cursor.)75 1145 y Fm(insert-completions)e(\(M-*\))315
+1199 y Fn(Insert)j(all)g(completions)g(of)f(the)g(text)g(b)q(efore)h(p)
+q(oin)o(t)f(that)g(w)o(ould)h(ha)o(v)o(e)f(b)q(een)h(generated)315
+1254 y(b)o(y)f Fm(possible-completions)p Fn(.)75 1340
+y Fm(menu-complete)e(\(\))315 1395 y Fn(Similar)g(to)f
+Fm(complete)p Fn(,)f(but)h(replaces)h(the)f(w)o(ord)f(to)g(b)q(e)i
+(completed)f(with)h(a)e(single)j(matc)o(h)315 1450 y(from)k(the)h(list)
+h(of)e(p)q(ossible)j(completions.)32 b(Rep)q(eated)20
+b(execution)g(of)f Fm(menu-complete)315 1504 y Fn(steps)h(through)g
+(the)g(list)h(of)f(p)q(ossible)i(completions,)g(inserting)f(eac)o(h)f
+(matc)o(h)f(in)i(turn.)315 1559 y(A)o(t)c(the)g(end)h(of)f(the)h(list)g
+(of)f(completions,)i(the)e(b)q(ell)j(is)e(rung)f(and)h(the)f(original)i
+(text)d(is)315 1614 y(restored.)26 b(An)17 b(argumen)o(t)g(of)g
+Ff(n)g Fn(mo)o(v)o(es)g Ff(n)g Fn(p)q(ositions)h(forw)o(ard)e(in)i(the)
+g(list)g(of)f(matc)o(hes;)315 1669 y(a)j(negativ)o(e)g(argumen)o(t)f
+(ma)o(y)g(b)q(e)i(used)f(to)f(mo)o(v)o(e)h(bac)o(kw)o(ard)f(through)g
+(the)h(list.)35 b(This)315 1724 y(command)15 b(is)h(in)o(tended)g(to)f
+(b)q(e)h(b)q(ound)g(to)f Fm(TAB)p Fn(,)f(but)h(is)h(un)o(b)q(ound)g(b)o
+(y)f(default.)75 1809 y Fm(delete-char-or-list)e(\(\))315
+1864 y Fn(Deletes)h(the)f(c)o(haracter)g(under)h(the)g(cursor)f(if)h
+(not)f(at)g(the)g(b)q(eginning)j(or)d(end)h(of)f(the)g(line)315
+1919 y(\(lik)o(e)i Fm(delete-char)p Fn(\).)j(If)d(at)f(the)h(end)g(of)f
+(the)g(line,)i(b)q(eha)o(v)o(es)f(iden)o(tically)i(to)d
+Fm(possible-)315 1974 y(completions)p Fn(.)k(This)e(command)f(is)h(un)o
+(b)q(ound)g(b)o(y)f(default.)75 2098 y Fe(1.4.7)30 b(Keyb)r(oard)20
+b(Macros)75 2216 y Fm(start-kbd-macro)13 b(\(C-x)i(\(\))315
+2270 y Fn(Begin)h(sa)o(ving)f(the)h(c)o(haracters)e(t)o(yp)q(ed)i(in)o
+(to)f(the)g(curren)o(t)g(k)o(eyb)q(oard)g(macro.)75 2356
+y Fm(end-kbd-macro)e(\(C-x)i(\)\))315 2411 y Fn(Stop)f(sa)o(ving)f(the)
+h(c)o(haracters)f(t)o(yp)q(ed)h(in)o(to)f(the)h(curren)o(t)g(k)o(eyb)q
+(oard)f(macro)g(and)h(sa)o(v)o(e)f(the)315 2466 y(de\014nition.)75
+2552 y Fm(call-last-kbd-macro)g(\(C-x)h(e\))315 2606
+y Fn(Re-execute)19 b(the)f(last)f(k)o(eyb)q(oard)h(macro)f(de\014ned,)i
+(b)o(y)e(making)h(the)g(c)o(haracters)e(in)j(the)315
+2661 y(macro)14 b(app)q(ear)i(as)f(if)g(t)o(yp)q(ed)h(at)e(the)i(k)o
+(eyb)q(oard.)p eop
+%%Page: 17 19
+17 18 bop 75 -58 a Fn(Chapter)15 b(1:)k(Command)c(Line)i(Editing)1055
+b(17)75 183 y Fe(1.4.8)30 b(Some)20 b(Miscellaneous)h(Commands)75
+298 y Fm(re-read-init-file)13 b(\(C-x)h(C-r\))315 353
+y Fn(Read)e(in)f(the)g(con)o(ten)o(ts)g(of)f(the)h Ff(inputrc)k
+Fn(\014le,)d(and)g(incorp)q(orate)f(an)o(y)f(bindings)j(or)e(v)m
+(ariable)315 407 y(assignmen)o(ts)k(found)h(there.)75
+491 y Fm(abort)e(\(C-g\))315 546 y Fn(Ab)q(ort)f(the)g(curren)o(t)h
+(editing)g(command)f(and)h(ring)f(the)h(terminal's)f(b)q(ell)i(\(sub)s
+(ject)e(to)g(the)315 600 y(setting)i(of)g Fm(bell-style)p
+Fn(\).)75 684 y Fm(do-uppercase-version)d(\(M-a,)j(M-b,)f(M-)p
+Ff(x)p Fm(,)h Fc(:)8 b(:)g(:)n Fm(\))315 739 y Fn(If)14
+b(the)g(meta\014ed)g(c)o(haracter)f Ff(x)k Fn(is)d(lo)o(w)o(ercase,)g
+(run)g(the)g(command)f(that)h(is)g(b)q(ound)h(to)e(the)315
+794 y(corresp)q(onding)j(upp)q(ercase)g(c)o(haracter.)75
+877 y Fm(prefix-meta)e(\(ESC\))315 932 y Fn(Mak)o(e)j(the)i(next)f(c)o
+(haracter)f(t)o(yp)q(ed)i(b)q(e)g(meta\014ed.)28 b(This)19
+b(is)g(for)e(k)o(eyb)q(oards)h(without)g(a)315 987 y(meta)d(k)o(ey)l(.)
+20 b(T)o(yping)15 b(`)p Fm(ESC)g(f)p Fn(')f(is)i(equiv)m(alen)o(t)h(to)
+d(t)o(yping)i(`)p Fm(M-f)p Fn('.)75 1070 y Fm(undo)f(\(C-_,)f(C-x)h
+(C-u\))315 1125 y Fn(Incremen)o(tal)h(undo,)f(separately)h(remem)o(b)q
+(ered)g(for)e(eac)o(h)h(line.)75 1209 y Fm(revert-line)f(\(M-r\))315
+1263 y Fn(Undo)j(all)g(c)o(hanges)g(made)f(to)g(this)h(line.)26
+b(This)17 b(is)g(lik)o(e)h(executing)f(the)g Fm(undo)f
+Fn(command)315 1318 y(enough)g(times)f(to)g(get)f(bac)o(k)h(to)g(the)g
+(b)q(eginning.)75 1402 y Fm(tilde-expand)f(\(M-~\))315
+1456 y Fn(P)o(erform)g(tilde)j(expansion)f(on)f(the)g(curren)o(t)g(w)o
+(ord.)75 1540 y Fm(set-mark)f(\(C-@\))315 1595 y Fn(Set)g(the)f(mark)g
+(to)g(the)h(curren)o(t)g(p)q(oin)o(t.)19 b(If)14 b(a)g(n)o(umeric)g
+(argumen)o(t)f(is)h(supplied,)i(the)e(mark)315 1650 y(is)i(set)f(to)f
+(that)h(p)q(osition.)75 1733 y Fm(exchange-point-and-mark)d(\(C-x)j
+(C-x\))315 1788 y Fn(Sw)o(ap)g(the)h(p)q(oin)o(t)g(with)g(the)g(mark.)k
+(The)c(curren)o(t)f(cursor)h(p)q(osition)g(is)g(set)g(to)f(the)g(sa)o
+(v)o(ed)315 1843 y(p)q(osition,)h(and)f(the)h(old)f(cursor)g(p)q
+(osition)h(is)g(sa)o(v)o(ed)f(as)g(the)g(mark.)75 1926
+y Fm(character-search)e(\(C-]\))315 1981 y Fn(A)f(c)o(haracter)g(is)h
+(read)g(and)f(p)q(oin)o(t)h(is)g(mo)o(v)o(ed)f(to)g(the)g(next)h(o)q
+(ccurrence)g(of)f(that)g(c)o(haracter.)315 2036 y(A)j(negativ)o(e)h
+(coun)o(t)f(searc)o(hes)g(for)f(previous)i(o)q(ccurrences.)75
+2119 y Fm(character-search-backward)c(\(M-C-]\))315 2174
+y Fn(A)22 b(c)o(haracter)g(is)h(read)f(and)h(p)q(oin)o(t)g(is)g(mo)o(v)
+o(ed)f(to)g(the)g(previous)h(o)q(ccurrence)h(of)e(that)315
+2229 y(c)o(haracter.)d(A)c(negativ)o(e)h(coun)o(t)f(searc)o(hes)g(for)f
+(subsequen)o(t)i(o)q(ccurrences.)75 2312 y Fm(insert-comment)d(\(M-#\))
+315 2367 y Fn(The)19 b(v)m(alue)i(of)e(the)g Fm(comment-begin)e
+Fn(v)m(ariable)k(is)f(inserted)g(at)e(the)i(b)q(eginning)h(of)e(the)315
+2422 y(curren)o(t)c(line,)i(and)e(the)g(line)i(is)f(accepted)g(as)e(if)
+i(a)f(newline)i(had)f(b)q(een)g(t)o(yp)q(ed.)75 2506
+y Fm(dump-functions)d(\(\))315 2560 y Fn(Prin)o(t)g(all)h(of)f(the)g
+(functions)h(and)g(their)g(k)o(ey)f(bindings)i(to)d(the)i(Readline)h
+(output)e(stream.)315 2615 y(If)j(a)g(n)o(umeric)g(argumen)o(t)f(is)i
+(supplied,)h(the)e(output)f(is)i(formatted)d(in)j(suc)o(h)f(a)g(w)o(a)o
+(y)f(that)315 2670 y(it)g(can)h(b)q(e)g(made)f(part)f(of)h(an)g
+Ff(inputrc)k Fn(\014le.)i(This)16 b(command)f(is)h(un)o(b)q(ound)g(b)o
+(y)f(default.)p eop
+%%Page: 18 20
+18 19 bop 75 -58 a Fn(18)1299 b(GNU)15 b(Readline)i(Library)75
+183 y Fm(dump-variables)c(\(\))315 238 y Fn(Prin)o(t)e(all)g(of)f(the)h
+(settable)g(v)m(ariables)h(and)f(their)g(v)m(alues)h(to)e(the)h
+(Readline)i(output)d(stream.)315 293 y(If)16 b(a)g(n)o(umeric)g
+(argumen)o(t)f(is)i(supplied,)h(the)e(output)f(is)i(formatted)d(in)j
+(suc)o(h)f(a)g(w)o(a)o(y)f(that)315 348 y(it)g(can)h(b)q(e)g(made)f
+(part)f(of)h(an)g Ff(inputrc)k Fn(\014le.)i(This)16 b(command)f(is)h
+(un)o(b)q(ound)g(b)o(y)f(default.)75 427 y Fm(dump-macros)f(\(\))315
+482 y Fn(Prin)o(t)j(all)h(of)e(the)h(Readline)i(k)o(ey)e(sequences)h(b)
+q(ound)g(to)e(macros)g(and)h(the)g(strings)g(they)315
+537 y(ouput.)30 b(If)19 b(a)f(n)o(umeric)i(argumen)o(t)d(is)i
+(supplied,)j(the)c(output)h(is)g(formatted)e(in)i(suc)o(h)g(a)315
+592 y(w)o(a)o(y)14 b(that)g(it)i(can)f(b)q(e)g(made)g(part)g(of)f(an)h
+Ff(inputrc)k Fn(\014le.)i(This)15 b(command)g(is)h(un)o(b)q(ound)g(b)o
+(y)315 647 y(default.)75 775 y Fl(1.5)33 b(Readline)23
+b(vi)h(Mo)r(de)137 871 y Fn(While)13 b(the)f(Readline)j(library)d(do)q
+(es)g(not)g(ha)o(v)o(e)f(a)h(full)h(set)f(of)f Fm(vi)g
+Fn(editing)j(functions,)f(it)f(do)q(es)g(con)o(tain)75
+926 y(enough)17 b(to)g(allo)o(w)g(simple)h(editing)h(of)d(the)i(line.)
+27 b(The)17 b(Readline)i Fm(vi)e Fn(mo)q(de)g(b)q(eha)o(v)o(es)g(as)g
+(sp)q(eci\014ed)i(in)75 981 y(the)c Fi(POSIX)h Fn(1003.2)d(standard.)
+137 1048 y(In)i(order)g(to)f(switc)o(h)g(in)o(teractiv)o(ely)i(b)q(et)o
+(w)o(een)f Fm(emacs)e Fn(and)i Fm(vi)f Fn(editing)i(mo)q(des,)f(use)f
+(the)h(command)75 1103 y(M-C-j)g(\(toggle-editing-mo)q(de\).)21
+b(The)15 b(Readline)j(default)d(is)h Fm(emacs)f Fn(mo)q(de.)137
+1170 y(When)h(y)o(ou)e(en)o(ter)h(a)g(line)i(in)e Fm(vi)g
+Fn(mo)q(de,)g(y)o(ou)g(are)f(already)i(placed)g(in)g(`insertion')f(mo)q
+(de,)g(as)g(if)g(y)o(ou)75 1225 y(had)e(t)o(yp)q(ed)h(an)f(`)p
+Fm(i)p Fn('.)18 b(Pressing)608 1223 y Fh(h)p 620 1197
+70 2 v 620 1225 a Fg(ESC)p 620 1233 V 687 1223 a Fh(i)715
+1225 y Fn(switc)o(hes)13 b(y)o(ou)g(in)o(to)g(`command')f(mo)q(de,)i
+(where)f(y)o(ou)g(can)g(edit)h(the)75 1280 y(text)i(of)h(the)g(line)h
+(with)g(the)f(standard)f Fm(vi)h Fn(mo)o(v)o(emen)o(t)f(k)o(eys,)g(mo)o
+(v)o(e)g(to)h(previous)g(history)g(lines)i(with)75 1335
+y(`)p Fm(k)p Fn(')14 b(and)i(subsequen)o(t)f(lines)i(with)f(`)p
+Fm(j)p Fn(',)e(and)h(so)g(forth.)p eop
+%%Page: -1 21
+-1 20 bop 1862 -58 a Fn(i)75 183 y Fj(T)-7 b(able)27
+b(of)f(Con)n(ten)n(ts)75 354 y Fl(1)67 b(Command)22 b(Line)i(Editing)d
+Fb(.)10 b(.)h(.)f(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)h
+(.)f(.)g(.)g(.)42 b Fl(1)224 423 y Fn(1.1)j(In)o(tro)q(duction)16
+b(to)f(Line)h(Editing)e Fa(.)7 b(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)
+f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f
+(.)27 b Fn(1)224 478 y(1.2)45 b(Readline)17 b(In)o(teraction)8
+b Fa(.)g(.)g(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)
+h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f
+(.)h(.)f(.)23 b Fn(1)374 532 y(1.2.1)44 b(Readline)17
+b(Bare)e(Essen)o(tials)f Fa(.)7 b(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h
+(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)27
+b Fn(1)374 587 y(1.2.2)44 b(Readline)17 b(Mo)o(v)o(emen)o(t)d(Commands)
+7 b Fa(.)g(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f
+(.)h(.)21 b Fn(2)374 642 y(1.2.3)44 b(Readline)17 b(Killing)h(Commands)
+11 b Fa(.)c(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h
+(.)f(.)h(.)f(.)h(.)25 b Fn(2)374 697 y(1.2.4)44 b(Readline)17
+b(Argumen)o(ts)12 b Fa(.)c(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f
+(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)27
+b Fn(3)374 752 y(1.2.5)44 b(Searc)o(hing)16 b(for)e(Commands)h(in)h
+(the)f(History)e Fa(.)8 b(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)27
+b Fn(3)224 806 y(1.3)45 b(Readline)17 b(Init)g(File)e
+Fa(.)7 b(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)
+h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f
+(.)h(.)f(.)h(.)f(.)29 b Fn(4)374 861 y(1.3.1)44 b(Readline)17
+b(Init)f(File)h(Syn)o(tax)7 b Fa(.)g(.)g(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)
+f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)21
+b Fn(4)374 916 y(1.3.2)44 b(Conditional)16 b(Init)g(Constructs)5
+b Fa(.)i(.)g(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)
+h(.)f(.)h(.)g(.)f(.)19 b Fn(8)374 971 y(1.3.3)44 b(Sample)16
+b(Init)g(File)11 b Fa(.)e(.)e(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h
+(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)
+h(.)f(.)26 b Fn(9)224 1026 y(1.4)45 b(Bindable)17 b(Readline)h
+(Commands)6 b Fa(.)h(.)g(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)
+h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)21
+b Fn(12)374 1080 y(1.4.1)44 b(Commands)14 b(F)l(or)h(Mo)o(ving)e
+Fa(.)7 b(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)
+h(.)f(.)h(.)f(.)h(.)f(.)h(.)28 b Fn(12)374 1135 y(1.4.2)44
+b(Commands)14 b(F)l(or)h(Manipulating)i(The)e(History)9
+b Fa(.)e(.)h(.)f(.)h(.)f(.)h(.)24 b Fn(12)374 1190 y(1.4.3)44
+b(Commands)14 b(F)l(or)h(Changing)h(T)l(ext)e Fa(.)8
+b(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)30
+b Fn(13)374 1245 y(1.4.4)44 b(Killing)18 b(And)e(Y)l(anking)9
+b Fa(.)e(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)
+h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)24 b Fn(14)374
+1299 y(1.4.5)44 b(Sp)q(ecifying)17 b(Numeric)f(Argumen)o(ts)c
+Fa(.)c(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)27
+b Fn(15)374 1354 y(1.4.6)44 b(Letting)15 b(Readline)j(T)o(yp)q(e)d(F)l
+(or)g(Y)l(ou)10 b Fa(.)d(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)
+h(.)f(.)h(.)f(.)25 b Fn(16)374 1409 y(1.4.7)44 b(Keyb)q(oard)15
+b(Macros)6 b Fa(.)h(.)g(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f
+(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)21
+b Fn(16)374 1464 y(1.4.8)44 b(Some)15 b(Miscellaneous)i(Commands)7
+b Fa(.)g(.)g(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)
+22 b Fn(17)224 1519 y(1.5)45 b(Readline)17 b(vi)f(Mo)q(de)e
+Fa(.)7 b(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)
+f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f
+(.)h(.)f(.)h(.)28 b Fn(18)p eop
+%%Page: -2 22
+-2 21 bop 75 -58 a Fn(ii)1321 b(GNU)15 b(Readline)i(Library)p
+eop
+%%Trailer
+end
+userdict /end-hook known{end-hook}if
+%%EOF
diff --git a/gnu/lib/libreadline/doc/rluserman.texinfo b/gnu/lib/libreadline/doc/rluserman.texinfo
new file mode 100644
index 00000000000..e6a3dcde2a9
--- /dev/null
+++ b/gnu/lib/libreadline/doc/rluserman.texinfo
@@ -0,0 +1,94 @@
+\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 manvers.texinfo
+
+@ifinfo
+@dircategory Libraries
+@direntry
+* Readline: (readline). The GNU readline library API
+@end direntry
+
+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 that need to provide a command line interface.
+
+Copyright (C) 1988-1999 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 Free Software Foundation.
+@end ifinfo
+
+@titlepage
+@title GNU Readline Library User Interface
+@subtitle Edition @value{EDITION}, for @code{Readline Library} Version @value{VERSION}.
+@subtitle @value{UPDATE-MONTH}
+@author Brian Fox, Free Software Foundation
+@author Chet Ramey, Case Western Reserve University
+
+@page
+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 that need to provide a command line interface.
+
+Published by the Free Software Foundation @*
+59 Temple Place, Suite 330, @*
+Boston, MA 02111 USA
+
+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 that the entire
+resulting derived work is distributed under the terms of a permission
+notice identical to this one.
+
+Permission is granted to copy and distribute translations of this manual
+into another language, under the above conditions for modified versions,
+except that this permission notice may be stated in a translation approved
+by the Free Software Foundation.
+
+@vskip 0pt plus 1filll
+Copyright @copyright{} 1988-1999 Free Software Foundation, Inc.
+@end titlepage
+
+@ifinfo
+@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 that need to provide a command line interface.
+
+@menu
+* Command Line Editing:: GNU Readline User's Manual.
+@end menu
+@end ifinfo
+
+@include rluser.texinfo
+
+@contents
+@bye
diff --git a/gnu/lib/libreadline/doc/texi2dvi b/gnu/lib/libreadline/doc/texi2dvi
new file mode 100644
index 00000000000..a249350495e
--- /dev/null
+++ b/gnu/lib/libreadline/doc/texi2dvi
@@ -0,0 +1,362 @@
+#! /bin/sh
+# texi2dvi --- smartly produce DVI files from texinfo sources
+# $Id: texi2dvi,v 1.1 2001/03/18 17:32:04 millert Exp $
+#
+# Copyright (C) 1992, 93, 94, 95, 96, 97, 98 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.
+#
+# Commentary:
+#
+# 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.
+#
+# In the interest of general portability, some common bourne shell
+# constructs were avoided because they weren't guaranteed to be available
+# in some earlier implementations. I've tried to make this program as
+# portable as possible. Welcome to unix, where the lowest common
+# denominator is rapidly diminishing.
+#
+# Among the more interesting lossages I noticed among Bourne shells:
+# * No shell functions.
+# * No `unset' builtin.
+# * `shift' cannot take a numeric argument, and signals an error if
+# there are no arguments to shift.
+#
+# Code:
+
+# Name by which this script was invoked.
+progname=`echo "$0" | sed -e 's/[^\/]*\///g'`
+
+# This string is expanded by rcs automatically when this file is checked out.
+rcs_revision='$Revision: 1.1 $'
+version=`set - $rcs_revision; echo $2`
+
+# To prevent hairy quoting and escaping later.
+bq='`'
+eq="'"
+
+usage="Usage: $0 [OPTION]... FILE...
+Run a Texinfo document through TeX.
+
+Options:
+-b, --batch No interaction (\nonstopmode in TeX).
+-c, --clean Remove all auxiliary files.
+-D, --debug Turn on shell debugging ($bq${bq}set -x$eq$eq).
+-t, --texinfo CMD Insert CMD after @setfilename before running TeX.
+--verbose Report on what is done.
+-h, --help Display this help and exit.
+-v, --version Display version information and exit.
+
+The values of the TEX, TEXINDEX, and MAKEINFO environment variables are
+used to run those commands, if they are set.
+
+Email bug reports to bug-texinfo@gnu.org."
+
+# Initialize variables.
+# Don't use `unset' since old bourne shells don't have this command.
+# Instead, assign them an empty value.
+# Some of these, like TEX and TEXINDEX, may be inherited from the environment.
+backup_extension=.bak # these files get deleted if all goes well.
+batch=
+clean=
+debug=
+orig_pwd="`pwd`"
+textra=
+verbose=false
+makeinfo="${MAKEINFO-makeinfo}"
+texindex="${TEXINDEX-texindex}"
+tex="${TEX-tex}"
+
+# Save this so we can construct a new TEXINPUTS path for each file.
+TEXINPUTS_orig="$TEXINPUTS"
+export TEXINPUTS
+
+# Parse command line arguments.
+# Make sure that all wildcarded options are long enough to be unambiguous.
+# It's a good idea to document the full long option name in each case.
+# Long options which take arguments will need a `*' appended to the
+# canonical name to match the value appended after the `=' character.
+while :; do
+ test $# -eq 0 && break
+
+ case "$1" in
+ -b | --batch | --b* ) batch=t; shift ;;
+ -c | --clean | --c* ) clean=t; shift ;;
+ -D | --debug | --d* ) debug=t; shift ;;
+ -h | --help | --h* ) echo "$usage"; exit 0 ;;
+ # OK, we should do real option parsing here, but be lazy for now.
+ -t | --texinfo | --t*) shift; textra="$textra $1"; shift ;;
+ -v | --vers* )
+ echo "$progname (GNU Texinfo 3.12) $version"
+ echo "Copyright (C) 1998 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."
+ exit 0 ;;
+ --verb* ) verbose=echo; shift ;;
+ -- ) # Stop option processing
+ shift
+ break ;;
+ -* )
+ case "$1" in
+ --*=* ) arg=`echo "$1" | sed -e 's/=.*//'` ;;
+ * ) arg="$1" ;;
+ esac
+ exec 1>&2
+ echo "$progname: Unknown or ambiguous option $bq$arg$eq."
+ echo "$progname: Try $bq--help$eq for more information."
+ exit 1 ;;
+ * ) break ;;
+ esac
+done
+
+# See if there are any command line args left (which will be interpreted as
+# filename arguments).
+if test $# -eq 0; then
+ exec 1>&2
+ echo "$progname: At least one file name is required as an argument."
+ echo "$progname: Try $bq--help$eq for more information."
+ exit 2
+fi
+
+test "$debug" = t && set -x
+
+# Texify files
+for command_line_filename in ${1+"$@"}; do
+ $verbose "Processing $command_line_filename ..."
+
+ # See if 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 index files and so forth.
+ if test ! -r "${command_line_filename}"; then
+ echo "$0: Could not read ${command_line_filename}." >&2
+ continue
+ fi
+
+ # Roughly equivalent to `dirname ...`, but more portable
+ directory="`echo ${command_line_filename} | sed 's/\/[^\/]*$//'`"
+ filename_texi="`basename ${command_line_filename}`"
+ # Strip off the last extension part (probably .texinfo or .texi)
+ filename_noext="`echo ${filename_texi} | sed 's/\.[^.]*$//'`"
+
+ # Use same basename since we want to generate aux files with the same
+ # basename as the manual. Use extension .texi for the temp file so
+ # that TeX will ignore it. Thus, we must use a subdirectory.
+ #
+ # Output the macro-expanded file to here. The vastly abbreviated
+ # temporary directory name is so we don't have collisions on 8.3 or
+ # 14-character filesystems.
+ tmp_dir=${TMPDIR-/tmp}/txi2d.$$
+ filename_tmp=$tmp_dir/$filename_noext.texi
+ # Output the file with the user's extra commands to here.
+ tmp_dir2=${tmp_dir}.2
+ filename_tmp2=$tmp_dir2/$filename_noext.texi
+ mkdir $tmp_dir $tmp_dir2
+ # Always remove the temporary directories.
+ trap "rm -rf $tmp_dir $tmp_dir2" 1 2 15
+
+ # If directory and file are the same, then it's probably because there's
+ # no pathname component. Set dirname to `.', the current directory.
+ if test "z${directory}" = "z${command_line_filename}"; then
+ directory=.
+ fi
+
+ # Source file might @include additional texinfo sources. Put `.' and
+ # directory where source file(s) reside in TEXINPUTS before anything
+ # else. `.' goes first to ensure that any old .aux, .cps, etc. files in
+ # ${directory} don't get used in preference to fresher files in `.'.
+ TEXINPUTS=".:${directory}:${TEXINPUTS_orig}"
+
+ # Expand macro commands in the original source file using Makeinfo;
+ # the macro syntax bfox implemented is impossible to implement in TeX.
+ # 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.
+ # Redirect output to /dev/null to throw away `Making info file...' msg.
+ $verbose "Macro-expanding $command_line_filename to $filename_tmp ..."
+ $makeinfo --footnote-style=end -E $filename_tmp -o /dev/null \
+ $command_line_filename >/dev/null
+
+ # But if there were no macros, or makeinfo failed for some reason,
+ # just use the original file. (It shouldn't make any difference, but
+ # let's be safe.)
+ if test $? -ne 0 || cmp -s $filename_tmp $command_line_filename; then
+ $verbose "Reverting to $command_line_filename ..."
+ cp -p $command_line_filename $filename_tmp
+ fi
+ filename_input=$filename_tmp
+ dirname_input=$tmp_dir
+
+ # Used most commonly for @finalout, @smallbook, etc.
+ if test -n "$textra"; then
+ $verbose "Inserting extra commands: $textra."
+ sed '/^@setfilename/a\
+'"$textra" $filename_input >$filename_tmp2
+ filename_input=$filename_tmp2
+ dirname_input=$tmp_dir2
+ fi
+
+ # If clean mode was specified, then move to the temporary directory.
+ if test "$clean" = t; then
+ $verbose "cd $dirname_input"
+ cd $dirname_input || exit 1
+ filename_input=`basename $filename_input`
+ fi
+
+ while true; do # will break out of loop below
+ # "Unset" variables that might have values from previous iterations and
+ # which won't be completely reset later.
+ definite_index_files=
+
+ # Find all files having root filename with a two-letter extension,
+ # determine whether they're really index files, and save them. Foo.aux
+ # is actually the cross-references file, but we need to keep track of
+ # that too.
+ possible_index_files="`eval echo ${filename_noext}.?? ${filename_noext}.aux`"
+ for this_file in ${possible_index_files}; do
+ # If file is empty, forget it.
+ test -s "${this_file}" || continue
+
+ # Examine first character of file. If it's not suitable to be an
+ # index or xref file, don't process it.
+ first_character="`sed -n '1s/^\(.\).*$/\1/p;q' ${this_file}`"
+ if test "x${first_character}" = "x\\" \
+ || test "x${first_character}" = "x'"; then
+ definite_index_files="${definite_index_files} ${this_file}"
+ fi
+ done
+ orig_index_files="${definite_index_files}"
+ orig_index_files_sans_aux="`echo ${definite_index_files} \
+ | sed 's/'${filename_noext}'\.aux//;
+ s/^[ ]*//;s/[ ]*$//;'`"
+
+ # Now save copies of original index files so we have some means of
+ # comparison later.
+ $verbose "Backing up current index files: $orig_index_files ..."
+ for index_file_to_save in ${orig_index_files}; do
+ cp "${index_file_to_save}" "${index_file_to_save}${backup_extension}"
+ done
+
+ # Run texindex 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 "${orig_index_files_sans_aux}"; then
+ $verbose "Running $texindex $orig_index_files_sans_aux ..."
+ ${texindex} ${orig_index_files_sans_aux}
+ fi
+
+ # Finally, run TeX.
+ if test "$batch" = t; then
+ tex_mode='\nonstopmode'
+ else
+ tex_mode=
+ fi
+ $verbose "Running $tex $filename_input ..."
+ cmd="$tex $tex_mode \\input $filename_input"
+ $cmd
+
+ # Check if index files changed.
+ #
+ definite_index_files=
+ # Get list of new index files.
+ possible_index_files="`eval echo ${filename_noext}.?? ${filename_noext}.aux`"
+ for this_file in ${possible_index_files}; do
+ # If file is empty, forget it.
+ test -s "${this_file}" || continue
+
+ # Examine first character of file. If it's not a backslash or
+ # single quote, then it's definitely not an index or xref file.
+ # (Will have to check for @ when we switch to Texinfo syntax in
+ # all these files...)
+ first_character="`sed -n '1s/^\(.\).*$/\1/p;q' ${this_file}`"
+ if test "x${first_character}" = "x\\" \
+ || test "x${first_character}" = "x'"; then
+ definite_index_files="${definite_index_files} ${this_file}"
+ fi
+ done
+ new_index_files="${definite_index_files}"
+ new_index_files_sans_aux="`echo ${definite_index_files} \
+ | sed 's/'${filename_noext}'\.aux//;
+ s/^[ ]*//;s/[ ]*$//;'`"
+
+ # If old and new list don't at least have the same file list, then one
+ # file or another has definitely changed.
+ $verbose "Original index files =$orig_index_files"
+ $verbose "New index files =$new_index_files"
+ if test "z${orig_index_files}" != "z${new_index_files}"; then
+ index_files_changed_p=t
+ else
+ # File list is the same. We must compare each file until we find a
+ # difference.
+ index_files_changed_p=
+ for this_file in ${new_index_files}; do
+ $verbose "Comparing index file $this_file ..."
+ # cmp -s will return nonzero exit status if files differ.
+ cmp -s "${this_file}" "${this_file}${backup_extension}"
+ if test $? -ne 0; then
+ # We only need to keep comparing until we find *one* that
+ # differs, because we'll have to run texindex & tex no
+ # matter what.
+ index_files_changed_p=t
+ $verbose "Index file $this_file differed:"
+ test $verbose = echo \
+ && diff -c "${this_file}${backup_extension}" "${this_file}"
+ break
+ fi
+ done
+ fi
+
+ # If index files have changed since TeX has been run, or if the aux
+ # file wasn't present originally, run texindex and TeX again.
+ if test "${index_files_changed_p}"; then :; else
+ # Nothing changed. We're done with TeX.
+ break
+ fi
+ done
+
+ # If we were in clean mode, compilation was in a tmp directory.
+ # Copy the DVI 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
+ $verbose "Copying DVI file from `pwd` to $orig_pwd"
+ cp -p $filename_noext.dvi $orig_pwd
+ cd $orig_pwd || exit 1
+ fi
+
+ # Generate list of files to delete, then call rm once with the entire
+ # list. This is significantly faster than multiple executions of rm.
+ file_list=
+ for file in ${orig_index_files}; do
+ file_list="${file_list} ${file}${backup_extension}"
+ done
+ if test -n "${file_list}"; then
+ $verbose "Removing $file_list $tmp_dir $tmp_dir2 ..."
+ rm -f ${file_list}
+ rm -rf $tmp_dir $tmp_dir2
+ fi
+done
+
+$verbose "$0 done."
+true # exit successfully.
diff --git a/gnu/lib/libreadline/doc/texi2html b/gnu/lib/libreadline/doc/texi2html
new file mode 100644
index 00000000000..4beec01b341
--- /dev/null
+++ b/gnu/lib/libreadline/doc/texi2html
@@ -0,0 +1,2081 @@
+#!/usr/local/bin/perl
+'di ';
+'ig 00 ';
+#+##############################################################################
+# #
+# File: texi2html #
+# #
+# Description: Program to transform most Texinfo documents to HTML #
+# #
+#-##############################################################################
+
+# @(#)texi2html 1.52 01/05/98 Written (mainly) by Lionel Cons, Lionel.Cons@cern.ch
+
+# The man page for this program is included at the end of this file and can be
+# viewed using the command 'nroff -man texi2html'.
+# Please read the copyright at the end of the man page.
+
+#+++############################################################################
+# #
+# Constants #
+# #
+#---############################################################################
+
+$DEBUG_TOC = 1;
+$DEBUG_INDEX = 2;
+$DEBUG_BIB = 4;
+$DEBUG_GLOSS = 8;
+$DEBUG_DEF = 16;
+$DEBUG_HTML = 32;
+$DEBUG_USER = 64;
+
+$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
+$XREFRE = '[^@{}]+'; # RE for a xref (should use NODERE)
+
+$ERROR = "***"; # prefix for errors and warnings
+$THISPROG = "texi2html 1.52"; # program name and version
+$HOMEPAGE = "http://wwwinfo.cern.ch/dis/texi2html/"; # program home page
+$TODAY = &pretty_date; # like "20 September 1993"
+$SPLITTAG = "<!-- SPLIT HERE -->\n"; # tag to know where to split
+$PROTECTTAG = "_ThisIsProtected_"; # tag to recognize protected sections
+$html2_doctype = '<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0 Strict Level 2//EN">';
+
+#
+# language dependent constants
+#
+#$LDC_SEE = 'see';
+#$LDC_SECTION = 'section';
+#$LDC_IN = 'in';
+#$LDC_TOC = 'Table of Contents';
+#$LDC_GOTO = 'Go to the';
+#$LDC_FOOT = 'Footnotes';
+# TODO: @def* shortcuts
+
+#
+# pre-defined indices
+#
+%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+
+ " ", " ",
+ "\n", "\n",
+ "|", "",
+ # spacing commands
+ ":", "",
+ "!", "!",
+ "?", "?",
+ ".", ".",
+ "-", "",
+ );
+
+#
+# texinfo "things" (@foo{}) to HTML ones
+#
+%things_map = (
+ 'TeX', 'TeX',
+ 'br', '<P>', # paragraph break
+ 'bullet', '*',
+ 'copyright', '(C)',
+ 'dots', '...',
+ 'equiv', '==',
+ 'error', 'error-->',
+ 'expansion', '==>',
+ 'minus', '-',
+ 'point', '-!-',
+ 'print', '-|',
+ 'result', '=>',
+ 'today', $TODAY,
+ );
+
+#
+# texinfo styles (@foo{bar}) to HTML ones
+#
+%style_map = (
+ 'asis', '',
+ 'b', 'B',
+ 'cite', 'CITE',
+ 'code', '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',
+ 'file', '"TT', # will put quotes, cf. &apply_style
+ 'i', 'I',
+ 'kbd', 'KBD',
+ 'key', 'KBD',
+ 'math', 'EM',
+ '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
+ );
+
+#
+# texinfo format (@foo/@end foo) to HTML ones
+#
+%format_map = (
+ 'display', 'PRE',
+ 'example', 'PRE',
+ 'format', 'PRE',
+ 'lisp', 'PRE',
+ 'quotation', 'BLOCKQUOTE',
+ 'smallexample', 'PRE',
+ 'smalllisp', 'PRE',
+ # lists
+ 'itemize', 'UL',
+ 'enumerate', 'OL',
+ # poorly supported
+ 'flushleft', 'PRE',
+ 'flushright', 'PRE',
+ );
+
+#
+# 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}',
+ 'defmethod', 'defop Method',
+ # 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,
+ # useless
+ '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,
+ '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 #
+# #
+#---############################################################################
+
+%value = (); # hold texinfo variables, see also -D
+
+$use_bibliography = 1;
+$use_acc = 0;
+$debug = 0;
+$doctype = '';
+$check = 0;
+$expandinfo = 0;
+$use_glossary = 0;
+$invisible_mark = '';
+$use_iso = 0;
+@include_dirs = ();
+$show_menu = 0;
+$number_sections = 0;
+$split_node = 0;
+$split_chapter = 0;
+$monolithic = 0;
+$verbose = 0;
+$usage = <<EOT;
+This is $THISPROG
+To convert a Texinfo file to HMTL: $0 [options] file
+ where options can be:
+ -expandinfo : use \@ifinfo sections, not \@iftex
+ -glossary : handle a glossary
+ -invisible name: use 'name' as an invisible anchor
+ -Dname : define name like with \@set
+ -I dir : search also for files in 'dir'
+ -menu : handle menus
+ -monolithic : output only one file including ToC
+ -number : number sections
+ -split_chapter : split on main sections
+ -split_node : split on nodes
+ -usage : print usage instructions
+ -verbose : verbose output
+To check converted files: $0 -check [-verbose] files
+EOT
+
+while (@ARGV && $ARGV[0] =~ /^-/) {
+ $_ = shift(@ARGV);
+ if (/^-acc$/) { $use_acc = 1; next; }
+ if (/^-d(ebug)?(\d+)?$/) { $debug = $2 || shift(@ARGV); next; }
+ if (/^-doctype$/) { $doctype = shift(@ARGV); next; }
+ if (/^-c(heck)?$/) { $check = 1; next; }
+ if (/^-e(xpandinfo)?$/) { $expandinfo = 1; next; }
+ if (/^-g(lossary)?$/) { $use_glossary = 1; next; }
+ if (/^-i(nvisible)?$/) { $invisible_mark = shift(@ARGV); next; }
+ if (/^-iso$/) { $use_iso = 1; next; }
+ if (/^-D(.+)?$/) { $value{$1 || shift(@ARGV)} = 1; next; }
+ if (/^-I(.+)?$/) { push(@include_dirs, $1 || shift(@ARGV)); next; }
+ if (/^-m(enu)?$/) { $show_menu = 1; next; }
+ if (/^-mono(lithic)?$/) { $monolithic = 1; next; }
+ if (/^-n(umber)?$/) { $number_sections = 1; next; }
+ if (/^-s(plit)?_?(n(ode)?|c(hapter)?)?$/) {
+ if ($2 =~ /^n/) {
+ $split_node = 1;
+ } else {
+ $split_chapter = 1;
+ }
+ next;
+ }
+ if (/^-v(erbose)?$/) { $verbose = 1; next; }
+ die $usage;
+}
+if ($check) {
+ die $usage unless @ARGV > 0;
+ &check;
+ exit;
+}
+
+if (($split_node || $split_chapter) && $monolithic) {
+ warn "Can't use -monolithic with -split, -monolithic ignored.\n";
+ $monolithic = 0;
+}
+if ($expandinfo) {
+ $to_skip{'ifinfo'}++;
+ $to_skip{'end ifinfo'}++;
+} else {
+ $to_skip{'iftex'}++;
+ $to_skip{'end iftex'}++;
+}
+$invisible_mark = '<IMG SRC="invisible.xbm">' if $invisible_mark eq 'xbm';
+die $usage unless @ARGV == 1;
+$docu = shift(@ARGV);
+if ($docu =~ /.*\//) {
+ chop($docu_dir = $&);
+ $docu_name = $';
+} else {
+ $docu_dir = '.';
+ $docu_name = $docu;
+}
+unshift(@include_dirs, $docu_dir);
+$docu_name =~ s/\.te?x(i|info)?$//; # basename of the document
+
+$docu_doc = "$docu_name.html"; # document's contents
+if ($monolithic) {
+ $docu_toc = $docu_foot = $docu_doc;
+} else {
+ $docu_toc = "${docu_name}_toc.html"; # document's table of contents
+ $docu_foot = "${docu_name}_foot.html"; # document's footnotes
+}
+
+#
+# variables
+#
+$value{'html'} = 1; # predefine html (the output format)
+$value{'texi2html'} = '1.52'; # predefine texi2html (the translator)
+# _foo: internal to track @foo
+foreach ('_author', '_title', '_subtitle',
+ '_settitle', '_setfilename') {
+ $value{$_} = ''; # prevent -w warnings
+}
+%node2sec = (); # node to section name
+%node2href = (); # node to HREF
+%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 ($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 $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 $verbose;
+ require($extensions);
+ }
+}
+
+print "# reading from $docu\n" if $verbose;
+
+#+++############################################################################
+# #
+# Pass 1: read source, handle command, variable, simple substitution #
+# #
+#---############################################################################
+
+@lines = (); # whole document
+@toc_lines = (); # table of contents
+$toplevel = 0; # top level seen in hierarchy
+$curlevel = 0; # current level in TOC
+$node = ''; # current node 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
+$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
+$split_num = 0; # split index
+$deferred_ref = ''; # deferred reference for indexes
+@html_stack = (); # HTML elements stack
+$html_element = ''; # current HTML element
+&html_reset;
+
+# 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 .= "([aeiou])/&\${1}$accent_map{$_};/gi;\n";
+ }
+}
+eval("sub simple_substitutions { $subst_code }");
+
+&init_input;
+while ($_ = &next_line) {
+ #
+ # remove \input on the first lines only
+ #
+ if ($first_line) {
+ next if /^\\input/;
+ $first_line = 0;
+ }
+ #
+ # parse texinfo tags
+ #
+ $tag = '';
+ $end_tag = '';
+ if (/^\@end\s+(\w+)\b/) {
+ $end_tag = $1;
+ } elsif (/^\@(\w+)\b/) {
+ $tag = $1;
+ }
+ #
+ # handle @ifhtml / @end ifhtml
+ #
+ if ($in_html) {
+ if ($end_tag eq 'ifhtml') {
+ $in_html = 0;
+ } else {
+ $tag2pro{$in_html} .= $_;
+ }
+ next;
+ } elsif ($tag eq 'ifhtml') {
+ $in_html = $PROTECTTAG . ++$html_num;
+ push(@lines, $in_html);
+ next;
+ }
+ #
+ # try to skip the line
+ #
+ if ($end_tag) {
+ next if $to_skip{"end $end_tag"};
+ } elsif ($tag) {
+ next if $to_skip{$tag};
+ last if $tag eq 'bye';
+ }
+ if ($in_top) {
+ # parsing the top node
+ if ($tag eq 'node' || $tag eq 'include' || $sec2level{$tag}) {
+ # no more in top
+ $in_top = 0;
+ } else {
+ # skip it
+ next;
+ }
+ }
+ #
+ # try to remove inlined comments
+ # syntax from tex-mode.el comment-start-skip
+ #
+ s/((^|[^\@])(\@\@)*)\@c(omment)? .*/$1/;
+ # non-@ substitutions cf. texinfmt.el
+ 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';
+ if ($expandinfo) {
+ &skip_until($tag), next if $tag eq 'iftex';
+ } else {
+ &skip_until($tag), next if $tag eq 'ifinfo';
+ }
+ &skip_until($tag), next if $tag eq 'tex';
+ # 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;
+ @lines = (); # ignore all lines before top (title page garbage)
+ next;
+ } elsif ($tag eq 'node') {
+ $in_top = 0;
+ warn "$ERROR Bad node line: $_" unless $_ =~ /^\@node\s$NODESRE$/o;
+ $_ = &protect_html($_); # if node contains '&' for instance
+ s/^\@node\s+//;
+ ($node) = split(/,/);
+ &normalise_node($node);
+ if ($split_node) {
+ &next_doc;
+ push(@lines, $SPLITTAG) if $split_num++;
+ push(@sections, $node);
+ }
+ next;
+ } elsif ($tag eq 'include') {
+ if (/^\@include\s+($FILERE)\s*$/o) {
+ $file = $1;
+ unless (-e $file) {
+ foreach $dir (@include_dirs) {
+ $file = "$dir/$1";
+ last if -e $file;
+ }
+ }
+ if (-e $file) {
+ &open($file);
+ print "# including $file\n" if $verbose;
+ } else {
+ warn "$ERROR Can't find $file, 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 ($show_menu) {
+ &skip_until($tag);
+ next;
+ }
+ &html_push_if($tag);
+ push(@lines, &html_debug("\n", __LINE__));
+ } elsif ($format_map{$tag}) {
+ $in_pre = 1 if $format_map{$tag} eq 'PRE';
+ &html_push_if($format_map{$tag});
+ push(@lines, &html_debug("\n", __LINE__));
+ $in_list++ if $format_map{$tag} eq 'UL' || $format_map{$tag} eq 'OL' ;
+ push(@lines, &debug("<$format_map{$tag}>\n", __LINE__));
+ next;
+ } elsif ($tag eq 'table') {
+ if (/^\@(|f|v|multi)table\s+\@(\w+)/) {
+ $in_table = $2;
+ unshift(@tables, join($;, $table_type, $in_table));
+ if ($table_type eq "multi") {
+ push(@lines, &debug("<TABLE BORDER>\n", __LINE__));
+ &html_push_if('TABLE');
+ } else {
+ push(@lines, &debug("<DL COMPACT>\n", __LINE__));
+ &html_push_if('DL');
+ }
+ push(@lines, &html_debug("\n", __LINE__));
+ } else {
+ warn "$ERROR Bad table line: $_";
+ }
+ next;
+ } elsif ($tag eq 'synindex' || $tag eq 'syncodeindex') {
+ if (/^\@$tag\s+(\w)\w\s+(\w)\w\s*$/) {
+ eval("*${1}index = *${2}index");
+ } else {
+ warn "$ERROR Bad syn*index line: $_";
+ }
+ next;
+ } elsif ($tag eq 'sp') {
+ push(@lines, &debug("<P>\n", __LINE__));
+ next;
+ } 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;
+ $node2href{$setref} = "$docu_doc#$docid";
+ } else {
+ warn "$ERROR Bad setref line: $_";
+ }
+ next;
+ } elsif ($tag eq 'defindex' || $tag eq 'defcodeindex') {
+ if (/^\@$tag\s+(\w\w)\s*$/) {
+ $valid_index{$1} = 1;
+ } else {
+ warn "$ERROR Bad defindex line: $_";
+ }
+ next;
+ } 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 $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 $debug & $DEBUG_DEF;
+ $type .= ':'; # it's nicer like this
+ $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') {
+ unshift(@input_spool, "\@findex $name\n");
+ } elsif ($tag eq 'defop') {
+ unshift(@input_spool, "\@findex $name on $ftype\n");
+ } elsif ($tag eq 'defvr' || $tag eq 'deftypevr' || $tag eq 'defcv') {
+ unshift(@input_spool, "\@vindex $name\n");
+ } else {
+ 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('LI', 'P');
+ &html_pop_if();
+ push(@lines, &debug("</$format_map{$end_tag}>\n", __LINE__));
+ push(@lines, &html_debug("\n", __LINE__));
+ } elsif ($end_tag =~ /^(|f|v|multi)table$/) {
+ unless (@tables) {
+ warn "$ERROR \@end $end_tag without \@*table\n";
+ next;
+ }
+ ($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;
+ }
+ #
+ # misc things
+ #
+ # protect texi and HTML things
+ &protect_texi;
+ $_ = &protect_html($_) unless $dont_html;
+ $dont_html = 0;
+ # substitution (unsupported things)
+ s/^\@center\s+//g;
+ s/^\@exdent\s+//g;
+ s/\@noindent\s+//g;
+ s/\@refill\s+//g;
+ # other substitutions
+ &simple_substitutions;
+ s/\@value{($VARRE)}/$value{$1}/eg;
+ 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 =~ s/\s+$//;
+ $level = $sec2level{$tag};
+ $name = &update_sec_num($tag, $level) . " $name"
+ if $number_sections && $tag !~ /^unnumbered/;
+ if ($tag =~ /heading$/) {
+ push(@lines, &html_debug("\n", __LINE__));
+ if ($html_element ne 'body') {
+ # We are in a nice pickle here. We are trying to get a H? heading
+ # even though we are not in the body level. So, we convert it to a
+ # nice, bold, line by itself.
+ $_ = &debug("\n\n<P><STRONG>$name</STRONG></P>\n\n", __LINE__);
+ } else {
+ $_ = &debug("<H$level>$name</H$level>\n", __LINE__);
+ &html_push_if('body');
+ }
+ print "# heading, section $name, level $level\n"
+ if $debug & $DEBUG_TOC;
+ } else {
+ if ($split_chapter) {
+ unless ($toplevel) {
+ # first time we see a "section"
+ unless ($level == 1) {
+ warn "$ERROR The first section found is not of level 1: $_";
+ warn "$ERROR I'll split on sections of level $level...\n";
+ }
+ $toplevel = $level;
+ }
+ if ($level == $toplevel) {
+ &next_doc;
+ push(@lines, $SPLITTAG) if $split_num++;
+ push(@sections, $name);
+ }
+ }
+ $sec_num++;
+ $docid = "SEC$sec_num";
+ $tocid = "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) {
+ if ($node2sec{$node}) {
+ warn "$ERROR Duplicate node found: $node\n";
+ } else {
+ $node2sec{$node} = $name;
+ $node2href{$node} = "$docu_doc#$docid";
+ print "# node $node, section $name, level $level\n"
+ if $debug & $DEBUG_TOC;
+ }
+ $node = '';
+ } else {
+ print "# no node, section $name, level $level\n"
+ if $debug & $DEBUG_TOC;
+ }
+ # update TOC
+ while ($level > $curlevel) {
+ $curlevel++;
+ push(@toc_lines, "<UL>\n");
+ }
+ while ($level < $curlevel) {
+ $curlevel--;
+ push(@toc_lines, "</UL>\n");
+ }
+ $_ = "<LI>" . &anchor($tocid, "$docu_doc#$docid", $name, 1);
+ push(@toc_lines, &substitute_style($_));
+ # update DOC
+ push(@lines, &html_debug("\n", __LINE__));
+ &html_reset;
+ $_ = "<H$level>".&anchor($docid, "$docu_toc#$tocid", $name)."</H$level>\n";
+ $_ = &debug($_, __LINE__);
+ push(@lines, &html_debug("\n", __LINE__));
+ }
+ # update DOC
+ foreach $line (split(/\n+/, $_)) {
+ push(@lines, "$line\n");
+ }
+ next;
+ } else {
+ warn "$ERROR Bad section line: $_";
+ }
+ } else {
+ # track variables
+ $value{$1} = $2, next if /^\@set\s+($VARRE)\s+(.*)$/o;
+ delete $value{$1}, next if /^\@clear\s+($VARRE)\s*$/o;
+ # store things
+ $value{'_setfilename'} = $1, next if /^\@setfilename\s+(.*)$/;
+ $value{'_settitle'} = $1, next if /^\@settitle\s+(.*)$/;
+ $value{'_author'} .= "$1\n", next if /^\@author\s+(.*)$/;
+ $value{'_subtitle'} .= "$1\n", next if /^\@subtitle\s+(.*)$/;
+ $value{'_title'} .= "$1\n", next if /^\@title\s+(.*)$/;
+ # index
+ if (/^\@(..?)index\s+/) {
+ unless ($valid_index{$1}) {
+ warn "$ERROR Undefined index command: $_";
+ next;
+ }
+ $id = 'IDX' . ++$idx_num;
+ $index = $1 . 'index';
+ $what = &substitute_style($');
+ $what =~ s/\s+$//;
+ print "# found $index for '$what' id $id\n"
+ if $debug & $DEBUG_INDEX;
+ eval(<<EOC);
+ if (defined(\$$index\{\$what\})) {
+ \$$index\{\$what\} .= "$;$docu_doc#$id";
+ } else {
+ \$$index\{\$what\} = "$docu_doc#$id";
+ }
+EOC
+ #
+ # dirty hack to see if I can put an invisible anchor...
+ #
+ if ($html_element eq 'P' ||
+ $html_element eq 'LI' ||
+ $html_element eq 'DT' ||
+ $html_element eq 'DD' ||
+ $html_element eq 'ADDRESS' ||
+ $html_element eq 'B' ||
+ $html_element eq 'BLOCKQUOTE' ||
+ $html_element eq 'PRE' ||
+ $html_element eq 'SAMP') {
+ push(@lines, &anchor($id, '', $invisible_mark, !$in_pre));
+ } elsif ($html_element eq 'body') {
+ push(@lines, &debug("<P>\n", __LINE__));
+ push(@lines, &anchor($id, '', $invisible_mark, !$in_pre));
+ &html_push('P');
+ } elsif ($html_element eq 'DL' ||
+ $html_element eq 'UL' ||
+ $html_element eq 'OL' ) {
+ $deferred_ref .= &anchor($id, '', $invisible_mark, !$in_pre) . " ";
+ }
+ next;
+ }
+ # list item
+ if (/^\@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 $debug & $DEBUG_BIB;
+ $what = &anchor($id, '', $what);
+ }
+ } elsif ($in_glossary && $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 $debug & $DEBUG_GLOSS;
+ $what = &anchor($id, '', $what);
+ }
+ &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("\n", __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") {
+ next if $#lines >= 0 && $lines[$#lines] eq "\n";
+ if ($html_element eq 'P') {
+ push(@lines, "\n");
+ $_ = &debug("</P>\n", __LINE__);
+ &html_pop;
+ }
+ } elsif ($html_element eq 'body' || $html_element eq 'BLOCKQUOTE') {
+ push(@lines, "<P>\n");
+ &html_push('P');
+ $_ = &debug($_, __LINE__);
+ }
+ # otherwise
+ push(@lines, $_);
+}
+
+# finish TOC
+$level = 0;
+while ($level < $curlevel) {
+ $curlevel--;
+ push(@toc_lines, "</UL>\n");
+}
+
+print "# end of pass 1\n" if $verbose;
+
+#+++############################################################################
+# #
+# 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
+ #
+ $in_menu = 1, push(@lines2, &debug("<UL>\n", __LINE__)), next if /^\@menu\b/;
+ $in_menu = 0, push(@lines2, &debug("</UL>\n", __LINE__)), next if /^\@end\s+menu\b/;
+ if ($in_menu) {
+ if (/^\*\s+($NODERE)::/o) {
+ $descr = $';
+ chop($descr);
+ &menu_entry($1, $1, $descr);
+ } elsif (/^\*\s+(.+):\s+([^\t,\.\n]+)[\t,\.\n]/) {
+ $descr = $';
+ chop($descr);
+ &menu_entry($1, $2, $descr);
+ } elsif (/^\*/) {
+ warn "$ERROR Bad menu line: $_";
+ } else { # description continued?
+ push(@lines2, $_);
+ }
+ next;
+ }
+ #
+ # printindex
+ #
+ if (/^\@printindex\s+(\w\w)\b/) {
+ local($index, *ary, @keys, $key, $letter, $last_letter, @refs);
+ if ($predefined_index{$1}) {
+ $index = $predefined_index{$1} . 'index';
+ } else {
+ $index = $1 . 'index';
+ }
+ eval("*ary = *$index");
+ @keys = keys(%ary);
+ foreach $key (@keys) {
+ $_ = $key;
+ 1 while s/<(\w+)>\`(.*)\'<\/\1>/$2/; # remove HTML tags with quotes
+ 1 while s/<(\w+)>(.*)<\/\1>/$2/; # remove HTML tags
+ $_ = &unprotect_html($_);
+ &unprotect_texi;
+ tr/A-Z/a-z/; # lowercase
+ $key2alpha{$key} = $_;
+ print "# index $key sorted as $_\n"
+ if $key ne $_ && $debug & $DEBUG_INDEX;
+ }
+ push(@lines2, "Jump to:\n");
+ $last_letter = undef;
+ foreach $key (sort byalpha @keys) {
+ $letter = substr($key2alpha{$key}, 0, 1);
+ $letter = substr($key2alpha{$key}, 0, 2) if $letter eq $;;
+ if (!defined($last_letter) || $letter ne $last_letter) {
+ push(@lines2, "-\n") if defined($last_letter);
+ push(@lines2, "<A HREF=\"#$index\_$letter\">" . &protect_html($letter) . "</A>\n");
+ $last_letter = $letter;
+ }
+ }
+ push(@lines2, "<P>\n");
+ $last_letter = undef;
+ foreach $key (sort byalpha @keys) {
+ $letter = substr($key2alpha{$key}, 0, 1);
+ $letter = substr($key2alpha{$key}, 0, 2) if $letter eq $;;
+ if (!defined($last_letter) || $letter ne $last_letter) {
+ push(@lines2, "</DIR>\n") if defined($last_letter);
+ push(@lines2, "<H2><A NAME=\"$index\_$letter\">" . &protect_html($letter) . "</A></H2>\n");
+ push(@lines2, "<DIR>\n");
+ $last_letter = $letter;
+ }
+ @refs = ();
+ foreach (split(/$;/, $ary{$key})) {
+ push(@refs, &anchor('', $_, $key, 0));
+ }
+ push(@lines2, "<LI>" . join(", ", @refs) . "\n");
+ }
+ push(@lines2, "</DIR>\n") if defined($last_letter);
+ next;
+ }
+ #
+ # simple style substitutions
+ #
+ $_ = &substitute_style($_);
+ #
+ # xref
+ #
+ while (/\@(x|px|info|)ref{($XREFRE)(}?)/o) {
+ # 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 = 'See ';
+ } elsif ($type eq 'px') {
+ $type = 'see ';
+ } elsif ($type eq 'info') {
+ $type = '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
+ &normalise_node($node);
+ $sec = $node2sec{$node};
+ if (@args == 5) { # reference to another manual
+ $sec = $args[2] || $node;
+ $man = $args[4] || $args[3];
+ $_ = "${before}${type}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 = $node2href{$node};
+ $_ = "${before}${type}section " . &anchor('', $href, $sec) . $after;
+ } else {
+ warn "$ERROR Undefined node ($node): $_";
+ $_ = "$before$;0xref{$nodes}$after";
+ }
+ }
+ #
+ # 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 . &anchor('', $href, $what);
+ } else {
+ $done .= "$pre$what";
+ }
+ $_ = $post;
+ }
+ $_ = $done . $_;
+ }
+ if ($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 . &anchor('', $href, $what);
+ } else {
+ $done .= "$pre$what";
+ }
+ $_ = $post;
+ }
+ $_ = $done . $_;
+ }
+ }
+ # otherwise
+ push(@lines2, $_);
+}
+print "# end of pass 2\n" if $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 $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>" . &anchor($footid, "$d#$docid", $foot) . "</H3>\n");
+ $text = "<P>$text" unless $text =~ /^\s*<P>/;
+ push(@foot_lines, "$text\n");
+ $_ = $before . &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 $verbose;
+
+#+++############################################################################
+# #
+# Pass 5: print things #
+# #
+#---############################################################################
+
+$header = <<EOT;
+<!-- This HTML file has been created by $THISPROG
+ from $docu on $TODAY -->
+EOT
+
+$full_title = $value{'_title'} || $value{'_settitle'} || "Untitled Document";
+$title = $value{'_settitle'} || $full_title;
+$_ = &substitute_style($full_title);
+&unprotect_texi;
+s/\n$//; # rmv last \n (if any)
+$full_title = "<H1>" . join("</H1>\n<H1>", split(/\n/, $_)) . "</H1>\n";
+
+#
+# print ToC
+#
+if (!$monolithic && @toc_lines) {
+ if (open(FILE, "> $docu_toc")) {
+ print "# creating $docu_toc...\n" if $verbose;
+ &print_toplevel_header("$title - Table of Contents");
+ &print_ruler;
+ &print(*toc_lines, FILE);
+ &print_toplevel_footer;
+ close(FILE);
+ } else {
+ warn "$ERROR Can't write to $docu_toc: $!\n";
+ }
+}
+
+#
+# print footnotes
+#
+if (!$monolithic && @foot_lines) {
+ if (open(FILE, "> $docu_foot")) {
+ print "# creating $docu_foot...\n" if $verbose;
+ &print_toplevel_header("$title - Footnotes");
+ &print_ruler;
+ &print(*foot_lines, FILE);
+ &print_toplevel_footer;
+ close(FILE);
+ } else {
+ warn "$ERROR Can't write to $docu_foot: $!\n";
+ }
+}
+
+#
+# print document
+#
+if ($split_chapter || $split_node) { # split
+ $doc_num = 0;
+ $last_num = scalar(@sections);
+ $first_doc = &doc_name(1);
+ $last_doc = &doc_name($last_num);
+ while (@sections) {
+ $section = shift(@sections);
+ &next_doc;
+ if (open(FILE, "> $docu_doc")) {
+ print "# creating $docu_doc...\n" if $verbose;
+ &print_header("$title - $section");
+ $prev_doc = ($doc_num == 1 ? undef : &doc_name($doc_num - 1));
+ $next_doc = ($doc_num == $last_num ? undef : &doc_name($doc_num + 1));
+ $navigation = "Go to the ";
+ $navigation .= ($prev_doc ? &anchor('', $first_doc, "first") : "first");
+ $navigation .= ", ";
+ $navigation .= ($prev_doc ? &anchor('', $prev_doc, "previous") : "previous");
+ $navigation .= ", ";
+ $navigation .= ($next_doc ? &anchor('', $next_doc, "next") : "next");
+ $navigation .= ", ";
+ $navigation .= ($next_doc ? &anchor('', $last_doc, "last") : "last");
+ $navigation .= " section, " . &anchor('', $docu_toc, "table of contents") . ".\n";
+ print FILE $navigation;
+ &print_ruler;
+ # find corresponding lines
+ @tmp_lines = ();
+ while (@doc_lines) {
+ $_ = shift(@doc_lines);
+ last if ($_ eq $SPLITTAG);
+ push(@tmp_lines, $_);
+ }
+ &print(*tmp_lines, FILE);
+ &print_ruler;
+ print FILE $navigation;
+ &print_footer;
+ close(FILE);
+ } else {
+ warn "$ERROR Can't write to $docu_doc: $!\n";
+ }
+ }
+} else { # not split
+ if (open(FILE, "> $docu_doc")) {
+ print "# creating $docu_doc...\n" if $verbose;
+ if ($monolithic || !@toc_lines) {
+ &print_toplevel_header($title);
+ } else {
+ &print_header($title);
+ print FILE $full_title;
+ }
+ if ($monolithic && @toc_lines) {
+ &print_ruler;
+ print FILE "<H1>Table of Contents</H1>\n";
+ &print(*toc_lines, FILE);
+ }
+ &print_ruler;
+ &print(*doc_lines, FILE);
+ if ($monolithic && @foot_lines) {
+ &print_ruler;
+ print FILE "<H1>Footnotes</H1>\n";
+ &print(*foot_lines, FILE);
+ }
+ if ($monolithic || !@toc_lines) {
+ &print_toplevel_footer;
+ } else {
+ &print_footer;
+ }
+ close(FILE);
+ } else {
+ warn "$ERROR Can't write to $docu_doc: $!\n";
+ }
+}
+
+print "# that's all folks\n" if $verbose;
+
+#+++############################################################################
+# #
+# Low level functions #
+# #
+#---############################################################################
+
+sub update_sec_num {
+ local($name, $level) = @_;
+
+ $level--; # here we start at 0
+ if ($name =~ /^appendix/) {
+ # appendix style
+ if (defined(@appendix_sec_num)) {
+ &incr_sec_num($level, @appendix_sec_num);
+ } else {
+ @appendix_sec_num = ('A', 0, 0, 0);
+ }
+ return(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);
+ }
+ return(join('.', @normal_sec_num[0..$level]));
+ }
+}
+
+sub incr_sec_num {
+ local($level, $l);
+ $level = shift(@_);
+ $_[$level]++;
+ foreach $l ($level+1 .. 3) {
+ $_[$l] = 0;
+ }
+}
+
+sub check {
+ local($_, %seen, %context, $before, $match, $after);
+
+ while (<>) {
+ if (/\@(\*|\.|\:|\@|\{|\})/) {
+ $seen{$&}++;
+ $context{$&} .= "> $_" if $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 $verbose;
+ } else {
+ $seen{$match}++;
+ $context{$match} .= "> $_" if $verbose;
+ }
+ $match =~ s/^\@/X/;
+ $_ = "$before$match$after";
+ redo;
+ }
+ }
+
+ foreach (sort(keys(%seen))) {
+ if ($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];
+}
+
+#
+# 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) = @_;
+ return("<!-- $line @html_stack, $html_element -->$what")
+ if $debug & $DEBUG_HTML;
+ return($what);
+}
+
+# to debug the output...
+sub debug {
+ local($what, $line) = @_;
+ return("<!-- $line -->$what")
+ if $debug & $DEBUG_HTML;
+ return($what);
+}
+
+sub normalise_node {
+ $_[0] =~ s/\s+/ /g;
+ $_[0] =~ s/ $//;
+ $_[0] =~ s/^ //;
+}
+
+sub menu_entry {
+ local($entry, $node, $descr) = @_;
+ local($href);
+
+ &normalise_node($node);
+ $href = $node2href{$node};
+ if ($href) {
+ $descr =~ s/^\s+//;
+ $descr = ": $descr" if $descr;
+ push(@lines2, "<LI>" . &anchor('', $href, $entry) . "$descr\n");
+ } else {
+ warn "$ERROR Undefined node ($node): $_";
+ }
+}
+
+sub do_ctrl { "^$_[0]" }
+
+sub do_email {
+ local($addr, $text) = split(/,\s*/, $_[0]);
+
+ $text = $addr unless $text;
+ &anchor('', "mailto:$addr", $text);
+}
+
+sub do_sc { "\U$_[0]\E" }
+
+sub do_uref {
+ local($url, $text) = split(/,\s*/, $_[0]);
+
+ $text = $url unless $text;
+ &anchor('', $url, $text);
+}
+
+sub do_url { &anchor('', $_[0], $_[0]) }
+
+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);
+ } 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($_) = @_;
+ s/\@\w+{([^\{\}]+)}/$1/g;
+ return($_);
+}
+
+sub substitute_style {
+ local($_) = @_;
+ local($changed, $done, $style, $text);
+
+ $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 anchor {
+ local($name, $href, $text, $newline) = @_;
+ local($result);
+
+ $result = "<A";
+ $result .= " NAME=\"$name\"" if $name;
+ $result .= " HREF=\"$href\"" if $href;
+ $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', 'Febuary', '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;
+ return("$mday $MoY[$mon] $year");
+}
+
+sub doc_name {
+ local($num) = @_;
+
+ return("${docu_name}_$num.html");
+}
+
+sub next_doc {
+ $docu_doc = &doc_name(++$doc_num);
+}
+
+sub print {
+ local(*lines, $fh) = @_;
+ local($_);
+
+ while (@lines) {
+ $_ = shift(@lines);
+ if (/^$PROTECTTAG/o) {
+ $_ = $tag2pro{$_};
+ } else {
+ &unprotect_texi;
+ }
+ print $fh $_;
+ }
+}
+
+sub print_ruler {
+ print FILE "<P><HR><P>\n";
+}
+
+sub print_header {
+ local($_);
+
+ # clean the title
+ $_ = &remove_style($_[0]);
+ &unprotect_texi;
+ # print the header
+ if ($doctype eq 'html2') {
+ print FILE $html2_doctype;
+ } elsif ($doctype) {
+ print FILE $doctype;
+ }
+ print FILE <<EOT;
+<HTML>
+<HEAD>
+$header
+<TITLE>$_</TITLE>
+</HEAD>
+<BODY>
+EOT
+}
+
+sub print_toplevel_header {
+ local($_);
+
+ &print_header; # pass given arg...
+ print FILE $full_title;
+ if ($value{'_subtitle'}) {
+ $value{'_subtitle'} =~ s/\n+$//;
+ foreach (split(/\n/, $value{'_subtitle'})) {
+ $_ = &substitute_style($_);
+ &unprotect_texi;
+ print FILE "<H2>$_</H2>\n";
+ }
+ }
+ if ($value{'_author'}) {
+ $value{'_author'} =~ s/\n+$//;
+ foreach (split(/\n/, $value{'_author'})) {
+ $_ = &substitute_style($_);
+ &unprotect_texi;
+ s/[\w.-]+\@[\w.-]+/<A HREF="mailto:$&">$&<\/A>/g;
+ print FILE "<ADDRESS>$_</ADDRESS>\n";
+ }
+ }
+ print FILE "<P>\n";
+}
+
+sub print_footer {
+ print FILE <<EOT;
+</BODY>
+</HTML>
+EOT
+}
+
+sub print_toplevel_footer {
+ &print_ruler;
+ print FILE <<EOT;
+This document was generated on $TODAY using the
+<A HREF=\"$HOMEPAGE\">texi2html</A>
+translator version 1.52.</P>
+EOT
+ &print_footer;
+}
+
+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;
+ # 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_html {
+ local($what) = @_;
+ $what =~ s/\&\#38;/\&/g;
+ $what =~ s/\&\#60;/\</g;
+ $what =~ s/\&\#62;/\>/g;
+ return($what);
+}
+
+sub byalpha {
+ $key2alpha{$a} cmp $key2alpha{$b};
+}
+
+##############################################################################
+
+ # 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 ############
+.TH TEXI2HTML 1 "01/05/98"
+.AT 3
+.SH NAME
+texi2html \- a Texinfo to HTML converter
+.SH SYNOPSIS
+.B texi2html [options] file
+.PP
+.B texi2html -check [-verbose] files
+.SH DESCRIPTION
+.I Texi2html
+converts the given Texinfo file to a set of HTML files. It tries to handle
+most of the Texinfo commands. It creates hypertext links for cross-references,
+footnotes...
+.PP
+It also tries to add links from a reference to its corresponding entry in the
+bibliography (if any). It may also handle a glossary (see the
+.B \-glossary
+option).
+.PP
+.I Texi2html
+creates several files depending on the contents of the Texinfo file and on
+the chosen options (see FILES).
+.PP
+The HTML files created by
+.I texi2html
+are closer to TeX than to Info, that's why
+.I texi2html
+converts @iftex sections and not @ifinfo ones by default. You can reverse
+this with the \-expandinfo option.
+.SH OPTIONS
+.TP 12
+.B \-check
+Check the given file and give the list of all things that may be Texinfo commands.
+This may be used to check the output of
+.I texi2html
+to find the Texinfo commands that have been left in the HTML file.
+.TP
+.B \-expandinfo
+Expand @ifinfo sections, not @iftex ones.
+.TP
+.B \-glossary
+Use the section named 'Glossary' to build a list of terms and put links in the HTML
+document from each term toward its definition.
+.TP
+.B \-invisible \fIname\fP
+Use \fIname\fP 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.
+.TP
+.B \-I \fIdir\fP
+Look also in \fIdir\fP to find included files.
+.TP
+.B \-menu
+Show the Texinfo menus; by default they are ignored.
+.TP
+.B \-monolithic
+Output only one file, including the table of contents and footnotes.
+.TP
+.B \-number
+Number the sections.
+.TP
+.B \-split_chapter
+Split the output into several HTML files (one per main section:
+chapter, appendix...).
+.TP
+.B \-split_node
+Split the output into several HTML files (one per node).
+.TP
+.B \-usage
+Print usage instructions, listing the current available command-line options.
+.TP
+.B \-verbose
+Give a verbose output. Can be used with the
+.B \-check
+option.
+.PP
+.SH FILES
+By default
+.I texi2html
+creates the following files (foo being the name of the Texinfo file):
+.TP 16
+.B foo_toc.html
+The table of contents.
+.TP
+.B foo.html
+The document's contents.
+.TP
+.B foo_foot.html
+The footnotes (if any).
+.PP
+When used with the
+.B \-split
+option, it creates several files (one per chapter or node), named
+.B foo_n.html
+(n being the indice of the chapter or node), instead of the single
+.B foo.html
+file.
+.PP
+When used with the
+.B \-monolithic
+option, it creates only one file:
+.B foo.html
+.SH VARIABLES
+.I texi2html
+predefines the following variables: \fBhtml\fP, \fBtexi2html\fP.
+.SH ADDITIONAL COMMANDS
+.I texi2html
+implements the following non-Texinfo commands (maybe they are in Texinfo now...):
+.TP 16
+.B @ifhtml
+This indicates the start of an HTML section, this section will passed through
+without any modification.
+.TP
+.B @end ifhtml
+This indicates the end of an HTML section.
+.SH VERSION
+This is \fItexi2html\fP version 1.52, 01/05/98.
+.PP
+The latest version of \fItexi2html\fP can be found in WWW, cf. URL
+http://wwwinfo.cern.ch/dis/texi2html/
+.SH AUTHOR
+The main author is Lionel Cons, CERN IT/DIS/OSE, Lionel.Cons@cern.ch.
+Many other people around the net contributed to this program.
+.SH COPYRIGHT
+This program is the intellectual property of the European
+Laboratory for Particle Physics (known as CERN). No guarantee whatsoever is
+provided by CERN. No liability whatsoever is accepted for any loss or damage
+of any kind resulting from any defect or inaccuracy in this information or
+code.
+.PP
+CERN, 1211 Geneva 23, Switzerland
+.SH "SEE ALSO"
+GNU Texinfo Documentation Format,
+HyperText Markup Language (HTML),
+World Wide Web (WWW).
+.SH BUGS
+This program does not understand all Texinfo commands (yet).
+.PP
+TeX specific commands (normally enclosed in @iftex) will be
+passed unmodified.
+.ex
diff --git a/gnu/lib/libreadline/doc/texinfo.tex b/gnu/lib/libreadline/doc/texinfo.tex
new file mode 100644
index 00000000000..79bcdbee9fa
--- /dev/null
+++ b/gnu/lib/libreadline/doc/texinfo.tex
@@ -0,0 +1,4692 @@
+%% TeX macros to handle texinfo files
+
+% Copyright (C) 1985, 86, 88, 90, 91, 92, 93,
+% 94, 95, 1996 Free Software Foundation, Inc.
+
+%This texinfo.tex file is free software; you can redistribute it and/or
+%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!
+
+
+% Send bug reports to bug-texinfo@prep.ai.mit.edu.
+% Please include a *precise* test case in each bug report.
+
+
+% Make it possible to create a .fmt file just by loading this file:
+% if the underlying format is not loaded, start by loading it now.
+% Added by gildea November 1993.
+\expandafter\ifx\csname fmtname\endcsname\relax\input plain\fi
+
+% This automatically updates the version number based on RCS.
+\def\deftexinfoversion$#1: #2 ${\def\texinfoversion{#2}}
+\deftexinfoversion$Revision: 1.1 $
+\message{Loading texinfo package [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]}\message{}
+ \catcode`+=\active \catcode`\_=\active}
+
+% 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\ptexi=\i
+\let\ptexlbrace=\{
+\let\ptexrbrace=\}
+\let\ptexstar=\*
+\let\ptext=\t
+\let\ptextilde=\~
+
+% 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\ }
+}
+\let\~ = \tie % And make it available as @~.
+
+
+\message{Basics,}
+\chardef\other=12
+
+% 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.
+\ifx\putwordChapter\undefined{\gdef\putwordChapter{Chapter}}\fi%
+\def\putwordInfo{Info}%
+\ifx\putwordSee\undefined{\gdef\putwordSee{See}}\fi%
+\ifx\putwordsee\undefined{\gdef\putwordsee{see}}\fi%
+\ifx\putwordfile\undefined{\gdef\putwordfile{file}}\fi%
+\ifx\putwordpage\undefined{\gdef\putwordpage{page}}\fi%
+\ifx\putwordsection\undefined{\gdef\putwordsection{section}}\fi%
+\ifx\putwordSection\undefined{\gdef\putwordSection{Section}}\fi%
+\ifx\putwordTableofContents\undefined{\gdef\putwordTableofContents{Table of Contents}}\fi%
+\ifx\putwordShortContents\undefined{\gdef\putwordShortContents{Short Contents}}\fi%
+\ifx\putwordAppendix\undefined{\gdef\putwordAppendix{Appendix}}\fi%
+
+% Ignore a token.
+%
+\def\gobble#1{}
+
+\hyphenation{ap-pen-dix}
+\hyphenation{mini-buf-fer mini-buf-fers}
+\hyphenation{eshell}
+
+% 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.
+%
+\def\gloggingall{\begingroup \globaldefs = 1 \loggingall \endgroup}%
+\def\loggingall{\tracingcommands2 \tracingstats2
+ \tracingpages1 \tracingoutput1 \tracinglostchars1
+ \tracingmacros2 \tracingparagraphs1 \tracingrestores1
+ \showboxbreadth\maxdimen\showboxdepth\maxdimen
+}%
+
+%---------------------Begin change-----------------------
+%
+%%%% For @cropmarks command.
+% Dimensions to add cropmarks at corners Added by P. A. MacKay, 12 Nov. 1986
+%
+\newdimen\cornerlong \newdimen\cornerthick
+\newdimen \topandbottommargin
+\newdimen \outerhsize \newdimen \outervsize
+\cornerlong=1pc\cornerthick=.3pt % These set size of cropmarks
+\outerhsize=7in
+%\outervsize=9.5in
+% Alternative @smallbook page size is 9.25in
+\outervsize=9.25in
+\topandbottommargin=.75in
+%
+%---------------------End change-----------------------
+
+% \onepageout takes a vbox as an argument. Note that \pagecontents
+% does insertions, but you have to call it yourself.
+\chardef\PAGE=255 \output={\onepageout{\pagecontents\PAGE}}
+\def\onepageout#1{%
+ \hoffset=\normaloffset
+ \ifodd\pageno \advance\hoffset by \bindingoffset
+ \else \advance\hoffset by -\bindingoffset\fi
+ {%
+ \escapechar = `\\ % use backslash in output files.
+ \indexdummies
+ \shipout\vbox{%
+ {\let\hsize=\pagewidth \makeheadline}%
+ \pagebody{#1}%
+ {\let\hsize=\pagewidth \makefootline}%
+ }%
+ }%
+ \advancepageno
+ \ifnum\outputpenalty>-20000 \else\dosupereject\fi
+}
+
+%%%% For @cropmarks command %%%%
+
+% Here is a modification of the main output routine for Near East Publications
+% This provides right-angle cropmarks at all four corners.
+% The contents of the page are centerlined into the cropmarks,
+% and any desired binding offset is added as an \hskip on either
+% site of the centerlined box. (P. A. MacKay, 12 November, 1986)
+%
+\def\croppageout#1{\hoffset=0pt % make sure this doesn't mess things up
+{\escapechar=`\\\relax % makes sure backslash is used in output files.
+ \shipout
+ \vbox to \outervsize{\hsize=\outerhsize
+ \vbox{\line{\ewtop\hfill\ewtop}}
+ \nointerlineskip
+ \line{\vbox{\moveleft\cornerthick\nstop}
+ \hfill
+ \vbox{\moveright\cornerthick\nstop}}
+ \vskip \topandbottommargin
+ \centerline{\ifodd\pageno\hskip\bindingoffset\fi
+ \vbox{
+ {\let\hsize=\pagewidth \makeheadline}
+ \pagebody{#1}
+ {\let\hsize=\pagewidth \makefootline}}
+ \ifodd\pageno\else\hskip\bindingoffset\fi}
+ \vskip \topandbottommargin plus1fill minus1fill
+ \boxmaxdepth\cornerthick
+ \line{\vbox{\moveleft\cornerthick\nsbot}
+ \hfill
+ \vbox{\moveright\cornerthick\nsbot}}
+ \nointerlineskip
+ \vbox{\line{\ewbot\hfill\ewbot}}
+ }}
+ \advancepageno
+ \ifnum\outputpenalty>-20000 \else\dosupereject\fi}
+%
+% Do @cropmarks to get crop marks
+\def\cropmarks{\let\onepageout=\croppageout }
+
+\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. Type 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{Type <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}}%
+}
+
+
+% Single-spacing is done by various environments (specifically, in
+% \nonfillstart and \quotations).
+\newskip\singlespaceskip \singlespaceskip = 12.5pt
+\def\singlespace{%
+ % Why was this kern here? It messes up equalizing space above and below
+ % environments. --karl, 6may93
+ %{\advance \baselineskip by -\singlespaceskip
+ %\kern \baselineskip}%
+ \setleading \singlespaceskip
+}
+
+%% Simple single-character @ commands
+
+% @@ prints an @
+% Kludge this until the fonts are right (grr).
+\def\@{{\tt \char '100}}
+
+% 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 \char '173}}
+\def\myrbrace {{\tt \char '175}}
+\let\{=\mylbrace
+\let\}=\myrbrace
+\begingroup
+ % Definitions to produce actual \{ & \} command in an index.
+ \catcode`\{ = 12 \catcode`\} = 12
+ \catcode`\[ = 1 \catcode`\] = 2
+ \catcode`\@ = 0 \catcode`\\ = 12
+ @gdef@lbracecmd[\{]%
+ @gdef@rbracecmd[\}]%
+@endgroup
+
+% Accents: @, @dotaccent @ringaccent @ubaraccent @udotaccent
+% Others are defined by plain TeX: @` @' @" @^ @~ @= @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 (and 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
+}
+
+% @: 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 }
+
+% @enddots{} is an end-of-sentence ellipsis.
+\gdef\enddots{$\mathinner{\ldotp\ldotp\ldotp\ldotp}$\spacefactor=3000}
+
+% @! is an end-of-sentence bang.
+\gdef\!{!\spacefactor=3000 }
+
+% @? is an end-of-sentence query.
+\gdef\?{?\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.
+%
+\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.
+ \endgroup % End the \group.
+ }%
+ %
+ \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\penalty 10000
+%\prevdepth=-1000pt
+%}}
+
+\def\needx#1{%
+ % Go into vertical mode, so we don't make a big box in the middle of a
+ % paragraph.
+ \par
+ %
+ % Don't add any leading before our big empty box, but allow a page
+ % break, since the best break might be right here.
+ \allowbreak
+ \nointerlineskip
+ \vtop to #1\mil{\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
+}
+
+% @br forces paragraph break
+
+\let\br = \par
+
+% @dots{} output some dots
+
+\def\dots{$\ldots$}
+
+% @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{TEXT} puts TEXT in the margin next to the current paragraph.
+
+\def\inmargin#1{%
+\strut\vadjust{\nobreak\kern-\strutdepth
+ \vtop to \strutdepth{\baselineskip\strutdepth\vss
+ \llap{\rightskip=\inmarginspacing \vbox{\noindent #1}}\null}}}
+\newskip\inmarginspacing \inmarginspacing=1cm
+\def\strutdepth{\dp\strutbox}
+
+%\hbox{{\rm#1}}\hfil\break}}
+
+% @include file insert text of that file as input.
+% Allow normal characters that we make active in the argument (a file name).
+\def\include{\begingroup
+ \catcode`\\=12
+ \catcode`~=12
+ \catcode`^=12
+ \catcode`_=12
+ \catcode`|=12
+ \catcode`<=12
+ \catcode`>=12
+ \catcode`+=12
+ \parsearg\includezzz}
+% Restore active chars for included file.
+\def\includezzz#1{\endgroup\begingroup
+ % Read the included file in a group so nested @include's work.
+ \def\thisfile{#1}%
+ \input\thisfile
+\endgroup}
+
+\def\thisfile{}
+
+% @center line outputs that line, centered
+
+\def\center{\parsearg\centerzzz}
+\def\centerzzz #1{{\advance\hsize by -\leftskip
+\advance\hsize by -\rightskip
+\centerline{#1}}}
+
+% @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{\catcode 64=\other \catcode 123=\other \catcode 125=\other%
+\parsearg \commentxxx}
+
+\def\commentxxx #1{\catcode 64=0 \catcode 123=1 \catcode 125=2 }
+
+\let\c=\comment
+
+% @paragraphindent is defined for the Info formatting commands only.
+\let\paragraphindent=\comment
+
+% 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.
+%
+\def\ignoremorecommands{%
+ \let\defcodeindex = \relax
+ \let\defcv = \relax
+ \let\deffn = \relax
+ \let\deffnx = \relax
+ \let\defindex = \relax
+ \let\defivar = \relax
+ \let\defmac = \relax
+ \let\defmethod = \relax
+ \let\defop = \relax
+ \let\defopt = \relax
+ \let\defspec = \relax
+ \let\deftp = \relax
+ \let\deftypefn = \relax
+ \let\deftypefun = \relax
+ \let\deftypevar = \relax
+ \let\deftypevr = \relax
+ \let\defun = \relax
+ \let\defvar = \relax
+ \let\defvr = \relax
+ \let\ref = \relax
+ \let\xref = \relax
+ \let\printindex = \relax
+ \let\pxref = \relax
+ \let\settitle = \relax
+ \let\setchapternewpage = \relax
+ \let\setchapterstyle = \relax
+ \let\everyheading = \relax
+ \let\evenheading = \relax
+ \let\oddheading = \relax
+ \let\everyfooting = \relax
+ \let\evenfooting = \relax
+ \let\oddfooting = \relax
+ \let\headings = \relax
+ \let\include = \relax
+ \let\lowersections = \relax
+ \let\down = \relax
+ \let\raisesections = \relax
+ \let\up = \relax
+ \let\set = \relax
+ \let\clear = \relax
+ \let\item = \relax
+}
+
+% Ignore @ignore ... @end ignore.
+%
+\def\ignore{\doignore{ignore}}
+
+% Also ignore @ifinfo, @ifhtml, @html, @menu, and @direntry text.
+%
+\def\ifinfo{\doignore{ifinfo}}
+\def\ifhtml{\doignore{ifhtml}}
+\def\html{\doignore{html}}
+\def\menu{\doignore{menu}}
+\def\direntry{\doignore{direntry}}
+
+% Also ignore @macro ... @end macro. The user must run texi2dvi,
+% which runs makeinfo to do macro expansion. Ignore @unmacro, too.
+\def\macro{\doignore{macro}}
+\let\unmacro = \comment
+
+
+% @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'.
+ \long\def\doignoretext##1\end #1{\enddoignore}%
+ %
+ % Make sure that spaces turn into tokens that match what \doignoretext wants.
+ \catcode32 = 10
+ %
+ % And now expand that command.
+ \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.ai.mit.edu/pub/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 change of memory overflow, we follow the approach outlined on
+ % page 401 of the TeXbook: make the current font be a dummy font.
+ %
+ \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 not all sites
+ % might 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 (mostly for their use in
+ % smallexample)
+ \let\indrm = \nullfont \let\indit = \nullfont \let\indsl = \nullfont
+ \let\indbf = \nullfont \let\indtt = \nullfont \let\indsc = \nullfont
+ \let\indsf = \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}}
+}
+
+% @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 \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.
+%
+\def\value#1{\expandafter
+ \ifx\csname SET#1\endcsname\relax
+ {\{No value for ``#1''\}}
+ \else \csname SET#1\endcsname \fi}
+
+% @ifset VAR ... @end ifset reads the `...' iff VAR has been defined
+% with @set.
+%
+\def\ifset{\parsearg\ifsetxxx}
+\def\ifsetxxx #1{%
+ \expandafter\ifx\csname SET#1\endcsname\relax
+ \expandafter\ifsetfail
+ \else
+ \expandafter\ifsetsucceed
+ \fi
+}
+\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\ifclearxxx}
+\def\ifclearxxx #1{%
+ \expandafter\ifx\csname SET#1\endcsname\relax
+ \expandafter\ifclearsucceed
+ \else
+ \expandafter\ifclearfail
+ \fi
+}
+\def\ifclearsucceed{\conditionalsucceed{ifclear}}
+\def\ifclearfail{\nestedignore{ifclear}}
+\defineunmatchedend{ifclear}
+
+% @iftex always succeeds; we read the text following, through @end
+% iftex). But `@end iftex' should be valid only after an @iftex.
+%
+\def\iftex{\conditionalsucceed{iftex}}
+\defineunmatchedend{iftex}
+
+% We can't just want to start a group at @iftex (for example) and end it
+% at @end iftex, since then @set commands inside the conditional have no
+% effect (they'd get reverted at the end of the group). So we must
+% define \Eiftex to redefine itself to be its previous value. (We can't
+% just define it to fail again with an ``unmatched end'' error, since
+% the @ifset might be nested.)
+%
+\def\conditionalsucceed#1{%
+ \edef\temp{%
+ % Remember the current value of \E#1.
+ \let\nece{prevE#1} = \nece{E#1}%
+ %
+ % At the `@end #1', redefine \E#1 to be its previous value.
+ \def\nece{E#1}{\let\nece{E#1} = \nece{prevE#1}}%
+ }%
+ \temp
+}
+
+% We need to expand lots of \csname's, but we don't want to expand the
+% control sequences after we've constructed them.
+%
+\def\nece#1{\expandafter\noexpand\csname#1\endcsname}
+
+% @asis just yields its argument. Used with @table, for example.
+%
+\def\asis#1{#1}
+
+% @math means output in math mode.
+% We don't use $'s directly in the definition of \math because control
+% sequences like \math are expanded when the toc file is written. Then,
+% we read the toc file back, the $'s will be normal characters (as they
+% should be, according to the definition of Texinfo). So we must use a
+% control sequence to switch into and out of math mode.
+%
+% This isn't quite enough for @math to work properly in indices, but it
+% seems unlikely it will ever be needed there.
+%
+\let\implicitmath = $
+\def\math#1{\implicitmath #1\implicitmath}
+
+% @bullet and @minus need the same treatment as @math, just above.
+\def\bullet{\implicitmath\ptexbullet\implicitmath}
+\def\minus{\implicitmath-\implicitmath}
+
+\def\node{\ENVcheck\parsearg\nodezzz}
+\def\nodezzz#1{\nodexxx [#1,]}
+\def\nodexxx[#1,#2]{\gdef\lastnode{#1}}
+\let\nwnode=\node
+\let\lastnode=\relax
+
+\def\donoderef{\ifx\lastnode\relax\else
+\expandafter\expandafter\expandafter\setref{\lastnode}\fi
+\global\let\lastnode=\relax}
+
+\def\unnumbnoderef{\ifx\lastnode\relax\else
+\expandafter\expandafter\expandafter\unnumbsetref{\lastnode}\fi
+\global\let\lastnode=\relax}
+
+\def\appendixnoderef{\ifx\lastnode\relax\else
+\expandafter\expandafter\expandafter\appendixsetref{\lastnode}\fi
+\global\let\lastnode=\relax}
+
+% @refill is a no-op.
+\let\refill=\relax
+
+% @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{%
+ \readauxfile
+ \opencontents
+ \openindices
+ \fixbackslash % Turn off hack to swallow `\input texinfo'.
+ \global\let\setfilename=\comment % Ignore extra @setfilename cmds.
+ \comment % Ignore the actual filename.
+}
+
+% @bye.
+\outer\def\bye{\pagealignmacro\tracingstats=1\ptexend}
+
+% \def\macro#1{\begingroup\ignoresections\catcode`\#=6\def\macrotemp{#1}\parsearg\macroxxx}
+% \def\macroxxx#1#2 \end macro{%
+% \expandafter\gdef\macrotemp#1{#2}%
+% \endgroup}
+
+%\def\linemacro#1{\begingroup\ignoresections\catcode`\#=6\def\macrotemp{#1}\parsearg\linemacroxxx}
+%\def\linemacroxxx#1#2 \end linemacro{%
+%\let\parsearg=\relax
+%\edef\macrotempx{\csname M\butfirst\expandafter\string\macrotemp\endcsname}%
+%\expandafter\xdef\macrotemp{\parsearg\macrotempx}%
+%\expandafter\gdef\macrotempx#1{#2}%
+%\endgroup}
+
+%\def\butfirst#1{}
+
+
+\message{fonts,}
+
+% Font-change commands.
+
+% Texinfo 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}
+
+%% Try out Computer Modern fonts at \magstephalf
+\let\mainmagstep=\magstephalf
+
+% 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}
+
+\ifx\bigger\relax
+\let\mainmagstep=\magstep1
+\setfont\textrm\rmshape{12}{1000}
+\setfont\texttt\ttshape{12}{1000}
+\else
+\setfont\textrm\rmshape{10}{\mainmagstep}
+\setfont\texttt\ttshape{10}{\mainmagstep}
+\fi
+% Instead of cmb10, you many want to use cmbx10.
+% cmbx10 is a prettier font on its own, but cmb10
+% looks better when embedded in a line with cmr10.
+\setfont\textbf\bfshape{10}{\mainmagstep}
+\setfont\textit\itshape{10}{\mainmagstep}
+\setfont\textsl\slshape{10}{\mainmagstep}
+\setfont\textsf\sfshape{10}{\mainmagstep}
+\setfont\textsc\scshape{10}{\mainmagstep}
+\setfont\textttsl\ttslshape{10}{\mainmagstep}
+\font\texti=cmmi10 scaled \mainmagstep
+\font\textsy=cmsy10 scaled \mainmagstep
+
+% A few fonts for @defun, etc.
+\setfont\defbf\bxshape{10}{\magstep1} %was 1314
+\setfont\deftt\ttshape{10}{\magstep1}
+\def\df{\let\tentt=\deftt \let\tenbf = \defbf \bf}
+
+% Fonts for indices and small examples (9pt).
+% We actually use the slanted font rather than the italic,
+% because texinfo normally uses the slanted fonts for that.
+% Do not make many font distinctions in general in the index, since they
+% aren't very useful.
+\setfont\ninett\ttshape{9}{1000}
+\setfont\indrm\rmshape{9}{1000}
+\setfont\indit\slshape{9}{1000}
+\let\indsl=\indit
+\let\indtt=\ninett
+\let\indttsl=\ninett
+\let\indsf=\indrm
+\let\indbf=\indrm
+\setfont\indsc\scshape{10}{900}
+\font\indi=cmmi9
+\font\indsy=cmsy9
+
+% 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{12}{\magstep2}
+\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
+
+% \setfont\ssecrm\bxshape{10}{\magstep1} % This size an font looked bad.
+% \setfont\ssecit\itshape{10}{\magstep1} % The letters were too crowded.
+% \setfont\ssecsl\slshape{10}{\magstep1}
+% \setfont\ssectt\ttshape{10}{\magstep1}
+% \setfont\ssecsf\sfshape{10}{\magstep1}
+
+%\setfont\ssecrm\bfshape{10}{1315} % Note the use of cmb rather than cmbx.
+%\setfont\ssecit\itshape{10}{1315} % Also, the size is a little larger than
+%\setfont\ssecsl\slshape{10}{1315} % being scaled magstep1.
+%\setfont\ssectt\ttshape{10}{1315}
+%\setfont\ssecsf\sfshape{10}{1315}
+
+%\let\ssecbf=\ssecrm
+
+% 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}{\magstep1}
+\setfont\ssecsf\sfbshape{12}{\magstephalf}
+\let\ssecbf\ssecrm
+\setfont\ssecsc\scbshape{10}{\magstep1}
+\font\sseci=cmmi12 scaled \magstephalf
+\font\ssecsy=cmsy10 scaled \magstep1
+% The smallcaps and symbol fonts should actually be scaled \magstep1.5,
+% but that is not a standard magnification.
+
+% Fonts for title page:
+\setfont\titlerm\rmbshape{12}{\magstep3}
+\let\authorrm = \secrm
+
+% 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, 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}
+\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\indexfonts{%
+ \let\tenrm=\indrm \let\tenit=\indit \let\tensl=\indsl
+ \let\tenbf=\indbf \let\tentt=\indtt \let\smallcaps=\indsc
+ \let\tensf=\indsf \let\teni=\indi \let\tensy=\indsy \let\tenttsl=\indttsl
+ \resetmathfonts \setleading{12pt}}
+
+% Set up the default fonts, so we can use them for creating boxes.
+%
+\textfonts
+
+% 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}
+
+%% 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\smartitalic#1{{\sl #1}\futurelet\next\smartitalicx}
+
+\let\i=\smartitalic
+\let\var=\smartitalic
+\let\dfn=\smartitalic
+\let\emph=\smartitalic
+\let\cite=\smartitalic
+
+\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 = `- }
+
+\def\t#1{%
+ {\tt \rawbackslash \frenchspacing #1}%
+ \null
+}
+\let\ttfont=\t
+\def\samp #1{`\tclose{#1}'\null}
+\setfont\smallrm\rmshape{8}{1000}
+\font\smallsy=cmsy9
+\def\key#1{{\smallrm\textfont2=\smallsy \leavevmode\hbox{%
+ \raise0.4pt\hbox{$\langle$}\kern-.08em\vtop{%
+ \vbox{\hrule\kern-0.4pt
+ \hbox{\raise0.4pt\hbox{\vphantom{$\langle$}}#1}}%
+ \kern-0.4pt\hrule}%
+ \kern-.06em\raise0.4pt\hbox{$\rangle$}}}}
+% The old definition, with no lozenge:
+%\def\key #1{{\ttsl \nohyphenation \uppercase{#1}}\null}
+\def\ctrl #1{{\tt \rawbackslash \hat}#1}
+
+\let\file=\samp
+\let\url=\samp % perhaps include a hypertex \special eventually
+\def\email#1{$\langle${\tt #1}$\rangle$}
+
+% @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}
+% The following is used by \doprintindex to insure that long function names
+% wrap around. It is necessary for - and _ to be active before the index is
+% read from the file, as \entry parses the arguments long before \code is
+% ever called. -- mycroft
+\global\def\indexbreaks{\catcode`\-=\active \let-\realdash \catcode`\_=\active \let_\realunder}
+}
+
+\def\realdash{-}
+\def\realunder{_}
+\def\codedash{-\discretionary{}{}{}}
+\def\codeunder{\normalunderscore\discretionary{}{}{}}
+\def\codex #1{\tclose{#1}\endgroup}
+
+%\let\exp=\tclose %Was temporary
+
+% @kbd is like @code, except that if the argument is just one @key command,
+% then @kbd has no effect.
+%
+\def\xkey{\key}
+\def\kbdfoo#1#2#3\par{\def\one{#1}\def\three{#3}\def\threex{??}%
+\ifx\one\xkey\ifx\threex\three \key{#2}%
+\else{\tclose{\ttsl\look}}\fi
+\else{\tclose{\ttsl\look}}\fi}
+
+% Check if we are currently using a typewriter font. Since all the
+% Computer Modern typewriter fonts have zero interword stretch (and
+% shrink), and it is reasonable to expect all typewriter fonts to have
+% this property, we can check that font parameter.
+%
+\def\ifmonospace{\ifdim\fontdimen3\font=0pt }
+
+% Typeset a dimension, e.g., `in' or `pt'. The only reason for the
+% 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}
+
+\def\r#1{{\rm #1}} % roman font
+% Use of \lowercase was suggested.
+\def\sc#1{{\smallcaps#1}} % smallcaps font
+\def\ii#1{{\it #1}} % italic font
+
+% @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.
+\def\titlefont#1{{\titlerm #1}}
+
+\newif\ifseenauthor
+\newif\iffinishedtitlepage
+
+\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
+% I deinstalled the following change because \cmr12 is undefined.
+% This change was not in the ChangeLog anyway. --rms.
+% \let\subtitlerm=\cmr12
+ \def\subtitlefont{\subtitlerm \normalbaselineskip = 13pt \normalbaselines}%
+ %
+ \def\authorfont{\authorrm \normalbaselineskip = 16pt \normalbaselines}%
+ %
+ % 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{\titlefont{##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
+ \HEADINGSon
+}
+
+\def\finishtitlepage{%
+ \vskip4pt \hrule height 2pt width \hsize
+ \vskip\titlepagebottomglue
+ \finishedtitlepagetrue
+}
+
+%%% Set up page headings and footings.
+
+\let\thispage=\folio
+
+\newtoks \evenheadline % Token sequence for heading line of even pages
+\newtoks \oddheadline % Token sequence for heading line of odd pages
+\newtoks \evenfootline % Token sequence for footing line of even pages
+\newtoks \oddfootline % Token sequence for footing line of 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{\everyheadingyyy #1@|@|@|@|\finish}
+\gdef\everyheadingyyy #1@|#2@|#3@|#4\finish{%
+\global\evenheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}
+\global\oddheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}}
+
+\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}}}
+
+\gdef\everyfootingxxx #1{\everyfootingyyy #1@|@|@|@|\finish}
+\gdef\everyfootingyyy #1@|#2@|#3@|#4\finish{%
+\global\evenfootline={\rlap{\centerline{#2}}\line{#1\hfil#3}}
+\global\oddfootline={\rlap{\centerline{#2}}\line{#1\hfil#3}}}
+%
+}% 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
+% Produces Day Month Year style of output.
+\def\today{\number\day\space
+\ifcase\month\or
+January\or February\or March\or April\or May\or June\or
+July\or August\or September\or October\or November\or December\fi
+\space\number\year}
+
+% Use this if you want the Month Day, Year style of output.
+%\def\today{\ifcase\month\or
+%January\or February\or March\or April\or May\or June\or
+%July\or August\or September\or October\or November\or December\fi
+%\space\number\day, \number\year}
+
+% @settitle line... specifies the title of the document, for headings
+% It generates no output of its own
+
+\def\thistitle{No Title}
+\def\settitle{\parsearg\settitlezzz}
+\def\settitlezzz #1{\gdef\thistitle{#1}}
+
+
+\message{tables,}
+
+% @tabs -- simple alignment
+
+% These don't work. For one thing, \+ is defined as outer.
+% So these macros cannot even be defined.
+
+%\def\tabs{\parsearg\tabszzz}
+%\def\tabszzz #1{\settabs\+#1\cr}
+%\def\tabline{\parsearg\tablinezzz}
+%\def\tablinezzz #1{\+#1\cr}
+%\def\&{&}
+
+% 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.
+ %
+ % Be sure we are not still in the middle of a paragraph.
+ %{\parskip = 0in
+ %\par
+ %}%
+ %
+ % 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.
+ \nobreak
+ \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. Since that
+ % text will be indented by \tableindent, we make the item text be in
+ % a zero-width box.
+ \noindent
+ \rlap{\hskip -\tableindent\box0}\ignorespaces%
+ \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}{}{}{}{}}
+
+\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 itemsize
+ \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}
+
+% Set sfcode to normal for the chars that usually have another value.
+% These are `.?!:;,'
+\def\frenchspacing{\sfcode46=1000 \sfcode63=1000 \sfcode33=1000
+ \sfcode58=1000 \sfcode59=1000 \sfcode44=1000 }
+
+% \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.
+
+%%%%
+% Dimensions
+
+\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
+
+%% 2/1/96, to allow fractions to be given with more than one digit.
+\def\pickupwholefraction#1 {\global\advance\colcount by1 %
+\expandafter\xdef\csname col\the\colcount\endcsname{.#1\hsize}%
+\setuptable}
+
+\newcount\colcount
+\def\setuptable#1{\def\firstarg{#1}%
+\ifx\firstarg\xendsetuptable\let\go\relax%
+\else
+ \ifx\firstarg\xcolumnfractions\global\setpercenttrue%
+ \else
+ \ifsetpercent
+ \let\go\pickupwholefraction % In this case arg of setuptable
+ % is the decimal point before the
+ % number given in percent of hsize.
+ % We don't need this so we don't use it.
+ \else
+ \global\advance\colcount by1
+ \setbox0=\hbox{#1 }% 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\else\let\go\setuptable\fi%
+\fi\go}
+
+%%%%
+% multitable syntax
+\def\tab{&\hskip1sp\relax} % 2/2/96
+ % tiny skip here makes sure this column space is
+ % maintained, even if it is never used.
+
+
+%%%%
+% @multitable ... @end multitable definitions:
+
+\def\multitable{\parsearg\dotable}
+
+\def\dotable#1{\bgroup
+\let\item\cr
+\tolerance=9500
+\hbadness=9500
+\setmultitablespacing
+\parskip=\multitableparskip
+\parindent=\multitableparindent
+\overfullrule=0pt
+\global\colcount=0\relax%
+\def\Emultitable{\global\setpercentfalse\global\everycr{}\cr\egroup\egroup}%
+ % To parse everything between @multitable and @item :
+\setuptable#1 \endsetuptable
+ % Need to reset this to 0 after \setuptable.
+\global\colcount=0\relax%
+ %
+ % 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 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.
+\ifnum\colcount=1
+\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
+\noindent##\multistrut}\cr%
+ % \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.
+\global\everycr{\noalign{%
+\filbreak%% keeps underfull box messages off when table breaks over pages.
+\global\colcount=0\relax}}
+}
+
+\def\setmultitablespacing{% test to see if user has set \multitablelinespace.
+% If so, do nothing. If not, give it an appropriate dimension based on
+% current baselineskip.
+\ifdim\multitablelinespace=0pt
+%% strut to put in table in case some entry doesn't have descenders,
+%% to keep lines equally spaced
+\let\multistrut = \strut
+%% Test to see if parskip is larger than space between lines of
+%% table. If not, do nothing.
+%% If so, set to same dimension as multitablelinespace.
+\else
+\gdef\multistrut{\vrule height\multitablelinespace depth\dp0
+width0pt\relax} \fi
+\ifdim\multitableparskip>\multitablelinespace
+\global\multitableparskip=\multitablelinespace
+\global\advance\multitableparskip-7pt %% to keep parskip somewhat smaller
+ %% than skip between lines in the table.
+\fi%
+\ifdim\multitableparskip=0pt
+\global\multitableparskip=\multitablelinespace
+\global\advance\multitableparskip-7pt %% to keep parskip somewhat smaller
+ %% than skip between lines in the table.
+\fi}
+
+
+\message{indexing,}
+% Index generation facilities
+
+% 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{
+\expandafter\newwrite \csname#1indfile\endcsname% Define number for output file
+\openout \csname#1indfile\endcsname \jobname.#1 % Open the file
+\expandafter\xdef\csname#1index\endcsname{% % Define \xxxindex
+\noexpand\doindex {#1}}
+}
+
+% @defindex foo == \newindex{foo}
+
+\def\defindex{\parsearg\newindex}
+
+% Define @defcodeindex, like @defindex except put all entries in @code.
+
+\def\newcodeindex #1{
+\expandafter\newwrite \csname#1indfile\endcsname% Define number for output file
+\openout \csname#1indfile\endcsname \jobname.#1 % Open the file
+\expandafter\xdef\csname#1index\endcsname{% % Define \xxxindex
+\noexpand\docodeindex {#1}}
+}
+
+\def\defcodeindex{\parsearg\newcodeindex}
+
+% @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.
+\def\synindex #1 #2 {%
+\expandafter\let\expandafter\synindexfoo\expandafter=\csname#2indfile\endcsname
+\expandafter\let\csname#1indfile\endcsname=\synindexfoo
+\expandafter\xdef\csname#1index\endcsname{% % Define \xxxindex
+\noexpand\doindex {#2}}%
+}
+
+% @syncodeindex foo bar similar, but put all entries made for index foo
+% inside @code.
+\def\syncodeindex #1 #2 {%
+\expandafter\let\expandafter\synindexfoo\expandafter=\csname#2indfile\endcsname
+\expandafter\let\csname#1indfile\endcsname=\synindexfoo
+\expandafter\xdef\csname#1index\endcsname{% % Define \xxxindex
+\noexpand\docodeindex {#2}}%
+}
+
+% 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}}}
+
+\def\indexdummies{%
+% Take care of the plain tex accent commands.
+\def\"{\realbackslash "}%
+\def\`{\realbackslash `}%
+\def\'{\realbackslash '}%
+\def\^{\realbackslash ^}%
+\def\~{\realbackslash ~}%
+\def\={\realbackslash =}%
+\def\b{\realbackslash b}%
+\def\c{\realbackslash c}%
+\def\d{\realbackslash d}%
+\def\u{\realbackslash u}%
+\def\v{\realbackslash v}%
+\def\H{\realbackslash H}%
+% Take care of the plain tex special European modified letters.
+\def\oe{\realbackslash oe}%
+\def\ae{\realbackslash ae}%
+\def\aa{\realbackslash aa}%
+\def\OE{\realbackslash OE}%
+\def\AE{\realbackslash AE}%
+\def\AA{\realbackslash AA}%
+\def\o{\realbackslash o}%
+\def\O{\realbackslash O}%
+\def\l{\realbackslash l}%
+\def\L{\realbackslash L}%
+\def\ss{\realbackslash ss}%
+% Take care of texinfo commands likely to appear in an index entry.
+% (Must be a way to avoid doing expansion at all, and thus not have to
+% laboriously list every single command here.)
+\def\@{@}% will be @@ when we switch to @ as escape char.
+%\let\{ = \lbracecmd
+%\let\} = \rbracecmd
+\def\_{{\realbackslash _}}%
+\def\w{\realbackslash w }%
+\def\bf{\realbackslash bf }%
+%\def\rm{\realbackslash rm }%
+\def\sl{\realbackslash sl }%
+\def\sf{\realbackslash sf}%
+\def\tt{\realbackslash tt}%
+\def\gtr{\realbackslash gtr}%
+\def\less{\realbackslash less}%
+\def\hat{\realbackslash hat}%
+%\def\char{\realbackslash char}%
+\def\TeX{\realbackslash TeX}%
+\def\dots{\realbackslash dots }%
+\def\copyright{\realbackslash copyright }%
+\def\tclose##1{\realbackslash tclose {##1}}%
+\def\code##1{\realbackslash code {##1}}%
+\def\dotless##1{\realbackslash dotless {##1}}%
+\def\samp##1{\realbackslash samp {##1}}%
+\def\,##1{\realbackslash ,{##1}}%
+\def\t##1{\realbackslash t {##1}}%
+\def\r##1{\realbackslash r {##1}}%
+\def\i##1{\realbackslash i {##1}}%
+\def\b##1{\realbackslash b {##1}}%
+\def\cite##1{\realbackslash cite {##1}}%
+\def\key##1{\realbackslash key {##1}}%
+\def\file##1{\realbackslash file {##1}}%
+\def\var##1{\realbackslash var {##1}}%
+\def\kbd##1{\realbackslash kbd {##1}}%
+\def\dfn##1{\realbackslash dfn {##1}}%
+\def\emph##1{\realbackslash emph {##1}}%
+\unsepspaces
+}
+
+% 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 no-ops all font-change commands.
+% This is used when outputting the strings to sort the index by.
+\def\indexdummyfont#1{#1}
+\def\indexdummytex{TeX}
+\def\indexdummydots{...}
+
+\def\indexnofonts{%
+% Just ignore accents.
+\let\,=\indexdummyfont
+\let\"=\indexdummyfont
+\let\`=\indexdummyfont
+\let\'=\indexdummyfont
+\let\^=\indexdummyfont
+\let\~=\indexdummyfont
+\let\==\indexdummyfont
+\let\b=\indexdummyfont
+\let\c=\indexdummyfont
+\let\d=\indexdummyfont
+\let\u=\indexdummyfont
+\let\v=\indexdummyfont
+\let\H=\indexdummyfont
+\let\dotless=\indexdummyfont
+% Take care of the plain tex special European modified letters.
+\def\oe{oe}%
+\def\ae{ae}%
+\def\aa{aa}%
+\def\OE{OE}%
+\def\AE{AE}%
+\def\AA{AA}%
+\def\o{o}%
+\def\O{O}%
+\def\l{l}%
+\def\L{L}%
+\def\ss{ss}%
+\let\w=\indexdummyfont
+\let\t=\indexdummyfont
+\let\r=\indexdummyfont
+\let\i=\indexdummyfont
+\let\b=\indexdummyfont
+\let\emph=\indexdummyfont
+\let\strong=\indexdummyfont
+\let\cite=\indexdummyfont
+\let\sc=\indexdummyfont
+%Don't no-op \tt, since it isn't a user-level command
+% and is used in the definitions of the active chars like <, >, |...
+%\let\tt=\indexdummyfont
+\let\tclose=\indexdummyfont
+\let\code=\indexdummyfont
+\let\file=\indexdummyfont
+\let\samp=\indexdummyfont
+\let\kbd=\indexdummyfont
+\let\key=\indexdummyfont
+\let\var=\indexdummyfont
+\let\TeX=\indexdummytex
+\let\dots=\indexdummydots
+\def\@{@}%
+}
+
+% To define \realbackslash, we must make \ not be an escape.
+% We must first make another character (@) an escape
+% so we do not become unable to do a definition.
+
+{\catcode`\@=0 \catcode`\\=\other
+@gdef@realbackslash{\}}
+
+\let\indexbackslash=0 %overridden during \printindex.
+
+\let\SETmarginindex=\relax %initialize!
+% workhorse for all \fooindexes
+% #1 is name of index, #2 is stuff to put there
+\def\doind #1#2{%
+ % 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.
+ %
+ % First process the index-string with all font commands turned off
+ % to get the string to sort by.
+ {\indexnofonts \xdef\indexsorttmp{#2}}%
+ %
+ % Now produce the complete index entry, with both the sort key and the
+ % original text, including any font commands.
+ \toks0 = {#2}%
+ \edef\temp{%
+ \write\csname#1indfile\endcsname{%
+ \realbackslash entry{\indexsorttmp}{\folio}{\the\toks0}}%
+ }%
+ \temp
+ }%
+ }%
+ \penalty\count255
+ }%
+}
+
+\def\dosubind #1#2#3{%
+{\count10=\lastpenalty %
+{\indexdummies % Must do this here, since \bf, etc expand at this stage
+\escapechar=`\\%
+{\let\folio=0%
+\def\rawbackslashxx{\indexbackslash}%
+%
+% Now process the index-string once, with all font commands turned off,
+% to get the string to sort the index by.
+{\indexnofonts
+\xdef\temp1{#2 #3}%
+}%
+% Now produce the complete index entry. We process the index-string again,
+% this time with font commands expanded, to get what to print in the index.
+\edef\temp{%
+\write \csname#1indfile\endcsname{%
+\realbackslash entry {\temp1}{\folio}{#2}{#3}}}%
+\temp }%
+}\penalty\count10}}
+
+% 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.
+
+% This is what you call to cause a particular index to get printed.
+% Write
+% @unnumbered Function Index
+% @printindex fn
+
+\def\printindex{\parsearg\doprintindex}
+
+\def\doprintindex#1{\begingroup
+ \dobreak \chapheadingskip{10000}%
+ %
+ \indexfonts \rm
+ \tolerance = 9500
+ \indexbreaks
+ \def\indexbackslash{\rawbackslashxx}%
+ % 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.
+ \catcode`\\ = 0
+ \catcode`\@ = 11
+ \escapechar = `\\
+ \begindoublecolumns
+ %
+ % See if the index file exists and is nonempty.
+ \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.
+ (Index is nonexistent)
+ \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
+ (Index is empty)
+ \else
+ \input \jobname.#1s
+ \fi
+ \fi
+ \closein 1
+ \enddoublecolumns
+\endgroup}
+
+% These macros are used by the sorted index file itself.
+% Change them to control the appearance of the index.
+
+% Same as \bigskipamount except no shrink.
+% \balancecolumns gets confused if there is any shrink.
+\newskip\initialskipamount \initialskipamount 12pt plus4pt
+
+\def\initial #1{%
+{\let\tentt=\sectt \let\tt=\sectt \let\sf=\sectt
+\ifdim\lastskip<\initialskipamount
+\removelastskip \penalty-200 \vskip \initialskipamount\fi
+\line{\secbf#1\hfill}\kern 2pt\penalty10000}}
+
+% 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
+ %
+ % 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.
+ \ #2% The page number ends the paragraph.
+ \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 #2\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 = {\global\setbox\partialpage
+ =\vbox{\unvbox255\kern -\topskip \kern \baselineskip}}%
+ \eject
+ %
+ % Now switch to the double-column output routine.
+ \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 once.
+ %
+ % 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
+}
+\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@=\pageheight \advance\dimen@ by-\ht\partialpage
+ % box0 will be the left-hand column, box1 the right.
+ \setbox0=\vsplit255 to\dimen@ \setbox2=\vsplit255 to\dimen@
+ \onepageout\pagesofar
+ \unvbox255 \penalty\outputpenalty
+}
+\def\pagesofar{%
+ % The contents of the output page -- any previous material,
+ % followed by the two boxes we just split.
+ \unvbox\partialpage
+ \hsize = \doublecolumnhsize
+ \wd0=\hsize \wd2=\hsize \hbox to\pagewidth{\box0\hfil\box2}%
+}
+\def\enddoublecolumns{%
+ \output={\balancecolumns}\eject % split what we have
+ \endgroup
+ % Back to normal single-column typesetting, but take account of the
+ % fact that we just accumulated some stuff on the output page.
+ \pagegoal=\vsize
+}
+\def\balancecolumns{%
+ % Called on the last page of the double column material.
+ \setbox0=\vbox{\unvbox255}%
+ \dimen@ = \ht0
+ \advance\dimen@ by \topskip
+ \advance\dimen@ by-\baselineskip
+ \divide\dimen@ by 2
+ \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@ by1pt \repeat}%
+ \setbox0=\vbox to\dimen@{\unvbox1}%
+ \setbox2=\vbox to\dimen@{\unvbox3}%
+ \pagesofar
+}
+\catcode `\@=\other
+
+
+\message{sectioning,}
+% Define 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}
+
+\newwrite \contentsfile
+% This is called from \setfilename.
+\def\opencontents{\openout \contentsfile = \jobname.toc}
+
+% Each @chapter defines this as the name of the chapter.
+% page headings and footings can use it. @section does likewise
+
+\def\thischapter{} \def\thissection{}
+\def\seccheck#1{\if \pageno<0 %
+\errmessage{@#1 not allowed after generating table of contents}\fi
+%
+}
+
+\def\chapternofonts{%
+\let\rawbackslash=\relax%
+\let\frenchspacing=\relax%
+\def\result{\realbackslash result}
+\def\equiv{\realbackslash equiv}
+\def\expansion{\realbackslash expansion}
+\def\print{\realbackslash print}
+\def\TeX{\realbackslash TeX}
+\def\dots{\realbackslash dots}
+\def\copyright{\realbackslash copyright}
+\def\tt{\realbackslash tt}
+\def\bf{\realbackslash bf }
+\def\w{\realbackslash w}
+\def\less{\realbackslash less}
+\def\gtr{\realbackslash gtr}
+\def\hat{\realbackslash hat}
+\def\char{\realbackslash char}
+\def\tclose##1{\realbackslash tclose {##1}}
+\def\code##1{\realbackslash code {##1}}
+\def\samp##1{\realbackslash samp {##1}}
+\def\r##1{\realbackslash r {##1}}
+\def\b##1{\realbackslash b {##1}}
+\def\key##1{\realbackslash key {##1}}
+\def\file##1{\realbackslash file {##1}}
+\def\kbd##1{\realbackslash kbd {##1}}
+% These are redefined because @smartitalic wouldn't work inside xdef.
+\def\i##1{\realbackslash i {##1}}
+\def\cite##1{\realbackslash cite {##1}}
+\def\var##1{\realbackslash var {##1}}
+\def\emph##1{\realbackslash emph {##1}}
+\def\dfn##1{\realbackslash dfn {##1}}
+}
+
+\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
+}
+
+
+\def\thischaptername{No Chapter Title}
+\outer\def\chapter{\parsearg\chapteryyy}
+\def\chapteryyy #1{\numhead0{#1}} % normally numhead0 calls chapterzzz
+\def\chapterzzz #1{\seccheck{chapter}%
+\secno=0 \subsecno=0 \subsubsecno=0
+\global\advance \chapno by 1 \message{\putwordChapter \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}%
+{\chapternofonts%
+\edef\temp{{\realbackslash chapentry {#1}{\the\chapno}{\noexpand\folio}}}%
+\escapechar=`\\%
+\write \contentsfile \temp %
+\donoderef %
+\global\let\section = \numberedsec
+\global\let\subsection = \numberedsubsec
+\global\let\subsubsection = \numberedsubsubsec
+}}
+
+\outer\def\appendix{\parsearg\appendixyyy}
+\def\appendixyyy #1{\apphead0{#1}} % normally apphead0 calls appendixzzz
+\def\appendixzzz #1{\seccheck{appendix}%
+\secno=0 \subsecno=0 \subsubsecno=0
+\global\advance \appendixno by 1 \message{Appendix \appendixletter}%
+\chapmacro {#1}{\putwordAppendix{} \appendixletter}%
+\gdef\thissection{#1}%
+\gdef\thischaptername{#1}%
+\xdef\thischapter{\putwordAppendix{} \appendixletter: \noexpand\thischaptername}%
+{\chapternofonts%
+\edef\temp{{\realbackslash chapentry
+ {#1}{\putwordAppendix{} \appendixletter}{\noexpand\folio}}}%
+\escapechar=`\\%
+\write \contentsfile \temp %
+\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}}}
+
+\outer\def\top{\parsearg\unnumberedyyy}
+\outer\def\unnumbered{\parsearg\unnumberedyyy}
+\def\unnumberedyyy #1{\unnmhead0{#1}} % normally unnmhead0 calls unnumberedzzz
+\def\unnumberedzzz #1{\seccheck{unnumbered}%
+\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 the <toks register>.
+\toks0 = {#1}\message{(\the\toks0)}%
+%
+\unnumbchapmacro {#1}%
+\gdef\thischapter{#1}\gdef\thissection{#1}%
+{\chapternofonts%
+\edef\temp{{\realbackslash unnumbchapentry {#1}{\noexpand\folio}}}%
+\escapechar=`\\%
+\write \contentsfile \temp %
+\unnumbnoderef %
+\global\let\section = \unnumberedsec
+\global\let\subsection = \unnumberedsubsec
+\global\let\subsubsection = \unnumberedsubsubsec
+}}
+
+\outer\def\numberedsec{\parsearg\secyyy}
+\def\secyyy #1{\numhead1{#1}} % normally calls seczzz
+\def\seczzz #1{\seccheck{section}%
+\subsecno=0 \subsubsecno=0 \global\advance \secno by 1 %
+\gdef\thissection{#1}\secheading {#1}{\the\chapno}{\the\secno}%
+{\chapternofonts%
+\edef\temp{{\realbackslash secentry %
+{#1}{\the\chapno}{\the\secno}{\noexpand\folio}}}%
+\escapechar=`\\%
+\write \contentsfile \temp %
+\donoderef %
+\penalty 10000 %
+}}
+
+\outer\def\appendixsection{\parsearg\appendixsecyyy}
+\outer\def\appendixsec{\parsearg\appendixsecyyy}
+\def\appendixsecyyy #1{\apphead1{#1}} % normally calls appendixsectionzzz
+\def\appendixsectionzzz #1{\seccheck{appendixsection}%
+\subsecno=0 \subsubsecno=0 \global\advance \secno by 1 %
+\gdef\thissection{#1}\secheading {#1}{\appendixletter}{\the\secno}%
+{\chapternofonts%
+\edef\temp{{\realbackslash secentry %
+{#1}{\appendixletter}{\the\secno}{\noexpand\folio}}}%
+\escapechar=`\\%
+\write \contentsfile \temp %
+\appendixnoderef %
+\penalty 10000 %
+}}
+
+\outer\def\unnumberedsec{\parsearg\unnumberedsecyyy}
+\def\unnumberedsecyyy #1{\unnmhead1{#1}} % normally calls unnumberedseczzz
+\def\unnumberedseczzz #1{\seccheck{unnumberedsec}%
+\plainsecheading {#1}\gdef\thissection{#1}%
+{\chapternofonts%
+\edef\temp{{\realbackslash unnumbsecentry{#1}{\noexpand\folio}}}%
+\escapechar=`\\%
+\write \contentsfile \temp %
+\unnumbnoderef %
+\penalty 10000 %
+}}
+
+\outer\def\numberedsubsec{\parsearg\numberedsubsecyyy}
+\def\numberedsubsecyyy #1{\numhead2{#1}} % normally calls numberedsubseczzz
+\def\numberedsubseczzz #1{\seccheck{subsection}%
+\gdef\thissection{#1}\subsubsecno=0 \global\advance \subsecno by 1 %
+\subsecheading {#1}{\the\chapno}{\the\secno}{\the\subsecno}%
+{\chapternofonts%
+\edef\temp{{\realbackslash subsecentry %
+{#1}{\the\chapno}{\the\secno}{\the\subsecno}{\noexpand\folio}}}%
+\escapechar=`\\%
+\write \contentsfile \temp %
+\donoderef %
+\penalty 10000 %
+}}
+
+\outer\def\appendixsubsec{\parsearg\appendixsubsecyyy}
+\def\appendixsubsecyyy #1{\apphead2{#1}} % normally calls appendixsubseczzz
+\def\appendixsubseczzz #1{\seccheck{appendixsubsec}%
+\gdef\thissection{#1}\subsubsecno=0 \global\advance \subsecno by 1 %
+\subsecheading {#1}{\appendixletter}{\the\secno}{\the\subsecno}%
+{\chapternofonts%
+\edef\temp{{\realbackslash subsecentry %
+{#1}{\appendixletter}{\the\secno}{\the\subsecno}{\noexpand\folio}}}%
+\escapechar=`\\%
+\write \contentsfile \temp %
+\appendixnoderef %
+\penalty 10000 %
+}}
+
+\outer\def\unnumberedsubsec{\parsearg\unnumberedsubsecyyy}
+\def\unnumberedsubsecyyy #1{\unnmhead2{#1}} %normally calls unnumberedsubseczzz
+\def\unnumberedsubseczzz #1{\seccheck{unnumberedsubsec}%
+\plainsubsecheading {#1}\gdef\thissection{#1}%
+{\chapternofonts%
+\edef\temp{{\realbackslash unnumbsubsecentry{#1}{\noexpand\folio}}}%
+\escapechar=`\\%
+\write \contentsfile \temp %
+\unnumbnoderef %
+\penalty 10000 %
+}}
+
+\outer\def\numberedsubsubsec{\parsearg\numberedsubsubsecyyy}
+\def\numberedsubsubsecyyy #1{\numhead3{#1}} % normally numberedsubsubseczzz
+\def\numberedsubsubseczzz #1{\seccheck{subsubsection}%
+\gdef\thissection{#1}\global\advance \subsubsecno by 1 %
+\subsubsecheading {#1}
+ {\the\chapno}{\the\secno}{\the\subsecno}{\the\subsubsecno}%
+{\chapternofonts%
+\edef\temp{{\realbackslash subsubsecentry %
+ {#1}
+ {\the\chapno}{\the\secno}{\the\subsecno}{\the\subsubsecno}
+ {\noexpand\folio}}}%
+\escapechar=`\\%
+\write \contentsfile \temp %
+\donoderef %
+\penalty 10000 %
+}}
+
+\outer\def\appendixsubsubsec{\parsearg\appendixsubsubsecyyy}
+\def\appendixsubsubsecyyy #1{\apphead3{#1}} % normally appendixsubsubseczzz
+\def\appendixsubsubseczzz #1{\seccheck{appendixsubsubsec}%
+\gdef\thissection{#1}\global\advance \subsubsecno by 1 %
+\subsubsecheading {#1}
+ {\appendixletter}{\the\secno}{\the\subsecno}{\the\subsubsecno}%
+{\chapternofonts%
+\edef\temp{{\realbackslash subsubsecentry{#1}%
+ {\appendixletter}
+ {\the\secno}{\the\subsecno}{\the\subsubsecno}{\noexpand\folio}}}%
+\escapechar=`\\%
+\write \contentsfile \temp %
+\appendixnoderef %
+\penalty 10000 %
+}}
+
+\outer\def\unnumberedsubsubsec{\parsearg\unnumberedsubsubsecyyy}
+\def\unnumberedsubsubsecyyy #1{\unnmhead3{#1}} %normally unnumberedsubsubseczzz
+\def\unnumberedsubsubseczzz #1{\seccheck{unnumberedsubsubsec}%
+\plainsubsubsecheading {#1}\gdef\thissection{#1}%
+{\chapternofonts%
+\edef\temp{{\realbackslash unnumbsubsubsecentry{#1}{\noexpand\folio}}}%
+\escapechar=`\\%
+\write \contentsfile \temp %
+\unnumbnoderef %
+\penalty 10000 %
+}}
+
+% 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\penalty 10000 %
+}
+
+\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\penalty 10000 %
+}
+
+\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}%
+ }%
+ \ifdim\parskip<10pt \nobreak\kern10pt\nobreak\kern-\parskip\fi \nobreak
+}
+
+
+\message{toc printing,}
+% Finish up the main text and prepare to read what we've written
+% to \contentsfile.
+
+\newskip\contentsrightmargin \contentsrightmargin=1in
+\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 \contentsfile
+ \ifnum \pageno>0
+ \pageno = -1 % Request roman numbered pages.
+ \fi
+ % Don't need to put `Contents' or `Short Contents' in the headline.
+ % It is abundantly clear what they are.
+ \unnumbchapmacro{#1}\def\thischapter{}%
+ \begingroup % Set up to handle contents files properly.
+ \catcode`\\=0 \catcode`\{=1 \catcode`\}=2 \catcode`\@=11
+ \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.
+}
+
+
+% Normal (long) toc.
+\outer\def\contents{%
+ \startcontents{\putwordTableofContents}%
+ \input \jobname.toc
+ \endgroup
+ \vfill \eject
+}
+
+% And just the chapters.
+\outer\def\summarycontents{%
+ \startcontents{\putwordShortContents}%
+ %
+ \let\chapentry = \shortchapentry
+ \let\unnumbchapentry = \shortunnumberedentry
+ % We want a true roman here for the page numbers.
+ \secfonts
+ \let\rm=\shortcontrm \let\bf=\shortcontbf \let\sl=\shortcontsl
+ \rm
+ \hyphenpenalty = 10000
+ \advance\baselineskip by 1pt % Open it up a little.
+ \def\secentry ##1##2##3##4{}
+ \def\unnumbsecentry ##1##2{}
+ \def\subsecentry ##1##2##3##4##5{}
+ \def\unnumbsubsecentry ##1##2{}
+ \def\subsubsecentry ##1##2##3##4##5##6{}
+ \def\unnumbsubsubsecentry ##1##2{}
+ \input \jobname.toc
+ \endgroup
+ \vfill \eject
+}
+\let\shortcontents = \summarycontents
+
+% 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, ...
+
+% Chapter-level things, for both the long and short contents.
+\def\chapentry#1#2#3{\dochapentry{#2\labelspace#1}{#3}}
+
+% See comments in \dochapentry re vbox and related settings
+\def\shortchapentry#1#2#3{%
+ \tocentry{\shortchaplabel{#2}\labelspace #1}{\doshortpageno{#3}}%
+}
+
+% 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.
+\setbox0 = \hbox{\shortcontrm \putwordAppendix }
+\newdimen\shortappendixwidth \shortappendixwidth = \wd0
+
+\def\shortchaplabel#1{%
+ % We typeset #1 in a box of constant width, regardless of the text of
+ % #1, so the chapter titles will come out aligned.
+ \setbox0 = \hbox{#1}%
+ \dimen0 = \ifdim\wd0 > \shortappendixwidth \shortappendixwidth \else 0pt \fi
+ %
+ % This space should be plenty, since a single number is .5em, and the
+ % widest letter (M) is 1em, at least in the Computer Modern fonts.
+ % (This space doesn't include the extra space that gets added after
+ % the label; that gets put in by \shortchapentry above.)
+ \advance\dimen0 by 1.1em
+ \hbox to \dimen0{#1\hfil}%
+}
+
+\def\unnumbchapentry#1#2{\dochapentry{#1}{#2}}
+\def\shortunnumberedentry#1#2{\tocentry{#1}{\doshortpageno{#2}}}
+
+% Sections.
+\def\secentry#1#2#3#4{\dosecentry{#2.#3\labelspace#1}{#4}}
+\def\unnumbsecentry#1#2{\dosecentry{#1}{#2}}
+
+% Subsections.
+\def\subsecentry#1#2#3#4#5{\dosubsecentry{#2.#3.#4\labelspace#1}{#5}}
+\def\unnumbsubsecentry#1#2{\dosubsecentry{#1}{#2}}
+
+% And subsubsections.
+\def\subsubsecentry#1#2#3#4#5#6{%
+ \dosubsubsecentry{#2.#3.#4.#5\labelspace#1}{#6}}
+\def\unnumbsubsubsecentry#1#2{\dosubsubsecentry{#1}{#2}}
+
+% 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{#2}}%
+ \endgroup
+ \nobreak\vskip .25\baselineskip plus.1\baselineskip
+}
+
+\def\dosecentry#1#2{\begingroup
+ \secentryfonts \leftskip=\tocindent
+ \tocentry{#1}{\dopageno{#2}}%
+\endgroup}
+
+\def\dosubsecentry#1#2{\begingroup
+ \subsecentryfonts \leftskip=2\tocindent
+ \tocentry{#1}{\dopageno{#2}}%
+\endgroup}
+
+\def\dosubsubsecentry#1#2{\begingroup
+ \subsubsecentryfonts \leftskip=3\tocindent
+ \tocentry{#1}{\dopageno{#2}}%
+\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.)
+%
+% \turnoffactive is for the sake of @" used for umlauts.
+\def\tocentry#1#2{\begingroup
+ \vskip 0pt plus1pt % allow a little stretch for the sake of nice page breaks
+ \entry{\turnoffactive #1}{\turnoffactive #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,}
+
+% 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.
+% Furthermore, these definitions must come after we define our fonts.
+\newbox\dblarrowbox \newbox\longdblarrowbox
+\newbox\pushcharbox \newbox\bullbox
+\newbox\equivbox \newbox\errorbox
+
+%{\tentt
+%\global\setbox\dblarrowbox = \hbox to 1em{\hfil$\Rightarrow$\hfil}
+%\global\setbox\longdblarrowbox = \hbox to 1em{\hfil$\mapsto$\hfil}
+%\global\setbox\pushcharbox = \hbox to 1em{\hfil$\dashv$\hfil}
+%\global\setbox\equivbox = \hbox to 1em{\hfil$\ptexequiv$\hfil}
+% Adapted from the manmac format (p.420 of TeXbook)
+%\global\setbox\bullbox = \hbox to 1em{\kern.15em\vrule height .75ex width .85ex
+% depth .1ex\hfil}
+%}
+
+% @point{}, @result{}, @expansion{}, @print{}, @equiv{}.
+\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}}
+
+% Adapted from the TeXbook's \boxit.
+{\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}
+
+% The @error{} command.
+\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 `\~=13 \let~=\tie
+\catcode `\%=14
+\catcode 43=12 % plus
+\catcode`\"=12
+\catcode`\==12
+\catcode`\|=12
+\catcode`\<=12
+\catcode`\>=12
+\escapechar=`\\
+%
+\let\,=\ptexcomma
+\let\~=\ptextilde
+\let\{=\ptexlbrace
+\let\}=\ptexrbrace
+\let\.=\ptexdot
+\let\*=\ptexstar
+\let\dots=\ptexdots
+\def\endldots{\mathinner{\ldots\ldots\ldots\ldots}}
+\def\enddots{\relax\ifmmode\endldots\else$\mathsurround=0pt \endldots\,$\fi}
+\def\@{@}%
+\let\bullet=\ptexbullet
+\let\b=\ptexb \let\c=\ptexc \let\i=\ptexi \let\t=\ptext
+%
+\let\Etex=\endgroup}
+
+% Define @lisp ... @endlisp.
+% @lisp does a \begingroup so it can rebind things,
+% including the definition of @endlisp (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{{\advance\envskipamount by \parskip
+\endgraf \ifdim\lastskip<\envskipamount
+\removelastskip \penalty-50 \vskip\envskipamount \fi}}
+
+\let\afterenvbreak = \aboveenvbreak
+
+% \nonarrowing is a flag. If "set", @lisp etc don't narrow margins.
+\let\nonarrowing=\relax
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% \cartouche: draw rectangle w/rounded corners around argument
+\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
+
+\long\def\cartouche{%
+\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 18pt % allow for 3pt kerns on either
+% side, and for 6pt waste from
+% each corner char
+ \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.
+ \singlespace
+ \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
+}
+
+% To ending 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}%
+
+% This macro is
+\def\lisp{\begingroup
+ \nonfillstart
+ \let\Elisp = \nonfillfinish
+ \tt
+ \rawbackslash % have \ input char produce \ char from current font
+ \gobble
+}
+
+% Define the \E... control sequence only if we are inside the
+% environment, so the error checking in \end will work.
+%
+% We must call \lisp last in the definition, since it reads the
+% return following the @example (or whatever) command.
+%
+\def\example{\begingroup \def\Eexample{\nonfillfinish\endgroup}\lisp}
+\def\smallexample{\begingroup \def\Esmallexample{\nonfillfinish\endgroup}\lisp}
+\def\smalllisp{\begingroup \def\Esmalllisp{\nonfillfinish\endgroup}\lisp}
+
+% @smallexample and @smalllisp. This is not used unless the @smallbook
+% command is given. Originally contributed by Pavel@xerox.
+%
+\def\smalllispx{\begingroup
+ \nonfillstart
+ \let\Esmalllisp = \nonfillfinish
+ \let\Esmallexample = \nonfillfinish
+ %
+ % Smaller fonts for small examples.
+ \indexfonts \tt
+ \rawbackslash % make \ output the \ character from the current font (tt)
+ \gobble
+}
+
+% This is @display; same as @lisp except use roman font.
+%
+\def\display{\begingroup
+ \nonfillstart
+ \let\Edisplay = \nonfillfinish
+ \gobble
+}
+
+% This is @format; same as @display except don't narrow margins.
+%
+\def\format{\begingroup
+ \let\nonarrowing = t
+ \nonfillstart
+ \let\Eformat = \nonfillfinish
+ \gobble
+}
+
+% @flushleft (same as @format) and @flushright.
+%
+\def\flushleft{\begingroup
+ \let\nonarrowing = t
+ \nonfillstart
+ \let\Eflushleft = \nonfillfinish
+ \gobble
+}
+\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
+ \singlespace
+ \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
+}
+
+\message{defuns,}
+% Define formatter for defuns
+% First, 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\deftypemargin \deftypemargin=12pt
+\newskip\deflastargmargin \deflastargmargin=18pt
+
+\newcount\parencount
+% define \functionparens, which makes ( and ) and & do special things.
+% \functionparens affects the group it is contained in.
+\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`\(}} \def\clnr{{\sf\char`\)}} \def\ampnr{\&}
+\def\lbrb{{\bf\char`\[}} \def\rbrb{{\bf\char`\]}}
+
+% First, defname, which formats the header line itself.
+% #1 should be the function name.
+% #2 should be the type of definition, such as "Function".
+
+\def\defname #1#2{%
+% Get the values of \leftskip and \rightskip as they were
+% outside the @def...
+\dimen2=\leftskip
+\advance\dimen2 by -\defbodyindent
+\dimen3=\rightskip
+\advance\dimen3 by -\defbodyindent
+\noindent %
+\setbox0=\hbox{\hskip \deflastargmargin{\rm #2}\hskip \deftypemargin}%
+\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 %
+% Now output arg 2 ("Function" or some such)
+% ending at \deftypemargin from the right margin,
+% but stuck inside a box of width 0 so it does not interfere with linebreaking
+{% Adjust \hsize to exclude the ambient margins,
+% so that \rightline will obey them.
+\advance \hsize by -\dimen2 \advance \hsize by -\dimen3
+\rlap{\rightline{{\rm #2}\hskip \deftypemargin}}}%
+% Make all lines underfull and no complaints:
+\tolerance=10000 \hbadness=10000
+\advance\leftskip by -\defbodyindent
+\exdentamount=\defbodyindent
+{\df #1}\enskip % Generate function name
+}
+
+% Actually process the body of a definition
+% #1 should be the terminating control sequence, such as \Edefun.
+% #2 should be the "another name" control sequence, such as \defunx.
+% #3 should be the control sequence that actually processes the header,
+% such as \defunheader.
+
+\def\defparsebody #1#2#3{\begingroup\inENV% Environment for definitionbody
+\medbreak %
+% Define the end token that this defining construct specifies
+% so that it will exit this group.
+\def#1{\endgraf\endgroup\medbreak}%
+\def#2{\begingroup\obeylines\activeparens\spacesplit#3}%
+\parindent=0in
+\advance\leftskip by \defbodyindent \advance \rightskip by \defbodyindent
+\exdentamount=\defbodyindent
+\begingroup %
+\catcode 61=\active % 61 is `='
+\obeylines\activeparens\spacesplit#3}
+
+\def\defmethparsebody #1#2#3#4 {\begingroup\inENV %
+\medbreak %
+% Define the end token that this defining construct specifies
+% so that it will exit this group.
+\def#1{\endgraf\endgroup\medbreak}%
+\def#2##1 {\begingroup\obeylines\activeparens\spacesplit{#3{##1}}}%
+\parindent=0in
+\advance\leftskip by \defbodyindent \advance \rightskip by \defbodyindent
+\exdentamount=\defbodyindent
+\begingroup\obeylines\activeparens\spacesplit{#3{#4}}}
+
+\def\defopparsebody #1#2#3#4#5 {\begingroup\inENV %
+\medbreak %
+% Define the end token that this defining construct specifies
+% so that it will exit this group.
+\def#1{\endgraf\endgroup\medbreak}%
+\def#2##1 ##2 {\def#4{##1}%
+\begingroup\obeylines\activeparens\spacesplit{#3{##2}}}%
+\parindent=0in
+\advance\leftskip by \defbodyindent \advance \rightskip by \defbodyindent
+\exdentamount=\defbodyindent
+\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{\begingroup\inENV% Environment for definitionbody
+\medbreak %
+% Define the end token that this defining construct specifies
+% so that it will exit this group.
+\def#1{\endgraf\endgroup\medbreak}%
+\def#2{\begingroup\obeylines\spacesplit#3}%
+\parindent=0in
+\advance\leftskip by \defbodyindent \advance \rightskip by \defbodyindent
+\exdentamount=\defbodyindent
+\begingroup %
+\catcode 61=\active %
+\obeylines\spacesplit#3}
+
+% This is used for \def{tp,vr}parsebody. It could probably be used for
+% some of the others, too, with some judicious conditionals.
+%
+\def\parsebodycommon#1#2#3{%
+ \begingroup\inENV %
+ \medbreak %
+ % Define the end token that this defining construct specifies
+ % so that it will exit this group.
+ \def#1{\endgraf\endgroup\medbreak}%
+ \def#2##1 {\begingroup\obeylines\spacesplit{#3{##1}}}%
+ \parindent=0in
+ \advance\leftskip by \defbodyindent \advance \rightskip by \defbodyindent
+ \exdentamount=\defbodyindent
+ \begingroup\obeylines
+}
+
+\def\defvrparsebody#1#2#3#4 {%
+ \parsebodycommon{#1}{#2}{#3}%
+ \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}%
+ \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, putting the result in \tptemp.
+%
+\def\removeemptybraces\empty#1\relax{\def\tptemp{#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{%
+ \removeemptybraces#2\relax
+ #1{\tptemp}{#3}%
+}%
+
+\def\defopvarparsebody #1#2#3#4#5 {\begingroup\inENV %
+\medbreak %
+% Define the end token that this defining construct specifies
+% so that it will exit this group.
+\def#1{\endgraf\endgroup\medbreak}%
+\def#2##1 ##2 {\def#4{##1}%
+\begingroup\obeylines\spacesplit{#3{##2}}}%
+\parindent=0in
+\advance\leftskip by \defbodyindent \advance \rightskip by \defbodyindent
+\exdentamount=\defbodyindent
+\begingroup\obeylines\spacesplit{#3{#5}}}
+
+% Split up #2 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\spacesplitfoo{#1}#2 \relax\spacesplitfoo}%
+\long\gdef\spacesplitfoo#1#2 #3#4\spacesplitfoo{%
+\ifx\relax #3%
+#1{#2}{}\else #1{#2}{#3#4}\fi}}
+
+% So much for the things common to all kinds of definitions.
+
+% Define @defun.
+
+% First, define the processing that is wanted for arguments of \defun
+% Use this to expand the args and terminate the paragraph they make up
+
+\def\defunargs #1{\functionparens \sl
+% Expand, preventing hyphenation at `-' chars.
+% Note that groups don't affect changes in \hyphenchar.
+\hyphenchar\tensl=0
+#1%
+\hyphenchar\tensl=45
+\ifnum\parencount=0 \else \errmessage{unbalanced parens in @def arguments}\fi%
+\interlinepenalty=10000
+\advance\rightskip by 0pt plus 1fil
+\endgraf\penalty 10000\vskip -\parskip\penalty 10000%
+}
+
+\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
+\interlinepenalty=10000
+\advance\rightskip by 0pt plus 1fil
+\endgraf\penalty 10000\vskip -\parskip\penalty 10000%
+}
+
+% 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 61=\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}{Function}%
+\defunargs {#2}\endgroup %
+\catcode 61=\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}{Function}%
+\deftypefunargs {#3}\endgroup %
+\catcode 61=\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 61=\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}{Macro}%
+\defunargs {#2}\endgroup %
+\catcode 61=\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}{Special Form}%
+\defunargs {#2}\endgroup %
+\catcode 61=\other % Turn off change made in \defparsebody
+}
+
+% This definition is run if you use @defunx
+% anywhere other than immediately after a @defun or @defunx.
+
+\def\deffnx #1 {\errmessage{@deffnx in invalid context}}
+\def\defunx #1 {\errmessage{@defunx in invalid context}}
+\def\defmacx #1 {\errmessage{@defmacx in invalid context}}
+\def\defspecx #1 {\errmessage{@defspecx in invalid context}}
+\def\deftypefnx #1 {\errmessage{@deftypefnx in invalid context}}
+\def\deftypeunx #1 {\errmessage{@deftypeunx in invalid context}}
+
+% @defmethod, and so on
+
+% @defop {Funny Method} foo-class frobnicate argument
+
+\def\defop #1 {\def\defoptype{#1}%
+\defopparsebody\Edefop\defopx\defopheader\defoptype}
+
+\def\defopheader #1#2#3{%
+\dosubind {fn}{\code{#2}}{on #1}% Make entry in function index
+\begingroup\defname {#2}{\defoptype{} on #1}%
+\defunargs {#3}\endgroup %
+}
+
+% @defmethod == @defop Method
+
+\def\defmethod{\defmethparsebody\Edefmethod\defmethodx\defmethodheader}
+
+\def\defmethodheader #1#2#3{%
+\dosubind {fn}{\code{#2}}{on #1}% entry in function index
+\begingroup\defname {#2}{Method on #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}}{of #1}% Make entry in var index
+\begingroup\defname {#2}{\defcvtype{} of #1}%
+\defvarargs {#3}\endgroup %
+}
+
+% @defivar == @defcv {Instance Variable}
+
+\def\defivar{\defvrparsebody\Edefivar\defivarx\defivarheader}
+
+\def\defivarheader #1#2#3{%
+\dosubind {vr}{\code{#2}}{of #1}% Make entry in var index
+\begingroup\defname {#2}{Instance Variable of #1}%
+\defvarargs {#3}\endgroup %
+}
+
+% These definitions are run if you use @defmethodx, etc.,
+% anywhere other than immediately after a @defmethod, etc.
+
+\def\defopx #1 {\errmessage{@defopx in invalid context}}
+\def\defmethodx #1 {\errmessage{@defmethodx in invalid context}}
+\def\defcvx #1 {\errmessage{@defcvx in invalid context}}
+\def\defivarx #1 {\errmessage{@defivarx in invalid context}}
+
+% Now @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%
+\interlinepenalty=10000
+\endgraf\penalty 10000\vskip -\parskip\penalty 10000}
+
+% @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}{Variable}%
+\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}{User Option}%
+\defvarargs {#2}\endgroup %
+}
+
+% @deftypevar int foobar
+
+\def\deftypevar{\defvarparsebody\Edeftypevar\deftypevarx\deftypevarheader}
+
+% #1 is the data type. #2 is the name.
+\def\deftypevarheader #1#2{%
+\doind {vr}{\code{#2}}% Make entry in variables index
+\begingroup\defname {\defheaderxcond#1\relax$$$#2}{Variable}%
+\interlinepenalty=10000
+\endgraf\penalty 10000\vskip -\parskip\penalty 10000
+\endgroup}
+
+% @deftypevr {Global Flag} int enable
+
+\def\deftypevr{\defvrparsebody\Edeftypevr\deftypevrx\deftypevrheader}
+
+\def\deftypevrheader #1#2#3{\doind {vr}{\code{#3}}%
+\begingroup\defname {\defheaderxcond#2\relax$$$#3}{#1}
+\interlinepenalty=10000
+\endgraf\penalty 10000\vskip -\parskip\penalty 10000
+\endgroup}
+
+% This definition is run if you use @defvarx
+% anywhere other than immediately after a @defvar or @defvarx.
+
+\def\defvrx #1 {\errmessage{@defvrx in invalid context}}
+\def\defvarx #1 {\errmessage{@defvarx in invalid context}}
+\def\defoptx #1 {\errmessage{@defoptx in invalid context}}
+\def\deftypevarx #1 {\errmessage{@deftypevarx in invalid context}}
+\def\deftypevrx #1 {\errmessage{@deftypevrx in invalid context}}
+
+% 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}
+
+% This definition is run if you use @deftpx, etc
+% anywhere other than immediately after a @deftp, etc.
+
+\def\deftpx #1 {\errmessage{@deftpx in invalid context}}
+
+
+\message{cross reference,}
+% Define cross-reference macros
+\newwrite \auxfile
+
+\newif\ifhavexrefs % True if xref values are known.
+\newif\ifwarnedxrefs % True if we warned once that they aren't known.
+
+% @inforef is simple.
+\def\inforef #1{\inforefzzz #1,,,,**}
+\def\inforefzzz #1,#2,#3,#4**{\putwordSee{} \putwordInfo{} \putwordfile{} \file{\ignorespaces #3{}},
+ node \samp{\ignorespaces#1{}}}
+
+% \setref{foo} defines a cross-reference point named foo.
+
+\def\setref#1{%
+\dosetq{#1-title}{Ytitle}%
+\dosetq{#1-pg}{Ypagenumber}%
+\dosetq{#1-snt}{Ysectionnumberandtype}}
+
+\def\unnumbsetref#1{%
+\dosetq{#1-title}{Ytitle}%
+\dosetq{#1-pg}{Ypagenumber}%
+\dosetq{#1-snt}{Ynothing}}
+
+\def\appendixsetref#1{%
+\dosetq{#1-title}{Ytitle}%
+\dosetq{#1-pg}{Ypagenumber}%
+\dosetq{#1-snt}{Yappendixletterandtype}}
+
+% \xref, \pxref, and \ref generate cross-references to specified points.
+% 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
+ \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.
+ \ifdim \wd1 > 0pt
+ \putwordsection{} ``\printednodename'' in \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 \refx{#1-snt}{}}%
+ \space [\printednodename],\space
+ \turnoffactive \putwordpage\tie\refx{#1-pg}{}%
+ \fi
+\endgroup}
+
+% \dosetq is the interface for calls from other macros
+
+% Use \turnoffactive so that punctuation chars such as underscore
+% work in node names.
+\def\dosetq #1#2{{\let\folio=0 \turnoffactive \auxhat%
+\edef\next{\write\auxfile{\internalsetq {#1}{#2}}}%
+\next}}
+
+% \internalsetq {foo}{page} expands into
+% CHARACTERS 'xrdef {foo}{...expansion of \Ypage...}
+% When the aux file is read, ' is the escape character
+
+\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\xreftie\the\chapno %
+\else \ifnum \subsecno=0 \putwordSection\xreftie\the\chapno.\the\secno %
+\else \ifnum \subsubsecno=0 %
+\putwordSection\xreftie\the\chapno.\the\secno.\the\subsecno %
+\else %
+\putwordSection\xreftie\the\chapno.\the\secno.\the\subsecno.\the\subsubsecno %
+\fi \fi \fi }
+
+\def\Yappendixletterandtype{%
+\ifnum\secno=0 \putwordAppendix\xreftie'char\the\appendixno{}%
+\else \ifnum \subsecno=0 \putwordSection\xreftie'char\the\appendixno.\the\secno %
+\else \ifnum \subsubsecno=0 %
+\putwordSection\xreftie'char\the\appendixno.\the\secno.\the\subsecno %
+\else %
+\putwordSection\xreftie'char\the\appendixno.\the\secno.\the\subsecno.\the\subsubsecno %
+\fi \fi \fi }
+
+\gdef\xreftie{'tie}
+
+% 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 % Non-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{%
+ \expandafter\ifx\csname X#1\endcsname\relax
+ % If not defined, say something at least.
+ $\langle$un\-de\-fined$\rangle$%
+ \ifhavexrefs
+ \message{\linenumber Undefined cross reference `#1'.}%
+ \else
+ \ifwarnedxrefs\else
+ \global\warnedxrefstrue
+ \message{Cross reference values unknown; you must run TeX again.}%
+ \fi
+ \fi
+ \else
+ % It's defined, so just use it.
+ \csname X#1\endcsname
+ \fi
+ #2% Output the suffix in any case.
+}
+
+% Read the last existing aux file, if any. No error if none exists.
+
+% This is the macro invoked by entries in the aux file.
+\def\xrdef #1#2{
+{\catcode`\'=\other\expandafter \gdef \csname X#1\endcsname {#2}}}
+
+\def\readauxfile{%
+\begingroup
+\catcode `\^^@=\other
+\catcode `\=\other
+\catcode `\=\other
+\catcode `\^^C=\other
+\catcode `\^^D=\other
+\catcode `\^^E=\other
+\catcode `\^^F=\other
+\catcode `\^^G=\other
+\catcode `\^^H=\other
+\catcode `\ =\other
+\catcode `\^^L=\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
+\catcode 26=\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
+\catcode`\|=\other
+\catcode`\<=\other
+\catcode`\>=\other
+\catcode `\$=\other
+\catcode `\#=\other
+\catcode `\&=\other
+% `\+ does not work, so use 43.
+\catcode 43=\other
+% 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
+ }%
+}%
+% the aux file uses ' as the escape.
+% 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 `\{=1 \catcode `\}=2
+\catcode `\%=\other
+\catcode `\'=0
+\catcode`\^=7 % to make ^^e4 etc usable in xref tags
+\catcode `\\=\other
+\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
+ \footnotezzz
+}%
+
+% 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.
+%
+\long\gdef\footnotezzz#1{\insert\footins{%
+ % 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.
+ \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
+ %
+ % Hang the footnote text off the number.
+ \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
+ #1\strut}%
+}
+
+}%end \catcode `\@=11
+
+% 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
+ }%
+}
+
+% @| 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}
+
+
+% End of control word definitions.
+
+\message{and turning on texinfo input format.}
+
+\def\openindices{%
+ \newindex{cp}%
+ \newcodeindex{fn}%
+ \newcodeindex{vr}%
+ \newcodeindex{tp}%
+ \newcodeindex{ky}%
+ \newcodeindex{pg}%
+}
+
+% Set some numeric style parameters, for 8.5 x 11 format.
+
+\hsize = 6in
+\hoffset = .25in
+\newdimen\defaultparindent \defaultparindent = 15pt
+\parindent = \defaultparindent
+\parskip 3pt plus 2pt minus 1pt
+\setleading{13.2pt}
+\advance\topskip by 1.2cm
+
+\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
+
+% 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. This makes it come to about 9pt for the 8.5x11 format.
+%
+\ifx\emergencystretch\thisisundefined
+ % Allow us to assign to \emergencystretch anyway.
+ \def\emergencystretch{\dimen0}%
+\else
+ \emergencystretch = \hsize
+ \divide\emergencystretch by 45
+\fi
+
+% Use @smallbook to reset parameters for 7x9.5 format (or else 7x9.25)
+\def\smallbook{
+ \global\chapheadingskip = 15pt plus 4pt minus 2pt
+ \global\secheadingskip = 12pt plus 3pt minus 2pt
+ \global\subsecheadingskip = 9pt plus 2pt minus 2pt
+ %
+ \global\lispnarrowing = 0.3in
+ \setleading{12pt}
+ \advance\topskip by -1cm
+ \global\parskip 2pt plus 1pt
+ \global\hsize = 5in
+ \global\vsize=7.5in
+ \global\tolerance=700
+ \global\hfuzz=1pt
+ \global\contentsrightmargin=0pt
+ \global\deftypemargin=0pt
+ \global\defbodyindent=.5cm
+ %
+ \global\pagewidth=\hsize
+ \global\pageheight=\vsize
+ %
+ \global\let\smalllisp=\smalllispx
+ \global\let\smallexample=\smalllispx
+ \global\def\Esmallexample{\Esmalllisp}
+}
+
+% Use @afourpaper to print on European A4 paper.
+\def\afourpaper{
+\global\tolerance=700
+\global\hfuzz=1pt
+\setleading{12pt}
+\global\parskip 15pt plus 1pt
+
+\global\vsize= 53\baselineskip
+\advance\vsize by \topskip
+%\global\hsize= 5.85in % A4 wide 10pt
+\global\hsize= 6.5in
+\global\outerhsize=\hsize
+\global\advance\outerhsize by 0.5in
+\global\outervsize=\vsize
+\global\advance\outervsize by 0.6in
+
+\global\pagewidth=\hsize
+\global\pageheight=\vsize
+}
+
+\bindingoffset=0pt
+\normaloffset=\hoffset
+\pagewidth=\hsize
+\pageheight=\vsize
+
+% Allow control of the text dimensions. Parameters in order: textheight;
+% textwidth; voffset; hoffset; binding offset; topskip.
+% All require a dimension;
+% header is additional; added length extends the bottom of the page.
+
+\def\changepagesizes#1#2#3#4#5#6{
+ \global\vsize= #1
+ \global\topskip= #6
+ \advance\vsize by \topskip
+ \global\voffset= #3
+ \global\hsize= #2
+ \global\outerhsize=\hsize
+ \global\advance\outerhsize by 0.5in
+ \global\outervsize=\vsize
+ \global\advance\outervsize by 0.6in
+ \global\pagewidth=\hsize
+ \global\pageheight=\vsize
+ \global\normaloffset= #4
+ \global\bindingoffset= #5}
+
+% A specific text layout, 24x15cm overall, intended for A4 paper. Top margin
+% 29mm, hence bottom margin 28mm, nominal side margin 3cm.
+\def\afourlatex
+ {\global\tolerance=700
+ \global\hfuzz=1pt
+ \setleading{12pt}
+ \global\parskip 15pt plus 1pt
+ \advance\baselineskip by 1.6pt
+ \changepagesizes{237mm}{150mm}{3.6mm}{3.6mm}{3mm}{7mm}
+ }
+
+% Use @afourwide to print on European A4 paper in wide format.
+\def\afourwide{\afourpaper
+\changepagesizes{9.5in}{6.5in}{\hoffset}{\normaloffset}{\bindingoffset}{7mm}}
+
+% Define macros to output various characters with catcode for normal text.
+\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{+}
+
+% 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\the\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 \char '042}}
+\let"=\activedoublequote
+\catcode`\~=\active
+\def~{{\tt \char '176}}
+\chardef\hat=`\^
+\catcode`\^=\active
+\def\auxhat{\def^{'hat}}
+\def^{{\tt \hat}}
+
+\catcode`\_=\active
+\def_{\ifusingtt\normalunderscore\_}
+% Subroutine for the previous macro.
+\def\_{\leavevmode \kern.06em \vbox{\hrule width.3em height.1ex}}
+
+\catcode`\|=\active
+\def|{{\tt \char '174}}
+\chardef \less=`\<
+\catcode`\<=\active
+\def<{{\tt \less}}
+\chardef \gtr=`\>
+\catcode`\>=\active
+\def>{{\tt \gtr}}
+\catcode`\+=\active
+\def+{{\tt \char 43}}
+%\catcode 27=\active
+%\def^^[{$\diamondsuit$}
+
+% 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 output one backslash character in current font
+\global\chardef\rawbackslashxx=`\\
+%{\catcode`\\=\other
+%@gdef@rawbackslashxx{\}}
+
+% \rawbackslash redefines \ as input to do \rawbackslashxx.
+{\catcode`\\=\active
+@gdef@rawbackslash{@let\=@rawbackslashxx }}
+
+% \normalbackslash outputs one backslash in fixed width font.
+\def\normalbackslash{{\tt\rawbackslashxx}}
+
+% Say @foo, not \foo, in error messages.
+\escapechar=`\@
+
+% \catcode 17=0 % Define control-q
+\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}
+
+@def@normalturnoffactive{@let"=@normaldoublequote
+@let\=@normalbackslash
+@let~=@normaltilde
+@let^=@normalcaret
+@let_=@normalunderscore
+@let|=@normalverticalbar
+@let<=@normalless
+@let>=@normalgreater
+@let+=@normalplus}
+
+% 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}
+
+%% These look ok in all fonts, so just make them not special. The @rm below
+%% makes sure that the current font starts out as the newly loaded cmr10
+@catcode`@$=@other @catcode`@%=@other @catcode`@&=@other @catcode`@#=@other
+
+@textfonts
+@rm
+
+@c Local variables:
+@c page-delimiter: "^\\\\message"
+@c End:
diff --git a/gnu/lib/libreadline/emacs_keymap.c b/gnu/lib/libreadline/emacs_keymap.c
new file mode 100644
index 00000000000..daba213ba07
--- /dev/null
+++ b/gnu/lib/libreadline/emacs_keymap.c
@@ -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 }, /* Control-b */
+ { ISFUNC, (Function *)0x0 }, /* Control-c */
+ { ISFUNC, rl_delete }, /* Control-d */
+ { ISFUNC, rl_end_of_line }, /* Control-e */
+ { ISFUNC, rl_forward }, /* 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, (Function *)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, (Function *)emacs_ctlx_keymap }, /* Control-x */
+ { ISFUNC, rl_yank }, /* Control-y */
+ { ISFUNC, (Function *)0x0 }, /* Control-z */
+ { ISKMAP, (Function *)emacs_meta_keymap }, /* Control-[ */
+ { ISFUNC, (Function *)0x0 }, /* Control-\ */
+ { ISFUNC, rl_char_search }, /* Control-] */
+ { ISFUNC, (Function *)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, (Function *)0x0 }, /* Meta-Control-@ */
+ { ISFUNC, (Function *)0x0 }, /* Meta-Control-a */
+ { ISFUNC, (Function *)0x0 }, /* Meta-Control-b */
+ { ISFUNC, (Function *)0x0 }, /* Meta-Control-c */
+ { ISFUNC, (Function *)0x0 }, /* Meta-Control-d */
+ { ISFUNC, (Function *)0x0 }, /* Meta-Control-e */
+ { ISFUNC, (Function *)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, (Function *)0x0 }, /* Meta-Control-k */
+ { ISFUNC, (Function *)0x0 }, /* Meta-Control-l */
+ { ISFUNC, rl_vi_editing_mode }, /* Meta-Control-m */
+ { ISFUNC, (Function *)0x0 }, /* Meta-Control-n */
+ { ISFUNC, (Function *)0x0 }, /* Meta-Control-o */
+ { ISFUNC, (Function *)0x0 }, /* Meta-Control-p */
+ { ISFUNC, (Function *)0x0 }, /* Meta-Control-q */
+ { ISFUNC, rl_revert_line }, /* Meta-Control-r */
+ { ISFUNC, (Function *)0x0 }, /* Meta-Control-s */
+ { ISFUNC, (Function *)0x0 }, /* Meta-Control-t */
+ { ISFUNC, (Function *)0x0 }, /* Meta-Control-u */
+ { ISFUNC, (Function *)0x0 }, /* Meta-Control-v */
+ { ISFUNC, (Function *)0x0 }, /* Meta-Control-w */
+ { ISFUNC, (Function *)0x0 }, /* Meta-Control-x */
+ { ISFUNC, rl_yank_nth_arg }, /* Meta-Control-y */
+ { ISFUNC, (Function *)0x0 }, /* Meta-Control-z */
+
+ { ISFUNC, rl_complete }, /* Meta-Control-[ */
+ { ISFUNC, (Function *)0x0 }, /* Meta-Control-\ */
+ { ISFUNC, rl_backward_char_search }, /* Meta-Control-] */
+ { ISFUNC, (Function *)0x0 }, /* Meta-Control-^ */
+ { ISFUNC, (Function *)0x0 }, /* Meta-Control-_ */
+
+ /* The start of printing characters. */
+ { ISFUNC, rl_set_mark }, /* Meta-SPACE */
+ { ISFUNC, (Function *)0x0 }, /* Meta-! */
+ { ISFUNC, (Function *)0x0 }, /* Meta-" */
+ { ISFUNC, rl_insert_comment },/* Meta-# */
+ { ISFUNC, (Function *)0x0 }, /* Meta-$ */
+ { ISFUNC, (Function *)0x0 }, /* Meta-% */
+ { ISFUNC, rl_tilde_expand }, /* Meta-& */
+ { ISFUNC, (Function *)0x0 }, /* Meta-' */
+ { ISFUNC, (Function *)0x0 }, /* Meta-( */
+ { ISFUNC, (Function *)0x0 }, /* Meta-) */
+ { ISFUNC, rl_insert_completions }, /* Meta-* */
+ { ISFUNC, (Function *)0x0 }, /* Meta-+ */
+ { ISFUNC, (Function *)0x0 }, /* Meta-, */
+ { ISFUNC, rl_digit_argument }, /* Meta-- */
+ { ISFUNC, rl_yank_last_arg}, /* Meta-. */
+ { ISFUNC, (Function *)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, (Function *)0x0 }, /* Meta-: */
+ { ISFUNC, (Function *)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, (Function *)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, (Function *)0x0 }, /* Meta-[ */ /* was rl_arrow_keys */
+ { ISFUNC, rl_delete_horizontal_space }, /* Meta-\ */
+ { ISFUNC, (Function *)0x0 }, /* Meta-] */
+ { ISFUNC, (Function *)0x0 }, /* Meta-^ */
+ { ISFUNC, rl_yank_last_arg }, /* Meta-_ */
+ { ISFUNC, (Function *)0x0 }, /* Meta-` */
+
+ /* Lowercase alphabet. */
+ { ISFUNC, (Function *)0x0 }, /* Meta-a */
+ { ISFUNC, rl_backward_word }, /* Meta-b */
+ { ISFUNC, rl_capitalize_word }, /* Meta-c */
+ { ISFUNC, rl_kill_word }, /* Meta-d */
+ { ISFUNC, (Function *)0x0 }, /* Meta-e */
+ { ISFUNC, rl_forward_word }, /* Meta-f */
+ { ISFUNC, (Function *)0x0 }, /* Meta-g */
+ { ISFUNC, (Function *)0x0 }, /* Meta-h */
+ { ISFUNC, (Function *)0x0 }, /* Meta-i */
+ { ISFUNC, (Function *)0x0 }, /* Meta-j */
+ { ISFUNC, (Function *)0x0 }, /* Meta-k */
+ { ISFUNC, rl_downcase_word }, /* Meta-l */
+ { ISFUNC, (Function *)0x0 }, /* Meta-m */
+ { ISFUNC, rl_noninc_forward_search }, /* Meta-n */
+ { ISFUNC, (Function *)0x0 }, /* Meta-o */ /* was rl_arrow_keys */
+ { ISFUNC, rl_noninc_reverse_search }, /* Meta-p */
+ { ISFUNC, (Function *)0x0 }, /* Meta-q */
+ { ISFUNC, rl_revert_line }, /* Meta-r */
+ { ISFUNC, (Function *)0x0 }, /* Meta-s */
+ { ISFUNC, rl_transpose_words }, /* Meta-t */
+ { ISFUNC, rl_upcase_word }, /* Meta-u */
+ { ISFUNC, (Function *)0x0 }, /* Meta-v */
+ { ISFUNC, (Function *)0x0 }, /* Meta-w */
+ { ISFUNC, (Function *)0x0 }, /* Meta-x */
+ { ISFUNC, rl_yank_pop }, /* Meta-y */
+ { ISFUNC, (Function *)0x0 }, /* Meta-z */
+
+ /* Final punctuation. */
+ { ISFUNC, (Function *)0x0 }, /* Meta-{ */
+ { ISFUNC, (Function *)0x0 }, /* Meta-| */
+ { ISFUNC, (Function *)0x0 }, /* Meta-} */
+ { ISFUNC, rl_tilde_expand }, /* Meta-~ */
+ { ISFUNC, rl_backward_kill_word }, /* Meta-rubout */
+
+#if KEYMAP_SIZE > 128
+ /* Undefined keys. */
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 }
+#endif /* KEYMAP_SIZE > 128 */
+};
+
+KEYMAP_ENTRY_ARRAY emacs_ctlx_keymap = {
+
+ /* Control keys. */
+ { ISFUNC, (Function *)0x0 }, /* Control-@ */
+ { ISFUNC, (Function *)0x0 }, /* Control-a */
+ { ISFUNC, (Function *)0x0 }, /* Control-b */
+ { ISFUNC, (Function *)0x0 }, /* Control-c */
+ { ISFUNC, (Function *)0x0 }, /* Control-d */
+ { ISFUNC, (Function *)0x0 }, /* Control-e */
+ { ISFUNC, (Function *)0x0 }, /* Control-f */
+ { ISFUNC, rl_abort }, /* Control-g */
+ { ISFUNC, (Function *)0x0 }, /* Control-h */
+ { ISFUNC, (Function *)0x0 }, /* Control-i */
+ { ISFUNC, (Function *)0x0 }, /* Control-j */
+ { ISFUNC, (Function *)0x0 }, /* Control-k */
+ { ISFUNC, (Function *)0x0 }, /* Control-l */
+ { ISFUNC, (Function *)0x0 }, /* Control-m */
+ { ISFUNC, (Function *)0x0 }, /* Control-n */
+ { ISFUNC, (Function *)0x0 }, /* Control-o */
+ { ISFUNC, (Function *)0x0 }, /* Control-p */
+ { ISFUNC, (Function *)0x0 }, /* Control-q */
+ { ISFUNC, rl_re_read_init_file }, /* Control-r */
+ { ISFUNC, (Function *)0x0 }, /* Control-s */
+ { ISFUNC, (Function *)0x0 }, /* Control-t */
+ { ISFUNC, rl_undo_command }, /* Control-u */
+ { ISFUNC, (Function *)0x0 }, /* Control-v */
+ { ISFUNC, (Function *)0x0 }, /* Control-w */
+ { ISFUNC, rl_exchange_point_and_mark },/* Control-x */
+ { ISFUNC, (Function *)0x0 }, /* Control-y */
+ { ISFUNC, (Function *)0x0 }, /* Control-z */
+ { ISFUNC, (Function *)0x0 }, /* Control-[ */
+ { ISFUNC, (Function *)0x0 }, /* Control-\ */
+ { ISFUNC, (Function *)0x0 }, /* Control-] */
+ { ISFUNC, (Function *)0x0 }, /* Control-^ */
+ { ISFUNC, (Function *)0x0 }, /* Control-_ */
+
+ /* The start of printing characters. */
+ { ISFUNC, (Function *)0x0 }, /* SPACE */
+ { ISFUNC, (Function *)0x0 }, /* ! */
+ { ISFUNC, (Function *)0x0 }, /* " */
+ { ISFUNC, (Function *)0x0 }, /* # */
+ { ISFUNC, (Function *)0x0 }, /* $ */
+ { ISFUNC, (Function *)0x0 }, /* % */
+ { ISFUNC, (Function *)0x0 }, /* & */
+ { ISFUNC, (Function *)0x0 }, /* ' */
+ { ISFUNC, rl_start_kbd_macro }, /* ( */
+ { ISFUNC, rl_end_kbd_macro }, /* ) */
+ { ISFUNC, (Function *)0x0 }, /* * */
+ { ISFUNC, (Function *)0x0 }, /* + */
+ { ISFUNC, (Function *)0x0 }, /* , */
+ { ISFUNC, (Function *)0x0 }, /* - */
+ { ISFUNC, (Function *)0x0 }, /* . */
+ { ISFUNC, (Function *)0x0 }, /* / */
+
+ /* Regular digits. */
+ { ISFUNC, (Function *)0x0 }, /* 0 */
+ { ISFUNC, (Function *)0x0 }, /* 1 */
+ { ISFUNC, (Function *)0x0 }, /* 2 */
+ { ISFUNC, (Function *)0x0 }, /* 3 */
+ { ISFUNC, (Function *)0x0 }, /* 4 */
+ { ISFUNC, (Function *)0x0 }, /* 5 */
+ { ISFUNC, (Function *)0x0 }, /* 6 */
+ { ISFUNC, (Function *)0x0 }, /* 7 */
+ { ISFUNC, (Function *)0x0 }, /* 8 */
+ { ISFUNC, (Function *)0x0 }, /* 9 */
+
+ /* A little more punctuation. */
+ { ISFUNC, (Function *)0x0 }, /* : */
+ { ISFUNC, (Function *)0x0 }, /* ; */
+ { ISFUNC, (Function *)0x0 }, /* < */
+ { ISFUNC, (Function *)0x0 }, /* = */
+ { ISFUNC, (Function *)0x0 }, /* > */
+ { ISFUNC, (Function *)0x0 }, /* ? */
+ { ISFUNC, (Function *)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, (Function *)0x0 }, /* [ */
+ { ISFUNC, (Function *)0x0 }, /* \ */
+ { ISFUNC, (Function *)0x0 }, /* ] */
+ { ISFUNC, (Function *)0x0 }, /* ^ */
+ { ISFUNC, (Function *)0x0 }, /* _ */
+ { ISFUNC, (Function *)0x0 }, /* ` */
+
+ /* Lowercase alphabet. */
+ { ISFUNC, (Function *)0x0 }, /* a */
+ { ISFUNC, (Function *)0x0 }, /* b */
+ { ISFUNC, (Function *)0x0 }, /* c */
+ { ISFUNC, (Function *)0x0 }, /* d */
+ { ISFUNC, rl_call_last_kbd_macro }, /* e */
+ { ISFUNC, (Function *)0x0 }, /* f */
+ { ISFUNC, (Function *)0x0 }, /* g */
+ { ISFUNC, (Function *)0x0 }, /* h */
+ { ISFUNC, (Function *)0x0 }, /* i */
+ { ISFUNC, (Function *)0x0 }, /* j */
+ { ISFUNC, (Function *)0x0 }, /* k */
+ { ISFUNC, (Function *)0x0 }, /* l */
+ { ISFUNC, (Function *)0x0 }, /* m */
+ { ISFUNC, (Function *)0x0 }, /* n */
+ { ISFUNC, (Function *)0x0 }, /* o */
+ { ISFUNC, (Function *)0x0 }, /* p */
+ { ISFUNC, (Function *)0x0 }, /* q */
+ { ISFUNC, (Function *)0x0 }, /* r */
+ { ISFUNC, (Function *)0x0 }, /* s */
+ { ISFUNC, (Function *)0x0 }, /* t */
+ { ISFUNC, (Function *)0x0 }, /* u */
+ { ISFUNC, (Function *)0x0 }, /* v */
+ { ISFUNC, (Function *)0x0 }, /* w */
+ { ISFUNC, (Function *)0x0 }, /* x */
+ { ISFUNC, (Function *)0x0 }, /* y */
+ { ISFUNC, (Function *)0x0 }, /* z */
+
+ /* Final punctuation. */
+ { ISFUNC, (Function *)0x0 }, /* { */
+ { ISFUNC, (Function *)0x0 }, /* | */
+ { ISFUNC, (Function *)0x0 }, /* } */
+ { ISFUNC, (Function *)0x0 }, /* ~ */
+ { ISFUNC, rl_backward_kill_line }, /* RUBOUT */
+
+#if KEYMAP_SIZE > 128
+ /* Undefined keys. */
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 }
+#endif /* KEYMAP_SIZE > 128 */
+};
diff --git a/gnu/lib/libreadline/examples/Inputrc b/gnu/lib/libreadline/examples/Inputrc
new file mode 100644
index 00000000000..5b71bd701c4
--- /dev/null
+++ b/gnu/lib/libreadline/examples/Inputrc
@@ -0,0 +1,65 @@
+# 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.
+#
+
+# 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/gnu/lib/libreadline/examples/Makefile.in b/gnu/lib/libreadline/examples/Makefile.in
new file mode 100644
index 00000000000..7246e75f8ce
--- /dev/null
+++ b/gnu/lib/libreadline/examples/Makefile.in
@@ -0,0 +1,85 @@
+#
+# 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.
+
+SHELL = @MAKE_SHELL@
+RM = rm -f
+
+srcdir = @srcdir@
+VPATH = .:@srcdir@
+top_srcdir = @top_srcdir@
+BUILD_DIR = .
+
+DEFS = @DEFS@
+CC = @CC@
+CFLAGS = @CFLAGS@
+LOCAL_CFLAGS = @LOCAL_CFLAGS@ -DREADLINE_LIBRARY
+CPPFLAGS = @CPPFLAGS@
+
+INCLUDES = -I$(srcdir) -I$(top_srcdir) -I..
+
+CCFLAGS = $(DEFS) $(LOCAL_CFLAGS) $(CPPFLAGS) $(INCLUDES) $(CFLAGS)
+LDFLAGS = -g -L..
+
+READLINE_LIB = ../libreadline.a
+HISTORY_LIB = ../libhistory.a
+
+TERMCAP_LIB = @TERMCAP_LIB@
+
+.c.o:
+ ${RM} $@
+ $(CC) $(CCFLAGS) -c $<
+
+EXECUTABLES = fileman rltest rl rlversion
+OBJECTS = fileman.o rltest.o rl.o rlversion.o
+
+all: $(EXECUTABLES)
+
+rl: rl.o
+ $(CC) $(LDFLAGS) -o $@ rl.o -lreadline $(TERMCAP_LIB)
+
+fileman: fileman.o
+ $(CC) $(LDFLAGS) -o $@ fileman.o -lreadline $(TERMCAP_LIB)
+
+rltest: rltest.o
+ $(CC) $(LDFLAGS) -o $@ rltest.o -lreadline $(TERMCAP_LIB)
+
+rlversion: rlversion.o $(READLINE_LIB)
+ $(CC) $(LDFLAGS) -o $@ rlversion.o -lreadline $(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
+
+# Stuff for Per Bothner's `rlfe' program
+
+rlfe: rlfe.o $(READLINE_LIB) $(HISTORY_LIB)
+ $(CC) $(LDFLAGS) -o $@ rlfe.o -lreadline -lhistory ${TERMCAP_LIB}
+
+rlfe.o: rlfe.c
+
+rlfe.o: $(top_srcdir)/readline.h
+rlfe.o: $(top_srcdir)/history.h
diff --git a/gnu/lib/libreadline/examples/excallback.c b/gnu/lib/libreadline/examples/excallback.c
new file mode 100644
index 00000000000..ca03fc3dafd
--- /dev/null
+++ b/gnu/lib/libreadline/examples/excallback.c
@@ -0,0 +1,186 @@
+/*
+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
+*/
+
+#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);
+ }
+}
+
+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/gnu/lib/libreadline/examples/fileman.c b/gnu/lib/libreadline/examples/fileman.c
new file mode 100644
index 00000000000..dc29a40104f
--- /dev/null
+++ b/gnu/lib/libreadline/examples/fileman.c
@@ -0,0 +1,458 @@
+/* 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 (), com_view (), com_rename (), com_stat (), com_pwd ();
+int com_delete (), com_help (), com_cd (), com_quit ();
+
+/* A structure which contains information on the commands this program
+ can understand. */
+
+typedef struct {
+ char *name; /* User printable name of the function. */
+ Function *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, (Function *)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 ();
+char **fileman_completion ();
+
+/* 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 = (CPPFunction *)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)
+ 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 = 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)
+ 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/gnu/lib/libreadline/examples/histexamp.c b/gnu/lib/libreadline/examples/histexamp.c
new file mode 100644
index 00000000000..eceb66df19e
--- /dev/null
+++ b/gnu/lib/libreadline/examples/histexamp.c
@@ -0,0 +1,82 @@
+main ()
+{
+ 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;
+
+ 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;
+
+ 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");
+ }
+ }
+ }
+}
diff --git a/gnu/lib/libreadline/examples/manexamp.c b/gnu/lib/libreadline/examples/manexamp.c
new file mode 100644
index 00000000000..3496efa00e7
--- /dev/null
+++ b/gnu/lib/libreadline/examples/manexamp.c
@@ -0,0 +1,94 @@
+/* manexamp.c -- The examples which appear in the documentation are here. */
+
+#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 (uppercase_p (rl_line_buffer[start]))
+ rl_line_buffer[start] = to_lower (rl_line_buffer[start]);
+ else if (lowercase_p (rl_line_buffer[start]))
+ rl_line_buffer[start] = to_upper (rl_line_buffer[start]);
+ }
+
+ /* Move point to on top of the last character changed. */
+ rl_point = end - direction;
+}
+
diff --git a/gnu/lib/libreadline/examples/rl.c b/gnu/lib/libreadline/examples/rl.c
new file mode 100644
index 00000000000..2d1d17e600d
--- /dev/null
+++ b/gnu/lib/libreadline/examples/rl.c
@@ -0,0 +1,131 @@
+/*
+ * 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]
+ */
+
+#if defined (HAVE_CONFIG_H)
+# include <config.h>
+#endif
+
+#include <stdio.h>
+#include <sys/types.h>
+#include "posixstat.h"
+
+#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;
+
+#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 = (Function *)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);
+
+ puts (temp);
+ exit (0);
+}
diff --git a/gnu/lib/libreadline/examples/rlfe.c b/gnu/lib/libreadline/examples/rlfe.c
new file mode 100644
index 00000000000..5c3c8fde45b
--- /dev/null
+++ b/gnu/lib/libreadline/examples/rlfe.c
@@ -0,0 +1,685 @@
+/* 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.
+ */
+
+/* PROBLEMS/TODO:
+ *
+ * Only tested under Linux; needs to be ported.
+ *
+ * When running mc -c under the Linux console, mc does not recognize
+ * mouse clicks, which mc does when not running under fep.
+ *
+ * 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.
+ *
+ * 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.
+ *
+ * Desirable readline feature: When in cooked no-echo mode (e.g. password),
+ * echo characters are they are types with '*', but remove them when done.
+ *
+ * A synchronous 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.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#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>
+
+#ifdef READLINE_LIBRARY
+# include "readline.h"
+# include "history.h"
+#else
+# include <readline/readline.h>
+# include <readline/history.h>
+#endif
+
+#ifndef COMMAND
+#define COMMAND "/bin/sh"
+#endif
+#ifndef COMMAND_ARGS
+#define COMMAND_ARGS 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 "Fep"
+
+static int in_from_inferior_fd;
+static int out_to_inferior_fd;
+
+/* 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) /* Do nothing */
+#define DPRINT1(FMT, V1) /* Do nothing */
+#define DPRINT2(FMT, V1, V2) /* 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);
+ 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_master_pty() takes a double-indirect character pointer in which
+ * to put a slave name, and returns an integer file descriptor.
+ * If it returns < 0, an error has occurred.
+ * Otherwise, it has returned the master pty file descriptor, and fills
+ * in *name with the name of the corresponding slave pty.
+ * Once the slave pty has been opened, you are responsible to free *name.
+ */
+
+int get_master_pty(char **name) {
+ int i, j;
+ /* default to returning error */
+ int master = -1;
+
+ /* create a dummy name to fill in */
+ *name = strdup("/dev/ptyXX");
+
+ /* search for an unused pty */
+ for (i=0; i<16 && master <= 0; i++) {
+ for (j=0; j<16 && master <= 0; j++) {
+ (*name)[5] = 'p';
+ (*name)[8] = "pqrstuvwxyzPQRST"[i];
+ (*name)[9] = "0123456789abcdef"[j];
+ /* open the master pty */
+ if ((master = open(*name, O_RDWR)) < 0) {
+ if (errno == ENOENT) {
+ /* we are out of pty devices */
+ free (*name);
+ return (master);
+ }
+ }
+ else {
+ /* By substituting a letter, we change the master pty
+ * name into the slave pty name.
+ */
+ (*name)[5] = 't';
+ if (access(*name, R_OK|W_OK) != 0)
+ {
+ close(master);
+ master = -1;
+ }
+ }
+ }
+ }
+ if ((master < 0) && (i == 16) && (j == 16)) {
+ /* must have tried every pty unsuccessfully */
+ free (*name);
+ return (master);
+ }
+
+ (*name)[5] = 't';
+
+ return (master);
+}
+
+/* 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 num_keys = 0;
+
+static void
+null_prep_terminal (int meta)
+{
+}
+
+static void
+null_deprep_terminal ()
+{
+}
+
+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;
+
+#ifdef DEBUG
+ logfile = fopen("LOG", "w");
+#endif
+
+ rl_readline_name = APPLICATION_NAME;
+
+ if ((master = get_master_pty(&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);
+ }
+ free(name);
+#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);
+ }
+ free(name);
+#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 };
+ if (argc <= 1)
+ execvp(COMMAND, command_args);
+ else
+ execvp(argv[1], &argv[1]);
+ }
+
+ /* should never be reached */
+ exit(1);
+ }
+
+ /* parent */
+ signal (SIGCHLD, sig_child);
+ free(name);
+
+ /* 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
+
+#if 0
+ t.c_lflag |= (ICANON | ISIG | ECHO | ECHOCTL | ECHOE | \
+ ECHOK | ECHOKE | ECHONL | ECHOPRT );
+#else
+ t.c_lflag &= ~(ICANON | ISIG | ECHO | ECHOCTL | ECHOE | \
+ ECHOK | ECHOKE | ECHONL | ECHOPRT );
+#endif
+ 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_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 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)
+ {
+ DPRINT2 ("echo:%d, canon:%d\n",
+ (term_master.c_lflag & ECHO) != 0,
+ (term_master.c_lflag & ICANON) != 0);
+ do_canon = (term_master.c_lflag & ICANON) != 0;
+ readline_echoing_p = (term_master.c_lflag & ECHO) != 0;
+ }
+ 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));
+ 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);
+ prompt = malloc (buf_count + 1);
+ if (prompt == NULL)
+ prompt = empty_string;
+ else
+ {
+ memcpy (prompt, buf, buf_count);
+ prompt[buf_count] = '\0';
+ DPRINT1("New prompt '%s'\n", prompt);
+#if 0 /* ifdef HAVE_RL_ALREADY_PROMPTED -- doesn't work */
+ 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++;
+ rl_callback_read_char ();
+ }
+ }
+ else /* input 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);
+ 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++;
+ }
+
+ /* 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);
+ }
+ }
+}
diff --git a/gnu/lib/libreadline/examples/rltest.c b/gnu/lib/libreadline/examples/rltest.c
new file mode 100644
index 00000000000..6250f900d42
--- /dev/null
+++ b/gnu/lib/libreadline/examples/rltest.c
@@ -0,0 +1,67 @@
+/* **************************************************************** */
+/* */
+/* Testing Readline */
+/* */
+/* **************************************************************** */
+
+#if defined (HAVE_CONFIG_H)
+#include <config.h>
+#endif
+
+#include <stdio.h>
+#include <sys/types.h>
+
+#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/gnu/lib/libreadline/examples/rlversion.c b/gnu/lib/libreadline/examples/rlversion.c
new file mode 100644
index 00000000000..652d37ccb88
--- /dev/null
+++ b/gnu/lib/libreadline/examples/rlversion.c
@@ -0,0 +1,23 @@
+/*
+ * rlversion -- print out readline's version number
+ */
+
+#if defined (HAVE_CONFIG_H)
+# include <config.h>
+#endif
+
+#include <stdio.h>
+#include <sys/types.h>
+#include "posixstat.h"
+
+#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/gnu/lib/libreadline/funmap.c b/gnu/lib/libreadline/funmap.c
new file mode 100644
index 00000000000..1f7ba87129d
--- /dev/null
+++ b/gnu/lib/libreadline/funmap.c
@@ -0,0 +1,260 @@
+/* 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 ();
+
+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-char", rl_backward },
+ { "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-char", rl_forward },
+ { "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 },
+#ifdef __CYGWIN32__
+ { "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-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-bracktype", rl_vi_bracktype },
+ { "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-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, (Function *)NULL }
+};
+
+int
+rl_add_funmap_entry (name, function)
+ char *name;
+ Function *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. */
+char **
+rl_funmap_names ()
+{
+ 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 = (char **)NULL; funmap[result_index]; result_index++)
+ {
+ if (result_index + 2 > result_size)
+ {
+ result_size += 20;
+ result = (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);
+}
+
+/* Things that mean `Control'. */
+char *possible_control_prefixes[] = {
+ "Control-", "C-", "CTRL-", (char *)NULL
+};
+
+char *possible_meta_prefixes[] = {
+ "Meta", "M-", (char *)NULL
+};
diff --git a/gnu/lib/libreadline/histexpand.c b/gnu/lib/libreadline/histexpand.c
new file mode 100644
index 00000000000..78da3e585a6
--- /dev/null
+++ b/gnu/lib/libreadline/histexpand.c
@@ -0,0 +1,1357 @@
+/* histexpand.c -- history expansion. */
+
+/* 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)
+# ifndef _MINIX
+# include <sys/types.h>
+# endif
+# include <unistd.h>
+#endif
+
+#if defined (HAVE_STRING_H)
+# include <string.h>
+#else
+# include <strings.h>
+#endif /* !HAVE_STRING_H */
+
+#include "history.h"
+#include "histlib.h"
+
+#include "rlshell.h"
+#include "xmalloc.h"
+
+#define HISTORY_WORD_DELIMITERS " \t\n;&()|<>"
+#define HISTORY_QUOTE_CHARACTERS "\"'`"
+
+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 __P((char *, char *, int *));
+static char *history_find_word __P((char *, int));
+
+static char *quote_breaks __P((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;
+
+/* If set, this points to a function that is called to verify that a
+ particular history expansion should be performed. */
+Function *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)
+ char *string;
+ int *caller_index;
+ int delimiting_quote;
+{
+ register int i;
+ register char c;
+ HIST_ENTRY *entry;
+ int which, sign, local_index, substring_okay;
+ Function *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 ((!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 = 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 = 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, *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 = 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 = (char *) NULL;
+
+ i = *iptr;
+
+ for (si = i; str[si] && str[si] != delimiter; si++)
+ if (str[si] == '\\' && str[si + 1] == delimiter)
+ si++;
+
+ if (si > i || is_rhs)
+ {
+ s = 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 = 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 = 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 = 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, want_quotes, print_only;
+ char *event, *temp, *result, *tstr, *t, c, *word_spec;
+ int result_len;
+
+ result = 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 (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 = print_only = 0;
+ starting_index = i;
+
+ while (string[i] == ':')
+ {
+ c = string[i + 1];
+
+ if (c == 'g')
+ {
+ substitute_globally = 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, *t;
+ int delimiter, failed, si, l_temp;
+
+ if (c == 's')
+ {
+ if (i + 2 < (int)strlen (string))
+ 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. */
+ si = 0;
+ for (failed = 1; (si + subst_lhs_len) <= l_temp; si++)
+ if (STREQN (temp+si, subst_lhs, subst_lhs_len))
+ {
+ int len = subst_rhs_len - subst_lhs_len + l_temp;
+ new_event = 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)
+ {
+ si += subst_rhs_len;
+ l_temp = strlen (temp);
+ substitute_globally++;
+ 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 = 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 = 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 = xrealloc (result, result_len); \
+ } \
+ strcpy (result + j - sl, s); \
+ } \
+ while (0)
+
+#define ADD_CHAR(c) \
+ do \
+ { \
+ if (j >= result_len - 1) \
+ result = 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;
+ char *string;
+
+ /* The output string, and its length. */
+ int result_len;
+ char *result;
+
+ /* Used when adding the string. */
+ char *temp;
+
+ /* 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 = 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 = xmalloc (l + 5);
+
+ string[0] = string[1] = history_expansion_char;
+ string[2] = ':';
+ string[3] = 's';
+ strcpy (string + 4, hstring);
+ l += 4;
+ }
+ else
+ {
+ 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 = 0; string[i]; i++)
+ {
+ cc = string[i + 1];
+ /* The history_comment_char, if set, appearing that 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;
+ }
+ /* XXX - at some point, might want to extend this to handle
+ double quotes as well. */
+ else if (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 = i = j = 0; i < l; i++)
+ {
+ int tchar = string[i];
+
+ if (passc)
+ {
+ passc = 0;
+ ADD_CHAR (tchar);
+ continue;
+ }
+
+ 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 '\'':
+ {
+ /* If history_quotes_inhibit_expansion is set, single quotes
+ inhibit history expansion. */
+ if (history_quotes_inhibit_expansion)
+ {
+ int quote, slen;
+
+ quote = i++;
+ hist_string_extract_single_quoted (string, &i);
+
+ slen = i - quote + 2;
+ temp = 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 = 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 = 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)
+ {
+ add_history (result);
+ 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;
+ 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 = '$';
+ }
+ else if (!spec[i] || spec[i] == ':') /* could be modifier separator */
+ 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;
+ 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 = 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);
+}
+
+#define slashify_in_quotes "\\`\"$"
+
+/* 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)
+ char *string;
+ int wind, *indp;
+{
+ char **result;
+ register int i, start, result_index, size;
+ int len, delimiter;
+
+ /* 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]; )
+ {
+ delimiter = 0;
+
+ /* Skip leading whitespace. */
+ for (; string[i] && whitespace (string[i]); i++)
+ ;
+ if (string[i] == 0 || string[i] == history_comment_char)
+ return (result);
+
+ start = i;
+
+ if (member (string[i], "()\n"))
+ {
+ i++;
+ goto got_token;
+ }
+
+ if (member (string[i], "<>;&|$"))
+ {
+ int peek = string[i + 1];
+
+ if (peek == string[i] && peek != '$')
+ {
+ if (peek == '<' && string[i + 2] == '-')
+ i++;
+ i += 2;
+ goto got_token;
+ }
+ else
+ {
+ if ((peek == '&' && (string[i] == '>' || string[i] == '<')) ||
+ ((peek == '>') && (string[i] == '&')) ||
+ ((peek == '(') && (string[i] == '$')))
+ {
+ i += 2;
+ goto got_token;
+ }
+ }
+ if (string[i] != '$')
+ {
+ i++;
+ goto got_token;
+ }
+ }
+
+ /* 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];
+ }
+
+ got_token:
+
+ /* 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;
+
+ len = i - start;
+ if (result_index + 2 >= size)
+ result = (char **)xrealloc (result, ((size += 10) * sizeof (char *)));
+ result[result_index] = xmalloc (1 + len);
+ strncpy (result[result_index], string + start, len);
+ result[result_index][len] = '\0';
+ 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)
+ 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)
+ 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/gnu/lib/libreadline/histfile.c b/gnu/lib/libreadline/histfile.c
new file mode 100644
index 00000000000..b908e2261f8
--- /dev/null
+++ b/gnu/lib/libreadline/histfile.c
@@ -0,0 +1,384 @@
+/* histfile.c - functions to manipulate the history file. */
+
+/* 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. */
+
+/* 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>
+
+#include <sys/types.h>
+#ifndef _MINIX
+# 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 (HAVE_STRING_H)
+# include <string.h>
+#else
+# include <strings.h>
+#endif /* !HAVE_STRING_H */
+
+
+/* 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"
+
+/* 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)
+ char *filename;
+{
+ char *return_val, *home;
+ int home_len;
+
+ return_val = filename ? savestring (filename) : (char *)NULL;
+
+ if (return_val)
+ return (return_val);
+
+ home = get_env_value ("HOME");
+
+ if (home == 0)
+ {
+ home = ".";
+ home_len = 1;
+ }
+ else
+ home_len = strlen (home);
+
+ return_val = 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)
+ 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)
+ char *filename;
+ int from, to;
+{
+ register int line_start, line_end;
+ char *input, *buffer;
+ int file, current_line, chars_read;
+ struct stat finfo;
+ size_t file_size;
+
+ buffer = (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)
+ {
+#if defined (EFBIG)
+ errno = EFBIG;
+#endif
+ goto error_and_exit;
+ }
+
+ buffer = xmalloc (file_size + 1);
+
+ chars_read = read (file, buffer, file_size);
+ if (chars_read < 0)
+ {
+ error_and_exit:
+ if (file >= 0)
+ close (file);
+
+ FREE (input);
+ FREE (buffer);
+
+ return (errno);
+ }
+
+ 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. */
+ line_start = line_end = current_line = 0;
+
+ /* Skip lines until we are at FROM. */
+ while (line_start < chars_read && current_line < from)
+ {
+ for (line_end = line_start; line_end < chars_read; line_end++)
+ if (buffer[line_end] == '\n')
+ {
+ current_line++;
+ line_start = line_end + 1;
+ if (current_line == from)
+ break;
+ }
+ }
+
+ /* If there are lines left to gobble, then gobble them now. */
+ for (line_end = line_start; line_end < chars_read; line_end++)
+ if (buffer[line_end] == '\n')
+ {
+ buffer[line_end] = '\0';
+
+ if (buffer[line_start])
+ add_history (buffer + line_start);
+
+ current_line++;
+
+ if (current_line >= to)
+ break;
+
+ line_start = line_end + 1;
+ }
+
+ FREE (input);
+ FREE (buffer);
+
+ return (0);
+}
+
+/* Truncate the history file FNAME, leaving only LINES trailing lines.
+ If FNAME is NULL, then use ~/.history. */
+int
+history_truncate_file (fname, lines)
+ char *fname;
+ int lines;
+{
+ register int i;
+ int file, chars_read;
+ char *buffer, *filename;
+ struct stat finfo;
+ size_t file_size;
+
+ buffer = (char *)NULL;
+ filename = history_filename (fname);
+ file = open (filename, O_RDONLY|O_BINARY, 0666);
+
+ if (file == -1 || fstat (file, &finfo) == -1)
+ goto truncate_exit;
+
+ /* Don't try to truncate non-regular files. */
+ if (S_ISREG(finfo.st_mode) == 0)
+ 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)
+ errno = EFBIG;
+#endif
+ goto truncate_exit;
+ }
+
+ buffer = xmalloc (file_size + 1);
+ chars_read = read (file, buffer, file_size);
+ close (file);
+
+ if (chars_read <= 0)
+ goto truncate_exit;
+
+ /* Count backwards from the end of buffer until we have passed
+ LINES lines. */
+ for (i = chars_read - 1; lines && i; i--)
+ {
+ if (buffer[i] == '\n')
+ lines--;
+ }
+
+ /* 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 ( ; i; i--)
+ if (buffer[i] == '\n')
+ {
+ i++;
+ break;
+ }
+
+ /* Write only if there are more lines in the file than we want to
+ truncate to. */
+ if (i && ((file = open (filename, O_WRONLY|O_TRUNC|O_BINARY, 0600)) != -1))
+ {
+ write (file, buffer + i, chars_read - i);
+
+#if defined (__BEOS__)
+ /* BeOS ignores O_TRUNC. */
+ ftruncate (file, chars_read - i);
+#endif
+
+ close (file);
+ }
+
+ truncate_exit:
+
+ FREE (buffer);
+
+ free (filename);
+ return 0;
+}
+
+/* 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)
+ char *filename;
+ int nelements, overwrite;
+{
+ register int i;
+ char *output;
+ int file, mode;
+
+ mode = overwrite ? O_WRONLY|O_CREAT|O_TRUNC|O_BINARY : O_WRONLY|O_APPEND|O_BINARY;
+ output = history_filename (filename);
+
+ if ((file = open (output, mode, 0600)) == -1)
+ {
+ FREE (output);
+ return (errno);
+ }
+
+ 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++)
+ buffer_size += 1 + strlen (the_history[i]->line);
+
+ /* Allocate the buffer, and fill it. */
+ buffer = xmalloc (buffer_size);
+
+ for (j = 0, i = history_length - nelements; i < history_length; i++)
+ {
+ strcpy (buffer + j, the_history[i]->line);
+ j += strlen (the_history[i]->line);
+ buffer[j++] = '\n';
+ }
+
+ write (file, buffer, buffer_size);
+ free (buffer);
+ }
+
+ close (file);
+
+ FREE (output);
+
+ return (0);
+}
+
+/* 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;
+ 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)
+ char *filename;
+{
+ return (history_do_write (filename, history_length, HISTORY_OVERWRITE));
+}
diff --git a/gnu/lib/libreadline/histlib.h b/gnu/lib/libreadline/histlib.h
new file mode 100644
index 00000000000..88a34d10f1d
--- /dev/null
+++ b/gnu/lib/libreadline/histlib.h
@@ -0,0 +1,88 @@
+/* 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_
+
+/* Function pointers can be declared as (Function *)foo. */
+#if !defined (_FUNCTION_DEF)
+# define _FUNCTION_DEF
+typedef int Function ();
+typedef void VFunction ();
+typedef char *CPFunction ();
+typedef char **CPPFunction ();
+#endif /* _FUNCTION_DEF */
+
+#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
+# ifndef strcpy
+extern char *strcpy ();
+# endif
+#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/gnu/lib/libreadline/history.c b/gnu/lib/libreadline/history.c
new file mode 100644
index 00000000000..400f18bc602
--- /dev/null
+++ b/gnu/lib/libreadline/history.c
@@ -0,0 +1,388 @@
+/* History.c -- standalone 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. */
+
+/* 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
+
+#if defined (HAVE_STRING_H)
+# include <string.h>
+#else
+# include <strings.h>
+#endif /* !HAVE_STRING_H */
+
+#include "history.h"
+#include "histlib.h"
+
+#include "xmalloc.h"
+
+/* The number of slots to increase the_history by. */
+#define DEFAULT_HISTORY_GROW_SIZE 50
+
+/* **************************************************************** */
+/* */
+/* 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;
+
+/* If HISTORY_STIFLED is non-zero, then this is the maximum number of
+ entries to remember. */
+int max_input_history;
+
+/* 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 current number of slots allocated to the input_history. */
+static int history_size;
+
+/* 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. */
+int
+history_total_bytes ()
+{
+ register int i, result;
+
+ result = 0;
+
+ for (i = 0; the_history && the_history[i]; i++)
+ result += strlen (the_history[i]->line);
+
+ 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)
+ ? (HIST_ENTRY *)NULL
+ : the_history[local_index];
+}
+
+/* Place STRING at the end of the history list. The data field
+ is set to NULL. */
+void
+add_history (string)
+ char *string;
+{
+ HIST_ENTRY *temp;
+
+ if (history_stifled && (history_length == max_input_history))
+ {
+ register int i;
+
+ /* If the history is stifled, and history_length is zero,
+ and it equals max_input_history, we don't save items. */
+ if (history_length == 0)
+ return;
+
+ /* If there is something in the slot, then remove it. */
+ if (the_history[0])
+ {
+ free (the_history[0]->line);
+ free (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 = (HIST_ENTRY *)xmalloc (sizeof (HIST_ENTRY));
+ temp->line = savestring (string);
+ temp->data = (char *)NULL;
+
+ the_history[history_length] = (HIST_ENTRY *)NULL;
+ the_history[history_length - 1] = temp;
+}
+
+/* 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;
+ char *line;
+ histdata_t data;
+{
+ HIST_ENTRY *temp = (HIST_ENTRY *)xmalloc (sizeof (HIST_ENTRY));
+ HIST_ENTRY *old_value;
+
+ if (which >= history_length)
+ return ((HIST_ENTRY *)NULL);
+
+ old_value = the_history[which];
+
+ temp->line = savestring (line);
+ temp->data = data;
+ the_history[which] = temp;
+
+ return (old_value);
+}
+
+/* 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;
+
+ if (which >= history_length || !history_length)
+ return_value = (HIST_ENTRY *)NULL;
+ else
+ {
+ register int i;
+ 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;
+{
+ if (max < 0)
+ max = 0;
+
+ if (history_length > max)
+ {
+ register int i, j;
+
+ /* This loses because we cannot free the data. */
+ for (i = 0, j = history_length - max; i < j; i++)
+ {
+ free (the_history[i]->line);
+ free (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 = max;
+}
+
+/* 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. */
+int
+unstifle_history ()
+{
+ if (history_stifled)
+ {
+ history_stifled = 0;
+ return (-max_input_history);
+ }
+
+ return (max_input_history);
+}
+
+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 (the_history[i]->line);
+ free (the_history[i]);
+ the_history[i] = (HIST_ENTRY *)NULL;
+ }
+
+ history_offset = history_length = 0;
+}
diff --git a/gnu/lib/libreadline/history.h b/gnu/lib/libreadline/history.h
new file mode 100644
index 00000000000..5210deb39a4
--- /dev/null
+++ b/gnu/lib/libreadline/history.h
@@ -0,0 +1,248 @@
+/* History.h -- the names of functions that you can call in history. */
+/* 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. */
+
+#ifndef _HISTORY_H_
+#define _HISTORY_H_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#if defined READLINE_LIBRARY
+# include "rlstdc.h"
+#else
+# include <readline/rlstdc.h>
+#endif
+
+#if !defined (_FUNCTION_DEF)
+# define _FUNCTION_DEF
+typedef int Function ();
+typedef void VFunction ();
+typedef char *CPFunction ();
+typedef char **CPPFunction ();
+#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;
+ histdata_t data;
+} HIST_ENTRY;
+
+/* 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 __P((void));
+
+/* Return the current HISTORY_STATE of the history. */
+extern HISTORY_STATE *history_get_history_state __P((void));
+
+/* Set the state of the current history array to STATE. */
+extern void history_set_history_state __P((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 __P((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 __P((int));
+
+/* 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 __P((int, char *, histdata_t));
+
+/* Clear the history list and start over. */
+extern void clear_history __P((void));
+
+/* Stifle the history list, remembering only MAX number of entries. */
+extern void stifle_history __P((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 __P((void));
+
+/* Return 1 if the history is stifled, 0 if it is not. */
+extern int history_is_stifled __P((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 __P((void));
+
+/* Returns the number which says what history element we are now
+ looking at. */
+extern int where_history __P((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 __P((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 __P((int));
+
+/* 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 __P((void));
+
+/* Moving around the history list. */
+
+/* Set the position in the history list to POS. */
+extern int history_set_pos __P((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 __P((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 __P((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 __P((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 __P((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 __P((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 __P((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 __P((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 __P((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 __P((int, char *));
+
+/* Truncate the history file, leaving only the last NLINES lines. */
+extern int history_truncate_file __P((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 __P((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 __P((int, int, 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 __P((char *, int *, int));
+
+/* Return an array of tokens, much as the shell might. The tokens are
+ parsed out of STRING. */
+extern char **history_tokenize __P((char *));
+
+/* Exported history variables. */
+extern int history_base;
+extern int history_length;
+extern int max_input_history;
+extern char history_expansion_char;
+extern char history_subst_char;
+extern char history_comment_char;
+extern char *history_no_expand_chars;
+extern char *history_search_delimiter_chars;
+extern int history_quotes_inhibit_expansion;
+
+/* 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 Function *history_inhibit_expansion_function;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* !_HISTORY_H_ */
diff --git a/gnu/lib/libreadline/histsearch.c b/gnu/lib/libreadline/histsearch.c
new file mode 100644
index 00000000000..8d153b63edd
--- /dev/null
+++ b/gnu/lib/libreadline/histsearch.c
@@ -0,0 +1,197 @@
+/* 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
+#if defined (HAVE_STRING_H)
+# include <string.h>
+#else
+# include <strings.h>
+#endif /* !HAVE_STRING_H */
+
+#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;
+
+/* 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)
+ 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--;
+
+#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)
+ 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)
+ 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)
+ 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/gnu/lib/libreadline/input.c b/gnu/lib/libreadline/input.c
new file mode 100644
index 00000000000..64a55c6f90d
--- /dev/null
+++ b/gnu/lib/libreadline/input.c
@@ -0,0 +1,409 @@
+/* input.c -- character input functions 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>
+#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"
+
+/* 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. */
+Function *rl_event_hook = (Function *)NULL;
+
+Function *rl_getc_function = rl_getc;
+
+/* **************************************************************** */
+/* */
+/* 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. */
+static 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);
+}
+
+/* If a character is available to be read, then read it
+ and stuff it into IBUFFER. Otherwise, just return. */
+static void
+rl_gather_tyi ()
+{
+ int tty;
+ register int tem, result;
+ int chars_avail;
+ char input;
+#if defined(HAVE_SELECT)
+ fd_set readfds, exceptfds;
+ struct timeval timeout;
+#endif
+
+ 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 = 100000; /* 0.1 seconds */
+ if (select (tty + 1, &readfds, (fd_set *)NULL, &exceptfds, &timeout) <= 0)
+ return; /* Nothing to read. */
+#endif
+
+ result = -1;
+#if defined (FIONREAD)
+ result = ioctl (tty, FIONREAD, &chars_avail);
+#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;
+ }
+#endif /* O_NDELAY */
+
+ /* If there's nothing available, don't waste time trying to read
+ something. */
+ if (chars_avail <= 0)
+ return;
+
+ 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--)
+ rl_stuff_char ((*rl_getc_function) (rl_instream));
+ }
+ else
+ {
+ if (chars_avail)
+ rl_stuff_char (input);
+ }
+}
+
+/* Is there input available to be read on the readline input file
+ descriptor? Only works if the system has select(2) or FIONREAD. */
+int
+_rl_input_available ()
+{
+#if defined(HAVE_SELECT)
+ fd_set readfds, exceptfds;
+ struct timeval timeout;
+#endif
+#if 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 = 100000; /* 0.1 seconds */
+ return (select (tty + 1, &readfds, (fd_set *)NULL, &exceptfds, &timeout) > 0);
+#endif
+
+#if defined (FIONREAD)
+ if (ioctl (tty, FIONREAD, &chars_avail) == 0)
+ return (chars_avail);
+#endif
+
+ return 0;
+}
+
+void
+_rl_insert_typein (c)
+ int c;
+{
+ int key, t, i;
+ char *string;
+
+ i = key = 0;
+ string = 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;
+ }
+ 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;
+ 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_pending_input = 0;
+ }
+ 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) ();
+ rl_gather_tyi ();
+ }
+ }
+ 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)
+ {
+ 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 (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 (EOF);
+ }
+}
diff --git a/gnu/lib/libreadline/isearch.c b/gnu/lib/libreadline/isearch.c
new file mode 100644
index 00000000000..952c10ddf8e
--- /dev/null
+++ b/gnu/lib/libreadline/isearch.c
@@ -0,0 +1,442 @@
+/* **************************************************************** */
+/* */
+/* I-Search and Searching */
+/* */
+/* **************************************************************** */
+
+/* Copyright (C) 1987,1989 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 "readline.h"
+#include "history.h"
+
+#include "rlprivate.h"
+#include "xmalloc.h"
+
+/* Variables exported to other files in the readline library. */
+unsigned char *_rl_isearch_terminators = (unsigned char *)NULL;
+
+/* Variables imported from other files in the readline library. */
+extern HIST_ENTRY *saved_line_for_history;
+
+/* Forward declarations */
+static int rl_search_history __P((int, int));
+
+/* Last line found by the current incremental search, so we don't `find'
+ identical lines many times in a row. */
+static char *prev_line_found;
+
+/* 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 1 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 = 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, 0);
+ free (message);
+ (*rl_redisplay_function) ();
+}
+
+/* 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;
+{
+ /* The string that the user types in to search for. */
+ char *search_string;
+
+ /* The current length of SEARCH_STRING. */
+ int search_string_index;
+
+ /* The amount of space that SEARCH_STRING has allocated to it. */
+ int search_string_size;
+
+ /* The list of lines to search through. */
+ char **lines, *allocated_line;
+
+ /* The length of LINES. */
+ int hlen;
+
+ /* Where we get LINES from. */
+ HIST_ENTRY **hlist;
+
+ register int i;
+ int orig_point, orig_line, last_found_line;
+ int c, found, failed, sline_len;
+
+ /* The line currently being searched. */
+ char *sline;
+
+ /* Offset in that line. */
+ int line_index;
+
+ /* Non-zero if we are doing a reverse search. */
+ int reverse;
+
+ /* The list of characters which terminate the search, but are not
+ subsequently executed. If the variable isearch-terminators has
+ been set, we use that value, otherwise we use ESC and C-J. */
+ unsigned char *isearch_terminators;
+
+ orig_point = rl_point;
+ last_found_line = orig_line = where_history ();
+ reverse = direction < 0;
+ hlist = history_list ();
+ allocated_line = (char *)NULL;
+
+ isearch_terminators = _rl_isearch_terminators ? _rl_isearch_terminators
+ : (unsigned char *)"\033\012";
+
+ /* Create an arrary of pointers to the lines that we want to search. */
+ 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. */
+ lines = (char **)xmalloc ((1 + (hlen = i)) * sizeof (char *));
+ for (i = 0; i < hlen; i++)
+ lines[i] = hlist[i]->line;
+
+ if (saved_line_for_history)
+ lines[i] = saved_line_for_history->line;
+ else
+ {
+ /* Keep track of this so we can free it. */
+ allocated_line = xmalloc (1 + strlen (rl_line_buffer));
+ strcpy (allocated_line, &rl_line_buffer[0]);
+ lines[i] = allocated_line;
+ }
+
+ hlen++;
+
+ /* The line where we start the search. */
+ i = orig_line;
+
+ rl_save_prompt ();
+
+ /* Initialize search parameters. */
+ search_string = xmalloc (search_string_size = 128);
+ *search_string = '\0';
+ search_string_index = 0;
+ prev_line_found = (char *)0; /* XXX */
+
+ /* Normalize DIRECTION into 1 or -1. */
+ direction = (direction >= 0) ? 1 : -1;
+
+ rl_display_search (search_string, reverse, -1);
+
+ sline = rl_line_buffer;
+ sline_len = strlen (sline);
+ line_index = rl_point;
+
+ found = failed = 0;
+ for (;;)
+ {
+ Function *f = (Function *)NULL;
+
+ /* Read a key and decide how to proceed. */
+ c = rl_read_key ();
+
+ if (_rl_keymap[c].type == ISFUNC)
+ {
+ f = _rl_keymap[c].function;
+
+ if (f == rl_reverse_search_history)
+ c = reverse ? -1 : -2;
+ else if (f == rl_forward_search_history)
+ c = !reverse ? -1 : -2;
+ }
+
+#if 0
+ /* Let NEWLINE (^J) terminate the search for people who don't like
+ using ESC. ^M can still be used to terminate the search and
+ immediately execute the command. */
+ if (c == ESC || c == NEWLINE)
+#else
+ /* 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 (isearch_terminators, c))
+#endif
+ {
+ /* 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. */
+ if (c == ESC && _rl_input_available ()) /* XXX */
+ rl_execute_next (ESC);
+ break;
+ }
+
+ if (c >= 0 && (CTRL_CHAR (c) || META_CHAR (c) || c == RUBOUT) && c != CTRL ('G'))
+ {
+ rl_execute_next (c);
+ break;
+ }
+
+ switch (c)
+ {
+ case -1:
+ if (search_string_index == 0)
+ continue;
+ else if (reverse)
+ --line_index;
+ else if (line_index != sline_len)
+ ++line_index;
+ else
+ ding ();
+ break;
+
+ /* switch directions */
+ case -2:
+ direction = -direction;
+ reverse = direction < 0;
+ break;
+
+ case CTRL ('G'):
+ strcpy (rl_line_buffer, lines[orig_line]);
+ rl_point = orig_point;
+ rl_end = strlen (rl_line_buffer);
+ rl_restore_prompt();
+ rl_clear_message ();
+ if (allocated_line)
+ free (allocated_line);
+ free (lines);
+ return 0;
+
+#if 0
+ /* delete character from search string. */
+ case -3:
+ if (search_string_index == 0)
+ ding ();
+ else
+ {
+ search_string[--search_string_index] = '\0';
+ /* 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. */
+ }
+ break;
+#endif
+
+ default:
+ /* Add character to search string and continue search. */
+ if (search_string_index + 2 >= search_string_size)
+ {
+ search_string_size += 128;
+ search_string = xrealloc (search_string, search_string_size);
+ }
+ search_string[search_string_index++] = c;
+ search_string[search_string_index] = '\0';
+ break;
+ }
+
+ for (found = failed = 0;;)
+ {
+ int limit = sline_len - search_string_index + 1;
+
+ /* Search the current line. */
+ while (reverse ? (line_index >= 0) : (line_index < limit))
+ {
+ if (STREQN (search_string, sline + line_index, search_string_index))
+ {
+ found++;
+ break;
+ }
+ else
+ line_index += direction;
+ }
+ if (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. */
+ i += direction;
+
+ /* At limit for direction? */
+ if (reverse ? (i < 0) : (i == hlen))
+ {
+ failed++;
+ break;
+ }
+
+ /* We will need these later. */
+ sline = lines[i];
+ sline_len = strlen (sline);
+ }
+ while ((prev_line_found && STREQ (prev_line_found, lines[i])) ||
+ (search_string_index > sline_len));
+
+ if (failed)
+ break;
+
+ /* Now set up the line for searching... */
+ line_index = reverse ? sline_len - search_string_index : 0;
+ }
+
+ if (failed)
+ {
+ /* We cannot find the search string. Ding the bell. */
+ ding ();
+ i = last_found_line;
+ continue; /* XXX - was break */
+ }
+
+ /* 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 (found)
+ {
+ int line_len;
+
+ prev_line_found = lines[i];
+ line_len = strlen (lines[i]);
+
+ if (line_len >= rl_line_buffer_len)
+ rl_extend_line_buffer (line_len);
+
+ strcpy (rl_line_buffer, lines[i]);
+ rl_point = line_index;
+ rl_end = line_len;
+ last_found_line = i;
+ rl_display_search (search_string, reverse, (i == orig_line) ? -1 : i);
+ }
+ }
+
+ /* 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. */
+
+ /* First put back the original state. */
+ strcpy (rl_line_buffer, lines[orig_line]);
+
+ rl_restore_prompt ();
+
+ /* Free the search string. */
+ free (search_string);
+
+ if (last_found_line < orig_line)
+ rl_get_previous_history (orig_line - last_found_line, 0);
+ else
+ rl_get_next_history (last_found_line - orig_line, 0);
+
+ /* If the string was not found, put point at the end of the line. */
+ if (line_index < 0)
+ line_index = strlen (rl_line_buffer);
+ rl_point = line_index;
+ rl_clear_message ();
+
+ if (allocated_line)
+ free (allocated_line);
+ free (lines);
+
+ return 0;
+}
diff --git a/gnu/lib/libreadline/keymaps.c b/gnu/lib/libreadline/keymaps.c
new file mode 100644
index 00000000000..8fb7de3bc1f
--- /dev/null
+++ b/gnu/lib/libreadline/keymaps.c
@@ -0,0 +1,150 @@
+/* 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 = (Function *)NULL;
+ }
+
+ for (i = 'A'; i < ('Z' + 1); i++)
+ {
+ keymap[i].type = ISFUNC;
+ keymap[i].function = rl_do_lowercase_version;
+ }
+
+ return (keymap);
+}
+
+/* Return a new keymap which is a copy of MAP. */
+Keymap
+rl_copy_keymap (map)
+ Keymap map;
+{
+ register int i;
+ Keymap 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 some 8-bit character sets. */
+ for (i = 128; i < 160; i++)
+ newmap[i].function = rl_insert;
+
+ /* ISO Latin-1 printing characters should self-insert. */
+ for (i = 160; 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/gnu/lib/libreadline/keymaps.h b/gnu/lib/libreadline/keymaps.h
new file mode 100644
index 00000000000..3a504fb014f
--- /dev/null
+++ b/gnu/lib/libreadline/keymaps.h
@@ -0,0 +1,108 @@
+/* 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"
+#else
+# include <readline/rlstdc.h>
+# include <readline/chardefs.h>
+#endif
+
+#if !defined (_FUNCTION_DEF)
+# define _FUNCTION_DEF
+typedef int Function ();
+typedef void VFunction ();
+typedef char *CPFunction ();
+typedef char **CPPFunction ();
+#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;
+ Function *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). */
+#define KEYMAP_SIZE 256
+
+/* I wanted to make the above structure contain a union of:
+ union { Function *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 __P((void));
+
+/* Return a new keymap which is a copy of MAP. */
+extern Keymap rl_copy_keymap __P((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 __P((void));
+
+/* Free the storage associated with a keymap. */
+extern void rl_discard_keymap __P((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 __P((char *));
+
+/* Return the current keymap. */
+extern Keymap rl_get_keymap __P((void));
+
+/* Set the current keymap to MAP. */
+extern void rl_set_keymap __P((Keymap));
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _KEYMAPS_H_ */
diff --git a/gnu/lib/libreadline/kill.c b/gnu/lib/libreadline/kill.c
new file mode 100644
index 00000000000..c3241bdadd0
--- /dev/null
+++ b/gnu/lib/libreadline/kill.c
@@ -0,0 +1,628 @@
+/* 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;
+
+/* 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 = 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 = rl_point;
+
+ if (count < 0)
+ return (rl_backward_kill_word (-count, key));
+ else
+ {
+ rl_forward_word (count, key);
+
+ if (rl_point != orig_point)
+ rl_kill_text (orig_point, rl_point);
+
+ rl_point = orig_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 = rl_point;
+
+ if (count < 0)
+ return (rl_kill_word (-count, ignore));
+ else
+ {
+ rl_backward_word (count, ignore);
+
+ if (rl_point != orig_point)
+ rl_kill_text (orig_point, 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 = rl_point;
+
+ if (direction < 0)
+ return (rl_backward_kill_line (1, ignore));
+ else
+ {
+ rl_end_of_line (1, ignore);
+ if (orig_point != rl_point)
+ rl_kill_text (orig_point, rl_point);
+ rl_point = orig_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 = rl_point;
+
+ if (direction < 0)
+ return (rl_kill_line (1, ignore));
+ else
+ {
+ if (!rl_point)
+ ding ();
+ else
+ {
+ rl_beg_of_line (1, ignore);
+ rl_kill_text (orig_point, 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_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)
+ 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);
+ }
+ 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)
+ ding ();
+ else
+ {
+ rl_kill_text (rl_point, 0);
+ rl_point = 0;
+ }
+ 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)
+ {
+ _rl_last_command_was_kill++;
+ return 0;
+ }
+
+ 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)
+ {
+ ding ();
+ return -1;
+ }
+
+ arg = history_arg_extract (count, count, entry->line);
+ if (!arg || !*arg)
+ {
+ ding ();
+ return -1;
+ }
+
+ rl_begin_undo_group ();
+
+#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 (__CYGWIN32__)
+#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 = xmalloc (len + 1);
+ ptr[len] = '\0';
+ strncpy (ptr, data, len);
+ }
+ else
+ ptr = data;
+ rl_insert_text (ptr);
+ if (ptr != data)
+ free (ptr);
+ CloseClipboard ();
+ }
+ return (0);
+}
+#endif /* __CYGWIN32__ */
diff --git a/gnu/lib/libreadline/macro.c b/gnu/lib/libreadline/macro.c
new file mode 100644
index 00000000000..5a44852f46c
--- /dev/null
+++ b/gnu/lib/libreadline/macro.c
@@ -0,0 +1,268 @@
+/* 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"
+
+#define SWAP(s, e) do { int t; t = s; s = e; e = t; } while (0)
+
+/* **************************************************************** */
+/* */
+/* Hacking Keyboard Macros */
+/* */
+/* **************************************************************** */
+
+/* Non-zero means to save keys that we dispatch on in a kbd macro. */
+int _rl_defining_kbd_macro = 0;
+
+/* 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;
+}
+
+/* Return the next character available from a macro, or 0 if
+ there are no macro characters. */
+int
+_rl_next_macro_key ()
+{
+ if (_rl_executing_macro == 0)
+ return (0);
+
+ if (_rl_executing_macro[executing_macro_index] == 0)
+ {
+ _rl_pop_executing_macro ();
+ return (_rl_next_macro_key ());
+ }
+
+ return (_rl_executing_macro[executing_macro_index++]);
+}
+
+/* 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;
+
+ if (_rl_executing_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);
+ }
+}
+
+/* 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 = xmalloc (current_macro_size = 25);
+ else
+ current_macro = 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;
+
+ if (_rl_executing_macro)
+ {
+ free (_rl_executing_macro);
+ _rl_executing_macro = (char *) NULL;
+ }
+ executing_macro_index = 0;
+
+ _rl_defining_kbd_macro = 0;
+}
+
+/* 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_defining_kbd_macro)
+ {
+ _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_defining_kbd_macro = 1;
+ 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_defining_kbd_macro == 0)
+ {
+ _rl_abort_internal ();
+ return -1;
+ }
+
+ current_macro_index -= rl_key_sequence_length - 1;
+ current_macro[current_macro_index] = '\0';
+
+ _rl_defining_kbd_macro = 0;
+
+ 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_defining_kbd_macro)
+ {
+ 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/gnu/lib/libreadline/nls.c b/gnu/lib/libreadline/nls.c
new file mode 100644
index 00000000000..67bed8a6fa4
--- /dev/null
+++ b/gnu/lib/libreadline/nls.c
@@ -0,0 +1,225 @@
+/* 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 __P((char *));
+static char *find_codeset __P((char *, size_t *));
+#endif /* !HAVE_SETLOCALE */
+
+/* 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 *t;
+
+ /* Set the LC_CTYPE locale category from environment variables. */
+ t = setlocale (LC_CTYPE, "");
+ 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 = get_env_value ("LC_ALL");
+ if (lspec == 0) lspec = get_env_value ("LC_CTYPE");
+ if (lspec == 0) lspec = get_env_value ("LANG");
+ 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 (codeset[i]))
+ {
+ len++;
+ all_digits &= isdigit (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 (codeset[i]))
+ *wp++ = (isupper (codeset[i])) ? tolower (codeset[i]) : codeset[i];
+ else if (isdigit (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/gnu/lib/libreadline/parens.c b/gnu/lib/libreadline/parens.c
new file mode 100644
index 00000000000..b6de529f1a0
--- /dev/null
+++ b/gnu/lib/libreadline/parens.c
@@ -0,0 +1,161 @@
+/* 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
+
+#include "rlconf.h"
+
+#if defined (HAVE_CONFIG_H)
+# include <config.h>
+#endif
+
+#include <stdio.h>
+#include <sys/types.h>
+
+#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 __P((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 */
+
+/* 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_insert_close (count, invoking_key)
+ int count, invoking_key;
+{
+ if (rl_explicit_arg || !rl_blink_matching_paren)
+ rl_insert (count, invoking_key);
+ else
+ {
+#if defined (HAVE_SELECT)
+ int orig_point, match_point, ready;
+ struct timeval timer;
+ fd_set readfds;
+
+ rl_insert (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 = 500000;
+
+ 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 (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/gnu/lib/libreadline/posixdir.h b/gnu/lib/libreadline/posixdir.h
new file mode 100644
index 00000000000..98ced75b346
--- /dev/null
+++ b/gnu/lib/libreadline/posixdir.h
@@ -0,0 +1,49 @@
+/* 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>
+# define D_NAMLEN(d) (strlen ((d)->d_name))
+#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 (STRUCT_DIRENT_HAS_D_INO) && !defined (STRUCT_DIRENT_HAS_D_FILENO)
+# define d_fileno d_ino
+#endif
+
+#endif /* !_POSIXDIR_H_ */
diff --git a/gnu/lib/libreadline/posixjmp.h b/gnu/lib/libreadline/posixjmp.h
new file mode 100644
index 00000000000..b52aa00332b
--- /dev/null
+++ b/gnu/lib/libreadline/posixjmp.h
@@ -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/gnu/lib/libreadline/posixstat.h b/gnu/lib/libreadline/posixstat.h
new file mode 100644
index 00000000000..c93b52887e9
--- /dev/null
+++ b/gnu/lib/libreadline/posixstat.h
@@ -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/gnu/lib/libreadline/readline.c b/gnu/lib/libreadline/readline.c
new file mode 100644
index 00000000000..2c6aef68f48
--- /dev/null
+++ b/gnu/lib/libreadline/readline.c
@@ -0,0 +1,2089 @@
+/* readline.c -- a general facility for reading lines of input
+ with emacs style editing and completion. */
+
+/* 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
+
+#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"
+
+/* System-specific feature definitions and include files. */
+#include "rldefs.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 "4.1"
+#endif
+
+/* Evaluates its arguments multiple times. */
+#define SWAP(s, e) do { int t; t = s; s = e; e = t; } while (0)
+
+/* Forward declarations used in this file. */
+void _rl_free_history_entry __P((HIST_ENTRY *));
+
+static char *readline_internal __P((void));
+static void readline_initialize_everything __P((void));
+static void start_using_history __P((void));
+static void bind_arrow_keys __P((void));
+static int rl_change_case __P((int, int));
+
+static void readline_default_bindings __P((void));
+
+/* **************************************************************** */
+/* */
+/* Line editing input utility */
+/* */
+/* **************************************************************** */
+
+char *rl_library_version = RL_LIBRARY_VERSION;
+
+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;
+
+/* 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 non-zero, this program is running in an EMACS buffer. */
+static int running_in_emacs;
+
+/* 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. */
+Function *rl_last_func = (Function *)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. */
+int readline_echoing_p = 1;
+
+/* Current prompt. */
+char *rl_prompt;
+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. */
+Function *rl_startup_hook = (Function *)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. */
+Function *rl_pre_input_hook = (Function *)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. */
+char *rl_terminal_name = (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;
+
+/* 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;
+
+/* Forward declarations used by the display and termcap 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;
+
+/* **************************************************************** */
+/* */
+/* Top Level Functions */
+/* */
+/* **************************************************************** */
+
+/* Non-zero means treat 0200 bit in terminal input as Meta bit. */
+int _rl_meta_flag = 0; /* Forward declaration */
+
+/* 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)
+ char *prompt;
+{
+ char *value;
+
+ rl_prompt = prompt;
+
+ /* If we are at EOF return a NULL string. */
+ if (rl_pending_input == EOF)
+ {
+ rl_pending_input = 0;
+ return ((char *)NULL);
+ }
+
+ rl_visible_prompt_length = rl_expand_prompt (rl_prompt);
+
+ rl_initialize ();
+ (*rl_prep_term_function) (_rl_meta_flag);
+
+#if defined (HANDLE_SIGNALS)
+ rl_set_signals ();
+#endif
+
+ value = readline_internal ();
+ (*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 (readline_echoing_p == 0)
+ {
+ 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, 0);
+#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)
+ free_undo_list ();
+
+ return (eof ? (char *)NULL : savestring (the_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) ();
+
+ if (rl_pending_input == 0)
+ {
+ /* Then initialize the argument and number of keys read. */
+ _rl_init_argument ();
+ rl_key_sequence_length = 0;
+ }
+
+ c = rl_read_key ();
+
+ /* 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)
+ 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;
+
+#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_newline (1, '\n');
+ }
+
+ if (rl_done == 0)
+ (*rl_redisplay_function) ();
+
+ /* 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 ();
+
+#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 = 0;
+ the_line = rl_line_buffer;
+ the_line[0] = 0;
+}
+
+void
+_rl_set_the_line ()
+{
+ the_line = rl_line_buffer;
+}
+
+/* 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;
+{
+ int r, newkey;
+ char *macro;
+ Function *func;
+
+ if (META_CHAR (key) && _rl_convert_meta_chars_to_ascii)
+ {
+ if (map[ESC].type == ISKMAP)
+ {
+ if (_rl_defining_kbd_macro)
+ _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
+ ding ();
+ return 0;
+ }
+
+ if (_rl_defining_kbd_macro)
+ _rl_add_macro_char (key);
+
+ r = 0;
+ switch (map[key].type)
+ {
+ case ISFUNC:
+ func = map[key].function;
+ if (func != (Function *)NULL)
+ {
+ /* Special case rl_do_lowercase_version (). */
+ if (func == rl_do_lowercase_version)
+ return (_rl_dispatch (_rl_to_lower (key), map));
+
+ rl_executing_keymap = map;
+
+#if 0
+ _rl_suppress_redisplay = (map[key].function == rl_insert) && _rl_input_available ();
+#endif
+
+ rl_dispatching = 1;
+ r = (*map[key].function)(rl_numeric_arg * rl_arg_sign, key);
+ 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 && map[key].function != rl_digit_argument)
+ rl_last_func = map[key].function;
+ }
+ else
+ {
+ _rl_abort_internal ();
+ return -1;
+ }
+ break;
+
+ case ISKMAP:
+ if (map[key].function != (Function *)NULL)
+ {
+ rl_key_sequence_length++;
+ newkey = rl_read_key ();
+ r = _rl_dispatch (newkey, FUNCTION_TO_KEYMAP (map, key));
+ }
+ else
+ {
+ _rl_abort_internal ();
+ return -1;
+ }
+ break;
+
+ case ISMACR:
+ if (map[key].function != (Function *)NULL)
+ {
+ 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 &&
+ _rl_vi_textmod_command (key))
+ _rl_vi_set_last (key, rl_numeric_arg, rl_arg_sign);
+#endif
+ 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)
+ {
+ readline_initialize_everything ();
+ rl_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;
+
+ /* Tell the history routines what is going on. */
+ 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 = (Function *)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
+
+ 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
+
+ /* Find out if we are running in Emacs. */
+ running_in_emacs = get_env_value ("EMACS") != (char *)0;
+
+ /* 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 = xmalloc (rl_line_buffer_len = DEFAULT_BUFFER_SIZE);
+
+ /* Initialize the terminal interface. */
+ _rl_init_terminal_io ((char *)NULL);
+
+ /* 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)
+ {
+ screenwidth--;
+ screenchars -= 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 = 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 ()
+{
+ rltty_set_default_bindings (_rl_keymap);
+}
+
+static void
+bind_arrow_keys_internal ()
+{
+ Function *f;
+
+#if defined (__MSDOS__)
+ f = rl_function_of_keyseq ("\033[0A", _rl_keymap, (int *)NULL);
+ if (!f || f == rl_do_lowercase_version)
+ {
+ _rl_bind_if_unbound ("\033[0A", rl_get_previous_history);
+ _rl_bind_if_unbound ("\033[0B", rl_backward);
+ _rl_bind_if_unbound ("\033[0C", rl_forward);
+ _rl_bind_if_unbound ("\033[0D", rl_get_next_history);
+ }
+#endif
+
+ f = rl_function_of_keyseq ("\033[A", _rl_keymap, (int *)NULL);
+ if (!f || f == rl_do_lowercase_version)
+ {
+ _rl_bind_if_unbound ("\033[A", rl_get_previous_history);
+ _rl_bind_if_unbound ("\033[B", rl_get_next_history);
+ _rl_bind_if_unbound ("\033[C", rl_forward);
+ _rl_bind_if_unbound ("\033[D", rl_backward);
+ }
+
+ f = rl_function_of_keyseq ("\033OA", _rl_keymap, (int *)NULL);
+ if (!f || f == rl_do_lowercase_version)
+ {
+ _rl_bind_if_unbound ("\033OA", rl_get_previous_history);
+ _rl_bind_if_unbound ("\033OB", rl_get_next_history);
+ _rl_bind_if_unbound ("\033OC", rl_forward);
+ _rl_bind_if_unbound ("\033OD", rl_backward);
+ }
+}
+
+/* Try and bind the common arrow key prefix 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 ()
+{
+ Keymap xkeymap;
+
+ xkeymap = _rl_keymap;
+
+ _rl_keymap = emacs_standard_keymap;
+ bind_arrow_keys_internal ();
+
+#if defined (VI_MODE)
+ _rl_keymap = vi_movement_keymap;
+ bind_arrow_keys_internal ();
+#endif
+
+ _rl_keymap = xkeymap;
+}
+
+
+/* **************************************************************** */
+/* */
+/* Numeric Arguments */
+/* */
+/* **************************************************************** */
+
+/* Handle C-u style numeric args, as well as M--, and M-digits. */
+static int
+rl_digit_loop ()
+{
+ int key, c, sawminus, sawdigits;
+
+ rl_save_prompt ();
+
+ sawminus = sawdigits = 0;
+ while (1)
+ {
+ if (rl_numeric_arg > 1000000)
+ {
+ sawdigits = rl_explicit_arg = rl_numeric_arg = 0;
+ ding ();
+ rl_restore_prompt ();
+ rl_clear_message ();
+ return 1;
+ }
+ rl_message ("(arg: %d) ", rl_arg_sign * rl_numeric_arg);
+ key = c = rl_read_key ();
+
+ /* 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 (sawdigits == 0)
+ {
+ rl_numeric_arg *= 4;
+ continue;
+ }
+ else
+ {
+ key = rl_read_key ();
+ rl_restore_prompt ();
+ rl_clear_message ();
+ return (_rl_dispatch (key, _rl_keymap));
+ }
+ }
+
+ c = UNMETA (c);
+
+ if (_rl_digit_p (c))
+ {
+ rl_numeric_arg = rl_explicit_arg ? (rl_numeric_arg * 10) + c - '0' : c - '0';
+ sawdigits = rl_explicit_arg = 1;
+ }
+ else if (c == '-' && rl_explicit_arg == 0)
+ {
+ rl_numeric_arg = sawminus = 1;
+ rl_arg_sign = -1;
+ }
+ else
+ {
+ /* Make M-- command equivalent to M--1 command. */
+ if (sawminus && rl_numeric_arg == 1 && rl_explicit_arg == 0)
+ rl_explicit_arg = 1;
+ rl_restore_prompt ();
+ rl_clear_message ();
+ return (_rl_dispatch (key, _rl_keymap));
+ }
+ }
+
+ return 0;
+}
+
+/* Add the current digit to the argument in progress. */
+int
+rl_digit_argument (ignore, key)
+ int ignore, key;
+{
+ rl_pending_input = key;
+ return (rl_digit_loop ());
+}
+
+/* What to do when you abort reading an argument. */
+int
+rl_discard_argument ()
+{
+ ding ();
+ rl_clear_message ();
+ _rl_init_argument ();
+ return 0;
+}
+
+/* Create a default argument. */
+int
+_rl_init_argument ()
+{
+ rl_numeric_arg = rl_arg_sign = 1;
+ rl_explicit_arg = 0;
+ return 0;
+}
+
+/* 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_numeric_arg *= 4;
+ return (rl_digit_loop ());
+}
+
+/* **************************************************************** */
+/* */
+/* 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 () calls this
+ function. */
+int
+rl_insert_text (string)
+ char *string;
+{
+ register int i, l = strlen (string);
+
+ if (rl_end + l >= rl_line_buffer_len)
+ rl_extend_line_buffer (rl_end + l);
+
+ for (i = rl_end; i >= rl_point; i--)
+ the_line[i + l] = the_line[i];
+ strncpy (the_line + rl_point, string, l);
+
+ /* Remember how to undo this if we aren't undoing something. */
+ if (!_rl_doing_an_undo)
+ {
+ /* 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;
+ the_line[rl_end] = '\0';
+ return l;
+}
+
+/* Delete the string between FROM and TO. FROM is
+ inclusive, TO is not. */
+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;
+ }
+
+ 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++)
+ the_line[i] = the_line[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;
+ the_line[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
+
+void
+_rl_replace_text (text, start, end)
+ char *text;
+ int start, end;
+{
+ rl_begin_undo_group ();
+ rl_delete_text (start, end + 1);
+ rl_point = start;
+ rl_insert_text (text);
+ rl_end_undo_group ();
+}
+
+/* **************************************************************** */
+/* */
+/* 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 characters. */
+int
+rl_forward (count, key)
+ int count, key;
+{
+ if (count < 0)
+ rl_backward (-count, key);
+ else if (count > 0)
+ {
+ int end = rl_point + count;
+#if defined (VI_MODE)
+ int lend = rl_end - (rl_editing_mode == vi_mode);
+#else
+ int lend = rl_end;
+#endif
+
+ if (end > lend)
+ {
+ rl_point = lend;
+ ding ();
+ }
+ else
+ rl_point = end;
+ }
+
+ if (rl_end < 0)
+ rl_end = 0;
+
+ return 0;
+}
+
+/* Move backward COUNT characters. */
+int
+rl_backward (count, key)
+ int count, key;
+{
+ if (count < 0)
+ rl_forward (-count, key);
+ else if (count > 0)
+ {
+ if (rl_point < count)
+ {
+ rl_point = 0;
+ ding ();
+ }
+ else
+ rl_point -= count;
+ }
+ return 0;
+}
+
+/* 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. */
+int
+rl_forward_word (count, key)
+ int count, key;
+{
+ int c;
+
+ if (count < 0)
+ {
+ rl_backward_word (-count, key);
+ return 0;
+ }
+
+ 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 = the_line[rl_point];
+ if (alphabetic (c) == 0)
+ {
+ while (++rl_point < rl_end)
+ {
+ c = the_line[rl_point];
+ if (alphabetic (c))
+ break;
+ }
+ }
+ if (rl_point == rl_end)
+ return 0;
+ while (++rl_point < rl_end)
+ {
+ c = the_line[rl_point];
+ if (alphabetic (c) == 0)
+ break;
+ }
+ --count;
+ }
+ return 0;
+}
+
+/* Move backward a word. We do what Emacs does. */
+int
+rl_backward_word (count, key)
+ int count, key;
+{
+ int c;
+
+ if (count < 0)
+ {
+ rl_forward_word (-count, key);
+ return 0;
+ }
+
+ while (count)
+ {
+ if (!rl_point)
+ return 0;
+
+ /* Like rl_forward_word (), except that we look at the characters
+ just before point. */
+
+ c = the_line[rl_point - 1];
+ if (alphabetic (c) == 0)
+ {
+ while (--rl_point)
+ {
+ c = the_line[rl_point - 1];
+ if (alphabetic (c))
+ break;
+ }
+ }
+
+ while (rl_point)
+ {
+ c = the_line[rl_point - 1];
+ if (alphabetic (c) == 0)
+ break;
+ else
+ --rl_point;
+ }
+ --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, the_line); /* 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;
+
+ ch = rl_read_key ();
+
+ 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':
+ rl_forward (count, ch);
+ break;
+
+ case 'D':
+ rl_backward (count, ch);
+ break;
+
+ default:
+ ding ();
+ }
+ return 0;
+}
+
+
+/* **************************************************************** */
+/* */
+/* Text commands */
+/* */
+/* **************************************************************** */
+
+/* Insert the character C at the current location, moving point forward. */
+int
+rl_insert (count, c)
+ int count, c;
+{
+ register int i;
+ char *string;
+
+ if (count <= 0)
+ return 0;
+
+ /* If we can optimize, then do it. But don't let people crash
+ readline because of extra large arguments. */
+ if (count > 1 && count <= 1024)
+ {
+ string = xmalloc (1 + count);
+
+ for (i = 0; i < count; i++)
+ string[i] = c;
+
+ string[i] = '\0';
+ rl_insert_text (string);
+ free (string);
+
+ return 0;
+ }
+
+ if (count > 1024)
+ {
+ int decreaser;
+ 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;
+ }
+
+ return 0;
+ }
+
+ /* 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);
+ }
+ return 0;
+}
+
+/* Insert the next typed character verbatim. */
+int
+rl_quoted_insert (count, key)
+ int count, key;
+{
+ int c;
+
+#if defined (HANDLE_SIGNALS)
+ _rl_disable_tty_signals ();
+#endif
+ c = rl_read_key ();
+#if defined (HANDLE_SIGNALS)
+ _rl_restore_tty_signals ();
+#endif
+
+ return (rl_insert (count, c));
+}
+
+/* Insert a tab character. */
+int
+rl_tab_insert (count, key)
+ int count, key;
+{
+ return (rl_insert (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 defined (VI_MODE)
+ if (rl_editing_mode == vi_mode)
+ {
+ _rl_vi_done_inserting ();
+ _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 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;
+}
+
+/* Rubout the character behind point. */
+int
+rl_rubout (count, key)
+ int count, key;
+{
+ if (count < 0)
+ {
+ rl_delete (-count, key);
+ return 0;
+ }
+
+ if (!rl_point)
+ {
+ ding ();
+ return -1;
+ }
+
+ if (count > 1 || rl_explicit_arg)
+ {
+ int orig_point = rl_point;
+ rl_backward (count, key);
+ rl_kill_text (orig_point, rl_point);
+ }
+ else
+ {
+ int c = the_line[--rl_point];
+ rl_delete_text (rl_point, rl_point + 1);
+
+ 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);
+ }
+ }
+ 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;
+{
+ if (count < 0)
+ return (rl_rubout (-count, key));
+
+ if (rl_point == rl_end)
+ {
+ ding ();
+ return -1;
+ }
+
+ if (count > 1 || rl_explicit_arg)
+ {
+ int orig_point = rl_point;
+ rl_forward (count, key);
+ rl_kill_text (orig_point, rl_point);
+ rl_point = orig_point;
+ return 0;
+ }
+ else
+ return (rl_delete_text (rl_point, rl_point + 1));
+}
+
+/* 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 (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 (the_line[rl_point - 1]))
+ rl_point--;
+
+ start = rl_point;
+
+ while (rl_point < rl_end && whitespace (the_line[rl_point]))
+ rl_point++;
+
+ if (start != rl_point)
+ {
+ rl_delete_text (start, rl_point);
+ rl_point = start;
+ }
+ 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;
+{
+ rl_beg_of_line (1, key);
+ rl_insert_text (_rl_comment_begin ? _rl_comment_begin
+ : RL_COMMENT_BEGIN_DEFAULT);
+ (*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;
+{
+ register int start, end;
+ int inword, c;
+
+ start = rl_point;
+ rl_forward_word (count, 0);
+ end = rl_point;
+
+ if (count < 0)
+ SWAP (start, end);
+
+ /* We are going to modify some text, so let's prepare to undo it. */
+ rl_modifying (start, end);
+
+ for (inword = 0; start < end; start++)
+ {
+ c = the_line[start];
+ switch (op)
+ {
+ case UpCase:
+ the_line[start] = _rl_to_upper (c);
+ break;
+
+ case DownCase:
+ the_line[start] = _rl_to_lower (c);
+ break;
+
+ case CapCase:
+ the_line[start] = (inword == 0) ? _rl_to_upper (c) : _rl_to_lower (c);
+ inword = alphabetic (the_line[start]);
+ break;
+
+ default:
+ ding ();
+ return -1;
+ }
+ }
+ rl_point = end;
+ return 0;
+}
+
+/* **************************************************************** */
+/* */
+/* Transposition */
+/* */
+/* **************************************************************** */
+
+/* Transpose the words at 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))
+ {
+ 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;
+{
+ char dummy[2];
+
+ if (!count)
+ return 0;
+
+ if (!rl_point || rl_end < 2)
+ {
+ ding ();
+ return -1;
+ }
+
+ rl_begin_undo_group ();
+
+ if (rl_point == rl_end)
+ {
+ --rl_point;
+ count = 1;
+ }
+ rl_point--;
+
+ dummy[0] = the_line[rl_point];
+ dummy[1] = '\0';
+
+ rl_delete_text (rl_point, rl_point + 1);
+
+ rl_point += count;
+ _rl_fix_point (0);
+ rl_insert_text (dummy);
+
+ rl_end_undo_group ();
+ return 0;
+}
+
+/* **************************************************************** */
+/* */
+/* Character Searching */
+/* */
+/* **************************************************************** */
+
+int
+_rl_char_search_internal (count, dir, schar)
+ int count, dir, schar;
+{
+ int pos, inc;
+
+ pos = rl_point;
+ inc = (dir < 0) ? -1 : 1;
+ while (count)
+ {
+ if ((dir < 0 && pos <= 0) || (dir > 0 && pos >= rl_end))
+ {
+ ding ();
+ return -1;
+ }
+
+ pos += inc;
+ do
+ {
+ if (rl_line_buffer[pos] == schar)
+ {
+ count--;
+ if (dir < 0)
+ rl_point = (dir == BTO) ? pos + 1 : pos;
+ else
+ rl_point = (dir == FTO) ? pos - 1 : pos;
+ break;
+ }
+ }
+ while ((dir < 0) ? pos-- : ++pos < rl_end);
+ }
+ 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. */
+static int
+_rl_char_search (count, fdir, bdir)
+ int count, fdir, bdir;
+{
+ int c;
+
+ c = rl_read_key ();
+ if (count < 0)
+ return (_rl_char_search_internal (-count, bdir, c));
+ else
+ return (_rl_char_search_internal (count, fdir, c));
+}
+
+int
+rl_char_search (count, key)
+ int count, key;
+{
+ return (_rl_char_search (count, FFIND, BFIND));
+}
+
+int
+rl_backward_char_search (count, key)
+ int count, key;
+{
+ return (_rl_char_search (count, BFIND, FFIND));
+}
+
+/* **************************************************************** */
+/* */
+/* 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 *saved_line_for_history = (HIST_ENTRY *)NULL;
+
+/* Set the history pointer back to the last entry in the history. */
+static void
+start_using_history ()
+{
+ using_history ();
+ if (saved_line_for_history)
+ _rl_free_history_entry (saved_line_for_history);
+
+ 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;
+ if (entry->line)
+ free (entry->line);
+ free (entry);
+}
+
+/* Perhaps put back the current line if it has changed. */
+int
+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 (), the_line, (histdata_t)rl_undo_list);
+ free (temp->line);
+ free (temp);
+ }
+ return 0;
+}
+
+/* Put back the saved_line_for_history if there is one. */
+int
+maybe_unsave_line ()
+{
+ int line_len;
+
+ if (saved_line_for_history)
+ {
+ line_len = strlen (saved_line_for_history->line);
+
+ if (line_len >= rl_line_buffer_len)
+ rl_extend_line_buffer (line_len);
+
+ strcpy (the_line, saved_line_for_history->line);
+ rl_undo_list = (UNDO_LIST *)saved_line_for_history->data;
+ _rl_free_history_entry (saved_line_for_history);
+ saved_line_for_history = (HIST_ENTRY *)NULL;
+ rl_end = rl_point = strlen (the_line);
+ }
+ else
+ ding ();
+ return 0;
+}
+
+/* Save the current line in saved_line_for_history. */
+int
+maybe_save_line ()
+{
+ if (saved_line_for_history == 0)
+ {
+ saved_line_for_history = (HIST_ENTRY *)xmalloc (sizeof (HIST_ENTRY));
+ saved_line_for_history->line = savestring (the_line);
+ saved_line_for_history->data = (char *)rl_undo_list;
+ }
+ return 0;
+}
+
+/* **************************************************************** */
+/* */
+/* 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;
+{
+ maybe_replace_line ();
+ using_history ();
+ 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;
+ int line_len;
+
+ if (count < 0)
+ return (rl_get_previous_history (-count, key));
+
+ if (count == 0)
+ return 0;
+
+ maybe_replace_line ();
+
+ temp = (HIST_ENTRY *)NULL;
+ while (count)
+ {
+ temp = next_history ();
+ if (!temp)
+ break;
+ --count;
+ }
+
+ if (temp == 0)
+ maybe_unsave_line ();
+ else
+ {
+ line_len = strlen (temp->line);
+
+ if (line_len >= rl_line_buffer_len)
+ rl_extend_line_buffer (line_len);
+
+ strcpy (the_line, temp->line);
+ rl_undo_list = (UNDO_LIST *)temp->data;
+ rl_end = rl_point = strlen (the_line);
+#if defined (VI_MODE)
+ if (rl_editing_mode == vi_mode)
+ rl_point = 0;
+#endif /* VI_MODE */
+ }
+ 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;
+ int line_len;
+
+ if (count < 0)
+ return (rl_get_next_history (-count, key));
+
+ if (count == 0)
+ return 0;
+
+ /* If we don't have a line saved, then save this one. */
+ maybe_save_line ();
+
+ /* If the current line has changed, save the changes. */
+ 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)
+ ding ();
+ else
+ {
+ line_len = strlen (temp->line);
+
+ if (line_len >= rl_line_buffer_len)
+ rl_extend_line_buffer (line_len);
+
+ strcpy (the_line, temp->line);
+ rl_undo_list = (UNDO_LIST *)temp->data;
+ rl_end = rl_point = line_len;
+
+#if defined (VI_MODE)
+ if (rl_editing_mode == vi_mode)
+ rl_point = 0;
+#endif /* VI_MODE */
+ }
+ return 0;
+}
+
+/* **************************************************************** */
+/* */
+/* 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)
+ {
+ ding ();
+ return -1;
+ }
+ else
+ SWAP (rl_point, rl_mark);
+
+ 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_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_keymap = emacs_standard_keymap;
+ return 0;
+}
diff --git a/gnu/lib/libreadline/readline.h b/gnu/lib/libreadline/readline.h
new file mode 100644
index 00000000000..97c62fd1534
--- /dev/null
+++ b/gnu/lib/libreadline/readline.h
@@ -0,0 +1,634 @@
+/* Readline.h -- the names of functions callable from within 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 (_READLINE_H_)
+#define _READLINE_H_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#if defined (READLINE_LIBRARY)
+# include "rlstdc.h"
+# include "keymaps.h"
+# include "tilde.h"
+#else
+# include <readline/rlstdc.h>
+# include <readline/keymaps.h>
+# include <readline/tilde.h>
+#endif
+
+/* 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 {
+ char *name;
+ Function *function;
+} FUNMAP;
+
+extern FUNMAP **funmap;
+
+/* **************************************************************** */
+/* */
+/* Functions available to bind to key sequences */
+/* */
+/* **************************************************************** */
+
+/* Bindable commands for numeric arguments. */
+extern int rl_digit_argument __P((int, int));
+extern int rl_universal_argument __P((int, int));
+
+/* Bindable commands for moving the cursor. */
+extern int rl_forward __P((int, int));
+extern int rl_backward __P((int, int));
+extern int rl_beg_of_line __P((int, int));
+extern int rl_end_of_line __P((int, int));
+extern int rl_forward_word __P((int, int));
+extern int rl_backward_word __P((int, int));
+extern int rl_refresh_line __P((int, int));
+extern int rl_clear_screen __P((int, int));
+extern int rl_arrow_keys __P((int, int));
+
+/* Bindable commands for inserting and deleting text. */
+extern int rl_insert __P((int, int));
+extern int rl_quoted_insert __P((int, int));
+extern int rl_tab_insert __P((int, int));
+extern int rl_newline __P((int, int));
+extern int rl_do_lowercase_version __P((int, int));
+extern int rl_rubout __P((int, int));
+extern int rl_delete __P((int, int));
+extern int rl_rubout_or_delete __P((int, int));
+extern int rl_delete_horizontal_space __P((int, int));
+extern int rl_delete_or_show_completions __P((int, int));
+extern int rl_insert_comment __P((int, int));
+
+/* Bindable commands for changing case. */
+extern int rl_upcase_word __P((int, int));
+extern int rl_downcase_word __P((int, int));
+extern int rl_capitalize_word __P((int, int));
+
+/* Bindable commands for transposing characters and words. */
+extern int rl_transpose_words __P((int, int));
+extern int rl_transpose_chars __P((int, int));
+
+/* Bindable commands for searching within a line. */
+extern int rl_char_search __P((int, int));
+extern int rl_backward_char_search __P((int, int));
+
+/* Bindable commands for readline's interface to the command history. */
+extern int rl_beginning_of_history __P((int, int));
+extern int rl_end_of_history __P((int, int));
+extern int rl_get_next_history __P((int, int));
+extern int rl_get_previous_history __P((int, int));
+
+/* Bindable commands for managing the mark and region. */
+extern int rl_set_mark __P((int, int));
+extern int rl_exchange_point_and_mark __P((int, int));
+
+/* Bindable commands to set the editing mode (emacs or vi). */
+extern int rl_vi_editing_mode __P((int, int));
+extern int rl_emacs_editing_mode __P((int, int));
+
+/* Bindable commands for managing key bindings. */
+extern int rl_re_read_init_file __P((int, int));
+extern int rl_dump_functions __P((int, int));
+extern int rl_dump_macros __P((int, int));
+extern int rl_dump_variables __P((int, int));
+
+/* Bindable commands for word completion. */
+extern int rl_complete __P((int, int));
+extern int rl_possible_completions __P((int, int));
+extern int rl_insert_completions __P((int, int));
+extern int rl_menu_complete __P((int, int));
+
+/* Bindable commands for killing and yanking text, and managing the kill ring. */
+extern int rl_kill_word __P((int, int));
+extern int rl_backward_kill_word __P((int, int));
+extern int rl_kill_line __P((int, int));
+extern int rl_backward_kill_line __P((int, int));
+extern int rl_kill_full_line __P((int, int));
+extern int rl_unix_word_rubout __P((int, int));
+extern int rl_unix_line_discard __P((int, int));
+extern int rl_copy_region_to_kill __P((int, int));
+extern int rl_kill_region __P((int, int));
+extern int rl_copy_forward_word __P((int, int));
+extern int rl_copy_backward_word __P((int, int));
+extern int rl_yank __P((int, int));
+extern int rl_yank_pop __P((int, int));
+extern int rl_yank_nth_arg __P((int, int));
+extern int rl_yank_last_arg __P((int, int));
+/* Not available unless __CYGWIN32__ is defined. */
+#ifdef __CYGWIN32__
+extern int rl_paste_from_clipboard __P((int, int));
+#endif
+
+/* Bindable commands for incremental searching. */
+extern int rl_reverse_search_history __P((int, int));
+extern int rl_forward_search_history __P((int, int));
+
+/* Bindable keyboard macro commands. */
+extern int rl_start_kbd_macro __P((int, int));
+extern int rl_end_kbd_macro __P((int, int));
+extern int rl_call_last_kbd_macro __P((int, int));
+
+/* Bindable undo commands. */
+extern int rl_revert_line __P((int, int));
+extern int rl_undo_command __P((int, int));
+
+/* Bindable tilde expansion commands. */
+extern int rl_tilde_expand __P((int, int));
+
+/* Bindable terminal control commands. */
+extern int rl_restart_output __P((int, int));
+extern int rl_stop_output __P((int, int));
+
+/* Miscellaneous bindable commands. */
+extern int rl_abort __P((int, int));
+extern int rl_tty_status __P((int, int));
+
+/* Bindable commands for incremental and non-incremental history searching. */
+extern int rl_history_search_forward __P((int, int));
+extern int rl_history_search_backward __P((int, int));
+extern int rl_noninc_forward_search __P((int, int));
+extern int rl_noninc_reverse_search __P((int, int));
+extern int rl_noninc_forward_search_again __P((int, int));
+extern int rl_noninc_reverse_search_again __P((int, int));
+
+/* Bindable command used when inserting a matching close character. */
+extern int rl_insert_close __P((int, int));
+
+/* Not available unless READLINE_CALLBACKS is defined. */
+extern void rl_callback_handler_install __P((char *, VFunction *));
+extern void rl_callback_read_char __P((void));
+extern void rl_callback_handler_remove __P((void));
+
+/* Things for vi mode. Not available unless readline is compiled -DVI_MODE. */
+/* VI-mode bindable commands. */
+extern int rl_vi_redo __P((int, int));
+extern int rl_vi_undo __P((int, int));
+extern int rl_vi_yank_arg __P((int, int));
+extern int rl_vi_fetch_history __P((int, int));
+extern int rl_vi_search_again __P((int, int));
+extern int rl_vi_search __P((int, int));
+extern int rl_vi_complete __P((int, int));
+extern int rl_vi_tilde_expand __P((int, int));
+extern int rl_vi_prev_word __P((int, int));
+extern int rl_vi_next_word __P((int, int));
+extern int rl_vi_end_word __P((int, int));
+extern int rl_vi_insert_beg __P((int, int));
+extern int rl_vi_append_mode __P((int, int));
+extern int rl_vi_append_eol __P((int, int));
+extern int rl_vi_eof_maybe __P((int, int));
+extern int rl_vi_insertion_mode __P((int, int));
+extern int rl_vi_movement_mode __P((int, int));
+extern int rl_vi_arg_digit __P((int, int));
+extern int rl_vi_change_case __P((int, int));
+extern int rl_vi_put __P((int, int));
+extern int rl_vi_column __P((int, int));
+extern int rl_vi_delete_to __P((int, int));
+extern int rl_vi_change_to __P((int, int));
+extern int rl_vi_yank_to __P((int, int));
+extern int rl_vi_delete __P((int, int));
+extern int rl_vi_back_to_indent __P((int, int));
+extern int rl_vi_first_print __P((int, int));
+extern int rl_vi_char_search __P((int, int));
+extern int rl_vi_match __P((int, int));
+extern int rl_vi_change_char __P((int, int));
+extern int rl_vi_subst __P((int, int));
+extern int rl_vi_overstrike __P((int, int));
+extern int rl_vi_overstrike_delete __P((int, int));
+extern int rl_vi_replace __P((int, int));
+extern int rl_vi_set_mark __P((int, int));
+extern int rl_vi_goto_mark __P((int, int));
+
+/* VI-mode utility functions. */
+extern int rl_vi_check __P((void));
+extern int rl_vi_domove __P((int, int *));
+extern int rl_vi_bracktype __P((int));
+
+/* VI-mode pseudo-bindable commands, used as utility functions. */
+extern int rl_vi_fWord __P((int, int));
+extern int rl_vi_bWord __P((int, int));
+extern int rl_vi_eWord __P((int, int));
+extern int rl_vi_fword __P((int, int));
+extern int rl_vi_bword __P((int, int));
+extern int rl_vi_eword __P((int, int));
+
+/* **************************************************************** */
+/* */
+/* Well Published Functions */
+/* */
+/* **************************************************************** */
+
+/* Readline functions. */
+/* Read a line of input. Prompt with PROMPT. A NULL PROMPT means none. */
+extern char *readline __P((char *));
+
+extern int rl_initialize __P((void));
+
+extern int rl_discard_argument __P((void));
+
+/* Utility functions to bind keys to readline commands. */
+extern int rl_add_defun __P((char *, Function *, int));
+extern int rl_bind_key __P((int, Function *));
+extern int rl_bind_key_in_map __P((int, Function *, Keymap));
+extern int rl_unbind_key __P((int));
+extern int rl_unbind_key_in_map __P((int, Keymap));
+extern int rl_unbind_function_in_map __P((Function *, Keymap));
+extern int rl_unbind_command_in_map __P((char *, Keymap));
+extern int rl_set_key __P((char *, Function *, Keymap));
+extern int rl_generic_bind __P((int, char *, char *, Keymap));
+extern int rl_variable_bind __P((char *, char *));
+
+/* Backwards compatibility, use rl_generic_bind instead. */
+extern int rl_macro_bind __P((char *, char *, Keymap));
+
+/* Undocumented in the texinfo manual; not really useful to programs. */
+extern int rl_translate_keyseq __P((char *, char *, int *));
+extern char *rl_untranslate_keyseq __P((int));
+
+extern Function *rl_named_function __P((char *));
+extern Function *rl_function_of_keyseq __P((char *, Keymap, int *));
+
+extern void rl_list_funmap_names __P((void));
+extern char **rl_invoking_keyseqs_in_map __P((Function *, Keymap));
+extern char **rl_invoking_keyseqs __P((Function *));
+
+extern void rl_function_dumper __P((int));
+extern void rl_macro_dumper __P((int));
+extern void rl_variable_dumper __P((int));
+
+extern int rl_read_init_file __P((char *));
+extern int rl_parse_and_bind __P((char *));
+
+/* Functions for manipulating keymaps. */
+extern Keymap rl_make_bare_keymap __P((void));
+extern Keymap rl_copy_keymap __P((Keymap));
+extern Keymap rl_make_keymap __P((void));
+extern void rl_discard_keymap __P((Keymap));
+
+extern Keymap rl_get_keymap_by_name __P((char *));
+extern char *rl_get_keymap_name __P((Keymap));
+extern void rl_set_keymap __P((Keymap));
+extern Keymap rl_get_keymap __P((void));
+extern void rl_set_keymap_from_edit_mode __P((void));
+extern char *rl_get_keymap_name_from_edit_mode __P((void));
+
+/* Functions for manipulating the funmap, which maps command names to functions. */
+extern int rl_add_funmap_entry __P((char *, Function *));
+extern void rl_initialize_funmap __P((void));
+extern char **rl_funmap_names __P((void));
+
+/* Utility functions for managing keyboard macros. */
+extern void rl_push_macro_input __P((char *));
+
+/* Functions for undoing, from undo.c */
+extern void rl_add_undo __P((enum undo_code, int, int, char *));
+extern void free_undo_list __P((void));
+extern int rl_do_undo __P((void));
+extern int rl_begin_undo_group __P((void));
+extern int rl_end_undo_group __P((void));
+extern int rl_modifying __P((int, int));
+
+/* Functions for redisplay. */
+extern void rl_redisplay __P((void));
+extern int rl_on_new_line __P((void));
+extern int rl_on_new_line_with_prompt __P((void));
+extern int rl_forced_update_display __P((void));
+extern int rl_clear_message __P((void));
+extern int rl_reset_line_state __P((void));
+
+#if (defined (__STDC__) || defined (__cplusplus)) && defined (USE_VARARGS) && defined (PREFER_STDARG)
+extern int rl_message (const char *, ...);
+#else
+extern int rl_message ();
+#endif
+
+/* Undocumented in texinfo manual. */
+extern int rl_show_char __P((int));
+extern int rl_character_len __P((int, int));
+extern int crlf __P((void));
+
+/* Save and restore internal prompt redisplay information. */
+extern void rl_save_prompt __P((void));
+extern void rl_restore_prompt __P((void));
+
+/* Modifying text. */
+extern int rl_insert_text __P((char *));
+extern int rl_delete_text __P((int, int));
+extern int rl_kill_text __P((int, int));
+extern char *rl_copy_text __P((int, int));
+
+/* Terminal and tty mode management. */
+extern void rl_prep_terminal __P((int));
+extern void rl_deprep_terminal __P((void));
+extern void rltty_set_default_bindings __P((Keymap));
+
+extern int rl_reset_terminal __P((char *));
+extern void rl_resize_terminal __P((void));
+
+/* `Public' utility functions . */
+extern void rl_extend_line_buffer __P((int));
+extern int ding __P((void));
+
+/* Functions for character input. */
+extern int rl_stuff_char __P((int));
+extern int rl_execute_next __P((int));
+extern int rl_read_key __P((void));
+extern int rl_getc __P((FILE *));
+
+/* Readline signal handling, from signals.c */
+extern int rl_set_signals __P((void));
+extern int rl_clear_signals __P((void));
+extern void rl_cleanup_after_signal __P((void));
+extern void rl_reset_after_signal __P((void));
+extern void rl_free_line_state __P((void));
+
+/* Undocumented. */
+extern int rl_expand_prompt __P((char *));
+
+extern int maybe_save_line __P((void));
+extern int maybe_unsave_line __P((void));
+extern int maybe_replace_line __P((void));
+
+/* Completion functions. */
+extern int rl_complete_internal __P((int));
+extern void rl_display_match_list __P((char **, int, int));
+
+extern char **completion_matches __P((char *, CPFunction *));
+extern char *username_completion_function __P((char *, int));
+extern char *filename_completion_function __P((char *, int));
+
+/* **************************************************************** */
+/* */
+/* Well Published Variables */
+/* */
+/* **************************************************************** */
+
+/* The version of this incarnation of the readline library. */
+extern char *rl_library_version;
+
+/* True if this is real GNU readline. */
+extern int rl_gnu_readline_p;
+
+/* The name of the calling program. You should initialize this to
+ whatever was in argv[0]. It is used when parsing conditionals. */
+extern 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, 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;
+
+/* The name of the terminal to use. */
+extern char *rl_terminal_name;
+
+/* The input and output streams. */
+extern FILE *rl_instream, *rl_outstream;
+
+/* If non-zero, then this is the address of a function to call just
+ before readline_internal () prints the first prompt. */
+extern Function *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 Function *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 Function *rl_event_hook;
+
+extern Function *rl_getc_function;
+extern VFunction *rl_redisplay_function;
+extern VFunction *rl_prep_term_function;
+extern VFunction *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;
+
+/* 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 filename_entry_function (), the default filename
+ completer. */
+extern Function *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 Function *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 CPPFunction *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 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 char *rl_completer_word_break_characters;
+
+/* 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 char *rl_completer_quote_characters;
+
+/* List of quote characters which cause a word break. */
+extern char *rl_basic_quote_characters;
+
+/* List of characters that need to be quoted in filenames by the completer. */
+extern 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 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. */
+extern Function *rl_directory_completion_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 VFunction *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 CPFunction *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 CPFunction *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 Function *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;
+
+/* 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;
+
+/* 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;
+
+/* 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;
+
+/* 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
+
+#if !defined (savestring)
+extern char *savestring __P((char *)); /* XXX backwards compatibility */
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _READLINE_H_ */
diff --git a/gnu/lib/libreadline/rlconf.h b/gnu/lib/libreadline/rlconf.h
new file mode 100644
index 00000000000..d2ab7040125
--- /dev/null
+++ b/gnu/lib/libreadline/rlconf.h
@@ -0,0 +1,57 @@
+/* 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 final, last-ditch effort file name for an init file. */
+#define DEFAULT_INPUTRC "~/.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
+
+#endif /* _RLCONF_H_ */
diff --git a/gnu/lib/libreadline/rldefs.h b/gnu/lib/libreadline/rldefs.h
new file mode 100644
index 00000000000..e504d9b1c30
--- /dev/null
+++ b/gnu/lib/libreadline/rldefs.h
@@ -0,0 +1,136 @@
+/* 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,1989 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
+
+#if defined (_POSIX_VERSION) && !defined (TERMIOS_MISSING)
+# define TERMIOS_TTY_DRIVER
+#else
+# if defined (HAVE_TERMIO_H)
+# define TERMIO_TTY_DRIVER
+# else
+# define NEW_TTY_DRIVER
+# 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 (), _rl_strnicmp ();
+#endif
+
+#if !defined (emacs_mode)
+# define no_mode -1
+# define vi_mode 0
+# define emacs_mode 1
+#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) (Function *)((int)(data))
+#else
+# define FUNCTION_TO_KEYMAP(map, key) (Keymap)(map[key].function)
+# define KEYMAP_TO_FUNCTION(data) (Function *)(data)
+#endif
+
+#ifndef savestring
+extern char *xmalloc ();
+#define savestring(x) strcpy (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 0x1
+#define RL_QF_DOUBLE_QUOTE 0x2
+#define RL_QF_BACKSLASH 0x4
+
+/* 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
+
+/* CONFIGURATION SECTION */
+#include "rlconf.h"
+
+#endif /* !_RLDEFS_H_ */
diff --git a/gnu/lib/libreadline/rlprivate.h b/gnu/lib/libreadline/rlprivate.h
new file mode 100644
index 00000000000..c05230e3325
--- /dev/null
+++ b/gnu/lib/libreadline/rlprivate.h
@@ -0,0 +1,271 @@
+/* rlprivate.h -- functions and variables global to the readline library,
+ but not intended for use by applications. */
+
+/* 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_PRIVATE_H_)
+#define _RL_PRIVATE_H_
+
+#include "rlconf.h" /* for VISIBLE_STATS */
+#include "rlstdc.h"
+#include "posixjmp.h" /* defines procenv_t */
+
+/*************************************************************************
+ * *
+ * Global functions undocumented in texinfo manual and not in readline.h *
+ * *
+ *************************************************************************/
+
+/* terminal.c */
+extern char *rl_get_termcap __P((char *));
+
+/*************************************************************************
+ * *
+ * 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_numeric_arg;
+extern int rl_arg_sign;
+extern int rl_explicit_arg;
+extern int rl_editing_mode;
+extern int rl_visible_prompt_length;
+extern Function *rl_last_func;
+extern int readline_echoing_p;
+extern int rl_key_sequence_length;
+
+/* display.c */
+extern int rl_display_fixed;
+
+/* parens.c */
+extern int rl_blink_matching_paren;
+
+/*************************************************************************
+ * *
+ * Global functions and variables unsed and undocumented *
+ * *
+ *************************************************************************/
+
+/* bind.c */
+extern char *rl_untranslate_keyseq __P((int));
+
+/* kill.c */
+extern int rl_set_retained_kills __P((int));
+
+/* readline.c */
+extern int rl_discard_argument __P((void));
+
+/* rltty.c */
+extern int rl_stop_output __P((int, int));
+
+/* terminal.c */
+extern void _rl_set_screen_size __P((int, int));
+
+/* undo.c */
+extern int _rl_fix_last_undo_of_type __P((int, int, int));
+
+/* util.c */
+extern char *_rl_savestring __P((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 __P((void));
+extern char *readline_internal_teardown __P((int));
+extern int readline_internal_char __P((void));
+
+#endif /* READLINE_CALLBACKS */
+
+/* bind.c */
+extern void _rl_bind_if_unbound __P((char *, Function *));
+
+/* display.c */
+extern char *_rl_strip_prompt __P((char *));
+extern void _rl_move_cursor_relative __P((int, char *));
+extern void _rl_move_vert __P((int));
+extern void _rl_save_prompt __P((void));
+extern void _rl_restore_prompt __P((void));
+extern char *_rl_make_prompt_for_search __P((int));
+extern void _rl_erase_at_end_of_line __P((int));
+extern void _rl_clear_to_eol __P((int));
+extern void _rl_clear_screen __P((void));
+extern void _rl_update_final __P((void));
+extern void _rl_redisplay_after_sigwinch __P((void));
+extern void _rl_clean_up_for_exit __P((void));
+extern void _rl_erase_entire_line __P((void));
+extern int _rl_currentb_display_line __P((void));
+
+/* input.c */
+extern int _rl_any_typein __P((void));
+extern int _rl_input_available __P((void));
+extern void _rl_insert_typein __P((int));
+
+/* macro.c */
+extern void _rl_with_macro_input __P((char *));
+extern int _rl_next_macro_key __P((void));
+extern void _rl_push_executing_macro __P((void));
+extern void _rl_pop_executing_macro __P((void));
+extern void _rl_add_macro_char __P((int));
+extern void _rl_kill_kbd_macro __P((void));
+
+/* nls.c */
+extern int _rl_init_eightbit __P((void));
+
+/* parens.c */
+extern void _rl_enable_paren_matching __P((int));
+
+/* readline.c */
+extern void _rl_init_line_state __P((void));
+extern void _rl_set_the_line __P((void));
+extern int _rl_dispatch __P((int, Keymap));
+extern int _rl_init_argument __P((void));
+extern void _rl_fix_point __P((int));
+extern void _rl_replace_text __P((char *, int, int));
+extern int _rl_char_search_internal __P((int, int, int));
+extern int _rl_set_mark_at_pos __P((int));
+
+/* rltty.c */
+extern int _rl_disable_tty_signals __P((void));
+extern int _rl_restore_tty_signals __P((void));
+
+/* terminal.c */
+extern void _rl_get_screen_size __P((int, int));
+extern int _rl_init_terminal_io __P((char *));
+#ifdef _MINIX
+extern void _rl_output_character_function __P((int));
+#else
+extern int _rl_output_character_function __P((int));
+#endif
+extern void _rl_output_some_chars __P((char *, int));
+extern int _rl_backspace __P((int));
+extern void _rl_enable_meta_key __P((void));
+extern void _rl_control_keypad __P((int));
+
+/* util.c */
+extern int alphabetic __P((int));
+extern int _rl_abort_internal __P((void));
+extern char *_rl_strindex __P((char *, char *));
+extern int _rl_qsort_string_compare __P((char **, char **));
+extern int (_rl_uppercase_p) __P((int));
+extern int (_rl_lowercase_p) __P((int));
+extern int (_rl_pure_alphabetic) __P((int));
+extern int (_rl_digit_p) __P((int));
+extern int (_rl_to_lower) __P((int));
+extern int (_rl_to_upper) __P((int));
+extern int (_rl_digit_value) __P((int));
+
+/* vi_mode.c */
+extern void _rl_vi_initialize_line __P((void));
+extern void _rl_vi_reset_last __P((void));
+extern void _rl_vi_set_last __P((int, int, int));
+extern int _rl_vi_textmod_command __P((int));
+extern void _rl_vi_done_inserting __P((void));
+
+/*************************************************************************
+ * Undocumented private variables *
+ *************************************************************************/
+
+/* complete.c */
+extern int _rl_complete_show_all;
+extern int _rl_complete_mark_directories;
+extern int _rl_print_completions_horizontally;
+extern int _rl_completion_case_fold;
+
+/* display.c */
+extern int _rl_vis_botlin;
+extern int _rl_last_c_pos;
+extern int _rl_suppress_redisplay;
+extern char *rl_display_prompt;
+
+/* funmap.c */
+extern char *possible_control_prefixes[];
+extern char *possible_meta_prefixes[];
+
+/* isearch.c */
+extern unsigned char *_rl_isearch_terminators;
+
+/* macro.c */
+extern int _rl_defining_kbd_macro;
+extern char *_rl_executing_macro;
+
+/* 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 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;
+
+/* terminal.c */
+extern int _rl_enable_keypad;
+extern int _rl_enable_meta;
+extern char *term_clreol;
+extern char *term_clrpag;
+extern char *term_im;
+extern char *term_ic;
+extern char *term_ei;
+extern char *term_DC;
+extern char *term_up;
+extern char *term_dc;
+extern char *term_cr;
+extern char *term_IC;
+extern int screenheight;
+extern int screenwidth;
+extern int screenchars;
+extern int terminal_can_insert;
+extern int _rl_term_autowrap;
+
+/* undo.c */
+extern int _rl_doing_an_undo;
+extern int _rl_undo_group_level;
+
+#endif /* _RL_PRIVATE_H_ */
diff --git a/gnu/lib/libreadline/rlshell.h b/gnu/lib/libreadline/rlshell.h
new file mode 100644
index 00000000000..7a4e6996316
--- /dev/null
+++ b/gnu/lib/libreadline/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 *single_quote __P((char *));
+extern void set_lines_and_columns __P((int, int));
+extern char *get_env_value __P((char *));
+extern char *get_home_dir __P((void));
+extern int unset_nodelay_mode __P((int));
+
+#endif /* _RL_SHELL_H_ */
diff --git a/gnu/lib/libreadline/rlstdc.h b/gnu/lib/libreadline/rlstdc.h
new file mode 100644
index 00000000000..dac8e986e10
--- /dev/null
+++ b/gnu/lib/libreadline/rlstdc.h
@@ -0,0 +1,39 @@
+/* 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 __P((char *, char *, int)); */
+
+#if !defined (__P)
+# if defined (__STDC__) || defined (__GNUC__) || defined (__cplusplus)
+# define __P(protos) protos
+# else
+# define __P(protos) ()
+# endif
+#endif
+
+#endif /* !_RL_STDC_H_ */
diff --git a/gnu/lib/libreadline/rltty.c b/gnu/lib/libreadline/rltty.c
new file mode 100644
index 00000000000..b868b6970c2
--- /dev/null
+++ b/gnu/lib/libreadline/rltty.c
@@ -0,0 +1,867 @@
+/* rltty.c -- functions to prepare and restore the terminal for readline's
+ use. */
+
+/* Copyright (C) 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
+
+#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 */
+
+VFunction *rl_prep_term_function = rl_prep_terminal;
+VFunction *rl_deprep_term_function = rl_deprep_terminal;
+
+/* **************************************************************** */
+/* */
+/* 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 (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 (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;
+
+ ioctl (tty, TIOCGETP, &(tiop->sgttyb));
+ tiop->flags |= SGTTY_SET;
+
+#if defined (TIOCLGET)
+ ioctl (tty, TIOCLGET, &(tiop->lflag));
+ tiop->flags |= LFLAG_SET;
+#endif
+
+#if defined (TIOCGETC)
+ ioctl (tty, TIOCGETC, &(tiop->tchars));
+ tiop->flags |= TCHARS_SET;
+#endif
+
+#if defined (TIOCGLTC)
+ ioctl (tty, TIOCGLTC, &(tiop->ltchars));
+ 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, otio, tiop)
+ int meta_flag;
+ TIOTYPE otio, *tiop;
+{
+ readline_echoing_p = (otio.sgttyb.sg_flags & ECHO);
+
+ /* Copy the original settings to the structure we're going to use for
+ our settings. */
+ tiop->sgttyb = otio.sgttyb;
+ tiop->lflag = otio.lflag;
+#if defined (TIOCGETC)
+ tiop->tchars = otio.tchars;
+#endif
+#if defined (TIOCGLTC)
+ tiop->ltchars = otio.ltchars;
+#endif
+ tiop->flags = otio.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 (((otio.sgttyb.sg_flags & ANYP) == ANYP) ||
+ ((otio.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 (otio.tchars.t_startc != -1)
+ rl_bind_key (otio.tchars.t_startc, rl_restart_output);
+# endif /* USE_XON_XOFF */
+
+ /* If there is an EOF char, bind _rl_eof_char to it. */
+ if (otio.tchars.t_eofc != -1)
+ _rl_eof_char = otio.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, TCSETA, tiop))
+#endif /* !TERMIOS_TTY_DRIVER */
+
+static TIOTYPE otio;
+
+#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);
+
+ 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, otio, tiop)
+ int meta_flag;
+ TIOTYPE otio, *tiop;
+{
+ readline_echoing_p = (otio.c_lflag & ECHO);
+
+ tiop->c_lflag &= ~(ICANON | ECHO);
+
+ if ((unsigned char) otio.c_cc[VEOF] != (unsigned char) _POSIX_VDISABLE)
+ _rl_eof_char = otio.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;
+ otio.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. */
+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)
+ {
+ release_sigint ();
+ return;
+ }
+
+ otio = tio;
+
+ save_tty_chars (&otio);
+
+ 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;
+
+ 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;
+
+ release_sigint ();
+}
+
+/* **************************************************************** */
+/* */
+/* Bogus Flow Control */
+/* */
+/* **************************************************************** */
+
+int
+rl_restart_output (count, key)
+ int count, key;
+{
+ 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;
+}
+
+int
+rl_stop_output (count, key)
+ int count, key;
+{
+ 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;
+}
+
+/* **************************************************************** */
+/* */
+/* Default Key Bindings */
+/* */
+/* **************************************************************** */
+void
+rltty_set_default_bindings (kmap)
+ Keymap kmap;
+{
+ TIOTYPE ttybuff;
+ int tty = fileno (rl_instream);
+
+#if defined (NEW_TTY_DRIVER)
+
+#define SET_SPECIAL(sc, func) \
+ do \
+ { \
+ int ic; \
+ ic = sc; \
+ if (ic != -1 && kmap[ic].type == ISFUNC) \
+ kmap[ic].function = func; \
+ } \
+ while (0)
+
+ if (get_tty_settings (tty, &ttybuff) == 0)
+ {
+ 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 */
+
+#define SET_SPECIAL(sc, func) \
+ do \
+ { \
+ unsigned char uc; \
+ uc = ttybuff.c_cc[sc]; \
+ if (uc != (unsigned char)_POSIX_VDISABLE && kmap[uc].type == ISFUNC) \
+ kmap[uc].function = func; \
+ } \
+ while (0)
+
+ if (get_tty_settings (tty, &ttybuff) == 0)
+ {
+ 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 */
+}
+
+#if defined (HANDLE_SIGNALS)
+
+#if defined (NEW_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;
+
+ 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 ()
+{
+ if (tty_sigs_disabled == 0)
+ return 0;
+
+ return (_set_tty_settings (fileno (rl_instream), &sigstty));
+}
+#endif /* !NEW_TTY_DRIVER */
+
+#endif /* HANDLE_SIGNALS */
diff --git a/gnu/lib/libreadline/rltty.h b/gnu/lib/libreadline/rltty.h
new file mode 100644
index 00000000000..029a3fbc0e1
--- /dev/null
+++ b/gnu/lib/libreadline/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 {
+ char t_eof;
+ char t_eol;
+ char t_eol2;
+ char t_erase;
+ char t_werase;
+ char t_kill;
+ char t_reprint;
+ char t_intr;
+ char t_quit;
+ char t_susp;
+ char t_dsusp;
+ char t_start;
+ char t_stop;
+ char t_lnext;
+ char t_flush;
+ char t_status;
+} _RL_TTY_CHARS;
+
+#endif /* _RLTTY_H_ */
diff --git a/gnu/lib/libreadline/rlwinsize.h b/gnu/lib/libreadline/rlwinsize.h
new file mode 100644
index 00000000000..7838154d023
--- /dev/null
+++ b/gnu/lib/libreadline/rlwinsize.h
@@ -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/gnu/lib/libreadline/savestring.c b/gnu/lib/libreadline/savestring.c
new file mode 100644
index 00000000000..485890ea57c
--- /dev/null
+++ b/gnu/lib/libreadline/savestring.c
@@ -0,0 +1,33 @@
+/* savestring.c */
+
+/* Copyright (C) 1998 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. */
+
+extern char *strcpy ();
+extern char *xmalloc ();
+
+/* Backwards compatibility, now that savestring has been removed from
+ all `public' readline header files. */
+char *
+savestring (s)
+ char *s;
+{
+ return ((char *)strcpy (xmalloc (1 + (int)strlen (s)), (s)));
+}
diff --git a/gnu/lib/libreadline/search.c b/gnu/lib/libreadline/search.c
new file mode 100644
index 00000000000..112f8072866
--- /dev/null
+++ b/gnu/lib/libreadline/search.c
@@ -0,0 +1,423 @@
+/* search.c - code for non-incremental searching in emacs and vi modes. */
+
+/* Copyright (C) 1992 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 "readline.h"
+#include "history.h"
+
+#include "rlprivate.h"
+#include "xmalloc.h"
+
+#ifdef abs
+# undef abs
+#endif
+#define abs(x) (((x) >= 0) ? (x) : -(x))
+
+extern HIST_ENTRY *saved_line_for_history;
+
+/* Functions imported from the rest of the library. */
+extern int _rl_free_history_entry __P((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;
+
+/* 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;
+{
+ int line_len;
+
+ line_len = strlen (entry->line);
+ if (line_len >= rl_line_buffer_len)
+ rl_extend_line_buffer (line_len);
+ strcpy (rl_line_buffer, entry->line);
+
+ rl_undo_list = (UNDO_LIST *)entry->data;
+ rl_end = line_len;
+
+ if (saved_line_for_history)
+ _rl_free_history_entry (saved_line_for_history);
+ 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;
+
+ old = where_history ();
+ history_set_pos (pos);
+
+ if (*string == '^')
+ ret = history_search_prefix (string + 1, dir);
+ else
+ ret = history_search (string, dir);
+
+ 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. */
+static void
+noninc_dosearch (string, dir)
+ char *string;
+ int dir;
+{
+ int oldpos, pos;
+ HIST_ENTRY *entry;
+
+ if (string == 0 || *string == '\0' || noninc_history_pos < 0)
+ {
+ ding ();
+ return;
+ }
+
+ pos = noninc_search_from_pos (string, noninc_history_pos + dir, dir);
+ if (pos == -1)
+ {
+ /* Search failed, current history position unchanged. */
+ maybe_unsave_line ();
+ rl_clear_message ();
+ rl_point = 0;
+ ding ();
+ return;
+ }
+
+ 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_clear_message ();
+}
+
+/* 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 void
+noninc_search (dir, pchar)
+ int dir;
+ int pchar;
+{
+ int saved_point, c;
+ char *p;
+
+ maybe_save_line ();
+ saved_point = rl_point;
+
+ /* 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 (p, 0, 0);
+ free (p);
+
+#define SEARCH_RETURN rl_restore_prompt (); return
+
+ /* Read the search string. */
+ while (c = rl_read_key ())
+ {
+ switch (c)
+ {
+ case CTRL('H'):
+ case RUBOUT:
+ if (rl_point == 0)
+ {
+ maybe_unsave_line ();
+ rl_clear_message ();
+ rl_point = saved_point;
+ SEARCH_RETURN;
+ }
+ rl_rubout (1, c);
+ break;
+
+ case CTRL('W'):
+ rl_unix_word_rubout (1, c);
+ break;
+
+ case CTRL('U'):
+ rl_unix_line_discard (1, c);
+ break;
+
+ case RETURN:
+ case NEWLINE:
+ goto dosearch;
+ /* NOTREACHED */
+ break;
+
+ case CTRL('C'):
+ case CTRL('G'):
+ maybe_unsave_line ();
+ rl_clear_message ();
+ rl_point = saved_point;
+ ding ();
+ SEARCH_RETURN;
+
+ default:
+ rl_insert (1, c);
+ break;
+ }
+ (*rl_redisplay_function) ();
+ }
+
+ dosearch:
+ /* 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)
+ {
+ ding ();
+ SEARCH_RETURN;
+ }
+ }
+ else
+ {
+ /* We want to start the search from the current history position. */
+ noninc_history_pos = where_history ();
+ FREE (noninc_search_string);
+ noninc_search_string = savestring (rl_line_buffer);
+ }
+
+ rl_restore_prompt ();
+ noninc_dosearch (noninc_search_string, dir);
+}
+
+/* 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;
+{
+ noninc_search (1, (key == '?') ? '?' : 0);
+ return 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;
+{
+ noninc_search (-1, (key == '/') ? '/' : 0);
+ return 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;
+{
+ if (!noninc_search_string)
+ {
+ ding ();
+ return (-1);
+ }
+ noninc_dosearch (noninc_search_string, 1);
+ return 0;
+}
+
+/* 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;
+{
+ if (!noninc_search_string)
+ {
+ ding ();
+ return (-1);
+ }
+ noninc_dosearch (noninc_search_string, -1);
+ return 0;
+}
+
+static int
+rl_history_search_internal (count, dir)
+ int count, dir;
+{
+ HIST_ENTRY *temp;
+ int ret, oldpos;
+
+ 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)
+ {
+ maybe_unsave_line ();
+ 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';
+ }
+#else
+ rl_point = rl_history_search_len; /* maybe_unsave_line changes it */
+#endif
+ return 1;
+ }
+
+ /* Copy the line we found into the current line buffer. */
+ make_history_line_current (temp);
+
+ rl_point = rl_history_search_len;
+ 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 = 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';
+ }
+}
+
+/* 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/gnu/lib/libreadline/shell.c b/gnu/lib/libreadline/shell.c
new file mode 100644
index 00000000000..3daef69b4c2
--- /dev/null
+++ b/gnu/lib/libreadline/shell.c
@@ -0,0 +1,175 @@
+/* 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 */
+
+#include <fcntl.h>
+#include <pwd.h>
+
+#include <stdio.h>
+
+#include "rlshell.h"
+#include "xmalloc.h"
+
+#if !defined (HAVE_GETPW_DECLS)
+extern struct passwd *getpwuid ();
+#endif /* !HAVE_GETPW_DECLS */
+
+#ifndef NULL
+# define NULL 0
+#endif
+
+/* 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 *
+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
+set_lines_and_columns (lines, cols)
+ int lines, cols;
+{
+ char *b;
+
+#if defined (HAVE_PUTENV)
+ b = xmalloc (24);
+ sprintf (b, "LINES=%d", lines);
+ putenv (b);
+ b = xmalloc (24);
+ sprintf (b, "COLUMNS=%d", cols);
+ putenv (b);
+#else /* !HAVE_PUTENV */
+# if defined (HAVE_SETENV)
+ b = xmalloc (8);
+ sprintf (b, "%d", lines);
+ setenv ("LINES", b, 1);
+ b = xmalloc (8);
+ sprintf (b, "%d", cols);
+ setenv ("COLUMNS", b, 1);
+# endif /* HAVE_SETENV */
+#endif /* !HAVE_PUTENV */
+}
+
+char *
+get_env_value (varname)
+ char *varname;
+{
+ return ((char *)getenv (varname));
+}
+
+char *
+get_home_dir ()
+{
+ char *home_dir;
+ struct passwd *entry;
+
+ home_dir = (char *)NULL;
+ entry = getpwuid (getuid ());
+ if (entry)
+ home_dir = entry->pw_dir;
+ return (home_dir);
+}
+
+#if !defined (O_NDELAY)
+# if defined (FNDELAY)
+# define O_NDELAY FNDELAY
+# endif
+#endif
+
+int
+unset_nodelay_mode (fd)
+ int fd;
+{
+ 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));
+ }
+
+ return 0;
+}
diff --git a/gnu/lib/libreadline/shlib/Makefile.in b/gnu/lib/libreadline/shlib/Makefile.in
new file mode 100644
index 00000000000..b1f70dee09a
--- /dev/null
+++ b/gnu/lib/libreadline/shlib/Makefile.in
@@ -0,0 +1,367 @@
+## -*- text -*- ##
+# Makefile for the GNU readline library shared library support.
+#
+# Copyright (C) 1998 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
+
+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
+
+SHELL = @MAKE_SHELL@
+
+host_os = @host_os@
+
+prefix = @prefix@
+exec_prefix = @exec_prefix@
+libdir = @libdir@
+
+CFLAGS = @CFLAGS@
+LOCAL_CFLAGS = @LOCAL_CFLAGS@ -DRL_LIBRARY_VERSION='"$(RL_LIBRARY_VERSION)"'
+CPPFLAGS = @CPPFLAGS@
+LDFLAGS = @LDFLAGS@ @LOCAL_LDFLAGS@ @CFLAGS@
+
+DEFS = @DEFS@
+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 = @SHLIB_XLDFLAGS@
+SHLIB_LIBS = @SHLIB_LIBS@
+SHLIB_LIBSUFF = @SHLIB_LIBSUFF@
+
+SHLIB_LIBVERSION = @SHLIB_LIBVERSION@
+
+SHLIB_STATUS = @SHLIB_STATUS@
+
+# 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) -I$(includedir)
+
+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 = libreadline.$(SHLIB_LIBVERSION)
+SHARED_HISTORY = libhistory.$(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
+
+# 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
+
+SHARED_HISTOBJ = history.so histexpand.so histfile.so histsearch.so shell.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 \
+ nls.so xmalloc.so $(SHARED_HISTOBJ) $(SHARED_TILDEOBJ)
+
+##########################################################################
+
+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)
+
+installdirs: $(topdir)/support/mkdirs
+ -$(SHELL) $(topdir)/support/mkdirs $(libdir)
+
+install: installdirs $(SHLIB_STATUS)
+ $(SHELL) $(topdir)/support/shlib-install -O $(host_os) -d $(libdir) -i "$(INSTALL_DATA)" $(SHARED_HISTORY)
+ $(SHELL) $(topdir)/support/shlib-install -O $(host_os) -d $(libdir) -i "$(INSTALL_DATA)" $(SHARED_READLINE)
+ @echo install: you may need to run ldconfig
+
+uninstall:
+ $(SHELL) $(topdir)/support/shlib-install -O $(host_os) -d $(libdir) -U $(SHARED_HISTORY)
+ $(SHELL) $(topdir)/support/shlib-install -O $(host_os) -d $(libdir) -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)/tilde.h $(topdir)/history.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)/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)/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)/tilde.h $(topdir)/history.h
+funmap.so: $(topdir)/readline.h $(topdir)/keymaps.h $(topdir)/chardefs.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 histlib.h
+histexpand.so: ${BUILD_DIR}/config.h
+histfile.so: $(topdir)/ansi_stdlib.h
+histfile.so: $(topdir)/history.h histlib.h
+histfile.so: ${BUILD_DIR}/config.h
+history.so: $(topdir)/ansi_stdlib.h
+history.so: $(topdir)/history.h histlib.h
+history.so: ${BUILD_DIR}/config.h
+histsearch.so: $(topdir)/ansi_stdlib.h
+histsearch.so: $(topdir)/history.h histlib.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)/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)/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: ${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
+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
+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)/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)/tilde.h
+readline.so: $(topdir)/readline.h $(topdir)/keymaps.h $(topdir)/chardefs.h
+readline.so: $(topdir)/rldefs.h ${BUILD_DIR}/config.h $(topdir)/rlconf.h
+readline.so: $(topdir)/history.h $(topdir)/tilde.h
+readline.so: $(topdir)/posixstat.h $(topdir)/ansi_stdlib.h $(topdir)/posixjmp.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
+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
+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
+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
+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)/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)/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
+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
+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
+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
+readline.so: $(topdir)/xmalloc.h
+savestring.so: $(topdir)/xmalloc.h
+search.so: $(topdir)/xmalloc.h
+shell.so: $(topdir)/xmalloc.h
+tilde.so: $(topdir)/xmalloc.h
+tilde.so: $(topdir)/xmalloc.h
+util.so: $(topdir)/xmalloc.h
+vi_mode.so: $(topdir)/xmalloc.h
+
+readline.so: $(topdir)/readline.c
+vi_mode.so: $(topdir)/vi_mode.c
+funmap.so: $(topdir)/funmap.c
+keymaps.so: $(topdir)/keymaps.c
+parens.so: $(topdir)/parens.c
+search.so: $(topdir)/search.c
+rltty.so: $(topdir)/rltty.c
+complete.so: $(topdir)/complete.c
+bind.so: $(topdir)/bind.c
+isearch.so: $(topdir)/isearch.c
+display.so: $(topdir)/display.c
+signals.so: $(topdir)/signals.c
+util.so: $(topdir)/util.c
+kill.so: $(topdir)/kill.c
+undo.so: $(topdir)/undo.c
+macro.so: $(topdir)/macro.c
+input.so: $(topdir)/input.c
+callback.so: $(topdir)/callback.c
+terminal.so: $(topdir)/terminal.c
+nls.so: $(topdir)/nls.c
+xmalloc.so: $(topdir)/xmalloc.c
+history.so: $(topdir)/history.c
+histexpand.so: $(topdir)/histexpand.c
+histfile.so: $(topdir)/histfile.c
+histsearch.so: $(topdir)/histsearch.c
+savestring.so: $(topdir)/savestring.c
+shell.so: $(topdir)/shell.c
+tilde.so: $(topdir)/tilde.c
+
+readline.so: readline.c
+vi_mode.so: vi_mode.c
+funmap.so: funmap.c
+keymaps.so: keymaps.c
+parens.so: parens.c
+search.so: search.c
+rltty.so: rltty.c
+complete.so: complete.c
+bind.so: bind.c
+isearch.so: isearch.c
+display.so: display.c
+signals.so: signals.c
+util.so: util.c
+kill.so: kill.c
+undo.so: undo.c
+macro.so: macro.c
+input.so: input.c
+callback.so: callback.c
+terminal.so: terminal.c
+nls.so: nls.c
+xmalloc.so: xmalloc.c
+history.so: history.c
+histexpand.so: histexpand.c
+histfile.so: histfile.c
+histsearch.so: histsearch.c
+savestring.so: savestring.c
+shell.so: shell.c
+tilde.so: tilde.c
diff --git a/gnu/lib/libreadline/signals.c b/gnu/lib/libreadline/signals.c
new file mode 100644
index 00000000000..861019d3363
--- /dev/null
+++ b/gnu/lib/libreadline/signals.c
@@ -0,0 +1,392 @@
+/* signals.c -- signal handling support for 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. */
+#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 equivalant 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 */
+
+static SigHandler *rl_set_sighandler __P((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;
+#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 */
+
+#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 (sig == SIGINT || sig == SIGALRM)
+ rl_set_sighandler (sig, SIG_IGN, &dummy_cxt);
+#endif /* !HAVE_BSD_SIGNALS && !HAVE_POSIX_SIGNALS */
+
+ switch (sig)
+ {
+ case SIGINT:
+ rl_free_line_state ();
+ /* FALLTHROUGH */
+
+#if defined (SIGTSTP)
+ case SIGTSTP:
+ case SIGTTOU:
+ case SIGTTIN:
+#endif /* SIGTSTP */
+ case SIGALRM:
+ case SIGTERM:
+ case SIGQUIT:
+ rl_cleanup_after_signal ();
+
+#if defined (HAVE_POSIX_SIGNALS)
+ 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
+
+ kill (getpid (), sig);
+
+ /* 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 ();
+ }
+
+ 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_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);
+
+ 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 = 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 (rl_catch_signals && signals_set_flag == 0)
+ {
+ rl_maybe_set_sighandler (SIGINT, rl_signal_handler, &old_int);
+ rl_maybe_set_sighandler (SIGTERM, rl_signal_handler, &old_term);
+ rl_maybe_set_sighandler (SIGQUIT, rl_signal_handler, &old_quit);
+
+ 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 */
+
+#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 (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);
+ rl_sigaction (SIGQUIT, &old_quit, &dummy);
+ rl_sigaction (SIGALRM, &old_alrm, &dummy);
+
+#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 ();
+ (*rl_deprep_term_function) ();
+ rl_clear_signals ();
+ rl_pending_input = 0;
+}
+
+/* Reset the terminal and readline state after a signal handler returns. */
+void
+rl_reset_after_signal ()
+{
+ (*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;
+
+ free_undo_list ();
+
+ entry = current_history ();
+ if (entry)
+ entry->data = (char *)NULL;
+
+ _rl_kill_kbd_macro ();
+ rl_clear_message ();
+ _rl_init_argument ();
+}
+
+#endif /* HANDLE_SIGNALS */
diff --git a/gnu/lib/libreadline/support/config.guess b/gnu/lib/libreadline/support/config.guess
new file mode 100644
index 00000000000..ad5983e7618
--- /dev/null
+++ b/gnu/lib/libreadline/support/config.guess
@@ -0,0 +1,1328 @@
+#! /bin/sh
+# Attempt to guess a canonical system name.
+# Copyright (C) 1992, 1993, 1994, 1995, 1996 Free Software Foundation, Inc.
+#
+# 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.
+
+# Written by Per Bothner <bothner@cygnus.com>.
+# The master version of this file is at the FSF in /home/gd/gnu/lib.
+#
+# 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 system type (host/target name).
+#
+# Only a few systems have been added to this list; please add others
+# (but try to keep the structure clean).
+#
+
+# Use $HOST_CC if defined. $CC may point to a cross-compiler
+if test x"$CC_FOR_BUILD" = x; then
+ if test x"$HOST_CC" != x; then
+ CC_FOR_BUILD="$HOST_CC"
+ else
+ if test x"$CC" != x; then
+ CC_FOR_BUILD="$CC"
+ else
+ CC_FOR_BUILD=cc
+ fi
+ fi
+fi
+
+# This is needed to find uname on a Pyramid OSx when run in the BSD universe.
+# (ghazi@noc.rutgers.edu 8/24/94.)
+if (test -f /.attbin/uname) >/dev/null 2>&1 ; then
+ PATH=$PATH:/.attbin ; export PATH
+elif (test -f /usr/5bin/uname) >/dev/null 2>&1 ; then
+ PATH=$PATH:/usr/5bin
+fi
+
+UNAME=`(uname) 2>/dev/null` || UNAME=unknown
+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
+
+RELEASE=`expr "$UNAME_RELEASE" : '[^0-9]*\([0-9]*\)'` # 4
+case "$RELEASE" in
+"") RELEASE=0 ;;
+*) RELEASE=`expr "$RELEASE" + 0` ;;
+esac
+REL_LEVEL=`expr "$UNAME_RELEASE" : '[^0-9]*[0-9]*.\([0-9]*\)'` # 1
+REL_SUBLEVEL=`expr "$UNAME_RELEASE" : '[^0-9]*[0-9]*.[0-9]*.\([0-9]*\)'` # 2
+
+dummy=dummy-$$
+trap 'rm -f $dummy.c $dummy.o $dummy; exit 1' 1 2 15
+
+# Some versions of i386 SVR4.2 make `uname' equivalent to `uname -n', which
+# is contrary to all other versions of uname
+if [ -n "$UNAME" ] && [ "$UNAME_S" != "$UNAME" ] && [ "$UNAME_S" = UNIX_SV ]; then
+ UNAME=UNIX_SV
+fi
+
+# Note: order is significant - the case branches are not exclusive.
+
+case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
+ # Begin cases added for Bash
+ alpha:NetBSD:*:*)
+ echo alpha-dec-netbsd${UNAME_RELEASE}
+ exit 0 ;;
+ alpha:OpenBSD:*:*)
+ echo alpha-dec-openbsd${UNAME_RELEASE}
+ exit 0 ;;
+ i?86:NetBSD:*:*)
+ echo ${UNAME_MACHINE}-pc-netbsd`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'`
+ exit 0 ;;
+ i?86:OpenBSD:*:*)
+ echo ${UNAME_MACHINE}-pc-openbsd`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'`
+ exit 0 ;;
+ sparc:NetBSD:*:*)
+ echo sparc-unknown-netbsd${UNAME_RELEASE}
+ exit 0 ;;
+ sparc:OpenBSD:*:*)
+ echo sparc-unknown-openbsd${UNAME_RELEASE}
+ exit 0 ;;
+ vax:NetBSD:*:*)
+ echo vax-dec-netbsd${UNAME_RELEASE}
+ exit 0 ;;
+ vax:OpenBSD:*:*)
+ echo vax-dec-openbsd${UNAME_RELEASE}
+ exit 0 ;;
+ mac68k:machten:*:*)
+ echo mac68k-apple-machten${UNAME_RELEASE}
+ exit 0 ;;
+ concurrent*:*:*:*)
+ if test "`(/bin/universe) 2>/dev/null`" = att ; then
+ echo concurrent-concurrent-sysv3
+ else
+ echo concurrent-concurrent-bsd
+ fi
+ exit 0 ;;
+ ppc*:SunOS:5.*:*)
+ echo ppc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+ exit 0 ;;
+ sparc:UNIX_SV:4.*:*)
+ echo sparc-unknown-sysv${UNAME_RELEASE}
+ exit 0 ;;
+ mips:UNIX_SV:4.*:*)
+ echo mips-mips-sysv${UNAME_RELEASE}
+ exit 0 ;;
+ mips:OSF*1:*:*)
+ echo mips-mips-osf1
+ exit 0 ;;
+ mips:4.4BSD:*:*)
+ echo mips-mips-bsd4.4
+ exit 0 ;;
+ MIServer-S:SMP_DC.OSx:*:dcosx)
+ echo mips-pyramid-sysv4
+ exit 0 ;;
+ news*:NEWS*:*:*)
+ echo mips-sony-newsos${UNAME_RELEASE}
+ exit 0 ;;
+ i?86:NEXTSTEP:*:*)
+ echo i386-next-nextstep${RELEASE}
+ exit 0 ;;
+ *680?0:NEXTSTEP:*:*)
+ echo m68k-next-nextstep${RELEASE}
+ exit 0 ;;
+ *370:AIX:*:*)
+ echo ibm370-ibm-aix
+ exit 0 ;;
+ ksr1:OSF*1:*:*)
+ echo ksr1-ksr-osf1
+ exit 0 ;;
+ esa:OSF*1:*:* | ESA:OSF*:*:*)
+ echo esa-ibm-osf1
+ exit 0 ;;
+ DNP*:DNIX:*:*)
+ echo m68k-dnix-sysv
+ exit 0 ;;
+ *3b2*:*:*:*)
+ echo we32k-att-sysv3
+ exit 0 ;;
+ *:QNX:*:42*)
+ echo i386-qssl-qnx`echo ${UNAME_VERSION}`
+ exit 0 ;;
+ Alpha*:Windows:NT:*:SP*)
+ echo alpha-pc-opennt
+ exit 0 ;;
+ *:Windows:NT:*:SP*)
+ echo intel-pc-opennt
+ exit 0 ;;
+ # end cases added for Bash
+ 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.
+ cat <<EOF >$dummy.s
+ .globl main
+ .ent main
+main:
+ .frame \$30,0,\$26,0
+ .prologue 0
+ .long 0x47e03d80 # implver $0
+ lda \$2,259
+ .long 0x47e20c21 # amask $2,$1
+ srl \$1,8,\$2
+ sll \$2,2,\$2
+ sll \$0,3,\$0
+ addl \$1,\$0,\$0
+ addl \$2,\$0,\$0
+ ret \$31,(\$26),1
+ .end main
+EOF
+ $CC_FOR_BUILD $dummy.s -o $dummy 2>/dev/null
+ if test "$?" = 0 ; then
+ ./$dummy
+ case "$?" in
+ 7)
+ UNAME_MACHINE="alpha"
+ ;;
+ 15)
+ UNAME_MACHINE="alphaev5"
+ ;;
+ 14)
+ UNAME_MACHINE="alphaev56"
+ ;;
+ 10)
+ UNAME_MACHINE="alphapca56"
+ ;;
+ 16)
+ UNAME_MACHINE="alphaev6"
+ ;;
+ esac
+ fi
+ rm -f $dummy.s $dummy
+ 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-cbm-sysv4
+ exit 0;;
+ amiga:NetBSD:*:*)
+ echo m68k-cbm-netbsd${UNAME_RELEASE}
+ exit 0 ;;
+ amiga:OpenBSD:*:*)
+ echo m68k-cbm-openbsd${UNAME_RELEASE}
+ exit 0 ;;
+ *:[Aa]miga[Oo][Ss]:*:*)
+ echo ${UNAME_MACHINE}-unknown-amigaos
+ exit 0 ;;
+ arc64:OpenBSD:*:*)
+ echo mips64el-unknown-openbsd${UNAME_RELEASE}
+ exit 0 ;;
+ arc:OpenBSD:*:*)
+ echo mipsel-unknown-openbsd${UNAME_RELEASE}
+ exit 0 ;;
+ hkmips:OpenBSD:*:*)
+ echo mips-unknown-openbsd${UNAME_RELEASE}
+ exit 0 ;;
+ pmax:OpenBSD:*:*)
+ echo mipsel-unknown-openbsd${UNAME_RELEASE}
+ exit 0 ;;
+ sgi:OpenBSD:*:*)
+ echo mips-unknown-openbsd${UNAME_RELEASE}
+ exit 0 ;;
+ wgrisc:OpenBSD:*:*)
+ echo mipsel-unknown-openbsd${UNAME_RELEASE}
+ exit 0 ;;
+ arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*)
+ echo arm-acorn-riscix${UNAME_RELEASE}
+ exit 0;;
+ arm32:NetBSD:*:*)
+ echo arm-unknown-netbsd`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'`
+ exit 0 ;;
+ SR2?01: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 ;;
+ 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=`(head -1 /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 ;;
+ atari*:NetBSD:*:*)
+ echo m68k-atari-netbsd${UNAME_RELEASE}
+ exit 0 ;;
+ atari*:OpenBSD:*:*)
+ echo m68k-unknown-openbsd${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 ;;
+ sun3*:NetBSD:*:*)
+ echo m68k-sun-netbsd${UNAME_RELEASE}
+ exit 0 ;;
+ sun3*:OpenBSD:*:*)
+ echo m68k-unknown-openbsd${UNAME_RELEASE}
+ exit 0 ;;
+ mac68k:NetBSD:*:*)
+ echo m68k-apple-netbsd${UNAME_RELEASE}
+ exit 0 ;;
+ mac68k:OpenBSD:*:*)
+ echo m68k-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 ;;
+ *:"Mac OS":*:*)
+ echo `uname -p`-apple-macos${UNAME_RELEASE}
+ exit 0 ;;
+ powerpc:machten:*:*)
+ echo powerpc-apple-machten${UNAME_RELEASE}
+ exit 0 ;;
+ macppc:NetBSD:*:*)
+ echo powerpc-apple-netbsd${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)
+ sed 's/^ //' << EOF >$dummy.c
+#ifdef __cplusplus
+ 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 $dummy.c -o $dummy \
+ && ./$dummy `echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` \
+ && rm $dummy.c $dummy && exit 0
+ rm -f $dummy.c $dummy
+ echo mips-mips-riscos${UNAME_RELEASE}
+ exit 0 ;;
+ Night_Hawk:Power_UNIX:*:*)
+ echo powerpc-harris-powerunix
+ exit 0 ;;
+ m88k:CX/UX:7*:*)
+ echo m88k-harris-cxux7
+ 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 -o $UNAME_PROCESSOR = mc88110 ] ; then
+ if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx \
+ -o ${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 ;;
+ *:AIX:2:3)
+ if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then
+ 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 $dummy.c -o $dummy && ./$dummy && rm $dummy.c $dummy && exit 0
+ rm -f $dummy.c $dummy
+ 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:*:4)
+ IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | head -1 | awk '{ print $1 }'`
+ if /usr/sbin/lsattr -EHl ${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`
+ elif grep bos410 /usr/include/stdio.h >/dev/null 2>&1; then
+ IBM_REV=4.1
+ elif grep bos411 /usr/include/stdio.h >/dev/null 2>&1; then
+ IBM_REV=4.1.1
+ else
+ IBM_REV=4.${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 NetBSD 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:*:*)
+ case "${UNAME_MACHINE}" in
+ 9000/31? ) HP_ARCH=m68000 ;;
+ 9000/[34]?? ) HP_ARCH=m68k ;;
+ 9000/[678][0-9][0-9])
+ sed 's/^ //' << EOF >$dummy.c
+ #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
+ ($CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null ) && HP_ARCH=`./$dummy`
+ rm -f $dummy.c $dummy
+ esac
+ HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`
+ echo ${HP_ARCH}-hp-hpux${HPUX_REV}
+ exit 0 ;;
+ 3050*:HI-UX:*:*)
+ 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 $dummy.c -o $dummy && ./$dummy && rm $dummy.c $dummy && exit 0
+ rm -f $dummy.c $dummy
+ 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:*:*)
+ 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 ;;
+ hppa*:OpenBSD:*:*)
+ echo hppa-unknown-openbsd
+ 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*X-MP:*:*:*)
+ echo xmp-cray-unicos
+ exit 0 ;;
+ CRAY*Y-MP:*:*:*)
+ echo ymp-cray-unicos${UNAME_RELEASE}
+ 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/
+ exit 0 ;;
+ CRAY*TS:*:*:*)
+ echo t90-cray-unicos${UNAME_RELEASE}
+ exit 0 ;;
+ CRAY*T3E:*:*:*)
+ echo alpha-cray-unicosmk${UNAME_RELEASE}
+ exit 0 ;;
+ CRAY-2:*:*:*)
+ echo cray2-cray-unicos
+ exit 0 ;;
+ F300:UNIX_System_V:*:*)
+ FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`
+ FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'`
+ echo "f300-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
+ exit 0 ;;
+ F301:UNIX_System_V:*:*)
+ echo f301-fujitsu-uxpv`echo $UNAME_RELEASE | sed 's/ .*//'`
+ exit 0 ;;
+ hp3[0-9][05]:NetBSD:*:*)
+ echo m68k-hp-netbsd${UNAME_RELEASE}
+ exit 0 ;;
+ hp300:OpenBSD:*:*)
+ echo m68k-unknown-openbsd${UNAME_RELEASE}
+ exit 0 ;;
+ i?86:BSD/386:*:* | i?86:BSD/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 ;;
+ *:FreeBSD:*:*)
+ if test -x /usr/bin/objformat; then
+ if test "elf" = "`/usr/bin/objformat`"; then
+ echo ${UNAME_MACHINE}-unknown-freebsdelf`echo ${UNAME_RELEASE}|sed -e 's/[-_].*//'`
+ exit 0
+ fi
+ fi
+ echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-=(].*//'`
+ exit 0 ;;
+ *:NetBSD:*:*)
+ echo ${UNAME_MACHINE}-unknown-netbsd`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'`
+ exit 0 ;;
+ *:OpenBSD:*:*)
+ echo ${UNAME_MACHINE}-unknown-openbsd`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'`
+ exit 0 ;;
+ i*:CYGWIN*:*)
+ echo ${UNAME_MACHINE}-pc-cygwin32
+ exit 0 ;;
+ i*:MINGW*:*)
+ echo ${UNAME_MACHINE}-pc-mingw32
+ 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 i386-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 ;;
+ *:Linux:*:*)
+ # uname on the ARM produces all sorts of strangeness, and we need to
+ # filter it out.
+ case "$UNAME_MACHINE" in
+ armv*) UNAME_MACHINE=$UNAME_MACHINE ;;
+ arm* | sa110*) UNAME_MACHINE="arm" ;;
+ esac
+
+ # 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.
+ ld_help_string=`cd /; ld --help 2>&1`
+ ld_supported_emulations=`echo $ld_help_string \
+ | sed -ne '/supported emulations:/!d
+ s/[ ][ ]*/ /g
+ s/.*supported emulations: *//
+ s/ .*//
+ p'`
+ case "$ld_supported_emulations" in
+ *ia64) echo "${UNAME_MACHINE}-unknown-linux" ; exit 0 ;;
+ i?86linux) echo "${UNAME_MACHINE}-pc-linux-gnuaout" ; exit 0 ;;
+ i?86coff) echo "${UNAME_MACHINE}-pc-linux-gnucoff" ; exit 0 ;;
+ sparclinux) echo "${UNAME_MACHINE}-unknown-linux-gnuaout" ; exit 0 ;;
+ armlinux) echo "${UNAME_MACHINE}-unknown-linux-gnuaout" ; exit 0 ;;
+ m68klinux) echo "${UNAME_MACHINE}-unknown-linux-gnuaout" ; exit 0 ;;
+ elf32ppc | elf32ppclinux)
+ # Determine Lib Version
+ cat >$dummy.c <<EOF
+#include <features.h>
+#if defined(__GLIBC__)
+extern char __libc_version[];
+extern char __libc_release[];
+#endif
+main(argc, argv)
+ int argc;
+ char *argv[];
+{
+#if defined(__GLIBC__)
+ printf("%s %s\n", __libc_version, __libc_release);
+#else
+ printf("unkown\n");
+#endif
+ return 0;
+}
+EOF
+ LIBC=""
+ $CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null
+ if test "$?" = 0 ; then
+ ./$dummy | grep 1\.99 > /dev/null
+ if test "$?" = 0 ; then
+ LIBC="libc1"
+ fi
+ fi
+ rm -f $dummy.c $dummy
+ echo powerpc-unknown-linux-gnu${LIBC} ; exit 0 ;;
+ esac
+
+ if test "${UNAME_MACHINE}" = "alpha" ; then
+ sed 's/^ //' <<EOF >$dummy.s
+ .globl main
+ .ent main
+ main:
+ .frame \$30,0,\$26,0
+ .prologue 0
+ .long 0x47e03d80 # implver $0
+ lda \$2,259
+ .long 0x47e20c21 # amask $2,$1
+ srl \$1,8,\$2
+ sll \$2,2,\$2
+ sll \$0,3,\$0
+ addl \$1,\$0,\$0
+ addl \$2,\$0,\$0
+ ret \$31,(\$26),1
+ .end main
+EOF
+ LIBC=""
+ $CC_FOR_BUILD $dummy.s -o $dummy 2>/dev/null
+ if test "$?" = 0 ; then
+ ./$dummy
+ case "$?" in
+ 7)
+ UNAME_MACHINE="alpha"
+ ;;
+ 15)
+ UNAME_MACHINE="alphaev5"
+ ;;
+ 14)
+ UNAME_MACHINE="alphaev56"
+ ;;
+ 10)
+ UNAME_MACHINE="alphapca56"
+ ;;
+ 16)
+ UNAME_MACHINE="alphaev6"
+ ;;
+ esac
+
+ objdump --private-headers $dummy | \
+ grep ld.so.1 > /dev/null
+ if test "$?" = 0 ; then
+ LIBC="libc1"
+ fi
+ fi
+ rm -f $dummy.s $dummy
+ echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC} ; exit 0
+ elif test "${UNAME_MACHINE}" = "mips" ; then
+ cat >$dummy.c <<EOF
+#ifdef __cplusplus
+int main (int argc, char *argv[]) {
+#else
+int main (argc, argv) int argc; char *argv[]; {
+#endif
+#ifdef __MIPSEB__
+ printf ("%s-unknown-linux-gnu\n", argv[1]);
+#endif
+#ifdef __MIPSEL__
+ printf ("%sel-unknown-linux-gnu\n", argv[1]);
+#endif
+ return 0;
+}
+EOF
+ $CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null && ./$dummy "${UNAME_MACHINE}" && rm $dummy.c $dummy && exit 0
+ rm -f $dummy.c $dummy
+ else
+ # Either a pre-BFD a.out linker (linux-gnuoldld)
+ # or one that does not give us useful --help.
+ # GCC wants to distinguish between linux-gnuoldld and linux-gnuaout.
+ # If ld does not provide *any* "supported emulations:"
+ # that means it is gnuoldld.
+ echo "$ld_help_string" | grep >/dev/null 2>&1 "supported emulations:"
+ test $? != 0 && echo "${UNAME_MACHINE}-pc-linux-gnuoldld" && exit 0
+
+ case "${UNAME_MACHINE}" in
+ i?86)
+ VENDOR=pc;
+ ;;
+ *)
+ VENDOR=unknown;
+ ;;
+ esac
+ # Determine whether the default compiler is a.out or elf
+ cat >$dummy.c <<EOF
+#include <features.h>
+#ifdef __cplusplus
+ int main (int argc, char *argv[]) {
+#else
+ int main (argc, argv) int argc; char *argv[]; {
+#endif
+#ifdef __ELF__
+# ifdef __GLIBC__
+# if __GLIBC__ >= 2
+ printf ("%s-${VENDOR}-linux-gnu\n", argv[1]);
+# else
+ printf ("%s-${VENDOR}-linux-gnulibc1\n", argv[1]);
+# endif
+# else
+ printf ("%s-${VENDOR}-linux-gnulibc1\n", argv[1]);
+# endif
+#else
+ printf ("%s-${VENDOR}-linux-gnuaout\n", argv[1]);
+#endif
+ return 0;
+}
+EOF
+ ${CC-cc} $dummy.c -o $dummy 2>/dev/null && ./$dummy "${UNAME_MACHINE}" && rm $dummy.c $dummy && exit 0
+ rm -f $dummy.c $dummy
+ fi ;;
+# 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.
+ i?86:DYNIX/ptx:4*:*)
+ echo i386-sequent-sysv4
+ exit 0 ;;
+# added by chet for bash based on usenet posting from <hops@sco.com> and
+# documentation on SCO's web site -- UnixWare 7 (SVR5)
+# i?86:UnixWare:5*:*)
+# echo ${UNAME_MACHINE}-pc-sysv5uw${UNAME_VERSION}
+# 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:*:4.*:* | i?86:SYSTEM_V:4.*:* | i?86:UNIX_SV:4.*:*)
+ if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then
+ echo ${UNAME_MACHINE}-univel-sysv${UNAME_RELEASE}
+ else
+ echo ${UNAME_MACHINE}-pc-sysv${UNAME_RELEASE}
+ fi
+ exit 0 ;;
+ i?86:*:5:7*)
+ UNAME_REL=`(/bin/uname -X|egrep Release|sed -e 's/.*= //')`
+ (/bin/uname -X|egrep i80486 >/dev/null) && UNAME_MACHINE=i486
+ (/bin/uname -X|egrep '^Machine.*Pentium' >/dev/null) && UNAME_MACHINE=i586
+ (/bin/uname -X|egrep '^Machine.*Pent.*II' >/dev/null) && UNAME_MACHINE=i686
+ (/bin/uname -X|egrep '^Machine.*Pentium Pro' >/dev/null) && UNAME_MACHINE=i585
+ echo ${UNAME_MACHINE}-${UNAME_SYSTEM}${UNAME_VERSION}-sysv${UNAME_RELEASE}
+ 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|egrep Release|sed -e 's/.*= //')`
+ (/bin/uname -X|egrep i80486 >/dev/null) && UNAME_MACHINE=i486
+ (/bin/uname -X|egrep '^Machine.*Pentium' >/dev/null) \
+ && UNAME_MACHINE=i586
+ (/bin/uname -X|egrep '^Machine.*Pent ?II' >/dev/null) \
+ && UNAME_MACHINE=i686
+ (/bin/uname -X|egrep '^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:*:*:*)
+ # 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 ;;
+ M68*:*:R3V[567]*:*)
+ test -r /sysV68 && echo 'm68k-motorola-sysv' && exit 0 ;;
+ 3[34]??:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 4850:*: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 ;;
+ mc68030:UNIX_System_V:4.*:*)
+ echo m68k-atari-sysv4
+ exit 0 ;;
+ m68*:LynxOS:2.*:*)
+ echo m68k-unknown-lynxos${UNAME_RELEASE}
+ exit 0 ;;
+ i?86:LynxOS:2.*:* | i?86:LynxOS:3.[01]*:*)
+ echo i386-pc-lynxos${UNAME_RELEASE}
+ exit 0 ;;
+ TSUNAMI:LynxOS:2.*:*)
+ echo sparc-unknown-lynxos${UNAME_RELEASE}
+ exit 0 ;;
+ rs6000:LynxOS:2.*:* | PowerPC:LynxOS:2.*:*)
+ echo rs6000-unknown-lynxos${UNAME_RELEASE}
+ exit 0 ;;
+ *:LynxOS:*:*)
+ echo ${UNAME_MACHINE}-unknown-lynxos${UNAME_RELEASE}
+ exit 0 ;;
+ SM[BE]S:UNIX_SV:*:*)
+ echo mips-dde-sysv${UNAME_RELEASE}
+ exit 0 ;;
+ RM*:SINIX-*:*:* | RM*:ReliantUNIX-*:*:*)
+ 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:CPunix: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 ;;
+ mc68*:A/UX:*:*)
+ echo m68k-apple-aux${UNAME_RELEASE}
+ exit 0 ;;
+ news*:NEWS-OS:*:6*)
+ echo mips-sony-newsos6
+ exit 0 ;;
+ R3000:*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-apple-beos
+ exit 0 ;;
+ BeMac:BeOS:*:*)
+ echo powerpc-apple-beos
+ exit 0 ;;
+ BePC:BeOS:*:*)
+ 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 ;;
+ Power*:Rhapsody:*:*)
+ echo powerpc-apple-rhapsody${UNAME_RELEASE}
+ exit 0 ;;
+ *:Rhapsody:*:*)
+ echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE}
+ 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
+
+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\n"); exit (0);
+#endif
+
+#if defined (hp9000) && !defined (hpux)
+ printf ("m68k-hp-bsd\n"); 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)
+ printf ("vax-dec-bsd\n"); exit (0);
+#else
+ printf ("vax-dec-ultrix\n"); exit (0);
+#endif
+#endif
+
+#if defined (alliant) && defined (i860)
+ printf ("i860-alliant-bsd\n"); exit (0);
+#endif
+
+/* Begin cases added for Bash */
+#if defined (tahoe)
+ printf ("tahoe-cci-bsd\n"); exit (0);
+#endif
+
+#if defined (nec_ews)
+# if defined (SYSTYPE_SYSV)
+ printf ("ews4800-nec-sysv4\n"); exit 0;
+# else
+ printf ("ews4800-nec-bsd\n"); exit (0);
+# endif
+#endif
+
+#if defined (sony)
+# if defined (SYSTYPE_SYSV)
+ printf ("mips-sony-sysv4\n"); exit 0;
+# else
+ printf ("mips-sony-bsd\n"); exit (0);
+# endif
+#endif
+
+#if defined (ardent)
+ printf ("titan-ardent-bsd\n"); exit (0);
+#endif
+
+#if defined (stardent)
+ printf ("stardent-stardent-sysv\n"); exit (0);
+#endif
+
+#if defined (ibm032)
+ printf ("ibmrt-ibm-bsd4.3\n"); exit (0);
+#endif
+
+#if defined (sequent) && defined (i386)
+ printf ("i386-sequent-bsd\n"); exit (0);
+#endif
+
+#if defined (qnx) && defined (i386)
+ printf ("i386-pc-qnx\n"); exit (0);
+#endif
+
+#if defined (gould)
+ printf ("gould-gould-bsd\n"); exit (0);
+#endif
+
+#if defined (unixpc)
+ printf ("unixpc-att-sysv\n"); exit (0);
+#endif
+
+#if defined (att386)
+ printf ("i386-att-sysv3\n"); exit (0);
+#endif
+
+#if defined (__m88k) && defined (__UMAXV__)
+ printf ("m88k-encore-sysv3\n"); exit (0);
+#endif
+
+#if defined (drs6000)
+ printf ("drs6000-icl-sysv4.2\n"); exit (0);
+#endif
+
+#if defined (clipper)
+ printf ("clipper-orion-bsd\n"); exit (0);
+#endif
+
+#if defined (is68k)
+ printf ("m68k-isi-bsd\n"); exit (0);
+#endif
+
+#if defined (luna88k)
+ printf ("luna88k-omron-bsd\n"); exit (0);
+#endif
+
+#if defined (butterfly) && defined (BFLY1)
+ printf ("butterfly-bbn-mach\n"); exit (0);
+#endif
+
+#if defined (tower32)
+ printf ("tower32-ncr-sysv4\n"); exit (0);
+#endif
+
+#if defined (MagicStation)
+ printf ("magicstation-unknown-bsd\n"); exit (0);
+#endif
+
+#if defined (scs)
+ printf ("symmetric-scs-bsd4.2\n"); exit (0);
+#endif
+
+#if defined (tandem)
+ printf ("tandem-tandem-sysv\n"); exit (0);
+#endif
+
+#if defined (cadmus)
+ printf ("cadmus-pcs-sysv\n"); exit (0);
+#endif
+
+#if defined (masscomp)
+ printf ("masscomp-masscomp-sysv3\n"); exit (0);
+#endif
+
+#if defined (hbullx20)
+ printf ("hbullx20-bull-sysv3\n"); exit (0);
+#endif
+
+/* End cases added for Bash */
+
+ exit (1);
+}
+EOF
+
+${CC-cc} $dummy.c -o $dummy 2>/dev/null && ./$dummy && rm $dummy.c $dummy && exit 0
+rm -f $dummy.c $dummy
+
+# 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
+
+# Begin cases added for Bash
+case "$UNAME" in
+uts) echo uts-amdahl-sysv${UNAME_RELEASE}; exit 0 ;;
+esac
+
+if [ -d /usr/amiga ]; then
+ echo m68k-cbm-sysv${UNAME_RELEASE}; exit 0;
+fi
+
+if [ -f /bin/fxc.info ]; then
+ echo fxc-alliant-concentrix
+ exit 0
+fi
+# end cases added for Bash
+
+#echo '(Unable to guess system type)' 1>&2
+
+exit 1
diff --git a/gnu/lib/libreadline/support/config.sub b/gnu/lib/libreadline/support/config.sub
new file mode 100644
index 00000000000..7d0c026d9bd
--- /dev/null
+++ b/gnu/lib/libreadline/support/config.sub
@@ -0,0 +1,1261 @@
+#! /bin/sh
+# Configuration validation subroutine script, version 1.1.
+# Copyright (C) 1991, 92, 93, 94, 95, 1996 Free Software Foundation, Inc.
+# This file is (in principle) common to ALL GNU software.
+# The presence of a machine in this file suggests that SOME GNU software
+# can handle that machine. It does not imply ALL GNU software can.
+#
+# This file is free software; you can redistribute it and/or modify
+# 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.
+
+# 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.
+
+if [ x$1 = x ]
+then
+ echo Configuration name missing. 1>&2
+ echo "Usage: $0 CPU-MFR-OPSYS" 1>&2
+ echo "or $0 ALIAS" 1>&2
+ echo where ALIAS is a recognized configuration type. 1>&2
+ exit 1
+fi
+
+# First pass through any local machine types.
+case $1 in
+ *local*)
+ echo $1
+ exit 0
+ ;;
+ *)
+ ;;
+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
+ linux-gnu*)
+ 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 )
+ os=
+ basic_machine=$1
+ ;;
+ -sim | -cisco | -oki | -wec | -winbond)
+ os=
+ basic_machine=$1
+ ;;
+ -scout)
+ ;;
+ -wrs)
+ os=vxworks
+ 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
+ ;;
+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.
+ tahoe | i860 | ia64 | m32r | m68k | m68000 | m88k | ns32k | arc | arm \
+ | arme[lb] | pyramid | mn10200 | mn10300 | tron | a29k \
+ | 580 | i960 | h8300 \
+ | hppa | hppa1.0 | hppa1.1 | hppa2.0 | hppa2.0w | hppa2.0n \
+ | alpha | alphaev[4-7] | alphaev56 | alphapca5[67] \
+ | we32k | ns16k | clipper | i370 | sh | powerpc | powerpcle \
+ | 1750a | dsp16xx | pdp11 | mips16 | mips64 | mipsel | mips64el \
+ | mips64orion | mips64orionel | mipstx39 | mipstx39el \
+ | mips64vr4300 | mips64vr4300el | mips64vr4100 | mips64vr4100el \
+ | mips64vr5000 | miprs64vr5000el | mcore \
+ | sparc | sparclet | sparclite | sparc64 | sparcv9 | v850 | c4x \
+ | thumb | d10v)
+ basic_machine=$basic_machine-unknown
+ ;;
+ m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | z8k | v70 | h8500 | w65)
+ ;;
+
+ # 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[34567]86)
+ 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.
+ # FIXME: clean up the formatting here.
+ vax-* | tahoe-* | i[34567]86-* | i860-* | ia64-* | m32r-* | m68k-* | m68000-* \
+ | m88k-* | sparc-* | ns32k-* | fx80-* | arc-* | arm-* | c[123]* \
+ | mips-* | pyramid-* | tron-* | a29k-* | romp-* | rs6000-* \
+ | power-* | none-* | 580-* | cray2-* | h8300-* | h8500-* | i960-* \
+ | xmp-* | ymp-* \
+ | hppa-* | hppa1.0-* | hppa1.1-* | hppa2.0-* | hppa2.0w-* | hppa2.0n-* \
+ | alpha-* | alphaev[4-7]-* | alphaev56-* | alphapca5[67]-* \
+ | we32k-* | cydra-* | ns16k-* | pn-* | np1-* | xps100-* \
+ | clipper-* | orion-* \
+ | sparclite-* | pdp11-* | sh-* | powerpc-* | powerpcle-* \
+ | sparc64-* | sparcv9-* | sparc86x-* | mips16-* | mips64-* | mipsel-* \
+ | mips64el-* | mips64orion-* | mips64orionel-* \
+ | mips64vr4100-* | mips64vr4100el-* | mips64vr4300-* | mips64vr4300el-* \
+ | mipstx39-* | mipstx39el-* | mcore-* \
+ | f301-* | armv*-* | t3e-* \
+ | m88110-* | m680[01234]0-* | m683?2-* | m68360-* | z8k-* | d10v-* \
+ | thumb-* | v850-* | d30v-* | tic30-* | c30-* )
+ ;;
+ # BEGIN cases added for Bash
+ butterfly-bbn* | cadmus-* | ews*-nec | ibmrt-ibm* | masscomp-masscomp \
+ | tandem-* | symmetric-* | drs6000-icl | *-*ardent | gould-gould \
+ | concurrent-* | ksr1-* | esa-ibm | fxc-alliant | *370-amdahl \
+ | *-convex | sx[45]*-nec )
+ ;;
+ # END cases added for Bash
+
+ # 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-cbm
+ basic_machine=m68k-unknown
+ ;;
+ amigaos | amigados)
+ basic_machine=m68k-cbm
+ os=-amigaos
+ ;;
+ amigaunix | amix)
+ basic_machine=m68k-cbm
+ 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
+ ;;
+ 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 | ymp)
+ basic_machine=ymp-cray
+ os=-unicos
+ ;;
+ cray2)
+ basic_machine=cray2-cray
+ os=-unicos
+ ;;
+ [ctj]90-cray)
+ basic_machine=c90-cray
+ os=-unicos
+ ;;
+ crds | unos)
+ basic_machine=m68k-crds
+ ;;
+ da30 | da30-*)
+ basic_machine=m68k-da30
+ ;;
+ decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn)
+ basic_machine=mips-dec
+ ;;
+ 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
+ ;;
+ hbullx20-bull)
+ basic_machine=m68k-bull
+ ;;
+ ebmon29k)
+ basic_machine=a29k-amd
+ os=-ebmon
+ ;;
+ elxsi)
+ basic_machine=elxsi-elxsi
+ os=-bsd
+ ;;
+ encore | umax | mmax | multimax)
+ 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
+ ;;
+ 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
+ ;;
+ ibm032-*)
+ basic_machine=ibmrt-ibm
+ ;;
+ i370-ibm* | ibm*)
+ basic_machine=i370-ibm
+ os=-mvs
+ ;;
+# I'm not sure what "Sysv32" means. Should this be sysv3.2?
+ i[34567]86v32)
+ basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+ os=-sysv32
+ ;;
+ i[34567]86v4*)
+ basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+ os=-sysv4
+ ;;
+ i[34567]86v)
+ basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+ os=-sysv
+ ;;
+ i[34567]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
+ ;;
+ i386-go32 | go32)
+ basic_machine=i386-unknown
+ os=-go32
+ ;;
+ i386-mingw32 | mingw32)
+ basic_machine=i386-unknown
+ os=-mingw32
+ ;;
+ iris | iris4d)
+ basic_machine=mips-sgi
+ case $os in
+ -irix*)
+ ;;
+ *)
+ os=-irix4
+ ;;
+ esac
+ ;;
+ isi68 | isi)
+ basic_machine=m68k-isi
+ os=-sysv
+ ;;
+ luna88k-omron* | m88k-omron*)
+ basic_machine=m88k-omron
+ ;;
+ magicstation*)
+ basic_machine=magicstation-unknown
+ ;;
+ magnum | m3230)
+ basic_machine=mips-mips
+ os=-sysv
+ ;;
+ merlin)
+ basic_machine=ns32k-utek
+ os=-sysv
+ ;;
+ miniframe)
+ basic_machine=m68000-convergent
+ ;;
+ *mint | *MiNT)
+ basic_machine=m68k-atari
+ os=-mint
+ ;;
+ mipsel*-linux*)
+ basic_machine=mipsel-unknown
+ os=-linux-gnu
+ ;;
+ mips*-linux*)
+ basic_machine=mips-unknown
+ os=-linux-gnu
+ ;;
+ mips3*-*)
+ basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`
+ ;;
+ mips3*)
+ basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown
+ ;;
+ monitor)
+ basic_machine=m68k-rom68k
+ os=-coff
+ ;;
+ msdos)
+ basic_machine=i386-unknown
+ os=-msdos
+ ;;
+ ncr3000)
+ basic_machine=i486-ncr
+ os=-sysv4
+ ;;
+ netbsd386)
+ basic_machine=i386-unknown
+ os=-netbsd
+ ;;
+ netwinder)
+ basic_machine=armv4l-corel
+ 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
+ ;;
+ np1)
+ basic_machine=np1-gould
+ ;;
+ osr5 | sco5) # SCO Open Server
+ basic_machine=i386-pc
+ os=-sco3.2v5
+ ;;
+ odt | odt3 | odt4) # SCO Open Desktop
+ basic_machine=i386-pc
+ os=-sco3.2v4
+ ;;
+ op50n-* | op60c-*)
+ basic_machine=hppa1.1-oki
+ os=-proelf
+ ;;
+ 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 | nexen)
+ basic_machine=i586-intel
+ ;;
+ pentiumpro | p6 | 6x86)
+ basic_machine=i686-pc
+ ;;
+ pentiumii | pentium2)
+ basic_machine=i786-pc
+ ;;
+ pentium-* | p5-* | k5-* | k6-* | nexen-*)
+ basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ pentiumpro-* | p6-* | 6x86*)
+ basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ pentiumii-* | pentium2-*)
+ basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ pn)
+ basic_machine=pn-gould
+ ;;
+ power) basic_machine=rs6000-ibm
+ ;;
+ ppc) basic_machine=powerpc-unknown
+ ;;
+ ppc-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ ppcle | powerpclittle | ppc-le | powerpc-little)
+ basic_machine=powerpcle-unknown
+ ;;
+ ppcle-* | powerpclittle-*)
+ basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ ps2)
+ basic_machine=i386-ibm
+ ;;
+ rom68k)
+ basic_machine=m68k-rom68k
+ os=-coff
+ ;;
+ rm[46]00)
+ basic_machine=mips-siemens
+ ;;
+ rtpc | rtpc-*)
+ basic_machine=romp-ibm
+ ;;
+ sa29200)
+ basic_machine=a29k-amd
+ os=-udi
+ ;;
+ sequent)
+ basic_machine=i386-sequent
+ ;;
+ sh)
+ basic_machine=sh-hitachi
+ os=-hms
+ ;;
+ sparclite-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
+ ;;
+ symmetry)
+ basic_machine=i386-sequent
+ os=-dynix
+ ;;
+ t3e)
+ basic_machine=t3e-cray
+ os=-unicos
+ ;;
+ tx39)
+ basic_machine=mipstx39-unknown
+ ;;
+ tx39el)
+ basic_machine=mipstx39el-unknown
+ ;;
+ tower | tower-32)
+ basic_machine=m68k-ncr
+ ;;
+ udi29k)
+ basic_machine=a29k-amd
+ os=-udi
+ ;;
+ ultra3)
+ basic_machine=a29k-nyu
+ os=-sym1
+ ;;
+ uw2 | unixware | unixware2)
+ basic_machine=i386-pc
+ os=-sysv4.2uw2.1
+ ;;
+ uw7 | unixware7)
+ basic_machine=i386-pc
+ os=-sysv5uw7
+ ;;
+ 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
+ ;;
+ xmp)
+ basic_machine=xmp-cray
+ os=-unicos
+ ;;
+ xps | xps100)
+ basic_machine=xps100-honeywell
+ ;;
+ 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
+ ;;
+ mips)
+ if test "x$os" = "x-linux-gnu" ; then
+ basic_machine=mips-unknown
+ else
+ basic_machine=mips-mips
+ fi
+ ;;
+ romp)
+ basic_machine=romp-ibm
+ ;;
+ rs6000)
+ basic_machine=rs6000-ibm
+ ;;
+ vax)
+ basic_machine=vax-dec
+ ;;
+ pdp11)
+ basic_machine=pdp11-dec
+ ;;
+ we32k)
+ basic_machine=we32k-att
+ ;;
+ sparc | sparcv9)
+ 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
+ ;;
+ c4x*)
+ basic_machine=c4x-none
+ os=-coff
+ ;;
+ *)
+ 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 | -uw | -unixware2* | -uw2*)
+ os=-sysv4.2uw2.1
+ ;;
+ -unixware7* | -uw7*)
+ os=-sysv5uw7
+ ;;
+ -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* \
+ | -cygwin32* | -pe* | -psos* | -moss* | -proelf* | -rtems* \
+ | -mingw32* | -linux-gnu* | -uxpv* | -beos* | -mpeix* | -udk* \
+ | -interix* | -uwin* | -rhapsody* | -openstep* | -oskit*)
+ # Remember, each alternative MUST END IN *, to match a version number.
+ ;;
+ # BEGIN CASES ADDED FOR Bash
+ -qnx* | -powerux* | -superux* )
+ ;;
+ # END CASES ADDED FOR Bash
+ -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \
+ | -windows* | -osx | -abug | -netware* | -os9* | -beos* \
+ | -macos* | -mpw* | -magic* | -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|'`
+ ;;
+ -osfrose*)
+ os=-osfrose
+ ;;
+ -osf*)
+ os=-osf
+ ;;
+ -utek*)
+ os=-bsd
+ ;;
+ -dynix*)
+ os=-bsd
+ ;;
+ -acis*)
+ os=-aos
+ ;;
+ -386bsd)
+ os=-bsd
+ ;;
+ -ctix* | -uts*)
+ os=-sysv
+ ;;
+ -ns2 )
+ os=-nextstep2
+ ;;
+ # 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
+ ;;
+ -sysvr5)
+ os=-sysv5
+ ;;
+ # This must come after -sysvr[45].
+ -sysv*)
+ ;;
+ -ose*)
+ os=-ose
+ ;;
+ -es1800*)
+ os=-ose
+ ;;
+ -xenix)
+ os=-xenix
+ ;;
+ -*mint | -*MiNT)
+ 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*-semi)
+ os=-aout
+ ;;
+ 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
+ ;;
+ *-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
+ ;;
+ f301-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
+ ;;
+ -lynxos*)
+ vendor=lynx
+ ;;
+ -aix*)
+ vendor=ibm
+ ;;
+ -beos*)
+ vendor=be
+ ;;
+ -hpux*)
+ vendor=hp
+ ;;
+ -hiux*)
+ vendor=hitachi
+ ;;
+ -unos*)
+ vendor=crds
+ ;;
+ -dgux*)
+ vendor=dg
+ ;;
+ -luna*)
+ vendor=omron
+ ;;
+ -genix*)
+ vendor=ns
+ ;;
+ -mvs*)
+ vendor=ibm
+ ;;
+ -ptx*)
+ vendor=sequent
+ ;;
+ -vxsim* | -vxworks*)
+ vendor=wrs
+ ;;
+ -aux*)
+ vendor=apple
+ ;;
+ -hms*)
+ vendor=hitachi
+ ;;
+ -mpw* | -macos*)
+ vendor=apple
+ ;;
+ -*mint | -*MiNT)
+ vendor=atari
+ ;;
+ esac
+ basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"`
+ ;;
+esac
+
+echo $basic_machine$os
diff --git a/gnu/lib/libreadline/support/install.sh b/gnu/lib/libreadline/support/install.sh
new file mode 100644
index 00000000000..ea88212bb50
--- /dev/null
+++ b/gnu/lib/libreadline/support/install.sh
@@ -0,0 +1,235 @@
+#!/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 $
+#
+# 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/gnu/lib/libreadline/support/mkdirs b/gnu/lib/libreadline/support/mkdirs
new file mode 100644
index 00000000000..b79d9716f46
--- /dev/null
+++ b/gnu/lib/libreadline/support/mkdirs
@@ -0,0 +1,32 @@
+#! /bin/sh
+#
+# mkdirs - a work-alike for `mkdir -p'
+#
+# Chet Ramey
+# chet@po.cwru.edu
+
+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/gnu/lib/libreadline/support/mkdist b/gnu/lib/libreadline/support/mkdist
new file mode 100644
index 00000000000..a1e4eb16fed
--- /dev/null
+++ b/gnu/lib/libreadline/support/mkdist
@@ -0,0 +1,100 @@
+#! /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
+#
+
+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 ;;
+ *) 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/gnu/lib/libreadline/support/shlib-install b/gnu/lib/libreadline/support/shlib-install
new file mode 100644
index 00000000000..471fec78b52
--- /dev/null
+++ b/gnu/lib/libreadline/support/shlib-install
@@ -0,0 +1,148 @@
+#! /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 -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 -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 ;;
+ -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 requires that a shared library have execute permission
+case "$host_os" in
+hpux*) if [ -z "$uninstall" ]; then
+ chmod 755 ${INSTALLDIR}/${LIBNAME}
+ 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
+ ;;
+esac
+
+#
+# Create symlinks to the installed library. This section is incomplete.
+#
+case "$host_os" in
+*linux*|bsdi4*)
+ # libname.so.M -> libname.so.M.N
+ ${echo} ${RM} ${INSTALLDIR}/$LINK2
+ if [ -z "$uninstall" ]; then
+ ${echo} ln -s $INSTALLDIR/$LIBNAME ${INSTALLDIR}/$LINK2
+ fi
+
+ # libname.so -> libname.so.M.N
+ ${echo} ${RM} ${INSTALLDIR}/$LINK1
+ if [ -z "$uninstall" ]; then
+ ${echo} ln -s $INSTALLDIR/$LIBNAME ${INSTALLDIR}/$LINK1
+ fi
+ ;;
+
+solaris2*|aix4.[2-9]*|osf*|irix[56]*)
+ # libname.so -> libname.so.M
+ ${echo} ${RM} ${INSTALLDIR}/$LINK1
+ if [ -z "$uninstall" ]; then
+ ${echo} ln -s $INSTALLDIR/$LIBNAME ${INSTALLDIR}/$LINK1
+ fi
+ ;;
+
+
+# FreeBSD 3.x can have either a.out or ELF shared libraries
+freebsd3*)
+ if [ -x /usr/bin/objformat ] && [ "`/usr/bin/objformat`" = "elf" ]; then
+ # libname.so -> libname.so.M
+ ${echo} ${RM} ${INSTALLDIR}/$LINK1
+ if [ -z "$uninstall" ]; then
+ ${echo} ln -s $INSTALLDIR/$LIBNAME ${INSTALLDIR}/$LINK1
+ fi
+ else
+ # libname.so.M -> libname.so.M.N
+ ${echo} ${RM} ${INSTALLDIR}/$LINK2
+ if [ -z "$uninstall" ]; then
+ ${echo} ln -s $INSTALLDIR/$LIBNAME ${INSTALLDIR}/$LINK2
+ fi
+
+ # libname.so -> libname.so.M.N
+ ${echo} ${RM} ${INSTALLDIR}/$LINK1
+ if [ -z "$uninstall" ]; then
+ ${echo} ln -s $INSTALLDIR/$LIBNAME ${INSTALLDIR}/$LINK1
+ fi
+ fi
+ ;;
+
+hpux1*)
+ # libname.sl -> libname.M
+ ${echo} ${RM} ${INSTALLDIR}/$LINK1.sl
+ if [ -z "$uninstall" ]; then
+ ${echo} ln -s $INSTALLDIR/$LIBNAME ${INSTALLDIR}/${LINK1}.sl
+ fi
+ ;;
+
+*) ;;
+esac
+
+exit 0
diff --git a/gnu/lib/libreadline/support/shobj-conf b/gnu/lib/libreadline/support/shobj-conf
new file mode 100644
index 00000000000..6649c700588
--- /dev/null
+++ b/gnu/lib/libreadline/support/shobj-conf
@@ -0,0 +1,377 @@
+#! /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
+
+#
+# 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_LIBSUFF='so'
+
+SHLIB_LIBVERSION='$(SHLIB_LIBSUFF)'
+
+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}'
+ SHOBJ_LDFLAGS='-shared -Wl,-i -Wl,-h,$@'
+
+# 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)'
+ ;;
+
+freebsd2* | netbsd* | openbsd*)
+ 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 can have either a.out or ELF object files
+#freebsd3*)
+# SHOBJ_CFLAGS=-fpic
+# SHOBJ_LD='${CC}'
+# SHOBJ_LDFLAGS='-shared'
+#
+# SHLIB_XLDFLAGS='-R$(libdir)'
+# SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)$(SHLIB_MINOR)'
+# ;;
+
+# FreeBSD-3.x ELF
+freebsd3*)
+ 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
+ ;;
+
+linux*)
+ SHOBJ_CFLAGS=-fPIC
+ SHOBJ_LD='${CC}'
+ SHOBJ_LDFLAGS='-shared -Wl,-soname,$@'
+
+ SHLIB_XLDFLAGS='-Wl,-rpath,$(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_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>
+ 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
+ ;;
+
+hpux10*-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,+h,$@ -Wl,+b,$(libdir)'
+ SHLIB_LIBSUFF='sl'
+ SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)'
+ ;;
+
+hpux10*)
+ SHOBJ_STATUS=unsupported
+ SHLIB_STATUS=unsupported
+ ;;
+
+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 -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
+ ;;
+
+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)'
+ ;;
+
+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
+ ;;
+
+#
+# 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_LIBSUFF=\'"$SHLIB_LIBSUFF"\'
+echo SHLIB_LIBVERSION=\'"$SHLIB_LIBVERSION"\'
+
+echo SHOBJ_STATUS=\'"$SHOBJ_STATUS"\'
+echo SHLIB_STATUS=\'"$SHLIB_STATUS"\'
+
+exit 0
diff --git a/gnu/lib/libreadline/tcap.h b/gnu/lib/libreadline/tcap.h
new file mode 100644
index 00000000000..58ab894d93e
--- /dev/null
+++ b/gnu/lib/libreadline/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/gnu/lib/libreadline/terminal.c b/gnu/lib/libreadline/terminal.c
new file mode 100644
index 00000000000..20ad126ec37
--- /dev/null
+++ b/gnu/lib/libreadline/terminal.c
@@ -0,0 +1,575 @@
+/* terminal.c -- controlling the terminal with termcap. */
+
+/* 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 "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"
+
+/* **************************************************************** */
+/* */
+/* Terminal and Termcap */
+/* */
+/* **************************************************************** */
+
+static char *term_buffer = (char *)NULL;
+static char *term_string_buffer = (char *)NULL;
+
+static int tcap_initialized;
+
+/* Non-zero means this terminal can't really do anything. */
+static int dumb_term;
+
+#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 *term_goto, *term_clreol, *term_cr, *term_clrpag, *term_backspace;
+char *term_pc;
+
+/* Non-zero if we determine that the terminal can do character insertion. */
+int terminal_can_insert = 0;
+
+/* How to insert characters. */
+char *term_im, *term_ei, *term_ic, *term_ip, *term_IC;
+
+/* How to delete characters. */
+char *term_dc, *term_DC;
+
+#if defined (HACK_TERMCAP_MOTION)
+char *term_forward_char;
+#endif /* HACK_TERMCAP_MOTION */
+
+/* How to go up a line. */
+char *term_up;
+
+/* A visible bell, if the terminal can be made to flash the screen. */
+static char *visible_bell;
+
+/* Non-zero means the terminal can auto-wrap lines. */
+int _rl_term_autowrap;
+
+/* 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 *term_mm, *term_mo;
+
+/* The key sequences output by the arrow keys, if this terminal has any. */
+static char *term_ku, *term_kd, *term_kr, *term_kl;
+
+/* How to initialize and reset the arrow keys, if this terminal has any. */
+static char *term_ks, *term_ke;
+
+/* The key sequences sent by the Home and End keys, if any. */
+static char *term_kh, *term_kH;
+
+/* Variables that hold the screen dimensions, used by the display code. */
+int screenwidth, screenheight, 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
+
+/* 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 */
+
+#if defined (TIOCGWINSZ)
+ if (ioctl (tty, TIOCGWINSZ, &window_size) == 0)
+ {
+ screenwidth = (int) window_size.ws_col;
+ screenheight = (int) window_size.ws_row;
+ }
+#endif /* TIOCGWINSZ */
+
+#if defined (__EMX__)
+ _emx_get_screensize (&screenwidth, &screenheight);
+#endif
+
+ /* Environment variable COLUMNS overrides setting of "co" if IGNORE_ENV
+ is unset. */
+ if (screenwidth <= 0)
+ {
+ if (ignore_env == 0 && (ss = get_env_value ("COLUMNS")))
+ screenwidth = atoi (ss);
+
+#if !defined (__DJGPP__)
+ if (screenwidth <= 0 && term_string_buffer)
+ screenwidth = tgetnum ("co");
+#endif
+ }
+
+ /* Environment variable LINES overrides setting of "li" if IGNORE_ENV
+ is unset. */
+ if (screenheight <= 0)
+ {
+ if (ignore_env == 0 && (ss = get_env_value ("LINES")))
+ screenheight = atoi (ss);
+
+#if !defined (__DJGPP__)
+ if (screenheight <= 0 && term_string_buffer)
+ screenheight = tgetnum ("li");
+#endif
+ }
+
+ /* If all else fails, default to 80x24 terminal. */
+ if (screenwidth <= 1)
+ screenwidth = 80;
+
+ if (screenheight <= 0)
+ 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. */
+ set_lines_and_columns (screenheight, screenwidth);
+
+ if (_rl_term_autowrap == 0)
+ screenwidth--;
+
+ screenchars = screenwidth * screenheight;
+}
+
+void
+_rl_set_screen_size (rows, cols)
+ int rows, cols;
+{
+ screenheight = rows;
+ screenwidth = cols;
+
+ if (_rl_term_autowrap == 0)
+ screenwidth--;
+
+ screenchars = screenwidth * screenheight;
+}
+
+void
+rl_resize_terminal ()
+{
+ if (readline_echoing_p)
+ {
+ _rl_get_screen_size (fileno (rl_instream), 1);
+ _rl_redisplay_after_sigwinch ();
+ }
+}
+
+struct _tc_string {
+ 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[] =
+{
+ { "DC", &term_DC },
+ { "IC", &term_IC },
+ { "ce", &term_clreol },
+ { "cl", &term_clrpag },
+ { "cr", &term_cr },
+ { "dc", &term_dc },
+ { "ei", &term_ei },
+ { "ic", &term_ic },
+ { "im", &term_im },
+ { "kd", &term_kd },
+ { "kh", &term_kh }, /* home */
+ { "kH", &term_kH }, /* end */
+ { "kl", &term_kl },
+ { "kr", &term_kr },
+ { "ku", &term_ku },
+ { "ks", &term_ks },
+ { "ke", &term_ke },
+ { "le", &term_backspace },
+ { "mm", &term_mm },
+ { "mo", &term_mo },
+#if defined (HACK_TERMCAP_MOTION)
+ { "nd", &term_forward_char },
+#endif
+ { "pc", &term_pc },
+ { "up", &term_up },
+ { "vb", &visible_bell },
+};
+
+#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 (tc_strings[i].tc_var, bp);
+#endif
+ tcap_initialized = 1;
+}
+
+#define CUSTOM_REDISPLAY_FUNC() (rl_redisplay_function != rl_redisplay)
+#define CUSTOM_INPUT_FUNC() (rl_getc_function != rl_getc)
+
+int
+_rl_init_terminal_io (terminal_name)
+ char *terminal_name;
+{
+ char *term, *buffer;
+ int tty, tgetent_ret;
+ Keymap xkeymap;
+
+ term = terminal_name ? terminal_name : get_env_value ("TERM");
+ term_clrpag = term_cr = term_clreol = (char *)NULL;
+ tty = rl_instream ? fileno (rl_instream) : 0;
+ screenwidth = screenheight = 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 = xmalloc(2032);
+
+ if (term_buffer == 0)
+ term_buffer = 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;
+
+ dumb_term = 1;
+ _rl_term_autowrap = 0; /* used by _rl_get_screen_size */
+
+#if defined (__EMX__)
+ _emx_get_screensize (&screenwidth, &screenheight);
+ screenwidth--;
+#else /* !__EMX__ */
+ _rl_get_screen_size (tty, 0);
+#endif /* !__EMX__ */
+
+ /* Defaults. */
+ if (screenwidth <= 0 || screenheight <= 0)
+ {
+ screenwidth = 79;
+ screenheight = 24;
+ }
+
+ /* Everything below here is used by the redisplay code (tputs). */
+ screenchars = screenwidth * screenheight;
+ term_cr = "\r";
+ term_im = term_ei = term_ic = term_IC = (char *)NULL;
+ term_up = term_dc = term_DC = visible_bell = (char *)NULL;
+ term_ku = term_kd = term_kl = term_kr = (char *)NULL;
+ term_mm = term_mo = (char *)NULL;
+#if defined (HACK_TERMCAP_MOTION)
+ term_forward_char = (char *)NULL;
+#endif
+ terminal_can_insert = term_has_meta = 0;
+
+ /* Reasonable defaults for tgoto(). Readline currently only uses
+ tgoto if term_IC or term_DC is defined, but just in case we
+ change that later... */
+ PC = '\0';
+ BC = term_backspace = "\b";
+ UP = term_up;
+
+ return 0;
+ }
+
+ get_term_capabilities (&buffer);
+
+ /* Set up the variables that the termcap library expects the application
+ to provide. */
+ PC = term_pc ? *term_pc : 0;
+ BC = term_backspace;
+ UP = term_up;
+
+ if (!term_cr)
+ term_cr = "\r";
+
+ _rl_term_autowrap = tgetflag ("am") && tgetflag ("xn");
+
+ _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... */
+ terminal_can_insert = (term_IC || term_im || 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)
+ term_mm = term_mo = (char *)NULL;
+
+ /* Attempt to find and bind the arrow keys. Do not override already
+ bound keys in an overzealous attempt, however. */
+ xkeymap = _rl_keymap;
+
+ _rl_keymap = emacs_standard_keymap;
+ _rl_bind_if_unbound (term_ku, rl_get_previous_history);
+ _rl_bind_if_unbound (term_kd, rl_get_next_history);
+ _rl_bind_if_unbound (term_kr, rl_forward);
+ _rl_bind_if_unbound (term_kl, rl_backward);
+
+ _rl_bind_if_unbound (term_kh, rl_beg_of_line); /* Home */
+ _rl_bind_if_unbound (term_kH, rl_end_of_line); /* End */
+
+#if defined (VI_MODE)
+ _rl_keymap = vi_movement_keymap;
+ _rl_bind_if_unbound (term_ku, rl_get_previous_history);
+ _rl_bind_if_unbound (term_kd, rl_get_next_history);
+ _rl_bind_if_unbound (term_kr, rl_forward);
+ _rl_bind_if_unbound (term_kl, rl_backward);
+
+ _rl_bind_if_unbound (term_kh, rl_beg_of_line); /* Home */
+ _rl_bind_if_unbound (term_kH, rl_end_of_line); /* End */
+#endif /* VI_MODE */
+
+ _rl_keymap = xkeymap;
+
+ return 0;
+}
+
+char *
+rl_get_termcap (cap)
+ 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)
+ char *terminal_name;
+{
+ _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)
+ 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 (term_backspace)
+ for (i = 0; i < count; i++)
+ tputs (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
+crlf ()
+{
+#if defined (NEW_TTY_DRIVER)
+ if (term_cr)
+ tputs (term_cr, 1, _rl_output_character_function);
+#endif /* NEW_TTY_DRIVER */
+ putc ('\n', _rl_out_stream);
+ return 0;
+}
+
+/* Ring the terminal bell. */
+int
+ding ()
+{
+ if (readline_echoing_p)
+ {
+ switch (_rl_bell_preference)
+ {
+ case NO_BELL:
+ default:
+ break;
+ case VISIBLE_BELL:
+ if (visible_bell)
+ {
+ tputs (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 && term_mm)
+ tputs (term_mm, 1, _rl_output_character_function);
+#endif
+}
+
+void
+_rl_control_keypad (on)
+ int on;
+{
+#if !defined (__DJGPP__)
+ if (on && term_ks)
+ tputs (term_ks, 1, _rl_output_character_function);
+ else if (!on && term_ke)
+ tputs (term_ke, 1, _rl_output_character_function);
+#endif
+}
diff --git a/gnu/lib/libreadline/tilde.c b/gnu/lib/libreadline/tilde.c
new file mode 100644
index 00000000000..777b6559223
--- /dev/null
+++ b/gnu/lib/libreadline/tilde.c
@@ -0,0 +1,459 @@
+/* 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>
+#include <pwd.h>
+
+#include "tilde.h"
+
+#if defined (TEST) || defined (STATIC_MALLOC)
+static char *xmalloc (), *xrealloc ();
+#else
+# if defined __STDC__
+extern char *xmalloc (int);
+extern char *xrealloc (void *, int);
+# else
+extern char *xmalloc (), *xrealloc ();
+# endif /* !__STDC__ */
+#endif /* TEST || STATIC_MALLOC */
+
+#if !defined (HAVE_GETPW_DECLS)
+extern struct passwd *getpwuid (), *getpwnam ();
+#endif /* !HAVE_GETPW_DECLS */
+
+#if !defined (savestring)
+# ifndef strcpy
+extern char *strcpy ();
+# endif
+#define savestring(x) strcpy (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 *get_home_dir __P((void));
+extern char *get_env_value __P((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 char *default_prefixes[] =
+ { " ~", "\t~", (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 char *default_suffixes[] =
+ { " ", "\n", (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. */
+CPFunction *tilde_expansion_preexpansion_hook = (CPFunction *)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. */
+CPFunction *tilde_expansion_failure_hook = (CPFunction *)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 = 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 = default_suffixes;
+
+/* 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)
+ 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)
+ 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)
+ char *string;
+{
+ char *result;
+ int result_size, result_index;
+
+ result_index = result_size = 0;
+ if (result = strchr (string, '~'))
+ result = xmalloc (result_size = (strlen (string) + 16));
+ else
+ result = 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 = 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 = 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 __CYGWIN32__
+ /* 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 = 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)
+ char *fname;
+ int *lenp;
+{
+ char *ret;
+ int i;
+
+ ret = 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;
+}
+
+/* Return a string that is PREFIX concatenated with SUFFIX starting at
+ SUFFIND. */
+static char *
+glue_prefix_and_suffix (prefix, suffix, suffind)
+ char *prefix, *suffix;
+ int suffind;
+{
+ char *ret;
+ int plen, slen;
+
+ plen = (prefix && *prefix) ? strlen (prefix) : 0;
+ slen = strlen (suffix + suffind);
+ ret = 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)
+ 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 = get_env_value ("HOME");
+
+ /* If there is no HOME variable, look up the directory in
+ the password database. */
+ if (expansion == 0)
+ expansion = 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;
+ user_entry = getpwnam (username);
+ 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);
+ }
+ }
+ free (username);
+ /* 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);
+ }
+ else
+ {
+ free (username);
+ dirname = glue_prefix_and_suffix (user_entry->pw_dir, filename, user_len);
+ }
+
+ endpwent ();
+ return (dirname);
+}
+
+
+#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 char *
+xmalloc (bytes)
+ int bytes;
+{
+ char *temp = (char *)malloc (bytes);
+
+ if (!temp)
+ memory_error_and_abort ();
+ return (temp);
+}
+
+static char *
+xrealloc (pointer, bytes)
+ char *pointer;
+ int bytes;
+{
+ char *temp;
+
+ if (!pointer)
+ temp = (char *)malloc (bytes);
+ else
+ temp = (char *)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/gnu/lib/libreadline/tilde.h b/gnu/lib/libreadline/tilde.h
new file mode 100644
index 00000000000..7783fd6101a
--- /dev/null
+++ b/gnu/lib/libreadline/tilde.h
@@ -0,0 +1,85 @@
+/* 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 __P((char *, char *, int)); */
+
+#if !defined (__P)
+# if defined (__STDC__) || defined (__GNUC__) || defined (__cplusplus)
+# define __P(protos) protos
+# else
+# define __P(protos) ()
+# endif
+#endif
+
+/* Function pointers can be declared as (Function *)foo. */
+#if !defined (_FUNCTION_DEF)
+# define _FUNCTION_DEF
+typedef int Function ();
+typedef void VFunction ();
+typedef char *CPFunction ();
+typedef char **CPPFunction ();
+#endif /* _FUNCTION_DEF */
+
+/* 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 CPFunction *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 CPFunction *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 __P((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 __P((char *));
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _TILDE_H_ */
diff --git a/gnu/lib/libreadline/undo.c b/gnu/lib/libreadline/undo.c
new file mode 100644
index 00000000000..f7f30d17d9d
--- /dev/null
+++ b/gnu/lib/libreadline/undo.c
@@ -0,0 +1,262 @@
+/* readline.c -- a general facility for reading lines of input
+ with emacs style editing and completion. */
+
+/* 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
+
+#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"
+
+#define SWAP(s, e) do { int t; t = s; s = e; e = t; } while (0)
+
+/* 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 */
+/* */
+/* **************************************************************** */
+
+/* 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 = (UNDO_LIST *)xmalloc (sizeof (UNDO_LIST));
+ temp->what = what;
+ temp->start = start;
+ temp->end = end;
+ temp->text = text;
+ temp->next = rl_undo_list;
+ rl_undo_list = temp;
+}
+
+/* Free the existing undo list. */
+void
+free_undo_list ()
+{
+ while (rl_undo_list)
+ {
+ 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;
+}
+
+/* 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 = 0;
+ int start, end;
+
+#define TRANS(i) ((i) == -1 ? rl_point : ((i) == -2 ? rl_end : (i)))
+
+ do
+ {
+ if (!rl_undo_list)
+ return (0);
+
+ _rl_doing_an_undo = 1;
+
+ /* 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
+ ding ();
+ break;
+ }
+
+ _rl_doing_an_undo = 0;
+
+ release = rl_undo_list;
+ rl_undo_list = rl_undo_list->next;
+ 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)
+ ding ();
+ else
+ {
+ while (rl_undo_list)
+ rl_do_undo ();
+ }
+ 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
+ {
+ ding ();
+ break;
+ }
+ }
+ return 0;
+}
diff --git a/gnu/lib/libreadline/util.c b/gnu/lib/libreadline/util.c
new file mode 100644
index 00000000000..be9e0a9869a
--- /dev/null
+++ b/gnu/lib/libreadline/util.c
@@ -0,0 +1,351 @@
+/* util.c -- readline utility 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
+
+#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"
+
+#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"
+
+#define SWAP(s, e) do { int t; t = s; s = e; e = t; } while (0)
+
+/* **************************************************************** */
+/* */
+/* 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 char *pathname_alphabetic_chars = "/-_=~.#$";
+
+int
+alphabetic (c)
+ int c;
+{
+ if (ALPHABETIC (c))
+ return (1);
+
+ return (_rl_allow_pathname_alphabetic_chars &&
+ strchr (pathname_alphabetic_chars, c) != NULL);
+}
+
+/* How to abort things. */
+int
+_rl_abort_internal ()
+{
+ ding ();
+ rl_clear_message ();
+ _rl_init_argument ();
+ rl_pending_input = 0;
+
+ _rl_defining_kbd_macro = 0;
+ while (_rl_executing_macro)
+ _rl_pop_executing_macro ();
+
+ rl_last_func = (Function *)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
+ 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 = 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 = 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 = 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 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 (s1 + i);
+ return ((char *)NULL);
+}
+
+#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 chartypes.h. */
+#undef _rl_uppercase_p
+int
+_rl_uppercase_p (c)
+ int c;
+{
+ return (isupper (c));
+}
+
+#undef _rl_lowercase_p
+int
+_rl_lowercase_p (c)
+ int c;
+{
+ return (islower (c));
+}
+
+#undef _rl_pure_alphabetic
+int
+_rl_pure_alphabetic (c)
+ int c;
+{
+ return (isupper (c) || islower (c));
+}
+
+#undef _rl_digit_p
+int
+_rl_digit_p (c)
+ int c;
+{
+ return (isdigit (c));
+}
+
+#undef _rl_to_lower
+int
+_rl_to_lower (c)
+ int c;
+{
+ return (isupper (c) ? tolower (c) : c);
+}
+
+#undef _rl_to_upper
+int
+_rl_to_upper (c)
+ int c;
+{
+ return (islower (c) ? toupper (c) : c);
+}
+
+#undef _rl_digit_value
+int
+_rl_digit_value (c)
+ int c;
+{
+ return (isdigit (c) ? c - '0' : c);
+}
+
+/* Backwards compatibility, now that savestring has been removed from
+ all `public' readline header files. */
+#undef _rl_savestring
+char *
+_rl_savestring (s)
+ char *s;
+{
+ return ((char *)strcpy (xmalloc (1 + (int)strlen (s)), (s)));
+}
diff --git a/gnu/lib/libreadline/vi_keymap.c b/gnu/lib/libreadline/vi_keymap.c
new file mode 100644
index 00000000000..cf6724cef13
--- /dev/null
+++ b/gnu/lib/libreadline/vi_keymap.c
@@ -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, (Function *)0x0 }, /* Control-@ */
+ { ISFUNC, (Function *)0x0 }, /* Control-a */
+ { ISFUNC, (Function *)0x0 }, /* Control-b */
+ { ISFUNC, (Function *)0x0 }, /* Control-c */
+ { ISFUNC, rl_vi_eof_maybe }, /* Control-d */
+ { ISFUNC, rl_emacs_editing_mode }, /* Control-e */
+ { ISFUNC, (Function *)0x0 }, /* Control-f */
+ { ISFUNC, rl_abort }, /* Control-g */
+ { ISFUNC, rl_backward }, /* Control-h */
+ { ISFUNC, (Function *)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, (Function *)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, (Function *)0x0 }, /* Control-x */
+ { ISFUNC, rl_yank }, /* Control-y */
+ { ISFUNC, (Function *)0x0 }, /* Control-z */
+
+ { ISFUNC, (Function *)0x0 }, /* Control-[ */ /* vi_escape_keymap */
+ { ISFUNC, (Function *)0x0 }, /* Control-\ */
+ { ISFUNC, (Function *)0x0 }, /* Control-] */
+ { ISFUNC, (Function *)0x0 }, /* Control-^ */
+ { ISFUNC, rl_vi_undo }, /* Control-_ */
+
+ /* The start of printing characters. */
+ { ISFUNC, rl_forward }, /* SPACE */
+ { ISFUNC, (Function *)0x0 }, /* ! */
+ { ISFUNC, (Function *)0x0 }, /* " */
+ { ISFUNC, rl_insert_comment }, /* # */
+ { ISFUNC, rl_end_of_line }, /* $ */
+ { ISFUNC, rl_vi_match }, /* % */
+ { ISFUNC, rl_vi_tilde_expand }, /* & */
+ { ISFUNC, (Function *)0x0 }, /* ' */
+ { ISFUNC, (Function *)0x0 }, /* ( */
+ { ISFUNC, (Function *)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, (Function *)0x0 }, /* : */
+ { ISFUNC, rl_vi_char_search }, /* ; */
+ { ISFUNC, (Function *)0x0 }, /* < */
+ { ISFUNC, rl_vi_complete }, /* = */
+ { ISFUNC, (Function *)0x0 }, /* > */
+ { ISFUNC, rl_vi_search }, /* ? */
+ { ISFUNC, (Function *)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, (Function *)0x0 }, /* H */
+ { ISFUNC, rl_vi_insert_beg }, /* I */
+ { ISFUNC, (Function *)0x0 }, /* J */
+ { ISFUNC, (Function *)0x0 }, /* K */
+ { ISFUNC, (Function *)0x0 }, /* L */
+ { ISFUNC, (Function *)0x0 }, /* M */
+ { ISFUNC, rl_vi_search_again }, /* N */
+ { ISFUNC, (Function *)0x0 }, /* O */
+ { ISFUNC, rl_vi_put }, /* P */
+ { ISFUNC, (Function *)0x0 }, /* Q */
+ { ISFUNC, rl_vi_replace }, /* R */
+ { ISFUNC, rl_vi_subst }, /* S */
+ { ISFUNC, rl_vi_char_search }, /* T */
+ { ISFUNC, rl_revert_line }, /* U */
+ { ISFUNC, (Function *)0x0 }, /* V */
+ { ISFUNC, rl_vi_next_word }, /* W */
+ { ISFUNC, rl_rubout }, /* X */
+ { ISFUNC, rl_vi_yank_to }, /* Y */
+ { ISFUNC, (Function *)0x0 }, /* Z */
+
+ /* Some more punctuation. */
+ { ISFUNC, (Function *)0x0 }, /* [ */
+ { ISFUNC, rl_vi_complete }, /* \ */
+ { ISFUNC, (Function *)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, (Function *)0x0 }, /* g */
+ { ISFUNC, rl_backward }, /* h */
+ { ISFUNC, rl_vi_insertion_mode }, /* i */
+ { ISFUNC, rl_get_next_history }, /* j */
+ { ISFUNC, rl_get_previous_history }, /* k */
+ { ISFUNC, rl_forward }, /* l */
+ { ISFUNC, rl_vi_set_mark }, /* m */
+ { ISFUNC, rl_vi_search_again }, /* n */
+ { ISFUNC, (Function *)0x0 }, /* o */
+ { ISFUNC, rl_vi_put }, /* p */
+ { ISFUNC, (Function *)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, (Function *)0x0 }, /* v */
+ { ISFUNC, rl_vi_next_word }, /* w */
+ { ISFUNC, rl_vi_delete }, /* x */
+ { ISFUNC, rl_vi_yank_to }, /* y */
+ { ISFUNC, (Function *)0x0 }, /* z */
+
+ /* Final punctuation. */
+ { ISFUNC, (Function *)0x0 }, /* { */
+ { ISFUNC, rl_vi_column }, /* | */
+ { ISFUNC, (Function *)0x0 }, /* } */
+ { ISFUNC, rl_vi_change_case }, /* ~ */
+ { ISFUNC, (Function *)0x0 }, /* RUBOUT */
+
+#if KEYMAP_SIZE > 128
+ /* Undefined keys. */
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 }
+#endif /* KEYMAP_SIZE > 128 */
+};
+
+
+KEYMAP_ENTRY_ARRAY vi_insertion_keymap = {
+ /* The regular control keys come first. */
+ { ISFUNC, (Function *)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, (Function *)0x0 }, /* Control-@ */
+ { ISFUNC, (Function *)0x0 }, /* Control-a */
+ { ISFUNC, (Function *)0x0 }, /* Control-b */
+ { ISFUNC, (Function *)0x0 }, /* Control-c */
+ { ISFUNC, (Function *)0x0 }, /* Control-d */
+ { ISFUNC, (Function *)0x0 }, /* Control-e */
+ { ISFUNC, (Function *)0x0 }, /* Control-f */
+ { ISFUNC, (Function *)0x0 }, /* Control-g */
+ { ISFUNC, (Function *)0x0 }, /* Control-h */
+ { ISFUNC, rl_tab_insert}, /* Control-i */
+ { ISFUNC, rl_emacs_editing_mode}, /* Control-j */
+ { ISFUNC, rl_kill_line }, /* Control-k */
+ { ISFUNC, (Function *)0x0 }, /* Control-l */
+ { ISFUNC, rl_emacs_editing_mode}, /* Control-m */
+ { ISFUNC, (Function *)0x0 }, /* Control-n */
+ { ISFUNC, (Function *)0x0 }, /* Control-o */
+ { ISFUNC, (Function *)0x0 }, /* Control-p */
+ { ISFUNC, (Function *)0x0 }, /* Control-q */
+ { ISFUNC, (Function *)0x0 }, /* Control-r */
+ { ISFUNC, (Function *)0x0 }, /* Control-s */
+ { ISFUNC, (Function *)0x0 }, /* Control-t */
+ { ISFUNC, (Function *)0x0 }, /* Control-u */
+ { ISFUNC, (Function *)0x0 }, /* Control-v */
+ { ISFUNC, (Function *)0x0 }, /* Control-w */
+ { ISFUNC, (Function *)0x0 }, /* Control-x */
+ { ISFUNC, (Function *)0x0 }, /* Control-y */
+ { ISFUNC, (Function *)0x0 }, /* Control-z */
+
+ { ISFUNC, rl_vi_movement_mode }, /* Control-[ */
+ { ISFUNC, (Function *)0x0 }, /* Control-\ */
+ { ISFUNC, (Function *)0x0 }, /* Control-] */
+ { ISFUNC, (Function *)0x0 }, /* Control-^ */
+ { ISFUNC, rl_vi_undo }, /* Control-_ */
+
+ /* The start of printing characters. */
+ { ISFUNC, (Function *)0x0 }, /* SPACE */
+ { ISFUNC, (Function *)0x0 }, /* ! */
+ { ISFUNC, (Function *)0x0 }, /* " */
+ { ISFUNC, (Function *)0x0 }, /* # */
+ { ISFUNC, (Function *)0x0 }, /* $ */
+ { ISFUNC, (Function *)0x0 }, /* % */
+ { ISFUNC, (Function *)0x0 }, /* & */
+ { ISFUNC, (Function *)0x0 }, /* ' */
+ { ISFUNC, (Function *)0x0 }, /* ( */
+ { ISFUNC, (Function *)0x0 }, /* ) */
+ { ISFUNC, (Function *)0x0 }, /* * */
+ { ISFUNC, (Function *)0x0 }, /* + */
+ { ISFUNC, (Function *)0x0 }, /* , */
+ { ISFUNC, (Function *)0x0 }, /* - */
+ { ISFUNC, (Function *)0x0 }, /* . */
+ { ISFUNC, (Function *)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, (Function *)0x0 }, /* : */
+ { ISFUNC, (Function *)0x0 }, /* ; */
+ { ISFUNC, (Function *)0x0 }, /* < */
+ { ISFUNC, (Function *)0x0 }, /* = */
+ { ISFUNC, (Function *)0x0 }, /* > */
+ { ISFUNC, (Function *)0x0 }, /* ? */
+ { ISFUNC, (Function *)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, (Function *)0x0 }, /* \ */
+ { ISFUNC, (Function *)0x0 }, /* ] */
+ { ISFUNC, (Function *)0x0 }, /* ^ */
+ { ISFUNC, (Function *)0x0 }, /* _ */
+ { ISFUNC, (Function *)0x0 }, /* ` */
+
+ /* Lowercase alphabet. */
+ { ISFUNC, (Function *)0x0 }, /* a */
+ { ISFUNC, (Function *)0x0 }, /* b */
+ { ISFUNC, (Function *)0x0 }, /* c */
+ { ISFUNC, (Function *)0x0 }, /* d */
+ { ISFUNC, (Function *)0x0 }, /* e */
+ { ISFUNC, (Function *)0x0 }, /* f */
+ { ISFUNC, (Function *)0x0 }, /* g */
+ { ISFUNC, (Function *)0x0 }, /* h */
+ { ISFUNC, (Function *)0x0 }, /* i */
+ { ISFUNC, (Function *)0x0 }, /* j */
+ { ISFUNC, (Function *)0x0 }, /* k */
+ { ISFUNC, (Function *)0x0 }, /* l */
+ { ISFUNC, (Function *)0x0 }, /* m */
+ { ISFUNC, (Function *)0x0 }, /* n */
+ { ISFUNC, rl_arrow_keys }, /* o */
+ { ISFUNC, (Function *)0x0 }, /* p */
+ { ISFUNC, (Function *)0x0 }, /* q */
+ { ISFUNC, (Function *)0x0 }, /* r */
+ { ISFUNC, (Function *)0x0 }, /* s */
+ { ISFUNC, (Function *)0x0 }, /* t */
+ { ISFUNC, (Function *)0x0 }, /* u */
+ { ISFUNC, (Function *)0x0 }, /* v */
+ { ISFUNC, (Function *)0x0 }, /* w */
+ { ISFUNC, (Function *)0x0 }, /* x */
+ { ISFUNC, (Function *)0x0 }, /* y */
+ { ISFUNC, (Function *)0x0 }, /* z */
+
+ /* Final punctuation. */
+ { ISFUNC, (Function *)0x0 }, /* { */
+ { ISFUNC, (Function *)0x0 }, /* | */
+ { ISFUNC, (Function *)0x0 }, /* } */
+ { ISFUNC, (Function *)0x0 }, /* ~ */
+ { ISFUNC, rl_backward_kill_word }, /* RUBOUT */
+
+#if KEYMAP_SIZE > 128
+ /* Undefined keys. */
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 },
+ { ISFUNC, (Function *)0x0 }
+#endif /* KEYMAP_SIZE > 128 */
+};
+#endif
diff --git a/gnu/lib/libreadline/vi_mode.c b/gnu/lib/libreadline/vi_mode.c
new file mode 100644
index 00000000000..be7f9496434
--- /dev/null
+++ b/gnu/lib/libreadline/vi_mode.c
@@ -0,0 +1,1368 @@
+/* vi_mode.c -- A vi emulation mode for Bash.
+ Derived from code written by Jeff Sparkes (jsparkes@bnr.ca). */
+
+/* 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
+
+/* **************************************************************** */
+/* */
+/* 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 "readline.h"
+#include "history.h"
+
+#include "rlprivate.h"
+#include "xmalloc.h"
+
+#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
+#define member(c, s) ((c) ? (char *)strchr ((s), (c)) != (char *)NULL : 0)
+#endif
+
+#ifndef isident
+#define isident(c) ((_rl_pure_alphabetic (c) || _rl_digit_p (c) || c == '_'))
+#endif
+
+#ifndef exchange
+#define exchange(x, y) do {int temp = x; x = y; y = temp;} while (0)
+#endif
+
+/* Non-zero means enter insertion mode. */
+static int _rl_vi_doing_insert;
+
+/* Command keys which do movement for xxx_to commands. */
+static 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_command = 'i'; /* default `.' puts you in insert mode */
+static int _rl_vi_last_repeat = 1;
+static int _rl_vi_last_arg_sign = 1;
+static int _rl_vi_last_motion;
+static int _rl_vi_last_search_char;
+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 char *vi_textmod = "_*\\AaIiCcDdPpYyRrSsXx~";
+
+/* Arrays for the saved marks. */
+static int vi_mark_chars[27];
+
+static int rl_digit_loop1 __P((void));
+
+void
+_rl_vi_initialize_line ()
+{
+ register int i;
+
+ for (i = 0; i < sizeof (vi_mark_chars) / sizeof (int); i++)
+ vi_mark_chars[i] = -1;
+}
+
+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;
+}
+
+/* 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;
+{
+ if (!rl_explicit_arg)
+ {
+ rl_numeric_arg = _rl_vi_last_repeat;
+ rl_arg_sign = _rl_vi_last_arg_sign;
+ }
+
+ 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_point--;
+ }
+ else
+ _rl_dispatch (_rl_vi_last_command, _rl_keymap);
+ vi_redoing = 0;
+
+ return (0);
+}
+
+/* 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_noninc_forward_search (count, key);
+ break;
+
+ case '/':
+ rl_noninc_reverse_search (count, key);
+ break;
+
+ default:
+ 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_set_last (key, 1, rl_arg_sign);
+ rl_vi_insertion_mode (1, key);
+ }
+ return (0);
+}
+
+/* Tilde expansion for vi mode. */
+int
+rl_vi_tilde_expand (ignore, key)
+ int ignore, key;
+{
+ rl_tilde_expand (0, key);
+ _rl_vi_set_last (key, 1, rl_arg_sign); /* XXX */
+ rl_vi_insertion_mode (1, key);
+ 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)
+ {
+ 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))
+ {
+ 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)
+ {
+ 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]));
+
+ 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 (isident (rl_line_buffer[rl_point]))
+ {
+ while (isident (rl_line_buffer[rl_point]) && rl_point < rl_end)
+ rl_point++;
+ }
+ else /* if (!whitespace (rl_line_buffer[rl_point])) */
+ {
+ while (!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 = isident (rl_line_buffer[rl_point - 1]);
+ if ((isident (rl_line_buffer[rl_point]) && !last_is_ident) ||
+ (!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 (isident (rl_line_buffer[rl_point]))
+ while (--rl_point >= 0 && isident (rl_line_buffer[rl_point]));
+ else
+ while (--rl_point >= 0 && !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 (isident (rl_line_buffer[rl_point]))
+ while (++rl_point < rl_end && isident (rl_line_buffer[rl_point]));
+ else
+ while (++rl_point < rl_end && !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);
+}
+
+int
+rl_vi_append_mode (count, key)
+ int count, key;
+{
+ if (rl_point < rl_end)
+ rl_point++;
+ rl_vi_insertion_mode (1, key);
+ 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)
+ {
+ 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 = 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)
+ {
+ 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_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 (1, key);
+
+ _rl_keymap = vi_movement_keymap;
+ _rl_vi_done_inserting ();
+ 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));
+}
+
+int
+rl_vi_change_case (count, ignore)
+ int count, ignore;
+{
+ char c = 0;
+
+ /* Don't try this on an empty line. */
+ if (rl_point >= rl_end)
+ return (0);
+
+ 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 (1, c);
+ continue;
+ }
+
+ /* Vi is kind of strange here. */
+ if (c)
+ {
+ rl_begin_undo_group ();
+ rl_delete (1, c);
+ rl_insert (1, c);
+ rl_end_undo_group ();
+ rl_vi_check ();
+ }
+ else
+ rl_forward (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_yank (1, key);
+ rl_backward (1, key);
+ return (0);
+}
+
+int
+rl_vi_check ()
+{
+ if (rl_point && rl_point == rl_end)
+ 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;
+ c = rl_read_key ();
+ *nextkey = c;
+
+ if (!member (c, vi_motion))
+ {
+ if (_rl_digit_p (c))
+ {
+ save = rl_numeric_arg;
+ rl_numeric_arg = _rl_digit_value (c);
+ rl_digit_loop1 ();
+ rl_numeric_arg *= save;
+ c = rl_read_key (); /* real command */
+ *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)
+ exchange (rl_point, rl_mark);
+
+ return (0);
+}
+
+/* A simplified loop for vi. Don't dispatch key at end.
+ Don't recognize minus sign? */
+static int
+rl_digit_loop1 ()
+{
+ int key, c;
+
+ while (1)
+ {
+ rl_message ("(arg: %d) ", rl_arg_sign * rl_numeric_arg, 0);
+ key = c = rl_read_key ();
+
+ if (_rl_keymap[c].type == ISFUNC &&
+ _rl_keymap[c].function == rl_universal_argument)
+ {
+ rl_numeric_arg *= 4;
+ continue;
+ }
+
+ 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;
+ }
+ else
+ {
+ rl_clear_message ();
+ rl_stuff_char (key);
+ break;
+ }
+ }
+ 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))
+ {
+ 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))
+ {
+ 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_set_last (key, count, rl_arg_sign);
+ rl_vi_insertion_mode (1, key);
+ }
+
+ return (0);
+}
+
+int
+rl_vi_yank_to (count, key)
+ int count, key;
+{
+ int c, save = rl_point;
+
+ if (_rl_uppercase_p (key))
+ rl_stuff_char ('$');
+
+ if (rl_vi_domove (key, &c))
+ {
+ 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_delete (count, key)
+ int count, key;
+{
+ int end;
+
+ if (rl_end == 0)
+ {
+ ding ();
+ return -1;
+ }
+
+ 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 (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));
+}
+
+int
+rl_vi_char_search (count, key)
+ int count, key;
+{
+ static char target;
+ static int orig_dir, dir;
+
+ if (key == ';' || key == ',')
+ dir = key == ';' ? orig_dir : -orig_dir;
+ else
+ {
+ if (vi_redoing)
+ target = _rl_vi_last_search_char;
+ else
+ _rl_vi_last_search_char = target = (*rl_getc_function) (rl_instream);
+
+ switch (key)
+ {
+ case 't':
+ orig_dir = dir = FTO;
+ break;
+
+ case 'T':
+ orig_dir = dir = BTO;
+ break;
+
+ case 'f':
+ orig_dir = dir = FFIND;
+ break;
+
+ case 'F':
+ orig_dir = dir = BFIND;
+ break;
+ }
+ }
+
+ return (_rl_char_search_internal (count, dir, target));
+}
+
+/* Match brackets */
+int
+rl_vi_match (ignore, key)
+ int ignore, key;
+{
+ int count = 1, brack, pos;
+
+ pos = rl_point;
+ if ((brack = rl_vi_bracktype (rl_line_buffer[rl_point])) == 0)
+ {
+ while ((brack = rl_vi_bracktype (rl_line_buffer[rl_point])) == 0 &&
+ rl_point < rl_end - 1)
+ rl_forward (1, key);
+
+ if (brack <= 0)
+ {
+ rl_point = pos;
+ ding ();
+ return -1;
+ }
+ }
+
+ pos = rl_point;
+
+ if (brack < 0)
+ {
+ while (count)
+ {
+ if (--pos >= 0)
+ {
+ int b = rl_vi_bracktype (rl_line_buffer[pos]);
+ if (b == -brack)
+ count--;
+ else if (b == brack)
+ count++;
+ }
+ else
+ {
+ ding ();
+ return -1;
+ }
+ }
+ }
+ else
+ { /* brack > 0 */
+ while (count)
+ {
+ if (++pos < rl_end)
+ {
+ int b = rl_vi_bracktype (rl_line_buffer[pos]);
+ if (b == -brack)
+ count--;
+ else if (b == brack)
+ count++;
+ }
+ else
+ {
+ 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;
+ }
+}
+
+int
+rl_vi_change_char (count, key)
+ int count, key;
+{
+ int c;
+
+ if (vi_redoing)
+ c = _rl_vi_last_replacement;
+ else
+ _rl_vi_last_replacement = c = (*rl_getc_function) (rl_instream);
+
+ if (c == '\033' || c == CTRL ('C'))
+ return -1;
+
+ while (count-- && rl_point < rl_end)
+ {
+ rl_begin_undo_group ();
+
+ rl_delete (1, c);
+ rl_insert (1, c);
+ if (count == 0)
+ rl_backward (1, c);
+
+ rl_end_undo_group ();
+ }
+ return (0);
+}
+
+int
+rl_vi_subst (count, key)
+ int count, key;
+{
+ rl_begin_undo_group ();
+
+ if (_rl_uppercase_p (key))
+ {
+ rl_beg_of_line (1, key);
+ rl_kill_line (1, key);
+ }
+ else
+ rl_delete_text (rl_point, rl_point+count);
+
+ rl_end_undo_group ();
+
+ _rl_vi_set_last (key, count, rl_arg_sign);
+
+ if (vi_redoing)
+ {
+ int o = _rl_doing_an_undo;
+
+ _rl_doing_an_undo = 1;
+ if (vi_insert_buffer && *vi_insert_buffer)
+ rl_insert_text (vi_insert_buffer);
+ _rl_doing_an_undo = o;
+ }
+ else
+ {
+ rl_begin_undo_group ();
+ _rl_vi_doing_insert = 1;
+ rl_vi_insertion_mode (1, key);
+ }
+
+ return (0);
+}
+
+int
+rl_vi_overstrike (count, key)
+ int count, key;
+{
+ int i;
+
+ if (_rl_vi_doing_insert == 0)
+ {
+ _rl_vi_doing_insert = 1;
+ rl_begin_undo_group ();
+ }
+
+ for (i = 0; i < count; i++)
+ {
+ vi_replace_count++;
+ rl_begin_undo_group ();
+
+ if (rl_point < rl_end)
+ {
+ rl_delete (1, key);
+ rl_insert (1, key);
+ }
+ else
+ rl_insert (1, key);
+
+ rl_end_undo_group ();
+ }
+ 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)
+ {
+ ding ();
+ break;
+ }
+ s = rl_point;
+
+ if (rl_do_undo ())
+ vi_replace_count--;
+
+ if (rl_point == s)
+ rl_backward (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] == ';')
+ {
+ ding ();
+ return (0);
+ }
+
+ rl_possible_completions ();
+ rl_point = save_pos;
+
+ return (0);
+}
+#endif
+
+/* Functions to save and restore marks. */
+int
+rl_vi_set_mark (count, key)
+ int count, key;
+{
+ int ch;
+
+ ch = rl_read_key ();
+ if (_rl_lowercase_p (ch) == 0)
+ {
+ ding ();
+ return -1;
+ }
+ ch -= 'a';
+ vi_mark_chars[ch] = rl_point;
+ return 0;
+}
+
+int
+rl_vi_goto_mark (count, key)
+ int count, key;
+{
+ int ch;
+
+ ch = rl_read_key ();
+ if (ch == '`')
+ {
+ rl_point = rl_mark;
+ return 0;
+ }
+ else if (_rl_lowercase_p (ch) == 0)
+ {
+ ding ();
+ return -1;
+ }
+
+ ch -= 'a';
+ if (vi_mark_chars[ch] == -1)
+ {
+ ding ();
+ return -1;
+ }
+ rl_point = vi_mark_chars[ch];
+ return 0;
+}
+
+#endif /* VI_MODE */
diff --git a/gnu/lib/libreadline/xmalloc.c b/gnu/lib/libreadline/xmalloc.c
new file mode 100644
index 00000000000..c0d06403a3c
--- /dev/null
+++ b/gnu/lib/libreadline/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. */
+char *
+xmalloc (bytes)
+ int bytes;
+{
+ char *temp;
+
+ temp = (char *)malloc (bytes);
+ if (temp == 0)
+ memory_error_and_abort ("xmalloc");
+ return (temp);
+}
+
+char *
+xrealloc (pointer, bytes)
+ PTR_T pointer;
+ int bytes;
+{
+ char *temp;
+
+ temp = pointer ? (char *)realloc (pointer, bytes) : (char *)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/gnu/lib/libreadline/xmalloc.h b/gnu/lib/libreadline/xmalloc.h
new file mode 100644
index 00000000000..bdf251b070a
--- /dev/null
+++ b/gnu/lib/libreadline/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 char *xmalloc __P((int));
+extern char *xrealloc __P((void *, int));
+extern void xfree __P((void *));
+
+#endif /* _XMALLOC_H_ */